104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap\Web; 404fd306cSNickeau 504fd306cSNickeauuse ComboStrap\DokuWikiId; 604fd306cSNickeauuse ComboStrap\ExceptionNotFound; 704fd306cSNickeauuse ComboStrap\FetcherRawLocalPath; 804fd306cSNickeauuse ComboStrap\LogUtility; 904fd306cSNickeauuse ComboStrap\MarkupPath; 1004fd306cSNickeauuse ComboStrap\PageUrlPath; 1104fd306cSNickeauuse ComboStrap\Site; 1204fd306cSNickeauuse ComboStrap\Web\Url; 1304fd306cSNickeauuse ComboStrap\Web\UrlEndpoint; 1404fd306cSNickeauuse ComboStrap\WikiPath; 1504fd306cSNickeau 1604fd306cSNickeau/** 1704fd306cSNickeau * Dokuwiki Rewrite 1804fd306cSNickeau */ 1904fd306cSNickeauclass UrlRewrite 2004fd306cSNickeau{ 2104fd306cSNickeau 2204fd306cSNickeau public const CONF_KEY = 'userewrite'; 2304fd306cSNickeau 2404fd306cSNickeau public const NO_REWRITE_DOKU_VALUE = 0; 2504fd306cSNickeau public const NO_REWRITE = "no_rewrite"; 2604fd306cSNickeau public const WEB_SERVER_REWRITE_DOKU_VALUE = 1; 2704fd306cSNickeau public const WEB_SERVER_REWRITE = "web_server"; 2804fd306cSNickeau public const DOKU_REWRITE_DOKU_VALUE = 2; 2904fd306cSNickeau /** 3004fd306cSNickeau * Doku Rewrite is value 2 3104fd306cSNickeau * https://www.dokuwiki.org/rewrite#further_details_for_the_technically_savvy 3204fd306cSNickeau */ 3304fd306cSNickeau public const VALUE_DOKU_REWRITE = "doku_rewrite"; 3404fd306cSNickeau 3504fd306cSNickeau 3604fd306cSNickeau const EXPORT_DO_PREFIX = "export_"; 3704fd306cSNickeau const CANONICAL = "url_rewrite"; 3804fd306cSNickeau const MEDIA_PREFIX = "/_media"; 3904fd306cSNickeau const EXPORT_PATH_PREFIX = "/_export"; 4004fd306cSNickeau 4104fd306cSNickeau 4204fd306cSNickeau /** 4304fd306cSNickeau * Apply all rewrite URL logic (from relative to absolute 4404fd306cSNickeau * passing by web server url rewrite) 4504fd306cSNickeau * 4604fd306cSNickeau * Note that an URL may already have been rewritten 4704fd306cSNickeau * 4804fd306cSNickeau */ 4904fd306cSNickeau public static function rewrite(Url $url) 5004fd306cSNickeau { 5104fd306cSNickeau 5204fd306cSNickeau try { 5304fd306cSNickeau $scheme = $url->getScheme(); 5404fd306cSNickeau } catch (ExceptionNotFound $e) { 5504fd306cSNickeau /** 5604fd306cSNickeau * we don't set, we just tell that that this is a http scheme 5704fd306cSNickeau * the conditional {@link Url::toAbsoluteUrlString()} 5804fd306cSNickeau * will set it 5904fd306cSNickeau */ 6004fd306cSNickeau $scheme = "http"; 6104fd306cSNickeau } 6204fd306cSNickeau switch ($scheme) { 6304fd306cSNickeau case "https": 6404fd306cSNickeau case "http": 6504fd306cSNickeau self::pathRewrite($url); 6604fd306cSNickeau self::baseRewrite($url); 6704fd306cSNickeau if (Site::shouldEndpointUrlBeAbsolute()) { 6804fd306cSNickeau $url->toAbsoluteUrl(); 6904fd306cSNickeau } 7004fd306cSNickeau break; 7104fd306cSNickeau } 7204fd306cSNickeau 7304fd306cSNickeau 7404fd306cSNickeau } 7504fd306cSNickeau 7604fd306cSNickeau /** 7704fd306cSNickeau * Rewrite the path 7804fd306cSNickeau * 7904fd306cSNickeau * Doc: https://www.dokuwiki.org/rewrite 8004fd306cSNickeau * https://www.dokuwiki.org/config:userewrite 8104fd306cSNickeau * @param Url $url 8204fd306cSNickeau * @return void 8304fd306cSNickeau */ 8404fd306cSNickeau private static function pathRewrite(Url $url) 8504fd306cSNickeau { 8604fd306cSNickeau 8704fd306cSNickeau try { 8804fd306cSNickeau $path = $url->getPath(); 8904fd306cSNickeau } catch (ExceptionNotFound $e) { 9004fd306cSNickeau // no path, no rewrite 9104fd306cSNickeau return; 9204fd306cSNickeau } 9304fd306cSNickeau 9404fd306cSNickeau $rewrite = Site::getUrlRewrite(); 9504fd306cSNickeau switch ($path) { 9604fd306cSNickeau case UrlEndpoint::LIB_EXE_FETCH_PHP: 9704fd306cSNickeau if ($rewrite !== self::WEB_SERVER_REWRITE) { 9804fd306cSNickeau return; 9904fd306cSNickeau } 10004fd306cSNickeau try { 10104fd306cSNickeau $dokuwikiId = $url->getQueryPropertyValueAndRemoveIfPresent(FetcherRawLocalPath::$MEDIA_QUERY_PARAMETER); 10204fd306cSNickeau } catch (ExceptionNotFound $e) { 10304fd306cSNickeau LogUtility::internalError("The media query should be present for a fetch. No Url rewrite could be done."); 10404fd306cSNickeau return; 10504fd306cSNickeau } 10604fd306cSNickeau $webUrlPath = str_replace(WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT, "/", $dokuwikiId); 10704fd306cSNickeau $url->setPath(self::MEDIA_PREFIX . "/$webUrlPath"); 10804fd306cSNickeau return; 10904fd306cSNickeau case UrlEndpoint::LIB_EXE_DETAIL_PHP: 11004fd306cSNickeau if ($rewrite !== self::WEB_SERVER_REWRITE) { 11104fd306cSNickeau return; 11204fd306cSNickeau } 11304fd306cSNickeau try { 11404fd306cSNickeau $dokuwikiId = $url->getQueryPropertyValueAndRemoveIfPresent(FetcherRawLocalPath::$MEDIA_QUERY_PARAMETER); 11504fd306cSNickeau } catch (ExceptionNotFound $e) { 11604fd306cSNickeau LogUtility::internalError("The media query should be present for a detail page fetch. No Url rewrite could be done."); 11704fd306cSNickeau return; 11804fd306cSNickeau } 11904fd306cSNickeau $webUrlPath = str_replace(WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT, "/", $dokuwikiId); 12004fd306cSNickeau $url->setPath("/_detail/$webUrlPath"); 12104fd306cSNickeau return; 12204fd306cSNickeau case UrlEndpoint::DOKU_PHP: 12304fd306cSNickeau try { 12404fd306cSNickeau $dokuwikiId = $url->getQueryPropertyValueAndRemoveIfPresent(DokuWikiId::DOKUWIKI_ID_ATTRIBUTE); 12504fd306cSNickeau } catch (ExceptionNotFound $e) { 12604fd306cSNickeau // no id (case of action such as login, ...) 12704fd306cSNickeau return; 12804fd306cSNickeau } 12904fd306cSNickeau 13004fd306cSNickeau /** 13104fd306cSNickeau * Permanent Id Rewrite 13204fd306cSNickeau * The page url path will return the original dokuwiki id 13304fd306cSNickeau * if there is no configuration 13404fd306cSNickeau */ 13504fd306cSNickeau $urlId = PageUrlPath::createForPage(MarkupPath::createMarkupFromId($dokuwikiId))->getValueOrDefaultAsWikiId(); 13604fd306cSNickeau 13704fd306cSNickeau /** 13804fd306cSNickeau * Rewrite Processing 13904fd306cSNickeau */ 14004fd306cSNickeau switch ($rewrite) { 14104fd306cSNickeau case self::WEB_SERVER_REWRITE: 14204fd306cSNickeau try { 14304fd306cSNickeau $do = $url->getQueryPropertyValueAndRemoveIfPresent("do"); 14404fd306cSNickeau if (strpos($do, self::EXPORT_DO_PREFIX) === 0) { 14504fd306cSNickeau $exportFormat = substr($do, strlen(self::EXPORT_DO_PREFIX)); 14604fd306cSNickeau $webUrlPath = str_replace(WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT, "/", $urlId); 14704fd306cSNickeau $url->setPath(self::EXPORT_PATH_PREFIX . "/$exportFormat/$webUrlPath"); 14804fd306cSNickeau return; 14904fd306cSNickeau } 15004fd306cSNickeau } catch (ExceptionNotFound $e) { 15104fd306cSNickeau // no do 15204fd306cSNickeau } 15304fd306cSNickeau $webUrlPath = str_replace(WikiPath::NAMESPACE_SEPARATOR_DOUBLE_POINT, "/", $urlId); 15404fd306cSNickeau $url->setPath($webUrlPath); 15504fd306cSNickeau return; 15604fd306cSNickeau case self::VALUE_DOKU_REWRITE: 15704fd306cSNickeau $url->setPath("$path/$urlId"); 15804fd306cSNickeau return; 15904fd306cSNickeau default: 16004fd306cSNickeau $url->setQueryParameter(DokuWikiId::DOKUWIKI_ID_ATTRIBUTE, $urlId); 16104fd306cSNickeau return; 16204fd306cSNickeau } 16304fd306cSNickeau 16404fd306cSNickeau } 16504fd306cSNickeau 16604fd306cSNickeau } 16704fd306cSNickeau 16804fd306cSNickeau private 16904fd306cSNickeau static function baseRewrite(Url $url) 17004fd306cSNickeau { 17104fd306cSNickeau try { 17204fd306cSNickeau $urlPathBaseDir = Site::getUrlPathBaseDir(); 17304fd306cSNickeau } catch (ExceptionNotFound $e) { 17404fd306cSNickeau // ok, no base dir 17504fd306cSNickeau return; 17604fd306cSNickeau } 17704fd306cSNickeau try { 17804fd306cSNickeau $path = $url->getPath(); 17904fd306cSNickeau } catch (ExceptionNotFound $e) { 18004fd306cSNickeau return; 18104fd306cSNickeau } 18204fd306cSNickeau if (strpos($path, $urlPathBaseDir) === 0) { 18304fd306cSNickeau /** 18404fd306cSNickeau * The base dir is already present 18504fd306cSNickeau */ 18604fd306cSNickeau return; 18704fd306cSNickeau } 18804fd306cSNickeau if ($urlPathBaseDir[strlen($urlPathBaseDir) - 1] === "/") { 18904fd306cSNickeau $url->setPath("$urlPathBaseDir$path"); 19004fd306cSNickeau } else { 19104fd306cSNickeau $url->setPath("$urlPathBaseDir/$path"); 19204fd306cSNickeau } 19304fd306cSNickeau 19404fd306cSNickeau } 19504fd306cSNickeau 196*54743e42Sgerardnico public static function sendErrorMessage() 197*54743e42Sgerardnico { 198*54743e42Sgerardnico $rewriteOption2 = "https://www.dokuwiki.org/rewrite#option_2dokuwiki"; 199*54743e42Sgerardnico $rewriteOption1 = "https://www.dokuwiki.org/rewrite#option_1web_server"; 200*54743e42Sgerardnico $hrefPermanentFunctionality = "https://combostrap.com/page/canonical-url-4kxbb9fd#permanent"; 201*54743e42Sgerardnico $hrefNiceUrl = "https://combostrap.com/admin/nice-url-noln5keo"; 202*54743e42Sgerardnico LogUtility::error("Combostrap does not support the <a href=\"$rewriteOption2\">Url Dokuwiki Rewriting (Option 2)</a> because of the <a href=\"$hrefPermanentFunctionality\"> permanent Url functionality</a>. You should disable it and use the <a href=\"$rewriteOption1\">Web Server Option (Option 1)</a> if you want <a href=\"$hrefNiceUrl\">nice URL</a>.", self::CANONICAL); 203*54743e42Sgerardnico } 204*54743e42Sgerardnico 20504fd306cSNickeau} 206