summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Wurst <ChristophWurst@users.noreply.github.com>2023-01-18 17:00:54 +0100
committerGitHub <noreply@github.com>2023-01-18 17:00:54 +0100
commit46dcbd3b77a6bc660b4aae95f4b1c71467721375 (patch)
tree9adb7ba2d021269dc0efd4d47d4076563a28c363
parent9e08e4999821a0cf7c6b08fd9ab05f8d057c8362 (diff)
parent20fcfb573951a594f71afaf97678d38d8b05c9f2 (diff)
downloadnextcloud-server-46dcbd3b77a6bc660b4aae95f4b1c71467721375.tar.gz
nextcloud-server-46dcbd3b77a6bc660b4aae95f4b1c71467721375.zip
Merge pull request #35783 from nextcloud/feat/inject-controller-services-into-methods
Inject services into controller methods
-rw-r--r--core/Controller/LoginController.php14
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php3
-rw-r--r--lib/private/AppFramework/Http/Dispatcher.php9
-rw-r--r--tests/Core/Controller/LoginControllerTest.php37
-rw-r--r--tests/lib/AppFramework/Http/DispatcherTest.php29
5 files changed, 49 insertions, 43 deletions
diff --git a/core/Controller/LoginController.php b/core/Controller/LoginController.php
index ef1c1fbd94f..8fd994ae648 100644
--- a/core/Controller/LoginController.php
+++ b/core/Controller/LoginController.php
@@ -71,7 +71,6 @@ class LoginController extends Controller {
private IURLGenerator $urlGenerator;
private Defaults $defaults;
private Throttler $throttler;
- private Chain $loginChain;
private IInitialStateService $initialStateService;
private WebAuthnManager $webAuthnManager;
private IManager $manager;
@@ -86,7 +85,6 @@ class LoginController extends Controller {
IURLGenerator $urlGenerator,
Defaults $defaults,
Throttler $throttler,
- Chain $loginChain,
IInitialStateService $initialStateService,
WebAuthnManager $webAuthnManager,
IManager $manager,
@@ -99,7 +97,6 @@ class LoginController extends Controller {
$this->urlGenerator = $urlGenerator;
$this->defaults = $defaults;
$this->throttler = $throttler;
- $this->loginChain = $loginChain;
$this->initialStateService = $initialStateService;
$this->webAuthnManager = $webAuthnManager;
$this->manager = $manager;
@@ -290,15 +287,10 @@ class LoginController extends Controller {
* @NoCSRFRequired
* @BruteForceProtection(action=login)
*
- * @param string $user
- * @param string $password
- * @param string $redirect_url
- * @param string $timezone
- * @param string $timezone_offset
- *
* @return RedirectResponse
*/
- public function tryLogin(string $user,
+ public function tryLogin(Chain $loginChain,
+ string $user,
string $password,
string $redirect_url = null,
string $timezone = '',
@@ -330,7 +322,7 @@ class LoginController extends Controller {
$timezone,
$timezone_offset
);
- $result = $this->loginChain->process($data);
+ $result = $loginChain->process($data);
if (!$result->isSuccess()) {
return $this->createLoginFailedResponse(
$data->getUsername(),
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 462f9b978fd..6e0e452bccd 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -191,7 +191,8 @@ class DIContainer extends SimpleContainer implements IAppContainer {
$c->get(IConfig::class),
$c->get(IDBConnection::class),
$c->get(LoggerInterface::class),
- $c->get(EventLogger::class)
+ $c->get(EventLogger::class),
+ $c,
);
});
diff --git a/lib/private/AppFramework/Http/Dispatcher.php b/lib/private/AppFramework/Http/Dispatcher.php
index aaaf2ba6560..cc288edc966 100644
--- a/lib/private/AppFramework/Http/Dispatcher.php
+++ b/lib/private/AppFramework/Http/Dispatcher.php
@@ -42,6 +42,7 @@ use OCP\AppFramework\Http\Response;
use OCP\Diagnostics\IEventLogger;
use OCP\IConfig;
use OCP\IRequest;
+use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
/**
@@ -73,6 +74,8 @@ class Dispatcher {
/** @var IEventLogger */
private $eventLogger;
+ private ContainerInterface $appContainer;
+
/**
* @param Http $protocol the http protocol with contains all status headers
* @param MiddlewareDispatcher $middlewareDispatcher the dispatcher which
@@ -92,7 +95,8 @@ class Dispatcher {
IConfig $config,
ConnectionAdapter $connection,
LoggerInterface $logger,
- IEventLogger $eventLogger) {
+ IEventLogger $eventLogger,
+ ContainerInterface $appContainer) {
$this->protocol = $protocol;
$this->middlewareDispatcher = $middlewareDispatcher;
$this->reflector = $reflector;
@@ -101,6 +105,7 @@ class Dispatcher {
$this->connection = $connection;
$this->logger = $logger;
$this->eventLogger = $eventLogger;
+ $this->appContainer = $appContainer;
}
@@ -216,6 +221,8 @@ class Dispatcher {
$value = false;
} elseif ($value !== null && \in_array($type, $types, true)) {
settype($value, $type);
+ } elseif ($value === null && $type !== null && $this->appContainer->has($type)) {
+ $value = $this->appContainer->get($type);
}
$arguments[] = $value;
diff --git a/tests/Core/Controller/LoginControllerTest.php b/tests/Core/Controller/LoginControllerTest.php
index 8a206a429bd..2c8aedf99c4 100644
--- a/tests/Core/Controller/LoginControllerTest.php
+++ b/tests/Core/Controller/LoginControllerTest.php
@@ -78,9 +78,6 @@ class LoginControllerTest extends TestCase {
/** @var Throttler|MockObject */
private $throttler;
- /** @var LoginChain|MockObject */
- private $chain;
-
/** @var IInitialStateService|MockObject */
private $initialStateService;
@@ -104,7 +101,6 @@ class LoginControllerTest extends TestCase {
$this->twoFactorManager = $this->createMock(Manager::class);
$this->defaults = $this->createMock(Defaults::class);
$this->throttler = $this->createMock(Throttler::class);
- $this->chain = $this->createMock(LoginChain::class);
$this->initialStateService = $this->createMock(IInitialStateService::class);
$this->webAuthnManager = $this->createMock(\OC\Authentication\WebAuthn\Manager::class);
$this->notificationManager = $this->createMock(IManager::class);
@@ -134,7 +130,6 @@ class LoginControllerTest extends TestCase {
$this->urlGenerator,
$this->defaults,
$this->throttler,
- $this->chain,
$this->initialStateService,
$this->webAuthnManager,
$this->notificationManager,
@@ -448,11 +443,11 @@ class LoginControllerTest extends TestCase {
$this->assertEquals($expectedResponse, $this->loginController->showLoginForm('0', ''));
}
- public function testLoginWithInvalidCredentials() {
+ public function testLoginWithInvalidCredentials(): void {
$user = 'MyUserName';
$password = 'secret';
$loginPageUrl = '/login?redirect_url=/apps/files';
-
+ $loginChain = $this->createMock(LoginChain::class);
$this->request
->expects($this->once())
->method('passesCSRFCheck')
@@ -464,7 +459,7 @@ class LoginControllerTest extends TestCase {
'/apps/files'
);
$loginResult = LoginResult::failure($loginData, LoginController::LOGIN_MSG_INVALIDPASSWORD);
- $this->chain->expects($this->once())
+ $loginChain->expects($this->once())
->method('process')
->with($this->equalTo($loginData))
->willReturn($loginResult);
@@ -479,7 +474,7 @@ class LoginControllerTest extends TestCase {
$expected = new RedirectResponse($loginPageUrl);
$expected->throttle(['user' => 'MyUserName']);
- $response = $this->loginController->tryLogin($user, $password, '/apps/files');
+ $response = $this->loginController->tryLogin($loginChain, $user, $password, '/apps/files');
$this->assertEquals($expected, $response);
}
@@ -487,7 +482,7 @@ class LoginControllerTest extends TestCase {
public function testLoginWithValidCredentials() {
$user = 'MyUserName';
$password = 'secret';
-
+ $loginChain = $this->createMock(LoginChain::class);
$this->request
->expects($this->once())
->method('passesCSRFCheck')
@@ -498,7 +493,7 @@ class LoginControllerTest extends TestCase {
$password
);
$loginResult = LoginResult::success($loginData);
- $this->chain->expects($this->once())
+ $loginChain->expects($this->once())
->method('process')
->with($this->equalTo($loginData))
->willReturn($loginResult);
@@ -508,7 +503,7 @@ class LoginControllerTest extends TestCase {
->willReturn('/default/foo');
$expected = new RedirectResponse('/default/foo');
- $this->assertEquals($expected, $this->loginController->tryLogin($user, $password));
+ $this->assertEquals($expected, $this->loginController->tryLogin($loginChain, $user, $password));
}
public function testLoginWithoutPassedCsrfCheckAndNotLoggedIn(): void {
@@ -519,7 +514,7 @@ class LoginControllerTest extends TestCase {
->willReturn('jane');
$password = 'secret';
$originalUrl = 'another%20url';
-
+ $loginChain = $this->createMock(LoginChain::class);
$this->request
->expects($this->once())
->method('passesCSRFCheck')
@@ -533,7 +528,7 @@ class LoginControllerTest extends TestCase {
$this->userSession->expects($this->never())
->method('createRememberMeToken');
- $response = $this->loginController->tryLogin('Jane', $password, $originalUrl);
+ $response = $this->loginController->tryLogin($loginChain, 'Jane', $password, $originalUrl);
$expected = new RedirectResponse('');
$expected->throttle(['user' => 'Jane']);
@@ -549,7 +544,7 @@ class LoginControllerTest extends TestCase {
$password = 'secret';
$originalUrl = 'another url';
$redirectUrl = 'http://localhost/another url';
-
+ $loginChain = $this->createMock(LoginChain::class);
$this->request
->expects($this->once())
->method('passesCSRFCheck')
@@ -571,7 +566,7 @@ class LoginControllerTest extends TestCase {
->with('remember_login_cookie_lifetime')
->willReturn(1234);
- $response = $this->loginController->tryLogin('Jane', $password, $originalUrl);
+ $response = $this->loginController->tryLogin($loginChain, 'Jane', $password, $originalUrl);
$expected = new RedirectResponse($redirectUrl);
$this->assertEquals($expected, $response);
@@ -581,7 +576,7 @@ class LoginControllerTest extends TestCase {
$user = 'MyUserName';
$password = 'secret';
$redirectUrl = 'https://next.cloud/apps/mail';
-
+ $loginChain = $this->createMock(LoginChain::class);
$this->request
->expects($this->once())
->method('passesCSRFCheck')
@@ -593,7 +588,7 @@ class LoginControllerTest extends TestCase {
'/apps/mail'
);
$loginResult = LoginResult::success($loginData);
- $this->chain->expects($this->once())
+ $loginChain->expects($this->once())
->method('process')
->with($this->equalTo($loginData))
->willReturn($loginResult);
@@ -606,12 +601,13 @@ class LoginControllerTest extends TestCase {
->willReturn($redirectUrl);
$expected = new RedirectResponse($redirectUrl);
- $response = $this->loginController->tryLogin($user, $password, '/apps/mail');
+ $response = $this->loginController->tryLogin($loginChain, $user, $password, '/apps/mail');
$this->assertEquals($expected, $response);
}
public function testToNotLeakLoginName() {
+ $loginChain = $this->createMock(LoginChain::class);
$this->request
->expects($this->once())
->method('passesCSRFCheck')
@@ -624,7 +620,7 @@ class LoginControllerTest extends TestCase {
'/apps/files'
);
$loginResult = LoginResult::failure($loginData, LoginController::LOGIN_MSG_INVALIDPASSWORD);
- $this->chain->expects($this->once())
+ $loginChain->expects($this->once())
->method('process')
->with($this->equalTo($loginData))
->willReturnCallback(function (LoginData $data) use ($loginResult) {
@@ -643,6 +639,7 @@ class LoginControllerTest extends TestCase {
$expected->throttle(['user' => 'john']);
$response = $this->loginController->tryLogin(
+ $loginChain,
'john@doe.com',
'just wrong',
'/apps/files'
diff --git a/tests/lib/AppFramework/Http/DispatcherTest.php b/tests/lib/AppFramework/Http/DispatcherTest.php
index 016bd7efb58..7f81701a8b3 100644
--- a/tests/lib/AppFramework/Http/DispatcherTest.php
+++ b/tests/lib/AppFramework/Http/DispatcherTest.php
@@ -36,6 +36,7 @@ use OCP\Diagnostics\IEventLogger;
use OCP\IConfig;
use OCP\IRequest;
use PHPUnit\Framework\MockObject\MockObject;
+use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use OCP\IRequestId;
@@ -104,10 +105,10 @@ class DispatcherTest extends \Test\TestCase {
private $config;
/** @var LoggerInterface|MockObject */
private $logger;
- /**
- * @var IEventLogger|MockObject
- */
+ /** @var IEventLogger|MockObject */
private $eventLogger;
+ /** @var ContainerInterface|MockObject */
+ private $container;
protected function setUp(): void {
parent::setUp();
@@ -116,6 +117,7 @@ class DispatcherTest extends \Test\TestCase {
$this->config = $this->createMock(IConfig::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->eventLogger = $this->createMock(IEventLogger::class);
+ $this->container = $this->createMock(ContainerInterface::class);
$app = $this->getMockBuilder(
'OC\AppFramework\DependencyInjection\DIContainer')
->disableOriginalConstructor()
@@ -154,7 +156,8 @@ class DispatcherTest extends \Test\TestCase {
$this->config,
\OC::$server->getDatabaseConnection(),
$this->logger,
- $this->eventLogger
+ $this->eventLogger,
+ $this->container,
);
$this->response = $this->createMock(Response::class);
@@ -330,7 +333,8 @@ class DispatcherTest extends \Test\TestCase {
$this->config,
\OC::$server->getDatabaseConnection(),
$this->logger,
- $this->eventLogger
+ $this->eventLogger,
+ $this->container
);
$controller = new TestController('app', $this->request);
@@ -362,7 +366,8 @@ class DispatcherTest extends \Test\TestCase {
$this->config,
\OC::$server->getDatabaseConnection(),
$this->logger,
- $this->eventLogger
+ $this->eventLogger,
+ $this->container
);
$controller = new TestController('app', $this->request);
@@ -397,7 +402,8 @@ class DispatcherTest extends \Test\TestCase {
$this->config,
\OC::$server->getDatabaseConnection(),
$this->logger,
- $this->eventLogger
+ $this->eventLogger,
+ $this->container
);
$controller = new TestController('app', $this->request);
@@ -431,7 +437,8 @@ class DispatcherTest extends \Test\TestCase {
$this->config,
\OC::$server->getDatabaseConnection(),
$this->logger,
- $this->eventLogger
+ $this->eventLogger,
+ $this->container
);
$controller = new TestController('app', $this->request);
@@ -466,7 +473,8 @@ class DispatcherTest extends \Test\TestCase {
$this->config,
\OC::$server->getDatabaseConnection(),
$this->logger,
- $this->eventLogger
+ $this->eventLogger,
+ $this->container
);
$controller = new TestController('app', $this->request);
@@ -503,7 +511,8 @@ class DispatcherTest extends \Test\TestCase {
$this->config,
\OC::$server->getDatabaseConnection(),
$this->logger,
- $this->eventLogger
+ $this->eventLogger,
+ $this->container
);
$controller = new TestController('app', $this->request);