U
    #Mti                     @   s   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 e	e
dddZe
e	dddZe
e
ee
d	d
dZe
e
eee
ef  dddZdS )    N)AnyDictOptional)breturnc                 C   s   t | ddS )Nascii=)base64urlsafe_b64encodedecoderstrip)r    r   */var/www/html/luxverbi-app/media_tokens.py_b64url_encode
   s    r   )sr   c                 C   s,   ddt | d  d  }t| | dS )Nr      r   )lenr	   urlsafe_b64decodeencode)r   padr   r   r   _b64url_decode   s    r   )filenamesecretttl_secondsr   c           
      C   s   | rd| ksd| ksd| kr$t dtt }|tdt| }| |d}tj|ddd	d
}t|}t	|d
|dt
j }t|}	| d|	 S )z
    Token = <payload_b64>.<sig_b64>
    payload = {"f": filename, "exp": unix_ts}
    sig = HMAC-SHA256(secret, payload_b64)
    /\..Z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_b64r   r   r   make_media_token   s    
 r7   )tokenr   r   c           
      C   s  | rd| krdS z|  dd\}}W n tk
r:   Y dS X t|d|dtj }t|}t	||stdS zt
|}t|d}W n tk
r   Y dS X t|dpd}|dkstt |krdS |d}	|	rd	|	ksd
|	ksd|	krdS |S )uB   
    Devuelve payload dict si OK; None si inválido/caducado.
    r%   Nr   r$   r   r   r   r   r   r   r   )splitr&   r,   r-   r   r.   r/   r0   r   compare_digestr   r*   loadsr   	Exceptionr'   getr(   )
r8   r   r4   r6   r5   Zexpected_sig_b64r3   r2   r   r   r   r   r   verify_media_token*   s,     
$r>   )r	   r.   r,   r*   r(   typingr   r   r   bytesstrr   r   r'   r7   r>   r   r   r   r   <module>   s   