1698cf656SMichael Große<?php 2698cf656SMichael Große/** 3698cf656SMichael Große * @license GNU General Public License, version 2 4698cf656SMichael Große */ 5698cf656SMichael Große 6698cf656SMichael Große 7698cf656SMichael Großeif (!defined('DOKU_INC')) die(); 8698cf656SMichael Große 9698cf656SMichael Große 10698cf656SMichael Große/** 11698cf656SMichael Große * Class action_plugin_publish_mail 12698cf656SMichael Große * 13698cf656SMichael Große * @author Michael Große <grosse@cosmocode.de> 14698cf656SMichael Große */ 15698cf656SMichael Großeclass action_plugin_publish_mail extends DokuWiki_Action_Plugin { 16698cf656SMichael Große 17a9071e04SMichael Große /** 18a9071e04SMichael Große * @var helper_plugin_publish 19a9071e04SMichael Große */ 20a9071e04SMichael Große private $hlp; 21a9071e04SMichael Große 22a9071e04SMichael Große function __construct() { 23a9071e04SMichael Große $this->hlp = plugin_load('helper','publish'); 24a9071e04SMichael Große } 25a9071e04SMichael Große 26698cf656SMichael Große public function register(Doku_Event_Handler $controller) { 27698cf656SMichael Große 28698cf656SMichael Große $controller->register_hook('IO_WIKIPAGE_WRITE', 'AFTER', $this, 'send_change_mail', array()); 29698cf656SMichael Große } 30698cf656SMichael Große 314f5c41dbSMichael Große /** 324f5c41dbSMichael Große * send an email to inform about a changed page 334f5c41dbSMichael Große * 344f5c41dbSMichael Große * @param $event 354f5c41dbSMichael Große * @param $param 36d5f6523fSMichael Große * @return bool false if the receiver is invalid or there was an error passing the mail to the MTA 374f5c41dbSMichael Große */ 38698cf656SMichael Große function send_change_mail(&$event, $param) { 39698cf656SMichael Große global $ID; 40698cf656SMichael Große global $ACT; 41698cf656SMichael Große global $INFO; 420d6459beSMichael Große global $conf; 43698cf656SMichael Große 44698cf656SMichael Große if ($ACT != 'save') { 45698cf656SMichael Große return true; 46698cf656SMichael Große } 478bc37331SMichael Große 488bc37331SMichael Große // IO_WIKIPAGE_WRITE is always called twice when saving a page. This makes sure to only send the mail once. 49698cf656SMichael Große if (!$event->data[3]) { 50698cf656SMichael Große return true; 51698cf656SMichael Große } 52698cf656SMichael Große 538bc37331SMichael Große // Does the publish plugin apply to this page? 548bc37331SMichael Große if (!$this->hlp->isActive($ID)) { 558bc37331SMichael Große return true; 568bc37331SMichael Große } 578bc37331SMichael Große 588bc37331SMichael Große //are we supposed to send change-mails at all? 59d5f6523fSMichael Große if ($this->getConf('apr_mail_receiver') === '') { 608bc37331SMichael Große return true; 618bc37331SMichael Große } 628bc37331SMichael Große 63698cf656SMichael Große // get mail receiver 64698cf656SMichael Große $receiver = $this->getConf('apr_mail_receiver'); 65d5f6523fSMichael Große $validator = new EmailAddressValidator(); 66d5f6523fSMichael Große $validator->allowLocalAddresses = true; 67d5f6523fSMichael Große if(!$validator->check_email_address($receiver)) { 68d5f6523fSMichael Große dbglog(sprintf($this->getLang('mail_invalid'),htmlspecialchars($receiver))); 69d5f6523fSMichael Große return false; 70d5f6523fSMichael Große } 71698cf656SMichael Große 72698cf656SMichael Große // get mail sender 73*faf1789aSMichael Große $ReplyTo = $INFO['userinfo']['mail']; 74698cf656SMichael Große 752583d55dSMichael Große if ($ReplyTo == $receiver) { 769e614880SMichael Große return true; 77698cf656SMichael Große } 78698cf656SMichael Große 79698cf656SMichael Große if ($INFO['isadmin'] == '1') { 809e614880SMichael Große return true; 81698cf656SMichael Große } 82698cf656SMichael Große 83698cf656SMichael Große // get mail subject 84*faf1789aSMichael Große $timestamp = dformat(filemtime(wikiFN($ID)), $conf['dformat']); 850d6459beSMichael Große $subject = $this->getLang('apr_mail_subject') . ': ' . $ID . ' - ' . $timestamp; 86698cf656SMichael Große 87e6206222SMichael Große $body = $this->create_mail_body('change'); 88698cf656SMichael Große 892583d55dSMichael Große $mail = new Mailer(); 902583d55dSMichael Große $mail->to($receiver); 912583d55dSMichael Große $mail->subject($subject); 922583d55dSMichael Große $mail->setBody($body); 932583d55dSMichael Große $mail->setHeader("Reply-To", $ReplyTo); 942583d55dSMichael Große $returnStatus = $mail->send(); 9512699d35SMichael Große return $returnStatus; 96698cf656SMichael Große } 97698cf656SMichael Große 98e6206222SMichael Große /** 99e6206222SMichael Große * Create the body of mails to inform about a changed or an approved page 100e6206222SMichael Große * 101e6206222SMichael Große * @param string $action Must either be "change" or "approve" 102e6206222SMichael Große * @return bool|string 103eb718fbbSMichael Große * 104e6206222SMichael Große */ 105e6206222SMichael Große public function create_mail_body($action) { 106e6206222SMichael Große global $ID; 1078ff23e7fSMichael Große global $conf; 108*faf1789aSMichael Große global $INFO; 109bc4555caSMichael Große 1108ff23e7fSMichael Große // get mail text 111*faf1789aSMichael Große $rev = filemtime(wikiFN($ID)); 1128ff23e7fSMichael Große 113bc4555caSMichael Große if ($action === 'change') { 114c447490bSMichael Große $body = io_readFile($this->localFN('mailchangetext')); 115bc4555caSMichael Große 1168ff23e7fSMichael Große //If there is no approved revision show the diff to the revision before. Otherwise show the diff to the last approved revision. 117*faf1789aSMichael Große if($this->hlp->hasApprovals($INFO['meta'])) { 118c447490bSMichael Große $aprpre = 'Aproved'; 119c447490bSMichael Große $oldrev = $this->hlp->getLatestApprovedRevision($ID); 120c447490bSMichael Große $difflink = $this->hlp->getDifflink($ID, $oldrev, $rev); 1218ff23e7fSMichael Große } else { 122c447490bSMichael Große $aprpre = 'Previous'; 123e6206222SMichael Große $changelog = new PageChangelog($ID); 124c447490bSMichael Große $oldrev = $changelog->getRelativeRevision($rev, -1); 125c447490bSMichael Große $difflink = $this->hlp->getDifflink($ID, $oldrev, $rev); 1268ff23e7fSMichael Große } 127c447490bSMichael Große 128c447490bSMichael Große $body = str_replace('@DIFF@', $difflink, $body); 129c447490bSMichael Große $body = str_replace('@APRPRE@', $aprpre, $body); 130*faf1789aSMichael Große $summary = $INFO['meta']['last_change']['sum']; 131c447490bSMichael Große $body = str_replace('@SUMMARY@', $summary, $body); 132c447490bSMichael Große if ($oldrev === false ) { 133c447490bSMichael Große $oldlink = '---'; 134c447490bSMichael Große } else { 135c447490bSMichael Große $oldlink = $this->revlink($ID, $oldrev); 136c447490bSMichael Große } 137c447490bSMichael Große $body = str_replace('@OLDPAGE@', $oldlink, $body); 138c447490bSMichael Große $newlink = $this->revlink($ID, $rev); 139c447490bSMichael Große $body = str_replace('@NEWPAGE@', $newlink, $body); 140bc4555caSMichael Große } elseif ($action === 'approve') { 141c447490bSMichael Große $body = io_readFile($this->localFN('mailapprovetext')); 142c447490bSMichael Große $newlink = $this->revlink($ID, $rev); 143c447490bSMichael Große $body = str_replace('@URL@', $newlink, $body); 144eb718fbbSMichael Große 145eb718fbbSMichael Große $changelog = new PageChangelog($ID); 146eb718fbbSMichael Große $revinfo = $changelog->getRevisionInfo($rev); 147eb718fbbSMichael Große /** @var DokuWiki_Auth_Plugin $auth */ 148eb718fbbSMichael Große global $auth; 149eb718fbbSMichael Große $userinfo = $auth->getUserData($revinfo['user']); 150eb718fbbSMichael Große $body = str_replace('@FULLNAME@', $userinfo['name'], $body); 151bc4555caSMichael Große } else { 152bc4555caSMichael Große return false; 153bc4555caSMichael Große } 154bc4555caSMichael Große 1558ff23e7fSMichael Große $body = str_replace('@DOKUWIKIURL@', DOKU_URL, $body); 1568ff23e7fSMichael Große $body = str_replace('@TITLE@', $conf['title'], $body); 1578ff23e7fSMichael Große 1588ff23e7fSMichael Große return $body; 1598ff23e7fSMichael Große } 1608ff23e7fSMichael Große 1618ff23e7fSMichael Große 1629e614880SMichael Große 1639e614880SMichael Große /** 1649e614880SMichael Große * Send approve-mail to editor of the now approved revision 1659e614880SMichael Große * 1662583d55dSMichael Große * @return bool false if there was an error passing the mail to the MTA 1679e614880SMichael Große */ 16819a54b91SMichael Große public function send_approve_mail() { 16919a54b91SMichael Große global $ID; 17019a54b91SMichael Große global $REV; 1718cd8852aSMichael Große 1728cd8852aSMichael Große /** @var DokuWiki_Auth_Plugin $auth */ 1738cd8852aSMichael Große global $auth; 174698cf656SMichael Große $data = pageinfo(); 17519a54b91SMichael Große 17619a54b91SMichael Große // get mail receiver 1773c21cb49SMichael Große if (!$REV) { 1783c21cb49SMichael Große $rev = $data['lastmod']; 1793c21cb49SMichael Große } else { 1803c21cb49SMichael Große $rev=$REV; 1813c21cb49SMichael Große } 1828cd8852aSMichael Große $changelog = new PageChangelog($ID); 1833c21cb49SMichael Große $revinfo = $changelog->getRevisionInfo($rev); 1848cd8852aSMichael Große $userinfo = $auth->getUserData($revinfo['user']); 1858cd8852aSMichael Große $receiver = $userinfo['mail']; 186bc4555caSMichael Große 18719a54b91SMichael Große // get mail sender 1882583d55dSMichael Große $ReplyTo = $data['userinfo']['mail']; 1892583d55dSMichael Große 1902583d55dSMichael Große if ($ReplyTo == $receiver) { 1912583d55dSMichael Große return true; 1922583d55dSMichael Große } 193bc4555caSMichael Große 19419a54b91SMichael Große // get mail subject 19519a54b91SMichael Große $subject = $this->getLang('apr_mail_app_subject'); 196698cf656SMichael Große 197bc4555caSMichael Große // get mail text 198e6206222SMichael Große $body = $this->create_mail_body('approve'); 19919a54b91SMichael Große 2002583d55dSMichael Große $mail = new Mailer(); 2012583d55dSMichael Große $mail->to($receiver); 2022583d55dSMichael Große $mail->subject($subject); 2032583d55dSMichael Große $mail->setBody($body); 2042583d55dSMichael Große $mail->setHeader("Reply-To", $ReplyTo); 2052583d55dSMichael Große $returnStatus = $mail->send(); 2063c21cb49SMichael Große 2072583d55dSMichael Große return $returnStatus; 208698cf656SMichael Große } 209698cf656SMichael Große 210698cf656SMichael Große /** 211f31c6595SMichael Große * create link to the specified revision 212698cf656SMichael Große * 213f31c6595SMichael Große * @param string $id 214f31c6595SMichael Große * @param string $rev The timestamp of the revision 215846d3071SMichael Große * @return string 216698cf656SMichael Große */ 217f31c6595SMichael Große function revlink($id, $rev) { 218698cf656SMichael Große 219698cf656SMichael Große $options = array( 220698cf656SMichael Große 'rev'=> $rev, 221698cf656SMichael Große ); 222f31c6595SMichael Große $revlink = wl($id, $options, true, '&'); 223698cf656SMichael Große 224f31c6595SMichael Große return $revlink; 225698cf656SMichael Große } 226698cf656SMichael Große 227698cf656SMichael Große} 228