67 lines
2.6 KiB
Python
67 lines
2.6 KiB
Python
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)
|