Completed
Push — stable13 ( f61d9a...32c40a )
by Roeland
19:46
created
core/Controller/ClientFlowLoginController.php 1 patch
Indentation   +262 added lines, -262 removed lines patch added patch discarded remove patch
@@ -48,292 +48,292 @@
 block discarded – undo
48 48
 use OCP\Session\Exceptions\SessionNotAvailableException;
49 49
 
50 50
 class ClientFlowLoginController extends Controller {
51
-	/** @var IUserSession */
52
-	private $userSession;
53
-	/** @var IL10N */
54
-	private $l10n;
55
-	/** @var Defaults */
56
-	private $defaults;
57
-	/** @var ISession */
58
-	private $session;
59
-	/** @var IProvider */
60
-	private $tokenProvider;
61
-	/** @var ISecureRandom */
62
-	private $random;
63
-	/** @var IURLGenerator */
64
-	private $urlGenerator;
65
-	/** @var ClientMapper */
66
-	private $clientMapper;
67
-	/** @var AccessTokenMapper */
68
-	private $accessTokenMapper;
69
-	/** @var ICrypto */
70
-	private $crypto;
51
+    /** @var IUserSession */
52
+    private $userSession;
53
+    /** @var IL10N */
54
+    private $l10n;
55
+    /** @var Defaults */
56
+    private $defaults;
57
+    /** @var ISession */
58
+    private $session;
59
+    /** @var IProvider */
60
+    private $tokenProvider;
61
+    /** @var ISecureRandom */
62
+    private $random;
63
+    /** @var IURLGenerator */
64
+    private $urlGenerator;
65
+    /** @var ClientMapper */
66
+    private $clientMapper;
67
+    /** @var AccessTokenMapper */
68
+    private $accessTokenMapper;
69
+    /** @var ICrypto */
70
+    private $crypto;
71 71
 
72
-	const stateName = 'client.flow.state.token';
72
+    const stateName = 'client.flow.state.token';
73 73
 
74
-	/**
75
-	 * @param string $appName
76
-	 * @param IRequest $request
77
-	 * @param IUserSession $userSession
78
-	 * @param IL10N $l10n
79
-	 * @param Defaults $defaults
80
-	 * @param ISession $session
81
-	 * @param IProvider $tokenProvider
82
-	 * @param ISecureRandom $random
83
-	 * @param IURLGenerator $urlGenerator
84
-	 * @param ClientMapper $clientMapper
85
-	 * @param AccessTokenMapper $accessTokenMapper
86
-	 * @param ICrypto $crypto
87
-	 */
88
-	public function __construct($appName,
89
-								IRequest $request,
90
-								IUserSession $userSession,
91
-								IL10N $l10n,
92
-								Defaults $defaults,
93
-								ISession $session,
94
-								IProvider $tokenProvider,
95
-								ISecureRandom $random,
96
-								IURLGenerator $urlGenerator,
97
-								ClientMapper $clientMapper,
98
-								AccessTokenMapper $accessTokenMapper,
99
-								ICrypto $crypto) {
100
-		parent::__construct($appName, $request);
101
-		$this->userSession = $userSession;
102
-		$this->l10n = $l10n;
103
-		$this->defaults = $defaults;
104
-		$this->session = $session;
105
-		$this->tokenProvider = $tokenProvider;
106
-		$this->random = $random;
107
-		$this->urlGenerator = $urlGenerator;
108
-		$this->clientMapper = $clientMapper;
109
-		$this->accessTokenMapper = $accessTokenMapper;
110
-		$this->crypto = $crypto;
111
-	}
74
+    /**
75
+     * @param string $appName
76
+     * @param IRequest $request
77
+     * @param IUserSession $userSession
78
+     * @param IL10N $l10n
79
+     * @param Defaults $defaults
80
+     * @param ISession $session
81
+     * @param IProvider $tokenProvider
82
+     * @param ISecureRandom $random
83
+     * @param IURLGenerator $urlGenerator
84
+     * @param ClientMapper $clientMapper
85
+     * @param AccessTokenMapper $accessTokenMapper
86
+     * @param ICrypto $crypto
87
+     */
88
+    public function __construct($appName,
89
+                                IRequest $request,
90
+                                IUserSession $userSession,
91
+                                IL10N $l10n,
92
+                                Defaults $defaults,
93
+                                ISession $session,
94
+                                IProvider $tokenProvider,
95
+                                ISecureRandom $random,
96
+                                IURLGenerator $urlGenerator,
97
+                                ClientMapper $clientMapper,
98
+                                AccessTokenMapper $accessTokenMapper,
99
+                                ICrypto $crypto) {
100
+        parent::__construct($appName, $request);
101
+        $this->userSession = $userSession;
102
+        $this->l10n = $l10n;
103
+        $this->defaults = $defaults;
104
+        $this->session = $session;
105
+        $this->tokenProvider = $tokenProvider;
106
+        $this->random = $random;
107
+        $this->urlGenerator = $urlGenerator;
108
+        $this->clientMapper = $clientMapper;
109
+        $this->accessTokenMapper = $accessTokenMapper;
110
+        $this->crypto = $crypto;
111
+    }
112 112
 
113
-	/**
114
-	 * @return string
115
-	 */
116
-	private function getClientName() {
117
-		$userAgent = $this->request->getHeader('USER_AGENT');
118
-		return $userAgent !== null ? $userAgent : 'unknown';
119
-	}
113
+    /**
114
+     * @return string
115
+     */
116
+    private function getClientName() {
117
+        $userAgent = $this->request->getHeader('USER_AGENT');
118
+        return $userAgent !== null ? $userAgent : 'unknown';
119
+    }
120 120
 
121
-	/**
122
-	 * @param string $stateToken
123
-	 * @return bool
124
-	 */
125
-	private function isValidToken($stateToken) {
126
-		$currentToken = $this->session->get(self::stateName);
127
-		if(!is_string($stateToken) || !is_string($currentToken)) {
128
-			return false;
129
-		}
130
-		return hash_equals($currentToken, $stateToken);
131
-	}
121
+    /**
122
+     * @param string $stateToken
123
+     * @return bool
124
+     */
125
+    private function isValidToken($stateToken) {
126
+        $currentToken = $this->session->get(self::stateName);
127
+        if(!is_string($stateToken) || !is_string($currentToken)) {
128
+            return false;
129
+        }
130
+        return hash_equals($currentToken, $stateToken);
131
+    }
132 132
 
133
-	/**
134
-	 * @return TemplateResponse
135
-	 */
136
-	private function stateTokenForbiddenResponse() {
137
-		$response = new TemplateResponse(
138
-			$this->appName,
139
-			'403',
140
-			[
141
-				'file' => $this->l10n->t('State token does not match'),
142
-			],
143
-			'guest'
144
-		);
145
-		$response->setStatus(Http::STATUS_FORBIDDEN);
146
-		return $response;
147
-	}
133
+    /**
134
+     * @return TemplateResponse
135
+     */
136
+    private function stateTokenForbiddenResponse() {
137
+        $response = new TemplateResponse(
138
+            $this->appName,
139
+            '403',
140
+            [
141
+                'file' => $this->l10n->t('State token does not match'),
142
+            ],
143
+            'guest'
144
+        );
145
+        $response->setStatus(Http::STATUS_FORBIDDEN);
146
+        return $response;
147
+    }
148 148
 
149
-	/**
150
-	 * @PublicPage
151
-	 * @NoCSRFRequired
152
-	 * @UseSession
153
-	 *
154
-	 * @param string $clientIdentifier
155
-	 *
156
-	 * @return TemplateResponse
157
-	 */
158
-	public function showAuthPickerPage($clientIdentifier = '') {
159
-		$clientName = $this->getClientName();
160
-		$client = null;
161
-		if($clientIdentifier !== '') {
162
-			$client = $this->clientMapper->getByIdentifier($clientIdentifier);
163
-			$clientName = $client->getName();
164
-		}
149
+    /**
150
+     * @PublicPage
151
+     * @NoCSRFRequired
152
+     * @UseSession
153
+     *
154
+     * @param string $clientIdentifier
155
+     *
156
+     * @return TemplateResponse
157
+     */
158
+    public function showAuthPickerPage($clientIdentifier = '') {
159
+        $clientName = $this->getClientName();
160
+        $client = null;
161
+        if($clientIdentifier !== '') {
162
+            $client = $this->clientMapper->getByIdentifier($clientIdentifier);
163
+            $clientName = $client->getName();
164
+        }
165 165
 
166
-		// No valid clientIdentifier given and no valid API Request (APIRequest header not set)
167
-		$clientRequest = $this->request->getHeader('OCS-APIREQUEST');
168
-		if ($clientRequest !== 'true' && $client === null) {
169
-			return new TemplateResponse(
170
-				$this->appName,
171
-				'error',
172
-				[
173
-					'errors' =>
174
-					[
175
-						[
176
-							'error' => 'Access Forbidden',
177
-							'hint' => 'Invalid request',
178
-						],
179
-					],
180
-				],
181
-				'guest'
182
-			);
183
-		}
166
+        // No valid clientIdentifier given and no valid API Request (APIRequest header not set)
167
+        $clientRequest = $this->request->getHeader('OCS-APIREQUEST');
168
+        if ($clientRequest !== 'true' && $client === null) {
169
+            return new TemplateResponse(
170
+                $this->appName,
171
+                'error',
172
+                [
173
+                    'errors' =>
174
+                    [
175
+                        [
176
+                            'error' => 'Access Forbidden',
177
+                            'hint' => 'Invalid request',
178
+                        ],
179
+                    ],
180
+                ],
181
+                'guest'
182
+            );
183
+        }
184 184
 
185
-		$stateToken = $this->random->generate(
186
-			64,
187
-			ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_DIGITS
188
-		);
189
-		$this->session->set(self::stateName, $stateToken);
185
+        $stateToken = $this->random->generate(
186
+            64,
187
+            ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_DIGITS
188
+        );
189
+        $this->session->set(self::stateName, $stateToken);
190 190
 
191
-		return new TemplateResponse(
192
-			$this->appName,
193
-			'loginflow/authpicker',
194
-			[
195
-				'client' => $clientName,
196
-				'clientIdentifier' => $clientIdentifier,
197
-				'instanceName' => $this->defaults->getName(),
198
-				'urlGenerator' => $this->urlGenerator,
199
-				'stateToken' => $stateToken,
200
-				'serverHost' => $this->request->getServerHost(),
201
-				'oauthState' => $this->session->get('oauth.state'),
202
-			],
203
-			'guest'
204
-		);
205
-	}
191
+        return new TemplateResponse(
192
+            $this->appName,
193
+            'loginflow/authpicker',
194
+            [
195
+                'client' => $clientName,
196
+                'clientIdentifier' => $clientIdentifier,
197
+                'instanceName' => $this->defaults->getName(),
198
+                'urlGenerator' => $this->urlGenerator,
199
+                'stateToken' => $stateToken,
200
+                'serverHost' => $this->request->getServerHost(),
201
+                'oauthState' => $this->session->get('oauth.state'),
202
+            ],
203
+            'guest'
204
+        );
205
+    }
206 206
 
207
-	/**
208
-	 * @NoAdminRequired
209
-	 * @NoCSRFRequired
210
-	 * @NoSameSiteCookieRequired
211
-	 * @UseSession
212
-	 *
213
-	 * @param string $stateToken
214
-	 * @param string $clientIdentifier
215
-	 * @return TemplateResponse
216
-	 */
217
-	public function redirectPage($stateToken = '',
218
-								 $clientIdentifier = '') {
219
-		if(!$this->isValidToken($stateToken)) {
220
-			return $this->stateTokenForbiddenResponse();
221
-		}
207
+    /**
208
+     * @NoAdminRequired
209
+     * @NoCSRFRequired
210
+     * @NoSameSiteCookieRequired
211
+     * @UseSession
212
+     *
213
+     * @param string $stateToken
214
+     * @param string $clientIdentifier
215
+     * @return TemplateResponse
216
+     */
217
+    public function redirectPage($stateToken = '',
218
+                                    $clientIdentifier = '') {
219
+        if(!$this->isValidToken($stateToken)) {
220
+            return $this->stateTokenForbiddenResponse();
221
+        }
222 222
 
223
-		return new TemplateResponse(
224
-			$this->appName,
225
-			'loginflow/redirect',
226
-			[
227
-				'urlGenerator' => $this->urlGenerator,
228
-				'stateToken' => $stateToken,
229
-				'clientIdentifier' => $clientIdentifier,
230
-				'oauthState' => $this->session->get('oauth.state'),
231
-			],
232
-			'guest'
233
-		);
234
-	}
223
+        return new TemplateResponse(
224
+            $this->appName,
225
+            'loginflow/redirect',
226
+            [
227
+                'urlGenerator' => $this->urlGenerator,
228
+                'stateToken' => $stateToken,
229
+                'clientIdentifier' => $clientIdentifier,
230
+                'oauthState' => $this->session->get('oauth.state'),
231
+            ],
232
+            'guest'
233
+        );
234
+    }
235 235
 
236
-	/**
237
-	 * @NoAdminRequired
238
-	 * @UseSession
239
-	 *
240
-	 * @param string $stateToken
241
-	 * @param string $clientIdentifier
242
-	 * @return Http\RedirectResponse|Response
243
-	 */
244
-	public function generateAppPassword($stateToken,
245
-										$clientIdentifier = '') {
246
-		if(!$this->isValidToken($stateToken)) {
247
-			$this->session->remove(self::stateName);
248
-			return $this->stateTokenForbiddenResponse();
249
-		}
236
+    /**
237
+     * @NoAdminRequired
238
+     * @UseSession
239
+     *
240
+     * @param string $stateToken
241
+     * @param string $clientIdentifier
242
+     * @return Http\RedirectResponse|Response
243
+     */
244
+    public function generateAppPassword($stateToken,
245
+                                        $clientIdentifier = '') {
246
+        if(!$this->isValidToken($stateToken)) {
247
+            $this->session->remove(self::stateName);
248
+            return $this->stateTokenForbiddenResponse();
249
+        }
250 250
 
251
-		$this->session->remove(self::stateName);
251
+        $this->session->remove(self::stateName);
252 252
 
253
-		try {
254
-			$sessionId = $this->session->getId();
255
-		} catch (SessionNotAvailableException $ex) {
256
-			$response = new Response();
257
-			$response->setStatus(Http::STATUS_FORBIDDEN);
258
-			return $response;
259
-		}
253
+        try {
254
+            $sessionId = $this->session->getId();
255
+        } catch (SessionNotAvailableException $ex) {
256
+            $response = new Response();
257
+            $response->setStatus(Http::STATUS_FORBIDDEN);
258
+            return $response;
259
+        }
260 260
 
261
-		try {
262
-			$sessionToken = $this->tokenProvider->getToken($sessionId);
263
-			$loginName = $sessionToken->getLoginName();
264
-			try {
265
-				$password = $this->tokenProvider->getPassword($sessionToken, $sessionId);
266
-			} catch (PasswordlessTokenException $ex) {
267
-				$password = null;
268
-			}
269
-		} catch (InvalidTokenException $ex) {
270
-			$response = new Response();
271
-			$response->setStatus(Http::STATUS_FORBIDDEN);
272
-			return $response;
273
-		}
261
+        try {
262
+            $sessionToken = $this->tokenProvider->getToken($sessionId);
263
+            $loginName = $sessionToken->getLoginName();
264
+            try {
265
+                $password = $this->tokenProvider->getPassword($sessionToken, $sessionId);
266
+            } catch (PasswordlessTokenException $ex) {
267
+                $password = null;
268
+            }
269
+        } catch (InvalidTokenException $ex) {
270
+            $response = new Response();
271
+            $response->setStatus(Http::STATUS_FORBIDDEN);
272
+            return $response;
273
+        }
274 274
 
275
-		$clientName = $this->getClientName();
276
-		$client = false;
277
-		if($clientIdentifier !== '') {
278
-			$client = $this->clientMapper->getByIdentifier($clientIdentifier);
279
-			$clientName = $client->getName();
280
-		}
275
+        $clientName = $this->getClientName();
276
+        $client = false;
277
+        if($clientIdentifier !== '') {
278
+            $client = $this->clientMapper->getByIdentifier($clientIdentifier);
279
+            $clientName = $client->getName();
280
+        }
281 281
 
282
-		$token = $this->random->generate(72, ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_DIGITS);
283
-		$uid = $this->userSession->getUser()->getUID();
284
-		$generatedToken = $this->tokenProvider->generateToken(
285
-			$token,
286
-			$uid,
287
-			$loginName,
288
-			$password,
289
-			$clientName,
290
-			IToken::PERMANENT_TOKEN,
291
-			IToken::DO_NOT_REMEMBER
292
-		);
282
+        $token = $this->random->generate(72, ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_DIGITS);
283
+        $uid = $this->userSession->getUser()->getUID();
284
+        $generatedToken = $this->tokenProvider->generateToken(
285
+            $token,
286
+            $uid,
287
+            $loginName,
288
+            $password,
289
+            $clientName,
290
+            IToken::PERMANENT_TOKEN,
291
+            IToken::DO_NOT_REMEMBER
292
+        );
293 293
 
294
-		if($client) {
295
-			$code = $this->random->generate(128, ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_DIGITS);
296
-			$accessToken = new AccessToken();
297
-			$accessToken->setClientId($client->getId());
298
-			$accessToken->setEncryptedToken($this->crypto->encrypt($token, $code));
299
-			$accessToken->setHashedCode(hash('sha512', $code));
300
-			$accessToken->setTokenId($generatedToken->getId());
301
-			$this->accessTokenMapper->insert($accessToken);
294
+        if($client) {
295
+            $code = $this->random->generate(128, ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_DIGITS);
296
+            $accessToken = new AccessToken();
297
+            $accessToken->setClientId($client->getId());
298
+            $accessToken->setEncryptedToken($this->crypto->encrypt($token, $code));
299
+            $accessToken->setHashedCode(hash('sha512', $code));
300
+            $accessToken->setTokenId($generatedToken->getId());
301
+            $this->accessTokenMapper->insert($accessToken);
302 302
 
303
-			$redirectUri = sprintf(
304
-				'%s?state=%s&code=%s',
305
-				$client->getRedirectUri(),
306
-				urlencode($this->session->get('oauth.state')),
307
-				urlencode($code)
308
-			);
309
-			$this->session->remove('oauth.state');
310
-		} else {
311
-			$serverPostfix = '';
303
+            $redirectUri = sprintf(
304
+                '%s?state=%s&code=%s',
305
+                $client->getRedirectUri(),
306
+                urlencode($this->session->get('oauth.state')),
307
+                urlencode($code)
308
+            );
309
+            $this->session->remove('oauth.state');
310
+        } else {
311
+            $serverPostfix = '';
312 312
 
313
-			if (strpos($this->request->getRequestUri(), '/index.php') !== false) {
314
-				$serverPostfix = substr($this->request->getRequestUri(), 0, strpos($this->request->getRequestUri(), '/index.php'));
315
-			} else if (strpos($this->request->getRequestUri(), '/login/flow') !== false) {
316
-				$serverPostfix = substr($this->request->getRequestUri(), 0, strpos($this->request->getRequestUri(), '/login/flow'));
317
-			}
313
+            if (strpos($this->request->getRequestUri(), '/index.php') !== false) {
314
+                $serverPostfix = substr($this->request->getRequestUri(), 0, strpos($this->request->getRequestUri(), '/index.php'));
315
+            } else if (strpos($this->request->getRequestUri(), '/login/flow') !== false) {
316
+                $serverPostfix = substr($this->request->getRequestUri(), 0, strpos($this->request->getRequestUri(), '/login/flow'));
317
+            }
318 318
 
319
-			$protocol = $this->request->getServerProtocol();
319
+            $protocol = $this->request->getServerProtocol();
320 320
 
321
-			if ($protocol !== "https") {
322
-				$xForwardedProto = $this->request->getHeader('X-Forwarded-Proto');
323
-				$xForwardedSSL = $this->request->getHeader('X-Forwarded-Ssl');
324
-				if ($xForwardedProto === 'https' || $xForwardedSSL === 'on') {
325
-					$protocol = 'https';
326
-				}
327
-			}
321
+            if ($protocol !== "https") {
322
+                $xForwardedProto = $this->request->getHeader('X-Forwarded-Proto');
323
+                $xForwardedSSL = $this->request->getHeader('X-Forwarded-Ssl');
324
+                if ($xForwardedProto === 'https' || $xForwardedSSL === 'on') {
325
+                    $protocol = 'https';
326
+                }
327
+            }
328 328
 
329 329
 
330
-			$serverPath = $protocol . "://" . $this->request->getServerHost() . $serverPostfix;
331
-			$redirectUri = 'nc://login/server:' . $serverPath . '&user:' . urlencode($loginName) . '&password:' . urlencode($token);
332
-		}
330
+            $serverPath = $protocol . "://" . $this->request->getServerHost() . $serverPostfix;
331
+            $redirectUri = 'nc://login/server:' . $serverPath . '&user:' . urlencode($loginName) . '&password:' . urlencode($token);
332
+        }
333 333
 
334
-		// Clear the token from the login here
335
-		$this->tokenProvider->invalidateToken($sessionId);
334
+        // Clear the token from the login here
335
+        $this->tokenProvider->invalidateToken($sessionId);
336 336
 
337
-		return new Http\RedirectResponse($redirectUri);
338
-	}
337
+        return new Http\RedirectResponse($redirectUri);
338
+    }
339 339
 }
Please login to merge, or discard this patch.