xref: /plugin/structpublish/helper/notify.php (revision a42bec4d89385b31db812c8b46b99cce7509efed) !
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