diff --git a/app.py b/app.py index f0a3c0e6637cfa67047690a1d352a99cfaae10d9..ebce794600f65297a02ac74483522c83d46b5a5f 100644 --- a/app.py +++ b/app.py @@ -31,12 +31,10 @@ def create_app(test_config=None): user_groups = session['user_groups'] except (KeyError, OverflowError): session.clear() - session['cookies_enabled'] = True abort(401) if datetime.datetime.now() - timestamp > datetime.timedelta(days=2) or \ client_id != request.headers['X-CLIENT-ID']: session.clear() - session['cookies_enabled'] = True abort(401) resp = Response('Ok', 200) resp.headers['OAUTH-USER-ID'] = user_id @@ -51,14 +49,18 @@ def create_app(test_config=None): return OAuth2Session(request.headers['X-CLIENT-ID'], redirect_uri=request.headers['X-REDIRECT-URI'], **kwargs) - @app.route('/login') - def login(): - # The cookies_enabled check prevents redirect loops: - # login (sets state) -> idp_authorize -> callback (no state set) -> login + @app.route('/cookiecheck') + def login_cookiecheck(): + print(session) if not session.get('cookies_enabled'): session.clear() session['cookies_enabled'] = True abort(400, description='Enable cookies and reload two times to continue') + session.clear() + return redirect(url_for('login', url=request.values.get('url', '/'))) + + @app.route('/login') + def login(): client = get_oauth() url, state = client.authorization_url(app.config['OAUTH2_AUTH_URL']) session.clear() @@ -76,7 +78,8 @@ def create_app(test_config=None): if 'state' not in session: session.clear() session['cookies_enabled'] = True - return redirect(url_for('login', url=redirect_url)) + # Redirect to login_cookiecheck to prevent redirect loop when cookies are disabled + return redirect(url_for('login_cookiecheck', url=redirect_url)) state = session['state'] client = get_oauth(state=state) diff --git a/test_app.py b/test_app.py index 08561f015d2da326ac545810185eccf0567c3058..506568f08fcf228fb0a74adf41a8bd0e7cc4b0f6 100644 --- a/test_app.py +++ b/test_app.py @@ -78,12 +78,8 @@ class TestCases(unittest.TestCase): def test_auth_no_session(self): r = self.client.get(path='/auth', headers=headers) self.assertEqual(r.status_code, 401) - with self.client.session_transaction() as session: - self.assertEqual(session['cookies_enabled'], True) def test_login(self): - with self.client.session_transaction() as session: - session['cookies_enabled'] = True r = self.client.get(path='/login', query_string={'url': 'https://127.0.0.123:7654/app'}, headers=headers, follow_redirects=False) self.assertEqual(r.status_code, 302) url = urllib.parse.urlparse(r.location) @@ -99,10 +95,6 @@ class TestCases(unittest.TestCase): self.assertEqual(session['state'], qs['state'][0]) self.assertEqual(session['url'], 'https://127.0.0.123:7654/app') - def test_login_no_cookies(self): - r = self.client.get(path='/login', query_string={'url': 'https://127.0.0.123:7654/app'}, headers=headers, follow_redirects=False) - self.assertEqual(r.status_code, 400) - def test_callback(self): code = 'testcode' state = 'teststate' @@ -130,7 +122,21 @@ class TestCases(unittest.TestCase): r = self.client.get(path='/callback', headers=headers, query_string={'code': code, 'state': state}, follow_redirects=False) self.assertEqual(r.status_code, 302) url = urllib.parse.urlparse(r.location) + self.assertEqual(url.path, '/cookiecheck') + with self.client.session_transaction() as session: + self.assertEqual(session['cookies_enabled'], True) + + def test_cookiecheck(self): + with self.client.session_transaction() as session: + session['cookies_enabled'] = True + r = self.client.get(path='/cookiecheck', headers=headers, follow_redirects=False) + self.assertEqual(r.status_code, 302) + url = urllib.parse.urlparse(r.location) self.assertEqual(url.path, '/login') + + def test_cookiecheck_no_session(self): + r = self.client.get(path='/cookiecheck', headers=headers, follow_redirects=False) + self.assertEqual(r.status_code, 400) with self.client.session_transaction() as session: self.assertEqual(session['cookies_enabled'], True)