From 3c855e81665e9da47244c585009add62bef735db Mon Sep 17 00:00:00 2001 From: Edward Valley Date: Tue, 5 Apr 2022 18:47:36 -0400 Subject: [PATCH] Make password expiration time attribute configurable --- .../main/java/password/pwm/config/PwmSetting.java | 2 ++ .../password/pwm/ldap/LdapOperationsHelper.java | 14 ++++++++++++-- .../java/password/pwm/ldap/UserInfoReader.java | 2 +- .../password/pwm/svc/pwnotify/PwNotifyEngine.java | 5 ++--- .../resources/password/pwm/config/PwmSetting.xml | 7 +++++++ .../password/pwm/i18n/PwmSetting.properties | 2 ++ 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/server/src/main/java/password/pwm/config/PwmSetting.java b/server/src/main/java/password/pwm/config/PwmSetting.java index 994d6c8ac..0fef214d1 100644 --- a/server/src/main/java/password/pwm/config/PwmSetting.java +++ b/server/src/main/java/password/pwm/config/PwmSetting.java @@ -252,6 +252,8 @@ public enum PwmSetting "ldap.namingAttribute", PwmSettingSyntax.STRING, PwmSettingCategory.LDAP_ATTRIBUTES ), PASSWORD_LAST_UPDATE_ATTRIBUTE( "passwordLastUpdateAttribute", PwmSettingSyntax.STRING, PwmSettingCategory.LDAP_ATTRIBUTES ), + PASSWORD_EXPIRATION_TIME_ATTRIBUTE( + "passwordExpirationTimeAttribute", PwmSettingSyntax.STRING, PwmSettingCategory.LDAP_ATTRIBUTES ), LDAP_USER_GROUP_ATTRIBUTE( "ldap.user.group.attribute", PwmSettingSyntax.STRING, PwmSettingCategory.LDAP_ATTRIBUTES ), LDAP_GROUP_LABEL_ATTRIBUTE( diff --git a/server/src/main/java/password/pwm/ldap/LdapOperationsHelper.java b/server/src/main/java/password/pwm/ldap/LdapOperationsHelper.java index 3faf7b84f..66009b682 100644 --- a/server/src/main/java/password/pwm/ldap/LdapOperationsHelper.java +++ b/server/src/main/java/password/pwm/ldap/LdapOperationsHelper.java @@ -849,11 +849,21 @@ public static Map> readAllEntryAttributeValues( final ChaiE return Collections.emptyMap(); } - public static Instant readPasswordExpirationTime( final ChaiUser theUser ) + public static Instant readPasswordExpirationTime( + final PwmDomain pwmDomain, + final SessionLabel sessionLabel, + final UserIdentity userIdentity + ) { try { - Instant ldapPasswordExpirationTime = theUser.readPasswordExpirationDate(); + final ChaiUser theUser = pwmDomain.getProxiedChaiUser( sessionLabel, userIdentity ); + + final LdapProfile ldapProfile = pwmDomain.getConfig().getLdapProfiles().get( userIdentity.getLdapProfileID() ); + final String expirationTimeAttribute = ldapProfile.readSettingAsString( PwmSetting.PASSWORD_EXPIRATION_TIME_ATTRIBUTE ); + + Instant ldapPasswordExpirationTime = expirationTimeAttribute != null ? theUser.readDateAttribute( expirationTimeAttribute ) : theUser.readPasswordExpirationDate(); + if ( ldapPasswordExpirationTime != null && ldapPasswordExpirationTime.toEpochMilli() < 0 ) { // If ldapPasswordExpirationTime is less than 0, this may indicate an extremely late date, past the epoch. diff --git a/server/src/main/java/password/pwm/ldap/UserInfoReader.java b/server/src/main/java/password/pwm/ldap/UserInfoReader.java index 404f3765f..b2f764b31 100644 --- a/server/src/main/java/password/pwm/ldap/UserInfoReader.java +++ b/server/src/main/java/password/pwm/ldap/UserInfoReader.java @@ -203,7 +203,7 @@ public UserIdentity getUserIdentity( ) @Override public Instant getPasswordExpirationTime( ) throws PwmUnrecoverableException { - return LdapOperationsHelper.readPasswordExpirationTime( chaiUser ); + return LdapOperationsHelper.readPasswordExpirationTime( pwmDomain, sessionLabel, userIdentity ); } @Override diff --git a/server/src/main/java/password/pwm/svc/pwnotify/PwNotifyEngine.java b/server/src/main/java/password/pwm/svc/pwnotify/PwNotifyEngine.java index 211e98b0f..ffbd8d56d 100644 --- a/server/src/main/java/password/pwm/svc/pwnotify/PwNotifyEngine.java +++ b/server/src/main/java/password/pwm/svc/pwnotify/PwNotifyEngine.java @@ -20,7 +20,6 @@ package password.pwm.svc.pwnotify; -import com.novell.ldapchai.ChaiUser; import password.pwm.PwmDomain; import password.pwm.bean.EmailItemBean; import password.pwm.bean.UserIdentity; @@ -238,8 +237,8 @@ private void processUserIdentity( } examinedCount.incrementAndGet(); - final ChaiUser theUser = pwmDomain.getProxiedChaiUser( pwNotifyService.getSessionLabel(), userIdentity ); - final Instant passwordExpirationTime = LdapOperationsHelper.readPasswordExpirationTime( theUser ); + + final Instant passwordExpirationTime = LdapOperationsHelper.readPasswordExpirationTime( pwmDomain, pwNotifyService.getSessionLabel(), userIdentity ); if ( passwordExpirationTime == null ) { diff --git a/server/src/main/resources/password/pwm/config/PwmSetting.xml b/server/src/main/resources/password/pwm/config/PwmSetting.xml index 764256f79..81afe05a6 100644 --- a/server/src/main/resources/password/pwm/config/PwmSetting.xml +++ b/server/src/main/resources/password/pwm/config/PwmSetting.xml @@ -623,6 +623,13 @@ +