xref: /plugin/structpublish/helper/db.php (revision 939e6e3ca86690c99bc0cda50a62d61e0294ae7e) !
1e394901aSAnna Dabrowska<?php
2e394901aSAnna Dabrowska
3910e7e15SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Assignments;
4910e7e15SAnna Dabrowska
5e394901aSAnna Dabrowskaclass helper_plugin_structpublish_db extends helper_plugin_struct_db
6e394901aSAnna Dabrowska{
7*939e6e3cSAnna Dabrowska    const ACTION_APPROVE = 'approve';
8*939e6e3cSAnna Dabrowska    const ACTION_PUBLISH = 'publish';
9*939e6e3cSAnna Dabrowska
10e394901aSAnna Dabrowska    /**
11910e7e15SAnna Dabrowska     * Get list of all pages known to the plugin
12910e7e15SAnna Dabrowska     * @return array
13910e7e15SAnna Dabrowska     */
14910e7e15SAnna Dabrowska    public function getPages($pid = null)
15910e7e15SAnna Dabrowska    {
16910e7e15SAnna Dabrowska        $sql = 'SELECT pid FROM data_structpublish';
17910e7e15SAnna Dabrowska        if ($pid) {
18910e7e15SAnna Dabrowska            $sql .= ' WHERE pid = ?';
19910e7e15SAnna Dabrowska        }
20910e7e15SAnna Dabrowska        $res = $this->sqlite->query($sql, $pid);
21910e7e15SAnna Dabrowska        $list = $this->sqlite->res2arr($res);
22910e7e15SAnna Dabrowska        $this->sqlite->res_close($res);
23910e7e15SAnna Dabrowska        return $list;
24910e7e15SAnna Dabrowska    }
25910e7e15SAnna Dabrowska
26910e7e15SAnna Dabrowska    /**
27*939e6e3cSAnna Dabrowska     * Returns true if the current page is included in publishing workflows
28*939e6e3cSAnna Dabrowska     *
29*939e6e3cSAnna Dabrowska     * @return bool
30*939e6e3cSAnna Dabrowska     */
31*939e6e3cSAnna Dabrowska    public function isPublishable()
32*939e6e3cSAnna Dabrowska    {
33*939e6e3cSAnna Dabrowska        global $ID;
34*939e6e3cSAnna Dabrowska
35*939e6e3cSAnna Dabrowska        $sql = 'SELECT * FROM structpublish_assignments WHERE pid = ? AND assigned = 1';
36*939e6e3cSAnna Dabrowska        $res = $this->sqlite->query($sql, $ID);
37*939e6e3cSAnna Dabrowska        if ($res && $this->sqlite->res2count($res)) {
38*939e6e3cSAnna Dabrowska            return true;
39*939e6e3cSAnna Dabrowska        }
40*939e6e3cSAnna Dabrowska        return false;
41*939e6e3cSAnna Dabrowska    }
42*939e6e3cSAnna Dabrowska
43*939e6e3cSAnna Dabrowska    /**
44e394901aSAnna Dabrowska     * Overwrites dummy IS_PUBLISHER from struct plugin
45910e7e15SAnna Dabrowska     * Required argument: pid
46910e7e15SAnna Dabrowska     * Expected arguments: user, grps; default to current user and their groups
47910e7e15SAnna Dabrowska     *
4840f4519bSAnna Dabrowska     * Returns true if user/group may see unpublished revisions of a page
49e394901aSAnna Dabrowska     *
50e394901aSAnna Dabrowska     * @return bool
51e394901aSAnna Dabrowska     */
52e394901aSAnna Dabrowska    public function IS_PUBLISHER() // phpcs:ignore PSR1.Methods.CamelCapsMethodName.NotCamelCaps
53e394901aSAnna Dabrowska    {
54910e7e15SAnna Dabrowska        global $USERINFO;
55910e7e15SAnna Dabrowska        global $INPUT;
56e394901aSAnna Dabrowska
57910e7e15SAnna Dabrowska        $args = func_get_args();
58910e7e15SAnna Dabrowska        $pid = $args[0];
59910e7e15SAnna Dabrowska        $userId = $args[1] ?? $INPUT->server->str('REMOTE_USER');
60910e7e15SAnna Dabrowska        $grps = $args[2] ?? ($USERINFO['grps'] ?? []);
61910e7e15SAnna Dabrowska
6240f4519bSAnna Dabrowska        return $this->userHasRole(
63*939e6e3cSAnna Dabrowska            [self::ACTION_PUBLISH, self::ACTION_APPROVE],
6440f4519bSAnna Dabrowska            $userId,
6540f4519bSAnna Dabrowska            $grps,
6640f4519bSAnna Dabrowska            $pid
6740f4519bSAnna Dabrowska        );
68910e7e15SAnna Dabrowska    }
69910e7e15SAnna Dabrowska
7040f4519bSAnna Dabrowska    protected function userHasRole($roles, $userId, $grps, $pid)
71910e7e15SAnna Dabrowska    {
72910e7e15SAnna Dabrowska        $assignments = Assignments::getInstance();
73910e7e15SAnna Dabrowska        $rules = $assignments->getPageAssignments($pid);
74910e7e15SAnna Dabrowska
7540f4519bSAnna Dabrowska        foreach ($roles as $role) {
76910e7e15SAnna Dabrowska            if (isset($rules[$role])) {
77*939e6e3cSAnna Dabrowska                $users = $rules[self::ACTION_PUBLISH];
78910e7e15SAnna Dabrowska                if (auth_isMember(implode(',', $users), $userId, $grps)) {
79910e7e15SAnna Dabrowska                    return true;
80910e7e15SAnna Dabrowska                }
81910e7e15SAnna Dabrowska            }
8240f4519bSAnna Dabrowska        }
83910e7e15SAnna Dabrowska
84910e7e15SAnna Dabrowska        return false;
85e394901aSAnna Dabrowska    }
86e394901aSAnna Dabrowska}
87