sqlite) { /** @var helper_plugin_approve_db $db_helper */ $db_helper = plugin_load('helper', 'approve_db'); $this->sqlite = $db_helper->getDB(); } return $this->sqlite; } /** * @return helper_plugin_approve */ protected function helper() { if (!$this->helper) { $helper = plugin_load('helper', 'approve'); $this->helper = $helper; } return $this->helper; } /** * @param Doku_Event_Handler $controller */ public function register(Doku_Event_Handler $controller) { $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept'); $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev'); $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve'); $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer'); $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner'); $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); } /** * @param Doku_Event $event */ public function handle_diff_accept(Doku_Event $event) { global $INFO; if (!$this->helper()->use_approve_here($INFO['id'])) return; if ($event->data == 'diff' && isset($_GET['approve'])) { $href = wl($INFO['id'], ['approve' => 'approve']); ptln(''.$this->getLang('approve').''); } if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) { $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']); ptln(''.$this->getLang('approve').''); } } /** * @param Doku_Event $event */ public function handle_showrev(Doku_Event $event) { global $INFO; if (!$this->helper()->use_approve_here($INFO['id'])) return; $last_approved_rev = $this->helper()->find_last_approved($INFO['id']); if ($last_approved_rev == $INFO['rev']) { $event->preventDefault(); } } /** * @param Doku_Event $event */ public function handle_approve(Doku_Event $event) { global $INFO; if (!$this->helper()->use_approve_here($INFO['id'])) return; if ($event->data == 'show' && isset($_GET['approve']) && auth_quickaclcheck($INFO['id']) >= AUTH_DELETE) { $res = $this->sqlite()->query('SELECT MAX(version)+1 FROM revision WHERE page=?', $INFO['id']); $next_version = $this->sqlite()->res2single($res); if (!$next_version) { $next_version = 1; } //approved IS NULL prevents from overriding already approved page $this->sqlite()->query('UPDATE revision SET approved=?, version=? WHERE page=? AND current=1 AND approved IS NULL', date('c'), $next_version, $INFO['id']); header('Location: ' . wl($INFO['id'])); } elseif ($event->data == 'show' && isset($_GET['ready_for_approval']) && auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) { $this->sqlite()->query('UPDATE revision SET ready_for_approval=? WHERE page=? AND current=1 AND ready_for_approval IS NULL', date('c'), $INFO['id']); header('Location: ' . wl($INFO['id'])); } } /** * Redirect to newest approved page for user that don't have EDIT permission. * * @param Doku_Event $event */ public function handle_viewer(Doku_Event $event) { global $INFO; if ($event->data != 'show') return; //apply only to current page if (!$INFO['rev']) return; if (auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) return; if (!$this->helper()->use_approve_here($INFO['id'])) return; $last_approved_rev = $this->helper()->find_last_approved($INFO['id']); //no page is approved if (!$last_approved_rev) return; $last_change_date = @filemtime(wikiFN($INFO['id'])); //current page is approved if ($last_approved_rev == $last_change_date) return; header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev])); } /** * @param Doku_Event $event */ public function handle_display_banner(Doku_Event $event) { global $INFO; if ($event->data != 'show') return; if (!$INFO['exists']) return; if (!$this->helper()->use_approve_here($INFO['id'])) return; // $last_change_date = p_get_metadata($INFO['id'], 'last_change date'); $last_change_date = @filemtime(wikiFN($INFO['id'])); $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev']; $res = $this->sqlite()->query('SELECT ready_for_approval, approved, version FROM revision WHERE page=? AND rev=?', $INFO['id'], $rev); $approve = $this->sqlite()->res_fetch_assoc($res); $classes = []; if ($this->getConf('prettyprint')) { $classes[] = 'plugin__approve_noprint'; } if ($approve['approved']) { $classes[] = 'plugin__approve_green'; } elseif ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) { $classes[] = 'plugin__approve_ready'; } else { $classes[] = 'plugin__approve_red'; } ptln('