U
    ÒZj–s  ã                   @   sè   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
 d dlmZmZmZ d dlmZmZ d dlmZ G dd„ dƒZG d	d
„ d
ƒZdd„ Zddd„ZG dd„ dƒZdd„ Zddd„Zdd„ Zddd„Zdd„ ZdS )é    N)Úcreate_request_objectÚprepare_request_dict)ÚOrderedDict)ÚUnknownClientMethodErrorÚUnknownSignatureVersionErrorÚ UnsupportedSignatureVersionError)Ú	ArnParserÚdatetime2timestamp)Úfix_s3_hostc                   @   sr   e Zd ZdZddd„Zedd„ ƒZedd„ ƒZed	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 )ÚRequestSignera0  
    An object to sign requests before they go out over the wire using
    one of the authentication mechanisms defined in ``auth.py``. This
    class fires two events scoped to a service and operation name:

    * choose-signer: Allows overriding the auth signer name.
    * before-sign: Allows mutating the request before signing.

    Together these events allow for customization of the request
    signing pipeline, including overrides, request path manipulation,
    and disabling signing per operation.


    :type service_id: botocore.model.ServiceId
    :param service_id: The service id for the service, e.g. ``S3``

    :type region_name: string
    :param region_name: Name of the service region, e.g. ``us-east-1``

    :type signing_name: string
    :param signing_name: Service signing name. This is usually the
                         same as the service name, but can differ. E.g.
                         ``emr`` vs. ``elasticmapreduce``.

    :type signature_version: string
    :param signature_version: Signature name like ``v4``.

    :type credentials: :py:class:`~botocore.credentials.Credentials`
    :param credentials: User credentials with which to sign requests.

    :type event_emitter: :py:class:`~botocore.hooks.BaseEventHooks`
    :param event_emitter: Extension mechanism to fire events.
    Nc                 C   s4   || _ || _|| _|| _|| _|| _t |¡| _d S ©N)	Ú_region_nameÚ_signing_nameÚ_signature_versionÚ_credentialsÚ_auth_tokenÚ_service_idÚweakrefÚproxyÚ_event_emitter)ÚselfZ
service_idÚregion_nameÚsigning_nameÚsignature_versionÚcredentialsZevent_emitterZ
auth_token© r   úS/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/botocore/signers.pyÚ__init__D   s    
zRequestSigner.__init__c                 C   s   | j S r   )r   ©r   r   r   r   r   X   s    zRequestSigner.region_namec                 C   s   | j S r   )r   r   r   r   r   r   \   s    zRequestSigner.signature_versionc                 C   s   | j S r   )r   r   r   r   r   r   `   s    zRequestSigner.signing_namec                 K   s   |   ||¡S r   )Úsign)r   Úoperation_nameÚrequestÚkwargsr   r   r   Úhandlerd   s    zRequestSigner.handlerÚstandardc              
   C   s  |}|dkr| j }|dkr | j}|  |||j¡}| jjd | j ¡ |¡||| j || |d� |t	j
k�r|||dœ}	|dk	r‚||	d< |j di ¡}
|sª|
 d¡rª|
d |	d< |
 d	¡rÀ|
d	 |	d	< z| jf |	Ž}W n< tk
�r } z|d
krøt|d�‚n|‚W 5 d}~X Y nX | |¡ dS )a<  Sign a request before it goes out over the wire.

        :type operation_name: string
        :param operation_name: The name of the current operation, e.g.
                               ``ListBuckets``.
        :type request: AWSRequest
        :param request: The request object to be sent over the wire.

        :type region_name: str
        :param region_name: The region to sign the request for.

        :type signing_type: str
        :param signing_type: The type of signing to perform. This can be one of
            three possible values:

            * 'standard'     - This should be used for most requests.
            * 'presign-url'  - This should be used when pre-signing a request.
            * 'presign-post' - This should be used when pre-signing an S3 post.

        :type expires_in: int
        :param expires_in: The number of seconds the presigned url is valid
            for. This parameter is only valid for signing type 'presign-url'.

        :type signing_name: str
        :param signing_name: The name to use for the service when signing.
        Nzbefore-sign.{}.{})r!   r   r   r   Úrequest_signerr    )r   r   r   ÚexpiresÚsigningÚregionr   r   r$   ©r   )r   r   Ú_choose_signerÚcontextr   ÚemitÚformatr   Ú	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   k   sV    #  ÿ ÿ÷ý
ÿzRequestSigner.signc                 C   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
�\}
}|dk	rº|}|tjk	rº| |¡sº||7 }|S )ai  
        Allow setting the signature version via the choose-signer event.
        A value of `botocore.UNSIGNED` means no signing will be performed.

        :param operation_name: The operation to sign.
        :param signing_type: The type of signing that the signer is to be used
            for.
        :return: The signature version to sign with.
        z-presign-postz-query)úpresign-postúpresign-urlÚ Z	auth_typer'   r   r(   zchoose-signer.{}.{})r   r   r   r+   N)r1   r   r   r   r/   r0   Úendswithr   Zemit_until_responser-   r   r.   )r   r    r3   r+   Zsigning_type_suffix_mapÚsuffixr   r'   r   r   r#   Úresponser   r   r   r*   ¿   s>    þÿþ ÿù

ÿþzRequestSigner._choose_signerc           	      K   s´   |dkr| j }tjj |¡}|dkr.t|d�‚|jdkr\d}| jdk	rP| j ¡ }||ƒ}|S d}| j	dk	rt| j	 
¡ }||d< |jr¦| jdkr–tj ¡ ‚||d< ||d< |f |Ž}|S )a©  
        Get an auth instance which can be used to sign a request
        using the given signature version.

        :type signing_name: string
        :param signing_name: Service signing name. This is usually the
                             same as the service name, but can differ. E.g.
                             ``emr`` vs. ``elasticmapreduce``.

        :type region_name: string
        :param region_name: Name of the service region, e.g. ``us-east-1``

        :type signature_version: string
        :param signature_version: Signature name like ``v4``.

        :rtype: :py:class:`~botocore.auth.BaseSigner`
        :return: Auth instance to sign a request.
        Nr)   Tr   r   Úservice_name)r   r/   r5   ZAUTH_TYPE_MAPSr1   r   ZREQUIRES_TOKENr   Zget_frozen_tokenr   Zget_frozen_credentialsZREQUIRES_REGIONr   Ú
exceptionsZNoRegionError)	r   r   r   r   r"   ÚclsZfrozen_tokenr5   Zfrozen_credentialsr   r   r   r2   ñ   s0    ÿ







zRequestSigner.get_auth_instanceé  c                 C   s*   t |ƒ}|  |||d||¡ | ¡  |jS )aÍ  Generates a presigned url

        :type request_dict: dict
        :param request_dict: The prepared request dictionary returned by
            ``botocore.awsrequest.prepare_request_dict()``

        :type operation_name: str
        :param operation_name: The operation being signed.

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

        :type region_name: string
        :param region_name: The region name to sign the presigned url.

        :type signing_name: str
        :param signing_name: The name to use for the service when signing.

        :returns: The presigned url
        r8   )r   r   ÚprepareÚurl)r   Úrequest_dictr    r4   r   r   r!   r   r   r   Úgenerate_presigned_url)  s    ú	z$RequestSigner.generate_presigned_url)N)NN)Nr$   NN)N)r@   NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpropertyr   r   r   r#   r   r*   r2   Zget_authrD   r   r   r   r   r   !   s.   * ø




    ù
T3 ÿ
6   úr   c                   @   s<   e Zd ZdZdd„ Zddd„Zdd„ Zdd	d
„Zdd„ ZdS )ÚCloudFrontSigneraà  A signer to create a signed CloudFront URL.

    First you create a cloudfront signer based on a normalized RSA signer::

        import rsa
        def rsa_signer(message):
            private_key = open('private_key.pem', 'r').read()
            return rsa.sign(
                message,
                rsa.PrivateKey.load_pkcs1(private_key.encode('utf8')),
                'SHA-1')  # CloudFront requires SHA-1 hash
        cf_signer = CloudFrontSigner(key_id, rsa_signer)

    To sign with a canned policy::

        signed_url = cf_signer.generate_signed_url(
            url, date_less_than=datetime(2015, 12, 1))

    To sign with a custom policy::

        signed_url = cf_signer.generate_signed_url(url, policy=my_policy)
    c                 C   s   || _ || _dS )a–  Create a CloudFrontSigner.

        :type key_id: str
        :param key_id: The CloudFront Key Pair ID

        :type rsa_signer: callable
        :param rsa_signer: An RSA signer.
               Its only input parameter will be the message to be signed,
               and its output will be the signed content as a binary string.
               The hash algorithm needed by CloudFront is SHA-1.
        N)Úkey_idÚ
rsa_signer)r   rK   rL   r   r   r   r   l  s    zCloudFrontSigner.__init__Nc           	      C   sÌ   |dk	o|dk	}|dko|dk}|s(|r4d}t |ƒ‚|dk	rH|  ||¡}t|tƒr\| d¡}|dk	rxdtt|ƒƒ g}nd|  |¡ d¡ g}|  	|¡}| 
d|  |¡ d¡› �d| j› �g¡ |  ||¡S )a¤  Creates a signed CloudFront URL based on given parameters.

        :type url: str
        :param url: The URL of the protected object

        :type date_less_than: datetime
        :param date_less_than: The URL will expire after that date and time

        :type policy: str
        :param policy: The custom policy, possibly built by self.build_policy()

        :rtype: str
        :return: The signed URL.
        Nz=Need to provide either date_less_than or policy, but not bothÚutf8z
Expires=%sz	Policy=%sz
Signature=zKey-Pair-Id=)Ú
ValueErrorÚbuild_policyÚ
isinstanceÚstrÚencodeÚintr	   Ú_url_b64encodeÚdecoderL   ÚextendrK   Ú
_build_url)	r   rB   Údate_less_thanÚpolicyZboth_args_suppliedZneither_arg_suppliedr6   ÚparamsÚ	signaturer   r   r   rD   {  s&    



þÿz'CloudFrontSigner.generate_presigned_urlc                 C   s"   d|krdnd}|| d  |¡ S )Nú?ú&)Újoin)r   Úbase_urlZextra_paramsÚ	separatorr   r   r   rW   ¡  s    zCloudFrontSigner._build_urlc           	      C   s„   t t|ƒƒ}tdd|iiƒ}|r<d|kr0|d7 }d|i|d< |rXt t|ƒƒ}d|i|d< d|fd	|fg}d
t|ƒgi}tj|dd�S )a0  A helper to build policy.

        :type resource: str
        :param resource: The URL or the stream filename of the protected object

        :type date_less_than: datetime
        :param date_less_than: The URL will expire after the time has passed

        :type date_greater_than: datetime
        :param date_greater_than: The URL will not be valid until this time

        :type ip_address: str
        :param ip_address: Use 'x.x.x.x' for an IP, or 'x.x.x.x/x' for a subnet

        :rtype: str
        :return: The policy in a compact string.
        ZDateLessThanzAWS:EpochTimeú/z/32zAWS:SourceIpZ	IpAddressZDateGreaterThanÚResourceÚ	ConditionZ	Statement)ú,ú:)Ú
separators)rS   r	   r   ÚjsonÚdumps)	r   ÚresourcerX   Zdate_greater_thanÚ
ip_addressZmomentÚ	conditionZordered_payloadZcustom_policyr   r   r   rO   ¥  s    zCloudFrontSigner.build_policyc                 C   s"   t  |¡ dd¡ dd¡ dd¡S )Nó   +ó   -ó   =ó   _ó   /ó   ~)Úbase64Ú	b64encodeÚreplace)r   Údatar   r   r   rT   Ï  s    
 ÿ þ ýÿzCloudFrontSigner._url_b64encode)NN)NN)	rE   rF   rG   rH   r   rD   rW   rO   rT   r   r   r   r   rJ   T  s   
&   ÿ
*rJ   c                 K   s   t | d< d S )NÚgenerate_db_auth_token)rv   ©Zclass_attributesr"   r   r   r   Úadd_generate_db_auth_tokenÚ  s    rx   c                 C   st   |}|dkr| j j}d|dœ}ddi |ddœ}d}|› |› d	|› �}	t||	ƒ | jjd||d
dd�}
|
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DBUserra   r9   ÚGET)Zurl_pathZquery_stringÚheadersÚbodyÚmethodzhttps://re   i„  zrds-db)r    rC   r   r4   r   )Úmetar   r   Ú_request_signerrD   Úlen)r   Z
DBHostnameZPortZ
DBUsernameÚRegionr(   rZ   rC   ÚschemeÚendpoint_urlZpresigned_urlr   r   r   rv   Þ  s.    þû
ûrv   c                   @   s   e Zd Zdd„ Zddd„ZdS )ÚS3PostPresignerc                 C   s
   || _ d S r   )r€   )r   r%   r   r   r   r     s    zS3PostPresigner.__init__Nr@   c                 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¡ |
j|d	œS )
aÁ  Generates the url and the form fields used for a presigned s3 post

        :type request_dict: dict
        :param request_dict: The prepared request dictionary returned by
            ``botocore.awsrequest.prepare_request_dict()``

        :type fields: dict
        :param fields: A dictionary of prefilled form fields to build on top
            of.

        :type conditions: list
        :param conditions: A list of conditions to include in the policy. Each
            element can be either a list or a structure. For example:
            [
             {"acl": "public-read"},
             {"bucket": "mybucket"},
             ["starts-with", "$key", "mykey"]
            ]

        :type expires_in: int
        :param expires_in: The number of seconds the presigned post is valid
            for.

        :type region_name: string
        :param region_name: The region name to sign the presigned post to.

        :rtype: dict
        :returns: A dictionary with two elements: ``url`` and ``fields``.
            Url is the url to post to. Fields is a dictionary filled with
            the form fields and respective values to use when submitting the
            post. For example:

            {'url': 'https://mybucket.s3.amazonaws.com
             'fields': {'acl': 'public-read',
                        'key': 'mykey',
                        'signature': 'mysignature',
                        'policy': 'mybase64 encoded policy'}
            }
        N)ÚsecondsZ
expirationÚ
conditionszs3-presign-post-fieldszs3-presign-post-policyZ	PutObjectr7   )rB   Úfields)ÚdatetimeÚutcnowÚ	timedeltaÚstrftimer/   r5   ZISO8601Úappendr   r+   r€   r   rB   )r   rC   rˆ   r‡   r4   r   rY   Zdatetime_nowZexpire_daterk   r!   r   r   r   Úgenerate_presigned_post  s*    /


   ÿz'S3PostPresigner.generate_presigned_post)NNr@   N)rE   rF   rG   r   rŽ   r   r   r   r   r…     s       úr…   c                 K   s   t | d< d S )NrD   )rD   rw   r   r   r   Úadd_generate_presigned_urlf  s    r�   r@   c                 C   sÌ   |}|}|dkri }|}|}dt | ƒdœ}	| j}
z| j| }W n tk
r\   t|d�‚Y nX | jj |¡}t 	| 
dd¡¡}| j|||	| d�\}}| j||||	|dd	�}|dk	r¼||d
< |
j|||d�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ÚBucketr9   ©Zignore_signing_regionF©Z
api_paramsÚoperation_modelr„   r+   r|   Zset_user_agent_headerr~   )rC   r4   r    )Ú_should_use_global_endpointr€   Z_PY_TO_OP_NAMEÚKeyErrorr   r   Úservice_modelr•   r   Úis_arnr1   Ú_resolve_endpoint_rulesetÚ_convert_to_request_dictrD   )r   ZClientMethodZParamsÚ	ExpiresInZ
HttpMethodZclient_methodrZ   r4   Zhttp_methodr+   r%   r    r•   Úbucket_is_arnr„   Úadditional_headersrC   r   r   r   rD   j  sJ    þü
ú
ýrD   c                 K   s   t | d< d S )NrŽ   )rŽ   rw   r   r   r   Úadd_generate_presigned_post°  s    rŸ   c                 C   s  |}|}|}|}	|}
|dkr"i }n|  ¡ }|	dkr6g }	dt| ƒdœ}t| jƒ}| jj d¡}d|i}t | 	dd¡¡}| j
|||| d�\}}| j|||||dd	�}|	 d
|i¡ | d¡rÜ|	 dd|dtdƒ … g¡ n|	 d|i¡ ||d< |j|||	|
d�S )a×	  Builds the url and the form fields used for a presigned s3 post

    :type Bucket: string
    :param Bucket: The name of the bucket to presign the post to. Note that
        bucket related conditions should not be included in the
        ``conditions`` parameter.

    :type Key: string
    :param Key: Key name, optionally add ${filename} to the end to
        attach the submitted filename. Note that key related conditions and
        fields are filled out for you and should not be included in the
        ``Fields`` or ``Conditions`` parameter.

    :type Fields: dict
    :param Fields: A dictionary of prefilled form fields to build on top
        of. Elements that may be included are acl, Cache-Control,
        Content-Type, Content-Disposition, Content-Encoding, Expires,
        success_action_redirect, redirect, success_action_status,
        and x-amz-meta-.

        Note that if a particular element is included in the fields
        dictionary it will not be automatically added to the conditions
        list. You must specify a condition for the element as well.

    :type Conditions: list
    :param Conditions: A list of conditions to include in the policy. Each
        element can be either a list or a structure. For example:

        [
         {"acl": "public-read"},
         ["content-length-range", 2, 5],
         ["starts-with", "$success_action_redirect", ""]
        ]

        Conditions that are included may pertain to acl,
        content-length-range, Cache-Control, Content-Type,
        Content-Disposition, Content-Encoding, Expires,
        success_action_redirect, redirect, success_action_status,
        and/or x-amz-meta-.

        Note that if you include a condition, you must specify
        the a valid value in the fields dictionary as well. A value will
        not be added automatically to the fields dictionary based on the
        conditions.

    :type ExpiresIn: int
    :param ExpiresIn: The number of seconds the presigned post
        is valid for.

    :rtype: dict
    :returns: A dictionary with two elements: ``url`` and ``fields``.
        Url is the url to post to. Fields is a dictionary filled with
        the form fields and respective values to use when submitting the
        post. For example:

        {'url': 'https://mybucket.s3.amazonaws.com
         'fields': {'acl': 'public-read',
                    'key': 'mykey',
                    'signature': 'mysignature',
                    'policy': 'mybase64 encoded policy'}
        }
    NTr�   ZCreateBucketr’   r9   r“   Fr”   Úbucketz${filename}zstarts-withz$keyÚkey)rC   rˆ   r‡   r4   )Úcopyr–   r…   r€   r   r˜   r•   r   r™   r1   rš   r›   r�   r:   r�   rŽ   )r   r’   ÚKeyZFieldsZ
Conditionsrœ   r    r¡   rˆ   r‡   r4   r+   Zpost_presignerr•   rZ   r�   r„   rž   rC   r   r   r   rŽ   ´  sT    Aþ
ü
ú

 ürŽ   c                 C   sR   | j jdkrdS | j jj}|rN| dd¡r.dS | d¡dkrN| j jjdkrNdS dS )NZawsFZuse_dualstack_endpointZus_east_1_regional_endpointZregionalz	us-east-1T)r   Ú	partitionÚconfigZs3r1   r   )ÚclientZ	s3_configr   r   r   r–   4  s    
ÿþr–   )N)Nr@   N)NNr@   )rr   r‰   rg   r   r/   Zbotocore.authZbotocore.awsrequestr   r   Zbotocore.compatr   Zbotocore.exceptionsr   r   r   Zbotocore.utilsr   r	   r
   r   rJ   rx   rv   r…   r�   rD   rŸ   rŽ   r–   r   r   r   r   Ú<module>   s<     5 
6R     ÿ
F     ÿ
 