xref: /plugin/siteexport/inc/functions.php (revision 774a858a87b3789a441847df235e8e79318f3a17)
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    {
316792d0cfSGerry Weißbach        $params = array('cache' => 'nocache', 'siteexport' => $this->settings->pattern);
326792d0cfSGerry Weißbach
336792d0cfSGerry Weißbach        if ( $this->debug->debugLevel() < 5 ) {
346792d0cfSGerry Weißbach            // If debug, then debug!
356792d0cfSGerry Weißbach            $params['debug'] = $this->debug->debugLevel();
366792d0cfSGerry Weißbach        }
376792d0cfSGerry Weißbach
386792d0cfSGerry Weißbach        return ml($this->settings->origZipFile, $params, true, '&');
397d101cc1SGerry Weißbach    }
407d101cc1SGerry Weißbach
417d101cc1SGerry Weißbach    public function checkIfCacheFileExistsForFileWithPattern($file, $pattern)
427d101cc1SGerry Weißbach    {
437d101cc1SGerry Weißbach        if ( !@file_exists($file) )
447d101cc1SGerry Weißbach        {
457d101cc1SGerry Weißbach            // If the cache File does not exist, move the newly created one over ...
466792d0cfSGerry Weißbach            $this->debug->message("'{$file}' does not exist. Checking original ZipFile", null, 3 );
477d101cc1SGerry Weißbach            $newCacheFile = mediaFN($this->getSpecialExportFileName($this->settings->origZipFile, $pattern));
487d101cc1SGerry Weißbach
497d101cc1SGerry Weißbach            if ( !@file_exists($newCacheFile) )
507d101cc1SGerry Weißbach            {
517d101cc1SGerry 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);
527d101cc1SGerry Weißbach            }
537d101cc1SGerry Weißbach
547d101cc1SGerry Weißbach            $status = io_rename($newCacheFile, $file);
557d101cc1SGerry 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 );
566792d0cfSGerry Weißbach        } else {
576792d0cfSGerry Weißbach            $this->debug->message("The file does exist!", $file, 2 );
587d101cc1SGerry Weißbach        }
597d101cc1SGerry Weißbach    }
607d101cc1SGerry Weißbach
617d101cc1SGerry Weißbach
627d101cc1SGerry Weißbach    /**
637d101cc1SGerry Weißbach     * Returns an utf8 encoded Namespace for a Page and input Namespace
647d101cc1SGerry Weißbach     * @param $NS
657d101cc1SGerry Weißbach     * @param $PAGE
667d101cc1SGerry Weißbach     */
677d101cc1SGerry Weißbach    function getNamespaceFromID($NS, &$PAGE) {
687d101cc1SGerry Weißbach        global $conf;
697d101cc1SGerry Weißbach        // Check current page - if its an NS add the startpage
707d101cc1SGerry Weißbach        $clean = true;
717d101cc1SGerry Weißbach        resolve_pageid(getNS($NS), $NS, $clean);
723aa0ad13SGerry Weißbach        $NSa = explode(':', $NS);
733aa0ad13SGerry Weißbach        if ( ! page_exists($NS) && array_pop($NSa) != strtolower($conf['start'] )) { // Compare to lowercase since clean lowers it.
747d101cc1SGerry Weißbach            $NS .= ':' . $conf['start'];
757d101cc1SGerry Weißbach            resolve_pageid(getNS($NS), $NS, $clean);
767d101cc1SGerry Weißbach        }
777d101cc1SGerry Weißbach
787d101cc1SGerry Weißbach        $PAGE = noNS($NS);
797d101cc1SGerry Weißbach        $NS = getNS($NS);
807d101cc1SGerry Weißbach
817d101cc1SGerry Weißbach        return utf8_encodeFN(str_replace(':', '/', $NS));
827d101cc1SGerry Weißbach    }
837d101cc1SGerry Weißbach
847d101cc1SGerry Weißbach    /**
857d101cc1SGerry Weißbach     * create a file name for the page
867d101cc1SGerry Weißbach     **/
877d101cc1SGerry Weißbach    public function getSiteName($ID, $overrideRewrite=false) {
887d101cc1SGerry Weißbach        global $conf;
897d101cc1SGerry Weißbach
907d101cc1SGerry Weißbach        if ( empty($ID) ) return false;
917d101cc1SGerry Weißbach
924c9a39daSGerry Weißbach        // Remove extensions
934c9a39daSGerry Weißbach        if ( $overrideRewrite ) {
94c6d15ed9SGerry Weißbach            $ID = preg_replace("#\.(php|html)$#", '', $ID);
954c9a39daSGerry Weißbach        }
964c9a39daSGerry Weißbach
977d101cc1SGerry Weißbach        $url = $this->wl($this->cleanID($ID), null, true, null, null, $overrideRewrite); // this must be done with rewriting set to override
987d101cc1SGerry Weißbach        //$url = $this->wl($this->cleanID($ID), null, true); // this must be done with rewriting set to override
997d101cc1SGerry Weißbach        $uri = @parse_url($url);
1007d101cc1SGerry Weißbach        if ( $uri['path'][0] == '/' ) {
1017d101cc1SGerry Weißbach            $uri['path'] = substr($uri['path'], 1);
1027d101cc1SGerry Weißbach        }
1037d101cc1SGerry Weißbach
1047d101cc1SGerry Weißbach        return $this->shortenName($uri['path'] . '.' . $this->settings->fileType);
1057d101cc1SGerry Weißbach    }
1067d101cc1SGerry Weißbach
1077d101cc1SGerry Weißbach    /**
1087d101cc1SGerry Weißbach     * get the Title for the page
1097d101cc1SGerry Weißbach     **/
1107d101cc1SGerry Weißbach    public function getSiteTitle($ID) {
1117d101cc1SGerry Weißbach        if (useHeading('content') && $ID) {
1127d101cc1SGerry Weißbach            $heading = p_get_first_heading($ID,true);
1137d101cc1SGerry Weißbach            if ($heading) {
1147d101cc1SGerry Weißbach                return $this->xmlEntities($heading);
1157d101cc1SGerry Weißbach            }
1167d101cc1SGerry Weißbach        }
117bca58ac1SGerry Weißbach        $elements = explode(':', $ID);
118bca58ac1SGerry Weißbach        return ucwords($this->xmlEntities(array_pop($elements)));
1197d101cc1SGerry Weißbach    }
1207d101cc1SGerry Weißbach
1217d101cc1SGerry Weißbach    /**
1227d101cc1SGerry Weißbach     * Encoding ()taken from DW - but without needing the renderer
1237d101cc1SGerry Weißbach     **/
1247d101cc1SGerry Weißbach    public function xmlEntities($string) {
1257d101cc1SGerry Weißbach        return htmlspecialchars($string,ENT_QUOTES,'UTF-8');
1267d101cc1SGerry Weißbach    }
1277d101cc1SGerry Weißbach
1287d101cc1SGerry Weißbach    /**
1297d101cc1SGerry Weißbach     * Create name for the file inside the zip and the replacements
1307d101cc1SGerry Weißbach     **/
1317d101cc1SGerry Weißbach    function shortenName($NAME)
1327d101cc1SGerry Weißbach    {
1337d101cc1SGerry Weißbach        $NS = $this->settings->exportNamespace;
134*774a858aSGerry Weißbach        $NAME = preg_replace("%^" . preg_quote(DOKU_BASE, '%') . "%", "", $NAME);
135*774a858aSGerry Weißbach        $NAME = preg_replace("%^((_media|_detail)/)?(" . preg_quote($NS, '%') . "/)?%", "", $NAME);
1367d101cc1SGerry Weißbach
1377d101cc1SGerry Weißbach        $this->debug->message("Shortening file to '$NAME'", null, 1);
1387d101cc1SGerry Weißbach        return $NAME;
1397d101cc1SGerry Weißbach    }
1407d101cc1SGerry Weißbach
1417d101cc1SGerry Weißbach    /**
1427d101cc1SGerry Weißbach     * Remove unwanted chars from ID
1437d101cc1SGerry Weißbach     *
1447d101cc1SGerry Weißbach     * Cleans a given ID to only use allowed characters. Accented characters are
1457d101cc1SGerry Weißbach     * converted to unaccented ones
1467d101cc1SGerry Weißbach     *
1477d101cc1SGerry Weißbach     * @author Andreas Gohr <andi@splitbrain.org>
1487d101cc1SGerry Weißbach     * @param  string  $raw_id    The pageid to clean
1497d101cc1SGerry Weißbach     * @param  boolean $ascii     Force ASCII
1507d101cc1SGerry Weißbach     * @param  boolean $media     Allow leading or trailing _ for media files
1517d101cc1SGerry Weißbach     */
1527d101cc1SGerry Weißbach    function cleanID($raw_id,$ascii=false,$media=false){
1537d101cc1SGerry Weißbach        global $conf;
1547d101cc1SGerry Weißbach        global $lang;
1557d101cc1SGerry Weißbach        static $sepcharpat = null;
1567d101cc1SGerry Weißbach
1577d101cc1SGerry Weißbach        global $cache_cleanid;
1587d101cc1SGerry Weißbach        $cache = & $cache_cleanid;
1597d101cc1SGerry Weißbach
1607d101cc1SGerry Weißbach        // check if it's already in the memory cache
1617d101cc1SGerry Weißbach        if (isset($cache[(string)$raw_id])) {
1627d101cc1SGerry Weißbach            return $cache[(string)$raw_id];
1637d101cc1SGerry Weißbach        }
1647d101cc1SGerry Weißbach
1657d101cc1SGerry Weißbach        $sepchar = $conf['sepchar'];
1667d101cc1SGerry Weißbach        if($sepcharpat == null) // build string only once to save clock cycles
1677d101cc1SGerry Weißbach        $sepcharpat = '#\\'.$sepchar.'+#';
1687d101cc1SGerry Weißbach
1697d101cc1SGerry Weißbach        $id = trim((string)$raw_id);
1707d101cc1SGerry Weißbach        //        $id = utf8_strtolower($id); // NO LowerCase for us!
1717d101cc1SGerry Weißbach
1727d101cc1SGerry Weißbach        //alternative namespace seperator
1737d101cc1SGerry Weißbach        $id = strtr($id,';',':');
1747d101cc1SGerry Weißbach        if($conf['useslash']){
1757d101cc1SGerry Weißbach            $id = strtr($id,'/',':');
1767d101cc1SGerry Weißbach        }else{
1777d101cc1SGerry Weißbach            $id = strtr($id,'/',$sepchar);
1787d101cc1SGerry Weißbach        }
1797d101cc1SGerry Weißbach
1807d101cc1SGerry Weißbach        if($conf['deaccent'] == 2 || $ascii) $id = utf8_romanize($id);
1817d101cc1SGerry Weißbach        if($conf['deaccent'] || $ascii) $id = utf8_deaccent($id,-1);
1827d101cc1SGerry Weißbach
1835a843d1fSGerry Weißbach        // We want spaces to be preserved when they are in the link.
1845a843d1fSGerry Weißbach        global $UTF8_SPECIAL_CHARS2;
1855a843d1fSGerry Weißbach        $UTF8_SPECIAL_CHARS2_SAVE = (string)$UTF8_SPECIAL_CHARS2;
1865a843d1fSGerry Weißbach        $UTF8_SPECIAL_CHARS2 = str_replace(' ', '', $UTF8_SPECIAL_CHARS2);
1875a843d1fSGerry Weißbach
1887d101cc1SGerry Weißbach        //remove specials
1897d101cc1SGerry Weißbach        $id = utf8_stripspecials($id,$sepchar,'\*');
1905a843d1fSGerry Weißbach        $UTF8_SPECIAL_CHARS2 = $UTF8_SPECIAL_CHARS2_SAVE;
1917d101cc1SGerry Weißbach
1927d101cc1SGerry Weißbach        if($ascii) $id = utf8_strip($id);
1937d101cc1SGerry Weißbach
1947d101cc1SGerry Weißbach        //clean up
1957d101cc1SGerry Weißbach        $id = preg_replace($sepcharpat,$sepchar,$id);
1967d101cc1SGerry Weißbach        $id = preg_replace('#:+#',':',$id);
1977d101cc1SGerry Weißbach        $id = ($media ? trim($id,':.-') : trim($id,':._-'));
1987d101cc1SGerry Weißbach        $id = preg_replace('#:[:\._\-]+#',':',$id);
1997d101cc1SGerry Weißbach
2007d101cc1SGerry Weißbach        $cache[(string)$raw_id] = $id;
2017d101cc1SGerry Weißbach        return($id);
2027d101cc1SGerry Weißbach    }
2037d101cc1SGerry Weißbach
2047d101cc1SGerry Weißbach
2057d101cc1SGerry Weißbach    /**
2067d101cc1SGerry Weißbach     * This builds a link to a wikipage - changed for internal use here
2077d101cc1SGerry Weißbach     *
2087d101cc1SGerry Weißbach     * It handles URL rewriting and adds additional parameter if
2097d101cc1SGerry Weißbach     * given in $more
2107d101cc1SGerry Weißbach     *
2117d101cc1SGerry Weißbach     * @author Andreas Gohr <andi@splitbrain.org>
2127d101cc1SGerry Weißbach     */
2137d101cc1SGerry Weißbach
2147d101cc1SGerry Weißbach    function wl($id='',$more='',$abs=false,$sep='&amp;', $IDexists=true, $overrideRewrite=false, $hadBase=false){
2157d101cc1SGerry Weißbach        global $conf;
2167d101cc1SGerry Weißbach
2171d20b534SGerry Weißbach        $this->debug->message("Starting to build WL-URL for '$id'", $more, 1);
2187d101cc1SGerry Weißbach
2197d101cc1SGerry Weißbach        if(is_array($more)){
2201d20b534SGerry Weißbach
2211d20b534SGerry Weißbach        	$intermediateMore = '';
2221d20b534SGerry Weißbach        	foreach( $more as $key => $value) {
2231d20b534SGerry Weißbach
2241d20b534SGerry Weißbach        		if ( strlen($intermediateMore) > 0 ) {
2251d20b534SGerry Weißbach	        		$intermediateMore .= $sep;
2261d20b534SGerry Weißbach        		}
2271d20b534SGerry Weißbach
2281d20b534SGerry Weißbach	        	if ( !is_array($value) ) {
2291d20b534SGerry Weißbach		        	$intermediateMore .= rawurlencode($key) . '=';
2301d20b534SGerry Weißbach		        	$intermediateMore .= rawurlencode($value);
2311d20b534SGerry Weißbach		        	continue;
2321d20b534SGerry Weißbach	        	}
2331d20b534SGerry Weißbach
2341d20b534SGerry Weißbach	        	foreach( $value as $val ) {
2351d20b534SGerry Weißbach	        		if ( strlen($intermediateMore) > 0 ) {
2361d20b534SGerry Weißbach		        		$intermediateMore .= $sep;
2371d20b534SGerry Weißbach	        		}
2381d20b534SGerry Weißbach
2391d20b534SGerry Weißbach		        	$intermediateMore .= rawurlencode($key) . '[]=';
2401d20b534SGerry Weißbach		        	$intermediateMore .= rawurlencode($val);
2411d20b534SGerry Weißbach	        	}
2421d20b534SGerry Weißbach        	}
2431d20b534SGerry Weißbach
2441d20b534SGerry Weißbach            $more = $intermediateMore;
2457d101cc1SGerry Weißbach        }else{
2467d101cc1SGerry Weißbach            $more = str_replace(',',$sep,$more);
2477d101cc1SGerry Weißbach        }
2487d101cc1SGerry Weißbach
2497d101cc1SGerry Weißbach        $id = idfilter($id);
2507d101cc1SGerry Weißbach
2517d101cc1SGerry Weißbach        if($abs){
2527d101cc1SGerry Weißbach            $xlink = DOKU_URL;
2537d101cc1SGerry 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.
2547d101cc1SGerry Weißbach                $xlink = preg_replace('#' . DOKU_BASE . '$#', '', $xlink);
2557d101cc1SGerry Weißbach            }
2567d101cc1SGerry Weißbach        }else if ($IDexists || $hadBase) { // if the ID does exist, we may add the base.
2577d101cc1SGerry Weißbach            $xlink = DOKU_BASE;
2587d101cc1SGerry Weißbach        } else{
2597d101cc1SGerry Weißbach            $xlink = "";
2607d101cc1SGerry Weißbach        }
2617d101cc1SGerry Weißbach
2627d101cc1SGerry Weißbach        // $this->debug->message("internal WL function Before Replacing: '$xlink'", array(DOKU_REL, DOKU_URL, DOKU_BASE, $xlink), 2);
2637d101cc1SGerry Weißbach        $xlink = preg_replace('#(?<!http:|https:)//+#','/', ($abs ? '' : '/') . "$xlink/"); // ensure slashes at beginning and ending, but strip doubles
2647d101cc1SGerry Weißbach        $this->debug->message("'$xlink'", array(DOKU_REL, DOKU_URL, DOKU_BASE, $xlink), 2);
2657d101cc1SGerry Weißbach
2667d101cc1SGerry Weißbach        if ( $overrideRewrite ) {
2677d101cc1SGerry Weißbach            $this->debug->message("Override enabled.", null, 1);
2687d101cc1SGerry Weißbach            $id = strtr($id,':','/');
2697d101cc1SGerry Weißbach
2707d101cc1SGerry Weißbach            $xlink .= $id;
2717d101cc1SGerry Weißbach            if($more) $xlink .= '?'.$more;
2727d101cc1SGerry Weißbach        } else {
2737d101cc1SGerry Weißbach            if($conf['userewrite'] == 2 ){
2747d101cc1SGerry Weißbach                $xlink .= DOKU_SCRIPT.'/'.$id;
2757d101cc1SGerry Weißbach                if($more) $xlink .= '?'.$more;
2767d101cc1SGerry Weißbach            }elseif($conf['userewrite'] ){
2777d101cc1SGerry Weißbach                $xlink .= $id;
2787d101cc1SGerry Weißbach                if($more) $xlink .= '?'.$more;
2797d101cc1SGerry Weißbach            }elseif($id){
2807d101cc1SGerry Weißbach                $xlink .= DOKU_SCRIPT.'?id='.$id;
2817d101cc1SGerry Weißbach                if($more) $xlink .= $sep.$more;
2827d101cc1SGerry Weißbach            }else{
2837d101cc1SGerry Weißbach                $xlink .= DOKU_SCRIPT;
2847d101cc1SGerry Weißbach                if($more) $xlink .= '?'.$more;
2857d101cc1SGerry Weißbach            }
2867d101cc1SGerry Weißbach        }
2877d101cc1SGerry Weißbach
2887d101cc1SGerry Weißbach        $this->debug->message("internal WL function result: '$xlink'", null, 2);
2897d101cc1SGerry Weißbach
2907d101cc1SGerry Weißbach        return $xlink;
2917d101cc1SGerry Weißbach    }
2927d101cc1SGerry Weißbach
2937d101cc1SGerry Weißbach    /**
2947d101cc1SGerry Weißbach     * Create the export file name - this is the file where everything is being stored
2957d101cc1SGerry Weißbach     * @param $FILE
2967d101cc1SGerry Weißbach     * @param $PATTERN - additional pattern for re-using old files
2977d101cc1SGerry Weißbach     */
2987d101cc1SGerry Weißbach    public function getSpecialExportFileName($FILE, $PATTERN=null) {
2997d101cc1SGerry Weißbach
3007d101cc1SGerry Weißbach        if ( empty($FILE) )
3017d101cc1SGerry Weißbach        {
3027d101cc1SGerry Weißbach            $FILE = $this->settings->origZipFile;
3037d101cc1SGerry Weißbach        }
3047d101cc1SGerry Weißbach
3057d101cc1SGerry Weißbach        if ( empty($PATTERN) && empty($this->settings->pattern) ){
3066792d0cfSGerry Weißbach            $this->debug->message("Generating an internal md5 pattern. This will go wrong - and won't cache properly.", null, 3);
3077d101cc1SGerry Weißbach            $PATTERN = md5(microtime(false));
3087d101cc1SGerry Weißbach        }
3097d101cc1SGerry Weißbach
3107d101cc1SGerry Weißbach        // Set Pattern Global for other stuff
3117d101cc1SGerry Weißbach        if ( empty($this->settings->pattern) ) {
31282618ac8SGerry Weißbach            $this->settings['pattern'] = $PATTERN;
3137d101cc1SGerry Weißbach        } else {
3147d101cc1SGerry Weißbach            $PATTERN = $this->settings->pattern;
3157d101cc1SGerry Weißbach        }
3167d101cc1SGerry Weißbach
3177d101cc1SGerry Weißbach        $FA = explode('.', $FILE);
3187d101cc1SGerry Weißbach        $EXT = array_pop($FA);
3197d101cc1SGerry Weißbach        array_push($FA, 'auto');
3207d101cc1SGerry Weißbach        array_push($FA, $PATTERN);
3217d101cc1SGerry Weißbach        array_push($FA, $EXT);
3227d101cc1SGerry Weißbach
3237d101cc1SGerry Weißbach        $fileName = implode('.', $FA);
3247d101cc1SGerry Weißbach        $this->debug->message("Export Filename for '$FILE' will be: '$fileName'", null, 2);
3257d101cc1SGerry Weißbach        return $fileName;
3267d101cc1SGerry Weißbach    }
3277d101cc1SGerry Weißbach
3287d101cc1SGerry Weißbach    public function getCacheFileNameForPattern($PATTERN = null)
3297d101cc1SGerry Weißbach    {
3307d101cc1SGerry Weißbach        if ( $PATTERN == null ) {
3317d101cc1SGerry Weißbach            $PATTERN = $this->settings->pattern;
3327d101cc1SGerry Weißbach        }
3337d101cc1SGerry Weißbach
3347d101cc1SGerry Weißbach        return getCacheName($this->getSpecialExportFileName($this->settings->origZipFile, $PATTERN), '.' . basename(mediaFN($this->settings->origZipFile)) );
3357d101cc1SGerry Weißbach    }
3367d101cc1SGerry Weißbach
3377d101cc1SGerry Weißbach    function startRedirctProcess($counter) {
3387d101cc1SGerry Weißbach        global $ID;
3397d101cc1SGerry Weißbach
3407d101cc1SGerry Weißbach        $URL = wl($ID);
3417d101cc1SGerry Weißbach
3427d101cc1SGerry Weißbach        $additionalParameters = $_REQUEST;
3437d101cc1SGerry Weißbach        $additionalParameters['startcounter'] = $counter;
3447d101cc1SGerry Weißbach        $additionalParameters['pattern'] = $this->settings->pattern;
3457d101cc1SGerry Weißbach
3467d101cc1SGerry Weißbach        unset($additionalParameters['id']);
3477d101cc1SGerry Weißbach        unset($additionalParameters['u']);
3487d101cc1SGerry Weißbach        unset($additionalParameters['p']);
3497d101cc1SGerry Weißbach        unset($additionalParameters['r']);
3507d101cc1SGerry Weißbach        unset($additionalParameters['http_credentials']);
3517d101cc1SGerry Weißbach
3527d101cc1SGerry Weißbach        $this->addAdditionalParametersToURL($URL, $additionalParameters);
3537d101cc1SGerry Weißbach        $this->debug->message("Redirecting to '$URL'", null, 2);
3547d101cc1SGerry Weißbach
3557d101cc1SGerry Weißbach        send_redirect($URL);
3567d101cc1SGerry Weißbach        exit(0); // Should not be reached, but anyways
3577d101cc1SGerry Weißbach    }
3587d101cc1SGerry Weißbach
3597d101cc1SGerry Weißbach    /**
3607d101cc1SGerry Weißbach     * Builds additional Parameters into the URL given
3617d101cc1SGerry Weißbach     * @param $URL
3627d101cc1SGerry Weißbach     * @param $newAdditionalParameters
3637d101cc1SGerry Weißbach     */
3647d101cc1SGerry Weißbach    function addAdditionalParametersToURL(&$URL, $newAdditionalParameters) {
3657d101cc1SGerry Weißbach
3667d101cc1SGerry Weißbach        // Add additionalParameters
3677d101cc1SGerry Weißbach        if ( !empty($newAdditionalParameters) ) {
3687d101cc1SGerry Weißbach            foreach($newAdditionalParameters as $key => $value ) {
3697d101cc1SGerry Weißbach                if ( empty($key) || empty($value) ) { continue; }
3707d101cc1SGerry Weißbach
3717d101cc1SGerry Weißbach                $append = '';
3727d101cc1SGerry Weißbach
3737d101cc1SGerry Weißbach                if ( is_array($value) ) {
3747d101cc1SGerry Weißbach                    foreach( array_values($value) as $aValue ) { // Array Handling
3757d101cc1SGerry Weißbach                        $URL .= (strstr($URL, '?') ? '&' : '?') . $key . "[]=$aValue";
3767d101cc1SGerry Weißbach                    }
3777d101cc1SGerry Weißbach                } else {
3787d101cc1SGerry Weißbach                    $append = "$key=$value";
3797d101cc1SGerry Weißbach                    $URL .= empty($append) || strstr($URL, $append)  ? '' : (strstr($URL, '?') ? '&' : '?') . $append;
3807d101cc1SGerry Weißbach                }
3817d101cc1SGerry Weißbach
3827d101cc1SGerry Weißbach            }
3837d101cc1SGerry Weißbach        }
3847d101cc1SGerry Weißbach    }
3857d101cc1SGerry Weißbach
3867d101cc1SGerry Weißbach    /**
3877d101cc1SGerry Weißbach     * Cleans the wiki variables and returns a rebuild URL that has the new variables at hand
3887d101cc1SGerry Weißbach     * @param $data
3897d101cc1SGerry Weißbach     */
3907d101cc1SGerry Weißbach    function prepare_POSTData($data)
3917d101cc1SGerry Weißbach    {
3927d101cc1SGerry Weißbach        $NS = !empty($data['ns']) ? $data['ns'] : $data['id'];
3937d101cc1SGerry Weißbach
3947d101cc1SGerry Weißbach        $this->removeWikiVariables($data);
3957d101cc1SGerry Weißbach        $data['do'] = 'siteexport';
3967d101cc1SGerry Weißbach        $additionalKeys = '';
3977d101cc1SGerry Weißbach
3987d101cc1SGerry Weißbach        ksort($data);
3997d101cc1SGerry Weißbach
4007d101cc1SGerry Weißbach        $this->debug->message("Prepared POST data:", $data, 1);
4017d101cc1SGerry Weißbach
4027d101cc1SGerry Weißbach        foreach( $data as $key => $value ) {
4037d101cc1SGerry Weißbach
4047d101cc1SGerry Weißbach            if ( !is_array($value) ) { continue; }
4057d101cc1SGerry Weißbach            $this->debug->message("Found inner Array:", $value, 1);
4067d101cc1SGerry Weißbach
4077d101cc1SGerry Weißbach            asort($value);
4087d101cc1SGerry Weißbach            foreach ( $value as $innerKey => $aValue )
4097d101cc1SGerry Weißbach            {
4107d101cc1SGerry Weißbach                if ( is_numeric($innerKey))
4117d101cc1SGerry Weißbach                {
4127d101cc1SGerry Weißbach                    $innerKey = '';
4137d101cc1SGerry Weißbach                }
4147d101cc1SGerry Weißbach
4157d101cc1SGerry Weißbach                $additionalKeys .= "&$key" . "[$innerKey]=$aValue";
4167d101cc1SGerry Weißbach            }
4177d101cc1SGerry Weißbach
4187d101cc1SGerry Weißbach            unset($data[$key]);
4197d101cc1SGerry Weißbach        }
4207d101cc1SGerry Weißbach
4217d101cc1SGerry Weißbach        return wl($NS, $data, true, '&') . $additionalKeys;
4227d101cc1SGerry Weißbach    }
4237d101cc1SGerry Weißbach
4247d101cc1SGerry Weißbach    /**
4257d101cc1SGerry Weißbach     * Parses a String into a $_REQUEST Like variant. You have to tell if a decode of the values is needed
4267d101cc1SGerry Weißbach     * @param $inputArray
4277d101cc1SGerry Weißbach     * @param $decode
4287d101cc1SGerry Weißbach     */
4297d101cc1SGerry Weißbach    public function parseStringToRequestArray($inputArray, $decode=false)
4307d101cc1SGerry Weißbach    {
4317d101cc1SGerry Weißbach        global $plugin_controller;
4327d101cc1SGerry Weißbach
4337d101cc1SGerry Weißbach        $outputArray = $inputArray;
4347d101cc1SGerry Weißbach        if ( !is_array($inputArray) )
4357d101cc1SGerry Weißbach        {
4367d101cc1SGerry Weißbach            $intermediate = str_replace("&amp;", "&", $inputArray);
4377d101cc1SGerry Weißbach
4387d101cc1SGerry Weißbach            $outputArray = array();
4397d101cc1SGerry Weißbach            foreach( explode("&", $intermediate) as $param ) {
4407d101cc1SGerry Weißbach                list($key, $value) = explode("=", $param, 2);
4417d101cc1SGerry Weißbach
4427d101cc1SGerry Weißbach                // This is needed if we do want to calculate $_REQUEST for a non HTTP-Request
4437d101cc1SGerry Weißbach                if ( $decode)
4447d101cc1SGerry Weißbach                {
4457d101cc1SGerry Weißbach                    $value = urldecode($value);
4467d101cc1SGerry Weißbach                }
4477d101cc1SGerry Weißbach
4487d101cc1SGerry Weißbach                if ( empty($key) ) { continue; } // Don't check on Value, because there may be only the key that should be preserved
4497d101cc1SGerry Weißbach
4507d101cc1SGerry Weißbach                if ( substr($key, -2) == '[]' ) {
4517d101cc1SGerry Weißbach	                $key = substr($key, 0, -2);
4527d101cc1SGerry Weißbach	                if ( !is_array($outputArray[$key]) ) {
4537d101cc1SGerry Weißbach		                $outputArray[$key] = array();
4547d101cc1SGerry Weißbach	                }
4557d101cc1SGerry Weißbach
4567d101cc1SGerry Weißbach                    array_push($outputArray[$key], $value); // Array Handling
4577d101cc1SGerry Weißbach                } else {
4587d101cc1SGerry Weißbach                    $outputArray[$key] = $value;
4597d101cc1SGerry Weißbach                }
4607d101cc1SGerry Weißbach            }
4617d101cc1SGerry Weißbach        }
4627d101cc1SGerry Weißbach
4637d101cc1SGerry Weißbach        if ( !empty($outputArray['diPlu']) ) {
4647d101cc1SGerry Weißbach
4657d101cc1SGerry Weißbach            $allPlugins = array();
4667d101cc1SGerry Weißbach            foreach($plugin_controller->getList(null,true) as $plugin ) {
4677d101cc1SGerry Weißbach                // check for CSS or JS
4687d101cc1SGerry Weißbach                if ( !file_exists(DOKU_PLUGIN."$plugin/script.js") && !file_exists(DOKU_PLUGIN."$p/style.css") ) { continue; }
4697d101cc1SGerry Weißbach                $allPlugins[] = $plugin;
4707d101cc1SGerry Weißbach            }
4717d101cc1SGerry Weißbach
4727d101cc1SGerry Weißbach            if ( count($outputArray['diPlu']) > (count($allPlugins) / 2) ) {
4737d101cc1SGerry Weißbach                $outputArray['diInv'] = 1;
4747d101cc1SGerry Weißbach                $outputArray['diPlu'] = array_diff($allPlugins, $outputArray['diPlu']);
4757d101cc1SGerry Weißbach            }
4767d101cc1SGerry Weißbach        }
4777d101cc1SGerry Weißbach
4787d101cc1SGerry Weißbach        return $outputArray;
4797d101cc1SGerry Weißbach    }
4807d101cc1SGerry Weißbach
4817d101cc1SGerry Weißbach    /**
4827d101cc1SGerry Weißbach     * Remove certain fields from the list.
4837d101cc1SGerry Weißbach     * @param $removeArray
4847d101cc1SGerry Weißbach     * @param $advanced
4857d101cc1SGerry Weißbach     * @param $isString
4867d101cc1SGerry Weißbach     */
4877d101cc1SGerry Weißbach    function removeWikiVariables(&$removeArray, $advanced=false, $isString=false) {
4887d101cc1SGerry Weißbach
4897d101cc1SGerry Weißbach        $removeArray = $this->parseStringToRequestArray($removeArray);
4907d101cc1SGerry Weißbach
4917d101cc1SGerry Weißbach        // 2010-08-23 - If there is still the media set, retain the id for e.g. detail.php
4927d101cc1SGerry Weißbach        if ( !isset($removeArray['media']) ) {
4937d101cc1SGerry Weißbach            unset($removeArray['id']);
4947d101cc1SGerry Weißbach        }
4957d101cc1SGerry Weißbach
4967d101cc1SGerry Weißbach        unset($removeArray['do']);
4977d101cc1SGerry Weißbach        unset($removeArray['ns']);
4987d101cc1SGerry Weißbach        unset($removeArray['call']);
4997d101cc1SGerry Weißbach        unset($removeArray['sectok']);
5007d101cc1SGerry Weißbach        unset($removeArray['rndval']);
5017d101cc1SGerry Weißbach        unset($removeArray['tseed']);
5027d101cc1SGerry Weißbach        unset($removeArray['http_credentials']);
5037d101cc1SGerry Weißbach        unset($removeArray['u']);
5047d101cc1SGerry Weißbach        unset($removeArray['p']);
5057d101cc1SGerry Weißbach        unset($removeArray['r']);
5067d101cc1SGerry Weißbach        unset($removeArray['base']);
5077d101cc1SGerry Weißbach        unset($removeArray['siteexport']);
5087d101cc1SGerry Weißbach        unset($removeArray['DokuWiki']);
5097d101cc1SGerry Weißbach        unset($removeArray['cronOverwriteExisting']);
5107d101cc1SGerry Weißbach
5117d101cc1SGerry Weißbach        if ( $removeArray['renderer'] == 'xhtml' ) {
5127d101cc1SGerry Weißbach            $removeArray['do'] = 'export_' . $removeArray['renderer'];
5137d101cc1SGerry Weißbach            unset($removeArray['renderer']);
5147d101cc1SGerry Weißbach        }
5157d101cc1SGerry Weißbach
5162270cdc5SGerry Weißbach        // Keep custom options
5172270cdc5SGerry Weißbach        if ( is_array($removeArray['customoptionname']) && is_array($removeArray['customoptionvalue']) && count($removeArray['customoptionname']) == count($removeArray['customoptionvalue']) )
5182270cdc5SGerry Weißbach        {
5192270cdc5SGerry Weißbach            for( $index=0; $index<count($removeArray['customoptionname']); $index++)
5202270cdc5SGerry Weißbach            {
5212270cdc5SGerry Weißbach                $removeArray[$removeArray['customoptionname'][$index]] = $removeArray['customoptionvalue'][$index];
5222270cdc5SGerry Weißbach            }
5232270cdc5SGerry Weißbach	        unset($removeArray['customoptionname']);
5242270cdc5SGerry Weißbach	        unset($removeArray['customoptionvalue']);
5252270cdc5SGerry Weißbach        }
5262270cdc5SGerry Weißbach
5277d101cc1SGerry Weißbach        if ( $advanced ) {
5287d101cc1SGerry Weißbach            if ( $removeArray['renderer'] != 'xhtml' && !empty($removeArray['renderer']) ) {
5297d101cc1SGerry Weißbach                $removeArray['do'] = 'export_' . $removeArray['renderer'];
5307d101cc1SGerry Weißbach            }
5317d101cc1SGerry Weißbach
5327d101cc1SGerry Weißbach            // 2010-08-25 - Need fakeMedia for some _detail cases with rewrite = 2
5337d101cc1SGerry Weißbach            if ( isset($removeArray['fakeMedia'])  ) {
5347d101cc1SGerry Weißbach                unset($removeArray['media']);
5357d101cc1SGerry Weißbach                unset($removeArray['fakeMedia']);
5367d101cc1SGerry Weißbach            }
5377d101cc1SGerry Weißbach
5387d101cc1SGerry Weißbach            /* remove internal params */
5397d101cc1SGerry Weißbach            unset($removeArray['ens']);
5407d101cc1SGerry Weißbach            unset($removeArray['renderer']);
5417d101cc1SGerry Weißbach            unset($removeArray['site']);
5427d101cc1SGerry Weißbach            unset($removeArray['namespace']);
5437d101cc1SGerry Weißbach            unset($removeArray['exportbody']);
5447d101cc1SGerry Weißbach            unset($removeArray['addParams']);
5457d101cc1SGerry Weißbach            unset($removeArray['template']);
5467d101cc1SGerry Weißbach            unset($removeArray['eclipseDocZip']);
5477d101cc1SGerry Weißbach            unset($removeArray['useTocFile']);
5487d101cc1SGerry Weißbach            unset($removeArray['JavaHelpDocZip']);
5497d101cc1SGerry Weißbach            unset($removeArray['depth']);
5507d101cc1SGerry Weißbach            unset($removeArray['depthType']);
5517d101cc1SGerry Weißbach            unset($removeArray['startcounter']);
5527d101cc1SGerry Weißbach            unset($removeArray['pattern']);
5537d101cc1SGerry Weißbach            unset($removeArray['TOCMapWithoutTranslation']);
5546792d0cfSGerry Weißbach			// unset($removeArray['disableCache']);
55528601108SGerry Weißbach			unset($removeArray['debug']);
5567d101cc1SGerry Weißbach        }
5577d101cc1SGerry Weißbach
5587d101cc1SGerry Weißbach        if ( $isString && is_array($removeArray) ) {
5597d101cc1SGerry Weißbach            $intermediate = $removeArray;
5607d101cc1SGerry Weißbach            $removeArray = array();
5617d101cc1SGerry Weißbach
5627d101cc1SGerry Weißbach            foreach ( $intermediate as $key => $value ) {
5637d101cc1SGerry Weißbach                if ( is_array($value) ) {
5647d101cc1SGerry Weißbach                    foreach( array_values($value) as $aValue ) { // Array Handling
5657d101cc1SGerry Weißbach                        $removeArray[] = $key . "[]=$aValue";
5667d101cc1SGerry Weißbach                    }
5677d101cc1SGerry Weißbach                } else {
5687d101cc1SGerry Weißbach                    $value = trim($value);
5697d101cc1SGerry Weißbach
5707d101cc1SGerry Weißbach                    $removeArray[] = "$key" . ( ((empty($value) && intval($value) !== 0)) || $value == '' ? '' : "=$value" ); // If the Value is empty, the Key must be preserved
5717d101cc1SGerry Weißbach                }
5727d101cc1SGerry Weißbach            }
5737d101cc1SGerry Weißbach
5740b4abc9fSGerry Weißbach            //$removeArray = implode( ($this->settings->fileType == 'pdf' ? "&" : "&amp;"), $removeArray);
5750b4abc9fSGerry Weißbach            $removeArray = implode( "&", $removeArray); // The &amp; made problems with the HTTPClient / Apache. It should not be a problem to have &
5767d101cc1SGerry Weißbach        }
5777d101cc1SGerry Weißbach    }
5787d101cc1SGerry Weißbach
5797d101cc1SGerry Weißbach    /**
5807d101cc1SGerry Weißbach     * returns a hashed name for the parameters
5817d101cc1SGerry Weißbach     * @param $parameters
5827d101cc1SGerry Weißbach     */
5837d101cc1SGerry Weißbach    public function cronJobNameForParameters($parameters)
5847d101cc1SGerry Weißbach    {
5857d101cc1SGerry Weißbach        return md5($parameters);
5867d101cc1SGerry Weißbach    }
5877d101cc1SGerry Weißbach
5887d101cc1SGerry Weißbach    /**
5897d101cc1SGerry Weißbach     * Takes an URL and transforms it into the path+query part
5907d101cc1SGerry Weißbach     * Used several times, e.g. for genering the hash for the cache file
5917d101cc1SGerry Weißbach     * @param $url
5927d101cc1SGerry Weißbach     */
5937d101cc1SGerry Weißbach    public function urlToPathAndParams($url)
5947d101cc1SGerry Weißbach    {
5957d101cc1SGerry Weißbach        $query = parse_url($url, PHP_URL_QUERY);
5967d101cc1SGerry Weißbach        $path = preg_replace(":^".DOKU_REL.":", "", parse_url($url, PHP_URL_PATH));
5977d101cc1SGerry Weißbach        return "{$path}?{$query}";
5987d101cc1SGerry Weißbach    }
5997d101cc1SGerry Weißbach
6007d101cc1SGerry Weißbach    /**
6017d101cc1SGerry Weißbach     * Transforms an $_REQUEST into a Hash that can be used for cron and cache file
6027d101cc1SGerry Weißbach     * @param $request
6037d101cc1SGerry Weißbach     */
6047d101cc1SGerry Weißbach    public function requestParametersToCacheHash($request)
6057d101cc1SGerry Weißbach    {
6067d101cc1SGerry Weißbach        $params = $this->urlToPathAndParams($this->prepare_POSTData($request));
6077d101cc1SGerry Weißbach        $this->debug->message("Calculated the following Cache Hash URL: ", $params, 2);
6087d101cc1SGerry Weißbach        return $this->cronJobNameForParameters($params);
6097d101cc1SGerry Weißbach    }
6107d101cc1SGerry Weißbach
6117d101cc1SGerry Weißbach    /**
6123aa0ad13SGerry Weißbach     * Check a replaceURL against a baseURL - and make the replaceURL relative against it
6133aa0ad13SGerry Weißbach     * @param replaceURL - URL which will be made relative if needed
6143aa0ad13SGerry Weißbach     * @param baseURL - URL which is the reference to be made relative against
6157d101cc1SGerry Weißbach     */
6163aa0ad13SGerry Weißbach    public function getRelativeURL($replaceURL, $baseURL)
6177d101cc1SGerry Weißbach    {
6183aa0ad13SGerry Weißbach        // Base is always absolute without anything at the beginning
6193aa0ad13SGerry Weißbach        if ( preg_match("#^(\.\./)+#", $baseURL) ) {
6203aa0ad13SGerry Weißbach            $this->debug->message("The baseURL was not absolute.", $baseURL, 1);
6213aa0ad13SGerry Weißbach            return $replaceURL;
6223aa0ad13SGerry Weißbach        }
6237d101cc1SGerry Weißbach
6243aa0ad13SGerry Weißbach        $origReplaceURL = $replaceURL;
6253aa0ad13SGerry Weißbach        $replaceURL = preg_replace("#^(\.\./)+#", '', $replaceURL);
6267d101cc1SGerry Weißbach
6273aa0ad13SGerry Weißbach        // Remove ../ at beginning to get the absolute path
6283aa0ad13SGerry Weißbach        if ( $replaceURL == $origReplaceURL ) {
6293aa0ad13SGerry Weißbach            $this->debug->message("The replaceURL was already absolute.", $replaceURL, 1);
6303aa0ad13SGerry Weißbach            return $replaceURL;
6313aa0ad13SGerry Weißbach        }
6327d101cc1SGerry Weißbach
6333aa0ad13SGerry Weißbach        $replaceParts = explode('/', $replaceURL);
6343aa0ad13SGerry Weißbach        $fileName = array_pop($replaceParts); // Get file
6357d101cc1SGerry Weißbach
6363aa0ad13SGerry Weißbach        $baseParts = explode('/', $baseURL);
6373aa0ad13SGerry Weißbach        array_pop($baseParts); // Remove file. We only need the path to this location.
6387d101cc1SGerry Weißbach
6393aa0ad13SGerry Weißbach        $this->debug->message("State before kicking.", array($replaceParts, $baseParts), 1);
6403aa0ad13SGerry Weißbach
6413aa0ad13SGerry Weißbach        // Kick all ../
6423aa0ad13SGerry Weißbach        while( count($replaceParts) > 0 && count($baseParts) > 0 ) {
6433aa0ad13SGerry Weißbach
6443aa0ad13SGerry Weißbach            if ( $baseParts[0] == $replaceParts[0] ) {
6453aa0ad13SGerry Weißbach                // Beginning is OK, so remove it.
6467d101cc1SGerry Weißbach                array_shift($replaceParts);
6477d101cc1SGerry Weißbach                array_shift($baseParts);
6483aa0ad13SGerry Weißbach            } else {
6497d101cc1SGerry Weißbach                break;
6507d101cc1SGerry Weißbach            }
6513aa0ad13SGerry Weißbach
6527d101cc1SGerry Weißbach        }
6537d101cc1SGerry Weißbach
6543aa0ad13SGerry Weißbach        $this->debug->message("Found URL '{$replaceURL}' that is relative to current page '{$baseURL}'.", array($replaceParts, $baseParts), 1);
6557d101cc1SGerry Weißbach
6563aa0ad13SGerry Weißbach        // Remove everything that is identical
6573aa0ad13SGerry Weißbach        $replaceParts[] = $fileName;
6587d101cc1SGerry Weißbach
6593aa0ad13SGerry Weißbach        return str_repeat('../', count($baseParts)) . implode('/', $replaceParts);
6607d101cc1SGerry Weißbach    }
6617d101cc1SGerry Weißbach}
6627d101cc1SGerry Weißbach
6637d101cc1SGerry Weißbach?>