Completed
Pull Request — master (#4588)
by Lukas
12:44
created
core/Controller/ClientFlowLoginController.php 2 patches
Indentation   +195 added lines, -195 removed lines patch added patch discarded remove patch
@@ -39,200 +39,200 @@
 block discarded – undo
39 39
 use OCP\Session\Exceptions\SessionNotAvailableException;
40 40
 
41 41
 class ClientFlowLoginController extends Controller {
42
-	/** @var IUserSession */
43
-	private $userSession;
44
-	/** @var IL10N */
45
-	private $l10n;
46
-	/** @var Defaults */
47
-	private $defaults;
48
-	/** @var ISession */
49
-	private $session;
50
-	/** @var IProvider */
51
-	private $tokenProvider;
52
-	/** @var ISecureRandom */
53
-	private $random;
54
-	/** @var IURLGenerator */
55
-	private $urlGenerator;
56
-
57
-	const stateName = 'client.flow.state.token';
58
-
59
-	/**
60
-	 * @param string $appName
61
-	 * @param IRequest $request
62
-	 * @param IUserSession $userSession
63
-	 * @param IL10N $l10n
64
-	 * @param Defaults $defaults
65
-	 * @param ISession $session
66
-	 * @param IProvider $tokenProvider
67
-	 * @param ISecureRandom $random
68
-	 * @param IURLGenerator $urlGenerator
69
-	 */
70
-	public function __construct($appName,
71
-								IRequest $request,
72
-								IUserSession $userSession,
73
-								IL10N $l10n,
74
-								Defaults $defaults,
75
-								ISession $session,
76
-								IProvider $tokenProvider,
77
-								ISecureRandom $random,
78
-								IURLGenerator $urlGenerator) {
79
-		parent::__construct($appName, $request);
80
-		$this->userSession = $userSession;
81
-		$this->l10n = $l10n;
82
-		$this->defaults = $defaults;
83
-		$this->session = $session;
84
-		$this->tokenProvider = $tokenProvider;
85
-		$this->random = $random;
86
-		$this->urlGenerator = $urlGenerator;
87
-	}
88
-
89
-	/**
90
-	 * @return string
91
-	 */
92
-	private function getClientName() {
93
-		return $this->request->getHeader('USER_AGENT') !== null ? $this->request->getHeader('USER_AGENT') : 'unknown';
94
-	}
95
-
96
-	/**
97
-	 * @param string $stateToken
98
-	 * @return bool
99
-	 */
100
-	private function isValidToken($stateToken) {
101
-		$currentToken = $this->session->get(self::stateName);
102
-		if(!is_string($stateToken) || !is_string($currentToken)) {
103
-			return false;
104
-		}
105
-		return hash_equals($currentToken, $stateToken);
106
-	}
107
-
108
-	/**
109
-	 * @return TemplateResponse
110
-	 */
111
-	private function stateTokenForbiddenResponse() {
112
-		$response = new TemplateResponse(
113
-			$this->appName,
114
-			'403',
115
-			[
116
-				'file' => $this->l10n->t('State token does not match'),
117
-			],
118
-			'guest'
119
-		);
120
-		$response->setStatus(Http::STATUS_FORBIDDEN);
121
-		return $response;
122
-	}
123
-
124
-	/**
125
-	 * @PublicPage
126
-	 * @NoCSRFRequired
127
-	 * @UseSession
128
-	 *
129
-	 * @return TemplateResponse
130
-	 */
131
-	public function showAuthPickerPage() {
132
-		if($this->userSession->isLoggedIn()) {
133
-			return new TemplateResponse(
134
-				$this->appName,
135
-				'403',
136
-				[
137
-					'file' => $this->l10n->t('Auth flow can only be started unauthenticated.'),
138
-				],
139
-				'guest'
140
-			);
141
-		}
142
-
143
-		$stateToken = $this->random->generate(
144
-			64,
145
-			ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_DIGITS
146
-		);
147
-		$this->session->set(self::stateName, $stateToken);
148
-
149
-		return new TemplateResponse(
150
-			$this->appName,
151
-			'loginflow/authpicker',
152
-			[
153
-				'client' => $this->getClientName(),
154
-				'instanceName' => $this->defaults->getName(),
155
-				'urlGenerator' => $this->urlGenerator,
156
-				'stateToken' => $stateToken,
157
-				'serverHost' => $this->request->getServerHost(),
158
-			],
159
-			'guest'
160
-		);
161
-	}
162
-
163
-	/**
164
-	 * @NoAdminRequired
165
-	 * @NoCSRFRequired
166
-	 * @UseSession
167
-	 *
168
-	 * @param string $stateToken
169
-	 * @return TemplateResponse
170
-	 */
171
-	public function redirectPage($stateToken = '') {
172
-		if(!$this->isValidToken($stateToken)) {
173
-			return $this->stateTokenForbiddenResponse();
174
-		}
175
-
176
-		return new TemplateResponse(
177
-			$this->appName,
178
-			'loginflow/redirect',
179
-			[
180
-				'urlGenerator' => $this->urlGenerator,
181
-				'stateToken' => $stateToken,
182
-			],
183
-			'empty'
184
-		);
185
-	}
186
-
187
-	/**
188
-	 * @NoAdminRequired
189
-	 * @UseSession
190
-	 *
191
-	 * @param string $stateToken
192
-	 * @return Http\RedirectResponse|Response
193
-	 */
194
-	public function generateAppPassword($stateToken) {
195
-		if(!$this->isValidToken($stateToken)) {
196
-			$this->session->remove(self::stateName);
197
-			return $this->stateTokenForbiddenResponse();
198
-		}
199
-
200
-		$this->session->remove(self::stateName);
201
-
202
-		try {
203
-			$sessionId = $this->session->getId();
204
-		} catch (SessionNotAvailableException $ex) {
205
-			$response = new Response();
206
-			$response->setStatus(Http::STATUS_FORBIDDEN);
207
-			return $response;
208
-		}
209
-
210
-		try {
211
-			$sessionToken = $this->tokenProvider->getToken($sessionId);
212
-			$loginName = $sessionToken->getLoginName();
213
-			try {
214
-				$password = $this->tokenProvider->getPassword($sessionToken, $sessionId);
215
-			} catch (PasswordlessTokenException $ex) {
216
-				$password = null;
217
-			}
218
-		} catch (InvalidTokenException $ex) {
219
-			$response = new Response();
220
-			$response->setStatus(Http::STATUS_FORBIDDEN);
221
-			return $response;
222
-		}
223
-
224
-		$token = $this->random->generate(72);
225
-		$this->tokenProvider->generateToken(
226
-			$token,
227
-			$this->userSession->getUser()->getUID(),
228
-			$loginName,
229
-			$password,
230
-			$this->getClientName(),
231
-			IToken::PERMANENT_TOKEN,
232
-			IToken::DO_NOT_REMEMBER
233
-		);
234
-
235
-		return new Http\RedirectResponse('nc://login/server:' . $this->request->getServerHost() . '&user:' . urlencode($loginName) . '&password:' . urlencode($token));
236
-	}
42
+    /** @var IUserSession */
43
+    private $userSession;
44
+    /** @var IL10N */
45
+    private $l10n;
46
+    /** @var Defaults */
47
+    private $defaults;
48
+    /** @var ISession */
49
+    private $session;
50
+    /** @var IProvider */
51
+    private $tokenProvider;
52
+    /** @var ISecureRandom */
53
+    private $random;
54
+    /** @var IURLGenerator */
55
+    private $urlGenerator;
56
+
57
+    const stateName = 'client.flow.state.token';
58
+
59
+    /**
60
+     * @param string $appName
61
+     * @param IRequest $request
62
+     * @param IUserSession $userSession
63
+     * @param IL10N $l10n
64
+     * @param Defaults $defaults
65
+     * @param ISession $session
66
+     * @param IProvider $tokenProvider
67
+     * @param ISecureRandom $random
68
+     * @param IURLGenerator $urlGenerator
69
+     */
70
+    public function __construct($appName,
71
+                                IRequest $request,
72
+                                IUserSession $userSession,
73
+                                IL10N $l10n,
74
+                                Defaults $defaults,
75
+                                ISession $session,
76
+                                IProvider $tokenProvider,
77
+                                ISecureRandom $random,
78
+                                IURLGenerator $urlGenerator) {
79
+        parent::__construct($appName, $request);
80
+        $this->userSession = $userSession;
81
+        $this->l10n = $l10n;
82
+        $this->defaults = $defaults;
83
+        $this->session = $session;
84
+        $this->tokenProvider = $tokenProvider;
85
+        $this->random = $random;
86
+        $this->urlGenerator = $urlGenerator;
87
+    }
88
+
89
+    /**
90
+     * @return string
91
+     */
92
+    private function getClientName() {
93
+        return $this->request->getHeader('USER_AGENT') !== null ? $this->request->getHeader('USER_AGENT') : 'unknown';
94
+    }
95
+
96
+    /**
97
+     * @param string $stateToken
98
+     * @return bool
99
+     */
100
+    private function isValidToken($stateToken) {
101
+        $currentToken = $this->session->get(self::stateName);
102
+        if(!is_string($stateToken) || !is_string($currentToken)) {
103
+            return false;
104
+        }
105
+        return hash_equals($currentToken, $stateToken);
106
+    }
107
+
108
+    /**
109
+     * @return TemplateResponse
110
+     */
111
+    private function stateTokenForbiddenResponse() {
112
+        $response = new TemplateResponse(
113
+            $this->appName,
114
+            '403',
115
+            [
116
+                'file' => $this->l10n->t('State token does not match'),
117
+            ],
118
+            'guest'
119
+        );
120
+        $response->setStatus(Http::STATUS_FORBIDDEN);
121
+        return $response;
122
+    }
123
+
124
+    /**
125
+     * @PublicPage
126
+     * @NoCSRFRequired
127
+     * @UseSession
128
+     *
129
+     * @return TemplateResponse
130
+     */
131
+    public function showAuthPickerPage() {
132
+        if($this->userSession->isLoggedIn()) {
133
+            return new TemplateResponse(
134
+                $this->appName,
135
+                '403',
136
+                [
137
+                    'file' => $this->l10n->t('Auth flow can only be started unauthenticated.'),
138
+                ],
139
+                'guest'
140
+            );
141
+        }
142
+
143
+        $stateToken = $this->random->generate(
144
+            64,
145
+            ISecureRandom::CHAR_LOWER.ISecureRandom::CHAR_UPPER.ISecureRandom::CHAR_DIGITS
146
+        );
147
+        $this->session->set(self::stateName, $stateToken);
148
+
149
+        return new TemplateResponse(
150
+            $this->appName,
151
+            'loginflow/authpicker',
152
+            [
153
+                'client' => $this->getClientName(),
154
+                'instanceName' => $this->defaults->getName(),
155
+                'urlGenerator' => $this->urlGenerator,
156
+                'stateToken' => $stateToken,
157
+                'serverHost' => $this->request->getServerHost(),
158
+            ],
159
+            'guest'
160
+        );
161
+    }
162
+
163
+    /**
164
+     * @NoAdminRequired
165
+     * @NoCSRFRequired
166
+     * @UseSession
167
+     *
168
+     * @param string $stateToken
169
+     * @return TemplateResponse
170
+     */
171
+    public function redirectPage($stateToken = '') {
172
+        if(!$this->isValidToken($stateToken)) {
173
+            return $this->stateTokenForbiddenResponse();
174
+        }
175
+
176
+        return new TemplateResponse(
177
+            $this->appName,
178
+            'loginflow/redirect',
179
+            [
180
+                'urlGenerator' => $this->urlGenerator,
181
+                'stateToken' => $stateToken,
182
+            ],
183
+            'empty'
184
+        );
185
+    }
186
+
187
+    /**
188
+     * @NoAdminRequired
189
+     * @UseSession
190
+     *
191
+     * @param string $stateToken
192
+     * @return Http\RedirectResponse|Response
193
+     */
194
+    public function generateAppPassword($stateToken) {
195
+        if(!$this->isValidToken($stateToken)) {
196
+            $this->session->remove(self::stateName);
197
+            return $this->stateTokenForbiddenResponse();
198
+        }
199
+
200
+        $this->session->remove(self::stateName);
201
+
202
+        try {
203
+            $sessionId = $this->session->getId();
204
+        } catch (SessionNotAvailableException $ex) {
205
+            $response = new Response();
206
+            $response->setStatus(Http::STATUS_FORBIDDEN);
207
+            return $response;
208
+        }
209
+
210
+        try {
211
+            $sessionToken = $this->tokenProvider->getToken($sessionId);
212
+            $loginName = $sessionToken->getLoginName();
213
+            try {
214
+                $password = $this->tokenProvider->getPassword($sessionToken, $sessionId);
215
+            } catch (PasswordlessTokenException $ex) {
216
+                $password = null;
217
+            }
218
+        } catch (InvalidTokenException $ex) {
219
+            $response = new Response();
220
+            $response->setStatus(Http::STATUS_FORBIDDEN);
221
+            return $response;
222
+        }
223
+
224
+        $token = $this->random->generate(72);
225
+        $this->tokenProvider->generateToken(
226
+            $token,
227
+            $this->userSession->getUser()->getUID(),
228
+            $loginName,
229
+            $password,
230
+            $this->getClientName(),
231
+            IToken::PERMANENT_TOKEN,
232
+            IToken::DO_NOT_REMEMBER
233
+        );
234
+
235
+        return new Http\RedirectResponse('nc://login/server:' . $this->request->getServerHost() . '&user:' . urlencode($loginName) . '&password:' . urlencode($token));
236
+    }
237 237
 
238 238
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -99,7 +99,7 @@  discard block
 block discarded – undo
99 99
 	 */
100 100
 	private function isValidToken($stateToken) {
101 101
 		$currentToken = $this->session->get(self::stateName);
102
-		if(!is_string($stateToken) || !is_string($currentToken)) {
102
+		if (!is_string($stateToken) || !is_string($currentToken)) {
103 103
 			return false;
104 104
 		}
105 105
 		return hash_equals($currentToken, $stateToken);
@@ -129,7 +129,7 @@  discard block
 block discarded – undo
129 129
 	 * @return TemplateResponse
130 130
 	 */
131 131
 	public function showAuthPickerPage() {
132
-		if($this->userSession->isLoggedIn()) {
132
+		if ($this->userSession->isLoggedIn()) {
133 133
 			return new TemplateResponse(
134 134
 				$this->appName,
135 135
 				'403',
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 	 * @return TemplateResponse
170 170
 	 */
171 171
 	public function redirectPage($stateToken = '') {
172
-		if(!$this->isValidToken($stateToken)) {
172
+		if (!$this->isValidToken($stateToken)) {
173 173
 			return $this->stateTokenForbiddenResponse();
174 174
 		}
175 175
 
@@ -192,7 +192,7 @@  discard block
 block discarded – undo
192 192
 	 * @return Http\RedirectResponse|Response
193 193
 	 */
194 194
 	public function generateAppPassword($stateToken) {
195
-		if(!$this->isValidToken($stateToken)) {
195
+		if (!$this->isValidToken($stateToken)) {
196 196
 			$this->session->remove(self::stateName);
197 197
 			return $this->stateTokenForbiddenResponse();
198 198
 		}
@@ -232,7 +232,7 @@  discard block
 block discarded – undo
232 232
 			IToken::DO_NOT_REMEMBER
233 233
 		);
234 234
 
235
-		return new Http\RedirectResponse('nc://login/server:' . $this->request->getServerHost() . '&user:' . urlencode($loginName) . '&password:' . urlencode($token));
235
+		return new Http\RedirectResponse('nc://login/server:'.$this->request->getServerHost().'&user:'.urlencode($loginName).'&password:'.urlencode($token));
236 236
 	}
237 237
 
238 238
 }
Please login to merge, or discard this patch.