diff --git a/core/admin/mailu/utils.py b/core/admin/mailu/utils.py index 852fe8ad..9394c38f 100644 --- a/core/admin/mailu/utils.py +++ b/core/admin/mailu/utils.py @@ -1,6 +1,8 @@ """ Mailu admin app utilities """ +from datetime import datetime + from mailu import limiter import flask @@ -22,6 +24,7 @@ login.login_view = "ui.login" @login.unauthorized_handler def handle_needs_login(): + """ redirect unauthorized requests to login page """ return flask.redirect( flask.url_for('ui.login', next=flask.request.endpoint) ) @@ -34,7 +37,8 @@ babel = flask_babel.Babel() @babel.localeselector def get_locale(): - translations = list(map(str, babel.list_translations())) + """ selects locale for translation """ + translations = [str(translation) for translation in babel.list_translations()] return flask.request.accept_languages.best_match(translations) @@ -101,6 +105,32 @@ class KVSessionExt(flask_kvsession.KVSessionExtension): else: self.default_kvstore = DictStore() + def cleanup_sessions(self, app=None, dkey=None, dvalue=None): + """ Remove sessions from the store. """ + if not app: + app = flask.current_app + if dkey is None and dvalue is None: + now = datetime.utcnow() + for key in app.kvsession_store.keys(): + try: + sid = flask_kvsession.SessionID.unserialize(key) + except ValueError: + pass + else: + if sid.has_expired( + app.config['PERMANENT_SESSION_LIFETIME'], + now + ): + app.kvsession_store.delete(key) + elif dkey is not None and dvalue is not None: + for key in app.kvsession_store.keys(): + if app.session_interface.serialization_method.loads( + app.kvsession_store.get(key) + ).get(dkey, None) == dvalue: + app.kvsession_store.delete(key) + else: + raise ValueError('Need dkey and dvalue.') + def init_app(self, app, session_kvstore=None): """ Initialize application and KVSession. """ super().init_app(app, session_kvstore)