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