Ejemplo n.º 1
0
    def test_destination_region_always_changed(self):
        # If the user provides a destination region, we will still
        # override the DesinationRegion with the region_name from
        # the endpoint object.
        actual_region = 'us-west-1'
        v4query_auth = mock.Mock()

        def add_auth(request):
            request.url += '?PRESIGNED_STUFF'

        v4query_auth.add_auth = add_auth

        request_signer = mock.Mock()
        request_signer._region_name = actual_region
        request_signer.get_auth.return_value = v4query_auth

        endpoint = mock.Mock()
        request = AWSRequest()
        request.method = 'POST'
        request.url = 'https://ec2.us-east-1.amazonaws.com'
        request = request.prepare()
        endpoint.create_request.return_value = request

        # The user provides us-east-1, but we will override this to
        # endpoint.region_name, of 'us-west-1' in this case.
        params = {'SourceRegion': 'us-west-2', 'DestinationRegion': 'us-east-1'}
        handlers.copy_snapshot_encrypted({'body': params},
                                         request_signer,
                                         endpoint)
        # Always use the DestinationRegion from the endpoint, regardless of
        # whatever value the user provides.
        self.assertEqual(params['DestinationRegion'], actual_region)
Ejemplo n.º 2
0
    def test_auth_header_preserved_from_s3_redirects(self):
        request = AWSRequest()
        request.url = 'https://bucket.s3.amazonaws.com/'
        request.method = 'GET'
        request.headers['Authorization'] = 'original auth header'
        prepared_request = request.prepare()

        fake_response = Mock()
        fake_response.headers = {
            'location': 'https://bucket.s3-us-west-2.amazonaws.com'}
        fake_response.url = request.url
        fake_response.status_code = 307
        fake_response.is_permanent_redirect = False
        # This line is needed to disable the cookie handling
        # code in requests.
        fake_response.raw._original_response = None

        success_response = Mock()
        success_response.raw._original_response = None
        success_response.is_redirect = False
        success_response.status_code = 200
        session = PreserveAuthSession()
        session.send = Mock(return_value=success_response)

        list(session.resolve_redirects(
            fake_response, prepared_request, stream=False))

        redirected_request = session.send.call_args[0][0]
        # The Authorization header for the newly sent request should
        # still have our original Authorization header.
        self.assertEqual(
            redirected_request.headers['Authorization'],
            'original auth header')
Ejemplo n.º 3
0
    def test_copy_snapshot_encrypted(self):
        v4query_auth = mock.Mock()

        def add_auth(request):
            request.url += '?PRESIGNED_STUFF'

        v4query_auth.add_auth = add_auth

        request_signer = mock.Mock()
        request_signer._region_name = 'us-east-1'
        request_signer.get_auth.return_value = v4query_auth

        params = {'SourceRegion': 'us-west-2'}
        endpoint = mock.Mock()
        request = AWSRequest()
        request.method = 'POST'
        request.url = 'https://ec2.us-east-1.amazonaws.com'
        request = request.prepare()
        endpoint.create_request.return_value = request

        handlers.copy_snapshot_encrypted({'body': params},
                                         request_signer,
                                         endpoint)
        self.assertEqual(params['PresignedUrl'],
                         'https://ec2.us-west-2.amazonaws.com?PRESIGNED_STUFF')
        # We should also populate the DestinationRegion with the
        # region_name of the endpoint object.
        self.assertEqual(params['DestinationRegion'], 'us-east-1')
Ejemplo n.º 4
0
def create_request_from_raw_request(raw_request):
    raw_request = raw_request.replace('http/1.1', 'HTTP/1.1')
    request = AWSRequest()
    raw = RawHTTPRequest(raw_request)
    if raw.error_code is not None:
        raise Exception(raw.error_message)
    request.method = raw.command
    datetime_now = datetime.datetime(2011, 9, 9, 23, 36)
    request.context['timestamp'] = datetime_now.strftime('%Y%m%dT%H%M%SZ')
    for key, val in raw.headers.items():
        request.headers[key] = val
    request.data = raw.rfile.read()
    host = raw.headers.get('host', '')
    # For whatever reason, the BaseHTTPRequestHandler encodes
    # the first line of the response as 'iso-8859-1',
    # so we need decode this into utf-8.
    if isinstance(raw.path, six.text_type):
        raw.path = raw.path.encode('iso-8859-1').decode('utf-8')
    url = 'https://%s%s' % (host, raw.path)
    if '?' in url:
        split_url = urlsplit(url)
        params = dict(parse_qsl(split_url.query))
        request.url = split_url.path
        request.params = params
    else:
        request.url = url
    return request
Ejemplo n.º 5
0
 def test_presign_with_spaces_in_param(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     request.data = {'Action': 'MyOperation', 'Description': 'With Spaces'}
     self.auth.add_auth(request)
     # Verify we encode spaces as '%20, and we don't use '+'.
     self.assertIn('Description=With%20Spaces', request.url)
Ejemplo n.º 6
0
 def test_strips_default_port_and_http_auth(self):
     request = AWSRequest()
     request.url = 'http://*****:*****@s3.us-west-2.amazonaws.com:80/'
     request.method = 'GET'
     auth = self.create_signer('s3', 'us-west-2')
     actual = auth.headers_to_sign(request)['host']
     expected = 's3.us-west-2.amazonaws.com'
     self.assertEqual(actual, expected)
Ejemplo n.º 7
0
 def test_presign_with_empty_param_value(self):
     request = AWSRequest()
     request.method = 'POST'
     # actual URL format for creating a multipart upload
     request.url = 'https://s3.amazonaws.com/mybucket/mykey?uploads'
     self.auth.add_auth(request)
     # verify that uploads param is still in URL
     self.assertIn('uploads', request.url)
Ejemplo n.º 8
0
 def test_operation_params_before_auth_params(self):
     # The spec is picky about this.
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://ec2.us-east-1.amazonaws.com/?Action=MyOperation'
     self.auth.add_auth(request)
     # Verify auth params come after the existing params.
     self.assertIn(
         '?Action=MyOperation&X-Amz', request.url)
Ejemplo n.º 9
0
 def _test_blacklist_header(self, header, value):
     request = AWSRequest()
     request.url = 'https://s3.amazonaws.com/bucket/foo'
     request.method = 'PUT'
     request.headers[header] = value
     credentials = botocore.credentials.Credentials('access_key',
                                                    'secret_key')
     auth = botocore.auth.S3SigV4Auth(credentials, 's3', 'us-east-1')
     auth.add_auth(request)
     self.assertNotIn(header, request.headers['Authorization'])
Ejemplo n.º 10
0
 def _test_blacklist_header(self, header, value):
     request = AWSRequest()
     request.url = 'https://s3.amazonaws.com/bucket/foo'
     request.method = 'PUT'
     request.headers[header] = value
     credentials = botocore.credentials.Credentials('access_key',
                                                    'secret_key')
     auth = botocore.auth.S3SigV4Auth(credentials, 's3', 'us-east-1')
     auth.add_auth(request)
     self.assertNotIn(header, request.headers['Authorization'])
Ejemplo n.º 11
0
 def test_signature_is_not_normalized(self):
     request = AWSRequest()
     request.url = 'https://s3.amazonaws.com/bucket/foo/./bar/../bar'
     request.method = 'GET'
     credentials = botocore.credentials.Credentials('access_key',
                                                    'secret_key')
     auth = botocore.auth.S3SigV4Auth(credentials, 's3', 'us-east-1')
     auth.add_auth(request)
     self.assertTrue(
         request.headers['Authorization'].startswith('AWS4-HMAC-SHA256'))
Ejemplo n.º 12
0
 def test_operation_params_before_auth_params_in_body(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     request.data = {'Action': 'MyOperation'}
     self.auth.add_auth(request)
     # Same situation, the params from request.data come before the auth
     # params in the query string.
     self.assertIn(
         '?Action=MyOperation&X-Amz', request.url)
Ejemplo n.º 13
0
 def test_blacklist_expect_headers(self):
     request = AWSRequest()
     request.url = 'https://s3.amazonaws.com/bucket/foo'
     request.method = 'PUT'
     request.headers['expect'] = '100-Continue'
     credentials = botocore.credentials.Credentials('access_key',
                                                    'secret_key')
     auth = botocore.auth.S3SigV4Auth(credentials, 's3', 'us-east-1')
     auth.add_auth(request)
     self.assertNotIn('expect', request.headers['Authorization'])
Ejemplo n.º 14
0
 def test_signature_is_not_normalized(self):
     request = AWSRequest()
     request.url = 'https://s3.amazonaws.com/bucket/foo/./bar/../bar'
     request.method = 'GET'
     credentials = botocore.credentials.Credentials('access_key',
                                                    'secret_key')
     auth = botocore.auth.S3SigV4Auth(credentials, 's3', 'us-east-1')
     auth.add_auth(request)
     self.assertTrue(
         request.headers['Authorization'].startswith('AWS4-HMAC-SHA256'))
Ejemplo n.º 15
0
 def test_content_sha256_set_if_payload_signing_disabled(self):
     request = AWSRequest()
     request.data = six.BytesIO(u'\u2713'.encode('utf-8'))
     request.url = 'https://amazonaws.com'
     request.context['payload_signing_enabled'] = False
     request.method = 'PUT'
     auth = self.create_signer()
     auth.add_auth(request)
     sha_header = request.headers['X-Amz-Content-SHA256']
     self.assertEqual(sha_header, 'UNSIGNED-PAYLOAD')
Ejemplo n.º 16
0
 def test_content_sha256_set_if_payload_signing_disabled(self):
     request = AWSRequest()
     request.data = six.BytesIO(u'\u2713'.encode('utf-8'))
     request.url = 'https://amazonaws.com'
     request.context['payload_signing_enabled'] = False
     request.method = 'PUT'
     auth = self.create_signer()
     auth.add_auth(request)
     sha_header = request.headers['X-Amz-Content-SHA256']
     self.assertEqual(sha_header, 'UNSIGNED-PAYLOAD')
Ejemplo n.º 17
0
 def test_operation_params_before_auth_params_in_body(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     request.data = {'Action': 'MyOperation'}
     self.auth.add_auth(request)
     # Same situation, the params from request.data come before the auth
     # params in the query string.
     self.assertIn(
         '?Action=MyOperation&X-Amz', request.url)
Ejemplo n.º 18
0
 def test_presign_content_type_form_encoded_not_signed(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://myservice.us-east-1.amazonaws.com/'
     request.headers['Content-Type'] = (
         'application/x-www-form-urlencoded; charset=utf-8')
     self.auth.add_auth(request)
     query_string = self.get_parsed_query_string(request)
     signed_headers = query_string.get('X-Amz-SignedHeaders')
     self.assertNotIn('content-type', signed_headers)
Ejemplo n.º 19
0
 def test_presign_content_type_form_encoded_not_signed(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://myservice.us-east-1.amazonaws.com/'
     request.headers['Content-Type'] = (
         'application/x-www-form-urlencoded; charset=utf-8'
     )
     self.auth.add_auth(request)
     query_string = self.get_parsed_query_string(request)
     signed_headers = query_string.get('X-Amz-SignedHeaders')
     self.assertNotIn('content-type', signed_headers)
Ejemplo n.º 20
0
 def test_presign_with_security_token(self):
     self.credentials.token = 'security-token'
     auth = botocore.auth.S3SigV4QueryAuth(
         self.credentials, self.service_name, self.region_name, expires=60)
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     auth.add_auth(request)
     query_string = self.get_parsed_query_string(request)
     self.assertEqual(
         query_string['X-Amz-Security-Token'], 'security-token')
Ejemplo n.º 21
0
    def test_query_string_params_in_urls(self):
        request = AWSRequest()
        request.url = ('https://s3.amazonaws.com/bucket?'
                       'marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix')
        request.data = {'Action': 'MyOperation'}
        request.method = 'GET'

        # Check that the canonical query string is correct formatting
        # by ensuring that query string paramters that are added to the
        # canonical query string are correctly formatted.
        cqs = self.auth.canonical_query_string(request)
        self.assertEqual('marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix=', cqs)
Ejemplo n.º 22
0
 def test_resign(self):
     # Make sure that resigning after e.g. retries works
     request = AWSRequest()
     request.url = '/'
     request.method = 'POST'
     params = {
         'Foo': u'\u2713',
         'Signature': u'VCtWuwaOL0yMffAT8W4y0AFW3W4KUykBqah9S40rB+Q='
     }
     result = self.signer.calc_signature(request, params)
     self.assertEqual(
         result, ('Foo=%E2%9C%93',
                  u'VCtWuwaOL0yMffAT8W4y0AFW3W4KUykBqah9S40rB+Q='))
Ejemplo n.º 23
0
 def test_fields(self):
     request = AWSRequest()
     request.url = '/'
     request.method = 'POST'
     request.data = {'Foo': u'\u2713'}
     self.signer.add_auth(request)
     self.assertEqual(request.data['AWSAccessKeyId'], 'foo')
     self.assertEqual(request.data['Foo'], u'\u2713')
     self.assertEqual(request.data['Timestamp'], '2014-06-20T08:40:23Z')
     self.assertEqual(request.data['Signature'],
                      u'Tiecw+t51tok4dTT8B4bg47zxHEM/KcD55f2/x6K22o=')
     self.assertEqual(request.data['SignatureMethod'], 'HmacSHA256')
     self.assertEqual(request.data['SignatureVersion'], '2')
Ejemplo n.º 24
0
 def test_get(self):
     request = AWSRequest()
     request.url = '/'
     request.method = 'GET'
     request.params = {'Foo': u'\u2713'}
     self.signer.add_auth(request)
     self.assertEqual(request.params['AWSAccessKeyId'], 'foo')
     self.assertEqual(request.params['Foo'], u'\u2713')
     self.assertEqual(request.params['Timestamp'], '2014-06-20T08:40:23Z')
     self.assertEqual(request.params['Signature'],
                      u'Un97klqZCONP65bA1+Iv4H3AcB2I40I4DBvw5ZERFPw=')
     self.assertEqual(request.params['SignatureMethod'], 'HmacSHA256')
     self.assertEqual(request.params['SignatureVersion'], '2')
Ejemplo n.º 25
0
 def test_sign_with_token(self):
     credentials = botocore.credentials.Credentials(
         access_key='foo', secret_key='bar', token='baz')
     auth = botocore.auth.HmacV1Auth(credentials)
     request = AWSRequest()
     request.headers['Date'] = 'Thu, 17 Nov 2005 18:49:58 GMT'
     request.headers['Content-Type'] = 'text/html'
     request.method = 'PUT'
     request.url = 'https://s3.amazonaws.com/bucket/key'
     auth.add_auth(request)
     self.assertIn('Authorization', request.headers)
     # We're not actually checking the signature here, we're
     # just making sure the auth header has the right format.
     self.assertTrue(request.headers['Authorization'].startswith('AWS '))
Ejemplo n.º 26
0
    def test_query_string_params_in_urls(self):
        request = AWSRequest()
        request.url = (
            'https://s3.amazonaws.com/bucket?'
            'marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix'
        )
        request.data = {'Action': 'MyOperation'}
        request.method = 'GET'

        # Check that the canonical query string is correct formatting
        # by ensuring that query string paramters that are added to the
        # canonical query string are correctly formatted.
        cqs = self.auth.canonical_query_string(request)
        self.assertEqual('marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix=', cqs)
Ejemplo n.º 27
0
 def test_resign_with_token(self):
     credentials = botocore.credentials.Credentials(
         access_key='foo', secret_key='bar', token='baz')
     auth = botocore.auth.SigV3Auth(credentials)
     request = AWSRequest()
     request.headers['Date'] = 'Thu, 17 Nov 2005 18:49:58 GMT'
     request.method = 'PUT'
     request.url = 'https://route53.amazonaws.com/'
     auth.add_auth(request)
     original_auth = request.headers['X-Amzn-Authorization']
     # Resigning the request shouldn't change the authorization
     # header.
     auth.add_auth(request)
     self.assertEqual(request.headers.get_all('X-Amzn-Authorization'),
                      [original_auth])
Ejemplo n.º 28
0
 def test_canonical_query_string(self):
     request = AWSRequest()
     request.url = (
         'https://search-testdomain1-j67dwxlet67gf7ghwfmik2c67i.us-west-2.'
         'cloudsearch.amazonaws.com/'
         '2013-01-01/search?format=sdk&pretty=true&'
         'q.options=%7B%22defaultOperator%22%3A%20%22and%22%2C%20%22'
         'fields%22%3A%5B%22directors%5E10%22%5D%7D&q=George%20Lucas')
     request.method = 'GET'
     auth = self.create_signer('cloudsearchdomain', 'us-west-2')
     actual = auth.canonical_query_string(request)
     # Here 'q' should come before 'q.options'.
     expected = ("format=sdk&pretty=true&q=George%20Lucas&q.options=%7B%22"
                 "defaultOperator%22%3A%20%22and%22%2C%20%22fields%22%3A%5B"
                 "%22directors%5E10%22%5D%7D")
     self.assertEqual(actual, expected)
Ejemplo n.º 29
0
    def test_query_string_params_in_urls(self):
        if not hasattr(self.AuthClass, 'canonical_query_string'):
            raise unittest.SkipTest('%s does not expose interim steps' %
                                    self.AuthClass.__name__)

        request = AWSRequest()
        request.url = ('https://s3.amazonaws.com/bucket?'
                       'marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix')
        request.data = {'Action': 'MyOperation'}
        request.method = 'GET'

        # Check that the canonical query string is correct formatting
        # by ensuring that query string paramters that are added to the
        # canonical query string are correctly formatted.
        cqs = self.auth.canonical_query_string(request)
        self.assertEqual('marker=%C3%A4%C3%B6%C3%BC-01.txt&prefix=', cqs)
Ejemplo n.º 30
0
 def test_presign_no_params(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://ec2.us-east-1.amazonaws.com/'
     self.auth.add_auth(request)
     query_string = self.get_parsed_query_string(request)
     self.assertEqual(
         query_string,
         {'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
          'X-Amz-Credential': ('access_key/20140101/myregion/'
                               'myservice/aws4_request'),
          'X-Amz-Date': '20140101T000000Z',
          'X-Amz-Expires': '60',
          'X-Amz-Signature': ('c70e0bcdb4cd3ee324f71c78195445b878'
                              '8315af0800bbbdbbb6d05a616fb84c'),
          'X-Amz-SignedHeaders': 'host'})
Ejemplo n.º 31
0
 def test_canonical_query_string(self):
     request = AWSRequest()
     request.url = (
         'https://search-testdomain1-j67dwxlet67gf7ghwfmik2c67i.us-west-2.'
         'cloudsearch.amazonaws.com/'
         '2013-01-01/search?format=sdk&pretty=true&'
         'q.options=%7B%22defaultOperator%22%3A%20%22and%22%2C%20%22'
         'fields%22%3A%5B%22directors%5E10%22%5D%7D&q=George%20Lucas'
     )
     request.method = 'GET'
     auth = self.create_signer('cloudsearchdomain', 'us-west-2')
     actual = auth.canonical_query_string(request)
     # Here 'q' should come before 'q.options'.
     expected = ("format=sdk&pretty=true&q=George%20Lucas&q.options=%7B%22"
                 "defaultOperator%22%3A%20%22and%22%2C%20%22fields%22%3A%5B"
                 "%22directors%5E10%22%5D%7D")
     self.assertEqual(actual, expected)
Ejemplo n.º 32
0
def _sign_codecommit_url(credentials, region, url_to_sign):
    signer = SigV4Auth(credentials, 'codecommit', region)
    request = AWSRequest()
    request.url = url_to_sign
    request.method = 'GIT'
    now = datetime.datetime.utcnow()
    request.context['timestamp'] = now.strftime('%Y%m%dT%H%M%S')
    split = urlsplit(request.url)
    # we don't want to include the port number in the signature
    hostname = split.netloc.split(':')[0]
    canonical_request = '{0}\n{1}\n\nhost:{2}\n\nhost\n'.format(
        request.method, split.path, hostname)
    LOG.debug("Calculating signature using v4 auth.")
    LOG.debug('CanonicalRequest: %s', canonical_request)
    string_to_sign = signer.string_to_sign(request, canonical_request)
    LOG.debug('StringToSign: %s', utils.retract_string(string_to_sign))
    signature = signer.signature(string_to_sign, request)
    LOG.debug('Signature: %s', utils.retract_string(signature))
    return '{0}Z{1}'.format(request.context['timestamp'], signature)
def sign_request(region, url_to_sign):
    credentials = session.get_credentials()
    signer = SigV4Auth(credentials, 'codecommit', region)
    request = AWSRequest()
    request.url = url_to_sign
    request.method = 'GIT'
    now = datetime.datetime.utcnow()
    request.context['timestamp'] = now.strftime('%Y%m%dT%H%M%S')
    split = urlsplit(request.url)
    # we don't want to include the port number in the signature
    hostname = split.netloc.split(':')[0]
    canonical_request = '{0}\n{1}\n\nhost:{2}\n\nhost\n'.format(
        request.method, split.path, hostname)
    print 'CanonicalRequest:\n%s' % canonical_request
    string_to_sign = signer.string_to_sign(request, canonical_request)
    print 'StringToSign:\n%s' % string_to_sign
    signature = signer.signature(string_to_sign, request)
    print 'Signature:\n%s' % signature

    return '{0}Z{1}'.format(request.context['timestamp'], signature)
Ejemplo n.º 34
0
 def test_presign_where_body_is_json_string(self):
     request = AWSRequest()
     request.method = 'GET'
     request.url = 'https://myservice.us-east-1.amazonaws.com/'
     request.data = '{"Param": "value"}'
     self.auth.add_auth(request)
     query_string = self.get_parsed_query_string(request)
     expected_query_string = {
         'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
         'X-Amz-Credential': (
             'access_key/20140101/myregion/myservice/aws4_request'),
         'X-Amz-Expires': '60',
         'X-Amz-Date': '20140101T000000Z',
         'X-Amz-Signature': (
             '8e1d372d168d532313ce6df8f64a7dc51d'
             'e6f312a9cfba6e5b345d8a771e839c'),
         'X-Amz-SignedHeaders': 'host',
         'Param': 'value'
     }
     self.assertEqual(query_string, expected_query_string)
Ejemplo n.º 35
0
    def test_resign_with_token(self):
        credentials = botocore.credentials.Credentials(
            access_key='foo', secret_key='bar', token='baz')
        auth = botocore.auth.HmacV1Auth(credentials)
        request = AWSRequest()
        request.headers['Date'] = 'Thu, 17 Nov 2005 18:49:58 GMT'
        request.headers['Content-Type'] = 'text/html'
        request.method = 'PUT'
        request.url = 'https://s3.amazonaws.com/bucket/key'

        auth.add_auth(request)
        original_auth = request.headers['Authorization']
        # Resigning the request shouldn't change the authorization
        # header.  We are also ensuring that the date stays the same
        # because we're mocking out the formatdate() call.  There's
        # another unit test that verifies we use the latest time
        # when we sign the request.
        auth.add_auth(request)
        self.assertEqual(request.headers.get_all('Authorization'),
                         [original_auth])
Ejemplo n.º 36
0
    def test_resign_uses_most_recent_date(self):
        dates = [
            'Thu, 17 Nov 2005 18:49:58 GMT',
            'Thu, 17 Nov 2014 20:00:00 GMT',
        ]
        self.formatdate.side_effect = dates

        request = AWSRequest()
        request.headers['Content-Type'] = 'text/html'
        request.method = 'PUT'
        request.url = 'https://s3.amazonaws.com/bucket/key'

        self.hmacv1.add_auth(request)
        original_date = request.headers['Date']

        self.hmacv1.add_auth(request)
        modified_date = request.headers['Date']

        # Each time we sign a request, we make another call to formatdate()
        # so we should have a different date header each time.
        self.assertEqual(original_date, dates[0])
        self.assertEqual(modified_date, dates[1])
Ejemplo n.º 37
0
 def test_s3_sigv4_presign(self):
     auth = botocore.auth.S3SigV4QueryAuth(
         self.credentials, self.service_name, self.region_name, expires=60)
     request = AWSRequest()
     request.method = 'GET'
     request.url = (
         'https://s3.us-west-2.amazonaws.com/mybucket/keyname/.bar')
     auth.add_auth(request)
     query_string = self.get_parsed_query_string(request)
     # We use a different payload:
     self.assertEqual(auth.payload(request), 'UNSIGNED-PAYLOAD')
     # which will result in a different X-Amz-Signature:
     self.assertEqual(
         query_string,
         {'X-Amz-Algorithm': 'AWS4-HMAC-SHA256',
          'X-Amz-Credential': ('access_key/20140101/myregion/'
                               'myservice/aws4_request'),
          'X-Amz-Date': '20140101T000000Z',
          'X-Amz-Expires': '60',
          'X-Amz-Signature': ('ac1b8b9e47e8685c5c963d75e35e8741d55251'
                              'cd955239cc1efad4dc7201db66'),
          'X-Amz-SignedHeaders': 'host'})
Ejemplo n.º 38
0
 def sign_request(self, region, url_to_sign):
     credentials = self._session.get_credentials()
     signer = SigV4Auth(credentials, 'codecommit', region)
     request = AWSRequest()
     request.url = url_to_sign
     request.method = 'GIT'
     now = datetime.datetime.utcnow()
     request.context['timestamp'] = now.strftime('%Y%m%dT%H%M%S')
     split = urlsplit(request.url)
     # we don't want to include the port number in the signature
     hostname = split.netloc.split(':')[0]
     canonical_request = '{0}\n{1}\n\nhost:{2}\n\nhost\n'.format(
         request.method,
         split.path,
         hostname)
     logger.debug("Calculating signature using v4 auth.")
     logger.debug('CanonicalRequest:\n%s', canonical_request)
     string_to_sign = signer.string_to_sign(request, canonical_request)
     logger.debug('StringToSign:\n%s', string_to_sign)
     signature = signer.signature(string_to_sign, request)
     logger.debug('Signature:\n%s', signature)
     return '{0}Z{1}'.format(request.context['timestamp'], signature)
Ejemplo n.º 39
0
    def test_resign_uses_most_recent_date(self):
        dates = [
            'Thu, 17 Nov 2005 18:49:58 GMT',
            'Thu, 17 Nov 2014 20:00:00 GMT',
        ]
        self.formatdate.side_effect = dates

        request = AWSRequest()
        request.headers['Content-Type'] = 'text/html'
        request.method = 'PUT'
        request.url = 'https://s3.amazonaws.com/bucket/key'

        self.hmacv1.add_auth(request)
        original_date = request.headers['Date']

        self.hmacv1.add_auth(request)
        modified_date = request.headers['Date']

        # Each time we sign a request, we make another call to formatdate()
        # so we should have a different date header each time.
        self.assertEqual(original_date, dates[0])
        self.assertEqual(modified_date, dates[1])
Ejemplo n.º 40
0
    def test_thread_safe_timestamp(self):
        request = AWSRequest()
        request.url = (
            'https://search-testdomain1-j67dwxlet67gf7ghwfmik2c67i.us-west-2.'
            'cloudsearch.amazonaws.com/'
            '2013-01-01/search?format=sdk&pretty=true&'
            'q.options=%7B%22defaultOperator%22%3A%20%22and%22%2C%20%22'
            'fields%22%3A%5B%22directors%5E10%22%5D%7D&q=George%20Lucas'
        )
        request.method = 'GET'
        auth = botocore.auth.SigV4Auth(
            self.credentials, 'cloudsearchdomain', 'us-west-2')
        with mock.patch.object(
                botocore.auth.datetime, 'datetime',
                mock.Mock(wraps=datetime.datetime)) as mock_datetime:
            original_utcnow = datetime.datetime(2014, 1, 1, 0, 0)

            mock_datetime.utcnow.return_value = original_utcnow
            # Go through the add_auth process once. This will attach
            # a timestamp to the request at the beginning of auth.
            auth.add_auth(request)
            self.assertEqual(request.context['timestamp'], '20140101T000000Z')
            # Ensure the date is in the Authorization header
            self.assertIn('20140101', request.headers['Authorization'])
            # Now suppose the utc time becomes the next day all of a sudden
            mock_datetime.utcnow.return_value = datetime.datetime(
                2014, 1, 2, 0, 0)
            # Smaller methods like the canonical request and string_to_sign
            # should  have the timestamp attached to the request in their
            # body and not what the time is now mocked as. This is to ensure
            # there is no mismatching in timestamps when signing.
            cr = auth.canonical_request(request)
            self.assertIn('x-amz-date:20140101T000000Z', cr)
            self.assertNotIn('x-amz-date:20140102T000000Z', cr)

            sts = auth.string_to_sign(request, cr)
            self.assertIn('20140101T000000Z', sts)
            self.assertNotIn('20140102T000000Z', sts)
Ejemplo n.º 41
0
    def test_thread_safe_timestamp(self):
        request = AWSRequest()
        request.url = (
            'https://search-testdomain1-j67dwxlet67gf7ghwfmik2c67i.us-west-2.'
            'cloudsearch.amazonaws.com/'
            '2013-01-01/search?format=sdk&pretty=true&'
            'q.options=%7B%22defaultOperator%22%3A%20%22and%22%2C%20%22'
            'fields%22%3A%5B%22directors%5E10%22%5D%7D&q=George%20Lucas'
        )
        request.method = 'GET'
        auth = self.create_signer('cloudsearchdomain', 'us-west-2')
        with mock.patch.object(
                botocore.auth.datetime, 'datetime',
                mock.Mock(wraps=datetime.datetime)) as mock_datetime:
            original_utcnow = datetime.datetime(2014, 1, 1, 0, 0)

            mock_datetime.utcnow.return_value = original_utcnow
            # Go through the add_auth process once. This will attach
            # a timestamp to the request at the beginning of auth.
            auth.add_auth(request)
            self.assertEqual(request.context['timestamp'], '20140101T000000Z')
            # Ensure the date is in the Authorization header
            self.assertIn('20140101', request.headers['Authorization'])
            # Now suppose the utc time becomes the next day all of a sudden
            mock_datetime.utcnow.return_value = datetime.datetime(
                2014, 1, 2, 0, 0)
            # Smaller methods like the canonical request and string_to_sign
            # should  have the timestamp attached to the request in their
            # body and not what the time is now mocked as. This is to ensure
            # there is no mismatching in timestamps when signing.
            cr = auth.canonical_request(request)
            self.assertIn('x-amz-date:20140101T000000Z', cr)
            self.assertNotIn('x-amz-date:20140102T000000Z', cr)

            sts = auth.string_to_sign(request, cr)
            self.assertIn('20140101T000000Z', sts)
            self.assertNotIn('20140102T000000Z', sts)