1*5f891b7eSNickeau<?php 2*5f891b7eSNickeau 3*5f891b7eSNickeau 4*5f891b7eSNickeauuse ComboStrap\Auth; 5*5f891b7eSNickeauuse ComboStrap\LowQualityPage; 6*5f891b7eSNickeauuse ComboStrap\Page; 7*5f891b7eSNickeauuse ComboStrap\PageProtection; 8*5f891b7eSNickeau 9*5f891b7eSNickeaurequire_once(__DIR__ . '/../class/LowQualityPage.php'); 10*5f891b7eSNickeaurequire_once(__DIR__ . '/../class/PageProtection.php'); 11*5f891b7eSNickeau 12*5f891b7eSNickeau/** 13*5f891b7eSNickeau * 14*5f891b7eSNickeau */ 15*5f891b7eSNickeauclass action_plugin_combo_pageprotection extends DokuWiki_Action_Plugin 16*5f891b7eSNickeau{ 17*5f891b7eSNickeau 18*5f891b7eSNickeau 19*5f891b7eSNickeau public function register(Doku_Event_Handler $controller) 20*5f891b7eSNickeau { 21*5f891b7eSNickeau 22*5f891b7eSNickeau 23*5f891b7eSNickeau $securityConf = $this->getConf(PageProtection::CONF_PAGE_PROTECTION_MODE); 24*5f891b7eSNickeau if (empty($securityConf)) { 25*5f891b7eSNickeau $securityConf = $this->getConf(LowQualityPage::CONF_LOW_QUALITY_PAGE_PROTECTION_MODE); 26*5f891b7eSNickeau } 27*5f891b7eSNickeau if ($securityConf == PageProtection::CONF_VALUE_HIDDEN) { 28*5f891b7eSNickeau /** 29*5f891b7eSNickeau * https://www.dokuwiki.org/devel:event:pageutils_id_hidepage 30*5f891b7eSNickeau */ 31*5f891b7eSNickeau $controller->register_hook('PAGEUTILS_ID_HIDEPAGE', 'BEFORE', $this, 'handleHiddenCheck', array()); 32*5f891b7eSNickeau } else { 33*5f891b7eSNickeau /** 34*5f891b7eSNickeau * https://www.dokuwiki.org/devel:event:auth_acl_check 35*5f891b7eSNickeau */ 36*5f891b7eSNickeau $controller->register_hook('AUTH_ACL_CHECK', 'AFTER', $this, 'handleAclCheck', array()); 37*5f891b7eSNickeau } 38*5f891b7eSNickeau 39*5f891b7eSNickeau /** 40*5f891b7eSNickeau * https://www.dokuwiki.org/devel:event:search_query_pagelookup 41*5f891b7eSNickeau */ 42*5f891b7eSNickeau $controller->register_hook('SEARCH_QUERY_PAGELOOKUP', 'AFTER', $this, 'handleSearchPageLookup', array()); 43*5f891b7eSNickeau 44*5f891b7eSNickeau /** 45*5f891b7eSNickeau * https://www.dokuwiki.org/devel:event:search_query_fullpage 46*5f891b7eSNickeau */ 47*5f891b7eSNickeau $controller->register_hook('SEARCH_QUERY_FULLPAGE', 'AFTER', $this, 'handleSearchFullPage', array()); 48*5f891b7eSNickeau /** 49*5f891b7eSNickeau * https://www.dokuwiki.org/devel:event:feed_data_process 50*5f891b7eSNickeau */ 51*5f891b7eSNickeau $controller->register_hook('FEED_DATA_PROCESS', 'AFTER', $this, 'handleRssFeed', array()); 52*5f891b7eSNickeau 53*5f891b7eSNickeau /** 54*5f891b7eSNickeau * Add logged in 55*5f891b7eSNickeau */ 56*5f891b7eSNickeau $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'handleAnonymousJsIndicator'); 57*5f891b7eSNickeau 58*5f891b7eSNickeau 59*5f891b7eSNickeau } 60*5f891b7eSNickeau 61*5f891b7eSNickeau /** 62*5f891b7eSNickeau * Set a low page has hidden 63*5f891b7eSNickeau * @param $event 64*5f891b7eSNickeau * @param $param 65*5f891b7eSNickeau */ 66*5f891b7eSNickeau function handleHiddenCheck(&$event, $param) 67*5f891b7eSNickeau { 68*5f891b7eSNickeau 69*5f891b7eSNickeau $id = $event->data['id']; 70*5f891b7eSNickeau $page = new Page($id); 71*5f891b7eSNickeau 72*5f891b7eSNickeau if ($page->isProtected()) { 73*5f891b7eSNickeau $event->data['hidden'] = true; 74*5f891b7eSNickeau } 75*5f891b7eSNickeau 76*5f891b7eSNickeau } 77*5f891b7eSNickeau 78*5f891b7eSNickeau /** 79*5f891b7eSNickeau * Make the authorization to NONE for low page 80*5f891b7eSNickeau * @param $event 81*5f891b7eSNickeau * @param $param 82*5f891b7eSNickeau */ 83*5f891b7eSNickeau function handleAclCheck(&$event, $param) 84*5f891b7eSNickeau { 85*5f891b7eSNickeau 86*5f891b7eSNickeau $id = $event->data['id']; 87*5f891b7eSNickeau if (Page::isDirectoryId($id)){ 88*5f891b7eSNickeau return; 89*5f891b7eSNickeau } else { 90*5f891b7eSNickeau $user = $event->data['user']; 91*5f891b7eSNickeau $page = new Page($id); 92*5f891b7eSNickeau if ($page->isProtected($user)) { 93*5f891b7eSNickeau $event->result = AUTH_NONE; 94*5f891b7eSNickeau } 95*5f891b7eSNickeau } 96*5f891b7eSNickeau 97*5f891b7eSNickeau } 98*5f891b7eSNickeau 99*5f891b7eSNickeau /** 100*5f891b7eSNickeau * @param $event 101*5f891b7eSNickeau * @param $param 102*5f891b7eSNickeau * The autocomplete do a search on page name 103*5f891b7eSNickeau */ 104*5f891b7eSNickeau function handleSearchPageLookup(&$event, $param) 105*5f891b7eSNickeau { 106*5f891b7eSNickeau $this->excludePageFromSearch($event); 107*5f891b7eSNickeau } 108*5f891b7eSNickeau 109*5f891b7eSNickeau /** 110*5f891b7eSNickeau * @param $event 111*5f891b7eSNickeau * @param $param 112*5f891b7eSNickeau * The search page do a search on page name 113*5f891b7eSNickeau */ 114*5f891b7eSNickeau function handleSearchFullPage(&$event, $param) 115*5f891b7eSNickeau { 116*5f891b7eSNickeau 117*5f891b7eSNickeau $this->excludePageFromSearch($event); 118*5f891b7eSNickeau } 119*5f891b7eSNickeau 120*5f891b7eSNickeau /** 121*5f891b7eSNickeau * 122*5f891b7eSNickeau * @param $event 123*5f891b7eSNickeau * @param $param 124*5f891b7eSNickeau * The Rss 125*5f891b7eSNickeau * https://www.dokuwiki.org/syndication 126*5f891b7eSNickeau * Example 127*5f891b7eSNickeau * https://example.com/feed.php?type=rss2&num=5 128*5f891b7eSNickeau */ 129*5f891b7eSNickeau function handleRssFeed(&$event, $param) 130*5f891b7eSNickeau { 131*5f891b7eSNickeau $this->excludePageFromSearch($event); 132*5f891b7eSNickeau } 133*5f891b7eSNickeau 134*5f891b7eSNickeau /** 135*5f891b7eSNickeau * @param $event 136*5f891b7eSNickeau */ 137*5f891b7eSNickeau private 138*5f891b7eSNickeau function excludePageFromSearch(&$event) 139*5f891b7eSNickeau { 140*5f891b7eSNickeau 141*5f891b7eSNickeau $result = $event->result; 142*5f891b7eSNickeau /** 143*5f891b7eSNickeau * The value is always an array 144*5f891b7eSNickeau * but as we got this error: 145*5f891b7eSNickeau * ``` 146*5f891b7eSNickeau * array_keys() expects parameter 1 to be array 147*5f891b7eSNickeau * ``` 148*5f891b7eSNickeau */ 149*5f891b7eSNickeau if (is_array($result)) { 150*5f891b7eSNickeau foreach (array_keys($result) as $idx) { 151*5f891b7eSNickeau $page = new Page($idx); 152*5f891b7eSNickeau if ($page->isProtected()) { 153*5f891b7eSNickeau unset($result[$idx]); 154*5f891b7eSNickeau } 155*5f891b7eSNickeau } 156*5f891b7eSNickeau } 157*5f891b7eSNickeau 158*5f891b7eSNickeau } 159*5f891b7eSNickeau 160*5f891b7eSNickeau function handleAnonymousJsIndicator(&$event, $param) 161*5f891b7eSNickeau { 162*5f891b7eSNickeau 163*5f891b7eSNickeau global $JSINFO; 164*5f891b7eSNickeau $JSINFO[PageProtection::JS_IS_PUBLIC_NAVIGATION_INDICATOR] = !Auth::isLoggedIn(); 165*5f891b7eSNickeau 166*5f891b7eSNickeau 167*5f891b7eSNickeau } 168*5f891b7eSNickeau 169*5f891b7eSNickeau} 170