ó
    |chM  ã                   óÂ   • S SK r S SKrS SKJr  S SKJr  S SKJr  S SK	J
r
  S SKJrJr  S SKJr  S SKJr  S S	KJrJr  S S
KJr  \R.                  " \5      r " S S\5      rg)é    N)Úcompare_digest)Útimezone)Úgettext_lazy)Ú
exceptions)ÚBaseAuthenticationÚget_authorization_header)Ú
hash_token)Úget_token_model)Ú	CONSTANTSÚknox_settings)Útoken_expiredc                   óH   • \ rS rSrSrS rS rSS jrS rS	 r	S\
4S
 jrSrg)ÚTokenAuthenticationé   af  
This authentication scheme uses Knox AuthTokens for authentication.

Similar to DRF's TokenAuthentication, it overrides a large amount of that
authentication scheme to cope with the fact that Tokens are not stored
in plaintext in the database

If successful
- `request.user` will be a django `User` instance
- `request.auth` will be an `AuthToken` instance
c                 óÀ  • [        U5      R                  5       nU R                  U5      R                  5       nU(       d  g US   R	                  5       UR	                  5       :w  a  g [        U5      S:X  a!  [        S5      n[        R                  " U5      e[        U5      S:”  a!  [        S5      n[        R                  " U5      eU R                  US   5      u  pVXV4$ )Nr   é   z.Invalid token header. No credentials provided.é   z=Invalid token header. Token string should not contain spaces.)
r   ÚsplitÚauthenticate_headerÚencodeÚlowerÚlenÚ_r   ÚAuthenticationFailedÚauthenticate_credentials)ÚselfÚrequestÚauthÚprefixÚmsgÚuserÚ
auth_tokens          ÚR/var/www/djangovue.mamus.xyz/django/venv/lib/python3.13/site-packages/knox/auth.pyÚauthenticateÚ TokenAuthentication.authenticate!   sÁ   € Ü'¨Ó0×6Ñ6Ó8ˆØ×)Ñ)¨'Ó2×9Ñ9Ó;ˆæØØ�‰7�=‰=‹?˜fŸl™l›nÓ,àÜˆt‹9˜‹>ÜÐDÓEˆCÜ×1Ò1°#Ó6Ð6Ü�‹Y˜‹]Üð >ó ?ˆCä×1Ò1°#Ó6Ð6à×8Ñ8¸¸a¹ÓAÑˆØÐ!Ð!ó    c                 óP  • [        S5      nUR                  S5      n[        5       R                  R	                  US[
        R                   S9 H‹  nU R                  U5      (       a  M   [        U5      n[        XCR                  5      (       d  MC  [         R"                  (       a"  UR$                  (       a  U R'                  U5        U R)                  U5      s  $    [        R                  " U5      e! [        [        R                  4 a    [        R                  " U5      ef = f)z¬
Due to the random nature of hashing a value, this must inspect
each auth_token individually to find the correct one.

Tokens that have expired will be deleted and skipped
zInvalid token.zutf-8N)Ú	token_key)r   Údecoder
   ÚobjectsÚfilterr   ÚTOKEN_KEY_LENGTHÚ_cleanup_tokenr	   Ú	TypeErrorÚbinasciiÚErrorr   r   r   Údigestr   ÚAUTO_REFRESHÚexpiryÚrenew_tokenÚvalidate_user)r   Útokenr    r"   r1   s        r#   r   Ú,TokenAuthentication.authenticate_credentials5   sõ   € ô Ð Ó!ˆØ—‘˜WÓ%ˆÜ)Ó+×3Ñ3×:Ñ:ØÐ ;¤×!;Ñ!;Ð<ð ;ó >ˆJà×"Ñ" :×.Ñ.Ùð;Ü# EÓ*�ô ˜f×&7Ñ&7×8Ó8Ü ×-×-°*×2C×2CØ×$Ñ$ ZÔ0Ø×)Ñ)¨*Ó5Ò5ñ>ô ×-Ò-¨cÓ2Ð2øô œxŸ~™~Ð.ó ;Ü ×5Ò5°cÓ:Ð:ð;ús   Á+C4Ã41D%ÚreturnNc                 ót  • UR                   n[        R                  " 5       [        R                  -   n[        R
                  b9  UR                  [        R
                  -   nX4:”  a  Un[        R                  S5        X1l         X2-
  R                  5       nU[        R                  :”  a  UR                  SS9  g g )Nz4Token renewal truncated due to AUTO_REFRESH_MAX_TTL.)r3   )Úupdate_fields)r3   r   Únowr   Ú	TOKEN_TTLÚAUTO_REFRESH_MAX_TTLÚcreatedÚloggerÚinfoÚtotal_secondsÚMIN_REFRESH_INTERVALÚsave)r   r"   Úcurrent_expiryÚ
new_expiryÚ
max_expiryÚdeltas         r#   r4   ÚTokenAuthentication.renew_tokenM   s™   € Ø#×*Ñ*ˆÜ—\’\“^¤m×&=Ñ&=Ñ=ˆ
ô ×-Ñ-Ñ9Ø#×+Ñ+¬m×.PÑ.PÑPˆJØÓ&Ø'�
Ü—‘ÐRÔSà&Ôð Ñ,×;Ñ;Ó=ˆØ”=×5Ñ5Ó5Ø�O‰O¨+ˆOÒ6ð 6r&   c                 ó’   • UR                   R                  (       d  [        R                  " [	        S5      5      eUR                   U4$ )NzUser inactive or deleted.)r!   Ú	is_activer   r   r   )r   r"   s     r#   r5   Ú!TokenAuthentication.validate_user_   s:   € Ø�‰×(×(Ü×1Ò1ÜÐ-Ó.ó0ð 0à—‘ Ð,Ð,r&   c                 ó"   • [         R                  $ )N)r   ÚAUTH_HEADER_PREFIX)r   r   s     r#   r   Ú'TokenAuthentication.authenticate_headere   s   € Ü×/Ñ/Ð/r&   c                 óŒ  • UR                   R                  R                  5        H¡  nUR                  UR                  :w  d  M  UR                  (       d  M2  UR                  [
        R                  " 5       :  d  MW  UR                  5         UR                   R                  5       n[        R                  " U R                  USS9  M£     UR                  bn  UR                  [
        R                  " 5       :  aK  UR                   R                  5       nUR                  5         [        R                  " U R                  USS9  gg)NÚother_token)ÚsenderÚusernameÚsourcer"   TF)r!   Úauth_token_setÚallr1   r3   r   r;   ÚdeleteÚget_usernamer   ÚsendÚ	__class__)r   r"   rP   rR   s       r#   r-   Ú"TokenAuthentication._cleanup_tokenh   sí   € Ø%Ÿ?™?×9Ñ9×=Ñ=Ö?ˆKØ×!Ñ! Z×%6Ñ%6Õ6¸;×;M×;MÑ;MØ×%Ñ%¬¯ª«Õ6Ø×&Ñ&Ô(Ø*×/Ñ/×<Ñ<Ó>�HÜ!×&Ò&¨d¯n©nØ08ÀôPñ @ð ×ÑÑ(Ø× Ñ ¤8§<¢<£>Ó1Ø%Ÿ?™?×7Ñ7Ó9�Ø×!Ñ!Ô#Ü×"Ò"¨$¯.©.Ø,4¸\òKàØr&   © )r8   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r$   r   r4   r5   r   Úboolr-   Ú__static_attributes__r[   r&   r#   r   r      s,   † ñ
ò"ò(3ô07ò$-ò0ð¨D÷ r&   r   )r/   ÚloggingÚhmacr   Údjango.utilsr   Údjango.utils.translationr   r   Úrest_frameworkr   Úrest_framework.authenticationr   r   Úknox.cryptor	   Úknox.modelsr
   Úknox.settingsr   r   Úknox.signalsr   Ú	getLoggerr\   r?   r   r[   r&   r#   Ú<module>rn      sI   ðÛ Û Ý å !Ý 6Ý %÷õ #Ý 'ß 2Ý &à	×	Ò	˜8Ó	$€ôcÐ,õ cr&   