U
    n/e6                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
mZmZ d dlmZ G dd deZdd Zdd	d
ZG dd deZdd ZdddZdd ZdddZdS )    N)UnknownClientMethodError)RequestSignerS3PostPresignerUnknownSignatureVersionError UnsupportedSignatureVersionError_should_use_global_endpointcreate_request_objectprepare_request_dict)	ArnParserc                   @   s@   e Zd ZdddZdddZdd Zdd	d
ZeZdddZdS )AioRequestSignerNc                    s   |  ||I d H S )N)sign)selfoperation_namerequestkwargs r   7/tmp/pip-unpacked-wheel-8mnez3y6/aiobotocore/signers.pyhandler   s    zAioRequestSigner.handlerstandardc              
      s0  |}|d kr| j }|d kr | j}| |||jI d H }| jjd| j |||| j || |dI d H  |t	j
kr,|||d}	|d k	r||	d< |jdi }
|s|
dr|
d |	d< |
dr|
d |	d< z| jf |	I d H }W n> tk
r  } z|d	krt|d
n|W 5 d }~X Y nX || d S )Nzbefore-sign.{}.{})r   signing_nameregion_namesignature_versionrequest_signerr   )r   r   r   expiressigningregionr   r   r   r   )_region_name_signing_name_choose_signercontext_event_emitteremitformat_service_id	hyphenizebotocoreUNSIGNEDgetget_auth_instancer   r   Zadd_auth)r   r   r   r   signing_type
expires_inr   Zexplicit_region_namer   r   Zsigning_contextauther   r   r   r      sV    	  
 

zAioRequestSigner.signc                    s   ddd}| |d}| dp$| j}| di }| d| j}| d| j}	|tjk	rj||sj||7 }| jjd		| j
 |||	||d
I d H \}
}|d k	r|}|tjk	r||s||7 }|S )Nz-presign-postz-query)presign-postpresign-url Z	auth_typer   r   r   zchoose-signer.{}.{})r   r   r   r    )r(   _signature_versionr   r   r&   r'   endswithr!   Zemit_until_responser#   r$   r%   )r   r   r*   r    Zsigning_type_suffix_mapsuffixr   r   r   r   r   responser   r   r   r   T   s>     
zAioRequestSigner._choose_signerc           	         s   |d kr| j }tjj|}|d kr.t|d|jdkrbd }| jd k	rV| j I d H }||}|S d }| j	d k	r| j	
 I d H }||d< |jr| jd krtj ||d< ||d< |f |}|S )Nr   Tcredentialsr   Zservice_name)r1   r&   r,   ZAUTH_TYPE_MAPSr(   r   ZREQUIRES_TOKENZ_auth_tokenZget_frozen_tokenZ_credentialsZget_frozen_credentialsZREQUIRES_REGIONr   
exceptionsZNoRegionError)	r   r   r   r   r   clsZfrozen_tokenr,   Zfrozen_credentialsr   r   r   r)   }   s2    





z"AioRequestSigner.get_auth_instance  c                    s0   t |}| |||d||I d H  |  |jS )Nr/   )r   r   prepareurl)r   request_dictr   r+   r   r   r   r   r   r   generate_presigned_url   s    
	z'AioRequestSigner.generate_presigned_url)NN)Nr   NN)N)r8   NN)	__name__
__module____qualname__r   r   r   r)   Zget_authr<   r   r   r   r   r      s   
    
:* 
"   r   c                 K   s   t | d< d S )Ngenerate_db_auth_token)r@   Zclass_attributesr   r   r   r   add_generate_db_auth_token   s    rB   c                    sz   |}|dkr| j j}d|d}ddi |dd}d}| | d	| }	t||	 | jjd||d
ddI dH }
|
t|d S )a  Generates an auth token used to connect to a db with IAM credentials.

    :type DBHostname: str
    :param DBHostname: The hostname of the database to connect to.

    :type Port: int
    :param Port: The port number the database is listening on.

    :type DBUsername: str
    :param DBUsername: The username to log in as.

    :type Region: str
    :param Region: The region the database is in. If None, the client
        region will be used.

    :return: A presigned url which can be used as an auth token.
    Nconnect)ActionZDBUser/r0   GET)Zurl_pathZquery_stringheadersbodymethodzhttps://:i  zrds-db)r   r;   r   r+   r   )metar   r	   _request_signerr<   len)r   Z
DBHostnameZPortZ
DBUsernameZRegionr   paramsr;   schemeendpoint_urlZpresigned_urlr   r   r   r@      s.    
r@   c                   @   s   e Zd ZdddZdS )AioS3PostPresignerNr8   c                    s   |d kri }|d krg }i }t j  }|t j|d }|tjj|d< g |d< |D ]}	|d |	 qTt|}
||
j	d< ||
j	d< | j
d|
|dI d H  |
j|dS )	N)secondsZ
expiration
conditionszs3-presign-post-fieldszs3-presign-post-policyZ	PutObjectr.   )r:   fields)datetimeutcnow	timedeltastrftimer&   r,   ZISO8601appendr   r    rL   r   r:   )r   r;   rT   rS   r+   r   policyZdatetime_nowZexpire_date	conditionr   r   r   r   generate_presigned_post   s*    


   
z*AioS3PostPresigner.generate_presigned_post)NNr8   N)r=   r>   r?   r\   r   r   r   r   rQ      s
       rQ   c                 K   s   t | d< d S )Nr<   )r<   rA   r   r   r   add_generate_presigned_url  s    r]   r8   c                    s   |}|}|dkri }|}|}dt | d}	| j}
z| j| }W n tk
r\   t|dY nX | jj|}| j|||	dI dH }t	
|dd}| j|||	| dI dH \}}| j||||	|d	d
I dH }|dk	r||d< |
j|||dI dH S )ax  Generate a presigned url given a client, its method, and arguments

    :type ClientMethod: string
    :param ClientMethod: The client method to presign for

    :type Params: dict
    :param Params: The parameters normally passed to
        ``ClientMethod``.

    :type ExpiresIn: int
    :param ExpiresIn: The number of seconds the presigned url is valid
        for. By default it expires in an hour (3600 seconds)

    :type HttpMethod: string
    :param HttpMethod: The http method to use on the generated url. By
        default, the http method is whatever is used in the method's model.

    :returns: The presigned url
    NTZis_presign_requestZuse_global_endpoint)method_name
api_paramsoperation_modelr    Bucketr0   Zignore_signing_regionFra   rb   rP   r    rG   Zset_user_agent_headerrI   )r;   r+   r   )r   rL   Z_PY_TO_OP_NAMEKeyErrorr   rK   service_modelrb   _emit_api_paramsr
   is_arnr(   _resolve_endpoint_ruleset_convert_to_request_dictr<   )r   ZClientMethodZParams	ExpiresInZ
HttpMethodZclient_methodrN   r+   Zhttp_methodr    r   r   rb   bucket_is_arnrP   additional_headersr;   r   r   r   r<     sT    
r<   c                 K   s   t | d< d S )Nr\   )r\   rA   r   r   r   add_generate_presigned_postj  s    ro   c                    s(  |}|}|}|}	|}
|d kr"i }n|  }|	d kr6g }	dt| d}t| j}| jjd}| jd|i||dI d H }t	|
dd}| j|||| dI d H \}}| j|||||dd	I d H }|	d
|i |dr|	dd|d td  g n|	d|i ||d< |j|||	|
dI d H S )NTr^   ZCreateBucketrc   r`   r0   rd   Fre   bucketz${filename}zstarts-withz$keykey)r;   rT   rS   r+   )copyr   rQ   rL   rK   rg   rb   rh   r
   ri   r(   rj   rk   rY   r2   rM   r\   )r   rc   ZKeyZFieldsZ
Conditionsrl   rp   rq   rT   rS   r+   r    Zpost_presignerrb   rN   rm   rP   rn   r;   r   r   r   r\   n  s\    


 r\   )N)Nr8   N)NNr8   )rU   r&   Zbotocore.authZbotocore.exceptionsr   Zbotocore.signersr   r   r   r   r   r   r	   Zbotocore.utilsr
   r   rB   r@   rQ   r]   r<   ro   r\   r   r   r   r   <module>   s*   $	 & 
8(     
K     