From c97b4274ccdc4fa841b164dedb608fdf351a0412 Mon Sep 17 00:00:00 2001
From: Roeland Jago Douma <roeland@famdouma.nl>
Date: Thu, 4 Oct 2018 21:06:00 +0200
Subject: [PATCH] Add function to generate urls for OCS routes

fixes #11617

The OCS routes are only absolute for now as they are often exposed to
the outside anyway and are on a different endpoint than index.php in
anyway.

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
---
 lib/private/URLGenerator.php   | 13 +++++++++++++
 lib/public/IURLGenerator.php   |  8 ++++++++
 tests/lib/UrlGeneratorTest.php | 18 ++++++++++++++++++
 3 files changed, 39 insertions(+)

diff --git a/lib/private/URLGenerator.php b/lib/private/URLGenerator.php
index 6f4f869238c..f4a83138e4c 100644
--- a/lib/private/URLGenerator.php
+++ b/lib/private/URLGenerator.php
@@ -91,6 +91,19 @@ class URLGenerator implements IURLGenerator {
 		return $this->getAbsoluteURL($this->linkToRoute($routeName, $arguments));
 	}
 
+	public function linkToOCSRouteAbsolute(string $routeName, array $arguments = []): string {
+		$route = \OC::$server->getRouter()->generate('ocs.'.$routeName, $arguments, false);
+
+		if (strpos($route, '/index.php') === 0) {
+			$route = substr($route, 10);
+		}
+
+		$route = substr($route, 7);
+		$route = '/ocs/v2.php' . $route;
+
+		return $this->getAbsoluteURL($route);
+	}
+
 	/**
 	 * Creates an url
 	 * @param string $app app
diff --git a/lib/public/IURLGenerator.php b/lib/public/IURLGenerator.php
index ebf35967551..368f65fe4c1 100644
--- a/lib/public/IURLGenerator.php
+++ b/lib/public/IURLGenerator.php
@@ -50,6 +50,14 @@ interface IURLGenerator {
 	 */
 	public function linkToRouteAbsolute(string $routeName, array $arguments = array()): string;
 
+	/**
+	 * @param string $routeName
+	 * @param array $arguments
+	 * @return string
+	 * @since 15.0.0
+	 */
+	public function linkToOCSRouteAbsolute(string $routeName, array $arguments = []): string;
+
 	/**
 	 * Returns an URL for an image or file
 	 * @param string $appName the name of the app
diff --git a/tests/lib/UrlGeneratorTest.php b/tests/lib/UrlGeneratorTest.php
index 340c9c7082d..0e50f4d92ec 100644
--- a/tests/lib/UrlGeneratorTest.php
+++ b/tests/lib/UrlGeneratorTest.php
@@ -162,4 +162,22 @@ class UrlGeneratorTest extends \Test\TestCase {
 		$this->assertEquals($expected, $actual);
 	}
 
+	/**
+	 * @dataProvider provideOCSRoutes
+	 */
+	public function testLinkToOCSRouteAbsolute(string $route, string $expected) {
+		$this->mockBaseUrl();
+		\OC::$WEBROOT = '/nextcloud';
+		$result = $this->urlGenerator->linkToOCSRouteAbsolute($route);
+		$this->assertEquals($expected, $result);
+	}
+
+	public function provideOCSRoutes() {
+		return [
+			['core.OCS.getCapabilities', 'http://localhost/nextcloud/ocs/v2.php/cloud/capabilities'],
+			['core.WhatsNew.dismiss', 'http://localhost/nextcloud/ocs/v2.php/core/whatsnew'],
+		];
+	}
+
+
 }
-- 
GitLab