Ë
    #Mtiž  ã            	       óœ   — d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ de	de
fd„Zde
de	fd„Zde
d	e
d
ede
fd„Zde
d	e
deee
ef      fd„Zy)é    N)ÚAnyÚDictÚOptionalÚbÚreturnc                 óh   — t        j                  | «      j                  d«      j                  d«      S )NÚasciiú=)Úbase64Úurlsafe_b64encodeÚdecodeÚrstrip)r   s    ú*/var/www/html/luxverbi-app/media_tokens.pyÚ_b64url_encoder   
   s)   € Ü×#Ñ# AÓ&×-Ñ-¨gÓ6×=Ñ=¸cÓBÐBó    Úsc                 ó~   — ddt        | «      dz  z
  dz  z  }t        j                  | |z   j                  d«      «      S )Nr
   é   r	   )Úlenr   Úurlsafe_b64decodeÚencode)r   Úpads     r   Ú_b64url_decoder      s>   € à
�!”s˜1“v ‘zÑ" aÑ'Ñ
(€CÜ×#Ñ# Q¨¡W×$4Ñ$4°WÓ$=Ó>Ð>r   ÚfilenameÚsecretÚttl_secondsc                 óÒ  — | rd| v sd| v sd| v rt        d«      ‚t        t        j                  «       «      }|t        dt        |«      «      z   }| |dœ}t	        j
                  |dd¬	«      j                  d
«      }t        |«      }t        j                  |j                  d
«      |j                  d«      t        j                  «      j                  «       }t        |«      }	|› d|	› �S )z‚
    Token = <payload_b64>.<sig_b64>
    payload = {"f": filename, "exp": unix_ts}
    sig = HMAC-SHA256(secret, payload_b64)
    ú/ú\ú..Úinvalid_filenameé   )ÚfÚexp)ú,ú:T)Ú
separatorsÚ	sort_keysúutf-8r	   ú.)Ú
ValueErrorÚintÚtimeÚmaxÚjsonÚdumpsr   r   ÚhmacÚnewÚhashlibÚsha256Údigest)
r   r   r   Únowr$   ÚpayloadÚpayload_jsonÚpayload_b64ÚmacÚsig_b64s
             r   Úmake_media_tokenr<      sÍ   € ñ �s˜h‘¨$°(Ñ*:¸dÀhÑ>NÜÐ+Ó,Ð,ä
Œd�i‰i‹kÓ
€CØ
”�A”s˜;Ó'Ó(Ñ
(€Cà SÑ)€GÜ—:‘:˜g°*ÈÔM×TÑTÐU\Ó]€LÜ  Ó.€Kä
�(‰(�6—=‘= Ó)¨;×+=Ñ+=¸gÓ+FÌÏÉÓ
W×
^Ñ
^Ó
`€CÜ˜SÓ!€Gàˆ]˜!˜G˜9Ð%Ð%r   Útokenc                 óŠ  — | rd| vry	 | j                  dd«      \  }}t        j                  |j	                  d«      |j	                  d«      t
        j                  «      j                  «       }t        |«      }t        j                  ||«      sy	 t        |«      }t        j                  |j                  d«      «      }t        |j!                  d«      xs d«      }|dk  s t        t#        j"                  «       «      |kD  ry|j!                  d«      }	|	rd	|	v sd
|	v sd|	v ry|S # t        $ r Y yw xY w# t        $ r Y yw xY w)uB   
    Devuelve payload dict si OK; None si invÃ¡lido/caducado.
    r*   Nr"   r)   r	   r$   r   r#   r   r   r    )Úsplitr+   r1   r2   r   r3   r4   r5   r   Úcompare_digestr   r/   Úloadsr   Ú	Exceptionr,   Úgetr-   )
r=   r   r9   r;   r:   Úexpected_sig_b64r8   r7   r$   r#   s
             r   Úverify_media_tokenrE   *   s3  € ñ �C˜uÑ$ØðØ$Ÿ{™{¨3°Ó2Ñˆ�Wô
 �(‰(�6—=‘= Ó)¨;×+=Ñ+=¸gÓ+FÌÏÉÓ
W×
^Ñ
^Ó
`€CÜ% cÓ*Ðô ×ÑÐ/°Ô9ØðÜ% kÓ2ˆÜ—*‘*˜\×0Ñ0°Ó9Ó:ˆô
 ˆg�k‰k˜%Ó Ò% AÓ
&€CØ
ˆa‚x”3”t—y‘y“{Ó# cÒ)Øð 	�‰�CÓ€AÙ��q‘˜D A™I¨°©Øà€Nøô9 ò Ùðûô ò Ùðús#   ‰D' Â/D6 Ä'	D3Ä2D3Ä6	EÅE)r   r3   r1   r/   r-   Útypingr   r   r   ÚbytesÚstrr   r   r,   r<   rE   © r   r   ú<module>rJ      s‹   ðã Û Û Û Û ß &Ñ &ðC�eð C ó Cð?�cð ?˜eó ?ð& #ð &¨sð &Àð &Èó &ð,%˜cð %¨3ð %°8¸DÀÀcÀ¹NÑ3Kô %r   