xref: /plugin/approve/action/approve.php (revision 3c40d78b32f4ff5a3e229d58909dd2ad72cb88be)
11aeb2b4dSghi<?php
21aeb2b4dSghi
31989ee26SSzymon Olewniczakuse dokuwiki\Extension\ActionPlugin;
41989ee26SSzymon Olewniczakuse dokuwiki\Extension\EventHandler;
51989ee26SSzymon Olewniczakuse dokuwiki\Extension\Event;
61aeb2b4dSghi
71989ee26SSzymon Olewniczakclass action_plugin_approve_approve extends ActionPlugin {
81b552e87SSzymon Olewniczak    /**
91989ee26SSzymon Olewniczak     * @inheritDoc
104474ed8aSSzymon Olewniczak     */
111989ee26SSzymon 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    /**
221989ee26SSzymon Olewniczak     * @param Event $event
234474ed8aSSzymon Olewniczak     */
241989ee26SSzymon Olewniczak    public function handle_diff_accept(Event $event) {
254474ed8aSSzymon Olewniczak        global $INFO;
264474ed8aSSzymon Olewniczak
271989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
281989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
290c60a293SSzymon Olewniczak
301989ee26SSzymon 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']);
34b59355cdSSzymon Olewniczak            echo '<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']);
39b59355cdSSzymon Olewniczak            echo '<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>';
4084047bdaSRuud        }
411aeb2b4dSghi    }
421aeb2b4dSghi
434474ed8aSSzymon Olewniczak    /**
441989ee26SSzymon Olewniczak     * @param Event $event
454474ed8aSSzymon Olewniczak     */
461989ee26SSzymon Olewniczak    public function handle_showrev(Event $event) {
474474ed8aSSzymon Olewniczak        global $INFO;
481aeb2b4dSghi
49b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
50b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
511989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
521989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
534474ed8aSSzymon Olewniczak
541989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
550c60a293SSzymon Olewniczak
561989ee26SSzymon 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    /**
631989ee26SSzymon Olewniczak     * @param Event $event
644474ed8aSSzymon Olewniczak     */
651989ee26SSzymon Olewniczak    public function handle_approve(Event $event) {
664474ed8aSSzymon Olewniczak        global $INFO;
674474ed8aSSzymon Olewniczak
681989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
691989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
700c60a293SSzymon Olewniczak
7107b13373SSzymon Olewniczak        if ($event->data != 'show') return;
7207b13373SSzymon Olewniczak        if (!isset($_GET['approve'])) return;
731989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
741989ee26SSzymon Olewniczak        if (!$acl->clientCanApprove($INFO['id'])) return;
754474ed8aSSzymon Olewniczak
76b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
77b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
781989ee26SSzymon Olewniczak        $db->setApprovedStatus($INFO['id']);
7984047bdaSRuud
804474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
8107b13373SSzymon Olewniczak    }
8207b13373SSzymon Olewniczak
8307b13373SSzymon Olewniczak    /**
841989ee26SSzymon Olewniczak     * @param Event $event
8507b13373SSzymon Olewniczak     */
861989ee26SSzymon Olewniczak    public function handle_mark_ready_for_approval(Event $event) {
8707b13373SSzymon Olewniczak        global $INFO;
8807b13373SSzymon Olewniczak
891989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
901989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
910c60a293SSzymon Olewniczak
9207b13373SSzymon Olewniczak        if ($event->data != 'show') return;
9307b13373SSzymon Olewniczak        if (!isset($_GET['ready_for_approval'])) return;
941989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
951989ee26SSzymon Olewniczak        if (!$acl->clientCanMarkReadyForApproval($INFO['id'])) return;
9650481663SSzymon Olewniczak
97b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
98b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
991989ee26SSzymon Olewniczak        $db->setReadyForApprovalStatus($INFO['id']);
10050481663SSzymon Olewniczak
1014474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
1021aeb2b4dSghi    }
10355f447f4SSzymon Olewniczak
1044474ed8aSSzymon Olewniczak    /**
1051989ee26SSzymon Olewniczak     * Redirect to latest approved page for user that don't have EDIT permission.
1064474ed8aSSzymon Olewniczak     *
1071989ee26SSzymon Olewniczak     * @param Event $event
1084474ed8aSSzymon Olewniczak     */
1091989ee26SSzymon Olewniczak    public function handle_viewer(Event $event) {
1104474ed8aSSzymon Olewniczak        global $INFO;
1114474ed8aSSzymon Olewniczak
1121989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
1131989ee26SSzymon 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;
1181989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
1191989ee26SSzymon Olewniczak        if ($acl->clientCanSeeDrafts($INFO['id'])) return;
1201aeb2b4dSghi
121b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
122b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
1231989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
1241989ee26SSzymon 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    /**
1361989ee26SSzymon Olewniczak     * @param Event $event
1374474ed8aSSzymon Olewniczak     */
1381989ee26SSzymon Olewniczak    public function handle_display_banner(Event $event) {
1391989ee26SSzymon Olewniczak        global $INFO;
140bab76148SSzymon Olewniczak
141*3c40d78bSSzymon Olewniczak        if ($event->data != 'show' || !$INFO['exists']) return;
142*3c40d78bSSzymon Olewniczak
143*3c40d78bSSzymon Olewniczak        /* Return true if banner should not be displayed for users with or below read only permission. */
144*3c40d78bSSzymon Olewniczak        if (auth_quickaclcheck($INFO['id']) <= AUTH_READ && !$this->getConf('display_banner_for_readonly')) {
145*3c40d78bSSzymon Olewniczak            return;
146*3c40d78bSSzymon Olewniczak        }
147*3c40d78bSSzymon Olewniczak
1481989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
1491989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
1501989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
151329c5e3aSMartin Diedrich
1524474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1534474ed8aSSzymon Olewniczak        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
1541aeb2b4dSghi
15555f447f4SSzymon Olewniczak
156b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
157b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
1584474ed8aSSzymon Olewniczak
1591989ee26SSzymon Olewniczak        $page_revision = $db->getPageRevision($INFO['id'], $rev);
1601989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
1614474ed8aSSzymon Olewniczak
1624474ed8aSSzymon Olewniczak        $classes = [];
1631989ee26SSzymon Olewniczak        if ($page_revision['status'] == 'approved' && $rev == $last_approved_rev) {
16415e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_approved';
1651989ee26SSzymon Olewniczak        } elseif ($page_revision['status'] == 'approved') {
16615e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_old_approved';
1671989ee26SSzymon Olewniczak        } elseif ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
168bab76148SSzymon Olewniczak            $classes[] = 'plugin__approve_ready';
16955f447f4SSzymon Olewniczak        } else {
17015e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_draft';
17155f447f4SSzymon Olewniczak        }
17255f447f4SSzymon Olewniczak
173b59355cdSSzymon Olewniczak        echo '<div id="plugin__approve" class="' . implode(' ', $classes) . '">';
1741aeb2b4dSghi
175af3e3cd8SSzymon Olewniczak
1761989ee26SSzymon Olewniczak        if ($page_revision['status'] == 'approved') {
177b59355cdSSzymon Olewniczak            echo '<strong>'.$this->getLang('approved').'</strong>';
178b59355cdSSzymon Olewniczak            echo ' ' . dformat(strtotime($page_revision['approved']));
179329c5e3aSMartin Diedrich
180329c5e3aSMartin Diedrich            if($this->getConf('banner_long')) {
181b59355cdSSzymon Olewniczak                echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true);
182b59355cdSSzymon Olewniczak                echo ' (' . $this->getLang('version') .  ': ' . $page_revision['version'] . ')';
183329c5e3aSMartin Diedrich            }
1844474ed8aSSzymon Olewniczak
1854474ed8aSSzymon Olewniczak            //not the newest page
1864474ed8aSSzymon Olewniczak            if ($rev != $last_change_date) {
1874474ed8aSSzymon Olewniczak                // we can see drafts
1881989ee26SSzymon Olewniczak                if ($acl->clientCanSeeDrafts($INFO['id'])) {
189b59355cdSSzymon Olewniczak                    echo ' <a href="' . wl($INFO['id']) . '">';
190b59355cdSSzymon Olewniczak                    echo $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft');
191b59355cdSSzymon Olewniczak                    echo '</a>';
192c7d53eabSSzymon Olewniczak                    // we cannot see link to draft but there is some newer approved version
1931989ee26SSzymon Olewniczak                } elseif ($last_approved_rev != $rev) {
1944474ed8aSSzymon Olewniczak                    $urlParameters = [];
1951989ee26SSzymon Olewniczak                    if ($last_approved_rev != $last_change_date) {
1961989ee26SSzymon Olewniczak                        $urlParameters['rev'] = $last_approved_rev;
1974474ed8aSSzymon Olewniczak                    }
198b59355cdSSzymon Olewniczak                    echo ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
199b59355cdSSzymon Olewniczak                    echo $this->getLang('newest_approved');
200b59355cdSSzymon Olewniczak                    echo '</a>';
2011aeb2b4dSghi                }
2024474ed8aSSzymon Olewniczak            }
2034474ed8aSSzymon Olewniczak
2041aeb2b4dSghi        } else {
2051989ee26SSzymon Olewniczak            if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
206b59355cdSSzymon Olewniczak                echo '<strong>'.$this->getLang('marked_approve_ready').'</strong>';
207b59355cdSSzymon Olewniczak                echo ' ' . dformat(strtotime($page_revision['ready_for_approval']));
208b59355cdSSzymon Olewniczak                echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true);
209c7d53eabSSzymon Olewniczak            } else {
210b59355cdSSzymon Olewniczak                echo '<strong>'.$this->getLang('draft').'</strong>';
21184047bdaSRuud            }
21284047bdaSRuud
2134474ed8aSSzymon Olewniczak            // not exists approve for current page
2141989ee26SSzymon Olewniczak            if ($last_approved_rev == null) {
2154474ed8aSSzymon Olewniczak                // not the newest page
2164474ed8aSSzymon Olewniczak                if ($rev != $last_change_date) {
217b59355cdSSzymon Olewniczak                    echo ' <a href="'.wl($INFO['id']).'">';
218b59355cdSSzymon Olewniczak                    echo $this->getLang('newest_draft');
219b59355cdSSzymon Olewniczak                    echo '</a>';
220274d699aSghi                }
221274d699aSghi            } else {
2224474ed8aSSzymon Olewniczak                $urlParameters = [];
2231989ee26SSzymon Olewniczak                if ($last_approved_rev != $last_change_date) {
2241989ee26SSzymon Olewniczak                    $urlParameters['rev'] = $last_approved_rev;
2254474ed8aSSzymon Olewniczak                }
226b59355cdSSzymon Olewniczak                echo ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
227b59355cdSSzymon Olewniczak                echo $this->getLang('newest_approved');
228b59355cdSSzymon Olewniczak                echo '</a>';
2291aeb2b4dSghi            }
2301aeb2b4dSghi
2314474ed8aSSzymon Olewniczak            //we are in current page
2324474ed8aSSzymon Olewniczak            if ($rev == $last_change_date) {
2334474ed8aSSzymon Olewniczak                if ($this->getConf('ready_for_approval') &&
2341989ee26SSzymon Olewniczak                    $acl->clientCanMarkReadyForApproval($INFO['id']) &&
2351989ee26SSzymon Olewniczak                    $page_revision['status'] != 'ready_for_approval') {
2364474ed8aSSzymon Olewniczak
2374474ed8aSSzymon Olewniczak                    $urlParameters = [
2384474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2394474ed8aSSzymon Olewniczak                        'do' => 'diff',
2404474ed8aSSzymon Olewniczak                        'ready_for_approval' => 'ready_for_approval'
2414474ed8aSSzymon Olewniczak                    ];
242b59355cdSSzymon Olewniczak                    echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
243b59355cdSSzymon Olewniczak                    echo $this->getLang('approve_ready');
244b59355cdSSzymon Olewniczak                    echo '</a>';
24584047bdaSRuud                }
24684047bdaSRuud
2471989ee26SSzymon Olewniczak                if ($acl->clientCanApprove($INFO['id'])) {
2484474ed8aSSzymon Olewniczak                    $urlParameters = [
2494474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2504474ed8aSSzymon Olewniczak                        'do' => 'diff',
2514474ed8aSSzymon Olewniczak                        'approve' => 'approve'
2524474ed8aSSzymon Olewniczak                    ];
253b59355cdSSzymon Olewniczak                    echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
254b59355cdSSzymon Olewniczak                    echo $this->getLang('approve');
255b59355cdSSzymon Olewniczak                    echo '</a>';
2561aeb2b4dSghi                }
257c7d53eabSSzymon Olewniczak            }
258c7d53eabSSzymon Olewniczak        }
25984047bdaSRuud
2601989ee26SSzymon Olewniczak        if (isset($page_metadata['approver']) & $this->getConf('banner_long')) {
261b59355cdSSzymon Olewniczak            echo ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true);
2624474ed8aSSzymon Olewniczak        }
263c7d53eabSSzymon Olewniczak
264b59355cdSSzymon Olewniczak        echo '</div>';
2651aeb2b4dSghi    }
2661aeb2b4dSghi
267af3e3cd8SSzymon Olewniczak    /**
2684474ed8aSSzymon Olewniczak     *
2691989ee26SSzymon Olewniczak     * @param Event $event
2704474ed8aSSzymon Olewniczak     */
2711989ee26SSzymon Olewniczak    public function handle_pagesave_after(Event $event) {
2721b552e87SSzymon Olewniczak        //no content was changed
2734474ed8aSSzymon Olewniczak        if (!$event->data['contentChanged']) return;
2744474ed8aSSzymon Olewniczak
275b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
276b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
2774474ed8aSSzymon Olewniczak
2784474ed8aSSzymon Olewniczak        $id = $event->data['id'];
2791989ee26SSzymon Olewniczak        switch ($event->data['changeType']) {
2801989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_CREATE:
2814474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_EDIT:
2824474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_MINOR_EDIT:
2831989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_REVERT:
2841989ee26SSzymon Olewniczak                $db->handlePageEdit($id);
2854474ed8aSSzymon Olewniczak                break;
2864474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_DELETE:
2871989ee26SSzymon Olewniczak                $db->handlePageDelete($id);
2884474ed8aSSzymon Olewniczak                break;
2894474ed8aSSzymon Olewniczak        }
2904474ed8aSSzymon Olewniczak    }
2911aeb2b4dSghi}
292