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