o
    e                     @   s  d dl Z d dlmZ d dlmZ ddlT e jjdkrdndZ	e	r1d d	l
m
Z
mZmZ d d
lmZ nd d	lm
Z
mZmZ d dlmZ dd Zdd Zdd Zdd ZdddZdd Zdd Zeeeejedddge ge ee!geejgeejgeejgdd ddZ"dS )!    N)new)sha256   )*   TF)urlparse
urlunparseparse_qs)encodestring)encodebytesc                 C   sr   t | trddd t| D S t | tttfrt| S t | tr)dd | D S t	dkr7t | t
r7| dS | S )N c                 s   s    | ]}t |V  qd S N)chr.0x r   K/var/www/html/venv/lib/python3.10/site-packages/plivo/utils/signature_v3.py	<genexpr>   s    z string_format.<locals>.<genexpr>c                 S   s   g | ]}t |qS r   )string_formatr   r   r   r   
<listcomp>   s    z!string_format.<locals>.<listcomp>Tutf-8)
isinstancebytesjoin	bytearrayintfloatboolstrlistPY2unicodedecode)valuer   r   r   r      s   


r   c                 C   s4   t  }t| dd D ]\}}t||t|< q|S )NT)keep_blank_values)dictr	   itemsr   )queryres_mapkeyr$   r   r   r   get_map_from_query   s   r+   c              	      sx   t |  }g }|D ], |   }t|tr)|d fddt t|D  q
|dt t| q
d|S )N&c                       g | ]
}d  t |qS ){}={}formatr   r   valr*   r   r   r   *       z+get_sorted_query_string.<locals>.<listcomp>r.   )sortedkeysr   r    appendr   r   r0   paramsr6   
res_paramsr$   r   r3   r   get_sorted_query_string#   s   

r;   c              	      s   t |  }g }|D ]? |   }t|tr)|d fddt t|D  q
t|tr<|dt t	| q
|dt t| q
d|S )Nr   c                    r-   ){}{}r/   r1   r3   r   r   r   7   r4   z,get_sorted_params_string.<locals>.<listcomp>r<   )
r5   r6   r   r    r7   r   r   r&   r0   get_sorted_params_stringr8   r   r3   r   r=   0   s   


r=   c                 C   s   t | d}t|jd|jd|jddddfd}|t|j	 t
|}t|dks4|s=|td| d }t|dkrL|sL|tdd }|S )Nr   r   r   ?.)r   encoder   schemer#   netlocpathupdater+   r(   r;   lenr   )urir9   empty_post_params
parsed_uribase_urlquery_paramsr   r   r   construct_get_url?   s   
rK   c                 C   s0   t | t t|dkrdnd}|tt|d S )Nr   TFr   )rK   r&   rE   r   r=   )rF   r9   rI   r   r   r   construct_post_urlO   s   rL   c                 C   sf   t dt|t|d}ztt| |t  W S  ty2   ttt | d|t   Y S w )Nz{}.{}r   )	r   r0   r   r@   signr   digeststrip	TypeError)
auth_tokenrI   noncer   r   r   get_signature_v3T   s   "rS   )POSTGET)case_sensitive)methodrF   r9   rR   rQ   v3_signaturec                 C   sn   |du rt  }t|d}t|d}t|d}| dkr%t||nt||}t|||}||dv S )a  
        Validates V3 Signature received from Plivo to your server

        :param method: Your callback method
        :param uri: Your callback URL
        :param params: Params received in callback from Plivo
        :param nonce: X-Plivo-Signature-V3-Nonce header
        :param v3_signature: X-Plivo-Signature-V3 header
        :param auth_token: (Sub)Account auth token

        :return: True if the request matches signature, False otherwise
    Nr   rU      ,)r&   r   r@   rK   rL   rS   split)rW   rF   rR   rQ   rX   r9   rI   	signaturer   r   r   validate_v3_signature\   s   r\   )Tr   )#syshmacr   rM   hashlibr   
validatorsversion_infomajorr!   r   r   r	   base64r
   r@   urllib.parser   r   r+   r;   r=   rK   rL   rS   validate_argsall_ofof_typesix	text_typeis_inis_urloptionalr&   r\   r   r   r   r   <module>   s4    



