U
    5du-                     @   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_PLAINTEXTSIGNATURE_RSA_SHA1SIGNATURE_RSA_SHA256SIGNATURE_RSA_SHA512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   J/tmp/pip-unpacked-wheel-g6yohpa1/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rd	d
 |D }tjdd|fdz|d \}}}	W n  tk
r   tjddY nX |||	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_signatureZ
with_realm)bodyr   )	uri_queryr   c                 S   s   | d S )Nr   r   )sr   r   r   <lambda>,       z=BaseEndpoint._get_signature_type_and_params.<locals>.<lambda>   c                 S   s   g | ]}|d  qS )r   r   ).0r   r   r   r   
<listcomp>6   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   Zcollect_parametersr   r   r   extendlistfilterr   r   Zfilter_oauth_paramsr   r   lenr   InvalidRequestErrorjoin
IndexError)
r   requestZheader_paramsZbody_paramsZquery_paramsparamsZ!signature_types_with_oauth_paramsZ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|kr0t|d kr0t||||}nt||d|}| |\}}}tt|t|krntjddt|}|d|_	|d|_
|d|_|d|_|d	|_|d
|_|d|_|d|_t|d|_||_dd |D |_d|jddkr"dd |jD |_|S )NzContent-Type zDuplicate OAuth1 entries.r%   oauth_signatureZoauth_consumer_keyZoauth_tokenZoauth_nonceZoauth_timestampZoauth_callbackZoauth_verifierZoauth_signature_methodrealmc                 S   s    g | ]\}}|d kr||fqS )r5   r   r#   kvr   r   r   r$   e   s      z0BaseEndpoint._create_request.<locals>.<listcomp>Authorizationc                 S   s    g | ]\}}|d kr||fqS )r6   r   r7   r   r   r   r$   h   s    )r   r   r   r3   r+   dictr   r,   getr   
client_keyresource_owner_keynonce	timestampZredirect_uriZverifiersignature_methodr6   r2   r0   r   )	r   uriZhttp_methodr   r   r/   r1   r0   r2   r   r   r   _create_requestE   s:    
zBaseEndpoint._create_requestc                 C   s$   | j jr |j ds t d S )Nzhttps://)r   Zenforce_sslrB   lower
startswithr   ZInsecureTransportError)r   r/   r   r   r   _check_transport_securitym   s    z&BaseEndpoint._check_transport_securityc                 C   s&  t |j|j|j|j|jfs(tjdd|j| jj	krPtj
d|j| jj	dd|jkrt|jd dkrttjddt|jdkrtjddzt|j}W n  tk
r   tjd	dY n.X tt | | jjkrtjd
| jj d| j|jstjdd| j|js"tjddd S )Nr'   r%   z"Invalid signature, {} not in {!r}.Z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   r=   r?   r@   rA   r   r,   r   Zallowed_signature_methodsZInvalidSignatureMethodErrorformatr2   r+   int
ValueErrorabstimeZtimestamp_lifetimeZcheck_client_keyZcheck_nonce)r   r/   tsr   r   r   _check_mandatory_parameterss   s^    
 
z(BaseEndpoint._check_mandatory_parametersFc                 C   s8  |j tks|j tks|j tkr|| j|j|}|j tkrFt||}n4|j tkr^t	||}n|j tkrvt
||}nd}n| j|j|}d }|jr|r| j|j|j|}n| j|j|j|}|j tkrt|||}nV|j tkrt|||}n<|j tkrt|||}n |j tkr0t|||}nd}|S )NF)rA   r   r   r   r   Zget_rsa_keyr=   r   Zverify_rsa_sha1Zverify_rsa_sha256Zverify_rsa_sha512Zget_client_secretr>   Zget_request_token_secretZget_access_token_secretr   Zverify_hmac_sha1r   Zverify_hmac_sha256r	   Zverify_hmac_sha512r
   Zverify_plaintext)r   r/   Zis_token_requestZrsa_keyZvalid_signatureZclient_secretZresource_owner_secretr   r   r   _check_signature   sz    
 


   
  
      zBaseEndpoint._check_signature)N)F)	__name__
__module____qualname__r   r3   rC   rF   rO   rP   r   r   r   r   r      s   
*(Br   )__doc__rM   Zoauthlib.commonr   r   r   r4   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   @