
    huOi                     `    S SK J r Jr  S SKrS SKrS SKJrJrJr  S SKJ	r	J
r
Jr   " S S5      rg)    )datetime	timedeltaN)sessionrequestg)dbUserUserSessionc                       \ rS rSrSr\S 5       r\S 5       r\SS j5       r\SS j5       r	\S 5       r
\S	 5       rS
rg)AuthService   u   认证服务c                    [         R                  R                  U S9R                  5       (       a  g[         R                  R                  US9R                  5       (       a  g[        XS9nUR	                  U5         [
        R                  R                  U5        [
        R                  R                  5         SUR                  4$ ! [         a5  n[
        R                  R                  5         S[        U5      4s SnA$ SnAff = f)	u   
注册新用户

Args:
    username: 用户名
    email: 电子邮件
    password: 密码
    
Returns:
    (bool, str|int): 包含是否成功及结果(错误信息或用户ID)的元组
)username)Fu   用户名已存在)email)Fu   邮箱已存在)r   r   TFN)r	   query	filter_byfirstset_passwordr   r   addcommitid	Exceptionrollbackstr)r   r   passworduseres        C   /Users/yu22x/Desktop/ddd_副本128/ctf/app/services/auth/service.pyregister_userAuthService.register_user
   s     ::288::. ::e,2244+ X3(#	!JJNN4 JJ=  	!JJ!#a&= 	!s   >A
C	 	
D*D=DDc                 X   [         R                  R                  [         R                  U :H  [         R                  U :H  -  5      R                  5       nU(       d  gUR                  U5      (       d  g[        R                  " 5       Ul	        [        R                  R                  5         U$ )u   
验证用户凭据

Args:
    username_or_email: 用户名或邮箱
    password: 密码
    
Returns:
    User|None: 验证成功返回用户对象，失败返回None
N)r	   r   filterr   r   r   check_passwordr   utcnow
last_loginr   r   r   )username_or_emailr   r   s      r   authenticate_userAuthService.authenticate_user+   s     zz  ]]//ZZ,,.
 %' 	
  ""8,, #//+


    c                 \   [         R                  " S5      n[        R                  " 5       nU(       a  U[	        US9-  nOU[	        SS9-  n[        U R                  U[        R                  [        R                  (       a  [        R                  R                  OSUS9n [        R                  R                  U5        [        R                  R                  5         U R                  [        S'   U[        S'   U$ ! [         a%  n[        R                  R!                  5         UeSnAff = f)	u   
创建用户会话

Args:
    user: 用户对象
    remember: 是否记住登录状态
    days: 记住登录的天数
    
Returns:
    str: 会话令牌
    )days   )hoursN)user_idsession_token
ip_address
user_agent
expires_atr/   r0   )secrets	token_hexr   r$   r   r
   r   r   remote_addrr2   stringr   r   r   r   r   r   )r   rememberr,   tokenr3   user_sessionr   s          r   create_sessionAuthService.create_sessionJ   s     !!"% __&
)..J)"--J #GG**4;4F4Fw))00D!
	JJNN<(JJ "&GI',GO$L 	JJ!G	s   !AC< <
D+ D&&D+Nc                     U (       d  [         R                  " S5      n U (       d  g[        R                  R	                  U S9R                  5       nU(       a  UR                  (       d  gUR                  $ )u   
验证会话有效性

Args:
    session_token: 会话令牌，如果为None则从Flask会话中获取
    
Returns:
    User|None: 会话有效返回用户对象，无效返回None
r0   Nr0   )r   getr
   r   r   r   is_validr   )r0   r:   s     r   verify_sessionAuthService.verify_sessionw   sY     #KK8M #((222OUUW<#8#8   r)   c                      [         R                  " S5      n U (       aI  [        R                  R	                  U S9R                  5         [        R                   R                  5         [         R                  " 5         g)u5   
用户登出

Returns:
    bool: 是否成功登出
r0   r>   T)	r   r?   r
   r   r   deleter   r   clearr>   s    r   logoutAuthService.logout   sS      O4''m'DKKMJJ 	r)   c                     [        [        S5      (       a  [        R                  $ [        R                  " S5      n [        R                  " S5      nU (       a  U(       d  g[
        R                  U5      nU(       a  U[        l        U$ g)uA   
获取当前用户

Returns:
    User|None: 当前用户或None
r   r/   r0   N)hasattrr   r   r   r?   r   rA   )r/   r0   r   s      r   get_current_userAuthService.get_current_user   sb     1f66M++i(O4m ))-8AFKr)    )F   )N)__name__
__module____qualname____firstlineno____doc__staticmethodr   r'   r;   rA   rF   rJ   __static_attributes__rL   r)   r   r   r      s}    ! !@  < * *X ! !0  &  r)   r   )r   r   uuidr4   flaskr   r   r   app.models.database.modelsr   r	   r
   r   rL   r)   r   <module>rX      s&    (   % % < <u ur)   