o .&an@sddlZddlZddlZddlZddlZddlZddlmZmZddl m Z m Z ddl m Z ddl mZddl mZddlmZddlmZGd d d eZGd d d eZd dZdddZGdddeZddZ  dddZddZ  d ddZddZdS)!N)six OrderedDict)create_request_objectprepare_request_dict)UnknownSignatureVersionError)UnknownClientMethodError) UnsupportedSignatureVersionError)datetime2timestamp) fix_s3_hostc@szeZdZdZddZeddZeddZedd Zdd d Z dddZ ddZ dddZ e Z dddZd 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. cCs.||_||_||_||_||_t||_dSN) _region_name _signing_name_signature_version _credentials _service_idweakrefproxy_event_emitter)self service_id region_name signing_namesignature_version credentials event_emitterr2/usr/lib/python3/dist-packages/botocore/signers.py__init__As zRequestSigner.__init__cC|jSr )r rrrrrLzRequestSigner.region_namecCrr )rr rrrrPr!zRequestSigner.signature_versioncCrr )rr rrrrTr!zRequestSigner.signing_nameNcKs |||Sr )sign)roperation_namerequestkwargsrrrhandlerXs zRequestSigner.handlerstandardc Cs|}|dur |j}|dur|j}||||j}|jjd|j||||j|||d|t j kr|||d} |dur@|| d<|j di} |sT| drT| d| d<| d r_| d | d <z |j d i| } Wnt y} z |d krzt|d | d} ~ ww| |dSdS) 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. Nzbefore-sign.{0}.{1})r$rrrrequest_signerr#)rrrexpiressigningregionrrr'rr)r r_choose_signercontextremitformatr hyphenizebotocoreUNSIGNEDgetget_auth_instancerradd_auth) rr#r$r signing_type expires_inrexplicit_region_namerr%signing_contextautherrrr"_sR     zRequestSigner.signc Csddd}||d}|j}|tjur||s||7}|jjd|j ||j |j ||d\}}|durF|}|tjurF||sF||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-urlzchoose-signer.{0}.{1})rrrr.N) r4rr2r3endswithremit_until_responser0rr1rr ) rr#r7r.signing_type_suffix_mapsuffixrr&responserrrr-s.      zRequestSigner._choose_signercKs|dur|j}tjj|}|durt|dd}|jdur#|j}||d<|jr<|j dur4tj ||d<||d<|di|}|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,rr service_namer) rr2r;AUTH_TYPE_MAPSr4rrget_frozen_credentialsREQUIRES_REGIONr exceptions NoRegionError)rrrrr%clsfrozen_credentialsr;rrrr5s$    zRequestSigner.get_auth_instancecCs*t|}||||d||||jS)aGenerates 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 r>)rr"prepareurl)r request_dictr#r8rrr$rrrgenerate_presigned_urls  z$RequestSigner.generate_presigned_urlNN)Nr'NNr )rMNN)__name__ __module__ __qualname____doc__rpropertyrrrr&r"r-r5get_authrQrrrrr s(!     H& ,r c@s>eZdZdZddZd ddZddZ d d d Zd d ZdS)CloudFrontSigneraA 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) cCs||_||_dS)aCreate 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)rrZr[rrrr2s zCloudFrontSigner.__init__Nc Cs|duo|du}|duo|du}|s|rd}t||dur$|||}t|tjr/|d}|dur=dtt|g}n d|| dg}| |}| d|| dd|j g| ||S)aCreates 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 bothutf8z Expires=%sz Policy=%sz Signature=%szKey-Pair-Id=%s) ValueError build_policy isinstancer text_typeencodeintr _url_b64encodedecoder[extendrZ _build_url) rrOdate_less_thanpolicyboth_args_suppliedneither_arg_suppliedr<params signaturerrrrQAs$     z'CloudFrontSigner.generate_presigned_urlcCs"d|vrdnd}||d|S)N?&)join)rbase_url extra_params separatorrrrrfeszCloudFrontSigner._build_urlc Cstt|}tdd|ii}|rd|vr|d7}d|i|d<|r,tt|}d|i|d<d|fd |fg}d t|gi}tj|d d S) a0A 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. DateLessThanz AWS:EpochTime/z/32z AWS:SourceIp IpAddressDateGreaterThanResource Condition Statement),:) separators)rbr rjsondumps) rresourcergdate_greater_than ip_addressmoment conditionordered_payload custom_policyrrrr^is    zCloudFrontSigner.build_policycCs"t|ddddddS)N+-=_/~)base64 b64encodereplace)rdatarrrrcs zCloudFrontSigner._url_b64encoderR) rSrTrUrVrrQrfr^rcrrrrrYs $ )rYcK t|d<dS)Ngenerate_db_auth_token)rclass_attributesr%rrradd_generate_db_auth_token rc Csp|}|dur |jj}d|d}ddi|dd}d}d |||f} t|| |jjd||d d d } | t|dS) aGenerates 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. Nconnect)ActionDBUserrtr?GET)url_path query_stringheadersbodymethodzhttps://z%s%s:%sizrds-db)r#rPrr8r)metarr_request_signerrQlen) r DBHostnamePort DBUsernameRegionr+rkrPscheme endpoint_url presigned_urlrrrrs( rc@s$eZdZddZ   dddZdS)S3PostPresignercCs ||_dSr )r)rr(rrrrs zS3PostPresigner.__init__NrMc Cs|duri}|dur g}i}tj}|tj|d}|tjj|d<g|d<|D] } |d| q*t|} || j d<|| j d<|j d| |d| j |d S) aGenerates 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)seconds expiration conditionszs3-presign-post-fieldszs3-presign-post-policy PutObjectr=)rOfields) datetimeutcnow timedeltastrftimer2r;ISO8601appendrr.rr"rO) rrPrrr8rrh datetime_now expire_daterr$rrrgenerate_presigned_posts$*    z'S3PostPresigner.generate_presigned_post)NNrMN)rSrTrUrrrrrrrs rcKr)NrQ)rQrrrradd_generate_presigned_urlrrrMcCs|}|}|dur i}|}|}dt|d} |j} |j} z|j|} Wn ty.t|dw|jj| } | || | }| || }|durK||d<t ||jj | d| j ||| dS)axGenerate 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 NTis_presign_requestuse_global_endpoint) method_namerrr.)rPr8r#)_should_use_global_endpointr _serializer_PY_TO_OP_NAMEKeyErrorrr service_modeloperation_model_emit_api_paramsserialize_to_requestrrrQ)r ClientMethodParams ExpiresIn HttpMethod client_methodrkr8 http_methodr.r( serializerr#rrPrrrrQ s@   rQcKr)Nr)rrrrradd_generate_presigned_post_rrcCs|}|}|}|} |} |duri}n|}| durg} t|j} |j} |jjd} | d|i| }t||jj dt |dd| d|i| dr\| d d |dt d gn| 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'} } N CreateBucketBucketTrrbucketz ${filename}z starts-withz$keykey)rPrrr8)copyrrrrrrrrrrrr@rr)rrKeyFields Conditionsrrrrrr8post_presignerrrrPrrrrcsB@   rcCsR|jjdkrdS|jjj}|r'|ddrdS|ddkr'|jjjdkr'dSdS)NawsFuse_dualstack_endpointus_east_1_regional_endpointregionalz us-east-1T)r partitionconfigs3r4r)client s3_configrrrrs   rr )NrMN)NNrM)rrr}rr2 botocore.authbotocore.compatrrbotocore.awsrequestrrbotocore.exceptionsrrrbotocore.utilsr r objectr rYrrrrrQrrrrrrrs8      | 3L ? u