15f891b7eSNickeau<?php 25f891b7eSNickeau 35f891b7eSNickeau 45f891b7eSNickeauuse ComboStrap\Auth; 55f891b7eSNickeauuse ComboStrap\LowQualityPage; 65f891b7eSNickeauuse ComboStrap\Page; 75f891b7eSNickeauuse ComboStrap\PageProtection; 85f891b7eSNickeau 95f891b7eSNickeaurequire_once(__DIR__ . '/../class/LowQualityPage.php'); 105f891b7eSNickeaurequire_once(__DIR__ . '/../class/PageProtection.php'); 115f891b7eSNickeau 125f891b7eSNickeau/** 135f891b7eSNickeau * 145f891b7eSNickeau */ 155f891b7eSNickeauclass action_plugin_combo_pageprotection extends DokuWiki_Action_Plugin 165f891b7eSNickeau{ 175f891b7eSNickeau 185f891b7eSNickeau 195f891b7eSNickeau public function register(Doku_Event_Handler $controller) 205f891b7eSNickeau { 215f891b7eSNickeau 225f891b7eSNickeau 235f891b7eSNickeau $securityConf = $this->getConf(PageProtection::CONF_PAGE_PROTECTION_MODE); 245f891b7eSNickeau if (empty($securityConf)) { 255f891b7eSNickeau $securityConf = $this->getConf(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_MODE); 265f891b7eSNickeau } 275f891b7eSNickeau if ($securityConf == PageProtection::CONF_VALUE_HIDDEN) { 285f891b7eSNickeau /** 295f891b7eSNickeau * https://www.dokuwiki.org/devel:event:pageutils_id_hidepage 305f891b7eSNickeau */ 315f891b7eSNickeau $controller->register_hook('PAGEUTILS_ID_HIDEPAGE', 'BEFORE', $this, 'handleHiddenCheck', array()); 325f891b7eSNickeau } else { 335f891b7eSNickeau /** 345f891b7eSNickeau * https://www.dokuwiki.org/devel:event:auth_acl_check 355f891b7eSNickeau */ 365f891b7eSNickeau $controller->register_hook('AUTH_ACL_CHECK', 'AFTER', $this, 'handleAclCheck', array()); 375f891b7eSNickeau } 385f891b7eSNickeau 395f891b7eSNickeau /** 405f891b7eSNickeau * https://www.dokuwiki.org/devel:event:search_query_pagelookup 415f891b7eSNickeau */ 425f891b7eSNickeau $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'handleSearchPageLookup', array()); 435f891b7eSNickeau 445f891b7eSNickeau /** 455f891b7eSNickeau * https://www.dokuwiki.org/devel:event:search_query_fullpage 465f891b7eSNickeau */ 475f891b7eSNickeau $controller->register_hook('SEARCH_QUERY_FULLPAGE', 'AFTER', $this, 'handleSearchFullPage', array()); 485f891b7eSNickeau /** 495f891b7eSNickeau * https://www.dokuwiki.org/devel:event:feed_data_process 505f891b7eSNickeau */ 515f891b7eSNickeau $controller->register_hook('FEED_DATA_PROCESS', 'AFTER', $this, 'handleRssFeed', array()); 525f891b7eSNickeau 535f891b7eSNickeau /** 545f891b7eSNickeau * Add logged in 555f891b7eSNickeau */ 565f891b7eSNickeau $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'handleAnonymousJsIndicator'); 575f891b7eSNickeau 585f891b7eSNickeau 595f891b7eSNickeau } 605f891b7eSNickeau 615f891b7eSNickeau /** 625f891b7eSNickeau * Set a low page has hidden 635f891b7eSNickeau * @param $event 645f891b7eSNickeau * @param $param 655f891b7eSNickeau */ 665f891b7eSNickeau function handleHiddenCheck(&$event, $param) 675f891b7eSNickeau { 685f891b7eSNickeau 695f891b7eSNickeau $id = $event->data['id']; 705f891b7eSNickeau $page = new Page($id); 715f891b7eSNickeau 725f891b7eSNickeau if ($page->isProtected()) { 735f891b7eSNickeau $event->data['hidden'] = true; 745f891b7eSNickeau } 755f891b7eSNickeau 765f891b7eSNickeau } 775f891b7eSNickeau 785f891b7eSNickeau /** 795f891b7eSNickeau * Make the authorization to NONE for low page 805f891b7eSNickeau * @param $event 815f891b7eSNickeau * @param $param 825f891b7eSNickeau */ 835f891b7eSNickeau function handleAclCheck(&$event, $param) 845f891b7eSNickeau { 855f891b7eSNickeau 865f891b7eSNickeau $id = $event->data['id']; 87*32b85071SNickeau /** 88*32b85071SNickeau * ACL ID have the root form 89*32b85071SNickeau */ 90*32b85071SNickeau $cleanId = cleanID($id); 915f891b7eSNickeau if (Page::isDirectoryId($id)){ 92*32b85071SNickeau 935f891b7eSNickeau return; 94*32b85071SNickeau 955f891b7eSNickeau } else { 96*32b85071SNickeau 975f891b7eSNickeau $user = $event->data['user']; 98*32b85071SNickeau $page = new Page($cleanId); 995f891b7eSNickeau if ($page->isProtected($user)) { 1005f891b7eSNickeau $event->result = AUTH_NONE; 1015f891b7eSNickeau } 102*32b85071SNickeau 1035f891b7eSNickeau } 1045f891b7eSNickeau 1055f891b7eSNickeau } 1065f891b7eSNickeau 1075f891b7eSNickeau /** 1085f891b7eSNickeau * @param $event 1095f891b7eSNickeau * @param $param 1105f891b7eSNickeau * The autocomplete do a search on page name 1115f891b7eSNickeau */ 1125f891b7eSNickeau function handleSearchPageLookup(&$event, $param) 1135f891b7eSNickeau { 1145f891b7eSNickeau $this->excludePageFromSearch($event); 1155f891b7eSNickeau } 1165f891b7eSNickeau 1175f891b7eSNickeau /** 1185f891b7eSNickeau * @param $event 1195f891b7eSNickeau * @param $param 1205f891b7eSNickeau * The search page do a search on page name 1215f891b7eSNickeau */ 1225f891b7eSNickeau function handleSearchFullPage(&$event, $param) 1235f891b7eSNickeau { 1245f891b7eSNickeau 1255f891b7eSNickeau $this->excludePageFromSearch($event); 1265f891b7eSNickeau } 1275f891b7eSNickeau 1285f891b7eSNickeau /** 1295f891b7eSNickeau * 1305f891b7eSNickeau * @param $event 1315f891b7eSNickeau * @param $param 1325f891b7eSNickeau * The Rss 1335f891b7eSNickeau * https://www.dokuwiki.org/syndication 1345f891b7eSNickeau * Example 1355f891b7eSNickeau * https://example.com/feed.php?type=rss2&num=5 1365f891b7eSNickeau */ 1375f891b7eSNickeau function handleRssFeed(&$event, $param) 1385f891b7eSNickeau { 1395f891b7eSNickeau $this->excludePageFromSearch($event); 1405f891b7eSNickeau } 1415f891b7eSNickeau 1425f891b7eSNickeau /** 1435f891b7eSNickeau * @param $event 1445f891b7eSNickeau */ 1455f891b7eSNickeau private 1465f891b7eSNickeau function excludePageFromSearch(&$event) 1475f891b7eSNickeau { 1485f891b7eSNickeau 1495f891b7eSNickeau $result = $event->result; 1505f891b7eSNickeau /** 1515f891b7eSNickeau * The value is always an array 1525f891b7eSNickeau * but as we got this error: 1535f891b7eSNickeau * ``` 1545f891b7eSNickeau * array_keys() expects parameter 1 to be array 1555f891b7eSNickeau * ``` 1565f891b7eSNickeau */ 1575f891b7eSNickeau if (is_array($result)) { 1585f891b7eSNickeau foreach (array_keys($result) as $idx) { 1595f891b7eSNickeau $page = new Page($idx); 1605f891b7eSNickeau if ($page->isProtected()) { 1615f891b7eSNickeau unset($result[$idx]); 1625f891b7eSNickeau } 1635f891b7eSNickeau } 1645f891b7eSNickeau } 1655f891b7eSNickeau 1665f891b7eSNickeau } 1675f891b7eSNickeau 1685f891b7eSNickeau function handleAnonymousJsIndicator(&$event, $param) 1695f891b7eSNickeau { 1705f891b7eSNickeau 1715f891b7eSNickeau global $JSINFO; 1725f891b7eSNickeau $JSINFO[PageProtection::JS_IS_PUBLIC_NAVIGATION_INDICATOR] = !Auth::isLoggedIn(); 1735f891b7eSNickeau 1745f891b7eSNickeau 1755f891b7eSNickeau } 1765f891b7eSNickeau 1775f891b7eSNickeau} 178