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 77d101cc1SGerry Weißbachclass siteexport_functions extends DokuWiki_Plugin 87d101cc1SGerry Weißbach{ 97d101cc1SGerry Weißbach public $debug = null; 107d101cc1SGerry Weißbach public $settings = null; 117d101cc1SGerry Weißbach 122270cdc5SGerry Weißbach public function siteexport_functions($init=true, $isAJAX=false) 137d101cc1SGerry Weißbach { 147d101cc1SGerry Weißbach if ( $init ) 157d101cc1SGerry Weißbach { 167d101cc1SGerry Weißbach $this->debug = new siteexport_debug(); 172270cdc5SGerry Weißbach $this->debug->isAJAX = $isAJAX; 182270cdc5SGerry Weißbach 197d101cc1SGerry Weißbach $this->settings = new settings_plugin_siteexport_settings($this); 207d101cc1SGerry Weißbach $this->debug->message("Settings completed: zipFile", $this->settings->zipFile, 1); 217d101cc1SGerry Weißbach } 227d101cc1SGerry Weißbach } 237d101cc1SGerry Weißbach 247d101cc1SGerry Weißbach public function getPluginName() 257d101cc1SGerry Weißbach { 267d101cc1SGerry Weißbach return 'siteexport'; 277d101cc1SGerry Weißbach } 287d101cc1SGerry Weißbach 297d101cc1SGerry Weißbach public function downloadURL() 307d101cc1SGerry Weißbach { 317d101cc1SGerry Weißbach return ml($this->settings->origZipFile, array('cache' => 'nocache', 'siteexport' => $this->settings->pattern), true, '&'); 327d101cc1SGerry Weißbach } 337d101cc1SGerry Weißbach 347d101cc1SGerry Weißbach public function checkIfCacheFileExistsForFileWithPattern($file, $pattern) 357d101cc1SGerry Weißbach { 367d101cc1SGerry Weißbach if ( !@file_exists($file) ) 377d101cc1SGerry Weißbach { 387d101cc1SGerry Weißbach // If the cache File does not exist, move the newly created one over ... 397d101cc1SGerry Weißbach $newCacheFile = mediaFN($this->getSpecialExportFileName($this->settings->origZipFile, $pattern)); 407d101cc1SGerry Weißbach 417d101cc1SGerry Weißbach if ( !@file_exists($newCacheFile) ) 427d101cc1SGerry Weißbach { 437d101cc1SGerry 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); 447d101cc1SGerry Weißbach } 457d101cc1SGerry Weißbach 467d101cc1SGerry Weißbach $status = io_rename($newCacheFile, $file); 477d101cc1SGerry 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 ); 487d101cc1SGerry Weißbach } 497d101cc1SGerry Weißbach } 507d101cc1SGerry Weißbach 517d101cc1SGerry Weißbach 527d101cc1SGerry Weißbach /** 537d101cc1SGerry Weißbach * Returns an utf8 encoded Namespace for a Page and input Namespace 547d101cc1SGerry Weißbach * @param $NS 557d101cc1SGerry Weißbach * @param $PAGE 567d101cc1SGerry Weißbach */ 577d101cc1SGerry Weißbach function getNamespaceFromID($NS, &$PAGE) { 587d101cc1SGerry Weißbach global $conf; 597d101cc1SGerry Weißbach // Check current page - if its an NS add the startpage 607d101cc1SGerry Weißbach $clean = true; 617d101cc1SGerry Weißbach resolve_pageid(getNS($NS), $NS, $clean); 627d101cc1SGerry Weißbach if ( ! page_exists($NS) && array_pop(explode(':', $NS)) != strtolower($conf['start'] )) { // Compare to lowercase since clean lowers it. 637d101cc1SGerry Weißbach $NS .= ':' . $conf['start']; 647d101cc1SGerry Weißbach resolve_pageid(getNS($NS), $NS, $clean); 657d101cc1SGerry Weißbach } 667d101cc1SGerry Weißbach 677d101cc1SGerry Weißbach $PAGE = noNS($NS); 687d101cc1SGerry Weißbach $NS = getNS($NS); 697d101cc1SGerry Weißbach 707d101cc1SGerry Weißbach return utf8_encodeFN(str_replace(':', '/', $NS)); 717d101cc1SGerry Weißbach } 727d101cc1SGerry Weißbach 737d101cc1SGerry Weißbach /** 747d101cc1SGerry Weißbach * create a file name for the page 757d101cc1SGerry Weißbach **/ 767d101cc1SGerry Weißbach public function getSiteName($ID, $overrideRewrite=false) { 777d101cc1SGerry Weißbach global $conf; 787d101cc1SGerry Weißbach 797d101cc1SGerry Weißbach if ( empty($ID) ) return false; 807d101cc1SGerry Weißbach 817d101cc1SGerry Weißbach $url = $this->wl($this->cleanID($ID), null, true, null, null, $overrideRewrite); // this must be done with rewriting set to override 827d101cc1SGerry Weißbach //$url = $this->wl($this->cleanID($ID), null, true); // this must be done with rewriting set to override 837d101cc1SGerry Weißbach $uri = @parse_url($url); 847d101cc1SGerry Weißbach if ( $uri['path'][0] == '/' ) { 857d101cc1SGerry Weißbach $uri['path'] = substr($uri['path'], 1); 867d101cc1SGerry Weißbach } 877d101cc1SGerry Weißbach 887d101cc1SGerry Weißbach return $this->shortenName($uri['path'] . '.' . $this->settings->fileType); 897d101cc1SGerry Weißbach } 907d101cc1SGerry Weißbach 917d101cc1SGerry Weißbach /** 927d101cc1SGerry Weißbach * get the Title for the page 937d101cc1SGerry Weißbach **/ 947d101cc1SGerry Weißbach public function getSiteTitle($ID) { 957d101cc1SGerry Weißbach if (useHeading('content') && $ID) { 967d101cc1SGerry Weißbach $heading = p_get_first_heading($ID,true); 977d101cc1SGerry Weißbach if ($heading) { 987d101cc1SGerry Weißbach return $this->xmlEntities($heading); 997d101cc1SGerry Weißbach } 1007d101cc1SGerry Weißbach } 1017d101cc1SGerry Weißbach return ucwords($this->xmlEntities(array_pop(explode(':', $ID)))); 1027d101cc1SGerry Weißbach } 1037d101cc1SGerry Weißbach 1047d101cc1SGerry Weißbach /** 1057d101cc1SGerry Weißbach * Encoding ()taken from DW - but without needing the renderer 1067d101cc1SGerry Weißbach **/ 1077d101cc1SGerry Weißbach public function xmlEntities($string) { 1087d101cc1SGerry Weißbach return htmlspecialchars($string,ENT_QUOTES,'UTF-8'); 1097d101cc1SGerry Weißbach } 1107d101cc1SGerry Weißbach 1117d101cc1SGerry Weißbach /** 1127d101cc1SGerry Weißbach * Create name for the file inside the zip and the replacements 1137d101cc1SGerry Weißbach **/ 1147d101cc1SGerry Weißbach function shortenName($NAME) 1157d101cc1SGerry Weißbach { 1167d101cc1SGerry Weißbach $NS = $this->settings->exportNamespace; 1177d101cc1SGerry Weißbach $NAME = preg_replace("%^" . DOKU_BASE . "%", "", $NAME); 1187d101cc1SGerry Weißbach $NAME = preg_replace("%^(_media/)?(" . $NS . "/)?%", "", $NAME); 1197d101cc1SGerry Weißbach 1207d101cc1SGerry Weißbach $this->debug->message("Shortening file to '$NAME'", null, 1); 1217d101cc1SGerry Weißbach return $NAME; 1227d101cc1SGerry Weißbach } 1237d101cc1SGerry Weißbach 1247d101cc1SGerry Weißbach /** 1257d101cc1SGerry Weißbach * Remove unwanted chars from ID 1267d101cc1SGerry Weißbach * 1277d101cc1SGerry Weißbach * Cleans a given ID to only use allowed characters. Accented characters are 1287d101cc1SGerry Weißbach * converted to unaccented ones 1297d101cc1SGerry Weißbach * 1307d101cc1SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 1317d101cc1SGerry Weißbach * @param string $raw_id The pageid to clean 1327d101cc1SGerry Weißbach * @param boolean $ascii Force ASCII 1337d101cc1SGerry Weißbach * @param boolean $media Allow leading or trailing _ for media files 1347d101cc1SGerry Weißbach */ 1357d101cc1SGerry Weißbach function cleanID($raw_id,$ascii=false,$media=false){ 1367d101cc1SGerry Weißbach global $conf; 1377d101cc1SGerry Weißbach global $lang; 1387d101cc1SGerry Weißbach static $sepcharpat = null; 1397d101cc1SGerry Weißbach 1407d101cc1SGerry Weißbach global $cache_cleanid; 1417d101cc1SGerry Weißbach $cache = & $cache_cleanid; 1427d101cc1SGerry Weißbach 1437d101cc1SGerry Weißbach // check if it's already in the memory cache 1447d101cc1SGerry Weißbach if (isset($cache[(string)$raw_id])) { 1457d101cc1SGerry Weißbach return $cache[(string)$raw_id]; 1467d101cc1SGerry Weißbach } 1477d101cc1SGerry Weißbach 1487d101cc1SGerry Weißbach $sepchar = $conf['sepchar']; 1497d101cc1SGerry Weißbach if($sepcharpat == null) // build string only once to save clock cycles 1507d101cc1SGerry Weißbach $sepcharpat = '#\\'.$sepchar.'+#'; 1517d101cc1SGerry Weißbach 1527d101cc1SGerry Weißbach $id = trim((string)$raw_id); 1537d101cc1SGerry Weißbach // $id = utf8_strtolower($id); // NO LowerCase for us! 1547d101cc1SGerry Weißbach 1557d101cc1SGerry Weißbach //alternative namespace seperator 1567d101cc1SGerry Weißbach $id = strtr($id,';',':'); 1577d101cc1SGerry Weißbach if($conf['useslash']){ 1587d101cc1SGerry Weißbach $id = strtr($id,'/',':'); 1597d101cc1SGerry Weißbach }else{ 1607d101cc1SGerry Weißbach $id = strtr($id,'/',$sepchar); 1617d101cc1SGerry Weißbach } 1627d101cc1SGerry Weißbach 1637d101cc1SGerry Weißbach if($conf['deaccent'] == 2 || $ascii) $id = utf8_romanize($id); 1647d101cc1SGerry Weißbach if($conf['deaccent'] || $ascii) $id = utf8_deaccent($id,-1); 1657d101cc1SGerry Weißbach 1667d101cc1SGerry Weißbach //remove specials 1677d101cc1SGerry Weißbach $id = utf8_stripspecials($id,$sepchar,'\*'); 1687d101cc1SGerry Weißbach 1697d101cc1SGerry Weißbach if($ascii) $id = utf8_strip($id); 1707d101cc1SGerry Weißbach 1717d101cc1SGerry Weißbach //clean up 1727d101cc1SGerry Weißbach $id = preg_replace($sepcharpat,$sepchar,$id); 1737d101cc1SGerry Weißbach $id = preg_replace('#:+#',':',$id); 1747d101cc1SGerry Weißbach $id = ($media ? trim($id,':.-') : trim($id,':._-')); 1757d101cc1SGerry Weißbach $id = preg_replace('#:[:\._\-]+#',':',$id); 1767d101cc1SGerry Weißbach 1777d101cc1SGerry Weißbach $cache[(string)$raw_id] = $id; 1787d101cc1SGerry Weißbach return($id); 1797d101cc1SGerry Weißbach } 1807d101cc1SGerry Weißbach 1817d101cc1SGerry Weißbach 1827d101cc1SGerry Weißbach /** 1837d101cc1SGerry Weißbach * This builds a link to a wikipage - changed for internal use here 1847d101cc1SGerry Weißbach * 1857d101cc1SGerry Weißbach * It handles URL rewriting and adds additional parameter if 1867d101cc1SGerry Weißbach * given in $more 1877d101cc1SGerry Weißbach * 1887d101cc1SGerry Weißbach * @author Andreas Gohr <andi@splitbrain.org> 1897d101cc1SGerry Weißbach */ 1907d101cc1SGerry Weißbach 1917d101cc1SGerry Weißbach function wl($id='',$more='',$abs=false,$sep='&', $IDexists=true, $overrideRewrite=false, $hadBase=false){ 1927d101cc1SGerry Weißbach global $conf; 1937d101cc1SGerry Weißbach 194*1d20b534SGerry Weißbach $this->debug->message("Starting to build WL-URL for '$id'", $more, 1); 1957d101cc1SGerry Weißbach 1967d101cc1SGerry Weißbach if(is_array($more)){ 197*1d20b534SGerry Weißbach 198*1d20b534SGerry Weißbach $intermediateMore = ''; 199*1d20b534SGerry Weißbach foreach( $more as $key => $value) { 200*1d20b534SGerry Weißbach 201*1d20b534SGerry Weißbach if ( strlen($intermediateMore) > 0 ) { 202*1d20b534SGerry Weißbach $intermediateMore .= $sep; 203*1d20b534SGerry Weißbach } 204*1d20b534SGerry Weißbach 205*1d20b534SGerry Weißbach if ( !is_array($value) ) { 206*1d20b534SGerry Weißbach $intermediateMore .= rawurlencode($key) . '='; 207*1d20b534SGerry Weißbach $intermediateMore .= rawurlencode($value); 208*1d20b534SGerry Weißbach continue; 209*1d20b534SGerry Weißbach } 210*1d20b534SGerry Weißbach 211*1d20b534SGerry Weißbach foreach( $value as $val ) { 212*1d20b534SGerry Weißbach if ( strlen($intermediateMore) > 0 ) { 213*1d20b534SGerry Weißbach $intermediateMore .= $sep; 214*1d20b534SGerry Weißbach } 215*1d20b534SGerry Weißbach 216*1d20b534SGerry Weißbach $intermediateMore .= rawurlencode($key) . '[]='; 217*1d20b534SGerry Weißbach $intermediateMore .= rawurlencode($val); 218*1d20b534SGerry Weißbach } 219*1d20b534SGerry Weißbach } 220*1d20b534SGerry Weißbach 221*1d20b534SGerry Weißbach $more = $intermediateMore; 2227d101cc1SGerry Weißbach }else{ 2237d101cc1SGerry Weißbach $more = str_replace(',',$sep,$more); 2247d101cc1SGerry Weißbach } 2257d101cc1SGerry Weißbach 2267d101cc1SGerry Weißbach $id = idfilter($id); 2277d101cc1SGerry Weißbach 2287d101cc1SGerry Weißbach if($abs){ 2297d101cc1SGerry Weißbach $xlink = DOKU_URL; 2307d101cc1SGerry 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. 2317d101cc1SGerry Weißbach $xlink = preg_replace('#' . DOKU_BASE . '$#', '', $xlink); 2327d101cc1SGerry Weißbach } 2337d101cc1SGerry Weißbach }else if ($IDexists || $hadBase) { // if the ID does exist, we may add the base. 2347d101cc1SGerry Weißbach $xlink = DOKU_BASE; 2357d101cc1SGerry Weißbach } else{ 2367d101cc1SGerry Weißbach $xlink = ""; 2377d101cc1SGerry Weißbach } 2387d101cc1SGerry Weißbach 2397d101cc1SGerry Weißbach // $this->debug->message("internal WL function Before Replacing: '$xlink'", array(DOKU_REL, DOKU_URL, DOKU_BASE, $xlink), 2); 2407d101cc1SGerry Weißbach $xlink = preg_replace('#(?<!http:|https:)//+#','/', ($abs ? '' : '/') . "$xlink/"); // ensure slashes at beginning and ending, but strip doubles 2417d101cc1SGerry Weißbach $this->debug->message("'$xlink'", array(DOKU_REL, DOKU_URL, DOKU_BASE, $xlink), 2); 2427d101cc1SGerry Weißbach 2437d101cc1SGerry Weißbach if ( $overrideRewrite ) { 2447d101cc1SGerry Weißbach $this->debug->message("Override enabled.", null, 1); 2457d101cc1SGerry Weißbach $id = strtr($id,':','/'); 2467d101cc1SGerry Weißbach 2477d101cc1SGerry Weißbach $xlink .= $id; 2487d101cc1SGerry Weißbach if($more) $xlink .= '?'.$more; 2497d101cc1SGerry Weißbach } else { 2507d101cc1SGerry Weißbach if($conf['userewrite'] == 2 ){ 2517d101cc1SGerry Weißbach $xlink .= DOKU_SCRIPT.'/'.$id; 2527d101cc1SGerry Weißbach if($more) $xlink .= '?'.$more; 2537d101cc1SGerry Weißbach }elseif($conf['userewrite'] ){ 2547d101cc1SGerry Weißbach $xlink .= $id; 2557d101cc1SGerry Weißbach if($more) $xlink .= '?'.$more; 2567d101cc1SGerry Weißbach }elseif($id){ 2577d101cc1SGerry Weißbach $xlink .= DOKU_SCRIPT.'?id='.$id; 2587d101cc1SGerry Weißbach if($more) $xlink .= $sep.$more; 2597d101cc1SGerry Weißbach }else{ 2607d101cc1SGerry Weißbach $xlink .= DOKU_SCRIPT; 2617d101cc1SGerry Weißbach if($more) $xlink .= '?'.$more; 2627d101cc1SGerry Weißbach } 2637d101cc1SGerry Weißbach } 2647d101cc1SGerry Weißbach 2657d101cc1SGerry Weißbach $this->debug->message("internal WL function result: '$xlink'", null, 2); 2667d101cc1SGerry Weißbach 2677d101cc1SGerry Weißbach return $xlink; 2687d101cc1SGerry Weißbach } 2697d101cc1SGerry Weißbach 2707d101cc1SGerry Weißbach /** 2717d101cc1SGerry Weißbach * Create the export file name - this is the file where everything is being stored 2727d101cc1SGerry Weißbach * @param $FILE 2737d101cc1SGerry Weißbach * @param $PATTERN - additional pattern for re-using old files 2747d101cc1SGerry Weißbach */ 2757d101cc1SGerry Weißbach public function getSpecialExportFileName($FILE, $PATTERN=null) { 2767d101cc1SGerry Weißbach 2777d101cc1SGerry Weißbach if ( empty($FILE) ) 2787d101cc1SGerry Weißbach { 2797d101cc1SGerry Weißbach $FILE = $this->settings->origZipFile; 2807d101cc1SGerry Weißbach } 2817d101cc1SGerry Weißbach 2827d101cc1SGerry Weißbach if ( empty($PATTERN) && empty($this->settings->pattern) ){ 2837d101cc1SGerry Weißbach $this->debug("Generating an internal md5 pattern. This will go wrong - and won't cache properly."); 2847d101cc1SGerry Weißbach $PATTERN = md5(microtime(false)); 2857d101cc1SGerry Weißbach } 2867d101cc1SGerry Weißbach 2877d101cc1SGerry Weißbach // Set Pattern Global for other stuff 2887d101cc1SGerry Weißbach if ( empty($this->settings->pattern) ) { 2897d101cc1SGerry Weißbach $this->settings['pattern'] = $PATTERN; 2907d101cc1SGerry Weißbach } else { 2917d101cc1SGerry Weißbach $PATTERN = $this->settings->pattern; 2927d101cc1SGerry Weißbach } 2937d101cc1SGerry Weißbach 2947d101cc1SGerry Weißbach $FA = explode('.', $FILE); 2957d101cc1SGerry Weißbach $EXT = array_pop($FA); 2967d101cc1SGerry Weißbach array_push($FA, 'auto'); 2977d101cc1SGerry Weißbach array_push($FA, $PATTERN); 2987d101cc1SGerry Weißbach array_push($FA, $EXT); 2997d101cc1SGerry Weißbach 3007d101cc1SGerry Weißbach $fileName = implode('.', $FA); 3017d101cc1SGerry Weißbach $this->debug->message("Export Filename for '$FILE' will be: '$fileName'", null, 2); 3027d101cc1SGerry Weißbach return $fileName; 3037d101cc1SGerry Weißbach } 3047d101cc1SGerry Weißbach 3057d101cc1SGerry Weißbach public function getCacheFileNameForPattern($PATTERN = null) 3067d101cc1SGerry Weißbach { 3077d101cc1SGerry Weißbach if ( $PATTERN == null ) { 3087d101cc1SGerry Weißbach $PATTERN = $this->settings->pattern; 3097d101cc1SGerry Weißbach } 3107d101cc1SGerry Weißbach 3117d101cc1SGerry Weißbach return getCacheName($this->getSpecialExportFileName($this->settings->origZipFile, $PATTERN), '.' . basename(mediaFN($this->settings->origZipFile)) ); 3127d101cc1SGerry Weißbach } 3137d101cc1SGerry Weißbach 3147d101cc1SGerry Weißbach function startRedirctProcess($counter) { 3157d101cc1SGerry Weißbach global $ID; 3167d101cc1SGerry Weißbach 3177d101cc1SGerry Weißbach $URL = wl($ID); 3187d101cc1SGerry Weißbach 3197d101cc1SGerry Weißbach $additionalParameters = $_REQUEST; 3207d101cc1SGerry Weißbach $additionalParameters['startcounter'] = $counter; 3217d101cc1SGerry Weißbach $additionalParameters['pattern'] = $this->settings->pattern; 3227d101cc1SGerry Weißbach 3237d101cc1SGerry Weißbach unset($additionalParameters['id']); 3247d101cc1SGerry Weißbach unset($additionalParameters['u']); 3257d101cc1SGerry Weißbach unset($additionalParameters['p']); 3267d101cc1SGerry Weißbach unset($additionalParameters['r']); 3277d101cc1SGerry Weißbach unset($additionalParameters['http_credentials']); 3287d101cc1SGerry Weißbach 3297d101cc1SGerry Weißbach $this->addAdditionalParametersToURL($URL, $additionalParameters); 3307d101cc1SGerry Weißbach $this->debug->message("Redirecting to '$URL'", null, 2); 3317d101cc1SGerry Weißbach 3327d101cc1SGerry Weißbach send_redirect($URL); 3337d101cc1SGerry Weißbach exit(0); // Should not be reached, but anyways 3347d101cc1SGerry Weißbach } 3357d101cc1SGerry Weißbach 3367d101cc1SGerry Weißbach /** 3377d101cc1SGerry Weißbach * Builds additional Parameters into the URL given 3387d101cc1SGerry Weißbach * @param $URL 3397d101cc1SGerry Weißbach * @param $newAdditionalParameters 3407d101cc1SGerry Weißbach */ 3417d101cc1SGerry Weißbach function addAdditionalParametersToURL(&$URL, $newAdditionalParameters) { 3427d101cc1SGerry Weißbach 3437d101cc1SGerry Weißbach // Add additionalParameters 3447d101cc1SGerry Weißbach if ( !empty($newAdditionalParameters) ) { 3457d101cc1SGerry Weißbach foreach($newAdditionalParameters as $key => $value ) { 3467d101cc1SGerry Weißbach if ( empty($key) || empty($value) ) { continue; } 3477d101cc1SGerry Weißbach 3487d101cc1SGerry Weißbach $append = ''; 3497d101cc1SGerry Weißbach 3507d101cc1SGerry Weißbach if ( is_array($value) ) { 3517d101cc1SGerry Weißbach foreach( array_values($value) as $aValue ) { // Array Handling 3527d101cc1SGerry Weißbach $URL .= (strstr($URL, '?') ? '&' : '?') . $key . "[]=$aValue"; 3537d101cc1SGerry Weißbach } 3547d101cc1SGerry Weißbach } else { 3557d101cc1SGerry Weißbach $append = "$key=$value"; 3567d101cc1SGerry Weißbach $URL .= empty($append) || strstr($URL, $append) ? '' : (strstr($URL, '?') ? '&' : '?') . $append; 3577d101cc1SGerry Weißbach } 3587d101cc1SGerry Weißbach 3597d101cc1SGerry Weißbach } 3607d101cc1SGerry Weißbach } 3617d101cc1SGerry Weißbach } 3627d101cc1SGerry Weißbach 3637d101cc1SGerry Weißbach /** 3647d101cc1SGerry Weißbach * Cleans the wiki variables and returns a rebuild URL that has the new variables at hand 3657d101cc1SGerry Weißbach * @param $data 3667d101cc1SGerry Weißbach */ 3677d101cc1SGerry Weißbach function prepare_POSTData($data) 3687d101cc1SGerry Weißbach { 3697d101cc1SGerry Weißbach $NS = !empty($data['ns']) ? $data['ns'] : $data['id']; 3707d101cc1SGerry Weißbach 3717d101cc1SGerry Weißbach $this->removeWikiVariables($data); 3727d101cc1SGerry Weißbach $data['do'] = 'siteexport'; 3737d101cc1SGerry Weißbach $additionalKeys = ''; 3747d101cc1SGerry Weißbach 3757d101cc1SGerry Weißbach ksort($data); 3767d101cc1SGerry Weißbach 3777d101cc1SGerry Weißbach $this->debug->message("Prepared POST data:", $data, 1); 3787d101cc1SGerry Weißbach 3797d101cc1SGerry Weißbach foreach( $data as $key => $value ) { 3807d101cc1SGerry Weißbach 3817d101cc1SGerry Weißbach if ( !is_array($value) ) { continue; } 3827d101cc1SGerry Weißbach $this->debug->message("Found inner Array:", $value, 1); 3837d101cc1SGerry Weißbach 3847d101cc1SGerry Weißbach asort($value); 3857d101cc1SGerry Weißbach foreach ( $value as $innerKey => $aValue ) 3867d101cc1SGerry Weißbach { 3877d101cc1SGerry Weißbach if ( is_numeric($innerKey)) 3887d101cc1SGerry Weißbach { 3897d101cc1SGerry Weißbach $innerKey = ''; 3907d101cc1SGerry Weißbach } 3917d101cc1SGerry Weißbach 3927d101cc1SGerry Weißbach $additionalKeys .= "&$key" . "[$innerKey]=$aValue"; 3937d101cc1SGerry Weißbach } 3947d101cc1SGerry Weißbach 3957d101cc1SGerry Weißbach unset($data[$key]); 3967d101cc1SGerry Weißbach } 3977d101cc1SGerry Weißbach 3987d101cc1SGerry Weißbach return wl($NS, $data, true, '&') . $additionalKeys; 3997d101cc1SGerry Weißbach } 4007d101cc1SGerry Weißbach 4017d101cc1SGerry Weißbach /** 4027d101cc1SGerry Weißbach * Parses a String into a $_REQUEST Like variant. You have to tell if a decode of the values is needed 4037d101cc1SGerry Weißbach * @param $inputArray 4047d101cc1SGerry Weißbach * @param $decode 4057d101cc1SGerry Weißbach */ 4067d101cc1SGerry Weißbach public function parseStringToRequestArray($inputArray, $decode=false) 4077d101cc1SGerry Weißbach { 4087d101cc1SGerry Weißbach global $plugin_controller; 4097d101cc1SGerry Weißbach 4107d101cc1SGerry Weißbach $outputArray = $inputArray; 4117d101cc1SGerry Weißbach if ( !is_array($inputArray) ) 4127d101cc1SGerry Weißbach { 4137d101cc1SGerry Weißbach $intermediate = str_replace("&", "&", $inputArray); 4147d101cc1SGerry Weißbach 4157d101cc1SGerry Weißbach $outputArray = array(); 4167d101cc1SGerry Weißbach foreach( explode("&", $intermediate) as $param ) { 4177d101cc1SGerry Weißbach list($key, $value) = explode("=", $param, 2); 4187d101cc1SGerry Weißbach 4197d101cc1SGerry Weißbach // This is needed if we do want to calculate $_REQUEST for a non HTTP-Request 4207d101cc1SGerry Weißbach if ( $decode) 4217d101cc1SGerry Weißbach { 4227d101cc1SGerry Weißbach $value = urldecode($value); 4237d101cc1SGerry Weißbach } 4247d101cc1SGerry Weißbach 4257d101cc1SGerry Weißbach if ( empty($key) ) { continue; } // Don't check on Value, because there may be only the key that should be preserved 4267d101cc1SGerry Weißbach 4277d101cc1SGerry Weißbach if ( substr($key, -2) == '[]' ) { 4287d101cc1SGerry Weißbach $key = substr($key, 0, -2); 4297d101cc1SGerry Weißbach if ( !is_array($outputArray[$key]) ) { 4307d101cc1SGerry Weißbach $outputArray[$key] = array(); 4317d101cc1SGerry Weißbach } 4327d101cc1SGerry Weißbach 4337d101cc1SGerry Weißbach array_push($outputArray[$key], $value); // Array Handling 4347d101cc1SGerry Weißbach } else { 4357d101cc1SGerry Weißbach $outputArray[$key] = $value; 4367d101cc1SGerry Weißbach } 4377d101cc1SGerry Weißbach } 4387d101cc1SGerry Weißbach } 4397d101cc1SGerry Weißbach 4407d101cc1SGerry Weißbach if ( !empty($outputArray['diPlu']) ) { 4417d101cc1SGerry Weißbach 4427d101cc1SGerry Weißbach $allPlugins = array(); 4437d101cc1SGerry Weißbach foreach($plugin_controller->getList(null,true) as $plugin ) { 4447d101cc1SGerry Weißbach // check for CSS or JS 4457d101cc1SGerry Weißbach if ( !file_exists(DOKU_PLUGIN."$plugin/script.js") && !file_exists(DOKU_PLUGIN."$p/style.css") ) { continue; } 4467d101cc1SGerry Weißbach $allPlugins[] = $plugin; 4477d101cc1SGerry Weißbach } 4487d101cc1SGerry Weißbach 4497d101cc1SGerry Weißbach if ( count($outputArray['diPlu']) > (count($allPlugins) / 2) ) { 4507d101cc1SGerry Weißbach $outputArray['diInv'] = 1; 4517d101cc1SGerry Weißbach $outputArray['diPlu'] = array_diff($allPlugins, $outputArray['diPlu']); 4527d101cc1SGerry Weißbach } 4537d101cc1SGerry Weißbach } 4547d101cc1SGerry Weißbach 4557d101cc1SGerry Weißbach return $outputArray; 4567d101cc1SGerry Weißbach } 4577d101cc1SGerry Weißbach 4587d101cc1SGerry Weißbach /** 4597d101cc1SGerry Weißbach * Remove certain fields from the list. 4607d101cc1SGerry Weißbach * @param $removeArray 4617d101cc1SGerry Weißbach * @param $advanced 4627d101cc1SGerry Weißbach * @param $isString 4637d101cc1SGerry Weißbach */ 4647d101cc1SGerry Weißbach function removeWikiVariables(&$removeArray, $advanced=false, $isString=false) { 4657d101cc1SGerry Weißbach 4667d101cc1SGerry Weißbach $removeArray = $this->parseStringToRequestArray($removeArray); 4677d101cc1SGerry Weißbach 4687d101cc1SGerry Weißbach // 2010-08-23 - If there is still the media set, retain the id for e.g. detail.php 4697d101cc1SGerry Weißbach if ( !isset($removeArray['media']) ) { 4707d101cc1SGerry Weißbach unset($removeArray['id']); 4717d101cc1SGerry Weißbach } 4727d101cc1SGerry Weißbach 4737d101cc1SGerry Weißbach unset($removeArray['do']); 4747d101cc1SGerry Weißbach unset($removeArray['ns']); 4757d101cc1SGerry Weißbach unset($removeArray['call']); 4767d101cc1SGerry Weißbach unset($removeArray['sectok']); 4777d101cc1SGerry Weißbach unset($removeArray['rndval']); 4787d101cc1SGerry Weißbach unset($removeArray['tseed']); 4797d101cc1SGerry Weißbach unset($removeArray['http_credentials']); 4807d101cc1SGerry Weißbach unset($removeArray['u']); 4817d101cc1SGerry Weißbach unset($removeArray['p']); 4827d101cc1SGerry Weißbach unset($removeArray['r']); 4837d101cc1SGerry Weißbach unset($removeArray['base']); 4847d101cc1SGerry Weißbach unset($removeArray['siteexport']); 4857d101cc1SGerry Weißbach unset($removeArray['DokuWiki']); 4867d101cc1SGerry Weißbach unset($removeArray['cronOverwriteExisting']); 487c8c5e5ccSGerry Weißbach unset($removeArray['disableCache']); 4887d101cc1SGerry Weißbach 4897d101cc1SGerry Weißbach if ( $removeArray['renderer'] == 'xhtml' ) { 4907d101cc1SGerry Weißbach $removeArray['do'] = 'export_' . $removeArray['renderer']; 4917d101cc1SGerry Weißbach unset($removeArray['renderer']); 4927d101cc1SGerry Weißbach } 4937d101cc1SGerry Weißbach 4942270cdc5SGerry Weißbach // Keep custom options 4952270cdc5SGerry Weißbach if ( is_array($removeArray['customoptionname']) && is_array($removeArray['customoptionvalue']) && count($removeArray['customoptionname']) == count($removeArray['customoptionvalue']) ) 4962270cdc5SGerry Weißbach { 4972270cdc5SGerry Weißbach for( $index=0; $index<count($removeArray['customoptionname']); $index++) 4982270cdc5SGerry Weißbach { 4992270cdc5SGerry Weißbach $removeArray[$removeArray['customoptionname'][$index]] = $removeArray['customoptionvalue'][$index]; 5002270cdc5SGerry Weißbach } 5012270cdc5SGerry Weißbach unset($removeArray['customoptionname']); 5022270cdc5SGerry Weißbach unset($removeArray['customoptionvalue']); 5032270cdc5SGerry Weißbach 5042270cdc5SGerry Weißbach 5052270cdc5SGerry Weißbach if ( !empty( $removeArray['debug'] ) && intval($removeArray['debug']) >= 0 && intval($removeArray['debug']) <= 5) { 5062270cdc5SGerry Weißbach $this->debug->setDebugLevel(intval($removeArray['debug'])); 5072270cdc5SGerry Weißbach } 5082270cdc5SGerry Weißbach 5092270cdc5SGerry Weißbach unset($removeArray['debug']); 5102270cdc5SGerry Weißbach } 5112270cdc5SGerry Weißbach 5127d101cc1SGerry Weißbach if ( $advanced ) { 5137d101cc1SGerry Weißbach if ( $removeArray['renderer'] != 'xhtml' && !empty($removeArray['renderer']) ) { 5147d101cc1SGerry Weißbach $removeArray['do'] = 'export_' . $removeArray['renderer']; 5157d101cc1SGerry Weißbach } 5167d101cc1SGerry Weißbach 5177d101cc1SGerry Weißbach // 2010-08-25 - Need fakeMedia for some _detail cases with rewrite = 2 5187d101cc1SGerry Weißbach if ( isset($removeArray['fakeMedia']) ) { 5197d101cc1SGerry Weißbach unset($removeArray['media']); 5207d101cc1SGerry Weißbach unset($removeArray['fakeMedia']); 5217d101cc1SGerry Weißbach } 5227d101cc1SGerry Weißbach 5237d101cc1SGerry Weißbach /* remove internal params */ 5247d101cc1SGerry Weißbach unset($removeArray['ens']); 5257d101cc1SGerry Weißbach unset($removeArray['renderer']); 5267d101cc1SGerry Weißbach unset($removeArray['site']); 5277d101cc1SGerry Weißbach unset($removeArray['namespace']); 5287d101cc1SGerry Weißbach unset($removeArray['exportbody']); 5297d101cc1SGerry Weißbach unset($removeArray['addParams']); 5307d101cc1SGerry Weißbach unset($removeArray['template']); 5317d101cc1SGerry Weißbach unset($removeArray['eclipseDocZip']); 5327d101cc1SGerry Weißbach unset($removeArray['useTocFile']); 5337d101cc1SGerry Weißbach unset($removeArray['JavaHelpDocZip']); 5347d101cc1SGerry Weißbach unset($removeArray['depth']); 5357d101cc1SGerry Weißbach unset($removeArray['depthType']); 5367d101cc1SGerry Weißbach unset($removeArray['startcounter']); 5377d101cc1SGerry Weißbach unset($removeArray['pattern']); 5387d101cc1SGerry Weißbach unset($removeArray['TOCMapWithoutTranslation']); 5397d101cc1SGerry Weißbach } 5407d101cc1SGerry Weißbach 5417d101cc1SGerry Weißbach if ( $isString && is_array($removeArray) ) { 5427d101cc1SGerry Weißbach $intermediate = $removeArray; 5437d101cc1SGerry Weißbach $removeArray = array(); 5447d101cc1SGerry Weißbach 5457d101cc1SGerry Weißbach foreach ( $intermediate as $key => $value ) { 5467d101cc1SGerry Weißbach if ( is_array($value) ) { 5477d101cc1SGerry Weißbach foreach( array_values($value) as $aValue ) { // Array Handling 5487d101cc1SGerry Weißbach $removeArray[] = $key . "[]=$aValue"; 5497d101cc1SGerry Weißbach } 5507d101cc1SGerry Weißbach } else { 5517d101cc1SGerry Weißbach $value = trim($value); 5527d101cc1SGerry Weißbach 5537d101cc1SGerry Weißbach $removeArray[] = "$key" . ( ((empty($value) && intval($value) !== 0)) || $value == '' ? '' : "=$value" ); // If the Value is empty, the Key must be preserved 5547d101cc1SGerry Weißbach } 5557d101cc1SGerry Weißbach } 5567d101cc1SGerry Weißbach 5570b4abc9fSGerry Weißbach //$removeArray = implode( ($this->settings->fileType == 'pdf' ? "&" : "&"), $removeArray); 5580b4abc9fSGerry Weißbach $removeArray = implode( "&", $removeArray); // The & made problems with the HTTPClient / Apache. It should not be a problem to have & 5597d101cc1SGerry Weißbach } 5607d101cc1SGerry Weißbach } 5617d101cc1SGerry Weißbach 5627d101cc1SGerry Weißbach /** 5637d101cc1SGerry Weißbach * authenticate for direct downloads 5647d101cc1SGerry Weißbach **/ 5657d101cc1SGerry Weißbach function basic_authentication() { 5667d101cc1SGerry Weißbach if (!isset($_SERVER['PHP_AUTH_USER'])) { 5678da901a0SGerry Weißbach $this->debug->message("Needs Authentication.", null, 2); 5687d101cc1SGerry Weißbach header('WWW-Authenticate: Basic realm="Siteexport Authentication"'); 5697d101cc1SGerry Weißbach header('HTTP/1.0 401 Unauthorized'); 5707d101cc1SGerry Weißbach print 'Unauthorized'; // print has to stay here 5717d101cc1SGerry Weißbach exit; 5727d101cc1SGerry Weißbach } 5737d101cc1SGerry Weißbach 5747d101cc1SGerry Weißbach return array($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']); 5757d101cc1SGerry Weißbach } 5767d101cc1SGerry Weißbach 5777d101cc1SGerry Weißbach /** 5787d101cc1SGerry Weißbach * returns a hashed name for the parameters 5797d101cc1SGerry Weißbach * @param $parameters 5807d101cc1SGerry Weißbach */ 5817d101cc1SGerry Weißbach public function cronJobNameForParameters($parameters) 5827d101cc1SGerry Weißbach { 5837d101cc1SGerry Weißbach return md5($parameters); 5847d101cc1SGerry Weißbach } 5857d101cc1SGerry Weißbach 5867d101cc1SGerry Weißbach /** 5877d101cc1SGerry Weißbach * Takes an URL and transforms it into the path+query part 5887d101cc1SGerry Weißbach * Used several times, e.g. for genering the hash for the cache file 5897d101cc1SGerry Weißbach * @param $url 5907d101cc1SGerry Weißbach */ 5917d101cc1SGerry Weißbach public function urlToPathAndParams($url) 5927d101cc1SGerry Weißbach { 5937d101cc1SGerry Weißbach $query = parse_url($url, PHP_URL_QUERY); 5947d101cc1SGerry Weißbach $path = preg_replace(":^".DOKU_REL.":", "", parse_url($url, PHP_URL_PATH)); 5957d101cc1SGerry Weißbach return "{$path}?{$query}"; 5967d101cc1SGerry Weißbach } 5977d101cc1SGerry Weißbach 5987d101cc1SGerry Weißbach /** 5997d101cc1SGerry Weißbach * Transforms an $_REQUEST into a Hash that can be used for cron and cache file 6007d101cc1SGerry Weißbach * @param $request 6017d101cc1SGerry Weißbach */ 6027d101cc1SGerry Weißbach public function requestParametersToCacheHash($request) 6037d101cc1SGerry Weißbach { 6047d101cc1SGerry Weißbach $params = $this->urlToPathAndParams($this->prepare_POSTData($request)); 6057d101cc1SGerry Weißbach $this->debug->message("Calculated the following Cache Hash URL: ", $params, 2); 6067d101cc1SGerry Weißbach return $this->cronJobNameForParameters($params); 6077d101cc1SGerry Weißbach } 6087d101cc1SGerry Weißbach 6097d101cc1SGerry Weißbach /** 6107d101cc1SGerry Weißbach * Check a replaceID against a baseID - and make the replaceID relative against it 6117d101cc1SGerry Weißbach * @param $replaceID - ID which will be made relative if needed 6127d101cc1SGerry Weißbach * @param $baseID - ID which is the reference to be made relative against 6137d101cc1SGerry Weißbach */ 6147d101cc1SGerry Weißbach public function getRelativeURL($replaceID, $baseID) 6157d101cc1SGerry Weißbach { 6167d101cc1SGerry Weißbach $origReplaceID = $replaceID; 6177d101cc1SGerry Weißbach 6187d101cc1SGerry Weißbach $replaceTmp = cleanID($replaceID); 6197d101cc1SGerry Weißbach $file = noNS($replaceTmp); 6207d101cc1SGerry Weißbach 6217d101cc1SGerry Weißbach $replaceID = getNS($replaceTmp); 6227d101cc1SGerry Weißbach $baseID = getNS($baseID); 6237d101cc1SGerry Weißbach 6247d101cc1SGerry Weißbach $replaceParts = explode(':', $replaceID); 6257d101cc1SGerry Weißbach $baseParts = explode(':', $baseID); 6267d101cc1SGerry Weißbach $exportNSParts = explode(':', cleanID($this->settings->exportNamespace)); 6277d101cc1SGerry Weißbach 6287d101cc1SGerry Weißbach $newBase = array(); 6297d101cc1SGerry Weißbach 6307d101cc1SGerry Weißbach foreach($exportNSParts as $exportNS) 6317d101cc1SGerry Weißbach { 6327d101cc1SGerry Weißbach if ( $replaceParts[0] == $exportNS && $baseParts[0] == $exportNS ) 6337d101cc1SGerry Weißbach { 6347d101cc1SGerry Weißbach array_shift($replaceParts); 6357d101cc1SGerry Weißbach array_shift($baseParts); 6367d101cc1SGerry Weißbach array_shift($exportNSParts); 6377d101cc1SGerry Weißbach } 6387d101cc1SGerry Weißbach else { 6397d101cc1SGerry Weißbach // Nothing is matching anymore 6407d101cc1SGerry Weißbach break; 6417d101cc1SGerry Weißbach } 6427d101cc1SGerry Weißbach } 6437d101cc1SGerry Weißbach 6447d101cc1SGerry Weißbach $i = count($exportNSParts); 6457d101cc1SGerry Weißbach $this->debug->message("Checking", array('current extra removing amount'=>$i,'replace'=>$replaceParts,'base'=>$baseParts,'exportNSParts'=>$exportNSParts),1); 6467d101cc1SGerry Weißbach 6477d101cc1SGerry Weißbach // Now if there is just one item in the ens left and it matches the base, but not the replace, this miiiiiight be the case we want. 6487d101cc1SGerry Weißbach if ( count($exportNSParts) == 1 && $exportNSParts[0] == $baseParts[0] ) 6497d101cc1SGerry Weißbach { 6507d101cc1SGerry Weißbach array_shift($replaceParts); 6517d101cc1SGerry Weißbach $newBase = implode('/', $replaceParts); 6527d101cc1SGerry Weißbach 6537d101cc1SGerry Weißbach if ( substr($newBase, -1) != '/' ) 6547d101cc1SGerry Weißbach { 6557d101cc1SGerry Weißbach $newBase .= '/'; 6567d101cc1SGerry Weißbach } 6577d101cc1SGerry Weißbach 6587d101cc1SGerry Weißbach $this->debug->message("new Base: ", $newBase, 1); 6597d101cc1SGerry Weißbach 6607d101cc1SGerry Weißbach // Now check from the beginning ... 6617d101cc1SGerry Weißbach return $newBase . $file; 6627d101cc1SGerry Weißbach } 6637d101cc1SGerry Weißbach 6647d101cc1SGerry Weißbach return $origReplaceID; 6657d101cc1SGerry Weißbach } 6667d101cc1SGerry Weißbach} 6677d101cc1SGerry Weißbach 6687d101cc1SGerry Weißbach?>