- 新增 TOKEN_ONLY_MODE 配置项,支持跳过 HMAC 签名验证 - 纯 Token 模式下只验证 token 参数,简化配置 - 添加 TOKEN_ONLY_MODE.md 详细文档 - 设置页面显示当前模式状态 - 更新 README.md 说明新功能 - config.example.json 添加 token_only_mode 配置项 适用于 TranspondSms 不支持签名的场景。
127 lines
4.1 KiB
Python
127 lines
4.1 KiB
Python
"""
|
||
短信转发接收端配置文件
|
||
支持从 config.json 加载配置
|
||
"""
|
||
|
||
import os
|
||
import json
|
||
from typing import Dict, List, Any
|
||
|
||
|
||
class Config:
|
||
"""基础配置"""
|
||
# 服务器配置
|
||
HOST = '0.0.0.0'
|
||
PORT = 9518
|
||
DEBUG = False
|
||
|
||
# 安全配置
|
||
SECRET_KEY = 'default_secret_key_change_me'
|
||
SIGN_VERIFY = True
|
||
SIGN_MAX_AGE = 3600000 # 签名最大有效时间(毫秒),默认1小时
|
||
|
||
# 登录配置
|
||
LOGIN_ENABLED = True
|
||
LOGIN_USERNAME = 'admin'
|
||
LOGIN_PASSWORD = 'admin123'
|
||
SESSION_LIFETIME = 3600 # 会话有效期(秒),默认1小时
|
||
|
||
# 纯 Token 模式配置
|
||
TOKEN_ONLY_MODE = False # 纯 Token 模式:只验证 token,跳过 HMAC 签名验证
|
||
|
||
# 数据库配置
|
||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||
DATABASE_PATH = os.path.join(BASE_DIR, 'sms_receiver.db')
|
||
|
||
# 短信存储配置
|
||
MAX_MESSAGES = 10000
|
||
AUTO_CLEANUP = True
|
||
CLEANUP_DAYS = 30
|
||
|
||
# Web界面配置
|
||
PER_PAGE = 50
|
||
REFRESH_INTERVAL = 30
|
||
|
||
# 日志配置
|
||
LOG_LEVEL = 'INFO'
|
||
LOG_FILE = 'sms_receiver.log'
|
||
|
||
# 时区配置
|
||
TIMEZONE = 'Asia/Shanghai'
|
||
|
||
# API Token 配置
|
||
API_TOKENS: List[Dict[str, Any]] = []
|
||
|
||
@classmethod
|
||
def load_from_json(cls, json_path: str = 'config.json') -> 'Config':
|
||
"""从 JSON 文件加载配置"""
|
||
config_obj = cls()
|
||
|
||
if os.path.exists(json_path):
|
||
with open(json_path, 'r', encoding='utf-8') as f:
|
||
config_data = json.load(f)
|
||
|
||
# 服务器配置
|
||
if 'server' in config_data:
|
||
server = config_data['server']
|
||
config_obj.HOST = server.get('host', config_obj.HOST)
|
||
config_obj.PORT = server.get('port', config_obj.PORT)
|
||
config_obj.DEBUG = server.get('debug', config_obj.DEBUG)
|
||
|
||
# 安全配置
|
||
if 'security' in config_data:
|
||
security = config_data['security']
|
||
config_obj.LOGIN_ENABLED = security.get('enabled', config_obj.LOGIN_ENABLED)
|
||
config_obj.LOGIN_USERNAME = security.get('username', config_obj.LOGIN_USERNAME)
|
||
config_obj.LOGIN_PASSWORD = security.get('password', config_obj.LOGIN_PASSWORD)
|
||
config_obj.SESSION_LIFETIME = security.get('session_lifetime', config_obj.SESSION_LIFETIME)
|
||
config_obj.SECRET_KEY = security.get('secret_key', config_obj.SECRET_KEY)
|
||
config_obj.SIGN_VERIFY = security.get('sign_verify', config_obj.SIGN_VERIFY)
|
||
config_obj.SIGN_MAX_AGE = security.get('sign_max_age', config_obj.SIGN_MAX_AGE)
|
||
|
||
# 短信配置
|
||
if 'sms' in config_data:
|
||
sms = config_data['sms']
|
||
config_obj.MAX_MESSAGES = sms.get('max_messages', config_obj.MAX_MESSAGES)
|
||
config_obj.AUTO_CLEANUP = sms.get('auto_cleanup', config_obj.AUTO_CLEANUP)
|
||
config_obj.CLEANUP_DAYS = sms.get('cleanup_days', config_obj.CLEANUP_DAYS)
|
||
|
||
# 数据库配置
|
||
if 'database' in config_data:
|
||
database = config_data['database']
|
||
if 'path' in database:
|
||
# 如果是绝对路径,直接使用;如果是相对路径,相对于项目目录
|
||
db_path = database['path']
|
||
if not os.path.isabs(db_path):
|
||
db_path = os.path.join(config_obj.BASE_DIR, db_path)
|
||
config_obj.DATABASE_PATH = db_path
|
||
|
||
# 时区配置
|
||
if 'timezone' in config_data:
|
||
config_obj.TIMEZONE = config_data['timezone']
|
||
|
||
# API Token 配置
|
||
if 'api_tokens' in config_data:
|
||
config_obj.API_TOKENS = config_data['api_tokens']
|
||
|
||
return config_obj
|
||
|
||
|
||
class DevelopmentConfig(Config):
|
||
"""开发环境配置"""
|
||
DEBUG = True
|
||
LOG_LEVEL = 'DEBUG'
|
||
|
||
|
||
class ProductionConfig(Config):
|
||
"""生产环境配置"""
|
||
DEBUG = False
|
||
|
||
|
||
# 配置映射
|
||
config = {
|
||
'development': DevelopmentConfig,
|
||
'production': ProductionConfig,
|
||
'default': DevelopmentConfig
|
||
}
|