From b7b4e67c1d9cfd8994ad0dff06d7a329361d9390 Mon Sep 17 00:00:00 2001
From: Elmar Ludwig <elmar.ludwig@uni-osnabrueck.de>
Date: Tue, 31 May 2022 11:59:31 +0000
Subject: [PATCH] fix path handling in `action_url()`, fixes #1105

Closes #1105

Merge request studip/studip!661
---
 app/controllers/studip_controller.php         |  2 +-
 .../unit/lib/classes/StudipControllerTest.php | 26 +++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/app/controllers/studip_controller.php b/app/controllers/studip_controller.php
index cddb82e5035..a08a9463c38 100644
--- a/app/controllers/studip_controller.php
+++ b/app/controllers/studip_controller.php
@@ -717,7 +717,7 @@ abstract class StudipController extends Trails_Controller
     public function action_url($action)
     {
         $arguments = func_get_args();
-        array_unshift($arguments, $this->controller_path());
+        $arguments[0] = $this->controller_path() . '/' . $arguments[0];
 
         return $this->url_for(...$arguments);
     }
diff --git a/tests/unit/lib/classes/StudipControllerTest.php b/tests/unit/lib/classes/StudipControllerTest.php
index 3675f58f14b..a7009fe2aa5 100644
--- a/tests/unit/lib/classes/StudipControllerTest.php
+++ b/tests/unit/lib/classes/StudipControllerTest.php
@@ -65,6 +65,19 @@ final class StudipControllerTest extends Codeception\Test\Unit
         $this->getController()->url_for(...$args);
     }
 
+    /**
+     * @dataProvider actionUrlProvider
+     * @covers StudipController::action_url
+     */
+    public function testActionUrl(string $expected, ...$args): void
+    {
+        $url = $this->getController()->action_url(...$args);
+        $this->assertEquals(
+            $expected,
+            $this->getRelativeURL($url)
+        );
+    }
+
     /**
      * @dataProvider RedirectProvider
      * @covers StudipController::redirect
@@ -192,6 +205,19 @@ final class StudipControllerTest extends Codeception\Test\Unit
         ];
     }
 
+    public function actionUrlProvider(): array
+    {
+        return [
+            'action'                   => ['dispatch.php/studip_controller_test/foo', 'foo'],
+            'action-and-parameter'     => ['dispatch.php/studip_controller_test/foo/23', 'foo/23'],
+            'action-and-parameters'    => ['dispatch.php/studip_controller_test/foo/23?bar=42', 'foo/23', ['bar' => 42]],
+
+            'fragment'                 => ['dispatch.php/studip_controller_test/foo/42/23#jump', 'foo/42/23#jump'],
+            'fragment-and-parameters'  => ['dispatch.php/studip_controller_test/foo/42/23#jump', 'foo#jump', 42, 23],
+            'url-encoding-parameters'  => ['dispatch.php/studip_controller_test/foo/%3Fabc/%2F', 'foo', '?abc', '/'],
+        ];
+    }
+
     public function RedirectProvider(): array
     {
         $result = $this->UrlForProvider();
-- 
GitLab