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