From dd2fb803752b80edbf4c48be082a1392a54fd5cd Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sun, 3 Mar 2019 10:16:45 +0100 Subject: [PATCH] added shadow account expiration notification job --- lam/HISTORY | 1 + .../manual-sources/chapter-configuration.xml | 89 ++++++++++++++++ .../manual-sources/images/jobs_shadow3.png | Bin 0 -> 57202 bytes lam/lib/modules/shadowAccount.inc | 99 +++++++++++++++++- 4 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 lam/docs/manual-sources/images/jobs_shadow3.png diff --git a/lam/HISTORY b/lam/HISTORY index cf8e5e9b..2381fb86 100644 --- a/lam/HISTORY +++ b/lam/HISTORY @@ -5,6 +5,7 @@ March 2019 - LAM Pro: -> New self service fields: Mail routing (Local address) and Windows (Proxy-Addresses) -> Bind DLZ: support DNAME+XFR records and descriptions in records (requires latest LDAP schema) + -> Cron jobs: added Shadow account expiration notification jobs - Fixed bugs: -> Allow tree-only configurations without any other tab diff --git a/lam/docs/manual-sources/chapter-configuration.xml b/lam/docs/manual-sources/chapter-configuration.xml index b0aa378f..974cb3fb 100644 --- a/lam/docs/manual-sources/chapter-configuration.xml +++ b/lam/docs/manual-sources/chapter-configuration.xml @@ -969,6 +969,11 @@ mysql> GRANT ALL PRIVILEGES ON lam_cron.* TO 'lam_cron'@'localhost'; move expired accounts + + Shadow: + Notify users about account expiration + + Windows: Notify users about password expiration @@ -1364,6 +1369,90 @@ mysql> GRANT ALL PRIVILEGES ON lam_cron.* TO 'lam_cron'@'localhost'; +
+ Shadow: Notify users about account expiration + + This will send your users an email reminder before their whole + account expires. + + You need to activate the Shadow module for users to be able to + add this job. The job can be added multiple times (e.g. to send a + second warning at a later time). + + + + + + + Options + + + + + Option + + Description + + + + From address + + The email address to set as FROM. + + + + Reply-to address + + Optional Reply-to address for email. + + + + CC address + + Optional CC mail address. + + + + BCC address + + Optional BCC mail address. + + + + Subject + + The email subject line. Supports wildcards, see + below. + + + + Text + + The email body text. Supports wildcards, see + below. + + + + Notification period + + Number of days to notify before account + expires. + + + +
Wildcards:
+ + You can enter LDAP attributes as wildcards in the form + @@ATTRIBUTE_NAME@@. E.g. to add the user's common name use "@@cn@@". + For the common name it would be "@@cn@@". + + There are also two special wildcards for the expiration date. + @@EXPIRE_DATE_DDMMYYYY@@ will print the date as e.g. "31.12.2016". + @@EXPIRE_DATE_YYYYMMDD@@ will print the date as e.g. + "2016-12-31". +
+
Windows: Notify users about password expiration diff --git a/lam/docs/manual-sources/images/jobs_shadow3.png b/lam/docs/manual-sources/images/jobs_shadow3.png new file mode 100644 index 0000000000000000000000000000000000000000..b256f12b7374ddef7922469691f09ee70bee8e6a GIT binary patch literal 57202 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 S5Qe&PMN~)%kteAA{(k_64Md#) literal 0 HcmV?d00001 diff --git a/lam/lib/modules/shadowAccount.inc b/lam/lib/modules/shadowAccount.inc index 939012a7..39aec47b 100644 --- a/lam/lib/modules/shadowAccount.inc +++ b/lam/lib/modules/shadowAccount.inc @@ -3,7 +3,7 @@ This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/) Copyright (C) 2003 - 2006 Tilo Lutz - Copyright (C) 2007 - 2018 Roland Gruber + Copyright (C) 2007 - 2019 Roland Gruber This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -762,7 +762,8 @@ class shadowAccount extends baseModule implements passwordService { public function getSupportedJobs(&$config) { return array( new ShadowAccountPasswordNotifyJob(), - new ShadowAccountExpirationCleanupJob() + new ShadowAccountExpirationCleanupJob(), + new ShadowAccountExpirationNotifyJob() ); } @@ -914,6 +915,100 @@ if (interface_exists('\LAM\JOB\Job', false)) { } + /** + * Job to notify users about account expiration. + * + * @package jobs + */ + class ShadowAccountExpirationNotifyJob extends \LAM\JOB\PasswordExpirationJob { + + /** + * Returns the alias name of the job. + * + * @return String name + */ + public function getAlias() { + return _('Shadow') . ': ' . _('Notify users about acoount expiration'); + } + + /** + * {@inheritDoc} + * @see \LAM\JOB\PasswordExpirationJob::getDescription() + */ + public function getDescription() { + return _('This job sends out emails to inform your users that their account will expire soon.'); + } + + /** + * Searches for users in LDAP. + * + * @param String $jobID unique job identifier + * @param array $options config options (name => value) + * @return array list of user attributes + */ + protected function findUsers($jobID, $options) { + // read users + $sysattrs = array('mail', 'shadowExpire'); + $attrs = $this->getAttrWildcards($jobID, $options); + $attrs = array_values(array_unique(array_merge($attrs, $sysattrs))); + return searchLDAPByFilter('(&(shadowExpire=*)(mail=*))', $attrs, array('user')); + } + + /** + * Checks if a user needs to change his password. + * + * @param integer $jobID job ID + * @param array $options job settings + * @param PDO $pdo PDO + * @param DateTime $now current time + * @param array $policyOptions list of max age values (policy DN => maxAge) + * @param array $user user attributes + * @param boolean $isDryRun just do a dry run, nothing is modified + */ + protected function checkSingleUser($jobID, $options, &$pdo, $now, $policyOptions, $user, $isDryRun) { + $dn = $user['dn']; + $expireTimeUnix = $user['shadowexpire'][0] * 3600 * 24; + $expireTime = new DateTime('@' . $expireTimeUnix, new DateTimeZone('UTC')); + $this->jobResultLog->logDebug("Expiration on " . $expireTime->format('Y-m-d')); + if ($expireTime <= $now) { + $this->jobResultLog->logDebug($dn . ' already expired'); + return; + } + $numDaysToWarn = 0; + if (!empty($options[$this->getConfigPrefix() . '_mailNotificationPeriod' . $jobID][0])) { + $numDaysToWarn = $options[$this->getConfigPrefix() . '_mailNotificationPeriod' . $jobID][0]; + } + $actionTime = clone $expireTime; + if ($numDaysToWarn != 0) { + $actionTime->sub(new DateInterval('P' . $numDaysToWarn . 'D')); + } + $actionTime->setTimeZone(getTimeZone()); + $this->jobResultLog->logDebug("Action time on " . $actionTime->format('Y-m-d')); + if ($actionTime > $now) { + $this->jobResultLog->logDebug($dn . ' does not need notification yet.'); + return; + } + $dbLastChange = $this->getDBLastPwdChangeTime($jobID, $pdo, $user['dn']); + // skip entries where mail was already sent + if ($dbLastChange == $user['shadowexpire'][0]) { + $this->jobResultLog->logDebug($dn . ' was already notified.'); + return; + } + if ($isDryRun) { + // no action for dry run + $this->jobResultLog->logInfo('Not sending email to ' . $dn . ' because of dry run.'); + return; + } + // send email + $success = $this->sendMail($options, $jobID, $user, $expireTime); + // update DB if mail was sent successfully + if ($success) { + $this->setDBLastPwdChangeTime($jobID, $pdo, $dn, $user['shadowexpire'][0]); + } + } + + } + /** * Job to delete or move users on account expiration. *