From 2698995cc2241d5112f213fc81c2f7a37c7bd2c9 Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sat, 18 Jul 2020 20:13:38 +0200 Subject: [PATCH] added job to send users group summary --- lam/HISTORY | 2 + .../manual-sources/chapter-configuration.xml | 94 ++++++ .../images/jobs_windowsNotifyGroups.png | Bin 0 -> 71942 bytes lam/help/help.inc | 10 + lam/lib/modules/windowsUser.inc | 296 +++++++++++++++++- lam/tests/lib/modules/windowsUserTest.php | 33 +- 6 files changed, 431 insertions(+), 4 deletions(-) create mode 100644 lam/docs/manual-sources/images/jobs_windowsNotifyGroups.png diff --git a/lam/HISTORY b/lam/HISTORY index 033852ef..84599e41 100644 --- a/lam/HISTORY +++ b/lam/HISTORY @@ -4,6 +4,8 @@ September 2020 - Show password prompt when a user with expired password logs into LAM admin interface (requires PHP 7.2) - Better error messages on login when account is expired/deactivated/... - Windows users: group display format can be configured (cn/dn) + - LAM Pro: + -> Windows: new cron job to send users a summary of their managed groups 01.05.2020 7.2 - Unix: allow to create group with same name during user creation diff --git a/lam/docs/manual-sources/chapter-configuration.xml b/lam/docs/manual-sources/chapter-configuration.xml index 6b89e4cf..d8a43229 100644 --- a/lam/docs/manual-sources/chapter-configuration.xml +++ b/lam/docs/manual-sources/chapter-configuration.xml @@ -1141,6 +1141,11 @@ mysql> GRANT ALL PRIVILEGES ON lam_cron.* TO 'lam_cron'@'localhost'; move expired accounts + + Windows: Notify + users about their managed groups + + FreeRadius: Delete or move expired accounts @@ -1829,6 +1834,95 @@ mysql> GRANT ALL PRIVILEGES ON lam_cron.* TO 'lam_cron'@'localhost'; +
+ Windows: Notify users about their managed groups + + This will send your users an email with the groups they + manage. This also includes a list of users in these groups. The + users and groups are searched using the user+group account types + that are specified in server profile. + + You need to activate the Windows module for users to be able + to add this job. The job can be added multiple times. + + + + + + + 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. + + + + HTML format + + Send email as HTML instead of plain text. + + + + Text + + The email body text. Supports wildcards, see + below. + + + + Period + + Defines how often the mail is sent (e.g. + quarterly). + + + +
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@@". + + Use the wildcard "@@LAM_MANAGED_GROUPS@@" to insert the group + listing. This wildcard is mandatory. +
+
FreeRadius: Delete or move expired accounts diff --git a/lam/docs/manual-sources/images/jobs_windowsNotifyGroups.png b/lam/docs/manual-sources/images/jobs_windowsNotifyGroups.png new file mode 100644 index 0000000000000000000000000000000000000000..9f635975694a8b3fd513aae51155933ad79eaa98 GIT binary patch literal 71942 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 literal 0 HcmV?d00001 diff --git a/lam/help/help.inc b/lam/help/help.inc index 8c6162d5..955cad60 100644 --- a/lam/help/help.inc +++ b/lam/help/help.inc @@ -430,6 +430,16 @@ $helpArray = array ( "Headline" => _('Target DN'), "Text" => _('The expired accounts will be moved to this DN.') ), + '810' => array( + "Headline" => _('Text'), + "Text" => _('The mail text of all mails.') . + _('You can use wildcards for LDAP attributes in the form @@attribute@@ (e.g. @@uid@@ for the user name).') + . ' ' . _('The managed groups need to be added with @@LAM_MANAGED_GROUPS@@.') + ), + '811' => array( + "Headline" => _('Period'), + "Text" => _('This defines how often the email is sent (e.g. each month).') + ), ); /* This is a sample help entry. Just copy this line an modify the values between the [] brackets. diff --git a/lam/lib/modules/windowsUser.inc b/lam/lib/modules/windowsUser.inc index 353bc200..ade505f0 100644 --- a/lam/lib/modules/windowsUser.inc +++ b/lam/lib/modules/windowsUser.inc @@ -3915,7 +3915,8 @@ class windowsUser extends baseModule implements passwordService { return array( new WindowsPasswordNotifyJob(), new WindowsAccountExpirationCleanupJob(), - new WindowsAccountExpirationNotifyJob() + new WindowsAccountExpirationNotifyJob(), + new WindowsManagedGroupsNotifyJob() ); } @@ -4147,6 +4148,299 @@ if (interface_exists('\LAM\JOB\Job', false)) { } + /** + * Job to notify users about their managed groups. + * + * @package jobs + */ + class WindowsManagedGroupsNotifyJob extends \LAM\JOB\PasswordExpirationJob { + + const MANAGED_GROUPS = 'LAM_MANAGED_GROUPS'; + const PERIOD_MONTHLY = 'MONTHLY'; + const PERIOD_QUARTERLY = 'QUARTERLY'; + const PERIOD_HALF_YEARLY = 'HALF_YEARLY'; + const PERIOD_YEARLY = 'YEARLY'; + + /** + * Returns the alias name of the job. + * + * @return String name + */ + public function getAlias() { + return _('Windows') . ': ' . _('Notify users about their managed groups'); + } + + /** + * @inheritDoc + */ + public function getDescription() { + return _('This will send each user a summary of the managed groups and their members.'); + } + + /** + * @inheritDoc + */ + public function getConfigOptions($jobID) { + $prefix = $this->getConfigPrefix(); + $container = new htmlResponsiveRow(); + $container->add(new htmlResponsiveInputField(_('From address'), $prefix . '_mailFrom' . $jobID, null, '800', true), 12); + $container->add(new htmlResponsiveInputField(_('Reply-to address'), $prefix . '_mailReplyTo' . $jobID, null, '801'), 12); + $container->add(new htmlResponsiveInputField(_('CC address'), $prefix . '_mailCC' . $jobID, null, '805'), 12); + $container->add(new htmlResponsiveInputField(_('BCC address'), $prefix . '_mailBCC' . $jobID, null, '806'), 12); + $container->add(new htmlResponsiveInputField(_('Subject'), $prefix . '_mailSubject' . $jobID, null, '802'), 12); + $container->add(new htmlResponsiveInputCheckbox($prefix . '_mailIsHTML' . $jobID, false, _('HTML format'), '553'), 12); + $container->add(new htmlResponsiveInputTextarea($prefix . '_mailtext' . $jobID, '', 50, 4, _('Text'), '810'), 12); + $periodOptions = array( + _('Monthly') => self::PERIOD_MONTHLY, + _('Quarterly') => self::PERIOD_QUARTERLY, + _('Half-yearly') => self::PERIOD_HALF_YEARLY, + _('Yearly') => self::PERIOD_YEARLY, + ); + $periodSelect = new htmlResponsiveSelect($prefix . '_period' . $jobID, $periodOptions, array(), _('Period'), '811'); + $periodSelect->setHasDescriptiveElements(true); + $periodSelect->setSortElements(false); + $container->add($periodSelect, 12); + return $container; + } + + /** + * @inheritDoc + */ + public function checkConfigOptions($jobID, $options) { + $prefix = $this->getConfigPrefix(); + $errors = array(); + // from address + if (empty($options[$prefix . '_mailFrom' . $jobID][0]) + || !(get_preg($options[$prefix . '_mailFrom' . $jobID][0], 'email') + || get_preg($options[$prefix . '_mailFrom' . $jobID][0], 'emailWithName'))) { + $errors[] = array('ERROR', _('Please enter a valid email address!'), _('From address')); + } + // reply-to + if (!empty($options[$prefix . '_mailReplyTo' . $jobID][0]) + && !get_preg($options[$prefix . '_mailReplyTo' . $jobID][0], 'email') + && !get_preg($options[$prefix . '_mailReplyTo' . $jobID][0], 'emailWithName')) { + $errors[] = array('ERROR', _('Please enter a valid email address!'), _('Reply-to address')); + } + // CC address + if (!empty($options[$prefix . '_mailCC' . $jobID][0]) + && !get_preg($options[$prefix . '_mailCC' . $jobID][0], 'email') + && !get_preg($options[$prefix . '_mailCC' . $jobID][0], 'emailWithName')) { + $errors[] = array('ERROR', _('Please enter a valid email address!'), _('CC address')); + } + // BCC address + if (!empty($options[$prefix . '_mailBCC' . $jobID][0]) + && !get_preg($options[$prefix . '_mailBCC' . $jobID][0], 'email') + && !get_preg($options[$prefix . '_mailBCC' . $jobID][0], 'emailWithName')) { + $errors[] = array('ERROR', _('Please enter a valid email address!'), _('BCC address')); + } + // text + $mailText = implode('', $options[$prefix . '_mailtext' . $jobID]); + if (empty($mailText)) { + $errors[] = array('ERROR', _('Please set a email text.')); + } + if (strpos($mailText, '@@' . self::MANAGED_GROUPS . '@@') === false) { + $errors[] = array('ERROR', _('Please add the wildcard for the list of managed groups.'), '@@' . self::MANAGED_GROUPS . '@@'); + } + return $errors; + } + + /** + * @inheritDoc + */ + protected function getPolicyOptions() { + return array(); + } + + /** + * 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('managedObjects', 'mail'); + $attrs = $this->getAttrWildcards($jobID, $options); + $attrs = array_values(array_unique(array_merge($attrs, $sysAttrs))); + $users = searchLDAPByFilter('(&(mail=*)(managedObjects=*))', $attrs, array('user')); + $groups = searchLDAPByFilter('(managedBy=*)', array('cn', 'member'), array('group')); + $groupByDn = array(); + foreach ($groups as $group) { + $groupByDn[$group['dn']] = $group; + } + $groups = null; + foreach ($users as $index => $user) { + $managedObjectDns = $user['managedobjects']; + $managedGroups = array(); + foreach ($managedObjectDns as $managedObjectDn) { + if (array_key_exists($managedObjectDn, $groupByDn)) { + $managedGroups[] = $groupByDn[$managedObjectDn]; + } + } + $users[$index][strtolower(self::MANAGED_GROUPS)] = $managedGroups; + } + return $users; + } + + /** + * @inheritDoc + */ + public function execute($jobID, $options, &$pdo, $isDryRun, &$resultLog) { + $this->jobResultLog = &$resultLog; + $this->jobResultLog->logDebug("Configuration options:"); + foreach ($options as $key => $value) { + if (strpos($key, $jobID) === false) { + continue; + } + $this->jobResultLog->logDebug($key . ': ' . implode(', ', $value)); + } + $now = new DateTime(null, getTimeZone()); + $baseDate = $this->getBaseDate($now); + $monthInterval = $this->getMonthInterval($options, $jobID); + if (!$this->shouldRun($pdo, $options, $jobID, $baseDate, $monthInterval)) { + $this->jobResultLog->logDebug('No run needed yet'); + return; + } + $userResults = $this->findUsers($jobID, $options); + $this->jobResultLog->logDebug("Found " . sizeof($userResults) . " users to send an email."); + $isHTML = (!empty($options[$this->getConfigPrefix() . '_mailIsHTML' . $jobID][0]) && ($options[$this->getConfigPrefix() . '_mailIsHTML' . $jobID][0] == 'true')); + foreach ($userResults as $user) { + if (empty($user[strtolower(self::MANAGED_GROUPS)])) { + continue; + } + $user[strtolower(self::MANAGED_GROUPS)][0] = $this->formatGroups($user[strtolower(self::MANAGED_GROUPS)], $isHTML); + if ($isDryRun) { + // no action for dry run + $this->jobResultLog->logInfo("Managed groups text for " . $user['dn'] . ":\n" . $user[strtolower(self::MANAGED_GROUPS)][0]); + $this->jobResultLog->logInfo('Not sending email to ' . $user['dn'] . ' because of dry run.'); + continue; + } + // send email + $this->sendMail($options, $jobID, $user, null); + } + if (!$isDryRun) { + $this->setDBLastPwdChangeTime($jobID, $pdo, $jobID, self::getLastEffectiveExecutionDate($baseDate, $monthInterval, $this->jobResultLog)->format('Y-m-d')); + } + } + + /** + * Returns if the job should run. + * + * @param $pdo PDO + * @param $options job options + * @param $jobId job id + * @param DateTime $baseDate base date + * @param int $monthInterval month interval + * @return bool should run + */ + private function shouldRun(&$pdo, $options, $jobId, $baseDate, $monthInterval) { + $dbLastChange = $this->getDBLastPwdChangeTime($jobId, $pdo, $jobId); + if (empty($dbLastChange)) { + return true; + } + $this->jobResultLog->logDebug('Base date: ' . $baseDate->format('Y-m-d')); + $effectiveDate = self::getLastEffectiveExecutionDate($baseDate, $monthInterval, $this->jobResultLog); + $dbLastChangeDate = DateTime::createFromFormat('Y-m-d', $dbLastChange, getTimeZone()); + $this->jobResultLog->logDebug('Last run date: ' . $dbLastChangeDate->format('Y-m-d')); + return $effectiveDate > $dbLastChangeDate; + } + + /** + * Returns the month interval. + * + * @param arry $options config options + * @param $jobId job id + * @return int interval + */ + private function getMonthInterval($options, $jobId) { + $monthInterval = 12; + switch ($options[$this->getConfigPrefix() . '_period' . $jobId][0]) { + case self::PERIOD_HALF_YEARLY: + $monthInterval = 6; + break; + case self::PERIOD_QUARTERLY: + $monthInterval = 3; + break; + case self::PERIOD_MONTHLY: + $monthInterval = 1; + break; + } + return $monthInterval; + } + + /** + * Returns the base date (first of month) for the current date. + * + * @param DateTime $currentDate current date + * @return DateTime base date + */ + private function getBaseDate($currentDate) { + $baseDateText = $currentDate->format('Y-m-') . '1'; + return DateTime::createFromFormat('Y-m-d', $baseDateText, getTimeZone()); + } + + /** + * Returns the last effective execution date. + * + * @param DateTime $baseDate base date + * @param int $monthInterval number of months in interval + * @param \LAM\JOB\JobResultLog $resultLog result log + */ + public static function getLastEffectiveExecutionDate($baseDate, $monthInterval, $resultLog) { + $month = $baseDate->format('m'); + $monthIndex = $month - 1; + while (($monthIndex % $monthInterval) !== 0) { + $monthIndex--; + } + $month = $monthIndex + 1; + $effectiveDateString = $baseDate->format('Y-') . $month . '-1'; + $effectiveDate = DateTime::createFromFormat('Y-m-d', $effectiveDateString, getTimeZone()); + $resultLog->logDebug("Effective date: " . $effectiveDate->format('Y-m-d')); + return $effectiveDate; + } + + /** + * @inheritDoc + */ + protected function checkSingleUser($jobID, $options, &$pdo, $now, $policyOptions, $user, $isDryRun) { + // not used + } + + /** + * Formats the managed groups. + * + * @param $managedGroups managed groups + * @param bool $isHTML HTML email + * @return string formatted text + */ + private function formatGroups($managedGroups, bool $isHTML) { + $text = ''; + foreach ($managedGroups as $managedGroup) { + if ($isHTML) { + $text .= '
' . $managedGroup['cn'][0] . '
'; + } + else { + $text .= "\r\n" . $managedGroup['cn'][0] . "\r\n\r\n"; + } + if (empty($managedGroup['member'])) { + continue; + } + foreach ($managedGroup['member'] as $member) { + $member = getAbstractDN($member); + if ($isHTML) { + $text .= '  ' . $member . '
'; + } + else { + $text .= " " . $member . "\r\n"; + } + } + } + return $text; + } + + } + /** * Job to notify users about account expiration. * diff --git a/lam/tests/lib/modules/windowsUserTest.php b/lam/tests/lib/modules/windowsUserTest.php index e5534204..4d109ae3 100644 --- a/lam/tests/lib/modules/windowsUserTest.php +++ b/lam/tests/lib/modules/windowsUserTest.php @@ -21,9 +21,9 @@ use PHPUnit\Framework\TestCase; */ - include_once 'lam/lib/baseModule.inc'; - include_once 'lam/lib/modules.inc'; - include_once 'lam/lib/modules/windowsUser.inc'; + include_once __DIR__ . '/../../../lib/baseModule.inc'; + include_once __DIR__ . '/../../../lib/modules.inc'; + include_once __DIR__ . '/../../../lib/modules/windowsUser.inc'; /** * Checks the windowsUser class. @@ -78,6 +78,33 @@ use PHPUnit\Framework\TestCase; return $seconds . '0000000'; } + public function testWindowsManagedGroupsNotifyJob_getLastEffectiveExecutionDate() { + if (!interface_exists('\LAM\JOB\Job', false)) { + return; + } + $resultLog = new \LAM\JOB\JobResultLog(); + $baseDate = DateTime::createFromFormat('Y-m-d', '2020-08-21', getTimeZone()); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 12, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-07-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 6, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-07-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 3, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-08-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 1, $resultLog)->format('Y-m-d')); + $baseDate = DateTime::createFromFormat('Y-m-d', '2020-12-31', getTimeZone()); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 12, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-07-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 6, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-10-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 3, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-12-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 1, $resultLog)->format('Y-m-d')); + $baseDate = DateTime::createFromFormat('Y-m-d', '2020-01-01', getTimeZone()); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 12, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 6, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 3, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 1, $resultLog)->format('Y-m-d')); + $baseDate = DateTime::createFromFormat('Y-m-d', '2020-06-05', getTimeZone()); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 12, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-01-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 6, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-04-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 3, $resultLog)->format('Y-m-d')); + $this->assertEquals('2020-06-01', WindowsManagedGroupsNotifyJob::getLastEffectiveExecutionDate($baseDate, 1, $resultLog)->format('Y-m-d')); + } + } ?>