1*c3437056SNickeau<?php 2*c3437056SNickeau 3*c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 4*c3437056SNickeau 5*c3437056SNickeauuse ComboStrap\Index; 6*c3437056SNickeauuse ComboStrap\LogUtility; 7*c3437056SNickeauuse ComboStrap\Message; 8*c3437056SNickeauuse ComboStrap\PagesIndex; 9*c3437056SNickeauuse dokuwiki\Extension\ActionPlugin; 10*c3437056SNickeau 11*c3437056SNickeau 12*c3437056SNickeau/** 13*c3437056SNickeau * 14*c3437056SNickeau * To show a message after redirection or rewriting 15*c3437056SNickeau * 16*c3437056SNickeau * 17*c3437056SNickeau * 18*c3437056SNickeau */ 19*c3437056SNickeauclass action_plugin_combo_routermessage extends ActionPlugin 20*c3437056SNickeau{ 21*c3437056SNickeau 22*c3437056SNickeau // a class can not start with a number then webcomponent is not a valid class name 23*c3437056SNickeau const REDIRECT_MANAGER_BOX_CLASS = "redirect-manager"; 24*c3437056SNickeau 25*c3437056SNickeau // Property key 26*c3437056SNickeau const ORIGIN_PAGE = 'redirectId'; 27*c3437056SNickeau const ORIGIN_TYPE = 'redirectOrigin'; 28*c3437056SNickeau const CONF_SHOW_PAGE_NAME_IS_NOT_UNIQUE = 'ShowPageNameIsNotUnique'; 29*c3437056SNickeau 30*c3437056SNickeau function __construct() 31*c3437056SNickeau { 32*c3437056SNickeau // enable direct access to language strings 33*c3437056SNickeau // ie $this->lang 34*c3437056SNickeau $this->setupLocale(); 35*c3437056SNickeau } 36*c3437056SNickeau 37*c3437056SNickeau /** 38*c3437056SNickeau * 39*c3437056SNickeau * Return the message properties from a query string 40*c3437056SNickeau * 41*c3437056SNickeau * An internal HTTP redirect pass them via query string 42*c3437056SNickeau */ 43*c3437056SNickeau private static function getMessageQueryStringProperties(): array 44*c3437056SNickeau { 45*c3437056SNickeau 46*c3437056SNickeau $returnValues = array(); 47*c3437056SNickeau 48*c3437056SNickeau global $INPUT; 49*c3437056SNickeau $origin = $INPUT->str(self::ORIGIN_PAGE, null); 50*c3437056SNickeau if ($origin != null) { 51*c3437056SNickeau $returnValues = array( 52*c3437056SNickeau $origin, 53*c3437056SNickeau $INPUT->str(self::ORIGIN_TYPE, null) 54*c3437056SNickeau ); 55*c3437056SNickeau } 56*c3437056SNickeau return $returnValues; 57*c3437056SNickeau 58*c3437056SNickeau } 59*c3437056SNickeau 60*c3437056SNickeau 61*c3437056SNickeau function register(Doku_Event_Handler $controller) 62*c3437056SNickeau { 63*c3437056SNickeau 64*c3437056SNickeau /* This will call the function _displayRedirectMessage */ 65*c3437056SNickeau $controller->register_hook( 66*c3437056SNickeau 'TPL_ACT_RENDER', 67*c3437056SNickeau 'BEFORE', 68*c3437056SNickeau $this, 69*c3437056SNickeau '_displayRedirectMessage', 70*c3437056SNickeau array() 71*c3437056SNickeau ); 72*c3437056SNickeau 73*c3437056SNickeau 74*c3437056SNickeau } 75*c3437056SNickeau 76*c3437056SNickeau 77*c3437056SNickeau /** 78*c3437056SNickeau * Main function; dispatches the visual comment actions 79*c3437056SNickeau * @param $event Doku_Event 80*c3437056SNickeau */ 81*c3437056SNickeau function _displayRedirectMessage(&$event, $param) 82*c3437056SNickeau { 83*c3437056SNickeau 84*c3437056SNickeau 85*c3437056SNickeau $pageIdOrigin = null; 86*c3437056SNickeau $redirectSource = null; 87*c3437056SNickeau 88*c3437056SNickeau 89*c3437056SNickeau $messageQueryStringProperties = self::getMessageQueryStringProperties(); 90*c3437056SNickeau if (!empty($messageQueryStringProperties)) { 91*c3437056SNickeau list($pageIdOrigin, $redirectSource) = $messageQueryStringProperties; 92*c3437056SNickeau } 93*c3437056SNickeau 94*c3437056SNickeau if ($pageIdOrigin) { 95*c3437056SNickeau 96*c3437056SNickeau switch ($redirectSource) { 97*c3437056SNickeau 98*c3437056SNickeau case action_plugin_combo_router::TARGET_ORIGIN_PAGE_RULES: 99*c3437056SNickeau $message = Message::createInfoMessage() 100*c3437056SNickeau ->addHtmlContent("<p>" . sprintf($this->getLang('message_redirected_by_redirect'), hsc($pageIdOrigin)) . "</p>"); 101*c3437056SNickeau break; 102*c3437056SNickeau 103*c3437056SNickeau case action_plugin_combo_router::TARGET_ORIGIN_START_PAGE: 104*c3437056SNickeau $message = Message::createWarningMessage() 105*c3437056SNickeau ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_startpage'], hsc($pageIdOrigin)) . "</p>"); 106*c3437056SNickeau break; 107*c3437056SNickeau 108*c3437056SNickeau case action_plugin_combo_router::TARGET_ORIGIN_BEST_PAGE_NAME: 109*c3437056SNickeau $message = Message::createWarningMessage() 110*c3437056SNickeau ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_bestpagename'], hsc($pageIdOrigin)) . "</p>"); 111*c3437056SNickeau break; 112*c3437056SNickeau 113*c3437056SNickeau case action_plugin_combo_router::TARGET_ORIGIN_BEST_NAMESPACE: 114*c3437056SNickeau $message = Message::createWarningMessage() 115*c3437056SNickeau ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_bestnamespace'], hsc($pageIdOrigin)) . "</p>"); 116*c3437056SNickeau break; 117*c3437056SNickeau 118*c3437056SNickeau case action_plugin_combo_router::TARGET_ORIGIN_SEARCH_ENGINE: 119*c3437056SNickeau $message = Message::createWarningMessage() 120*c3437056SNickeau ->addHtmlContent("<p>" . sprintf($this->lang['message_redirected_to_searchengine'], hsc($pageIdOrigin)) . "</p>"); 121*c3437056SNickeau break; 122*c3437056SNickeau 123*c3437056SNickeau case action_plugin_combo_router::GO_TO_EDIT_MODE: 124*c3437056SNickeau $message = Message::createInfoMessage() 125*c3437056SNickeau ->addHtmlContent("<p>" . $this->lang['message_redirected_to_edit_mode'] . "</p>"); 126*c3437056SNickeau break; 127*c3437056SNickeau case action_plugin_combo_router::TARGET_ORIGIN_PERMALINK_EXTENDED: 128*c3437056SNickeau case action_plugin_combo_router::TARGET_ORIGIN_PERMALINK: 129*c3437056SNickeau $message = Message::createInfoMessage() 130*c3437056SNickeau ->addHtmlContent("<p>" . $this->lang['message_redirected_from_permalink'] . "</p>"); 131*c3437056SNickeau break; 132*c3437056SNickeau default: 133*c3437056SNickeau LogUtility::msg("The redirection source ($redirectSource) is unknown. It was not expected", LogUtility::LVL_MSG_ERROR, action_plugin_combo_router::CANONICAL); 134*c3437056SNickeau return; 135*c3437056SNickeau 136*c3437056SNickeau } 137*c3437056SNickeau 138*c3437056SNickeau 139*c3437056SNickeau // Add a list of page with the same name to the message 140*c3437056SNickeau // if the redirections is not planned 141*c3437056SNickeau if ($redirectSource != action_plugin_combo_router::TARGET_ORIGIN_PAGE_RULES) { 142*c3437056SNickeau $this->addToMessagePagesWithSameName($message, $pageIdOrigin); 143*c3437056SNickeau } 144*c3437056SNickeau 145*c3437056SNickeau if ($event->data === 'show' || $event->data === 'edit' || $event->data === 'search') { 146*c3437056SNickeau $html = $message 147*c3437056SNickeau ->setPlugin($this) 148*c3437056SNickeau ->setClass(action_plugin_combo_routermessage::REDIRECT_MANAGER_BOX_CLASS) 149*c3437056SNickeau ->setCanonical(action_plugin_combo_router::CANONICAL) 150*c3437056SNickeau ->setSignatureName(action_plugin_combo_router::URL_MANAGER_NAME) 151*c3437056SNickeau ->toHtmlBox(); 152*c3437056SNickeau ptln($html); 153*c3437056SNickeau } 154*c3437056SNickeau 155*c3437056SNickeau 156*c3437056SNickeau } 157*c3437056SNickeau 158*c3437056SNickeau 159*c3437056SNickeau } 160*c3437056SNickeau 161*c3437056SNickeau 162*c3437056SNickeau /** 163*c3437056SNickeau * Add the page with the same page name but in an other location 164*c3437056SNickeau * @param Message $message 165*c3437056SNickeau * @param $pageIdOrigin 166*c3437056SNickeau */ 167*c3437056SNickeau function addToMessagePagesWithSameName(Message $message, $pageIdOrigin) 168*c3437056SNickeau { 169*c3437056SNickeau 170*c3437056SNickeau if ($this->getConf(self::CONF_SHOW_PAGE_NAME_IS_NOT_UNIQUE) == 1) { 171*c3437056SNickeau 172*c3437056SNickeau global $ID; 173*c3437056SNickeau // The page name 174*c3437056SNickeau $pageName = noNS($pageIdOrigin); 175*c3437056SNickeau $pagesWithSameName = Index::getOrCreate()->getPagesWithSameLastName($pageIdOrigin); 176*c3437056SNickeau 177*c3437056SNickeau if (count($pagesWithSameName) > 0) { 178*c3437056SNickeau 179*c3437056SNickeau $message->setType(Message::TYPE_WARNING); 180*c3437056SNickeau 181*c3437056SNickeau // Assign the value to a variable to be able to use the construct .= 182*c3437056SNickeau if ($message->getPlainTextContent() <> '') { 183*c3437056SNickeau $message->addHtmlContent('<br/><br/>'); 184*c3437056SNickeau } 185*c3437056SNickeau $message->addHtmlContent($this->lang['message_pagename_exist_one']); 186*c3437056SNickeau $message->addHtmlContent('<ul>'); 187*c3437056SNickeau 188*c3437056SNickeau $i = 0; 189*c3437056SNickeau foreach ($pagesWithSameName as $pageId => $title) { 190*c3437056SNickeau if ($pageId === $ID) { 191*c3437056SNickeau continue; 192*c3437056SNickeau } 193*c3437056SNickeau $i++; 194*c3437056SNickeau if ($i > 10) { 195*c3437056SNickeau $message->addHtmlContent('<li>' . 196*c3437056SNickeau tpl_link( 197*c3437056SNickeau wl($pageIdOrigin) . "?do=search&q=" . rawurldecode($pageName), 198*c3437056SNickeau "More ...", 199*c3437056SNickeau 'class="" rel="nofollow" title="More..."', 200*c3437056SNickeau $return = true 201*c3437056SNickeau ) . '</li>'); 202*c3437056SNickeau break; 203*c3437056SNickeau } 204*c3437056SNickeau if ($title == null) { 205*c3437056SNickeau $title = $pageId; 206*c3437056SNickeau } 207*c3437056SNickeau $message->addHtmlContent('<li>' . 208*c3437056SNickeau tpl_link( 209*c3437056SNickeau wl($pageId), 210*c3437056SNickeau $title, 211*c3437056SNickeau 'class="" rel="nofollow" title="' . $title . '"', 212*c3437056SNickeau $return = true 213*c3437056SNickeau ) . '</li>'); 214*c3437056SNickeau } 215*c3437056SNickeau $message->addHtmlContent('</ul>'); 216*c3437056SNickeau } 217*c3437056SNickeau } 218*c3437056SNickeau } 219*c3437056SNickeau 220*c3437056SNickeau 221*c3437056SNickeau /** 222*c3437056SNickeau * Set the redirect in a session that will be be read after the redirect 223*c3437056SNickeau * in order to show a message to the user 224*c3437056SNickeau * @param string $id 225*c3437056SNickeau * @param string $redirectSource 226*c3437056SNickeau */ 227*c3437056SNickeau static function notify($id, $redirectSource) 228*c3437056SNickeau { 229*c3437056SNickeau // Msg via session 230*c3437056SNickeau if (!defined('NOSESSION')) { 231*c3437056SNickeau //reopen session, store data and close session again 232*c3437056SNickeau self::sessionStart(); 233*c3437056SNickeau $_SESSION[DOKU_COOKIE][self::ORIGIN_PAGE] = $id; 234*c3437056SNickeau $_SESSION[DOKU_COOKIE][self::ORIGIN_TYPE] = $redirectSource; 235*c3437056SNickeau self::sessionClose(); 236*c3437056SNickeau 237*c3437056SNickeau } 238*c3437056SNickeau } 239*c3437056SNickeau 240*c3437056SNickeau 241*c3437056SNickeau private static function sessionStart() 242*c3437056SNickeau { 243*c3437056SNickeau $sessionStatus = session_status(); 244*c3437056SNickeau switch ($sessionStatus) { 245*c3437056SNickeau case PHP_SESSION_DISABLED: 246*c3437056SNickeau throw new RuntimeException("Sessions are disabled"); 247*c3437056SNickeau 248*c3437056SNickeau case PHP_SESSION_NONE: 249*c3437056SNickeau $result = @session_start(); 250*c3437056SNickeau if (!$result) { 251*c3437056SNickeau throw new RuntimeException("The session was not successfully started"); 252*c3437056SNickeau } 253*c3437056SNickeau break; 254*c3437056SNickeau case PHP_SESSION_ACTIVE: 255*c3437056SNickeau break; 256*c3437056SNickeau } 257*c3437056SNickeau } 258*c3437056SNickeau 259*c3437056SNickeau private static function sessionClose() 260*c3437056SNickeau { 261*c3437056SNickeau // Close the session 262*c3437056SNickeau $phpVersion = phpversion(); 263*c3437056SNickeau if ($phpVersion > "7.2.0") { 264*c3437056SNickeau /** @noinspection PhpVoidFunctionResultUsedInspection */ 265*c3437056SNickeau $result = session_write_close(); 266*c3437056SNickeau if (!$result) { 267*c3437056SNickeau // Session is really not a well known mechanism 268*c3437056SNickeau // Set this error in a info level to not fail the test 269*c3437056SNickeau LogUtility::msg("Failure to write the session", LogUtility::LVL_MSG_INFO); 270*c3437056SNickeau } 271*c3437056SNickeau } else { 272*c3437056SNickeau session_write_close(); 273*c3437056SNickeau } 274*c3437056SNickeau 275*c3437056SNickeau } 276*c3437056SNickeau 277*c3437056SNickeau} 278