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