Development

This commit is contained in:
Matthew Grotke 2026-06-10 22:57:55 -04:00
parent edeb05acf7
commit a886a56982
4 changed files with 142 additions and 108 deletions

View file

@ -1,3 +1,4 @@
import json
import sqlite3
import time
import uuid
@ -30,77 +31,89 @@ class SqliteSessionInterface(SessionInterface):
def open_session(self, app, request):
name = app.config.get('SESSION_COOKIE_NAME', 'session')
sid = request.cookies.get(name)
if sid:
try:
con = self._connect()
row = con.execute(
'''SELECT s.session_id, s.account_id, s.tz_offset_seconds,
s.apply_changes_immediately,
a.email, a.access_level
FROM sessions s
JOIN accounts a ON a.account_id = s.account_id
WHERE s.session_id=?''',
(sid,)
).fetchone()
if not sid:
return SqliteSession(sid=str(uuid.uuid4()), new=True)
try:
con = self._connect()
row = con.execute(
'''SELECT s.session_id, s.account_id, s.tz_offset_seconds,
s.preferences_json, s.flashes_json,
a.email, a.access_level
FROM sessions s
JOIN accounts a ON a.account_id = s.account_id
WHERE s.session_id=?''',
(sid,)
).fetchone()
if row:
prefs = json.loads(row['preferences_json'] or '{}')
flashes = json.loads(row['flashes_json'] or '[]')
data = {
'account_id': str(row['account_id']),
'email_address': str(row['email']),
'access_level': _LEVEL_INT_TO_STR.get(row['access_level'], 'viewer'),
'tz_offset_seconds': int(row['tz_offset_seconds']),
'apply_changes_immediately': bool(prefs.get('apply_changes_immediately', False)),
'_flashes': flashes,
}
con.close()
if row:
data = {
'account_id': str(row['account_id']),
'email_address': str(row['email']),
'access_level': _LEVEL_INT_TO_STR.get(row['access_level'], 'viewer'),
'tz_offset_seconds': int(row['tz_offset_seconds']),
'apply_changes_immediately': bool(row['apply_changes_immediately']),
}
return SqliteSession(data, sid=sid, new=False)
except Exception:
pass
return SqliteSession(sid=str(uuid.uuid4()), new=True)
return SqliteSession(data, sid=sid, new=False)
client = con.execute(
'SELECT flashes_json FROM clients WHERE cookie_unique_token=?', (sid,)
).fetchone()
con.close()
flashes = json.loads(client['flashes_json'] or '[]') if client else []
data = {'_flashes': flashes} if flashes else {}
return SqliteSession(data, sid=sid, new=False)
except Exception:
pass
return SqliteSession(sid=sid, new=False)
def save_session(self, app, session, response):
name = app.config.get('SESSION_COOKIE_NAME', 'session')
domain = self.get_cookie_domain(app)
path = self.get_cookie_path(app)
if not session:
if not session.new:
try:
con = self._connect()
con.execute('DELETE FROM sessions WHERE session_id=?', (session.sid,))
con.commit()
con.close()
except Exception:
pass
if not session and session.modified and not session.new:
try:
con = self._connect()
con.execute('DELETE FROM sessions WHERE session_id=?', (session.sid,))
con.commit()
con.close()
except Exception:
pass
response.delete_cookie(name, domain=domain, path=path)
return
account_id = session.get('account_id')
if not account_id:
return
now = int(time.time())
tz_offset = int(session.get('tz_offset_seconds', 0))
apply_changes = 1 if session.get('apply_changes_immediately') else 0
account_id = session.get('account_id')
flashes_json = json.dumps(session.get('_flashes', []))
now = int(time.time())
try:
con = self._connect()
if session.new:
if account_id:
prefs = json.dumps({'apply_changes_immediately': bool(session.get('apply_changes_immediately', False))})
tz_offset = int(session.get('tz_offset_seconds', 0))
con.execute('INSERT OR IGNORE INTO clients (cookie_unique_token) VALUES (?)', (session.sid,))
con.execute(
'''INSERT INTO sessions
(session_id, account_id, tz_offset_seconds, apply_changes_immediately,
session_started_ts, last_seen_ts)
VALUES (?,?,?,?,?,?)''',
(session.sid, account_id, tz_offset, apply_changes, now, now)
)
elif session.modified:
con.execute(
'''UPDATE sessions SET tz_offset_seconds=?, apply_changes_immediately=?,
last_seen_ts=? WHERE session_id=?''',
(tz_offset, apply_changes, now, session.sid)
(session_id, account_id, tz_offset_seconds, preferences_json,
flashes_json, session_started_ts, last_seen_ts)
VALUES (?,?,?,?,?,?,?)
ON CONFLICT(session_id) DO UPDATE SET
account_id=excluded.account_id,
tz_offset_seconds=excluded.tz_offset_seconds,
preferences_json=excluded.preferences_json,
flashes_json=excluded.flashes_json,
last_seen_ts=excluded.last_seen_ts''',
(session.sid, account_id, tz_offset, prefs, flashes_json, now, now)
)
else:
con.execute(
'UPDATE sessions SET last_seen_ts=? WHERE session_id=?',
(now, session.sid)
'''INSERT INTO clients (cookie_unique_token, flashes_json)
VALUES (?,?)
ON CONFLICT(cookie_unique_token) DO UPDATE SET
flashes_json=excluded.flashes_json''',
(session.sid, flashes_json)
)
con.commit()
con.close()