diff --git a/lib/private/AppFramework/Http/Request.php b/lib/private/AppFramework/Http/Request.php index a41b6fb57938a..75c2b8568e560 100644 --- a/lib/private/AppFramework/Http/Request.php +++ b/lib/private/AppFramework/Http/Request.php @@ -291,6 +291,8 @@ public function getHeader(string $name): string { 'CONTENT_TYPE' => true, 'CONTENT_LENGTH' => true, 'REMOTE_ADDR' => true, + 'PHP_AUTH_USER' => true, + 'PHP_AUTH_PW' => true, ]; if (isset($specialKeys[$elementName]) && isset($this->server[$elementName])) { diff --git a/lib/private/AppFramework/Middleware/Security/PasswordConfirmationMiddleware.php b/lib/private/AppFramework/Middleware/Security/PasswordConfirmationMiddleware.php index 0d29c38a26ca7..534303dc9bcf2 100644 --- a/lib/private/AppFramework/Middleware/Security/PasswordConfirmationMiddleware.php +++ b/lib/private/AppFramework/Middleware/Security/PasswordConfirmationMiddleware.php @@ -77,11 +77,12 @@ public function beforeController(Controller $controller, string $methodName): vo $reflectionMethod = new ReflectionMethod($controller, $methodName); if ($this->isPasswordConfirmationStrict($reflectionMethod)) { - $authHeader = $this->request->getHeader('Authorization'); - if (!str_starts_with(strtolower($authHeader), 'basic ')) { + $password = $this->request->getHeader('PHP_AUTH_PW'); + + if ($password === '') { throw new NotConfirmedException('Required authorization header missing'); } - [, $password] = explode(':', base64_decode(substr($authHeader, 6)), 2); + $loginName = $this->session->get('loginname'); $loginResult = $this->userManager->checkPassword($loginName, $password); if ($loginResult === false) { diff --git a/tests/lib/AppFramework/Middleware/Security/Mock/PasswordConfirmationMiddlewareController.php b/tests/lib/AppFramework/Middleware/Security/Mock/PasswordConfirmationMiddlewareController.php index cd1cdaa49ca33..8b6cec1fccd37 100644 --- a/tests/lib/AppFramework/Middleware/Security/Mock/PasswordConfirmationMiddlewareController.php +++ b/tests/lib/AppFramework/Middleware/Security/Mock/PasswordConfirmationMiddlewareController.php @@ -35,4 +35,8 @@ public function testAttribute() { #[PasswordConfirmationRequired] public function testSSO() { } + + #[PasswordConfirmationRequired(strict: true)] + public function testAuthHeader() { + } } diff --git a/tests/lib/AppFramework/Middleware/Security/PasswordConfirmationMiddlewareTest.php b/tests/lib/AppFramework/Middleware/Security/PasswordConfirmationMiddlewareTest.php index 1968e5abb5062..0aa7d519c5bed 100644 --- a/tests/lib/AppFramework/Middleware/Security/PasswordConfirmationMiddlewareTest.php +++ b/tests/lib/AppFramework/Middleware/Security/PasswordConfirmationMiddlewareTest.php @@ -205,4 +205,34 @@ public function testSSO(): void { $this->assertSame(false, $thrown); } + + public function testAuthHeader(): void { + $this->reflector->reflect($this->controller, __FUNCTION__); + + $this->user->method('getBackendClassName') + ->willReturn('fictional_backend'); + $this->userSession->method('getUser') + ->willReturn($this->user); + + $this->session->method('get') + ->with('loginname') + ->willReturn('user'); + + $this->request->method('getHeader') + ->with('PHP_AUTH_PW') + ->willReturn('password'); + + $this->userManager->expects($this->once()) + ->method('checkPassword') + ->with('user', 'password'); + + $thrown = false; + try { + $this->middleware->beforeController($this->controller, __FUNCTION__); + } catch (NotConfirmedException) { + $thrown = true; + } + + $this->assertSame(false, $thrown); + } }