17d101cc1SGerry Weißbach<?php 27d101cc1SGerry Weißbach 37d101cc1SGerry Weißbachif (!defined('DOKU_PLUGIN')) die('meh'); 47d101cc1SGerry Weißbachrequire_once(DOKU_PLUGIN . 'siteexport/inc/settings.php'); 57d101cc1SGerry Weißbachrequire_once(DOKU_PLUGIN . 'siteexport/inc/debug.php'); 67d101cc1SGerry Weißbach 709a16006SGerry Weißbachuse dokuwiki\File\PageResolver; 8*3fbe7663SGerry Weißbachuse dokuwiki\PassHash; 909a16006SGerry Weißbach 107d101cc1SGerry Weißbachclass siteexport_functions extends DokuWiki_Plugin 117d101cc1SGerry Weißbach{ 127d101cc1SGerry Weißbach public $debug = null; 137d101cc1SGerry Weißbach public $settings = null; 147d101cc1SGerry Weißbach 15b324a190SMichael Hamann public function __construct($init = true, $isAJAX = false) 167d101cc1SGerry Weißbach { 177d101cc1SGerry Weißbach if ($init) 187d101cc1SGerry Weißbach { 197d101cc1SGerry Weißbach $this->debug = new siteexport_debug(); 202270cdc5SGerry Weißbach $this->debug->isAJAX = $isAJAX; 212270cdc5SGerry Weißbach 227d101cc1SGerry Weißbach $this->settings = new settings_plugin_siteexport_settings($this); 237d101cc1SGerry Weißbach $this->debug->message("Settings completed: zipFile", $this->settings->zipFile, 1); 247d101cc1SGerry Weißbach } 257d101cc1SGerry Weißbach } 267d101cc1SGerry Weißbach 277d101cc1SGerry Weißbach public function getPluginName() 287d101cc1SGerry Weißbach { 297d101cc1SGerry Weißbach return 'siteexport'; 307d101cc1SGerry Weißbach } 317d101cc1SGerry Weißbach 327d101cc1SGerry Weißbach public function downloadURL() 337d101cc1SGerry Weißbach { 346792d0cfSGerry Weißbach $params = array('cache' => 'nocache', 'siteexport' => $this->settings->pattern); 356792d0cfSGerry Weißbach 366792d0cfSGerry Weißbach if ($this->debug->debugLevel() < 5) { 376792d0cfSGerry Weißbach // If debug, then debug! 386792d0cfSGerry Weißbach $params['debug'] = $this->debug->debugLevel(); 396792d0cfSGerry Weißbach } 406792d0cfSGerry Weißbach 416792d0cfSGerry Weißbach return ml($this->settings->origZipFile, $params, true, '&'); 427d101cc1SGerry Weißbach } 437d101cc1SGerry Weißbach 447d101cc1SGerry Weißbach public function checkIfCacheFileExistsForFileWithPattern($file, $pattern) 457d101cc1SGerry Weißbach { 467d101cc1SGerry Weißbach if (!@file_exists($file)) 477d101cc1SGerry Weißbach { 487d101cc1SGerry Weißbach // If the cache File does not exist, move the newly created one over ... 496792d0cfSGerry Weißbach $this->debug->message("'{$file}' does not exist. Checking original ZipFile", null, 3); 507d101cc1SGerry Weißbach $newCacheFile = mediaFN($this->getSpecialExportFileName($this->settings->origZipFile, $pattern)); 517d101cc1SGerry Weißbach 527d101cc1SGerry Weißbach if (!@file_exists($newCacheFile)) 537d101cc1SGerry Weißbach { 547d101cc1SGerry Weißbach $this->debug->message("The export must have gone wrong. The cached file does not exist.", array("pattern" => $pattern, "original File" => $this->settings->origZipFile, "expected cached file" => $newCacheFile), 3); 557d101cc1SGerry Weißbach } 567d101cc1SGerry Weißbach 577d101cc1SGerry Weißbach $status = io_rename($newCacheFile, $file); 587d101cc1SGerry Weißbach $this->debug->message("had to move another original file over. Did it work? " . ($status ? 'Yes, it did.' : 'No, it did not.'), null, 2); 596792d0cfSGerry Weißbach } else { 606792d0cfSGerry Weißbach $this->debug->message("The file does exist!", $file, 2); 617d101cc1SGerry Weißbach } 627d101cc1SGerry Weißbach } 637d101cc1SGerry Weißbach 647d101cc1SGerry Weißbach 657d101cc1SGerry Weißbach /** 667d101cc1SGerry Weißbach * Returns an utf8 encoded Namespace for a Page and input Namespace 677d101cc1SGerry Weißbach * @param $NS 687d101cc1SGerry Weißbach * @param $PAGE 697d101cc1SGerry Weißbach */ 70a8c17ab5Si-net /// software public function getNamespaceFromID($NS, &$PAGE) { 717d101cc1SGerry Weißbach global $conf; 727d101cc1SGerry Weißbach // Check current page - if its an NS add the startpage 7309a16006SGerry Weißbach $NS = (new PageResolver($NS))->resolveId($NS); 743aa0ad13SGerry Weißbach $NSa = explode(':', $NS); 753aa0ad13SGerry Weißbach if (!page_exists($NS) && array_pop($NSa) != strtolower($conf['start'])) { // Compare to lowercase since clean lowers it. 767d101cc1SGerry Weißbach $NS .= ':' . $conf['start']; 7709a16006SGerry Weißbach $NS = (new PageResolver($NS))->resolveId($NS); 787d101cc1SGerry Weißbach } 797d101cc1SGerry Weißbach 807d101cc1SGerry Weißbach $PAGE = noNS($NS); 817d101cc1SGerry Weißbach $NS = getNS($NS); 827d101cc1SGerry Weißbach 837d101cc1SGerry Weißbach return utf8_encodeFN(str_replace(':', '/', $NS)); 847d101cc1SGerry Weißbach } 857d101cc1SGerry Weißbach 867d101cc1SGerry Weißbach /** 877d101cc1SGerry Weißbach * create a file name for the page 887d101cc1SGerry Weißbach **/ 897d101cc1SGerry Weißbach public function getSiteName($ID, $overrideRewrite = false) { 907d101cc1SGerry Weißbach global $conf; 917d101cc1SGerry Weißbach 927d101cc1SGerry Weißbach if (empty($ID)) return false; 937d101cc1SGerry Weißbach 944c9a39daSGerry Weißbach // Remove extensions 954c9a39daSGerry Weißbach if ($overrideRewrite) { 96c6d15ed9SGerry Weißbach $ID = preg_replace("#\.(php|html)$#", '', $ID); 974c9a39daSGerry Weißbach } 984c9a39daSGerry Weißbach 997d101cc1SGerry Weißbach $url = $this->wl($this->cleanID($ID), null, true, null, null, $overrideRewrite); // this must be done with rewriting set to override 1007d101cc1SGerry Weißbach $uri = @parse_url($url); 1017d101cc1SGerry Weißbach if ($uri['path'][0] == '/') { 1027d101cc1SGerry Weißbach $uri['path'] = substr($uri['path'], 1); 1037d101cc1SGerry Weißbach } 1047d101cc1SGerry Weißbach 1057d101cc1SGerry Weißbach return $this->shortenName($uri['path'] . '.' . $this->settings->fileType); 1067d101cc1SGerry Weißbach } 1077d101cc1SGerry Weißbach 1087d101cc1SGerry Weißbach /** 1097d101cc1SGerry Weißbach * get the Title for the page 1107d101cc1SGerry Weißbach **/ 1117d101cc1SGerry Weißbach public function getSiteTitle($ID) { 1127d101cc1SGerry Weißbach if (useHeading('content') && $ID) { 113ffaab539SGerry Weißbach $heading = null; 114ffaab539SGerry Weißbach if (class_exists('siteexport_pdfgenerator')) { 115ffaab539SGerry Weißbach $heading = p_get_metadata(cleanID($ID),'pdftitle',METADATA_RENDER_USING_SIMPLE_CACHE); 116ffaab539SGerry Weißbach } 117ffaab539SGerry Weißbach $heading = empty($heading) ? p_get_metadata(cleanID($ID),'breadtitle',METADATA_RENDER_USING_SIMPLE_CACHE) : $heading; 118ffaab539SGerry Weißbach $heading = empty($heading) ? p_get_first_heading($ID, true) : $heading; 1197d101cc1SGerry Weißbach if ($heading) { 1207d101cc1SGerry Weißbach return $this->xmlEntities($heading); 1217d101cc1SGerry Weißbach } 1227d101cc1SGerry Weißbach } 123bca58ac1SGerry Weißbach $elements = explode(':', $ID); 124bca58ac1SGerry Weißbach return ucwords($this->xmlEntities(array_pop($elements))); 1257d101cc1SGerry Weißbach } 1267d101cc1SGerry Weißbach 1277d101cc1SGerry Weißbach /** 1287d101cc1SGerry Weißbach * Encoding ()taken from DW - but without needing the renderer 1297d101cc1SGerry Weißbach **/ 1307d101cc1SGerry Weißbach public function xmlEntities($string) { 1317d101cc1SGerry Weißbach return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 1327d101cc1SGerry Weißbach } 1337d101cc1SGerry Weißbach 1347d101cc1SGerry Weißbach /** 1357d101cc1SGerry Weißbach * Create name for the file inside the zip and the replacements 1367d101cc1SGerry Weißbach **/ 137a8c17ab5Si-net /// software public function shortenName($NAME) 1387d101cc1SGerry Weißbach { 1397d101cc1SGerry Weißbach $NS = $this->settings->exportNamespace; 140774a858aSGerry Weißbach $NAME = preg_replace("%^" . preg_quote(DOKU_BASE, '%') . "%", "", $NAME); 141774a858aSGerry Weißbach $NAME = preg_replace("%^((_media|_detail)/)?(" . preg_quote($NS, '%') . "/)?%", "", $NAME); 1427d101cc1SGerry Weißbach 1431701f03cSGerry Weißbach if (strstr($NAME, '%')) { $NAME = rawurldecode($NAME); } 1441701f03cSGerry Weißbach 1457d101cc1SGerry Weißbach $this->debug->message("Shortening file to '$NAME'", null, 1); 1467d101cc1SGerry Weißbach return $NAME; 1477d101cc1SGerry Weißbach } 1487d101cc1SGerry Weißbach 1497d101cc1SGerry Weißbach /** 1507d101cc1SGerry Weißbach * Remove unwanted chars from ID 1517d101cc1SGerry Weißbach * 1527d101cc1SGerry Weißbach * Cleans a given ID to only use allowed characters. Accented characters are 1537d101cc1SGerry Weißbach * converted to unaccented ones 1547d101cc1SGerry Weißbach * 1557d101cc1SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 1567d101cc1SGerry Weißbach * @param string $raw_id The pageid to clean 1577d101cc1SGerry Weißbach * @param boolean $ascii Force ASCII 1587d101cc1SGerry Weißbach * @param boolean $media Allow leading or trailing _ for media files 1597d101cc1SGerry Weißbach */ 160a8c17ab5Si-net /// software public function cleanID($raw_id, $ascii = false, $media = false) { 1617d101cc1SGerry Weißbach global $conf; 1627d101cc1SGerry Weißbach global $lang; 1637d101cc1SGerry Weißbach static $sepcharpat = null; 1647d101cc1SGerry Weißbach 1657d101cc1SGerry Weißbach global $cache_cleanid; 1667d101cc1SGerry Weißbach $cache = & $cache_cleanid; 1677d101cc1SGerry Weißbach 1687d101cc1SGerry Weißbach // check if it's already in the memory cache 1697d101cc1SGerry Weißbach if (isset($cache[(string) $raw_id])) { 1707d101cc1SGerry Weißbach return $cache[(string) $raw_id]; 1717d101cc1SGerry Weißbach } 1727d101cc1SGerry Weißbach 1737d101cc1SGerry Weißbach $sepchar = $conf['sepchar']; 1747d101cc1SGerry Weißbach if ($sepcharpat == null) // build string only once to save clock cycles 1757d101cc1SGerry Weißbach $sepcharpat = '#\\' . $sepchar . '+#'; 1767d101cc1SGerry Weißbach 1777d101cc1SGerry Weißbach $id = trim((string) $raw_id); 178a8c17ab5Si-net /// software // NO LowerCase for us! - Preserve it, that is why the call is missing here. 1797d101cc1SGerry Weißbach 1807d101cc1SGerry Weißbach //alternative namespace seperator 1817d101cc1SGerry Weißbach $id = strtr($id, ';', ':'); 1827d101cc1SGerry Weißbach if ($conf['useslash']) { 1837d101cc1SGerry Weißbach $id = strtr($id, '/', ':'); 1847d101cc1SGerry Weißbach } else { 1857d101cc1SGerry Weißbach $id = strtr($id, '/', $sepchar); 1867d101cc1SGerry Weißbach } 1877d101cc1SGerry Weißbach 1887d101cc1SGerry Weißbach if ($conf['deaccent'] == 2 || $ascii) $id = utf8_romanize($id); 1897d101cc1SGerry Weißbach if ($conf['deaccent'] || $ascii) $id = utf8_deaccent($id, -1); 1907d101cc1SGerry Weißbach 1915a843d1fSGerry Weißbach // We want spaces to be preserved when they are in the link. 1925a843d1fSGerry Weißbach global $UTF8_SPECIAL_CHARS2; 1935a843d1fSGerry Weißbach $UTF8_SPECIAL_CHARS2_SAVE = (string) $UTF8_SPECIAL_CHARS2; 1945a843d1fSGerry Weißbach $UTF8_SPECIAL_CHARS2 = str_replace(' ', '', $UTF8_SPECIAL_CHARS2); 1955a843d1fSGerry Weißbach 1967d101cc1SGerry Weißbach //remove specials 1977d101cc1SGerry Weißbach $id = utf8_stripspecials($id, $sepchar, '\*'); 1985a843d1fSGerry Weißbach $UTF8_SPECIAL_CHARS2 = $UTF8_SPECIAL_CHARS2_SAVE; 1997d101cc1SGerry Weißbach 2007d101cc1SGerry Weißbach if ($ascii) $id = utf8_strip($id); 2017d101cc1SGerry Weißbach 2027d101cc1SGerry Weißbach //clean up 2037d101cc1SGerry Weißbach $id = preg_replace($sepcharpat, $sepchar, $id); 2047d101cc1SGerry Weißbach $id = preg_replace('#:+#', ':', $id); 2057d101cc1SGerry Weißbach $id = ($media ? trim($id, ':.-') : trim($id, ':._-')); 2067d101cc1SGerry Weißbach $id = preg_replace('#:[:\._\-]+#', ':', $id); 2077d101cc1SGerry Weißbach 2087d101cc1SGerry Weißbach $cache[(string) $raw_id] = $id; 2097d101cc1SGerry Weißbach return($id); 2107d101cc1SGerry Weißbach } 2117d101cc1SGerry Weißbach 2127d101cc1SGerry Weißbach 2137d101cc1SGerry Weißbach /** 2147d101cc1SGerry Weißbach * This builds a link to a wikipage - changed for internal use here 2157d101cc1SGerry Weißbach * 2167d101cc1SGerry Weißbach * It handles URL rewriting and adds additional parameter if 2177d101cc1SGerry Weißbach * given in $more 2187d101cc1SGerry Weißbach * 2197d101cc1SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 2207d101cc1SGerry Weißbach */ 2217d101cc1SGerry Weißbach 222a8c17ab5Si-net /// software public function wl($id='',$more='',$abs=false,$sep='&', $IDexists=true, $overrideRewrite=false, $hadBase=false){ 2237d101cc1SGerry Weißbach global $conf; 2247d101cc1SGerry Weißbach 2251d20b534SGerry Weißbach $this->debug->message("Starting to build WL-URL for '$id'", $more, 1); 2267d101cc1SGerry Weißbach 2277d101cc1SGerry Weißbach if(is_array($more)){ 2281d20b534SGerry Weißbach 2291d20b534SGerry Weißbach $intermediateMore = ''; 2301d20b534SGerry Weißbach foreach( $more as $key => $value) { 2311d20b534SGerry Weißbach 2321d20b534SGerry Weißbach if ( strlen($intermediateMore) > 0 ) { 2331d20b534SGerry Weißbach $intermediateMore .= $sep; 2341d20b534SGerry Weißbach } 2351d20b534SGerry Weißbach 2361d20b534SGerry Weißbach if ( !is_array($value) ) { 2371d20b534SGerry Weißbach $intermediateMore .= rawurlencode($key) . '='; 2381d20b534SGerry Weißbach $intermediateMore .= rawurlencode($value); 2391d20b534SGerry Weißbach continue; 2401d20b534SGerry Weißbach } 2411d20b534SGerry Weißbach 2421d20b534SGerry Weißbach foreach( $value as $val ) { 2431d20b534SGerry Weißbach if ( strlen($intermediateMore) > 0 ) { 2441d20b534SGerry Weißbach $intermediateMore .= $sep; 2451d20b534SGerry Weißbach } 2461d20b534SGerry Weißbach 2471d20b534SGerry Weißbach $intermediateMore .= rawurlencode($key) . '[]='; 2481d20b534SGerry Weißbach $intermediateMore .= rawurlencode($val); 2491d20b534SGerry Weißbach } 2501d20b534SGerry Weißbach } 2511d20b534SGerry Weißbach 2521d20b534SGerry Weißbach $more = $intermediateMore; 2537d101cc1SGerry Weißbach } else { 2547d101cc1SGerry Weißbach $more = str_replace(',', $sep, $more); 2557d101cc1SGerry Weißbach } 2567d101cc1SGerry Weißbach 2577d101cc1SGerry Weißbach $id = idfilter($id); 2587d101cc1SGerry Weißbach 2597d101cc1SGerry Weißbach if ($abs) { 2607d101cc1SGerry Weißbach $xlink = DOKU_URL; 2617d101cc1SGerry Weißbach if (!$IDexists && !$hadBase) { // If the file does not exist, we have to remove the base. This link my be one to an parallel BASE. 2627d101cc1SGerry Weißbach $xlink = preg_replace('#' . DOKU_BASE . '$#', '', $xlink); 2637d101cc1SGerry Weißbach } 2647d101cc1SGerry Weißbach } else if ($IDexists || $hadBase) { // if the ID does exist, we may add the base. 2657d101cc1SGerry Weißbach $xlink = DOKU_BASE; 2667d101cc1SGerry Weißbach } else { 2677d101cc1SGerry Weißbach $xlink = ""; 2687d101cc1SGerry Weißbach } 2697d101cc1SGerry Weißbach 2707d101cc1SGerry Weißbach // $this->debug->message("internal WL function Before Replacing: '$xlink'", array(DOKU_REL, DOKU_URL, DOKU_BASE, $xlink), 2); 2717d101cc1SGerry Weißbach $xlink = preg_replace('#(?<!http:|https:)//+#', '/', ($abs ? '' : '/') . "$xlink/"); // ensure slashes at beginning and ending, but strip doubles 2727d101cc1SGerry Weißbach $this->debug->message("'$xlink'", array(DOKU_REL, DOKU_URL, DOKU_BASE, $xlink), 2); 2737d101cc1SGerry Weißbach 2747d101cc1SGerry Weißbach if ($overrideRewrite) { 2757d101cc1SGerry Weißbach $this->debug->message("Override enabled.", null, 1); 2767d101cc1SGerry Weißbach $id = strtr($id, ':', '/'); 2777d101cc1SGerry Weißbach 2787d101cc1SGerry Weißbach $xlink .= $id; 2797d101cc1SGerry Weißbach if ($more) $xlink .= '?' . $more; 2807d101cc1SGerry Weißbach } else { 2817d101cc1SGerry Weißbach if ($conf['userewrite'] == 2) { 2827d101cc1SGerry Weißbach $xlink .= DOKU_SCRIPT . '/' . $id; 2837d101cc1SGerry Weißbach if ($more) $xlink .= '?' . $more; 2847d101cc1SGerry Weißbach }elseif ($conf['userewrite']) { 2857d101cc1SGerry Weißbach $xlink .= $id; 2867d101cc1SGerry Weißbach if ($more) $xlink .= '?' . $more; 2877d101cc1SGerry Weißbach }elseif ($id) { 2887d101cc1SGerry Weißbach $xlink .= DOKU_SCRIPT . '?id=' . $id; 2897d101cc1SGerry Weißbach if ($more) $xlink .= $sep . $more; 2907d101cc1SGerry Weißbach } else { 2917d101cc1SGerry Weißbach $xlink .= DOKU_SCRIPT; 2927d101cc1SGerry Weißbach if ($more) $xlink .= '?' . $more; 2937d101cc1SGerry Weißbach } 2947d101cc1SGerry Weißbach } 2957d101cc1SGerry Weißbach 2967d101cc1SGerry Weißbach $this->debug->message("internal WL function result: '$xlink'", null, 2); 2977d101cc1SGerry Weißbach 2987d101cc1SGerry Weißbach return $xlink; 2997d101cc1SGerry Weißbach } 3007d101cc1SGerry Weißbach 3017d101cc1SGerry Weißbach /** 3027d101cc1SGerry Weißbach * Create the export file name - this is the file where everything is being stored 303a8c17ab5Si-net /// software * @param $FILE String name of the file 304a8c17ab5Si-net /// software * @param $PATTERN String additional pattern for re-using old files 3057d101cc1SGerry Weißbach */ 3067d101cc1SGerry Weißbach public function getSpecialExportFileName($FILE, $PATTERN = null) { 3077d101cc1SGerry Weißbach 3087d101cc1SGerry Weißbach if (empty($FILE)) 3097d101cc1SGerry Weißbach { 3107d101cc1SGerry Weißbach $FILE = $this->settings->origZipFile; 3117d101cc1SGerry Weißbach } 3127d101cc1SGerry Weißbach 3137d101cc1SGerry Weißbach if (empty($PATTERN) && empty($this->settings->pattern)) { 3146792d0cfSGerry Weißbach $this->debug->message("Generating an internal md5 pattern. This will go wrong - and won't cache properly.", null, 3); 3157d101cc1SGerry Weißbach $PATTERN = md5(microtime(false)); 3167d101cc1SGerry Weißbach } 3177d101cc1SGerry Weißbach 3187d101cc1SGerry Weißbach // Set Pattern Global for other stuff 3197d101cc1SGerry Weißbach if (empty($this->settings->pattern)) { 32082618ac8SGerry Weißbach $this->settings['pattern'] = $PATTERN; 3217d101cc1SGerry Weißbach } else { 3227d101cc1SGerry Weißbach $PATTERN = $this->settings->pattern; 3237d101cc1SGerry Weißbach } 3247d101cc1SGerry Weißbach 3257d101cc1SGerry Weißbach $FA = explode('.', $FILE); 3267d101cc1SGerry Weißbach $EXT = array_pop($FA); 3277d101cc1SGerry Weißbach array_push($FA, 'auto'); 3287d101cc1SGerry Weißbach array_push($FA, $PATTERN); 3297d101cc1SGerry Weißbach array_push($FA, $EXT); 3307d101cc1SGerry Weißbach 3317d101cc1SGerry Weißbach $fileName = implode('.', $FA); 3327d101cc1SGerry Weißbach $this->debug->message("Export Filename for '$FILE' will be: '$fileName'", null, 2); 3337d101cc1SGerry Weißbach return $fileName; 3347d101cc1SGerry Weißbach } 3357d101cc1SGerry Weißbach 3367d101cc1SGerry Weißbach public function getCacheFileNameForPattern($PATTERN = null) 3377d101cc1SGerry Weißbach { 3387d101cc1SGerry Weißbach if ($PATTERN == null) { 3397d101cc1SGerry Weißbach $PATTERN = $this->settings->pattern; 3407d101cc1SGerry Weißbach } 3417d101cc1SGerry Weißbach 3427d101cc1SGerry Weißbach return getCacheName($this->getSpecialExportFileName($this->settings->origZipFile, $PATTERN), '.' . basename(mediaFN($this->settings->origZipFile))); 3437d101cc1SGerry Weißbach } 3447d101cc1SGerry Weißbach 3450571ece2SScrutinizer Auto-Fixer /** 3460571ece2SScrutinizer Auto-Fixer * @param integer $counter 3470571ece2SScrutinizer Auto-Fixer */ 348a8c17ab5Si-net /// software public function startRedirctProcess($counter) { 3497d101cc1SGerry Weißbach global $ID; 3507d101cc1SGerry Weißbach 3517d101cc1SGerry Weißbach $URL = wl($ID); 3527d101cc1SGerry Weißbach 3537d101cc1SGerry Weißbach $additionalParameters = $_REQUEST; 3547d101cc1SGerry Weißbach $additionalParameters['startcounter'] = $counter; 3557d101cc1SGerry Weißbach $additionalParameters['pattern'] = $this->settings->pattern; 3567d101cc1SGerry Weißbach 3577d101cc1SGerry Weißbach unset($additionalParameters['id']); 3587d101cc1SGerry Weißbach unset($additionalParameters['u']); 3597d101cc1SGerry Weißbach unset($additionalParameters['p']); 3607d101cc1SGerry Weißbach unset($additionalParameters['r']); 3617d101cc1SGerry Weißbach unset($additionalParameters['http_credentials']); 3627d101cc1SGerry Weißbach 3637d101cc1SGerry Weißbach $this->addAdditionalParametersToURL($URL, $additionalParameters); 3647d101cc1SGerry Weißbach $this->debug->message("Redirecting to '$URL'", null, 2); 3657d101cc1SGerry Weißbach 3667d101cc1SGerry Weißbach send_redirect($URL); 3677d101cc1SGerry Weißbach exit(0); // Should not be reached, but anyways 3687d101cc1SGerry Weißbach } 3697d101cc1SGerry Weißbach 3707d101cc1SGerry Weißbach /** 3717d101cc1SGerry Weißbach * Builds additional Parameters into the URL given 3727d101cc1SGerry Weißbach * @param $URL 3737d101cc1SGerry Weißbach * @param $newAdditionalParameters 3747d101cc1SGerry Weißbach */ 375a8c17ab5Si-net /// software public function addAdditionalParametersToURL(&$URL, $newAdditionalParameters) { 3767d101cc1SGerry Weißbach 3777d101cc1SGerry Weißbach // Add additionalParameters 3787d101cc1SGerry Weißbach if (!empty($newAdditionalParameters)) { 3797d101cc1SGerry Weißbach foreach ($newAdditionalParameters as $key => $value) { 3807d101cc1SGerry Weißbach if (empty($key) || empty($value)) { continue; } 3817d101cc1SGerry Weißbach 3827d101cc1SGerry Weißbach if (is_array($value)) { 3837d101cc1SGerry Weißbach foreach (array_values($value) as $aValue) { // Array Handling 3847d101cc1SGerry Weißbach $URL .= (strstr($URL, '?') ? '&' : '?') . $key . "[]=$aValue"; 3857d101cc1SGerry Weißbach } 3867d101cc1SGerry Weißbach } else { 3877d101cc1SGerry Weißbach $append = "$key=$value"; 3887d101cc1SGerry Weißbach $URL .= empty($append) || strstr($URL, $append) ? '' : (strstr($URL, '?') ? '&' : '?') . $append; 3897d101cc1SGerry Weißbach } 3907d101cc1SGerry Weißbach } 3917d101cc1SGerry Weißbach } 3927d101cc1SGerry Weißbach } 3937d101cc1SGerry Weißbach 3947d101cc1SGerry Weißbach /** 3957d101cc1SGerry Weißbach * Cleans the wiki variables and returns a rebuild URL that has the new variables at hand 3967d101cc1SGerry Weißbach * @param $data 3977d101cc1SGerry Weißbach */ 398a8c17ab5Si-net /// software public function prepare_POSTData($data) 3997d101cc1SGerry Weißbach { 4000baac5adSGerry Weißbach $NS = array_key_exists( 'ns', $data ) ? $data['ns'] : ( array_key_exists( 'id', $data ) ? $data['id'] : ':' ); 4017d101cc1SGerry Weißbach 4027d101cc1SGerry Weißbach $this->removeWikiVariables($data); 4037d101cc1SGerry Weißbach $data['do'] = 'siteexport'; 4047d101cc1SGerry Weißbach $additionalKeys = ''; 4057d101cc1SGerry Weißbach 4067d101cc1SGerry Weißbach ksort($data); 4077d101cc1SGerry Weißbach 4087d101cc1SGerry Weißbach $this->debug->message("Prepared POST data:", $data, 1); 4097d101cc1SGerry Weißbach 4107d101cc1SGerry Weißbach foreach ($data as $key => $value) { 4117d101cc1SGerry Weißbach 4127d101cc1SGerry Weißbach if (!is_array($value)) { continue; } 4137d101cc1SGerry Weißbach $this->debug->message("Found inner Array:", $value, 1); 4147d101cc1SGerry Weißbach 4157d101cc1SGerry Weißbach asort($value); 4167d101cc1SGerry Weißbach foreach ($value as $innerKey => $aValue) 4177d101cc1SGerry Weißbach { 4187d101cc1SGerry Weißbach if (is_numeric($innerKey)) 4197d101cc1SGerry Weißbach { 4207d101cc1SGerry Weißbach $innerKey = ''; 4217d101cc1SGerry Weißbach } 4227d101cc1SGerry Weißbach 4237d101cc1SGerry Weißbach $additionalKeys .= "&$key" . "[$innerKey]=$aValue"; 4247d101cc1SGerry Weißbach } 4257d101cc1SGerry Weißbach 4267d101cc1SGerry Weißbach unset($data[$key]); 4277d101cc1SGerry Weißbach } 4287d101cc1SGerry Weißbach 4297d101cc1SGerry Weißbach return wl($NS, $data, true, '&') . $additionalKeys; 4307d101cc1SGerry Weißbach } 4317d101cc1SGerry Weißbach 4327d101cc1SGerry Weißbach /** 4337d101cc1SGerry Weißbach * Parses a String into a $_REQUEST Like variant. You have to tell if a decode of the values is needed 4347d101cc1SGerry Weißbach * @param $inputArray 4357d101cc1SGerry Weißbach * @param $decode 4367d101cc1SGerry Weißbach */ 4377d101cc1SGerry Weißbach public function parseStringToRequestArray($inputArray, $decode=false) 4387d101cc1SGerry Weißbach { 4397d101cc1SGerry Weißbach global $plugin_controller; 4407d101cc1SGerry Weißbach 4417d101cc1SGerry Weißbach $outputArray = $inputArray; 4427d101cc1SGerry Weißbach if ( !is_array($inputArray) ) 4437d101cc1SGerry Weißbach { 444f161d4fbSatisne if (empty($inputArray)) 445f161d4fbSatisne return array(); 446f161d4fbSatisne 4477d101cc1SGerry Weißbach $intermediate = str_replace("&", "&", $inputArray); 4487d101cc1SGerry Weißbach 4497d101cc1SGerry Weißbach $outputArray = array(); 4507d101cc1SGerry Weißbach foreach( explode("&", $intermediate) as $param ) { 451d0db7817SGerry Weißbach list($key, $value) = array_pad( explode("=", $param, 2), 2, null ); 4527d101cc1SGerry Weißbach 4537d101cc1SGerry Weißbach // This is needed if we do want to calculate $_REQUEST for a non HTTP-Request 4547d101cc1SGerry Weißbach if ( $decode) 4557d101cc1SGerry Weißbach { 4567d101cc1SGerry Weißbach $value = urldecode($value); 4577d101cc1SGerry Weißbach } 4587d101cc1SGerry Weißbach 4597d101cc1SGerry Weißbach if ( empty($key) ) { continue; } // Don't check on Value, because there may be only the key that should be preserved 4607d101cc1SGerry Weißbach 4617d101cc1SGerry Weißbach if ( substr($key, -2) == '[]' ) { 4627d101cc1SGerry Weißbach $key = substr($key, 0, -2); 4637d101cc1SGerry Weißbach if ( !is_array($outputArray[$key]) ) { 4647d101cc1SGerry Weißbach $outputArray[$key] = array(); 4657d101cc1SGerry Weißbach } 4667d101cc1SGerry Weißbach 4677d101cc1SGerry Weißbach array_push($outputArray[$key], $value); // Array Handling 4687d101cc1SGerry Weißbach } else { 4697d101cc1SGerry Weißbach $outputArray[$key] = $value; 4707d101cc1SGerry Weißbach } 4717d101cc1SGerry Weißbach } 4727d101cc1SGerry Weißbach } 4737d101cc1SGerry Weißbach 4747d101cc1SGerry Weißbach if (!empty($outputArray['diPlu'])) { 4757d101cc1SGerry Weißbach 4767d101cc1SGerry Weißbach $allPlugins = array(); 4777d101cc1SGerry Weißbach foreach ($plugin_controller->getList(null, true) as $plugin) { 4787d101cc1SGerry Weißbach // check for CSS or JS 479a8c17ab5Si-net /// software if (!file_exists(DOKU_PLUGIN . $plugin . "/script.js") && !file_exists(DOKU_PLUGIN . $plugin . "/style.css")) { continue; } 4807d101cc1SGerry Weißbach $allPlugins[] = $plugin; 4817d101cc1SGerry Weißbach } 4827d101cc1SGerry Weißbach 4837d101cc1SGerry Weißbach if (count($outputArray['diPlu']) > (count($allPlugins)/2)) { 4847d101cc1SGerry Weißbach $outputArray['diInv'] = 1; 4857d101cc1SGerry Weißbach $outputArray['diPlu'] = array_diff($allPlugins, $outputArray['diPlu']); 4867d101cc1SGerry Weißbach } 4877d101cc1SGerry Weißbach } 4887d101cc1SGerry Weißbach 4897d101cc1SGerry Weißbach return $outputArray; 4907d101cc1SGerry Weißbach } 4917d101cc1SGerry Weißbach 4927d101cc1SGerry Weißbach /** 4937d101cc1SGerry Weißbach * Remove certain fields from the list. 4947d101cc1SGerry Weißbach * @param $removeArray 4957d101cc1SGerry Weißbach * @param $advanced 4967d101cc1SGerry Weißbach * @param $isString 4977d101cc1SGerry Weißbach */ 498a8c17ab5Si-net /// software public function removeWikiVariables(&$removeArray, $advanced = false, $isString = false) { 4997d101cc1SGerry Weißbach 5007d101cc1SGerry Weißbach $removeArray = $this->parseStringToRequestArray($removeArray); 501a8c17ab5Si-net /// software $removeKeys = array(); 5027d101cc1SGerry Weißbach 5037d101cc1SGerry Weißbach // 2010-08-23 - If there is still the media set, retain the id for e.g. detail.php 5047d101cc1SGerry Weißbach if (!isset($removeArray['media'])) { 505a8c17ab5Si-net /// software $removeKeys[] = 'id'; 5067d101cc1SGerry Weißbach } 5077d101cc1SGerry Weißbach 5087d101cc1SGerry Weißbach unset($removeArray['do']); 509a8c17ab5Si-net /// software $removeKeys[] = 'ns'; 510a8c17ab5Si-net /// software $removeKeys[] = 'call'; 511a8c17ab5Si-net /// software $removeKeys[] = 'sectok'; 512a8c17ab5Si-net /// software $removeKeys[] = 'rndval'; 513a8c17ab5Si-net /// software $removeKeys[] = 'tseed'; 514a8c17ab5Si-net /// software $removeKeys[] = 'http_credentials'; 515a8c17ab5Si-net /// software $removeKeys[] = 'u'; 516a8c17ab5Si-net /// software $removeKeys[] = 'p'; 517a8c17ab5Si-net /// software $removeKeys[] = 'r'; 518a8c17ab5Si-net /// software $removeKeys[] = 'base'; 519a8c17ab5Si-net /// software $removeKeys[] = 'siteexport'; 520a8c17ab5Si-net /// software $removeKeys[] = 'DokuWiki'; 5217d101cc1SGerry Weißbach 5220baac5adSGerry Weißbach if ( array_key_exists( 'renderer', $removeArray ) && $removeArray['renderer'] == 'xhtml') { 5237d101cc1SGerry Weißbach $removeArray['do'] = 'export_' . $removeArray['renderer']; 524a8c17ab5Si-net /// software $removeKeys[] = 'renderer'; 5257d101cc1SGerry Weißbach } 5267d101cc1SGerry Weißbach 5272270cdc5SGerry Weißbach // Keep custom options 5280baac5adSGerry Weißbach if ( array_key_exists( 'customoptionname', $removeArray ) && is_array($removeArray['customoptionname']) && is_array($removeArray['customoptionvalue']) && count($removeArray['customoptionname']) == count($removeArray['customoptionvalue'])) 5292270cdc5SGerry Weißbach { 530a8c17ab5Si-net /// software for ($index = count($removeArray['customoptionname']); $index >= 0; $index--) 5312270cdc5SGerry Weißbach { 5322270cdc5SGerry Weißbach $removeArray[$removeArray['customoptionname'][$index]] = $removeArray['customoptionvalue'][$index]; 5332270cdc5SGerry Weißbach } 534a8c17ab5Si-net /// software $removeKeys[] = 'customoptionname'; 535a8c17ab5Si-net /// software $removeKeys[] = 'customoptionvalue'; 5362270cdc5SGerry Weißbach } 5372270cdc5SGerry Weißbach 5387d101cc1SGerry Weißbach if ($advanced) { 5390baac5adSGerry Weißbach if ( array_key_exists( 'renderer', $removeArray ) && $removeArray['renderer'] != 'xhtml' && !empty($removeArray['renderer'])) { 5407d101cc1SGerry Weißbach $removeArray['do'] = 'export_' . $removeArray['renderer']; 5417d101cc1SGerry Weißbach } 5427d101cc1SGerry Weißbach 5437d101cc1SGerry Weißbach // 2010-08-25 - Need fakeMedia for some _detail cases with rewrite = 2 5447d101cc1SGerry Weißbach if (isset($removeArray['fakeMedia'])) { 545a8c17ab5Si-net /// software $removeKeys[] = 'media'; 546a8c17ab5Si-net /// software $removeKeys[] = 'fakeMedia'; 5477d101cc1SGerry Weißbach } 5487d101cc1SGerry Weißbach 5497d101cc1SGerry Weißbach /* remove internal params */ 550a8c17ab5Si-net /// software $removeKeys[] = 'ens'; 551a8c17ab5Si-net /// software $removeKeys[] = 'renderer'; 552a8c17ab5Si-net /// software $removeKeys[] = 'site'; 553a8c17ab5Si-net /// software $removeKeys[] = 'namespace'; 554a8c17ab5Si-net /// software $removeKeys[] = 'exportbody'; 555a8c17ab5Si-net /// software $removeKeys[] = 'addParams'; 556a8c17ab5Si-net /// software $removeKeys[] = 'template'; 557a8c17ab5Si-net /// software $removeKeys[] = 'eclipseDocZip'; 558a8c17ab5Si-net /// software $removeKeys[] = 'useTocFile'; 559a8c17ab5Si-net /// software $removeKeys[] = 'JavaHelpDocZip'; 560a8c17ab5Si-net /// software $removeKeys[] = 'depth'; 561a8c17ab5Si-net /// software $removeKeys[] = 'depthType'; 562a8c17ab5Si-net /// software $removeKeys[] = 'startcounter'; 563a8c17ab5Si-net /// software $removeKeys[] = 'pattern'; 564a8c17ab5Si-net /// software $removeKeys[] = 'TOCMapWithoutTranslation'; 565a8c17ab5Si-net /// software 566a8c17ab5Si-net /// software $removeKeys[] = 'debug'; 567a8c17ab5Si-net /// software } 568a8c17ab5Si-net /// software 569a8c17ab5Si-net /// software foreach($removeKeys as $key) { 570a8c17ab5Si-net /// software unset($removeArray[$key]); 5717d101cc1SGerry Weißbach } 5727d101cc1SGerry Weißbach 5737d101cc1SGerry Weißbach if ($isString && is_array($removeArray)) { 5747d101cc1SGerry Weißbach $intermediate = $removeArray; 5757d101cc1SGerry Weißbach $removeArray = array(); 5767d101cc1SGerry Weißbach 5777d101cc1SGerry Weißbach foreach ($intermediate as $key => $value) { 5787d101cc1SGerry Weißbach if (is_array($value)) { 5797d101cc1SGerry Weißbach foreach (array_values($value) as $aValue) { // Array Handling 5807d101cc1SGerry Weißbach $removeArray[] = $key . "[]=$aValue"; 5817d101cc1SGerry Weißbach } 5827d101cc1SGerry Weißbach } else { 5837d101cc1SGerry Weißbach $value = trim($value); 5847d101cc1SGerry Weißbach 5857d101cc1SGerry Weißbach $removeArray[] = "$key" . (((empty($value) && intval($value) !== 0)) || $value == '' ? '' : "=$value"); // If the Value is empty, the Key must be preserved 5867d101cc1SGerry Weißbach } 5877d101cc1SGerry Weißbach } 5887d101cc1SGerry Weißbach 5890b4abc9fSGerry Weißbach $removeArray = implode("&", $removeArray); // The & made problems with the HTTPClient / Apache. It should not be a problem to have & 5907d101cc1SGerry Weißbach } 5917d101cc1SGerry Weißbach } 5927d101cc1SGerry Weißbach 5937d101cc1SGerry Weißbach /** 5947d101cc1SGerry Weißbach * returns a hashed name for the parameters 5957d101cc1SGerry Weißbach * @param $parameters 5967d101cc1SGerry Weißbach */ 597f44c759aSGerry Weißbach public function hashNameForParameters($parameters) 5987d101cc1SGerry Weißbach { 5997d101cc1SGerry Weißbach return md5($parameters); 6007d101cc1SGerry Weißbach } 6017d101cc1SGerry Weißbach 6027d101cc1SGerry Weißbach /** 6037d101cc1SGerry Weißbach * Takes an URL and transforms it into the path+query part 6047d101cc1SGerry Weißbach * Used several times, e.g. for genering the hash for the cache file 6050571ece2SScrutinizer Auto-Fixer * @param string $url 6067d101cc1SGerry Weißbach */ 6077d101cc1SGerry Weißbach public function urlToPathAndParams($url) 6087d101cc1SGerry Weißbach { 6097d101cc1SGerry Weißbach $query = parse_url($url, PHP_URL_QUERY); 6107d101cc1SGerry Weißbach $path = preg_replace(":^" . DOKU_REL . ":", "", parse_url($url, PHP_URL_PATH)); 6117d101cc1SGerry Weißbach return "{$path}?{$query}"; 6127d101cc1SGerry Weißbach } 6137d101cc1SGerry Weißbach 6147d101cc1SGerry Weißbach /** 6157d101cc1SGerry Weißbach * Transforms an $_REQUEST into a Hash that can be used for cron and cache file 6167d101cc1SGerry Weißbach * @param $request 6177d101cc1SGerry Weißbach */ 6187d101cc1SGerry Weißbach public function requestParametersToCacheHash($request) 6197d101cc1SGerry Weißbach { 6207d101cc1SGerry Weißbach $params = $this->urlToPathAndParams($this->prepare_POSTData($request)); 6217d101cc1SGerry Weißbach $this->debug->message("Calculated the following Cache Hash URL: ", $params, 2); 622f44c759aSGerry Weißbach return $this->hashNameForParameters($params); 6237d101cc1SGerry Weißbach } 6247d101cc1SGerry Weißbach 6257d101cc1SGerry Weißbach /** 6263aa0ad13SGerry Weißbach * Check a replaceURL against a baseURL - and make the replaceURL relative against it 627a8c17ab5Si-net /// software * @param replaceURL String URL which will be made relative if needed 628a8c17ab5Si-net /// software * @param baseURL String URL which is the reference to be made relative against 629a8c17ab5Si-net /// software * @param existingPageID Array 6307d101cc1SGerry Weißbach */ 6318a20a4b4SGerry Weißbach public function getRelativeURL($replaceURL, $baseURL, $existingPageID = null) 6327d101cc1SGerry Weißbach { 6333aa0ad13SGerry Weißbach // Base is always absolute without anything at the beginning 6343aa0ad13SGerry Weißbach if (preg_match("#^(\.\./)+#", $baseURL)) { 6353aa0ad13SGerry Weißbach $this->debug->message("The baseURL was not absolute.", $baseURL, 1); 6363aa0ad13SGerry Weißbach return $replaceURL; 6373aa0ad13SGerry Weißbach } 6387d101cc1SGerry Weißbach 6393aa0ad13SGerry Weißbach $origReplaceURL = $replaceURL; 6403aa0ad13SGerry Weißbach $replaceURL = preg_replace("#^(\.\./)+#", '', $replaceURL); 6417d101cc1SGerry Weißbach 6423aa0ad13SGerry Weißbach // Remove ../ at beginning to get the absolute path 6433aa0ad13SGerry Weißbach if ($replaceURL == $origReplaceURL) { 6443aa0ad13SGerry Weißbach $this->debug->message("The replaceURL was already absolute.", $replaceURL, 1); 6453aa0ad13SGerry Weißbach return $replaceURL; 6463aa0ad13SGerry Weißbach } 6477d101cc1SGerry Weißbach 6483aa0ad13SGerry Weißbach $replaceParts = explode('/', $replaceURL); 6493aa0ad13SGerry Weißbach $fileName = array_pop($replaceParts); // Get file 6507d101cc1SGerry Weißbach 6513aa0ad13SGerry Weißbach $baseParts = explode('/', $baseURL); 6523aa0ad13SGerry Weißbach array_pop($baseParts); // Remove file. We only need the path to this location. 6537d101cc1SGerry Weißbach 6543aa0ad13SGerry Weißbach $this->debug->message("State before kicking.", array($replaceParts, $baseParts), 1); 6553aa0ad13SGerry Weißbach 6563aa0ad13SGerry Weißbach // Kick all ../ 6578a20a4b4SGerry Weißbach $originalBasePartsCount = count($baseParts); 6582c0d7043SGerry Weißbach $didKickSomeParts = 0; // true means, that some parts of the base URL were identical 6593aa0ad13SGerry Weißbach while (count($replaceParts) > 0 && count($baseParts) > 0) { 6603aa0ad13SGerry Weißbach 6613aa0ad13SGerry Weißbach if ($baseParts[0] == $replaceParts[0]) { 6623aa0ad13SGerry Weißbach // Beginning is OK, so remove it. 6637d101cc1SGerry Weißbach array_shift($replaceParts); 6647d101cc1SGerry Weißbach array_shift($baseParts); 6652c0d7043SGerry Weißbach $didKickSomeParts++; 6663aa0ad13SGerry Weißbach } else { 6677d101cc1SGerry Weißbach break; 6687d101cc1SGerry Weißbach } 6693aa0ad13SGerry Weißbach 6707d101cc1SGerry Weißbach } 6717d101cc1SGerry Weißbach 6723aa0ad13SGerry Weißbach $this->debug->message("Found URL '{$replaceURL}' that is relative to current page '{$baseURL}'.", array($replaceParts, $baseParts), 1); 6737d101cc1SGerry Weißbach 6743aa0ad13SGerry Weißbach // Remove everything that is identical 6753aa0ad13SGerry Weißbach $replaceParts[] = $fileName; 6767d101cc1SGerry Weißbach 6778a20a4b4SGerry Weißbach // do the final link calculation 6788a20a4b4SGerry Weißbach $finalLink = str_repeat('../', count($baseParts)) . implode('/', $replaceParts); 6798a20a4b4SGerry Weißbach 6802c0d7043SGerry Weißbach // Means nothing was kicked, so other plugin 6812c0d7043SGerry Weißbach $isExternalPage = count($baseParts) == $originalBasePartsCount; 6822c0d7043SGerry Weißbach 6832c0d7043SGerry Weißbach // the new page is in the same plugin, with a different subcontext and same language 684f161d4fbSatisne $parts0equal = (isset($baseParts[0]) && isset($replaceParts[0]) && $baseParts[0] == $replaceParts[0]); 685f161d4fbSatisne $parts1equal = (isset($baseParts[1]) && isset($replaceParts[1]) && $baseParts[1] == $replaceParts[1]); 686f161d4fbSatisne $isExternalPage = $isExternalPage || ($didKickSomeParts == 1 && !$parts0equal && $parts1equal); 6872c0d7043SGerry Weißbach 6882c0d7043SGerry Weißbach // find out if this is outside of our own export context, beyond the baseURL 689de387d04SGerry Weißbach $offsiteTemplate = $this->getConf("offSiteLinkTemplate"); 6906ec22144SGerry Weißbach $this->debug->message("Checking for offsite links", array( 6916ec22144SGerry Weißbach "baseParts" => count($baseParts), 6926ec22144SGerry Weißbach "originalBaseParts" => $originalBasePartsCount, 6936ec22144SGerry Weißbach "ExistingPageID" => $existingPageID, 6942c0d7043SGerry Weißbach "finalLink" => $finalLink, 6952c0d7043SGerry Weißbach "offsiteTemplate" => $offsiteTemplate, 6962c0d7043SGerry Weißbach "isExternalPage" => $isExternalPage, 6972c0d7043SGerry Weißbach "didKickSomeParts" => $didKickSomeParts 6982c0d7043SGerry Weißbach 6996ec22144SGerry Weißbach ), 1); 7002c0d7043SGerry Weißbach 7012c0d7043SGerry Weißbach if ( $isExternalPage && $existingPageID != null && !empty($offsiteTemplate)) { 7028a20a4b4SGerry Weißbach 703de387d04SGerry Weißbach $offsiteTemplate = str_replace('RAWID', $existingPageID, $offsiteTemplate); 7048a20a4b4SGerry Weißbach 7058a20a4b4SGerry Weißbach $check = null; 706a8c17ab5Si-net /// software $mapID = $this->getMapID($existingPageID, null, $check); 707a8c17ab5Si-net /// software $offsiteTemplate = str_replace('CONTEXTID', array_pop($mapID), $offsiteTemplate); 708de387d04SGerry Weißbach $offsiteTemplate = str_replace('LINK', $finalLink, $offsiteTemplate); 7098a20a4b4SGerry Weißbach 7106ec22144SGerry Weißbach $this->debug->message("Replacing finalLink '${finalLink}' with offsiteLink '${offsiteTemplate}'", null, 1); 7116ec22144SGerry Weißbach $finalLink = $offsiteTemplate; 7128a20a4b4SGerry Weißbach } 7138a20a4b4SGerry Weißbach 7148a20a4b4SGerry Weißbach return $finalLink; 7158a20a4b4SGerry Weißbach } 7168a20a4b4SGerry Weißbach 717a8c17ab5Si-net /// software public function mapIDWithAnchor(&$n, $key, $postfix) 7188a20a4b4SGerry Weißbach { 7198a20a4b4SGerry Weißbach if (empty($postfix)) return; 7208a20a4b4SGerry Weißbach $n .= '-' . $postfix; 7218a20a4b4SGerry Weißbach } 7228a20a4b4SGerry Weißbach 723a8c17ab5Si-net /// software public function getMapID($elemID, $postfix, &$check) 7248a20a4b4SGerry Weißbach { 7258a20a4b4SGerry Weißbach $meta = p_get_metadata($elemID, 'context', true); 7268a20a4b4SGerry Weißbach 7278a20a4b4SGerry Weißbach if (empty($meta['id'])) { 728fbfbd79dSGerry Weißbach $title = empty($meta['title']) ? $this->getSiteTitle($elemID) : $meta['title']; 729677a5980SGerry Weißbach $meta['id'] = sectionID($this->cleanId($title), $check); 7308a20a4b4SGerry Weißbach } 7318a20a4b4SGerry Weißbach 7328a20a4b4SGerry Weißbach $mapID = explode('|', $meta['id']); 7338a20a4b4SGerry Weißbach array_walk($mapID, array($this, 'mapIDWithAnchor'), $postfix); 7348a20a4b4SGerry Weißbach 7358a20a4b4SGerry Weißbach return $mapID; 7367d101cc1SGerry Weißbach } 737ec1dc739SGerry Weißbach 738ec1dc739SGerry Weißbach public function hasAuthentication() { 739ec1dc739SGerry Weißbach $user = $this->getConf('defaultAuthenticationUser'); 740ec1dc739SGerry Weißbach $password = $this->getConf('defaultAuthenticationPassword'); 741ec1dc739SGerry Weißbach return empty($user) ? false : array( 742ec1dc739SGerry Weißbach 'user' => $user, 743ec1dc739SGerry Weißbach 'password' => $password 744ec1dc739SGerry Weißbach ); 745ec1dc739SGerry Weißbach } 746ec1dc739SGerry Weißbach 747ec1dc739SGerry Weißbach public function authenticate() { 748ec1dc739SGerry Weißbach if (!isset($_SERVER['HTTP_AUTHORIZATION']) && $this->hasAuthentication()) { 7491e0bea35SGerry Weissbach $authentication = $this->hasAuthentication(); 7501e0bea35SGerry Weissbach $_SERVER['HTTP_AUTHORIZATION'] = 'Basic ' . base64_encode($authentication['user'] . ':' . $authentication['password']); 7511e0bea35SGerry Weissbach $this->debug->message("Re-authenticating with default user from configuration", $authentication['user'], 3); 7521e0bea35SGerry Weissbach return auth_setup(); 753ec1dc739SGerry Weißbach } 7541e0bea35SGerry Weissbach 7551e0bea35SGerry Weissbach return false; 756ec1dc739SGerry Weißbach } 757a0417606SGerry Weißbach 758a0417606SGerry Weißbach /** 759a0417606SGerry Weißbach * Check the secret CSRF token, regardless of the current authorization 760a0417606SGerry Weißbach * 761a0417606SGerry Weißbach * @param null|string $token security token 762a0417606SGerry Weißbach * @param null|boolean $softfail if a message is to be thrown. 763a0417606SGerry Weißbach * @return bool success if the token matched 764a0417606SGerry Weißbach */ 765a8c17ab5Si-net /// software public function checkSecurityToken($token = null, $softfail = true) { 766a0417606SGerry Weißbach /** @var Input $INPUT */ 767a0417606SGerry Weißbach $secToken = $this->getSecurityToken(); 768a0417606SGerry Weißbach if ( empty( $secToken) && empty ( $token ) ) return false; 769a0417606SGerry Weißbach if($secToken != $token) { 770a8c17ab5Si-net /// software if ( $softfail !== true ) msg('Security Token did not match. Possible CSRF attack.', -1); 771a0417606SGerry Weißbach return false; 772a0417606SGerry Weißbach } 773a0417606SGerry Weißbach return true; 7747d101cc1SGerry Weißbach } 7757d101cc1SGerry Weißbach 776a0417606SGerry Weißbach /** 777a0417606SGerry Weißbach * Return a secret token to be used for CSRF attack prevention 778a0417606SGerry Weißbach * This is known to be flawed by default 779a0417606SGerry Weißbach * 780a0417606SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 781a0417606SGerry Weißbach * @link http://en.wikipedia.org/wiki/Cross-site_request_forgery 782a0417606SGerry Weißbach * @link http://christ1an.blogspot.com/2007/04/preventing-csrf-efficiently.html 783a0417606SGerry Weißbach * @link https://github.com/splitbrain/dokuwiki/issues/1883 784a0417606SGerry Weißbach * 785a0417606SGerry Weißbach * @return string 786a0417606SGerry Weißbach */ 787a8c17ab5Si-net /// software public function getSecurityToken() { 788a0417606SGerry Weißbach /** @var Input $INPUT */ 789a0417606SGerry Weißbach global $INPUT; 790a0417606SGerry Weißbach return PassHash::hmac('md5', session_id().'siteexport', 'siteexport_salt'.auth_cookiesalt()); 791a0417606SGerry Weißbach } 792a0417606SGerry Weißbach} 793