diff --git a/components/ILIAS/UICore/classes/class.ilCtrl.php b/components/ILIAS/UICore/classes/class.ilCtrl.php index 711a3a7d88dc..38d5cd8c4114 100755 --- a/components/ILIAS/UICore/classes/class.ilCtrl.php +++ b/components/ILIAS/UICore/classes/class.ilCtrl.php @@ -34,6 +34,8 @@ */ class ilCtrl implements ilCtrlInterface { + use ilCtrlNamespaceEncoding; + protected ?object $exec_object = null; protected ?string $command = null; @@ -868,7 +870,7 @@ private function getTargetUrl( $target_url = $this->appendParameterString( $target_url, self::PARAM_BASE_CLASS, - urlencode($base_class), // encode in case of namespaced classes + $this->encodeNamespaceForUrl($base_class), // encode in case of namespaced classes $is_escaped ); @@ -889,7 +891,7 @@ private function getTargetUrl( $target_url = $this->appendParameterString( $target_url, self::PARAM_CMD_CLASS, - urlencode($cmd_class), // encode in case of namespaced classes + $this->encodeNamespaceForUrl($cmd_class), // encode in case of namespaced classes $is_escaped ); } diff --git a/components/ILIAS/UICore/classes/class.ilCtrlContext.php b/components/ILIAS/UICore/classes/class.ilCtrlContext.php index b620ab712402..e52e3d61695d 100755 --- a/components/ILIAS/UICore/classes/class.ilCtrlContext.php +++ b/components/ILIAS/UICore/classes/class.ilCtrlContext.php @@ -30,6 +30,8 @@ */ class ilCtrlContext implements ilCtrlContextInterface { + use ilCtrlNamespaceEncoding; + /** * @var ilCtrlPathFactory */ @@ -305,14 +307,14 @@ protected function adoptRequestParameters(): void // previously set existing path. $base_class = $this->getQueryParam(ilCtrlInterface::PARAM_BASE_CLASS); if (null !== $base_class) { - $this->setBaseClass($base_class); + $this->setBaseClass($this->decodeNamespaceFromUrl($base_class)); } // set or append the provided command class, which might // override the previously set path again. $cmd_class = $this->getQueryParam(ilCtrlInterface::PARAM_CMD_CLASS); if (null !== $cmd_class) { - $this->setCmdClass($cmd_class); + $this->setCmdClass($this->decodeNamespaceFromUrl($cmd_class)); } } diff --git a/components/ILIAS/UICore/classes/trait.ilCtrlNamespaceEncoding.php b/components/ILIAS/UICore/classes/trait.ilCtrlNamespaceEncoding.php new file mode 100644 index 000000000000..337095609c9d --- /dev/null +++ b/components/ILIAS/UICore/classes/trait.ilCtrlNamespaceEncoding.php @@ -0,0 +1,46 @@ + + * + * @noinspection AutoloadingIssuesInspection + */ +trait ilCtrlNamespaceEncoding +{ + private static string $psr4_namespace_delimiter = '\\'; + private static string $ilctrl_namespace_delimiter = '.'; + + public function encodeNamespaceForUrl(string $psr4_namespace): string + { + return str_replace(self::$psr4_namespace_delimiter, self::$ilctrl_namespace_delimiter, $psr4_namespace); + } + + public function decodeNamespaceFromUrl(string $ilctrl_namespace): string + { + return str_replace(self::$ilctrl_namespace_delimiter, self::$psr4_namespace_delimiter, $ilctrl_namespace); + } +}