diff --git a/include/class_userinfo.inc b/include/class_userinfo.inc index f6f92859d077f86d8acba54909d120ec731980f8..e8d37e1faf80309b230a42c46b9dc5cfb65b0d9b 100644 --- a/include/class_userinfo.inc +++ b/include/class_userinfo.inc @@ -912,6 +912,28 @@ class userinfo if (!$ldap->success()) { return PPOLICY_ACCOUNT_EXPIRED; } + + try { + list($policy, $attrs) = user::fetchPpolicy($this->dn); + if ( + isset($policy['pwdExpireWarning'][0]) && + isset($policy['pwdMaxAge'][0]) && + isset($attrs['pwdChangedTime'][0]) + ) { + $now = new DateTime('now', timezone::utc()); + $pwdExpireWarningSeconds = intval($policy['pwdExpireWarning'][0]); + $maxAge = $policy['pwdMaxAge'][0]; + /* Build expiration date from pwdChangedTime and max age */ + $expDate = LdapGeneralizedTime::fromString($attrs['pwdChangedTime'][0]); + $expDate->setTimezone(timezone::utc()); + $expDate->add(new DateInterval('PT'.$maxAge.'S')); + if ($expDate->getTimeStamp() < ($now->getTimeStamp() + $pwdExpireWarningSeconds)) { + return POSIX_WARN_ABOUT_EXPIRATION; + } + } + } catch (NonExistingLdapNodeException $e) { + /* ppolicy not found in the LDAP */ + } } if ($config->get_cfg_value('handleExpiredAccounts') != 'TRUE') { diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc index b751ed3973ca21cd00a4df0bc7647e76a27d8b7a..39317d3d75448fa0855fbe5f69c37d76391c3229 100644 --- a/plugins/personal/generic/class_user.inc +++ b/plugins/personal/generic/class_user.inc @@ -416,7 +416,7 @@ class user extends simplePlugin $policy = NULL; if (!empty($ppolicydn)) { - $ldap->cat($ppolicydn, ['pwdAllowUserChange', 'pwdMinLength', 'pwdMinAge', 'pwdSafeModify']); + $ldap->cat($ppolicydn, ['pwdAllowUserChange', 'pwdMinLength', 'pwdMinAge', 'pwdSafeModify', 'pwdExpireWarning', 'pwdMaxAge']); $policy = $ldap->fetch(); if (!$policy) { throw new NonExistingLdapNodeException(sprintf(_('Ppolicy "%s" could not be found in the LDAP!'), $ppolicydn));