11aeb2b4dSghi<?php 21aeb2b4dSghi 31989ee26SSzymon Olewniczakuse dokuwiki\Extension\ActionPlugin; 41989ee26SSzymon Olewniczakuse dokuwiki\Extension\EventHandler; 51989ee26SSzymon Olewniczakuse dokuwiki\Extension\Event; 61aeb2b4dSghi 71989ee26SSzymon Olewniczakclass action_plugin_approve_approve extends ActionPlugin { 81b552e87SSzymon Olewniczak /** 91989ee26SSzymon Olewniczak * @inheritDoc 104474ed8aSSzymon Olewniczak */ 111989ee26SSzymon Olewniczak public function register(EventHandler $controller) { 124474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept'); 134474ed8aSSzymon Olewniczak $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev'); 144474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve'); 1507b13373SSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_mark_ready_for_approval'); 164474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer'); 174474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner'); 1855f447f4SSzymon Olewniczak $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 191aeb2b4dSghi } 201aeb2b4dSghi 214474ed8aSSzymon Olewniczak /** 221989ee26SSzymon Olewniczak * @param Event $event 234474ed8aSSzymon Olewniczak */ 241989ee26SSzymon Olewniczak public function handle_diff_accept(Event $event) { 254474ed8aSSzymon Olewniczak global $INFO; 264474ed8aSSzymon Olewniczak 271989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 281989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 290c60a293SSzymon Olewniczak 301989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 3150481663SSzymon Olewniczak 321aeb2b4dSghi if ($event->data == 'diff' && isset($_GET['approve'])) { 334474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['approve' => 'approve']); 34b59355cdSSzymon Olewniczak echo '<a href="' . $href . '">'.$this->getLang('approve').'</a>'; 351aeb2b4dSghi } 3684047bdaSRuud 374474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) { 384474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']); 39b59355cdSSzymon Olewniczak echo '<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>'; 4084047bdaSRuud } 411aeb2b4dSghi } 421aeb2b4dSghi 434474ed8aSSzymon Olewniczak /** 441989ee26SSzymon Olewniczak * @param Event $event 454474ed8aSSzymon Olewniczak */ 461989ee26SSzymon Olewniczak public function handle_showrev(Event $event) { 474474ed8aSSzymon Olewniczak global $INFO; 481aeb2b4dSghi 49b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 50b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 511989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 521989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 534474ed8aSSzymon Olewniczak 541989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 550c60a293SSzymon Olewniczak 561989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 574474ed8aSSzymon Olewniczak if ($last_approved_rev == $INFO['rev']) { 581aeb2b4dSghi $event->preventDefault(); 591aeb2b4dSghi } 601aeb2b4dSghi } 611aeb2b4dSghi 624474ed8aSSzymon Olewniczak /** 631989ee26SSzymon Olewniczak * @param Event $event 644474ed8aSSzymon Olewniczak */ 651989ee26SSzymon Olewniczak public function handle_approve(Event $event) { 664474ed8aSSzymon Olewniczak global $INFO; 674474ed8aSSzymon Olewniczak 681989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 691989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 700c60a293SSzymon Olewniczak 7107b13373SSzymon Olewniczak if ($event->data != 'show') return; 7207b13373SSzymon Olewniczak if (!isset($_GET['approve'])) return; 731989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 741989ee26SSzymon Olewniczak if (!$acl->clientCanApprove($INFO['id'])) return; 754474ed8aSSzymon Olewniczak 76b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 77b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 781989ee26SSzymon Olewniczak $db->setApprovedStatus($INFO['id']); 7984047bdaSRuud 804474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 8107b13373SSzymon Olewniczak } 8207b13373SSzymon Olewniczak 8307b13373SSzymon Olewniczak /** 841989ee26SSzymon Olewniczak * @param Event $event 8507b13373SSzymon Olewniczak */ 861989ee26SSzymon Olewniczak public function handle_mark_ready_for_approval(Event $event) { 8707b13373SSzymon Olewniczak global $INFO; 8807b13373SSzymon Olewniczak 891989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 901989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 910c60a293SSzymon Olewniczak 9207b13373SSzymon Olewniczak if ($event->data != 'show') return; 9307b13373SSzymon Olewniczak if (!isset($_GET['ready_for_approval'])) return; 941989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 951989ee26SSzymon Olewniczak if (!$acl->clientCanMarkReadyForApproval($INFO['id'])) return; 9650481663SSzymon Olewniczak 97b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 98b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 991989ee26SSzymon Olewniczak $db->setReadyForApprovalStatus($INFO['id']); 10050481663SSzymon Olewniczak 1014474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 1021aeb2b4dSghi } 10355f447f4SSzymon Olewniczak 1044474ed8aSSzymon Olewniczak /** 1051989ee26SSzymon Olewniczak * Redirect to latest approved page for user that don't have EDIT permission. 1064474ed8aSSzymon Olewniczak * 1071989ee26SSzymon Olewniczak * @param Event $event 1084474ed8aSSzymon Olewniczak */ 1091989ee26SSzymon Olewniczak public function handle_viewer(Event $event) { 1104474ed8aSSzymon Olewniczak global $INFO; 1114474ed8aSSzymon Olewniczak 1121989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 1131989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 1140c60a293SSzymon Olewniczak 11538d03fbdSghi if ($event->data != 'show') return; 1164474ed8aSSzymon Olewniczak //apply only to current page 117c7d53eabSSzymon Olewniczak if ($INFO['rev'] != 0) return; 1181989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 1191989ee26SSzymon Olewniczak if ($acl->clientCanSeeDrafts($INFO['id'])) return; 1201aeb2b4dSghi 121b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 122b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 1231989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 1241989ee26SSzymon Olewniczak 12538d03fbdSghi //no page is approved 1264474ed8aSSzymon Olewniczak if (!$last_approved_rev) return; 12738d03fbdSghi 1284474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 1294474ed8aSSzymon Olewniczak // current page is approved 1304474ed8aSSzymon Olewniczak if ($last_approved_rev == $last_change_date) return; 1314474ed8aSSzymon Olewniczak 132de24d3c4SSzymon Olewniczak header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev], false, '&')); 1331aeb2b4dSghi } 13455f447f4SSzymon Olewniczak 1354474ed8aSSzymon Olewniczak /** 1361989ee26SSzymon Olewniczak * @param Event $event 1374474ed8aSSzymon Olewniczak */ 1381989ee26SSzymon Olewniczak public function handle_display_banner(Event $event) { 1391989ee26SSzymon Olewniczak global $INFO; 140bab76148SSzymon Olewniczak 141*3c40d78bSSzymon Olewniczak if ($event->data != 'show' || !$INFO['exists']) return; 142*3c40d78bSSzymon Olewniczak 143*3c40d78bSSzymon Olewniczak /* Return true if banner should not be displayed for users with or below read only permission. */ 144*3c40d78bSSzymon Olewniczak if (auth_quickaclcheck($INFO['id']) <= AUTH_READ && !$this->getConf('display_banner_for_readonly')) { 145*3c40d78bSSzymon Olewniczak return; 146*3c40d78bSSzymon Olewniczak } 147*3c40d78bSSzymon Olewniczak 1481989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 1491989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 1501989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 151329c5e3aSMartin Diedrich 1524474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 1534474ed8aSSzymon Olewniczak $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev']; 1541aeb2b4dSghi 15555f447f4SSzymon Olewniczak 156b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 157b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 1584474ed8aSSzymon Olewniczak 1591989ee26SSzymon Olewniczak $page_revision = $db->getPageRevision($INFO['id'], $rev); 1601989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 1614474ed8aSSzymon Olewniczak 1624474ed8aSSzymon Olewniczak $classes = []; 1631989ee26SSzymon Olewniczak if ($page_revision['status'] == 'approved' && $rev == $last_approved_rev) { 16415e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_approved'; 1651989ee26SSzymon Olewniczak } elseif ($page_revision['status'] == 'approved') { 16615e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_old_approved'; 1671989ee26SSzymon Olewniczak } elseif ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') { 168bab76148SSzymon Olewniczak $classes[] = 'plugin__approve_ready'; 16955f447f4SSzymon Olewniczak } else { 17015e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_draft'; 17155f447f4SSzymon Olewniczak } 17255f447f4SSzymon Olewniczak 173b59355cdSSzymon Olewniczak echo '<div id="plugin__approve" class="' . implode(' ', $classes) . '">'; 1741aeb2b4dSghi 175af3e3cd8SSzymon Olewniczak 1761989ee26SSzymon Olewniczak if ($page_revision['status'] == 'approved') { 177b59355cdSSzymon Olewniczak echo '<strong>'.$this->getLang('approved').'</strong>'; 178b59355cdSSzymon Olewniczak echo ' ' . dformat(strtotime($page_revision['approved'])); 179329c5e3aSMartin Diedrich 180329c5e3aSMartin Diedrich if($this->getConf('banner_long')) { 181b59355cdSSzymon Olewniczak echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true); 182b59355cdSSzymon Olewniczak echo ' (' . $this->getLang('version') . ': ' . $page_revision['version'] . ')'; 183329c5e3aSMartin Diedrich } 1844474ed8aSSzymon Olewniczak 1854474ed8aSSzymon Olewniczak //not the newest page 1864474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 1874474ed8aSSzymon Olewniczak // we can see drafts 1881989ee26SSzymon Olewniczak if ($acl->clientCanSeeDrafts($INFO['id'])) { 189b59355cdSSzymon Olewniczak echo ' <a href="' . wl($INFO['id']) . '">'; 190b59355cdSSzymon Olewniczak echo $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft'); 191b59355cdSSzymon Olewniczak echo '</a>'; 192c7d53eabSSzymon Olewniczak // we cannot see link to draft but there is some newer approved version 1931989ee26SSzymon Olewniczak } elseif ($last_approved_rev != $rev) { 1944474ed8aSSzymon Olewniczak $urlParameters = []; 1951989ee26SSzymon Olewniczak if ($last_approved_rev != $last_change_date) { 1961989ee26SSzymon Olewniczak $urlParameters['rev'] = $last_approved_rev; 1974474ed8aSSzymon Olewniczak } 198b59355cdSSzymon Olewniczak echo ' <a href="' . wl($INFO['id'], $urlParameters) . '">'; 199b59355cdSSzymon Olewniczak echo $this->getLang('newest_approved'); 200b59355cdSSzymon Olewniczak echo '</a>'; 2011aeb2b4dSghi } 2024474ed8aSSzymon Olewniczak } 2034474ed8aSSzymon Olewniczak 2041aeb2b4dSghi } else { 2051989ee26SSzymon Olewniczak if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') { 206b59355cdSSzymon Olewniczak echo '<strong>'.$this->getLang('marked_approve_ready').'</strong>'; 207b59355cdSSzymon Olewniczak echo ' ' . dformat(strtotime($page_revision['ready_for_approval'])); 208b59355cdSSzymon Olewniczak echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true); 209c7d53eabSSzymon Olewniczak } else { 210b59355cdSSzymon Olewniczak echo '<strong>'.$this->getLang('draft').'</strong>'; 21184047bdaSRuud } 21284047bdaSRuud 2134474ed8aSSzymon Olewniczak // not exists approve for current page 2141989ee26SSzymon Olewniczak if ($last_approved_rev == null) { 2154474ed8aSSzymon Olewniczak // not the newest page 2164474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 217b59355cdSSzymon Olewniczak echo ' <a href="'.wl($INFO['id']).'">'; 218b59355cdSSzymon Olewniczak echo $this->getLang('newest_draft'); 219b59355cdSSzymon Olewniczak echo '</a>'; 220274d699aSghi } 221274d699aSghi } else { 2224474ed8aSSzymon Olewniczak $urlParameters = []; 2231989ee26SSzymon Olewniczak if ($last_approved_rev != $last_change_date) { 2241989ee26SSzymon Olewniczak $urlParameters['rev'] = $last_approved_rev; 2254474ed8aSSzymon Olewniczak } 226b59355cdSSzymon Olewniczak echo ' <a href="' . wl($INFO['id'], $urlParameters) . '">'; 227b59355cdSSzymon Olewniczak echo $this->getLang('newest_approved'); 228b59355cdSSzymon Olewniczak echo '</a>'; 2291aeb2b4dSghi } 2301aeb2b4dSghi 2314474ed8aSSzymon Olewniczak //we are in current page 2324474ed8aSSzymon Olewniczak if ($rev == $last_change_date) { 2334474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && 2341989ee26SSzymon Olewniczak $acl->clientCanMarkReadyForApproval($INFO['id']) && 2351989ee26SSzymon Olewniczak $page_revision['status'] != 'ready_for_approval') { 2364474ed8aSSzymon Olewniczak 2374474ed8aSSzymon Olewniczak $urlParameters = [ 2384474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 2394474ed8aSSzymon Olewniczak 'do' => 'diff', 2404474ed8aSSzymon Olewniczak 'ready_for_approval' => 'ready_for_approval' 2414474ed8aSSzymon Olewniczak ]; 242b59355cdSSzymon Olewniczak echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">'; 243b59355cdSSzymon Olewniczak echo $this->getLang('approve_ready'); 244b59355cdSSzymon Olewniczak echo '</a>'; 24584047bdaSRuud } 24684047bdaSRuud 2471989ee26SSzymon Olewniczak if ($acl->clientCanApprove($INFO['id'])) { 2484474ed8aSSzymon Olewniczak $urlParameters = [ 2494474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 2504474ed8aSSzymon Olewniczak 'do' => 'diff', 2514474ed8aSSzymon Olewniczak 'approve' => 'approve' 2524474ed8aSSzymon Olewniczak ]; 253b59355cdSSzymon Olewniczak echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">'; 254b59355cdSSzymon Olewniczak echo $this->getLang('approve'); 255b59355cdSSzymon Olewniczak echo '</a>'; 2561aeb2b4dSghi } 257c7d53eabSSzymon Olewniczak } 258c7d53eabSSzymon Olewniczak } 25984047bdaSRuud 2601989ee26SSzymon Olewniczak if (isset($page_metadata['approver']) & $this->getConf('banner_long')) { 261b59355cdSSzymon Olewniczak echo ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true); 2624474ed8aSSzymon Olewniczak } 263c7d53eabSSzymon Olewniczak 264b59355cdSSzymon Olewniczak echo '</div>'; 2651aeb2b4dSghi } 2661aeb2b4dSghi 267af3e3cd8SSzymon Olewniczak /** 2684474ed8aSSzymon Olewniczak * 2691989ee26SSzymon Olewniczak * @param Event $event 2704474ed8aSSzymon Olewniczak */ 2711989ee26SSzymon Olewniczak public function handle_pagesave_after(Event $event) { 2721b552e87SSzymon Olewniczak //no content was changed 2734474ed8aSSzymon Olewniczak if (!$event->data['contentChanged']) return; 2744474ed8aSSzymon Olewniczak 275b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 276b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 2774474ed8aSSzymon Olewniczak 2784474ed8aSSzymon Olewniczak $id = $event->data['id']; 2791989ee26SSzymon Olewniczak switch ($event->data['changeType']) { 2801989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_CREATE: 2814474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_EDIT: 2824474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_MINOR_EDIT: 2831989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_REVERT: 2841989ee26SSzymon Olewniczak $db->handlePageEdit($id); 2854474ed8aSSzymon Olewniczak break; 2864474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_DELETE: 2871989ee26SSzymon Olewniczak $db->handlePageDelete($id); 2884474ed8aSSzymon Olewniczak break; 2894474ed8aSSzymon Olewniczak } 2904474ed8aSSzymon Olewniczak } 2911aeb2b4dSghi} 292