From c1339a98584c397b906ae339b389c860cbbbcee0 Mon Sep 17 00:00:00 2001 From: fanbook-wangdage <124357765+fanbook-wangdage@users.noreply.github.com> Date: Sun, 25 Jan 2026 18:49:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 3 ++- routes/auth.py | 6 +++--- routes/web_api.py | 4 ++-- run.py | 21 ++++++++++++++++--- services/auth_service.py | 44 +++++++++++++++------------------------- 5 files changed, 41 insertions(+), 37 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4d73820..b936335 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ pycryptodome==3.20.0 PyJWT==2.10.1 pymongo==4.15.5 Werkzeug==3.1.4 -sentry-sdk[flask] \ No newline at end of file +sentry-sdk[flask] +gunicorn \ No newline at end of file diff --git a/routes/auth.py b/routes/auth.py index 9ae7d34..2f5e165 100644 --- a/routes/auth.py +++ b/routes/auth.py @@ -4,7 +4,7 @@ from services.auth_service import ( decrypt_data, send_verification_email, verify_user_credentials, create_user_account, get_user_by_id ) -from app.extensions import generate_code, logger +from app.extensions import generate_code, logger , config_loader auth_bp = Blueprint("auth", __name__) @@ -148,7 +148,7 @@ def passport_login(): "data": { "AccessToken": access_token, "RefreshToken": access_token, - "ExpiresIn": 3600 + "ExpiresIn": config_loader.JWT_EXPIRATION_HOURS * 3600 } }) @@ -225,7 +225,7 @@ def passport_refresh_token(): "data": { "AccessToken": access_token, "RefreshToken": access_token, - "ExpiresIn": 3600 + "ExpiresIn": config_loader.JWT_EXPIRATION_HOURS * 3600 } }) diff --git a/routes/web_api.py b/routes/web_api.py index 4afea6e..3c41e07 100644 --- a/routes/web_api.py +++ b/routes/web_api.py @@ -4,7 +4,7 @@ from flask import Blueprint, request, jsonify from app.utils.jwt_utils import verify_token, create_token from services.auth_service import verify_user_credentials, get_users_with_search from app.decorators import require_maintainer_permission -from app.extensions import generate_numeric_id, client, logger +from app.extensions import generate_numeric_id, client, logger, config_loader web_api_bp = Blueprint("web_api", __name__) @@ -36,7 +36,7 @@ def web_api_login(): "message": "success", "data": { "access_token": access_token, - "expires_in": 3600 + "expires_in": config_loader.JWT_EXPIRATION_HOURS * 3600 } }) diff --git a/run.py b/run.py index 488dae9..58c846b 100644 --- a/run.py +++ b/run.py @@ -1,6 +1,21 @@ -from app import create_app +from app.init import create_app +from app.config_loader import config_loader +import sentry_sdk +sentry_sdk.init( + dsn="https://d1cad1d2b442cf8431df3ee4bab925e0@o4507525750521856.ingest.us.sentry.io/4510623668830208", + # Add data like request headers and IP for users, + # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info + send_default_pii=True, + traces_sample_rate=1.0, +) + +# 创建应用实例 app = create_app() -if __name__ == "__main__": - app.run(debug=True) +if __name__ == '__main__': + app.run( + host=config_loader.SERVER_HOST, + port=config_loader.SERVER_PORT, + debug=config_loader.SERVER_DEBUG + ) \ No newline at end of file diff --git a/services/auth_service.py b/services/auth_service.py index 8d0454a..9e9eafc 100644 --- a/services/auth_service.py +++ b/services/auth_service.py @@ -1,20 +1,23 @@ -import datetime from bson import ObjectId from werkzeug.security import generate_password_hash, check_password_hash from app.extensions import client, logger from app.config import Config - +from Crypto.Cipher import PKCS1_OAEP +from Crypto.PublicKey import RSA +from app.config_loader import config_loader +from datetime import timezone +from zoneinfo import ZoneInfo +import datetime +import SendEmailTool +import re +import base64 def decrypt_data(encrypted_data): """使用RSA私钥解密数据""" try: - from Crypto.Cipher import PKCS1_OAEP - from Crypto.PublicKey import RSA - import base64 - from app.config_loader import config_loader - private_key_file = config_loader.RSA_PRIVATE_KEY_FILE - private_key = RSA.import_key(open(private_key_file).read()) + with open(private_key_file, 'r') as f: + private_key = RSA.import_key(f.read()) cipher = PKCS1_OAEP.new(private_key) decrypted_data = cipher.decrypt(base64.b64decode(encrypted_data)) return decrypted_data.decode() @@ -26,8 +29,6 @@ def decrypt_data(encrypted_data): def send_verification_email(email, code): """发送验证码邮件""" try: - import SendEmailTool - subject = "Snap Hutao 验证码" body = f"您的验证码是: {code}" @@ -74,8 +75,9 @@ def create_user_account(email, password): "CreatedAt": datetime.datetime.utcnow(), "IsLicensedDeveloper": False, "IsMaintainer": False, - "GachaLogExpireAt": "2026-01-01T00:00:00Z", - "CdnExpireAt": "2026-01-01T00:00:00Z" + # 现在默认用户的上传权限不过期 + "GachaLogExpireAt": "2099-01-01T00:00:00Z", + "CdnExpireAt": "2099-01-01T00:00:00Z" } result = client.ht_server.users.insert_one(new_user) @@ -91,7 +93,8 @@ def get_user_by_id(user_id): if user: user['_id'] = str(user['_id']) return user - except: + except Exception as e: + logger.error(f"Error retrieving user by ID: {e}") return None @@ -119,18 +122,6 @@ def get_users_with_search(query_text=""): or_conditions.append({ "_id": ObjectId(query_text) }) - else: - # 允许部分 ObjectId 搜索(转字符串后匹配) - or_conditions.append({ - "_id": { - "$in": [ - u["_id"] for u in client.ht_server.users.find( - {}, - {"_id": 1} - ) if query_text.lower() in str(u["_id"]).lower() - ] - } - }) query = {"$or": or_conditions} @@ -145,9 +136,6 @@ def get_users_with_search(query_text=""): users = list(users_map.values()) # 数据格式化 - from datetime import timezone - from zoneinfo import ZoneInfo - CST = ZoneInfo("Asia/Shanghai") for u in users: