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