+
    ,i{                        ^ RI t ^ RIt^ RIt^ RIt^ RIHtHtHtHt ^ RI	H
t
Ht ^ RIHt ^RIHt ^RIHtHt ]! RR7      tR	 R
 ltR R ltR R ltR R ltR R lt]! ]4      3R R llt]! ]4      ]! ]4      3R R lltR# )    N)DependsHTTPExceptionRequeststatus)HTTPAuthorizationCredentials
HTTPBearer)Session)get_db)AdminAgentF)
auto_errorc                0    V ^8  d   QhR\         R\         /# )   passwordreturnstr)formats   "server/app/auth.py__annotate__r      s     G GC GC G    c                     \         P                  ! V P                  4       \         P                  ! 4       4      P	                  4       # N)bcrypthashpwencodegensaltdecode)r   s   &r   hash_passwordr      s*    ==*FNN,<=DDFFr   c                <    V ^8  d   QhR\         R\         R\        /# )r   r   hashedr   r   bool)r   s   "r   r   r      s!      c 3 4 r   c                      \         P                  ! V P                  4       VP                  4       4      #   \         d     R # i ; i)F)r   checkpwr   
ValueError)r   r!   s   &&r   verify_passwordr'      s7    ~~hoo/AA s   25 AAc                $    V ^8  d   QhR\         /# )r   r   r   )r   s   "r   r   r      s     % % %r   c                  .    \         P                  ! ^ 4      # )    )secretstoken_urlsafe r   r   generate_tokenr.      s      $$r   c                0    V ^8  d   QhR\         R\         /# )r   tokenr   r   )r   s   "r   r   r      s     6 6c 6c 6r   c                 f    \         P                  ! V P                  4       4      P                  4       # r   )hashlibsha256r   	hexdigest)r0   s   &r   
hash_tokenr5      s     >>%,,.)3355r   c                <    V ^8  d   QhR\         R\         R\        /# )r   r0   r!   r   r"   )r   s   "r   r   r   #   s!     : : :S :T :r   c                 B    \         P                  ! \        V 4      V4      # r   )hmaccompare_digestr5   )r0   r!   s   &&r   verify_tokenr:   #   s    z%0&99r   c                <    V ^8  d   QhR\         R\        R\        /# )r   requestdbr   )r   r	   r   )r   s   "r   r   r   '   s!      7  e r   c                 b   V P                   P                  R 4      pV'       g   \        \        P                  RR7      hVP                  \        4      P                  VR7      P                  4       pV'       g6   V P                   P                  4        \        \        P                  RR7      hV# )userzNot signed instatus_codedetail)usernamezUnknown admin)
sessiongetr   r   HTTP_401_UNAUTHORIZEDqueryr   	filter_byfirstclear)r<   r=   rC   admins   &&  r   require_adminrL   '   s{    ""6*H(D(D_]]HHUO%%x%8>>@E(D(D_]]Lr   c                <    V ^8  d   QhR\         R\        R\        /# )r   credentialsr=   r   )r   r	   r   )r   s   "r   r   r   2   s&      - r   c                 \   V e    V P                   P                  4       R8w  d   \        \        P                  RR7      hV P
                  p\        V4      pVP                  \        4      P                  VR7      P                  4       pV'       g   \        \        P                  RR7      hV# )NbearerzMissing tokenr@   )
token_hashzInvalid token)schemelowerr   r   rF   rN   r5   rG   r   rH   rI   )rN   r=   r0   digestagents   &&   r   require_agentrV   2   s     k00668HD(D(D_]]##EFHHUO%%%8>>@E(D(D_]]Lr   )r2   r8   r+   r   fastapir   r   r   r   fastapi.securityr   r   sqlalchemy.ormr	   r=   r
   modelsr   r   bearer_schemer   r'   r.   r5   r:   rL   rV   r-   r   r   <module>r\      sp        ; ; E "   e,G%6: 3:&/  180F&/ r   