| @@ -4,7 +4,7 @@ from datetime import datetime | |||
| import random | |||
| import sqlite3 | |||
| from flask import g | |||
| from flask import current_app, g | |||
| from werkzeug.local import LocalProxy | |||
| __all__ = ["Database"] | |||
| @@ -62,6 +62,9 @@ class Database: | |||
| period of time, or if their absolute age exceeds some number. We don't | |||
| actually remove them until a bit after this time. | |||
| """ | |||
| if current_app.debug: | |||
| return # Sessions don't expire in debug mode | |||
| query = """DELETE FROM session WHERE | |||
| strftime("%s", "now") - strftime("%s", session_created) >= {} OR | |||
| strftime("%s", "now") - strftime("%s", session_touched) >= {}""" | |||
| @@ -71,6 +74,22 @@ class Database: | |||
| with self._conn as conn: | |||
| conn.execute(query.format(create_thresh, touch_thresh)) | |||
| def _build_expiry_check(self): | |||
| """Build and return a snippet of SQL to check for valid sessions. | |||
| The SQL should be inserted in a WHERE clause. If debug mode is active, | |||
| we just return an empty string. | |||
| """ | |||
| if current_app.debug: | |||
| return "" | |||
| check = """ AND | |||
| strftime("%s", "now") - | |||
| strftime("%s", session_created) < {} AND | |||
| strftime("%s", "now") - | |||
| strftime("%s", session_touched) < {}""" | |||
| return check.format(self.MAX_SESSION_AGE, self.MAX_SESSION_STALENESS) | |||
| def new_session(self): | |||
| """Allocate a new session in the database. | |||
| @@ -94,11 +113,7 @@ class Database: | |||
| self._clear_old_sessions() | |||
| query = """SELECT session_created FROM session | |||
| WHERE session_id = ? AND | |||
| strftime("%s", "now") - strftime("%s", session_created) < {} AND | |||
| strftime("%s", "now") - strftime("%s", session_touched) < {}""" | |||
| query = query.format(self.MAX_SESSION_AGE, self.MAX_SESSION_STALENESS) | |||
| WHERE session_id = ?""" + self._build_expiry_check() | |||
| res = self._conn.execute(query, (sid,)).fetchall() | |||
| if not res: | |||
| return None | |||
| @@ -107,11 +122,7 @@ class Database: | |||
| def read_session(self, sid): | |||
| """Return the character associated with the given session, or None.""" | |||
| query = """SELECT session_character FROM session | |||
| WHERE session_id = ? AND | |||
| strftime("%s", "now") - strftime("%s", session_created) < {} AND | |||
| strftime("%s", "now") - strftime("%s", session_touched) < {}""" | |||
| query = query.format(self.MAX_SESSION_AGE, self.MAX_SESSION_STALENESS) | |||
| WHERE session_id = ?""" + self._build_expiry_check() | |||
| res = self._conn.execute(query, (sid,)).fetchall() | |||
| return res[0][0] if res else None | |||