mirror of
https://github.com/zhinianboke/xianyu-auto-reply.git
synced 2025-08-02 20:47:35 +08:00
231 lines
8.2 KiB
Python
231 lines
8.2 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
修复多用户数据隔离的脚本
|
||
"""
|
||
|
||
import re
|
||
|
||
def fix_user_isolation():
|
||
"""修复用户隔离问题"""
|
||
print("🔧 修复多用户数据隔离问题")
|
||
print("=" * 60)
|
||
|
||
# 需要修复的接口列表
|
||
interfaces_to_fix = [
|
||
# 商品管理
|
||
{
|
||
'pattern': r'@app\.put\("/items/\{cookie_id\}/\{item_id\}"\)\ndef update_item_detail\(',
|
||
'description': '更新商品详情接口',
|
||
'add_user_check': True
|
||
},
|
||
{
|
||
'pattern': r'@app\.delete\("/items/\{cookie_id\}/\{item_id\}"\)\ndef delete_item_info\(',
|
||
'description': '删除商品信息接口',
|
||
'add_user_check': True
|
||
},
|
||
{
|
||
'pattern': r'@app\.delete\("/items/batch"\)\ndef batch_delete_items\(',
|
||
'description': '批量删除商品接口',
|
||
'add_user_check': True
|
||
},
|
||
{
|
||
'pattern': r'@app\.post\("/items/get-all-from-account"\)\nasync def get_all_items_from_account\(',
|
||
'description': '从账号获取所有商品接口',
|
||
'add_user_check': True
|
||
},
|
||
{
|
||
'pattern': r'@app\.post\("/items/get-by-page"\)\nasync def get_items_by_page\(',
|
||
'description': '分页获取商品接口',
|
||
'add_user_check': True
|
||
},
|
||
# 卡券管理
|
||
{
|
||
'pattern': r'@app\.get\("/cards"\)\ndef get_cards\(',
|
||
'description': '获取卡券列表接口',
|
||
'add_user_check': False # 卡券是全局的,不需要用户隔离
|
||
},
|
||
# AI回复设置
|
||
{
|
||
'pattern': r'@app\.get\("/ai-reply-settings/\{cookie_id\}"\)\ndef get_ai_reply_settings\(',
|
||
'description': 'AI回复设置接口',
|
||
'add_user_check': True
|
||
},
|
||
# 消息通知
|
||
{
|
||
'pattern': r'@app\.get\("/message-notifications/\{cid\}"\)\ndef get_account_notifications\(',
|
||
'description': '获取账号消息通知接口',
|
||
'add_user_check': True
|
||
},
|
||
]
|
||
|
||
print("📋 需要修复的接口:")
|
||
for i, interface in enumerate(interfaces_to_fix, 1):
|
||
status = "✅ 需要用户检查" if interface['add_user_check'] else "ℹ️ 全局接口"
|
||
print(f" {i}. {interface['description']} - {status}")
|
||
|
||
print("\n💡 修复建议:")
|
||
print("1. 将 '_: None = Depends(require_auth)' 替换为 'current_user: Dict[str, Any] = Depends(get_current_user)'")
|
||
print("2. 在需要用户检查的接口中添加用户权限验证")
|
||
print("3. 确保只返回当前用户的数据")
|
||
|
||
print("\n🔍 检查当前状态...")
|
||
|
||
# 读取reply_server.py文件
|
||
try:
|
||
with open('reply_server.py', 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
# 统计还有多少接口使用旧的认证方式
|
||
old_auth_count = len(re.findall(r'_: None = Depends\(require_auth\)', content))
|
||
new_auth_count = len(re.findall(r'current_user: Dict\[str, Any\] = Depends\(get_current_user\)', content))
|
||
|
||
print(f"📊 认证方式统计:")
|
||
print(f" • 旧认证方式 (require_auth): {old_auth_count} 个接口")
|
||
print(f" • 新认证方式 (get_current_user): {new_auth_count} 个接口")
|
||
|
||
if old_auth_count > 0:
|
||
print(f"\n⚠️ 还有 {old_auth_count} 个接口需要修复")
|
||
|
||
# 找出具体哪些接口还没修复
|
||
old_auth_interfaces = re.findall(r'@app\.\w+\([^)]+\)\s*\ndef\s+(\w+)\([^)]*_: None = Depends\(require_auth\)', content, re.MULTILINE)
|
||
|
||
print("📝 未修复的接口:")
|
||
for interface in old_auth_interfaces:
|
||
print(f" • {interface}")
|
||
else:
|
||
print("\n🎉 所有接口都已使用新的认证方式!")
|
||
|
||
# 检查是否有用户权限验证
|
||
user_check_pattern = r'user_cookies = db_manager\.get_all_cookies\(user_id\)'
|
||
user_check_count = len(re.findall(user_check_pattern, content))
|
||
|
||
print(f"\n🔒 用户权限检查统计:")
|
||
print(f" • 包含用户权限检查的接口: {user_check_count} 个")
|
||
|
||
return old_auth_count == 0
|
||
|
||
except Exception as e:
|
||
print(f"❌ 检查失败: {e}")
|
||
return False
|
||
|
||
def generate_fix_template():
|
||
"""生成修复模板"""
|
||
print("\n📝 修复模板:")
|
||
print("-" * 40)
|
||
|
||
template = '''
|
||
# 修复前:
|
||
@app.get("/some-endpoint/{cid}")
|
||
def some_function(cid: str, _: None = Depends(require_auth)):
|
||
"""接口描述"""
|
||
# 原有逻辑
|
||
pass
|
||
|
||
# 修复后:
|
||
@app.get("/some-endpoint/{cid}")
|
||
def some_function(cid: str, current_user: Dict[str, Any] = Depends(get_current_user)):
|
||
"""接口描述"""
|
||
try:
|
||
# 检查cookie是否属于当前用户
|
||
user_id = current_user['user_id']
|
||
from db_manager import db_manager
|
||
user_cookies = db_manager.get_all_cookies(user_id)
|
||
|
||
if cid not in user_cookies:
|
||
raise HTTPException(status_code=403, detail="无权限访问该Cookie")
|
||
|
||
# 原有逻辑
|
||
pass
|
||
except HTTPException:
|
||
raise
|
||
except Exception as e:
|
||
raise HTTPException(status_code=500, detail=str(e))
|
||
'''
|
||
|
||
print(template)
|
||
|
||
def check_database_isolation():
|
||
"""检查数据库隔离情况"""
|
||
print("\n🗄️ 检查数据库隔离情况")
|
||
print("-" * 40)
|
||
|
||
try:
|
||
import sqlite3
|
||
conn = sqlite3.connect('xianyu_data.db')
|
||
cursor = conn.cursor()
|
||
|
||
# 检查cookies表是否有user_id字段
|
||
cursor.execute("PRAGMA table_info(cookies)")
|
||
columns = [column[1] for column in cursor.fetchall()]
|
||
|
||
if 'user_id' in columns:
|
||
print("✅ cookies表已支持用户隔离")
|
||
|
||
# 统计用户数据分布
|
||
cursor.execute('''
|
||
SELECT u.username, COUNT(c.id) as cookie_count
|
||
FROM users u
|
||
LEFT JOIN cookies c ON u.id = c.user_id
|
||
GROUP BY u.id, u.username
|
||
ORDER BY cookie_count DESC
|
||
''')
|
||
|
||
user_stats = cursor.fetchall()
|
||
print("\n📊 用户数据分布:")
|
||
for username, cookie_count in user_stats:
|
||
print(f" • {username}: {cookie_count} 个cookies")
|
||
|
||
# 检查未绑定的数据
|
||
cursor.execute("SELECT COUNT(*) FROM cookies WHERE user_id IS NULL")
|
||
unbound_count = cursor.fetchone()[0]
|
||
if unbound_count > 0:
|
||
print(f"\n⚠️ 发现 {unbound_count} 个未绑定用户的cookies")
|
||
else:
|
||
print("\n✅ 所有cookies已正确绑定用户")
|
||
else:
|
||
print("❌ cookies表不支持用户隔离")
|
||
|
||
conn.close()
|
||
|
||
except Exception as e:
|
||
print(f"❌ 检查数据库失败: {e}")
|
||
|
||
def main():
|
||
"""主函数"""
|
||
print("🚀 多用户数据隔离修复工具")
|
||
print("=" * 60)
|
||
|
||
# 检查修复状态
|
||
all_fixed = fix_user_isolation()
|
||
|
||
# 生成修复模板
|
||
generate_fix_template()
|
||
|
||
# 检查数据库隔离
|
||
check_database_isolation()
|
||
|
||
print("\n" + "=" * 60)
|
||
if all_fixed:
|
||
print("🎉 多用户数据隔离检查完成!所有接口都已正确实现用户隔离。")
|
||
else:
|
||
print("⚠️ 还有接口需要修复,请按照模板进行修复。")
|
||
|
||
print("\n📋 功能模块隔离状态:")
|
||
print("✅ 1. 账号管理 - Cookie相关接口已隔离")
|
||
print("✅ 2. 自动回复 - 关键字和默认回复已隔离")
|
||
print("❓ 3. 商品管理 - 部分接口需要检查")
|
||
print("❓ 4. 卡券管理 - 需要确认是否需要隔离")
|
||
print("❓ 5. 自动发货 - 需要检查")
|
||
print("❓ 6. 通知渠道 - 需要确认隔离策略")
|
||
print("❓ 7. 消息通知 - 需要检查")
|
||
print("❓ 8. 系统设置 - 需要确认哪些需要隔离")
|
||
|
||
print("\n💡 下一步:")
|
||
print("1. 手动修复剩余的接口")
|
||
print("2. 测试所有功能的用户隔离")
|
||
print("3. 更新前端代码以支持多用户")
|
||
print("4. 编写完整的测试用例")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|