15f891b7eSNickeau<?php 25f891b7eSNickeau 35f891b7eSNickeau 45f891b7eSNickeauuse ComboStrap\Auth; 5*21913ab3SNickeauuse ComboStrap\DokuPath; 65f891b7eSNickeauuse ComboStrap\LowQualityPage; 75f891b7eSNickeauuse ComboStrap\Page; 85f891b7eSNickeauuse ComboStrap\PageProtection; 9*21913ab3SNickeauuse ComboStrap\StringUtility; 105f891b7eSNickeau 115f891b7eSNickeaurequire_once(__DIR__ . '/../class/LowQualityPage.php'); 125f891b7eSNickeaurequire_once(__DIR__ . '/../class/PageProtection.php'); 13*21913ab3SNickeaurequire_once(__DIR__ . '/../class/DokuPath.php'); 145f891b7eSNickeau 155f891b7eSNickeau/** 165f891b7eSNickeau * 175f891b7eSNickeau */ 185f891b7eSNickeauclass action_plugin_combo_pageprotection extends DokuWiki_Action_Plugin 195f891b7eSNickeau{ 205f891b7eSNickeau 215f891b7eSNickeau 225f891b7eSNickeau public function register(Doku_Event_Handler $controller) 235f891b7eSNickeau { 245f891b7eSNickeau 255f891b7eSNickeau 265f891b7eSNickeau $securityConf = $this->getConf(PageProtection::CONF_PAGE_PROTECTION_MODE); 275f891b7eSNickeau if (empty($securityConf)) { 285f891b7eSNickeau $securityConf = $this->getConf(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_MODE); 295f891b7eSNickeau } 305f891b7eSNickeau if ($securityConf == PageProtection::CONF_VALUE_HIDDEN) { 315f891b7eSNickeau /** 325f891b7eSNickeau * https://www.dokuwiki.org/devel:event:pageutils_id_hidepage 335f891b7eSNickeau */ 345f891b7eSNickeau $controller->register_hook('PAGEUTILS_ID_HIDEPAGE', 'BEFORE', $this, 'handleHiddenCheck', array()); 355f891b7eSNickeau } else { 365f891b7eSNickeau /** 375f891b7eSNickeau * https://www.dokuwiki.org/devel:event:auth_acl_check 385f891b7eSNickeau */ 395f891b7eSNickeau $controller->register_hook('AUTH_ACL_CHECK', 'AFTER', $this, 'handleAclCheck', array()); 405f891b7eSNickeau } 415f891b7eSNickeau 425f891b7eSNickeau /** 435f891b7eSNickeau * https://www.dokuwiki.org/devel:event:search_query_pagelookup 445f891b7eSNickeau */ 455f891b7eSNickeau $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'handleSearchPageLookup', array()); 465f891b7eSNickeau 475f891b7eSNickeau /** 485f891b7eSNickeau * https://www.dokuwiki.org/devel:event:search_query_fullpage 495f891b7eSNickeau */ 505f891b7eSNickeau $controller->register_hook('SEARCH_QUERY_FULLPAGE', 'AFTER', $this, 'handleSearchFullPage', array()); 515f891b7eSNickeau /** 525f891b7eSNickeau * https://www.dokuwiki.org/devel:event:feed_data_process 535f891b7eSNickeau */ 545f891b7eSNickeau $controller->register_hook('FEED_DATA_PROCESS', 'AFTER', $this, 'handleRssFeed', array()); 555f891b7eSNickeau 565f891b7eSNickeau /** 575f891b7eSNickeau * Add logged in 585f891b7eSNickeau */ 595f891b7eSNickeau $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'handleAnonymousJsIndicator'); 605f891b7eSNickeau 615f891b7eSNickeau 625f891b7eSNickeau } 635f891b7eSNickeau 645f891b7eSNickeau /** 655f891b7eSNickeau * Set a low page has hidden 665f891b7eSNickeau * @param $event 675f891b7eSNickeau * @param $param 685f891b7eSNickeau */ 695f891b7eSNickeau function handleHiddenCheck(&$event, $param) 705f891b7eSNickeau { 715f891b7eSNickeau 725f891b7eSNickeau $id = $event->data['id']; 735f891b7eSNickeau $page = new Page($id); 745f891b7eSNickeau 755f891b7eSNickeau if ($page->isProtected()) { 765f891b7eSNickeau $event->data['hidden'] = true; 775f891b7eSNickeau } 785f891b7eSNickeau 795f891b7eSNickeau } 805f891b7eSNickeau 815f891b7eSNickeau /** 825f891b7eSNickeau * Make the authorization to NONE for low page 835f891b7eSNickeau * @param $event 845f891b7eSNickeau * @param $param 855f891b7eSNickeau */ 865f891b7eSNickeau function handleAclCheck(&$event, $param) 875f891b7eSNickeau { 885f891b7eSNickeau 8932b85071SNickeau /** 90*21913ab3SNickeau * Are we on a page script 9132b85071SNickeau */ 92*21913ab3SNickeau $imageScript = ["/lib/exe/mediamanager.php","/lib/exe/detail.php"]; 93*21913ab3SNickeau if (in_array($_SERVER['SCRIPT_NAME'], $imageScript)) { 94*21913ab3SNickeau // id may be null or end with a star 95*21913ab3SNickeau // this is not a image 965f891b7eSNickeau return; 97*21913ab3SNickeau } 9832b85071SNickeau 99*21913ab3SNickeau $id = $event->data['id']; 10032b85071SNickeau 101*21913ab3SNickeau $dokuPath = DokuPath::createUnknownFromId($id); 102*21913ab3SNickeau if ($dokuPath->isPage()) { 103*21913ab3SNickeau /** 104*21913ab3SNickeau * It should be only a page 105*21913ab3SNickeau * https://www.dokuwiki.org/devel:event:auth_acl_check 106*21913ab3SNickeau */ 1075f891b7eSNickeau $user = $event->data['user']; 108*21913ab3SNickeau $page = new Page($id); 1095f891b7eSNickeau if ($page->isProtected($user)) { 1105f891b7eSNickeau $event->result = AUTH_NONE; 1115f891b7eSNickeau } 1125f891b7eSNickeau } 1135f891b7eSNickeau 1145f891b7eSNickeau } 1155f891b7eSNickeau 1165f891b7eSNickeau /** 1175f891b7eSNickeau * @param $event 1185f891b7eSNickeau * @param $param 1195f891b7eSNickeau * The autocomplete do a search on page name 1205f891b7eSNickeau */ 1215f891b7eSNickeau function handleSearchPageLookup(&$event, $param) 1225f891b7eSNickeau { 1235f891b7eSNickeau $this->excludePageFromSearch($event); 1245f891b7eSNickeau } 1255f891b7eSNickeau 1265f891b7eSNickeau /** 1275f891b7eSNickeau * @param $event 1285f891b7eSNickeau * @param $param 1295f891b7eSNickeau * The search page do a search on page name 1305f891b7eSNickeau */ 1315f891b7eSNickeau function handleSearchFullPage(&$event, $param) 1325f891b7eSNickeau { 1335f891b7eSNickeau 1345f891b7eSNickeau $this->excludePageFromSearch($event); 1355f891b7eSNickeau } 1365f891b7eSNickeau 1375f891b7eSNickeau /** 1385f891b7eSNickeau * 1395f891b7eSNickeau * @param $event 1405f891b7eSNickeau * @param $param 1415f891b7eSNickeau * The Rss 1425f891b7eSNickeau * https://www.dokuwiki.org/syndication 1435f891b7eSNickeau * Example 1445f891b7eSNickeau * https://example.com/feed.php?type=rss2&num=5 1455f891b7eSNickeau */ 1465f891b7eSNickeau function handleRssFeed(&$event, $param) 1475f891b7eSNickeau { 1485f891b7eSNickeau $this->excludePageFromSearch($event); 1495f891b7eSNickeau } 1505f891b7eSNickeau 1515f891b7eSNickeau /** 1525f891b7eSNickeau * @param $event 1535f891b7eSNickeau */ 1545f891b7eSNickeau private 1555f891b7eSNickeau function excludePageFromSearch(&$event) 1565f891b7eSNickeau { 1575f891b7eSNickeau 1585f891b7eSNickeau $result = $event->result; 1595f891b7eSNickeau /** 1605f891b7eSNickeau * The value is always an array 1615f891b7eSNickeau * but as we got this error: 1625f891b7eSNickeau * ``` 1635f891b7eSNickeau * array_keys() expects parameter 1 to be array 1645f891b7eSNickeau * ``` 1655f891b7eSNickeau */ 1665f891b7eSNickeau if (is_array($result)) { 1675f891b7eSNickeau foreach (array_keys($result) as $idx) { 1685f891b7eSNickeau $page = new Page($idx); 1695f891b7eSNickeau if ($page->isProtected()) { 1705f891b7eSNickeau unset($result[$idx]); 1715f891b7eSNickeau } 1725f891b7eSNickeau } 1735f891b7eSNickeau } 1745f891b7eSNickeau 1755f891b7eSNickeau } 1765f891b7eSNickeau 1775f891b7eSNickeau function handleAnonymousJsIndicator(&$event, $param) 1785f891b7eSNickeau { 1795f891b7eSNickeau 1805f891b7eSNickeau global $JSINFO; 1815f891b7eSNickeau $JSINFO[PageProtection::JS_IS_PUBLIC_NAVIGATION_INDICATOR] = !Auth::isLoggedIn(); 1825f891b7eSNickeau 1835f891b7eSNickeau 1845f891b7eSNickeau } 1855f891b7eSNickeau 1865f891b7eSNickeau} 187