114 lines
3.1 KiB
Python
114 lines
3.1 KiB
Python
# -*- coding:utf-8 -*-
|
|
"""
|
|
@Author : xuxingchen
|
|
@Contact : xuxingchen@sinochem.com
|
|
@Desc : 记录一些会话数据
|
|
"""
|
|
import time
|
|
|
|
from utils.database import BaseTable
|
|
|
|
|
|
class SessionsTable(BaseTable):
|
|
@staticmethod
|
|
def check(table_handler: BaseTable):
|
|
"""检测是否存在当前表"""
|
|
table_handler.query("SELECT name FROM sqlite_master WHERE type='table' AND name='sessions'")
|
|
if table_handler.cursor.fetchone() is None:
|
|
table_handler.execute(
|
|
f"""
|
|
CREATE TABLE sessions (
|
|
session_id TEXT,
|
|
username TEXT,
|
|
token TEXT,
|
|
captcha TEXT,
|
|
last_timestamp TEXT,
|
|
PRIMARY KEY (session_id)
|
|
)
|
|
"""
|
|
)
|
|
table_handler.execute(
|
|
f"""
|
|
CREATE INDEX idx_sessions_token ON sessions(token);
|
|
"""
|
|
)
|
|
# 去除冗余的验证会话信息
|
|
table_handler.execute(
|
|
f"""
|
|
DELETE FROM sessions WHERE last_timestamp < {int(time.time() * 1000) - 3 * 24 * 60 * 60 * 1000}
|
|
"""
|
|
)
|
|
|
|
@staticmethod
|
|
def get_captcha(table_handler: BaseTable, session_id: str):
|
|
table_handler.query(
|
|
"""
|
|
SELECT captcha
|
|
FROM sessions
|
|
WHERE session_id = ?
|
|
""",
|
|
(session_id,),
|
|
)
|
|
res = table_handler.cursor.fetchall()
|
|
if res:
|
|
return res[0][0]
|
|
else:
|
|
return None
|
|
|
|
@staticmethod
|
|
def insert(table_handler: BaseTable, session_id, captcha):
|
|
timestamp = str(int(time.time() * 1000))
|
|
table_handler.execute(
|
|
"""
|
|
INSERT INTO sessions
|
|
(session_id, captcha, last_timestamp)
|
|
VALUES (?, ?, ?)
|
|
ON CONFLICT (session_id)
|
|
DO UPDATE SET captcha=?, last_timestamp=?
|
|
""",
|
|
(
|
|
session_id,
|
|
captcha,
|
|
timestamp,
|
|
captcha,
|
|
timestamp,
|
|
),
|
|
)
|
|
return True
|
|
|
|
@staticmethod
|
|
def update(table_handler: BaseTable, session_id: str, username: str, token: str):
|
|
timestamp = str(int(time.time() * 1000))
|
|
table_handler.execute(
|
|
"""
|
|
UPDATE sessions SET
|
|
username=?,
|
|
token=?,
|
|
last_timestamp=?
|
|
WHERE session_id=?
|
|
""",
|
|
(
|
|
username,
|
|
token,
|
|
timestamp,
|
|
session_id
|
|
),
|
|
)
|
|
return True
|
|
|
|
@staticmethod
|
|
def check_token(table_handler: BaseTable, timestamp: str, token: str):
|
|
table_handler.query(
|
|
"""
|
|
SELECT captcha
|
|
FROM sessions
|
|
WHERE last_timestamp > ? and token = ?
|
|
""",
|
|
(timestamp, token),
|
|
)
|
|
res = table_handler.cursor.fetchall()
|
|
if res:
|
|
return True
|
|
else:
|
|
return False
|