xref: /plugin/structpublish/helper/notify.php (revision 31e730e145521fb7010758415a11c928f44439b8) !
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
32*31e730e1SAnna Dabrowska        if (!$this->triggerNotification($action)) {
33*31e730e1SAnna Dabrowska            return;
34*31e730e1SAnna 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'];
42*31e730e1SAnna Dabrowska        if (is_null($nextAction)) {
43*31e730e1SAnna Dabrowska            return;
44*31e730e1SAnna 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
124a42bec4dSAnna Dabrowska        $users = $auth->retrieveUsers(0, 0, ['grps' => substr($recipient, 1)]);
125a42bec4dSAnna Dabrowska        foreach ($users as $user) {
126a42bec4dSAnna Dabrowska            $resolved[] = $user['mail'];
127a42bec4dSAnna Dabrowska        }
128a42bec4dSAnna Dabrowska    }
129a42bec4dSAnna Dabrowska
130a42bec4dSAnna Dabrowska    /**
131a42bec4dSAnna Dabrowska     * @param array $resolved
132a42bec4dSAnna Dabrowska     * @param string $recipient
133a42bec4dSAnna Dabrowska     * @return void
134a42bec4dSAnna Dabrowska     */
135a42bec4dSAnna Dabrowska    protected function resolveUser(&$resolved, $recipient)
136a42bec4dSAnna Dabrowska    {
137a42bec4dSAnna Dabrowska        /** @var AuthPlugin $auth */
138a42bec4dSAnna Dabrowska        global $auth;
139a42bec4dSAnna Dabrowska        $user = $auth->getUserData($recipient);
140*31e730e1SAnna Dabrowska        if ($user) {
141*31e730e1SAnna Dabrowska            $resolved[] = $user['mail'];
142*31e730e1SAnna Dabrowska        }
143a42bec4dSAnna Dabrowska    }
144a42bec4dSAnna Dabrowska
145a42bec4dSAnna Dabrowska    /**
146a42bec4dSAnna Dabrowska     * Check configuration to see if a notification should be triggered.
147a42bec4dSAnna Dabrowska     *
148a42bec4dSAnna Dabrowska     * @return bool
149a42bec4dSAnna Dabrowska     */
150a42bec4dSAnna Dabrowska    private function triggerNotification($action)
151a42bec4dSAnna Dabrowska    {
152*31e730e1SAnna Dabrowska        if (!$this->getConf('email_enable')) {
153*31e730e1SAnna Dabrowska            return false;
154*31e730e1SAnna Dabrowska        }
155a42bec4dSAnna Dabrowska
156a42bec4dSAnna Dabrowska        $actions = array_map('trim', explode(',', $this->getConf('email_status')));
157a42bec4dSAnna Dabrowska        return in_array($action, $actions);
158a42bec4dSAnna Dabrowska    }
159a42bec4dSAnna Dabrowska
160a42bec4dSAnna Dabrowska    /**
161a42bec4dSAnna Dabrowska     * @return string
162a42bec4dSAnna Dabrowska     */
163a42bec4dSAnna Dabrowska    protected function prepareMailText($status)
164a42bec4dSAnna Dabrowska    {
165a42bec4dSAnna Dabrowska        global $ID;
166a42bec4dSAnna Dabrowska
167a42bec4dSAnna Dabrowska        $mailtext = file_get_contents($this->localFN('mail'));
168a42bec4dSAnna Dabrowska
169a42bec4dSAnna Dabrowska        $vars = [
170a42bec4dSAnna Dabrowska            'PAGE' => $ID,
171a42bec4dSAnna Dabrowska            'URL' => wl($ID, '', true),
172a42bec4dSAnna Dabrowska            'STATUS_CURRENT' => $status,
173a42bec4dSAnna Dabrowska        ];
174a42bec4dSAnna Dabrowska
175a42bec4dSAnna Dabrowska        foreach ($vars as $var => $val) {
176a42bec4dSAnna Dabrowska            $mailtext = str_replace('@' . $var . '@', $val, $mailtext);
177a42bec4dSAnna Dabrowska        }
178a42bec4dSAnna Dabrowska
179a42bec4dSAnna Dabrowska        return $mailtext;
180a42bec4dSAnna Dabrowska    }
181a42bec4dSAnna Dabrowska}
182