1a42bec4dSAnna Dabrowska<?php 2a42bec4dSAnna Dabrowska 3*9ab8cbaeSanndause dokuwiki\Extension\Plugin; 4a42bec4dSAnna Dabrowskause dokuwiki\Extension\AuthPlugin; 5a42bec4dSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Assignments; 6a42bec4dSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Constants; 7a42bec4dSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision; 8a42bec4dSAnna Dabrowska 9a42bec4dSAnna Dabrowska/** 10a42bec4dSAnna Dabrowska * Notification helper 11a42bec4dSAnna Dabrowska */ 12*9ab8cbaeSanndaclass helper_plugin_structpublish_notify extends Plugin 13a42bec4dSAnna Dabrowska{ 14a42bec4dSAnna Dabrowska /** @var helper_plugin_structpublish_db */ 15a42bec4dSAnna Dabrowska protected $dbHelper; 16a42bec4dSAnna Dabrowska 17a42bec4dSAnna Dabrowska public function __construct() 18a42bec4dSAnna Dabrowska { 19a42bec4dSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 20a42bec4dSAnna Dabrowska } 21a42bec4dSAnna Dabrowska 22a42bec4dSAnna Dabrowska /** 23a42bec4dSAnna Dabrowska * If activated, send emails on configured status changes. 24a42bec4dSAnna Dabrowska * 25a42bec4dSAnna Dabrowska * @param string $action 26a42bec4dSAnna Dabrowska * @param Revision $newRevision 27a42bec4dSAnna Dabrowska * @return void 28a42bec4dSAnna Dabrowska * @throws Exception 29a42bec4dSAnna Dabrowska */ 30a42bec4dSAnna Dabrowska public function sendEmails($action, $newRevision) 31a42bec4dSAnna Dabrowska { 32a42bec4dSAnna Dabrowska 3331e730e1SAnna Dabrowska if (!$this->triggerNotification($action)) { 3431e730e1SAnna Dabrowska return; 3531e730e1SAnna Dabrowska } 36a42bec4dSAnna Dabrowska 37a42bec4dSAnna Dabrowska // get assignees from DB 38a42bec4dSAnna Dabrowska $assignments = Assignments::getInstance(); 39a42bec4dSAnna Dabrowska $assignees = $assignments->getPageAssignments($newRevision->getId(), false); 40a42bec4dSAnna Dabrowska 41a42bec4dSAnna Dabrowska // get recipients for the next workflow step 42a42bec4dSAnna Dabrowska $nextAction = Constants::workflowSteps($action)['nextAction']; 4331e730e1SAnna Dabrowska if (is_null($nextAction)) { 4431e730e1SAnna Dabrowska return; 4531e730e1SAnna Dabrowska } 46a42bec4dSAnna Dabrowska 47a42bec4dSAnna Dabrowska if (empty($assignees[$nextAction])) { 48a42bec4dSAnna Dabrowska msg($this->getLang('email_error_norecipients'), -1); 49a42bec4dSAnna Dabrowska return; 50a42bec4dSAnna Dabrowska } 51a42bec4dSAnna Dabrowska 52a42bec4dSAnna Dabrowska // flatten the array and split into single user or group items 53a42bec4dSAnna Dabrowska $assignees = implode(',', array_values($assignees[$nextAction])); 54a42bec4dSAnna Dabrowska $assignees = explode(',', $assignees); 55a42bec4dSAnna Dabrowska 56a42bec4dSAnna Dabrowska // get recipient emails 57a42bec4dSAnna Dabrowska $recipients = $this->resolveRecipients($assignees); 58a42bec4dSAnna Dabrowska 59a42bec4dSAnna Dabrowska // prepare mail text 60a42bec4dSAnna Dabrowska $mailText = $this->prepareMailText($newRevision->getStatus()); 61a42bec4dSAnna Dabrowska 62a42bec4dSAnna Dabrowska $this->sendMail(implode(',', $recipients), $mailText); 63a42bec4dSAnna Dabrowska } 64a42bec4dSAnna Dabrowska 65a42bec4dSAnna Dabrowska /** 66a42bec4dSAnna Dabrowska * @param string $recipients Comma separated list of emails 67a42bec4dSAnna Dabrowska * @param string $mailText 68a42bec4dSAnna Dabrowska * @return void 69a42bec4dSAnna Dabrowska */ 70a42bec4dSAnna Dabrowska public function sendMail($recipients, $mailText) 71a42bec4dSAnna Dabrowska { 72a42bec4dSAnna Dabrowska $mailer = new Mailer(); 73a42bec4dSAnna Dabrowska $mailer->bcc($recipients); 74a42bec4dSAnna Dabrowska 75a42bec4dSAnna Dabrowska $subject = $this->getLang('email_subject'); 76a42bec4dSAnna Dabrowska $mailer->subject($subject); 77a42bec4dSAnna Dabrowska 78a42bec4dSAnna Dabrowska $mailer->setBody($mailText); 79a42bec4dSAnna Dabrowska $mailer->send(); 80a42bec4dSAnna Dabrowska } 81a42bec4dSAnna Dabrowska 82a42bec4dSAnna Dabrowska /** 83a42bec4dSAnna Dabrowska * Processes an array of (comma separated) recipients 84a42bec4dSAnna Dabrowska * and returns an array of emails 85a42bec4dSAnna Dabrowska * with user groups resolved to individual users 86a42bec4dSAnna Dabrowska * 87a42bec4dSAnna Dabrowska * @param array $recipients 88a42bec4dSAnna Dabrowska * @return array 89a42bec4dSAnna Dabrowska * @throws Exception 90a42bec4dSAnna Dabrowska */ 91a42bec4dSAnna Dabrowska public function resolveRecipients($recipients) 92a42bec4dSAnna Dabrowska { 93a42bec4dSAnna Dabrowska $resolved = []; 94a42bec4dSAnna Dabrowska 95a42bec4dSAnna Dabrowska $recipients = array_unique($recipients); 96a42bec4dSAnna Dabrowska 97a42bec4dSAnna Dabrowska foreach ($recipients as $recipient) { 98a42bec4dSAnna Dabrowska $recipient = trim($recipient); 99a42bec4dSAnna Dabrowska 100a42bec4dSAnna Dabrowska if ($recipient[0] === '@') { 101a42bec4dSAnna Dabrowska $this->resolveGroup($resolved, $recipient); 102a42bec4dSAnna Dabrowska } elseif (strpos($recipient, '@') === false) { 103a42bec4dSAnna Dabrowska $this->resolveUser($resolved, $recipient); 104a42bec4dSAnna Dabrowska } else { 105a42bec4dSAnna Dabrowska $resolved[] = $recipient; 106a42bec4dSAnna Dabrowska } 107a42bec4dSAnna Dabrowska } 108a42bec4dSAnna Dabrowska return $resolved; 109a42bec4dSAnna Dabrowska } 110a42bec4dSAnna Dabrowska 111a42bec4dSAnna Dabrowska /** 112a42bec4dSAnna Dabrowska * @param array $resolved 113a42bec4dSAnna Dabrowska * @param string $recipient 114a42bec4dSAnna Dabrowska * @return void 115a42bec4dSAnna Dabrowska * @throws Exception 116a42bec4dSAnna Dabrowska */ 117a42bec4dSAnna Dabrowska protected function resolveGroup(&$resolved, $recipient) 118a42bec4dSAnna Dabrowska { 119a42bec4dSAnna Dabrowska /** @var AuthPlugin $auth */ 120a42bec4dSAnna Dabrowska global $auth; 121a42bec4dSAnna Dabrowska if (!$auth->canDo('getUsers')) { 122a42bec4dSAnna Dabrowska throw new \Exception('Auth cannot fetch users by group.'); 123a42bec4dSAnna Dabrowska } 124a42bec4dSAnna Dabrowska 1254f0ebffaSAnna Dabrowska // set arbitrary limit because not all backends interpret limit 0 as "no limit" 1264f0ebffaSAnna Dabrowska $users = $auth->retrieveUsers(0, 5000, ['grps' => substr($recipient, 1)]); 127a42bec4dSAnna Dabrowska foreach ($users as $user) { 128a42bec4dSAnna Dabrowska $resolved[] = $user['mail']; 129a42bec4dSAnna Dabrowska } 130a42bec4dSAnna Dabrowska } 131a42bec4dSAnna Dabrowska 132a42bec4dSAnna Dabrowska /** 133a42bec4dSAnna Dabrowska * @param array $resolved 134a42bec4dSAnna Dabrowska * @param string $recipient 135a42bec4dSAnna Dabrowska * @return void 136a42bec4dSAnna Dabrowska */ 137a42bec4dSAnna Dabrowska protected function resolveUser(&$resolved, $recipient) 138a42bec4dSAnna Dabrowska { 139a42bec4dSAnna Dabrowska /** @var AuthPlugin $auth */ 140a42bec4dSAnna Dabrowska global $auth; 141a42bec4dSAnna Dabrowska $user = $auth->getUserData($recipient); 14231e730e1SAnna Dabrowska if ($user) { 14331e730e1SAnna Dabrowska $resolved[] = $user['mail']; 14431e730e1SAnna Dabrowska } 145a42bec4dSAnna Dabrowska } 146a42bec4dSAnna Dabrowska 147a42bec4dSAnna Dabrowska /** 148a42bec4dSAnna Dabrowska * Check configuration to see if a notification should be triggered. 149a42bec4dSAnna Dabrowska * 150a42bec4dSAnna Dabrowska * @return bool 151a42bec4dSAnna Dabrowska */ 152a42bec4dSAnna Dabrowska private function triggerNotification($action) 153a42bec4dSAnna Dabrowska { 15431e730e1SAnna Dabrowska if (!$this->getConf('email_enable')) { 15531e730e1SAnna Dabrowska return false; 15631e730e1SAnna Dabrowska } 157a42bec4dSAnna Dabrowska 158a42bec4dSAnna Dabrowska $actions = array_map('trim', explode(',', $this->getConf('email_status'))); 159a42bec4dSAnna Dabrowska return in_array($action, $actions); 160a42bec4dSAnna Dabrowska } 161a42bec4dSAnna Dabrowska 162a42bec4dSAnna Dabrowska /** 163a42bec4dSAnna Dabrowska * @return string 164a42bec4dSAnna Dabrowska */ 165a42bec4dSAnna Dabrowska protected function prepareMailText($status) 166a42bec4dSAnna Dabrowska { 167a42bec4dSAnna Dabrowska global $ID; 168a42bec4dSAnna Dabrowska 169a42bec4dSAnna Dabrowska $mailtext = file_get_contents($this->localFN('mail')); 170a42bec4dSAnna Dabrowska 171a42bec4dSAnna Dabrowska $vars = [ 172a42bec4dSAnna Dabrowska 'PAGE' => $ID, 173a42bec4dSAnna Dabrowska 'URL' => wl($ID, '', true), 174a42bec4dSAnna Dabrowska 'STATUS_CURRENT' => $status, 175a42bec4dSAnna Dabrowska ]; 176a42bec4dSAnna Dabrowska 177a42bec4dSAnna Dabrowska foreach ($vars as $var => $val) { 178a42bec4dSAnna Dabrowska $mailtext = str_replace('@' . $var . '@', $val, $mailtext); 179a42bec4dSAnna Dabrowska } 180a42bec4dSAnna Dabrowska 181a42bec4dSAnna Dabrowska return $mailtext; 182a42bec4dSAnna Dabrowska } 183a42bec4dSAnna Dabrowska} 184