Files
LoveACE-EndF/provider/aufe/aac/depends.py

67 lines
2.6 KiB
Python
Raw Normal View History

2025-08-03 16:50:56 +08:00
from fastapi import Depends, HTTPException
from loguru import logger
from provider.loveac.authme import fetch_user_by_token
from provider.aufe.aac import AACClient, get_system_token
from provider.aufe.client import AUFEConnection
from database.user import User, AACTicket
from sqlalchemy.ext.asyncio import AsyncSession
from database.creator import get_db_session
from sqlalchemy import select
async def get_aac_client(
user: User = Depends(fetch_user_by_token),
db: AsyncSession = Depends(get_db_session),
) -> AACClient:
"""
获取AAC客户端
:param user: 用户信息
:return: AACClient
:raises HTTPException: 如果用户无效或登录失败
"""
if not user:
raise HTTPException(status_code=400, detail="无效的令牌或用户不存在")
aufe = AUFEConnection.create_or_get_connection("vpn.aufe.edu.cn", user.userid)
if not aufe.login_status():
userid = user.userid
easyconnect_password = user.easyconnect_password
if not await aufe.login(userid, easyconnect_password):
raise HTTPException(
status_code=400,
detail="VPN登录失败请检查用户名和密码",
)
if not aufe.uaap_login_status():
userid = user.userid
password = user.password
if not await aufe.uaap_login(userid, password):
raise HTTPException(
status_code=400,
detail="大学登录失败,请检查用户名和密码",
)
# 检查AAC Ticket是否存在
async with db as session:
result = await session.execute(
select(AACTicket).where(AACTicket.userid == user.userid)
)
aac_ticket = result.scalars().first()
if not aac_ticket:
# 如果不存在尝试获取新的AAC Ticket
logger.info(f"用户 {user.userid} 的 AAC Ticket 不存在,正在获取新的 Ticket")
aac_ticket = await get_system_token(aufe)
if not aac_ticket:
logger.error(f"用户 {user.userid} 获取 AAC Ticket 失败")
raise HTTPException(
status_code=400,
detail="获取AAC Ticket失败请稍后再试",
)
# 保存到数据库
async with db as session:
session.add(AACTicket(userid=user.userid, aac_token=aac_ticket))
await session.commit()
logger.success(f"用户 {user.userid} 成功获取并保存新的 AAC Ticket")
else:
logger.info(f"用户 {user.userid} 使用现有的 AAC Ticket")
aac_ticket = aac_ticket.aac_token
return AACClient(aufe, aac_ticket)