Best Python code snippet using localstack_python
s3_utils.py
Source:s3_utils.py  
...238            if query_string239            else request_dict["url"]240        )241    if not is_v2 and any([p in query_params for p in SIGNATURE_V2_PARAMS]):242        response = requests_error_response_xml_signature_calculation(243            code=403,244            message="Query-string authentication requires the Signature, Expires and AWSAccessKeyId parameters",245            code_string="AccessDenied",246        )247    elif is_v2 and not is_v4:248        response = authenticate_presign_url_signv2(249            method, path, headers, data, url, query_params, request_dict250        )251    if not is_v4 and any([p in query_params for p in SIGNATURE_V4_PARAMS]):252        response = requests_error_response_xml_signature_calculation(253            code=403,254            message="Query-string authentication requires the X-Amz-Algorithm, \255                X-Amz-Credential, X-Amz-Date, X-Amz-Expires, \256                X-Amz-SignedHeaders and X-Amz-Signature parameters.",257            code_string="AccessDenied",258        )259    elif is_v4 and not is_v2:260        response = authenticate_presign_url_signv4(261            method, path, headers, data, url, query_params, request_dict262        )263    if response is not None:264        LOGGER.info("Presign signature calculation failed: %s" % response)265        return response266    LOGGER.debug("Valid presign url.")267def authenticate_presign_url_signv2(method, path, headers, data, url, query_params, request_dict):268    # Calculating Signature269    aws_request = create_request_object(request_dict)270    credentials = Credentials(271        access_key=TEST_AWS_ACCESS_KEY_ID,272        secret_key=TEST_AWS_SECRET_ACCESS_KEY,273        token=query_params.get("X-Amz-Security-Token", None),274    )275    auth = HmacV1QueryAuth(credentials=credentials, expires=query_params["Expires"][0])276    split = urlsplit(aws_request.url)277    string_to_sign = auth.get_string_to_sign(278        method=method, split=split, headers=aws_request.headers279    )280    signature = auth.get_signature(string_to_sign=string_to_sign)281    # Comparing the signature in url with signature we calculated282    query_sig = urlparse.unquote(query_params["Signature"][0])283    if config.S3_SKIP_SIGNATURE_VALIDATION:284        if query_sig != signature:285            LOGGER.warning(286                "Signatures do not match, but not raising an error, as S3_SKIP_SIGNATURE_VALIDATION=1"287            )288        signature = query_sig289    if query_sig != signature:290        return requests_error_response_xml_signature_calculation(291            code=403,292            code_string="SignatureDoesNotMatch",293            aws_access_token=TEST_AWS_ACCESS_KEY_ID,294            string_to_sign=string_to_sign,295            signature=signature,296            message="The request signature we calculated does not match the signature you provided. \297                    Check your key and signing method.",298        )299    # Checking whether the url is expired or not300    if int(query_params["Expires"][0]) < time.time():301        return requests_error_response_xml_signature_calculation(302            code=403,303            code_string="AccessDenied",304            message="Request has expired",305            expires=query_params["Expires"][0],306        )307def authenticate_presign_url_signv4(method, path, headers, data, url, query_params, request_dict):308    is_presign_valid = False309    for port in PORT_REPLACEMENT:310        match = re.match(HOST_COMBINATION_REGEX, urlparse.urlparse(request_dict["url"]).netloc)311        if match and match.group(2):312            request_dict["url"] = request_dict["url"].replace("%s" % match.group(2), "%s" % port)313        else:314            request_dict["url"] = "%s:%s" % (request_dict["url"], port)315        # Calculating Signature316        aws_request = create_request_object(request_dict)317        ReadOnlyCredentials = namedtuple(318            "ReadOnlyCredentials", ["access_key", "secret_key", "token"]319        )320        credentials = ReadOnlyCredentials(321            TEST_AWS_ACCESS_KEY_ID,322            TEST_AWS_SECRET_ACCESS_KEY,323            query_params.get("X-Amz-Security-Token", None),324        )325        region = query_params["X-Amz-Credential"][0].split("/")[2]326        signer = S3SigV4QueryAuth(327            credentials, "s3", region, expires=int(query_params["X-Amz-Expires"][0])328        )329        signature = signer.add_auth(aws_request, query_params["X-Amz-Date"][0])330        expiration_time = datetime.datetime.strptime(331            query_params["X-Amz-Date"][0], "%Y%m%dT%H%M%SZ"332        ) + datetime.timedelta(seconds=int(query_params["X-Amz-Expires"][0]))333        expiration_time = expiration_time.replace(tzinfo=datetime.timezone.utc)334        # Comparing the signature in url with signature we calculated335        query_sig = urlparse.unquote(query_params["X-Amz-Signature"][0])336        if query_sig == signature:337            is_presign_valid = True338            break339    # Comparing the signature in url with signature we calculated340    if config.S3_SKIP_SIGNATURE_VALIDATION:341        if not is_presign_valid:342            LOGGER.warning(343                "Signatures do not match, but not raising an error, as S3_SKIP_SIGNATURE_VALIDATION=1"344            )345        signature = query_sig346        is_presign_valid = True347    if not is_presign_valid:348        return requests_error_response_xml_signature_calculation(349            code=403,350            code_string="SignatureDoesNotMatch",351            aws_access_token=TEST_AWS_ACCESS_KEY_ID,352            signature=signature,353            message="The request signature we calculated does not match the signature you provided. \354                    Check your key and signing method.",355        )356    # Checking whether the url is expired or not357    if is_expired(expiration_time):358        return requests_error_response_xml_signature_calculation(359            code=403,360            code_string="AccessDenied",361            message="Request has expired",362            expires=query_params["X-Amz-Expires"][0],...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
