1 <?php
2 /**
3  * DokuWiki Plugin do (Action Component)
4  *
5  * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6  * @author  Andreas Gohr <gohr@cosmocode.de>
7  * @author  Adrian Lang <lang@cosmocode.de>
8  * @author  Dominik Eckelmann <eckelmann@cosmocode.de>
9  */
10 
11 class action_plugin_do extends DokuWiki_Action_Plugin
12 {
13 
14     /**
15      * Register handlers for some event hooks
16      *
17      * @param Doku_Event_Handler $controller
18      */
19     public function register(Doku_Event_Handler $controller)
20     {
21         $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call');
22         $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_act_preprocess');
23         $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'handle_delete');
24         $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, '_adduser');
25     }
26 
27     /**
28      * @param Doku_Event $event event object by reference
29      * @param null       $param the parameters passed to register_hook when this handler was registered
30      */
31     public function _adduser(&$event, $param)
32     {
33         if (!isset($_SERVER['REMOTE_USER'])) {
34             return;
35         }
36         global $JSINFO;
37         /** @var helper_plugin_do $hlp */
38         $hlp = plugin_load('helper', 'do');
39         $JSINFO['plugin_do_user'] = $_SERVER['REMOTE_USER'];
40         $JSINFO['plugin_do_user_name'] = $hlp->getPrettyUser($_SERVER['REMOTE_USER']);
41         $JSINFO['plugin_do_user_clean'] = html_entity_decode(strip_tags($JSINFO['plugin_do_user_name']));
42     }
43 
44     /**
45      * @param Doku_Event $event event object by reference
46      * @param null       $param the parameters passed to register_hook when this handler was registered
47      *
48      * @return bool
49      */
50     public function handle_ajax_call(&$event, $param)
51     {
52         if ($event->data == 'plugin_do') { // FIXME: refactor this into early return and switch
53             // toggle status of a single task
54             global $INPUT;
55 
56             $event->preventDefault();
57             $event->stopPropagation();
58 
59             $id = cleanID($_REQUEST['do_page']);
60 
61             if (auth_quickaclcheck($id) < AUTH_EDIT) {
62                 if ($INPUT->server->has('REMOTE_USER')) {
63                     echo -2; //not allowed
64                 } else {
65                     echo -1; //not logged in
66                 }
67                 return;
68             }
69 
70             /** @var helper_plugin_do $hlp */
71             $hlp = plugin_load('helper', 'do');
72             $status = $hlp->toggleTaskStatus($id, $_REQUEST['do_md5'], $_REQUEST['do_commit']);
73 
74             // rerender the page
75             p_get_metadata($id, '', true);
76 
77             header('Content-Type: application/json; charset=utf-8');
78             echo json_encode($status);
79 
80         } elseif ($event->data == 'plugin_do_status') {
81             // read status for a bunch of tasks
82 
83             $event->preventDefault();
84             $event->stopPropagation();
85 
86             $page = cleanID($_REQUEST['do_page']);
87 
88             if (auth_quickaclcheck($page) < AUTH_READ) {
89                 $status = array();
90             } else {
91                 /** @var helper_plugin_do $hlp */
92                 $hlp = plugin_load('helper', 'do');
93                 $status = $hlp->getAllPageStatuses($page);
94             }
95 
96             header('Content-Type: application/json; charset=utf-8');
97             echo json_encode($status);
98         } elseif ($event->data === 'plugin_do_userTasksOverlay') {
99             $event->preventDefault();
100             $event->stopPropagation();
101 
102             global $INPUT;
103 
104             if (!$INPUT->server->has('REMOTE_USER')) {
105                 http_status(401, 'login required');
106                 return false;
107             }
108 
109             $user = $INPUT->server->str('REMOTE_USER');
110 
111             /** @var helper_plugin_do $hlp */
112             $hlp = plugin_load('helper', 'do');
113             $tasks = $hlp->loadTasks(array('status' => array('undone'), 'user' => $user));
114             /** @var syntax_plugin_do_dolist $syntax */
115             $syntax = plugin_load('syntax', 'do_dolist');
116             $html = $syntax->buildTasklistHTML($tasks, true, false);
117             header('Content-Type: text/html; charset=utf-8');
118             echo $html;
119         }
120     }
121 
122     /**
123      * @param Doku_Event $event event object by reference
124      * @param null       $param the parameters passed to register_hook when this handler was registered
125      *
126      * @return bool
127      */
128     public function handle_act_preprocess(&$event, $param)
129     {
130 
131         if ($event->data != 'plugin_do') {
132             return true;
133         }
134         global $INPUT;
135 
136         $pageid = cleanID($_REQUEST['do_page']);
137         $status = '';
138         if (auth_quickaclcheck($pageid) < AUTH_EDIT) {
139             $lvl = -1;
140             $key = 'notloggedin';
141             if ($INPUT->server->has('REMOTE_USER')) {
142                 $key = 'notallowed';
143             }
144         } else {
145             /** @var helper_plugin_do $hlp */
146             $hlp = plugin_load('helper', 'do');
147             $status = $hlp->toggleTaskStatus($pageid, $_REQUEST['do_md5']);
148             if ($status == -2) {
149                 $lvl = -1;
150                 $key = 'notallowed';
151             } else {
152                 $lvl = 1;
153                 if ($status) {
154                     $key = 'done';
155                 } else {
156                     $key = 'open';
157                 }
158             }
159 
160         }
161 
162         $jslang = $this->getLang('js');
163         msg(sprintf($jslang[$key], $status), $lvl);
164 
165         global $ACT;
166         $ACT = 'show';
167         return true;
168     }
169 
170     /**
171      * Delete all tasks associated with a page from database, if all have been removed from the page
172      *
173      * @param Doku_Event $event event object by reference
174      * @param null       $param the parameters passed to register_hook when this handler was registered
175      */
176     public function handle_delete(&$event, $param)
177     {
178         if (preg_match('/<do[^>]*>.*<\/do>/i', $event->data[0][1])) {
179             // Only run if all tasks where removed from the page, partial removes are handled in \syntax_plugin_do_do::_save
180             return;
181         }
182         $namespace = $event->data[1] ? $event->data[1] . ':' : '';
183         $id = $namespace . $event->data[2];
184         if (isset($this->run[$id])) {
185             // Only execute on the first run
186             return;
187         }
188 
189         /** @var helper_plugin_do $hlp */
190         $hlp = plugin_load('helper', 'do');
191         $hlp->cleanPageTasks($id);
192         $this->run[$id] = true;
193     }
194 
195 }
196 
197