xref: /plugin/approve/action/approve.php (revision 1989ee26e4c10d9fe322c2a0aa4ae990f031b47b)
11aeb2b4dSghi<?php
21aeb2b4dSghi
3*1989ee26SSzymon Olewniczakuse dokuwiki\Extension\ActionPlugin;
4*1989ee26SSzymon Olewniczakuse dokuwiki\Extension\EventHandler;
5*1989ee26SSzymon Olewniczakuse dokuwiki\Extension\Event;
61aeb2b4dSghi
7*1989ee26SSzymon Olewniczakclass action_plugin_approve_approve extends ActionPlugin {
81b552e87SSzymon Olewniczak    /**
9*1989ee26SSzymon Olewniczak     * @inheritDoc
104474ed8aSSzymon Olewniczak     */
11*1989ee26SSzymon Olewniczak    public function register(EventHandler $controller) {
124474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept');
134474ed8aSSzymon Olewniczak        $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev');
144474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve');
1507b13373SSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_mark_ready_for_approval');
164474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer');
174474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner');
1855f447f4SSzymon Olewniczak        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after');
191aeb2b4dSghi    }
201aeb2b4dSghi
214474ed8aSSzymon Olewniczak    /**
22*1989ee26SSzymon Olewniczak     * @param Event $event
234474ed8aSSzymon Olewniczak     */
24*1989ee26SSzymon Olewniczak    public function handle_diff_accept(Event $event) {
254474ed8aSSzymon Olewniczak        global $INFO;
264474ed8aSSzymon Olewniczak
27*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
28*1989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
290c60a293SSzymon Olewniczak
30*1989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
3150481663SSzymon Olewniczak
321aeb2b4dSghi        if ($event->data == 'diff' && isset($_GET['approve'])) {
334474ed8aSSzymon Olewniczak            $href = wl($INFO['id'], ['approve' => 'approve']);
344474ed8aSSzymon Olewniczak            ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>');
351aeb2b4dSghi        }
3684047bdaSRuud
374474ed8aSSzymon Olewniczak        if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) {
384474ed8aSSzymon Olewniczak            $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']);
39058bad72SSzymon Olewniczak            ptln('<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>');
4084047bdaSRuud        }
411aeb2b4dSghi    }
421aeb2b4dSghi
434474ed8aSSzymon Olewniczak    /**
44*1989ee26SSzymon Olewniczak     * @param Event $event
454474ed8aSSzymon Olewniczak     */
46*1989ee26SSzymon Olewniczak    public function handle_showrev(Event $event) {
474474ed8aSSzymon Olewniczak        global $INFO;
481aeb2b4dSghi
49*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
50*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
51*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
52*1989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
534474ed8aSSzymon Olewniczak
54*1989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
550c60a293SSzymon Olewniczak
56*1989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
574474ed8aSSzymon Olewniczak        if ($last_approved_rev == $INFO['rev']) {
581aeb2b4dSghi            $event->preventDefault();
591aeb2b4dSghi        }
601aeb2b4dSghi    }
611aeb2b4dSghi
624474ed8aSSzymon Olewniczak    /**
63*1989ee26SSzymon Olewniczak     * @param Event $event
644474ed8aSSzymon Olewniczak     */
65*1989ee26SSzymon Olewniczak    public function handle_approve(Event $event) {
664474ed8aSSzymon Olewniczak        global $INFO;
674474ed8aSSzymon Olewniczak
68*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
69*1989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
700c60a293SSzymon Olewniczak
7107b13373SSzymon Olewniczak        if ($event->data != 'show') return;
7207b13373SSzymon Olewniczak        if (!isset($_GET['approve'])) return;
73*1989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
74*1989ee26SSzymon Olewniczak        if (!$acl->clientCanApprove($INFO['id'])) return;
754474ed8aSSzymon Olewniczak
76*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
77*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
78*1989ee26SSzymon Olewniczak        $db->setApprovedStatus($INFO['id']);
7984047bdaSRuud
804474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
8107b13373SSzymon Olewniczak    }
8207b13373SSzymon Olewniczak
8307b13373SSzymon Olewniczak    /**
84*1989ee26SSzymon Olewniczak     * @param Event $event
8507b13373SSzymon Olewniczak     */
86*1989ee26SSzymon Olewniczak    public function handle_mark_ready_for_approval(Event $event) {
8707b13373SSzymon Olewniczak        global $INFO;
8807b13373SSzymon Olewniczak
89*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
90*1989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
910c60a293SSzymon Olewniczak
9207b13373SSzymon Olewniczak        if ($event->data != 'show') return;
9307b13373SSzymon Olewniczak        if (!isset($_GET['ready_for_approval'])) return;
94*1989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
95*1989ee26SSzymon Olewniczak        if (!$acl->clientCanMarkReadyForApproval($INFO['id'])) return;
9650481663SSzymon Olewniczak
97*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
98*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
99*1989ee26SSzymon Olewniczak        $db->setReadyForApprovalStatus($INFO['id']);
10050481663SSzymon Olewniczak
1014474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
1021aeb2b4dSghi    }
10355f447f4SSzymon Olewniczak
1044474ed8aSSzymon Olewniczak    /**
105*1989ee26SSzymon Olewniczak     * Redirect to latest approved page for user that don't have EDIT permission.
1064474ed8aSSzymon Olewniczak     *
107*1989ee26SSzymon Olewniczak     * @param Event $event
1084474ed8aSSzymon Olewniczak     */
109*1989ee26SSzymon Olewniczak    public function handle_viewer(Event $event) {
1104474ed8aSSzymon Olewniczak        global $INFO;
1114474ed8aSSzymon Olewniczak
112*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
113*1989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
1140c60a293SSzymon Olewniczak
11538d03fbdSghi        if ($event->data != 'show') return;
1164474ed8aSSzymon Olewniczak        //apply only to current page
117c7d53eabSSzymon Olewniczak        if ($INFO['rev'] != 0) return;
118*1989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
119*1989ee26SSzymon Olewniczak        if ($acl->clientCanSeeDrafts($INFO['id'])) return;
1201aeb2b4dSghi
121*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
122*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
123*1989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
124*1989ee26SSzymon Olewniczak
12538d03fbdSghi        //no page is approved
1264474ed8aSSzymon Olewniczak        if (!$last_approved_rev) return;
12738d03fbdSghi
1284474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1294474ed8aSSzymon Olewniczak        // current page is approved
1304474ed8aSSzymon Olewniczak        if ($last_approved_rev == $last_change_date) return;
1314474ed8aSSzymon Olewniczak
132de24d3c4SSzymon Olewniczak        header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev], false, '&'));
1331aeb2b4dSghi    }
13455f447f4SSzymon Olewniczak
1354474ed8aSSzymon Olewniczak    /**
136*1989ee26SSzymon Olewniczak     * @param Event $event
1374474ed8aSSzymon Olewniczak     */
138*1989ee26SSzymon Olewniczak    public function handle_display_banner(Event $event) {
139*1989ee26SSzymon Olewniczak        global $INFO;
140bab76148SSzymon Olewniczak
141*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
142*1989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
143*1989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
144329c5e3aSMartin Diedrich
1454474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1464474ed8aSSzymon Olewniczak        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
1471aeb2b4dSghi
14855f447f4SSzymon Olewniczak
149*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
150*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
1514474ed8aSSzymon Olewniczak
152*1989ee26SSzymon Olewniczak        $page_revision = $db->getPageRevision($INFO['id'], $rev);
153*1989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
1544474ed8aSSzymon Olewniczak
1554474ed8aSSzymon Olewniczak        $classes = [];
156*1989ee26SSzymon Olewniczak        if ($page_revision['status'] == 'approved' && $rev == $last_approved_rev) {
15715e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_approved';
158*1989ee26SSzymon Olewniczak        } elseif ($page_revision['status'] == 'approved') {
15915e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_old_approved';
160*1989ee26SSzymon Olewniczak        } elseif ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
161bab76148SSzymon Olewniczak            $classes[] = 'plugin__approve_ready';
16255f447f4SSzymon Olewniczak        } else {
16315e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_draft';
16455f447f4SSzymon Olewniczak        }
16555f447f4SSzymon Olewniczak
16655f447f4SSzymon Olewniczak        ptln('<div id="plugin__approve" class="' . implode(' ', $classes) . '">');
1671aeb2b4dSghi
168af3e3cd8SSzymon Olewniczak
169*1989ee26SSzymon Olewniczak        if ($page_revision['status'] == 'approved') {
170c7d53eabSSzymon Olewniczak            ptln('<strong>'.$this->getLang('approved').'</strong>');
171*1989ee26SSzymon Olewniczak            ptln(' ' . dformat(strtotime($page_revision['approved'])));
172329c5e3aSMartin Diedrich
173329c5e3aSMartin Diedrich            if($this->getConf('banner_long')) {
174*1989ee26SSzymon Olewniczak                ptln(' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true));
175*1989ee26SSzymon Olewniczak                ptln(' (' . $this->getLang('version') .  ': ' . $page_revision['version'] . ')');
176329c5e3aSMartin Diedrich            }
1774474ed8aSSzymon Olewniczak
1784474ed8aSSzymon Olewniczak            //not the newest page
1794474ed8aSSzymon Olewniczak            if ($rev != $last_change_date) {
1804474ed8aSSzymon Olewniczak                // we can see drafts
181*1989ee26SSzymon Olewniczak                if ($acl->clientCanSeeDrafts($INFO['id'])) {
1824474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id']) . '">');
183*1989ee26SSzymon Olewniczak                    ptln($this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft'));
1841aeb2b4dSghi                    ptln('</a>');
185c7d53eabSSzymon Olewniczak                    // we cannot see link to draft but there is some newer approved version
186*1989ee26SSzymon Olewniczak                } elseif ($last_approved_rev != $rev) {
1874474ed8aSSzymon Olewniczak                    $urlParameters = [];
188*1989ee26SSzymon Olewniczak                    if ($last_approved_rev != $last_change_date) {
189*1989ee26SSzymon Olewniczak                        $urlParameters['rev'] = $last_approved_rev;
1904474ed8aSSzymon Olewniczak                    }
1914474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
1921aeb2b4dSghi                    ptln($this->getLang('newest_approved'));
1931aeb2b4dSghi                    ptln('</a>');
1941aeb2b4dSghi                }
1954474ed8aSSzymon Olewniczak            }
1964474ed8aSSzymon Olewniczak
1971aeb2b4dSghi        } else {
198*1989ee26SSzymon Olewniczak            if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
199c7d53eabSSzymon Olewniczak                ptln('<strong>'.$this->getLang('marked_approve_ready').'</strong>');
200*1989ee26SSzymon Olewniczak                ptln(' ' . dformat(strtotime($page_revision['ready_for_approval'])));
201*1989ee26SSzymon Olewniczak                ptln(' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true));
202c7d53eabSSzymon Olewniczak            } else {
203c7d53eabSSzymon Olewniczak                ptln('<strong>'.$this->getLang('draft').'</strong>');
20484047bdaSRuud            }
20584047bdaSRuud
2064474ed8aSSzymon Olewniczak            // not exists approve for current page
207*1989ee26SSzymon Olewniczak            if ($last_approved_rev == null) {
2084474ed8aSSzymon Olewniczak                // not the newest page
2094474ed8aSSzymon Olewniczak                if ($rev != $last_change_date) {
2104474ed8aSSzymon Olewniczak                    ptln('<a href="'.wl($INFO['id']).'">');
211274d699aSghi                    ptln($this->getLang('newest_draft'));
212274d699aSghi                    ptln('</a>');
213274d699aSghi                }
214274d699aSghi            } else {
2154474ed8aSSzymon Olewniczak                $urlParameters = [];
216*1989ee26SSzymon Olewniczak                if ($last_approved_rev != $last_change_date) {
217*1989ee26SSzymon Olewniczak                    $urlParameters['rev'] = $last_approved_rev;
2184474ed8aSSzymon Olewniczak                }
2194474ed8aSSzymon Olewniczak                ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
2201aeb2b4dSghi                ptln($this->getLang('newest_approved'));
2211aeb2b4dSghi                ptln('</a>');
2221aeb2b4dSghi            }
2231aeb2b4dSghi
2244474ed8aSSzymon Olewniczak            //we are in current page
2254474ed8aSSzymon Olewniczak            if ($rev == $last_change_date) {
2264474ed8aSSzymon Olewniczak                if ($this->getConf('ready_for_approval') &&
227*1989ee26SSzymon Olewniczak                    $acl->clientCanMarkReadyForApproval($INFO['id']) &&
228*1989ee26SSzymon Olewniczak                    $page_revision['status'] != 'ready_for_approval') {
2294474ed8aSSzymon Olewniczak
2304474ed8aSSzymon Olewniczak                    $urlParameters = [
2314474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2324474ed8aSSzymon Olewniczak                        'do' => 'diff',
2334474ed8aSSzymon Olewniczak                        'ready_for_approval' => 'ready_for_approval'
2344474ed8aSSzymon Olewniczak                    ];
2354474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
23684047bdaSRuud                    ptln($this->getLang('approve_ready'));
23784047bdaSRuud                    ptln('</a>');
23884047bdaSRuud                }
23984047bdaSRuud
240*1989ee26SSzymon Olewniczak                if ($acl->clientCanApprove($INFO['id'])) {
2414474ed8aSSzymon Olewniczak                    $urlParameters = [
2424474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2434474ed8aSSzymon Olewniczak                        'do' => 'diff',
2444474ed8aSSzymon Olewniczak                        'approve' => 'approve'
2454474ed8aSSzymon Olewniczak                    ];
2464474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
2471aeb2b4dSghi                    ptln($this->getLang('approve'));
2481aeb2b4dSghi                    ptln('</a>');
2491aeb2b4dSghi                }
250c7d53eabSSzymon Olewniczak            }
251c7d53eabSSzymon Olewniczak        }
25284047bdaSRuud
253*1989ee26SSzymon Olewniczak        if (isset($page_metadata['approver']) & $this->getConf('banner_long')) {
254*1989ee26SSzymon Olewniczak            ptln(' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true));
2554474ed8aSSzymon Olewniczak        }
256c7d53eabSSzymon Olewniczak
2571aeb2b4dSghi        ptln('</div>');
2581aeb2b4dSghi    }
2591aeb2b4dSghi
260af3e3cd8SSzymon Olewniczak    /**
2614474ed8aSSzymon Olewniczak     *
262*1989ee26SSzymon Olewniczak     * @param Event $event
2634474ed8aSSzymon Olewniczak     */
264*1989ee26SSzymon Olewniczak    public function handle_pagesave_after(Event $event) {
2651b552e87SSzymon Olewniczak        //no content was changed
2664474ed8aSSzymon Olewniczak        if (!$event->data['contentChanged']) return;
2674474ed8aSSzymon Olewniczak
268*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
269*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
2704474ed8aSSzymon Olewniczak
2714474ed8aSSzymon Olewniczak        $id = $event->data['id'];
272*1989ee26SSzymon Olewniczak        switch ($event->data['changeType']) {
273*1989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_CREATE:
2744474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_EDIT:
2754474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_MINOR_EDIT:
276*1989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_REVERT:
277*1989ee26SSzymon Olewniczak                $db->handlePageEdit($id);
2784474ed8aSSzymon Olewniczak                break;
2794474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_DELETE:
280*1989ee26SSzymon Olewniczak                $db->handlePageDelete($id);
2814474ed8aSSzymon Olewniczak                break;
2824474ed8aSSzymon Olewniczak        }
2834474ed8aSSzymon Olewniczak    }
2841aeb2b4dSghi}
285