o
    a{-                     @   sr   d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ G dd dZdS )z
oauthlib.oauth1.rfc5849.endpoints.base
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This module is an implementation of various logic needed
for signing and checking OAuth 1.0 RFC 5849 requests.
    N)CaseInsensitiveDictRequestgenerate_token   )CONTENT_TYPE_FORM_URLENCODEDSIGNATURE_HMAC_SHA1SIGNATURE_HMAC_SHA256SIGNATURE_HMAC_SHA512SIGNATURE_RSA_SHA1SIGNATURE_RSA_SHA256SIGNATURE_RSA_SHA512SIGNATURE_PLAINTEXTSIGNATURE_TYPE_AUTH_HEADERSIGNATURE_TYPE_BODYSIGNATURE_TYPE_QUERYerrors	signatureutilsc                   @   s@   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdddZdS )BaseEndpointNc                 C   s   || _ |pt| _d S N)request_validatorr   token_generator)selfr   r    r   H/usr/lib/python3/dist-packages/oauthlib/oauth1/rfc5849/endpoints/base.py__init__   s   zBaseEndpoint.__init__c           
   
   C   s   t j|jddd}t j|jdd}t j|jdd}g }|| || || ttdd t|t	
|ft|t	
|ft|t	
|ff}t|dkr`d	d
 |D }tjdd|fdz	|d \}}}	W n tyv   tjddw |||	fS )zExtracts parameters from query, headers and body. Signature type
        is set to the source in which parameters were found.
        FT)headersexclude_oauth_signature
with_realm)bodyr   )	uri_queryr   c                 S   s   | d S )Nr   r   )sr   r   r   <lambda>-   s    z=BaseEndpoint._get_signature_type_and_params.<locals>.<lambda>   c                 S   s   g | ]}|d  qS )r   r   ).0r!   r   r   r   
<listcomp>7   s    z?BaseEndpoint._get_signature_type_and_params.<locals>.<listcomp>zFoauth_ params must come from only 1 signaturetype but were found in %sz, descriptionr   #Missing mandatory OAuth parameters.)r   collect_parametersr   r   r    extendlistfilterr   r   filter_oauth_paramsr   r   lenr   InvalidRequestErrorjoin
IndexError)
r   requestheader_paramsbody_paramsquery_paramsparams!signature_types_with_oauth_paramsfound_typessignature_typeoauth_paramsr   r   r   _get_signature_type_and_params   sR   



	
z+BaseEndpoint._get_signature_type_and_paramsc           	      C   s$  t |pi }d|v rt|d v rt||||}nt||d|}| |\}}}tt|t|kr7tjddt|}|d|_	|d|_
|d|_|d|_|d	|_|d
|_|d|_|d|_t|d|_||_dd |D |_d|jddv rdd |jD |_|S )NzContent-Type zDuplicate OAuth1 entries.r&   oauth_signatureoauth_consumer_keyoauth_tokenoauth_nonceoauth_timestampoauth_callbackoauth_verifieroauth_signature_methodrealmc                 S       g | ]\}}|d kr||fqS )r=   r   r$   kvr   r   r   r%   f   s     z0BaseEndpoint._create_request.<locals>.<listcomp>Authorizationc                 S   rF   )rE   r   rG   r   r   r   r%   i   s    )r   r   r   r;   r.   dictr   r/   getr   
client_keyresource_owner_keynonce	timestampredirect_uriverifiersignature_methodrE   r:   r6   r   )	r   urihttp_methodr   r   r2   r9   r6   r:   r   r   r   _create_requestF   s:   
zBaseEndpoint._create_requestc                 C   s(   | j jr|j dst d S d S )Nzhttps://)r   enforce_sslrT   lower
startswithr   InsecureTransportError)r   r2   r   r   r   _check_transport_securityn   s
   z&BaseEndpoint._check_transport_securityc                 C   s  t |j|j|j|j|jfstjdd|j| jj	vr(tj
d|j| jj	dd|jv r:|jd dkr:tjddt|jdkrGtjddzt|j}W n ty[   tjd	dw tt | | jjkrrtjd
| jj d| j|jstjdd| j|jstjddd S )Nr(   r&   z"Invalid signature, {} not in {!r}.oauth_versionz1.0zInvalid OAuth version.
   zInvalid timestamp sizezTimestamp must be an integer.zCTimestamp given is invalid, differ from allowed by over %s seconds.zInvalid client key format.zInvalid nonce format.)allr   rM   rO   rP   rS   r   r/   r   allowed_signature_methodsInvalidSignatureMethodErrorformatr:   r.   int
ValueErrorabstimetimestamp_lifetimecheck_client_keycheck_nonce)r   r2   tsr   r   r   _check_mandatory_parameterst   s`   

z(BaseEndpoint._check_mandatory_parametersFc                 C   sD  |j tks|j tks|j tkrB| j|j|}|j tkr$t||}|S |j tkr1t	||}|S |j tkr>t
||}|S d}|S | j|j|}d }|jrf|r\| j|j|j|}n
| j|j|j|}|j tkrtt|||}|S |j tkrt|||}|S |j tkrt|||}|S |j tkrt|||}|S d}|S )NF)rS   r
   r   r   r   get_rsa_keyrM   r   verify_rsa_sha1verify_rsa_sha256verify_rsa_sha512get_client_secretrN   get_request_token_secretget_access_token_secretr   verify_hmac_sha1r   verify_hmac_sha256r	   verify_hmac_sha512r   verify_plaintext)r   r2   is_token_requestrsa_keyvalid_signatureclient_secretresource_owner_secretr   r   r   _check_signature   sr   

1
/
-+



zBaseEndpoint._check_signaturer   )F)	__name__
__module____qualname__r   r;   rV   r[   rj   r{   r   r   r   r   r      s    
*(Br   )__doc__re   oauthlib.commonr   r   r   r<   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s
   @	