xref: /plugin/approve/helper/acl.php (revision 1989ee26e4c10d9fe322c2a0aa4ae990f031b47b)
1*1989ee26SSzymon Olewniczak<?php
2*1989ee26SSzymon Olewniczak
3*1989ee26SSzymon Olewniczakuse dokuwiki\Extension\Plugin;
4*1989ee26SSzymon Olewniczak
5*1989ee26SSzymon Olewniczakclass helper_plugin_approve_acl extends Plugin
6*1989ee26SSzymon Olewniczak{
7*1989ee26SSzymon Olewniczak    public function useApproveHere($id) {
8*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
9*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
10*1989ee26SSzymon Olewniczak        $page_metadata = $db->getPageMetadata($id);
11*1989ee26SSzymon Olewniczak        if ($page_metadata === null) { // do not use approve plugin here
12*1989ee26SSzymon Olewniczak            return false;
13*1989ee26SSzymon Olewniczak        }
14*1989ee26SSzymon Olewniczak        return true;
15*1989ee26SSzymon Olewniczak    }
16*1989ee26SSzymon Olewniczak
17*1989ee26SSzymon Olewniczak    public function clientCanApprove($id): bool
18*1989ee26SSzymon Olewniczak    {
19*1989ee26SSzymon Olewniczak        global $INFO;
20*1989ee26SSzymon Olewniczak
21*1989ee26SSzymon Olewniczak        // user not log in
22*1989ee26SSzymon Olewniczak        if (!isset($INFO['userinfo'])) return false;
23*1989ee26SSzymon Olewniczak
24*1989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_data $db */
25*1989ee26SSzymon Olewniczak        $db = $this->loadHelper('approve_data');
26*1989ee26SSzymon Olewniczak        $page_metadata = $db->getPageMetadata($id);
27*1989ee26SSzymon Olewniczak
28*1989ee26SSzymon Olewniczak        if ($page_metadata === null) {
29*1989ee26SSzymon Olewniczak            return false;
30*1989ee26SSzymon Olewniczak        } elseif ($page_metadata['approver'] == $INFO['client']) { // user is approver
31*1989ee26SSzymon Olewniczak            return true;
32*1989ee26SSzymon Olewniczak            // user is in approvers group
33*1989ee26SSzymon Olewniczak        } elseif (strncmp($page_metadata['approver'], "@", 1) === 0 &&
34*1989ee26SSzymon Olewniczak            in_array(substr($page_metadata['approver'], 1), $INFO['userinfo']['grps'])) {
35*1989ee26SSzymon Olewniczak            return true;
36*1989ee26SSzymon Olewniczak            // if the user has AUTH_DELETE permission and the approver is not defined or strict_approver is turn off
37*1989ee26SSzymon Olewniczak            // user can approve the page
38*1989ee26SSzymon Olewniczak        } elseif (auth_quickaclcheck($id) >= AUTH_DELETE &&
39*1989ee26SSzymon Olewniczak            ($page_metadata['approver'] === null || !$this->getConf('strict_approver'))) {
40*1989ee26SSzymon Olewniczak            return true;
41*1989ee26SSzymon Olewniczak        }
42*1989ee26SSzymon Olewniczak        return false;
43*1989ee26SSzymon Olewniczak    }
44*1989ee26SSzymon Olewniczak
45*1989ee26SSzymon Olewniczak    public function clientCanMarkReadyForApproval($id): bool {
46*1989ee26SSzymon Olewniczak        global $INFO;
47*1989ee26SSzymon Olewniczak
48*1989ee26SSzymon Olewniczak        $ready_for_approval_acl = preg_split('/\s+/', $this->getConf('ready_for_approval_acl'),
49*1989ee26SSzymon Olewniczak            -1, PREG_SPLIT_NO_EMPTY);
50*1989ee26SSzymon Olewniczak
51*1989ee26SSzymon Olewniczak        if (count($ready_for_approval_acl) == 0) {
52*1989ee26SSzymon Olewniczak            return auth_quickaclcheck($id) >= AUTH_EDIT;
53*1989ee26SSzymon Olewniczak        }
54*1989ee26SSzymon Olewniczak        foreach ($ready_for_approval_acl as $user_or_group) {
55*1989ee26SSzymon Olewniczak            if ($user_or_group[0] == '@' && in_array(substr($user_or_group, 1), $INFO['userinfo']['grps'])) {
56*1989ee26SSzymon Olewniczak                return true;
57*1989ee26SSzymon Olewniczak            } elseif ($user_or_group == $INFO['client']) {
58*1989ee26SSzymon Olewniczak                return true;
59*1989ee26SSzymon Olewniczak            }
60*1989ee26SSzymon Olewniczak        }
61*1989ee26SSzymon Olewniczak        return false;
62*1989ee26SSzymon Olewniczak    }
63*1989ee26SSzymon Olewniczak
64*1989ee26SSzymon Olewniczak    public function clientCanSeeDrafts($id): bool {
65*1989ee26SSzymon Olewniczak
66*1989ee26SSzymon Olewniczak        // in view mode no one can see drafts
67*1989ee26SSzymon Olewniczak        if ($this->getConf('viewmode') && get_doku_pref('approve_viewmode', false)) return false;
68*1989ee26SSzymon Olewniczak
69*1989ee26SSzymon Olewniczak        if (!$this->getConf('hide_drafts_for_viewers')) return true;
70*1989ee26SSzymon Olewniczak
71*1989ee26SSzymon Olewniczak        if (auth_quickaclcheck($id) >= AUTH_EDIT) return true;
72*1989ee26SSzymon Olewniczak        if ($this->clientCanApprove($id)) return true;
73*1989ee26SSzymon Olewniczak
74*1989ee26SSzymon Olewniczak        return false;
75*1989ee26SSzymon Olewniczak    }
76*1989ee26SSzymon Olewniczak}
77