*/ class syntax_plugin_aclinfo extends SyntaxPlugin { /** @inheritdoc */ public function getType() { return 'substition'; } /** @inheritdoc */ public function getPType() { return 'block'; } /** @inheritdoc */ public function getSort() { return 155; } /** @inheritdoc */ public function connectTo($mode) { $this->Lexer->addSpecialPattern('~~ACLINFO!?[^~]*?~~', $mode, 'plugin_aclinfo'); } /** @inheritdoc */ public function handle($match, $state, $pos, Doku_Handler $handler) { $match = substr($match, 10, -2); return [$match]; } /** @inheritdoc */ public function render($format, Doku_Renderer $R, $data) { global $INFO; if ($format != 'xhtml') return false; if (!$data[0]) { $page = $INFO['id']; } else { $page = $data[0]; } $perms = $this->aclCheck($page); $R->doc .= '
'; $R->listu_open(); foreach ($perms as $who => $p) { $R->listitem_open(1); $R->listcontent_open(); $R->cdata(sprintf($this->getLang('perm' . $p), urldecode($who))); $R->listcontent_close(); $R->listitem_close(); } $R->listu_close(); $R->doc .= '
'; return true; } /** * Parse the ACL setup and return the permissions for the given page ID. * * @param string $id The page ID to check * @return array */ protected function aclCheck($id) { global $AUTH_ACL; $id = cleanID($id); $ns = getNS($id); $perms = []; //check exact match first $matches = preg_grep('/^' . preg_quote($id, '/') . '\s+/', $AUTH_ACL); $perms = array_merge($perms, $this->processAclMatches($matches)); //still here? do the namespace checks if ($ns) { $path = $ns . ':\*'; } else { $path = '\*'; //root document } do { $matches = preg_grep('/^' . $path . '\s+/', $AUTH_ACL); $perms = array_merge($perms, $this->processAclMatches($matches)); //get next higher namespace $ns = getNS($ns); if ($path != '\*') { $path = $ns . ':\*'; if ($path == ':\*') $path = '\*'; } else { //we did this already //break here break; } } while (1); //this should never loop endless return $perms; } /** * Process ACL matches and return parsed permissions. * * @param array $matches Array of ACL lines to process * @return array Parsed permissions array */ protected function processAclMatches(array $matches) { $perms = []; foreach ($matches as $match) { $match = preg_replace('/#.*$/', '', $match); //ignore comments $acl = preg_split('/\s+/', $match); if ($acl[2] > AUTH_DELETE) $acl[2] = AUTH_DELETE; //no admins in the ACL! if (!isset($perms[$acl[1]])) $perms[$acl[1]] = $acl[2]; } return $perms; } }