Files
live-hub-py/web/backend/database.py
T
yml2213 db384701a9 fix(security): JWT密钥与默认账号改用环境变量,清理泄露凭据
- JWT_SECRET_KEY 改从环境变量读取,未设置时使用临时随机密钥并告警
- 默认管理员账号密码改用 ADMIN_USERNAME/ADMIN_PASSWORD 环境变量配置
- 移除登录页及启动/部署脚本中的默认密码明文提示
- docker-compose.yml 添加环境变量支持(从 .env 文件读取)
- 新增 .env.example 配置文档,.gitignore 添加 .env 规则
- git rm --cached 清理已追踪的 data/accounts.json 和 data/cookies/敏感文件
2026-06-23 06:42:37 +08:00

98 lines
3.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""数据库引擎与会话管理"""
import os
from pathlib import Path
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
DB_PATH = Path(__file__).parent.parent.parent / "data" / "web.db"
DB_PATH.parent.mkdir(parents=True, exist_ok=True)
engine = create_engine(
f"sqlite:///{DB_PATH}",
connect_args={"check_same_thread": False},
echo=False,
)
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
Base = declarative_base()
def get_db():
"""FastAPI 依赖:提供数据库会话,请求结束自动关闭。"""
db = SessionLocal()
try:
yield db
finally:
db.close()
def init_db():
"""建表 + 写入初始数据。"""
Base.metadata.create_all(bind=engine)
_migrate()
_seed()
def _migrate():
"""数据库迁移:为已有表添加新列。"""
from sqlalchemy import text
with engine.connect() as conn:
# 检查 accounts.tag 列是否存在
result = conn.execute(text("PRAGMA table_info(accounts)"))
columns = [row[1] for row in result]
if 'tag' not in columns:
conn.execute(text("ALTER TABLE accounts ADD COLUMN tag VARCHAR(64) DEFAULT ''"))
conn.commit()
# 检查 users.custom_permissions 列是否存在
result = conn.execute(text("PRAGMA table_info(users)"))
columns = [row[1] for row in result]
if 'custom_permissions' not in columns:
conn.execute(text("ALTER TABLE users ADD COLUMN custom_permissions JSON DEFAULT NULL"))
conn.commit()
# 检查 accounts.email_imap_ssl 列是否存在
result = conn.execute(text("PRAGMA table_info(accounts)"))
columns = [row[1] for row in result]
if 'email_imap_ssl' not in columns:
# 旧数据端口993的默认True(SSL),其他端口默认False
conn.execute(text("ALTER TABLE accounts ADD COLUMN email_imap_ssl BOOLEAN DEFAULT 1"))
conn.commit()
# 修正旧数据中使用 111.229.206.54 的账号:端口改为143SSL改为False
conn.execute(text(
"UPDATE accounts SET email_imap_port = 143, email_imap_ssl = 0 "
"WHERE email_imap_server = '111.229.206.54'"
))
conn.commit()
# 修正旧数据中使用 mail.bdhg.xyz 的账号:993端口不通,改用143非SSL
conn.execute(text(
"UPDATE accounts SET email_imap_port = 143, email_imap_ssl = 0 "
"WHERE email_imap_server = 'mail.bdhg.xyz'"
))
conn.commit()
def _seed():
"""写入默认超管账号和角色(账号密码通过环境变量配置)。"""
from .models import User
from .security import hash_password
admin_username = os.getenv("ADMIN_USERNAME", "admin")
admin_password = os.getenv("ADMIN_PASSWORD", "admin123")
db = SessionLocal()
try:
if not db.query(User).first():
admin = User(
username=admin_username,
password_hash=hash_password(admin_password),
role="super_admin",
is_active=True,
remark="默认超级管理员",
)
db.add(admin)
db.commit()
finally:
db.close()