xref: /plugin/publish/action/mail.php (revision faf1789a914d96482bda178903654f0ced781b1e)
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