
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
,î[s(  ã               @   sl   d Z ddlmZmZ ddlZddl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 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)ÚRequestÚgenerate_tokené   )	ÚCONTENT_TYPE_FORM_URLENCODEDÚSIGNATURE_HMACÚ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   ú/usr/lib/python3.6/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 }|j|ƒ |j|ƒ |j|ƒ ttdd„ t|t	j
|ƒft|t	j
|ƒft|t	j
|ƒffƒƒ}t|ƒdkrÀd	d
„ |D ƒ}tjddj|ƒfd�‚y|d \}}}	W n  tk
rò   tjdd�‚Y nX |||	fS )z†Extracts 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>+   s    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, )Údescriptionr   z#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   s:    






z+BaseEndpoint._get_signature_type_and_paramsc       	      C   s"  |pi }d|kr,t |d kr,t||||ƒ}nt||d|ƒ}| j|ƒ\}}}tt|ƒƒt|ƒkrjtjdd�‚t|ƒ}|jdƒ|_|jdƒ|_	|jdƒ|_
|jdƒ|_|jd	ƒ|_|jd
ƒ|_|jdƒ|_|jdƒ|_t|ƒjdƒ|_||_dd„ |D ƒ|_d|j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 )r.   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 )r/   r   )r   r0   r1   r   r   r   r   g   s   )r   r   r,   r$   Údictr   r%   Úgetr   Ú
client_keyÚresource_owner_keyÚnonceÚ	timestampZredirect_uriZverifierÚsignature_methodr/   r+   r)   r   )	r   ÚuriZhttp_methodr   r   r(   r*   r)   r+   r   r   r   Ú_create_requestD   s2    zBaseEndpoint._create_requestc             C   s&   | j jr"|jjƒ jdƒ r"tjƒ ‚d S )Nzhttps://)r   Zenforce_sslr9   Ú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rŽtjdd�‚yt|jƒ}W n  tk
r¼   tjd	d�‚Y n.X ttjƒ | ƒ| jjkrêtjd
| jj d�‚| jj|jƒ�stjdd�‚| jj|jƒ�s"tjdd�‚d S )Nz#Missing mandatory OAuth parameters.)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   r4   r6   r7   r8   r   r%   r   Zallowed_signature_methodsZInvalidSignatureMethodErrorr+   r$   ÚintÚ
ValueErrorÚabsÚtimeZtimestamp_lifetimeZcheck_client_keyZcheck_nonce)r   r(   Ztsr   r   r   Ú_check_mandatory_parametersr   sB    




z(BaseEndpoint._check_mandatory_parametersFc             C   sœ   |j tkr(| jj|j|ƒ}tj||ƒ}np| jj|j|ƒ}d }|jrp|r\| jj	|j|j|ƒ}n| jj
|j|j|ƒ}|j tkrŠtj|||ƒ}ntj|||ƒ}|S )N)r8   r	   r   Zget_rsa_keyr4   r   Zverify_rsa_sha1Zget_client_secretr5   Zget_request_token_secretZget_access_token_secretr   Zverify_hmac_sha1Zverify_plaintext)r   r(   Zis_token_requestZrsa_keyZvalid_signatureZclient_secretZresource_owner_secretr   r   r   Ú_check_signature´   s&    

	


zBaseEndpoint._check_signature)N)F)	Ú__name__Ú
__module__Ú__qualname__r   r,   r:   r=   rD   rE   r   r   r   r   r      s   
*(Br   )Ú__doc__Z
__future__r   r   rC   Zoauthlib.commonr   r   r-   r   r   r	   r
   r   r   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s
   ,