Skip to content

Commit 20e00cd

Browse files
feat(app-framework): Add UseSession attribute to replace annotation
Signed-off-by: Christoph Wurst <[email protected]>
1 parent be1de30 commit 20e00cd

File tree

10 files changed

+189
-72
lines changed

10 files changed

+189
-72
lines changed

core/Controller/ClientFlowLoginController.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
use OCA\OAuth2\Db\ClientMapper;
4242
use OCP\AppFramework\Controller;
4343
use OCP\AppFramework\Http;
44+
use OCP\AppFramework\Http\Attribute\UseSession;
4445
use OCP\AppFramework\Http\Response;
4546
use OCP\AppFramework\Http\StandaloneTemplateResponse;
4647
use OCP\Defaults;
@@ -126,8 +127,8 @@ private function stateTokenForbiddenResponse(): StandaloneTemplateResponse {
126127
/**
127128
* @PublicPage
128129
* @NoCSRFRequired
129-
* @UseSession
130130
*/
131+
#[UseSession]
131132
public function showAuthPickerPage(string $clientIdentifier = '', string $user = '', int $direct = 0): StandaloneTemplateResponse {
132133
$clientName = $this->getClientName();
133134
$client = null;
@@ -193,8 +194,8 @@ public function showAuthPickerPage(string $clientIdentifier = '', string $user =
193194
* @NoAdminRequired
194195
* @NoCSRFRequired
195196
* @NoSameSiteCookieRequired
196-
* @UseSession
197197
*/
198+
#[UseSession]
198199
public function grantPage(string $stateToken = '',
199200
string $clientIdentifier = '',
200201
int $direct = 0): StandaloneTemplateResponse {
@@ -243,10 +244,10 @@ public function grantPage(string $stateToken = '',
243244

244245
/**
245246
* @NoAdminRequired
246-
* @UseSession
247247
*
248248
* @return Http\RedirectResponse|Response
249249
*/
250+
#[UseSession]
250251
public function generateAppPassword(string $stateToken,
251252
string $clientIdentifier = '') {
252253
if (!$this->isValidToken($stateToken)) {

core/Controller/ClientFlowLoginV2Controller.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use OC\Core\Service\LoginFlowV2Service;
3434
use OCP\AppFramework\Controller;
3535
use OCP\AppFramework\Http;
36+
use OCP\AppFramework\Http\Attribute\UseSession;
3637
use OCP\AppFramework\Http\JSONResponse;
3738
use OCP\AppFramework\Http\RedirectResponse;
3839
use OCP\AppFramework\Http\Response;
@@ -97,8 +98,8 @@ public function poll(string $token): JSONResponse {
9798
/**
9899
* @NoCSRFRequired
99100
* @PublicPage
100-
* @UseSession
101101
*/
102+
#[UseSession]
102103
public function landing(string $token, $user = ''): Response {
103104
if (!$this->loginFlowV2Service->startLoginFlow($token)) {
104105
return $this->loginTokenForbiddenResponse();
@@ -114,8 +115,8 @@ public function landing(string $token, $user = ''): Response {
114115
/**
115116
* @NoCSRFRequired
116117
* @PublicPage
117-
* @UseSession
118118
*/
119+
#[UseSession]
119120
public function showAuthPickerPage($user = ''): StandaloneTemplateResponse {
120121
try {
121122
$flow = $this->getFlowByLoginToken();
@@ -145,10 +146,10 @@ public function showAuthPickerPage($user = ''): StandaloneTemplateResponse {
145146

146147
/**
147148
* @NoAdminRequired
148-
* @UseSession
149149
* @NoCSRFRequired
150150
* @NoSameSiteCookieRequired
151151
*/
152+
#[UseSession]
152153
public function grantPage(string $stateToken): StandaloneTemplateResponse {
153154
if (!$this->isValidStateToken($stateToken)) {
154155
return $this->stateTokenForbiddenResponse();
@@ -222,8 +223,8 @@ public function apptokenRedirect(string $stateToken, string $user, string $passw
222223

223224
/**
224225
* @NoAdminRequired
225-
* @UseSession
226226
*/
227+
#[UseSession]
227228
public function generateAppPassword(string $stateToken): Response {
228229
if (!$this->isValidStateToken($stateToken)) {
229230
return $this->stateTokenForbiddenResponse();

core/Controller/LoginController.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
use OC_App;
4444
use OCP\AppFramework\Controller;
4545
use OCP\AppFramework\Http;
46+
use OCP\AppFramework\Http\Attribute\UseSession;
4647
use OCP\AppFramework\Http\DataResponse;
4748
use OCP\AppFramework\Http\RedirectResponse;
4849
use OCP\AppFramework\Http\TemplateResponse;
@@ -105,10 +106,10 @@ public function __construct(?string $appName,
105106

106107
/**
107108
* @NoAdminRequired
108-
* @UseSession
109109
*
110110
* @return RedirectResponse
111111
*/
112+
#[UseSession]
112113
public function logout() {
113114
$loginToken = $this->request->getCookie('nc_token');
114115
if (!is_null($loginToken)) {
@@ -134,13 +135,13 @@ public function logout() {
134135
/**
135136
* @PublicPage
136137
* @NoCSRFRequired
137-
* @UseSession
138138
*
139139
* @param string $user
140140
* @param string $redirect_url
141141
*
142142
* @return TemplateResponse|RedirectResponse
143143
*/
144+
#[UseSession]
144145
public function showLoginForm(string $user = null, string $redirect_url = null): Http\Response {
145146
if ($this->userSession->isLoggedIn()) {
146147
return new RedirectResponse($this->urlGenerator->linkToDefaultPageUrl());
@@ -283,12 +284,12 @@ private function generateRedirect(?string $redirectUrl): RedirectResponse {
283284

284285
/**
285286
* @PublicPage
286-
* @UseSession
287287
* @NoCSRFRequired
288288
* @BruteForceProtection(action=login)
289289
*
290290
* @return RedirectResponse
291291
*/
292+
#[UseSession]
292293
public function tryLogin(Chain $loginChain,
293294
string $user,
294295
string $password,
@@ -368,12 +369,12 @@ private function createLoginFailedResponse(
368369

369370
/**
370371
* @NoAdminRequired
371-
* @UseSession
372372
* @BruteForceProtection(action=sudo)
373373
*
374374
* @license GNU AGPL version 3 or any later version
375375
*
376376
*/
377+
#[UseSession]
377378
public function confirmPassword(string $password): DataResponse {
378379
$loginName = $this->userSession->getLoginName();
379380
$loginResult = $this->userManager->checkPassword($loginName, $password);

core/Controller/TwoFactorChallengeController.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use OC\Authentication\TwoFactorAuth\Manager;
2929
use OC_User;
3030
use OCP\AppFramework\Controller;
31+
use OCP\AppFramework\Http\Attribute\UseSession;
3132
use OCP\AppFramework\Http\RedirectResponse;
3233
use OCP\AppFramework\Http\StandaloneTemplateResponse;
3334
use OCP\Authentication\TwoFactorAuth\IActivatableAtLogin;
@@ -110,13 +111,13 @@ public function selectChallenge($redirect_url) {
110111
/**
111112
* @NoAdminRequired
112113
* @NoCSRFRequired
113-
* @UseSession
114114
* @TwoFactorSetUpDoneRequired
115115
*
116116
* @param string $challengeProviderId
117117
* @param string $redirect_url
118118
* @return StandaloneTemplateResponse|RedirectResponse
119119
*/
120+
#[UseSession]
120121
public function showChallenge($challengeProviderId, $redirect_url) {
121122
$user = $this->userSession->getUser();
122123
$providerSet = $this->twoFactorManager->getProviderSet($user);
@@ -161,7 +162,6 @@ public function showChallenge($challengeProviderId, $redirect_url) {
161162
/**
162163
* @NoAdminRequired
163164
* @NoCSRFRequired
164-
* @UseSession
165165
* @TwoFactorSetUpDoneRequired
166166
*
167167
* @UserRateThrottle(limit=5, period=100)
@@ -171,6 +171,7 @@ public function showChallenge($challengeProviderId, $redirect_url) {
171171
* @param string $redirect_url
172172
* @return RedirectResponse
173173
*/
174+
#[UseSession]
174175
public function solveChallenge($challengeProviderId, $challenge, $redirect_url = null) {
175176
$user = $this->userSession->getUser();
176177
$provider = $this->twoFactorManager->getProvider($user, $challengeProviderId);

core/Controller/WebAuthnController.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
use OC\URLGenerator;
3434
use OCP\AppFramework\Controller;
3535
use OCP\AppFramework\Http;
36+
use OCP\AppFramework\Http\Attribute\UseSession;
3637
use OCP\AppFramework\Http\JSONResponse;
3738
use OCP\IRequest;
3839
use OCP\ISession;
@@ -63,8 +64,8 @@ public function __construct($appName, IRequest $request, Manager $webAuthnManger
6364
/**
6465
* @NoAdminRequired
6566
* @PublicPage
66-
* @UseSession
6767
*/
68+
#[UseSession]
6869
public function startAuthentication(string $loginName): JSONResponse {
6970
$this->logger->debug('Starting WebAuthn login');
7071

@@ -87,8 +88,8 @@ public function startAuthentication(string $loginName): JSONResponse {
8788
/**
8889
* @NoAdminRequired
8990
* @PublicPage
90-
* @UseSession
9191
*/
92+
#[UseSession]
9293
public function finishAuthentication(string $data): JSONResponse {
9394
$this->logger->debug('Validating WebAuthn login');
9495

lib/composer/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
'OCP\\AppFramework\\Db\\QBMapper' => $baseDir . '/lib/public/AppFramework/Db/QBMapper.php',
3636
'OCP\\AppFramework\\Db\\TTransactional' => $baseDir . '/lib/public/AppFramework/Db/TTransactional.php',
3737
'OCP\\AppFramework\\Http' => $baseDir . '/lib/public/AppFramework/Http.php',
38+
'OCP\\AppFramework\\Http\\Attribute\\UseSession' => $baseDir . '/lib/public/AppFramework/Http/Attribute/UseSession.php',
3839
'OCP\\AppFramework\\Http\\ContentSecurityPolicy' => $baseDir . '/lib/public/AppFramework/Http/ContentSecurityPolicy.php',
3940
'OCP\\AppFramework\\Http\\DataDisplayResponse' => $baseDir . '/lib/public/AppFramework/Http/DataDisplayResponse.php',
4041
'OCP\\AppFramework\\Http\\DataDownloadResponse' => $baseDir . '/lib/public/AppFramework/Http/DataDownloadResponse.php',

lib/composer/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
6868
'OCP\\AppFramework\\Db\\QBMapper' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/QBMapper.php',
6969
'OCP\\AppFramework\\Db\\TTransactional' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/TTransactional.php',
7070
'OCP\\AppFramework\\Http' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http.php',
71+
'OCP\\AppFramework\\Http\\Attribute\\UseSession' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http/Attribute/UseSession.php',
7172
'OCP\\AppFramework\\Http\\ContentSecurityPolicy' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http/ContentSecurityPolicy.php',
7273
'OCP\\AppFramework\\Http\\DataDisplayResponse' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http/DataDisplayResponse.php',
7374
'OCP\\AppFramework\\Http\\DataDownloadResponse' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Http/DataDownloadResponse.php',

lib/private/AppFramework/Middleware/SessionMiddleware.php

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
<?php
2+
3+
declare(strict_types=1);
4+
25
/**
36
* @copyright Copyright (c) 2016, ownCloud, Inc.
47
*
@@ -27,9 +30,11 @@
2730

2831
use OC\AppFramework\Utility\ControllerMethodReflector;
2932
use OCP\AppFramework\Controller;
33+
use OCP\AppFramework\Http\Attribute\UseSession;
3034
use OCP\AppFramework\Http\Response;
3135
use OCP\AppFramework\Middleware;
3236
use OCP\ISession;
37+
use ReflectionMethod;
3338

3439
class SessionMiddleware extends Middleware {
3540
/** @var ControllerMethodReflector */
@@ -49,8 +54,18 @@ public function __construct(ControllerMethodReflector $reflector,
4954
* @param string $methodName
5055
*/
5156
public function beforeController($controller, $methodName) {
52-
$useSession = $this->reflector->hasAnnotation('UseSession');
53-
if ($useSession) {
57+
/**
58+
* Annotation deprecated with Nextcloud 26
59+
*/
60+
$hasAnnotation = $this->reflector->hasAnnotation('UseSession');
61+
if ($hasAnnotation) {
62+
$this->session->reopen();
63+
return;
64+
}
65+
66+
$reflectionMethod = new ReflectionMethod($controller, $methodName);
67+
$hasAttribute = !empty($reflectionMethod->getAttributes(UseSession::class));
68+
if ($hasAttribute) {
5469
$this->session->reopen();
5570
}
5671
}
@@ -62,10 +77,21 @@ public function beforeController($controller, $methodName) {
6277
* @return Response
6378
*/
6479
public function afterController($controller, $methodName, Response $response) {
65-
$useSession = $this->reflector->hasAnnotation('UseSession');
66-
if ($useSession) {
80+
/**
81+
* Annotation deprecated with Nextcloud 26
82+
*/
83+
$hasAnnotation = $this->reflector->hasAnnotation('UseSession');
84+
if ($hasAnnotation) {
6785
$this->session->close();
86+
return $response;
6887
}
88+
89+
$reflectionMethod = new ReflectionMethod($controller, $methodName);
90+
$hasAttribute = !empty($reflectionMethod->getAttributes(UseSession::class));
91+
if ($hasAttribute) {
92+
$this->session->close();
93+
}
94+
6995
return $response;
7096
}
7197
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* @copyright 2023 Christoph Wurst <[email protected]>
7+
*
8+
* @author 2023 Christoph Wurst <[email protected]>
9+
*
10+
* @license GNU AGPL version 3 or any later version
11+
*
12+
* This program is free software: you can redistribute it and/or modify
13+
* it under the terms of the GNU Affero General Public License as
14+
* published by the Free Software Foundation, either version 3 of the
15+
* License, or (at your option) any later version.
16+
*
17+
* This program is distributed in the hope that it will be useful,
18+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20+
* GNU Affero General Public License for more details.
21+
*
22+
* You should have received a copy of the GNU Affero General Public License
23+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
24+
*/
25+
26+
namespace OCP\AppFramework\Http\Attribute;
27+
28+
use Attribute;
29+
30+
/**
31+
* Attribute for controller methods that need to read/write PHP session data
32+
*
33+
* @since 26.0.0
34+
*/
35+
#[Attribute]
36+
class UseSession {
37+
}

0 commit comments

Comments
 (0)