Skip to content
Snippets Groups Projects
Commit cb5bd3ff authored by srosse's avatar srosse
Browse files

OO-5228: login date as precedence over reactivation date

parent 00305fba
No related branches found
No related tags found
No related merge requests found
...@@ -98,17 +98,22 @@ public class UserLifecycleManagerImpl implements UserLifecycleManager { ...@@ -98,17 +98,22 @@ public class UserLifecycleManagerImpl implements UserLifecycleManager {
@Override @Override
public long getDaysUntilDeactivation(IdentityLifecycle identity, Date referenceDate) { public long getDaysUntilDeactivation(IdentityLifecycle identity, Date referenceDate) {
long days; Date lastLogin = identity.getLastLogin();
if(lastLogin == null) {
lastLogin = identity.getCreationDate();
}
long days = userModule.getNumberOfInactiveDayBeforeDeactivation() - CalendarUtils.numOfDays(referenceDate, lastLogin);
if(days < 0l) {
days = 0l;
}
Date reactivationDate = identity.getReactivationDate(); Date reactivationDate = identity.getReactivationDate();
if(reactivationDate != null ) { if(reactivationDate != null ) {
days = userModule.getNumberOfDayReactivationPeriod() - CalendarUtils.numOfDays(referenceDate, reactivationDate); long reactivationDays = userModule.getNumberOfDayReactivationPeriod() - CalendarUtils.numOfDays(referenceDate, reactivationDate);
} else { if(reactivationDays > days) {
Date lastLogin = identity.getLastLogin(); days = reactivationDays;
if(lastLogin == null) {
lastLogin = identity.getCreationDate();
} }
days = userModule.getNumberOfInactiveDayBeforeDeactivation() - CalendarUtils.numOfDays(referenceDate, lastLogin);
} }
return days > 0l ? days : 1l; return days > 0l ? days : 1l;
} }
......
...@@ -208,6 +208,72 @@ public class UserLifecycleManagerTest extends OlatTestCase { ...@@ -208,6 +208,72 @@ public class UserLifecycleManagerTest extends OlatTestCase {
} }
} }
@Test
public void untilDeactivation() {
Assert.assertTrue(userModule.isUserAutomaticDeactivation());
userModule.setNumberOfInactiveDayBeforeDeactivation(720);
Date now = new Date();
// inactivation long due
Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-41");
identityDao.setIdentityLastLogin(id1, DateUtils.addDays(new Date(), -910));
dbInstance.commitAndCloseSession();
// last login within limit
Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-42");
identityDao.setIdentityLastLogin(id2, DateUtils.addDays(new Date(), -510));
dbInstance.commitAndCloseSession();
id1 = securityManager.loadIdentityByKey(id1.getKey());
long daysUntilId1 = lifecycleManager.getDaysUntilDeactivation(id1, now);
Assert.assertEquals(1, daysUntilId1);
id2 = securityManager.loadIdentityByKey(id2.getKey());
long daysUntilId2 = lifecycleManager.getDaysUntilDeactivation(id2, now);
Assert.assertEquals(210, daysUntilId2);
}
/**
* Check the grace period after reactivation
*/
@Test
public void untilDeactivationWithReactivation() {
Assert.assertTrue(userModule.isUserAutomaticDeactivation());
userModule.setNumberOfInactiveDayBeforeDeactivation(720);
// someone play
Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-43");
identityDao.setIdentityLastLogin(id, DateUtils.addDays(new Date(), -910));
dbInstance.commitAndCloseSession();
id = securityManager.saveIdentityStatus(id, Identity.STATUS_INACTIVE, null);
id = securityManager.saveIdentityStatus(id, Identity.STATUS_ACTIV, null);
// grace period after reactivation
id = securityManager.loadIdentityByKey(id.getKey());
long daysUntil = lifecycleManager.getDaysUntilDeactivation(id, new Date());
Assert.assertEquals(30, daysUntil);
}
/**
* Check the login date has a high priority than the reactivation date.
*/
@Test
public void untilDeactivationWithManualInactivationReactivation() {
Assert.assertTrue(userModule.isUserAutomaticDeactivation());
userModule.setNumberOfInactiveDayBeforeDeactivation(720);
// someone play
Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-44");
identityDao.setIdentityLastLogin(id, DateUtils.addDays(new Date(), -410));
dbInstance.commitAndCloseSession();
id = securityManager.saveIdentityStatus(id, Identity.STATUS_INACTIVE, null);
id = securityManager.saveIdentityStatus(id, Identity.STATUS_ACTIV, null);
// grace period after reactivation
id = securityManager.loadIdentityByKey(id.getKey());
long daysUntil = lifecycleManager.getDaysUntilDeactivation(id, new Date());
Assert.assertEquals(310, daysUntil);
}
@Test @Test
public void inactivateASingleInformedIdentity() { public void inactivateASingleInformedIdentity() {
Assert.assertTrue(userModule.isUserAutomaticDeactivation()); Assert.assertTrue(userModule.isUserAutomaticDeactivation());
...@@ -414,6 +480,41 @@ public class UserLifecycleManagerTest extends OlatTestCase { ...@@ -414,6 +480,41 @@ public class UserLifecycleManagerTest extends OlatTestCase {
getSmtpServer().reset(); getSmtpServer().reset();
} }
/**
* Test the case of an administrator which play activate/inactivate. The
* login date has a higher priority and win against the reactivation grace
* period of 30 days.
*/
@Test
public void manuallyReactivatedIdentity() {
Assert.assertTrue(userModule.isUserAutomaticDeactivation());
userModule.setMailBeforeDeactivation(true);
userModule.setNumberOfInactiveDayBeforeDeactivation(720);
userModule.setNumberOfDayBeforeDeactivationMail(30);
Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("lifecycle-31");
identityDao.setIdentityLastLogin(id, DateUtils.addDays(new Date(), -180));
id = securityManager.saveIdentityStatus(id, Identity.STATUS_INACTIVE, null);
id = securityManager.saveIdentityStatus(id, Identity.STATUS_ACTIV, null);
dbInstance.commitAndCloseSession();
Assert.assertNotNull(id.getLastLogin());
Assert.assertNotNull(id.getReactivationDate());
// set reactivation date before the limit of 30 days
((IdentityImpl)id).setReactivationDate(DateUtils.addDays(new Date(), -40));
id = identityDao.saveIdentity(id);
Set<Identity> vetoed = new HashSet<>();
lifecycleManager.inactivateIdentities(vetoed);
dbInstance.commitAndCloseSession();
// the login date has a higher priority, the identity will not be inactivated again
Identity reloadedId = securityManager.loadIdentityByKey(id.getKey());
Assert.assertEquals(Identity.STATUS_ACTIV, reloadedId.getStatus());
Assert.assertNotNull(reloadedId.getLastLogin());
Assert.assertNotNull(reloadedId.getReactivationDate());
}
@Test @Test
public void deleteIdentities() { public void deleteIdentities() {
Assert.assertTrue(userModule.isUserAutomaticDeletion()); Assert.assertTrue(userModule.isUserAutomaticDeletion());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment