Ë
    º2Úið  ã                   ó´   — 	 d dl mZ d dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ  G d„ de«      Zy# e$ r d„ ZY ŒNw xY w)é    )Úcompare_digestc                 ó   — | |k(  S ©N© )ÚaÚbs     ú@/var/www/html/acx/venv/lib/python3.12/site-packages/knox/auth.pyr   r      s   € Ø�A‰vˆó    N)Útimezone)Úgettext_lazy)Ú
exceptions)ÚBaseAuthenticationÚget_authorization_header)Ú
hash_token)Ú	AuthToken)Ú	CONSTANTSÚknox_settings)Útoken_expiredc                   ó8   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zy)	ÚTokenAuthenticationa†  
    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                 ó®  — t        |«      j                  «       }t        j                  j	                  «       }|sy |d   j                  «       |j                  «       k7  ry t        |«      dk(  r t        d«      }t        j                  |«      ‚t        |«      dkD  r t        d«      }t        j                  |«      ‚| j                  |d   «      \  }}||fS )Nr   é   z.Invalid token header. No credentials provided.é   z=Invalid token header. Token string should not contain spaces.)r   Úsplitr   ÚAUTH_HEADER_PREFIXÚencodeÚlowerÚlenÚ_r   ÚAuthenticationFailedÚauthenticate_credentials)ÚselfÚrequestÚauthÚprefixÚmsgÚuserÚ
auth_tokens          r	   Úauthenticatez TokenAuthentication.authenticate$   sÀ   € Ü'¨Ó0×6Ñ6Ó8ˆÜ×1Ñ1×8Ñ8Ó:ˆáØØ�‰7�=‰=‹?˜fŸl™l›nÒ,àÜˆt‹9˜Š>ÜÐDÓEˆCÜ×1Ñ1°#Ó6Ð6Ü�‹Y˜Š]Üð >ó ?ˆCä×1Ñ1°#Ó6Ð6à×8Ñ8¸¸a¹ÓAÑˆˆjØ�jÐ!Ð!r
   c                 ó  — t        d«      }|j                  d«      }t        j                  j	                  |dt
        j                   ¬«      D ]v  }| j                  |«      rŒ	 t        |«      }t        ||j                  «      sŒ8t         j"                  r|j$                  r| j'                  |«       | j)                  |«      c S  t        j                  |«      ‚# t        t        j                  f$ r t        j                  |«      ‚w xY w)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(   r4   s        r	   r!   z,TokenAuthentication.authenticate_credentials8   só   € ô Ð Ó!ˆØ—‘˜WÓ%ˆÜ#×+Ñ+×2Ñ2ØÐ ;¤×!;Ñ!;Ð<ð 3ó >ò 	6ˆJà×"Ñ" :Ô.Øð;Ü# EÓ*�ô ˜f j×&7Ñ&7Õ8Ü ×-Ò-°*×2CÒ2CØ×$Ñ$ ZÔ0Ø×)Ñ)¨*Ó5Ò5ð	6ô ×-Ñ-¨cÓ2Ð2øô œxŸ~™~Ð.ò ;Ü ×5Ñ5°cÓ:Ð:ð;ús   Á$CÃ/Dc                 óæ   — |j                   }t        j                  «       t        j                  z   }||_         ||z
  j                  «       }|t        j                  kD  r|j                  d¬«       y y )N)r6   )Úupdate_fields)r6   r   Únowr   Ú	TOKEN_TTLÚtotal_secondsÚMIN_REFRESH_INTERVALÚsave)r"   r(   Úcurrent_expiryÚ
new_expiryÚdeltas        r	   r7   zTokenAuthentication.renew_tokenP   s_   € Ø#×*Ñ*ˆÜ—\‘\“^¤m×&=Ñ&=Ñ=ˆ
Ø&ˆ
Ôà˜nÑ,×;Ñ;Ó=ˆØ”=×5Ñ5Ò5Ø�O‰O¨+ˆOÕ6ð 6r
   c                 ó†   — |j                   j                  st        j                  t	        d«      «      ‚|j                   |fS )NzUser inactive or deleted.)r'   Ú	is_activer   r    r   )r"   r(   s     r	   r8   z!TokenAuthentication.validate_userY   s:   € Ø�‰×(Ò(Ü×1Ñ1ÜÐ-Ó.ó0ð 0à—‘ Ð,Ð,r
   c                 ó"   — t         j                  S r   )r   r   )r"   r#   s     r	   Úauthenticate_headerz'TokenAuthentication.authenticate_header_   s   € Ü×/Ñ/Ð/r
   c                 ót  — |j                   j                  j                  «       D ]—  }|j                  |j                  k7  sŒ|j                  sŒ*|j                  t        j                  «       k  sŒL|j                  «        |j                   j                  «       }t        j                  | j                  |d¬«       Œ™ |j                  �n|j                  t        j                  «       k  rM|j                   j                  «       }|j                  «        t        j                  | j                  |d¬«       yy)NÚother_token)ÚsenderÚusernameÚsourcer(   TF)r'   Úauth_token_setÚallr4   r6   r   r<   ÚdeleteÚget_usernamer   ÚsendÚ	__class__)r"   r(   rI   rK   s       r	   r0   z"TokenAuthentication._cleanup_tokenb   sð   € Ø%Ÿ?™?×9Ñ9×=Ñ=Ó?ò 	PˆKØ×!Ñ! Z×%6Ñ%6Ó6¸;×;MÓ;MØ×%Ñ%¬¯©«Ó6Ø×&Ñ&Ô(Ø*×/Ñ/×<Ñ<Ó>�HÜ!×&Ñ&¨d¯n©nØ08ÀöPð	Pð ×ÑÐ(Ø× Ñ ¤8§<¡<£>Ò1Ø%Ÿ?™?×7Ñ7Ó9�Ø×!Ñ!Ô#Ü×"Ñ"¨$¯.©.Ø,4¸\õKàØr
   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úmodelr)   r!   r7   r8   rG   r0   r   r
   r	   r   r      s,   „ ñ
ð €Eò"ò(3ò07ò-ò0ór
   r   )Úhmacr   ÚImportErrorr2   Údjango.utilsr   Údjango.utils.translationr   r   Úrest_frameworkr   Úrest_framework.authenticationr   r   Úknox.cryptor   Úknox.modelsr   Úknox.settingsr   r   Úknox.signalsr   r   r   r
   r	   ú<module>rb      sS   ððÝ#ó
 å !Ý 6Ý %÷õ #Ý !ß 2Ý &ô[Ð,õ [øð' ò ôðús   ‚A ÁAÁA