Skip to content

Commit

Permalink
Merge pull request #36552 from nextcloud/fix/client-login-flow/missin…
Browse files Browse the repository at this point in the history
…g-state-token

fix(client-login-flow): Handle missing stateToken gracefully
  • Loading branch information
ChristophWurst authored Feb 6, 2023
2 parents 3473b69 + 88d116b commit eca7ab3
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 3 deletions.
29 changes: 26 additions & 3 deletions core/Controller/ClientFlowLoginV2Controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,10 @@ public function showAuthPickerPage($user = ''): StandaloneTemplateResponse {
* @NoSameSiteCookieRequired
*/
#[UseSession]
public function grantPage(string $stateToken): StandaloneTemplateResponse {
public function grantPage(?string $stateToken): StandaloneTemplateResponse {
if ($stateToken === null) {
return $this->stateTokenMissingResponse();
}
if (!$this->isValidStateToken($stateToken)) {
return $this->stateTokenForbiddenResponse();
}
Expand Down Expand Up @@ -182,7 +185,11 @@ public function grantPage(string $stateToken): StandaloneTemplateResponse {
/**
* @PublicPage
*/
public function apptokenRedirect(string $stateToken, string $user, string $password) {
public function apptokenRedirect(?string $stateToken, string $user, string $password) {
if ($stateToken === null) {
return $this->loginTokenForbiddenResponse();
}

if (!$this->isValidStateToken($stateToken)) {
return $this->stateTokenForbiddenResponse();
}
Expand Down Expand Up @@ -225,7 +232,10 @@ public function apptokenRedirect(string $stateToken, string $user, string $passw
* @NoAdminRequired
*/
#[UseSession]
public function generateAppPassword(string $stateToken): Response {
public function generateAppPassword(?string $stateToken): Response {
if ($stateToken === null) {
return $this->stateTokenMissingResponse();
}
if (!$this->isValidStateToken($stateToken)) {
return $this->stateTokenForbiddenResponse();
}
Expand Down Expand Up @@ -298,6 +308,19 @@ private function isValidStateToken(string $stateToken): bool {
return hash_equals($currentToken, $stateToken);
}

private function stateTokenMissingResponse(): StandaloneTemplateResponse {
$response = new StandaloneTemplateResponse(
$this->appName,
'403',
[
'message' => $this->l10n->t('State token missing'),
],
'guest'
);
$response->setStatus(Http::STATUS_FORBIDDEN);
return $response;
}

private function stateTokenForbiddenResponse(): StandaloneTemplateResponse {
$response = new StandaloneTemplateResponse(
$this->appName,
Expand Down
6 changes: 6 additions & 0 deletions tests/Core/Controller/ClientFlowLoginV2ControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,12 @@ public function testShowAuthPickerValidLoginToken() {
$this->controller->showAuthPickerPage();
}

public function testGrantPageNoStateToken(): void {
$result = $this->controller->grantPage(null);

$this->assertSame(Http::STATUS_FORBIDDEN, $result->getStatus());
}

public function testGrantPageInvalidStateToken() {
$this->session->method('get')
->willReturnCallback(function ($name) {
Expand Down

0 comments on commit eca7ab3

Please sign in to comment.