Merge pull request #14626 from nextcloud/bugfix/14621/make-sure-urlparams-are-correctly-injected-in-global-routes
Make sure urlparams are correctly injected in global routes
This commit is contained in:
commit
33c34ddafa
3 changed files with 34 additions and 91 deletions
101
core/routes.php
101
core/routes.php
|
@ -78,6 +78,17 @@ $application->registerRoutes($this, [
|
|||
['name' => 'contactsMenu#findOne', 'url' => '/contactsmenu/findOne', 'verb' => 'POST'],
|
||||
['name' => 'WalledGarden#get', 'url' => '/204', 'verb' => 'GET'],
|
||||
['name' => 'Search#search', 'url' => '/core/search', 'verb' => 'GET'],
|
||||
|
||||
// Legacy routes that need to be globally available while they are handled by an app
|
||||
['name' => 'viewcontroller#showFile', 'url' => '/f/{fileid}', 'verb' => 'GET', 'app' => 'files'],
|
||||
['name' => 'sharecontroller#showShare', 'url' => '/s/{token}', 'verb' => 'GET', 'app' => 'files_sharing'],
|
||||
['name' => 'sharecontroller#showAuthenticate', 'url' => '/s/{token}/authenticate/{redirect}', 'verb' => 'GET', 'app' => 'files_sharing'],
|
||||
['name' => 'sharecontroller#authenticate', 'url' => '/s/{token}/authenticate/{redirect}', 'verb' => 'POST', 'app' => 'files_sharing'],
|
||||
['name' => 'sharecontroller#downloadShare', 'url' => '/s/{token}/download', 'verb' => 'GET', 'app' => 'files_sharing'],
|
||||
['name' => 'publicpreview#directLink', 'url' => '/s/{token}/preview', 'verb' => 'GET', 'app' => 'files_sharing'],
|
||||
['name' => 'requesthandlercontroller#addShare', 'url' => '/ocm/shares', 'verb' => 'POST', 'app' => 'cloud_federation_api'],
|
||||
['name' => 'requesthandlercontroller#receiveNotification', 'url' => '/ocm/notifications', 'verb' => 'POST', 'app' => 'cloud_federation_api'],
|
||||
['name' => 'pagecontroller#showCall', 'url' => '/call/{token}', 'verb' => 'GET', 'app' => 'spreed'],
|
||||
],
|
||||
'ocs' => [
|
||||
['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'],
|
||||
|
@ -109,93 +120,3 @@ $application->registerRoutes($this, [
|
|||
// Routing
|
||||
$this->create('core_ajax_update', '/core/ajax/update.php')
|
||||
->actionInclude('core/ajax/update.php');
|
||||
|
||||
// File routes
|
||||
$this->create('files.viewcontroller.showFile', '/f/{fileid}')->action(function($urlParams) {
|
||||
$app = new \OCA\Files\AppInfo\Application($urlParams);
|
||||
$app->dispatch('ViewController', 'index');
|
||||
});
|
||||
|
||||
// Call routes
|
||||
/**
|
||||
* @suppress PhanUndeclaredClassConstant
|
||||
* @suppress PhanUndeclaredClassMethod
|
||||
*/
|
||||
$this->create('spreed.pagecontroller.showCall', '/call/{token}')->action(function($urlParams) {
|
||||
if (class_exists(\OCA\Spreed\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\Spreed\AppInfo\Application($urlParams);
|
||||
$app->dispatch('PageController', 'index');
|
||||
} else {
|
||||
throw new \OC\HintException('App spreed is not enabled');
|
||||
}
|
||||
});
|
||||
|
||||
// OCM routes
|
||||
/**
|
||||
* @suppress PhanUndeclaredClassConstant
|
||||
* @suppress PhanUndeclaredClassMethod
|
||||
*/
|
||||
$this->create('cloud_federation_api.requesthandlercontroller.addShare', '/ocm/shares')->post()->action(function($urlParams) {
|
||||
if (class_exists(\OCA\CloudFederationAPI\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\CloudFederationAPI\AppInfo\Application($urlParams);
|
||||
$app->dispatch('RequestHandlerController', 'addShare');
|
||||
} else {
|
||||
throw new \OC\HintException('Cloud Federation API not enabled');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* @suppress PhanUndeclaredClassConstant
|
||||
* @suppress PhanUndeclaredClassMethod
|
||||
*/
|
||||
$this->create('cloud_federation_api.requesthandlercontroller.receiveNotification', '/ocm/notifications')->post()->action(function($urlParams) {
|
||||
if (class_exists(\OCA\CloudFederationAPI\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\CloudFederationAPI\AppInfo\Application($urlParams);
|
||||
$app->dispatch('RequestHandlerController', 'receiveNotification');
|
||||
} else {
|
||||
throw new \OC\HintException('Cloud Federation API not enabled');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Sharing routes
|
||||
$this->create('files_sharing.sharecontroller.showShare', '/s/{token}')->action(function($urlParams) {
|
||||
if (class_exists(\OCA\Files_Sharing\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\Files_Sharing\AppInfo\Application($urlParams);
|
||||
$app->dispatch('ShareController', 'showShare');
|
||||
} else {
|
||||
throw new \OC\HintException('App file sharing is not enabled');
|
||||
}
|
||||
});
|
||||
$this->create('files_sharing.sharecontroller.authenticate', '/s/{token}/authenticate/{redirect}')->post()->action(function($urlParams) {
|
||||
if (class_exists(\OCA\Files_Sharing\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\Files_Sharing\AppInfo\Application($urlParams);
|
||||
$app->dispatch('ShareController', 'authenticate');
|
||||
} else {
|
||||
throw new \OC\HintException('App file sharing is not enabled');
|
||||
}
|
||||
});
|
||||
$this->create('files_sharing.sharecontroller.showAuthenticate', '/s/{token}/authenticate/{redirect}')->get()->action(function($urlParams) {
|
||||
if (class_exists(\OCA\Files_Sharing\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\Files_Sharing\AppInfo\Application($urlParams);
|
||||
$app->dispatch('ShareController', 'showAuthenticate');
|
||||
} else {
|
||||
throw new \OC\HintException('App file sharing is not enabled');
|
||||
}
|
||||
});
|
||||
$this->create('files_sharing.sharecontroller.downloadShare', '/s/{token}/download')->get()->action(function($urlParams) {
|
||||
if (class_exists(\OCA\Files_Sharing\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\Files_Sharing\AppInfo\Application($urlParams);
|
||||
$app->dispatch('ShareController', 'downloadShare');
|
||||
} else {
|
||||
throw new \OC\HintException('App file sharing is not enabled');
|
||||
}
|
||||
});
|
||||
$this->create('files_sharing.publicpreview.directLink', '/s/{token}/preview')->get()->action(function($urlParams) {
|
||||
if (class_exists(\OCA\Files_Sharing\AppInfo\Application::class, false)) {
|
||||
$app = new \OCA\Files_Sharing\AppInfo\Application($urlParams);
|
||||
$app->dispatch('PublicPreviewController', 'directLink');
|
||||
} else {
|
||||
throw new \OC\HintException('App file sharing is not enabled');
|
||||
}
|
||||
});
|
||||
|
|
|
@ -31,6 +31,7 @@ namespace OC\AppFramework;
|
|||
|
||||
use OC\AppFramework\Http\Dispatcher;
|
||||
use OC\AppFramework\DependencyInjection\DIContainer;
|
||||
use OC\HintException;
|
||||
use OCP\AppFramework\Http;
|
||||
use OCP\AppFramework\QueryException;
|
||||
use OCP\AppFramework\Http\ICallbackResponse;
|
||||
|
@ -81,6 +82,7 @@ class App {
|
|||
* @param string $methodName the method that you want to call
|
||||
* @param DIContainer $container an instance of a pimple container.
|
||||
* @param array $urlParams list of URL parameters (optional)
|
||||
* @throws HintException
|
||||
*/
|
||||
public static function main(string $controllerName, string $methodName, DIContainer $container, array $urlParams = null) {
|
||||
if (!is_null($urlParams)) {
|
||||
|
@ -94,6 +96,12 @@ class App {
|
|||
try {
|
||||
$controller = $container->query($controllerName);
|
||||
} catch(QueryException $e) {
|
||||
if (strpos($controllerName, '\\Controller\\') !== false) {
|
||||
// This is from a global registered app route that is not enabled.
|
||||
[/*OC(A)*/, $app, /* Controller/Name*/] = explode('\\', $controllerName, 3);
|
||||
throw new HintException('App ' . strtolower($app) . ' is not enabled');
|
||||
}
|
||||
|
||||
if ($appName === 'core') {
|
||||
$appNameSpace = 'OC\\Core';
|
||||
} else if ($appName === 'settings') {
|
||||
|
|
|
@ -30,6 +30,7 @@ declare(strict_types=1);
|
|||
namespace OC\AppFramework\Routing;
|
||||
|
||||
use OC\AppFramework\DependencyInjection\DIContainer;
|
||||
use OCP\AppFramework\App;
|
||||
use OCP\Route\IRouter;
|
||||
|
||||
/**
|
||||
|
@ -155,8 +156,21 @@ class RouteConfig {
|
|||
|
||||
$controllerName = $this->buildControllerName($controller);
|
||||
$actionName = $this->buildActionName($action);
|
||||
$appName = $simpleRoute['app'] ?? $this->appName;
|
||||
|
||||
$routeName = $this->appName . '.' . $controller . '.' . $action . $postfix;
|
||||
if (isset($simpleRoute['app'])) {
|
||||
// Legacy routes that need to be globally available while they are handled by an app
|
||||
// E.g. '/f/{id}', '/s/{token}', '/call/{token}', …
|
||||
$controllerName = str_replace('controllerController', 'Controller', $controllerName);
|
||||
if ($controllerName === 'PublicpreviewController') {
|
||||
$controllerName = 'PublicPreviewController';
|
||||
} else if ($controllerName === 'RequesthandlerController') {
|
||||
$controllerName = 'RequestHandlerController';
|
||||
}
|
||||
$controllerName = App::buildAppNamespace($appName) . '\\Controller\\' . $controllerName;
|
||||
}
|
||||
|
||||
$routeName = $appName . '.' . $controller . '.' . $action . $postfix;
|
||||
|
||||
// register the route
|
||||
$handler = new RouteActionHandler($this->container, $controllerName, $actionName);
|
||||
|
|
Loading…
Reference in a new issue