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