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