U
    I])                     @   st   d Z ddlmZm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 G dd de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.
    )absolute_importunicode_literalsN)CaseInsensitiveDictRequestgenerate_token   )
CONTENT_TYPE_FORM_URLENCODEDSIGNATURE_HMAC_SHA1SIGNATURE_HMAC_SHA256SIGNATURE_RSA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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>5   s     z?BaseEndpoint._get_signature_type_and_params.<locals>.<listcomp>zFoauth_ params must come from only 1 signaturetype but were found in %sz, Z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 )r3   r   r"   kvr   r   r   r#   d   s      z0BaseEndpoint._create_request.<locals>.<listcomp>ZAuthorizationc                 S   s    g | ]\}}|d kr||fqS )r4   r   r5   r   r   r   r#   g   s    )r   r   r   r1   r)   dictr   r*   getr   
client_keyresource_owner_keynonce	timestampZredirect_uriZverifiersignature_methodr4   r0   r.   r   )	r   uriZhttp_methodr   r   r-   r/   r.   r0   r   r   r   _create_requestD   s:    
zBaseEndpoint._create_requestc                 C   s$   | j jr |j ds t d S )Nzhttps://)r   Zenforce_sslr?   lower
startswithr   ZInsecureTransportError)r   r-   r   r   r   _check_transport_securityl   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	f 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, %s 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=   r>   r   r*   r   Zallowed_signature_methodsZInvalidSignatureMethodErrorr0   r)   int
ValueErrorabstimeZtimestamp_lifetimeZcheck_client_keyZcheck_nonce)r   r-   Ztsr   r   r   _check_mandatory_parametersr   s^    
 
z(BaseEndpoint._check_mandatory_parametersFc                 C   s   |j tkr(| j|j|}t||}n| j|j|}d }|jrp|r\| j	|j|j|}n| j
|j|j|}|j tkrt|||}n(|j tkrt|||}nt|||}|S r   )r>   r   r   Zget_rsa_keyr:   r   Zverify_rsa_sha1Zget_client_secretr;   Zget_request_token_secretZget_access_token_secretr	   Zverify_hmac_sha1r
   Zverify_hmac_sha256Zverify_plaintext)r   r-   Zis_token_requestZrsa_keyZvalid_signatureZclient_secretZresource_owner_secretr   r   r   _check_signature   sL    
 	     
 
  zBaseEndpoint._check_signature)N)F)	__name__
__module____qualname__r   r1   r@   rC   rJ   rK   r   r   r   r   r      s   
*(Br   )__doc__Z
__future__r   r   rI   Zoauthlib.commonr   r   r   r2   r   r	   r
   r   r   r   r   r   r   r   objectr   r   r   r   r   <module>   s
   0