xref: /plugin/siteexport/inc/functions.php (revision 3fbe7663c2c1597f00d3800fbecb2a4b79018ee6)
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='&amp;', $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("&amp;", "&", $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 &amp; 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