diff --git a/pagure/__init__.py b/pagure/__init__.py index 32f4b41..16cbd64 100644 --- a/pagure/__init__.py +++ b/pagure/__init__.py @@ -144,6 +144,16 @@ def authenticated(): return hasattr(flask.g, 'fas_user') and flask.g.fas_user is not None +def logout(): + auth = APP.config.get('PAGURE_AUTH', None) + if auth in ['fas', 'openid']: + if hasattr(flask.g, 'fas_user') and flask.g.fas_user is not None: + FAS.logout() + elif auth == 'local': + import pagure.ui.login as login + login.logout() + + def api_authenticated(): ''' Utility function checking if the current user is logged in or not in the API. @@ -171,7 +181,7 @@ def admin_session_timedout(): APP.config.get('ADMIN_SESSION_LIFETIME', datetime.timedelta(minutes=15)): timedout = True - FAS.logout() + logout() return timedout @@ -345,13 +355,8 @@ def auth_logout(): # pragma: no cover if not authenticated(): return flask.redirect(return_point) - if APP.config.get('PAGURE_AUTH', None) in ['fas', 'openid']: - if hasattr(flask.g, 'fas_user') and flask.g.fas_user is not None: - FAS.logout() - flask.flash("You are no longer logged-in") - elif APP.config.get('PAGURE_AUTH', None) == 'local': - import pagure.ui.login as login - login.logout() + logout() + flask.flash("You have been logged out") flask.session['_justloggedout'] = True return flask.redirect(return_point) diff --git a/pagure/ui/login.py b/pagure/ui/login.py index 7a3a00f..54f5db1 100644 --- a/pagure/ui/login.py +++ b/pagure/ui/login.py @@ -409,8 +409,6 @@ def logout(): flask.g.fas_session_id = None flask.g.fas_user = None - flask.flash('You have been logged out') - def _check_session_cookie(): """ Set the user into flask.g if the user is logged in. diff --git a/tests/test_pagure_flask_ui_login.py b/tests/test_pagure_flask_ui_login.py index de880cf..b2b0c89 100644 --- a/tests/test_pagure_flask_ui_login.py +++ b/tests/test_pagure_flask_ui_login.py @@ -27,7 +27,6 @@ from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) - import pagure.lib import tests from pagure.lib.repo import PagureRepo @@ -548,6 +547,45 @@ class PagureFlaskLogintests(tests.Modeltests): 'log out', output.data) + def test_settings_admin_session_timedout(self): + """ Test the admin_session_timedout with settings endpoint. """ + lifetime = pagure.APP.config.get('ADMIN_SESSION_LIFETIME', + datetime.timedelta(minutes=15)) + td1 = datetime.timedelta(minutes=1) + # session already expired + user = tests.FakeUser(username='foo') + user.login_time = datetime.datetime.now() - lifetime - td1 + with tests.user_set(pagure.APP, user): + # not following the redirect because user_set contextmanager + # will run again for the login page and set back the user + # which results in a loop, since admin_session_timedout will + # redirect again for the login page + output = self.app.get('/settings/') + self.assertEqual(output.status_code, 302) + self.assertIn('http://localhost/login/', output.location) + # session did not expire + user.login_time = datetime.datetime.now() - lifetime + td1 + with tests.user_set(pagure.APP, user): + output = self.app.get('/settings/') + self.assertEqual(output.status_code, 200) + + @patch('flask.flash') + @patch('flask.g') + def test_admin_session_timedout(self, g, flash): + """ Test the call to admin_session_timedout. """ + lifetime = pagure.APP.config.get('ADMIN_SESSION_LIFETIME', + datetime.timedelta(minutes=15)) + td1 = datetime.timedelta(minutes=1) + # session already expired + user = tests.FakeUser(username='foo') + user.login_time = datetime.datetime.now() - lifetime - td1 + g.fas_user = user + self.assertTrue(pagure.admin_session_timedout()) + # session did not expire + user.login_time = datetime.datetime.now() - lifetime + td1 + g.fas_user = user + self.assertFalse(pagure.admin_session_timedout()) + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskLogintests)