xref: /plugin/combo/action/pageprotection.php (revision 21913ab3235d516e2fa19c7e3929b555b3a2bda1)
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