Ë
    éƒtjÃ
  ã                   ó   — d Z ddlZddlZddlmZmZmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZmZ 	 ddlmZmZ dZej,                  j/                  d ej0                  d«      «      ZdZ eej,                  j/                  dd«      «      Zej,                  j/                  dd«      Zej,                  j/                  dd«      Z ed¬«      Zde de!fd„Z"de!de fd„Z#deedz   e	e«      f   de!fd„Z$y# e$ r 	 ddlZd	Zn# e$ r d
ZY nw xY wY ŒÔw xY w)z&Simple JWT-based admin authentication.é    N)ÚdatetimeÚ	timedeltaÚtimezone)Ú	Annotated)ÚDependsÚHTTPExceptionÚstatus)ÚHTTPAuthorizationCredentialsÚ
HTTPBearer)ÚJWTErrorÚjwtÚjoseÚpyjwtÚnoneÚ
JWT_SECRETé    ÚHS256ÚJWT_EXPIRE_MINUTESÚ60ÚADMIN_USERNAMEÚadminÚADMIN_PASSWORDÚchangemeF)Ú
auto_errorÚdataÚreturnc                 óÌ  — | j                  «       }t        j                  t        j                  «      t        t        ¬«      z   }||d<   t        dk(  r t        j                  |t        t        ¬«      S t        dk(  r t        j                  |t        t        ¬«      S dd l}dd l}|j                  |j!                  |t"        ¬«      j                  «       «      j%                  «       S )N)ÚminutesÚexpr   )Ú	algorithmr   r   )Údefault)Úcopyr   Únowr   Úutcr   ÚACCESS_TOKEN_EXPIRE_MINUTESÚ_BACKENDÚ	_jose_jwtÚencodeÚ
SECRET_KEYÚ	ALGORITHMÚ_pyjwtÚbase64ÚjsonÚurlsafe_b64encodeÚdumpsÚstrÚdecode)r   ÚpayloadÚexpirer,   r-   s        ú$/var/www/html/CA-Chatbot/app/auth.pyÚcreate_access_tokenr5   #   s    € Ø�i‰i‹k€GÜ�\‰\œ(Ÿ,™,Ó'¬)Ô<WÔ*XÑX€FØ€GˆE�Nä�6ÒÜ×Ñ ¬¼yÔIÐIÜ	�WÒ	Ü�}‰}˜W¤j¼IÔFÐF÷ 	Ø×'Ñ'¨¯
©
°7ÄC¨
Ó(H×(OÑ(OÓ(QÓR×YÑYÓ[Ð[ó    Útokenc                 ó  — t         dk(  r!t        j                  | t        t        g¬«      S t         dk(  r!t        j                  | t        t        g¬«      S dd l}dd l}|j                  |j                  | dz   «      j                  «       «      S )Nr   )Ú
algorithmsr   r   z==)
r&   r'   r1   r)   r*   r+   r,   r-   ÚloadsÚurlsafe_b64decode)r7   r,   r-   s      r4   Údecode_tokenr<   2   sh   € Ü�6ÒÜ×Ñ ¤z¼y¸kÔJÐJÜ	�WÒ	Ü�}‰}˜U¤J¼I¸;ÔGÐGçØ�z‰z˜&×2Ñ2°5¸4±<Ó@×GÑGÓIÓJÐJr6   Úcredentialsc                 ó  — | st        t        j                  dddi¬«      ‚	 t        | j                  «      }|j                  dd«      }|st        d«      ‚|S # t        $ r t        t        j                  dddi¬«      ‚w xY w)	u>   FastAPI dependency â€” raises 401 if token is missing/invalid.zAuthentication requiredzWWW-AuthenticateÚBearer)Ústatus_codeÚdetailÚheadersÚsubÚ zMissing subzInvalid or expired token)r   r	   ÚHTTP_401_UNAUTHORIZEDr<   r=   ÚgetÚ
ValueErrorÚ	Exception)r=   r2   Úusernames      r4   Úverify_admin_tokenrJ   <   s�   € ñ ÜÜ×4Ñ4Ø,Ø'¨Ð2ô
ð 	
ð

Ü˜{×6Ñ6Ó7ˆØŸ™ E¨2Ó.ˆÙÜ˜]Ó+Ð+ØˆøÜò 
ÜÜ×4Ñ4Ø-Ø'¨Ð2ô
ð 	
ð
ús   ¢5A Á(B )%Ú__doc__ÚosÚsecretsr   r   r   Útypingr   Úfastapir   r   r	   Úfastapi.securityr
   r   r   r   r   r'   r&   ÚImportErrorr+   ÚenvironrF   Ú	token_hexr)   r*   Úintr%   r   r   Úbearer_schemeÚdictr0   r5   r<   rJ   © r6   r4   Ú<module>rX      s0  ðÙ ,ã 	Û ß 2Ñ 2Ý ç 2Ñ 2ß Eð
ß/à€Hð �Z‰Z�^‰^˜LÐ*;¨'×*;Ñ*;¸BÓ*?Ó@€
Ø€	Ù! "§*¡*§.¡.Ð1EÀtÓ"LÓMÐ ð —‘—‘Ð 0°'Ó:€Ø—‘—‘Ð 0°*Ó=€á eÔ,€ð\˜dð \ só \ðK˜ð K ó Kð
ØÐ7¸$Ñ>ÁÈÓ@VÐVÑWð
àô
øðY ò ðÛà‰øØò ØŠðüðús5   ®
C0 Ã0DÃ6C=Ã<DÃ=DÄDÄDÄDÄD