From cb5bd3ff82e50c1cad75bf25cbf4f9255ef1a67e Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Fri, 15 Jan 2021 10:27:53 +0100 Subject: [PATCH] OO-5228: login date as precedence over reactivation date --- .../lifecycle/UserLifecycleManagerImpl.java | 19 ++-- .../lifecycle/UserLifecycleManagerTest.java | 101 ++++++++++++++++++ 2 files changed, 113 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java b/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java index 3a31677b883..0de6b453198 100644 --- a/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java +++ b/src/main/java/org/olat/user/manager/lifecycle/UserLifecycleManagerImpl.java @@ -98,17 +98,22 @@ public class UserLifecycleManagerImpl implements UserLifecycleManager { @Override 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(); if(reactivationDate != null ) { - days = userModule.getNumberOfDayReactivationPeriod() - CalendarUtils.numOfDays(referenceDate, reactivationDate); - } else { - Date lastLogin = identity.getLastLogin(); - if(lastLogin == null) { - lastLogin = identity.getCreationDate(); + long reactivationDays = userModule.getNumberOfDayReactivationPeriod() - CalendarUtils.numOfDays(referenceDate, reactivationDate); + if(reactivationDays > days) { + days = reactivationDays; } - days = userModule.getNumberOfInactiveDayBeforeDeactivation() - CalendarUtils.numOfDays(referenceDate, lastLogin); } + return days > 0l ? days : 1l; } diff --git a/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java b/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java index a5f09d0d70d..247a4796b34 100644 --- a/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java +++ b/src/test/java/org/olat/user/manager/lifecycle/UserLifecycleManagerTest.java @@ -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 public void inactivateASingleInformedIdentity() { Assert.assertTrue(userModule.isUserAutomaticDeactivation()); @@ -414,6 +480,41 @@ public class UserLifecycleManagerTest extends OlatTestCase { 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 public void deleteIdentities() { Assert.assertTrue(userModule.isUserAutomaticDeletion()); -- GitLab