xref: /plugin/combo/ComboStrap/Web/UrlRewrite.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
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