Ejemplo n.º 1
0
    def test_request_absolute_uri(self):
        environ = {
            'HTTP_HOST': 'test.com',
            'REQUEST_METHOD': 'GET'}
        headers = {'Authorization': 'AWS test:tester:hmac',
                   'X-Amz-Date': self.get_date_header()}
        req = Request.blank('/', environ=environ, headers=headers)

        req.environ['PATH_INFO'] = 'http://test.com/mybucket/myobject'
        s3_req = S3_Request(req.environ)
        self.assertEqual('mybucket', s3_req.container_name)
        self.assertEqual('myobject', s3_req.object_name)

        req.environ['PATH_INFO'] = 'http://test.com/mybucket/mydir/myobject'
        s3_req = S3_Request(req.environ)
        self.assertEqual('mybucket', s3_req.container_name)
        self.assertEqual('mydir/myobject', s3_req.object_name)

        # Virtual hosted-style
        environ = {
            'HTTP_HOST': 'mybucket.s3.test.com',
            'REQUEST_METHOD': 'GET'}
        req = Request.blank('/', environ=environ, headers=headers)

        with patch('swift3.cfg.CONF.storage_domain', 's3.test.com'):
            req.environ['PATH_INFO'] = 'http://mybucket.s3.test.com/myobject'
            s3_req = S3_Request(req.environ)
            self.assertEqual('mybucket', s3_req.container_name)
            self.assertEqual('myobject', s3_req.object_name)

            req.environ['PATH_INFO'] = \
                'http://mybucket.s3.test.com/mydir/myobject'
            s3_req = S3_Request(req.environ)
            self.assertEqual('mybucket', s3_req.container_name)
            self.assertEqual('mydir/myobject', s3_req.object_name)
Ejemplo n.º 2
0
    def test_get_container_info(self):
        self.swift.register('HEAD', '/v1/AUTH_test/bucket', HTTPNoContent,
                            {'x-container-read': 'foo',
                             'X-container-object-count': 5,
                             'X-container-meta-foo': 'bar'}, None)
        req = Request.blank('/bucket', environ={'REQUEST_METHOD': 'GET'},
                            headers={'Authorization': 'AWS test:tester:hmac',
                                     'Date': self.get_date_header()})
        s3_req = S3_Request(req.environ, True)
        # first, call get_response('HEAD')
        info = s3_req.get_container_info(self.app)
        self.assertTrue('status' in info)  # sanity
        self.assertEquals(204, info['status'])  # sanity
        self.assertEquals('foo', info['read_acl'])  # sanity
        self.assertEquals('5', info['object_count'])  # sanity
        self.assertEquals({'foo': 'bar'}, info['meta'])  # sanity
        with patch('swift3.request.get_container_info',
                   return_value={'status': 204}) as mock_info:
            # Then all calls goes to get_container_info
            for x in xrange(10):
                info = s3_req.get_container_info(self.swift)
                self.assertTrue('status' in info)  # sanity
                self.assertEquals(204, info['status'])  # sanity
            self.assertEquals(10, mock_info.call_count)

        expected_errors = [(404, NoSuchBucket), (0, InternalError)]
        for status, expected_error in expected_errors:
            with patch('swift3.request.get_container_info',
                       return_value={'status': status}):
                self.assertRaises(
                    expected_error, s3_req.get_container_info, MagicMock())
Ejemplo n.º 3
0
 def create_s3request_with_param(param, value):
     req = Request.blank(
         '/bucket?%s=%s' % (param, value),
         environ={'REQUEST_METHOD': 'GET'},
         headers={'Authorization': 'AWS test:tester:hmac',
                  'Date': self.get_date_header()})
     return S3_Request(req.environ, True)
Ejemplo n.º 4
0
    def test_canonical_uri_sigv2(self):
        environ = {
            'HTTP_HOST': 'bucket1.s3.test.com',
            'REQUEST_METHOD': 'GET'}

        headers = {'Authorization': 'AWS test:tester:hmac',
                   'X-Amz-Date': self.get_date_header()}

        # Virtual hosted-style
        with patch('swift3.cfg.CONF.storage_domain', 's3.test.com'):
            req = Request.blank('/', environ=environ, headers=headers)
            sigv2_req = S3_Request(req.environ)
            uri = sigv2_req._canonical_uri()
            self.assertEqual(uri, '/bucket1/')
            self.assertEqual(req.environ['PATH_INFO'], '/')

            req = Request.blank('/obj1', environ=environ, headers=headers)
            sigv2_req = S3_Request(req.environ)
            uri = sigv2_req._canonical_uri()
            self.assertEqual(uri, '/bucket1/obj1')
            self.assertEqual(req.environ['PATH_INFO'], '/obj1')

        environ = {
            'HTTP_HOST': 's3.test.com',
            'REQUEST_METHOD': 'GET'}

        # Path-style
        with patch('swift3.cfg.CONF.storage_domain', ''):
            req = Request.blank('/', environ=environ, headers=headers)
            sigv2_req = S3_Request(req.environ)
            uri = sigv2_req._canonical_uri()

            self.assertEqual(uri, '/')
            self.assertEqual(req.environ['PATH_INFO'], '/')

            req = Request.blank('/bucket1/obj1',
                                environ=environ,
                                headers=headers)
            sigv2_req = S3_Request(req.environ)
            uri = sigv2_req._canonical_uri()
            self.assertEqual(uri, '/bucket1/obj1')
            self.assertEqual(req.environ['PATH_INFO'], '/bucket1/obj1')
Ejemplo n.º 5
0
    def _test_request_timestamp_sigv2(self, date_header):
        # signature v4 here
        environ = {'REQUEST_METHOD': 'GET'}

        headers = {'Authorization': 'AWS test:tester:hmac'}
        headers.update(date_header)
        req = Request.blank('/', environ=environ, headers=headers)
        sigv2_req = S3_Request(req.environ)

        if 'X-Amz-Date' in date_header:
            timestamp = mktime(req.headers.get('X-Amz-Date'))
        elif 'Date' in date_header:
            timestamp = mktime(req.headers.get('Date'))
        else:
            self.fail('Invalid date header specified as test')
        self.assertEqual(timestamp, int(sigv2_req.timestamp))
Ejemplo n.º 6
0
    def test_check_signature_sigv2(self):
        # See https://web.archive.org/web/20151226025049/http://
        # docs.aws.amazon.com//AmazonS3/latest/dev/RESTAuthentication.html
        req = Request.blank('/photos/puppy.jpg',
                            headers={
                                'Host':
                                'johnsmith.s3.amazonaws.com',
                                'Date':
                                'Tue, 27 Mar 2007 19:36:42 +0000',
                                'Authorization':
                                ('AWS AKIAIOSFODNN7EXAMPLE:'
                                 'bWq2s1WEIj+Ydj0vQ697zp+IXMU='),
                            })
        sigv2_req = S3_Request(req.environ)
        expected_sts = '\n'.join([
            'GET',
            '',
            '',
            'Tue, 27 Mar 2007 19:36:42 +0000',
            '/johnsmith/photos/puppy.jpg',
        ])
        self.assertEqual(expected_sts, sigv2_req._string_to_sign())
        self.assertTrue(
            sigv2_req.check_signature(
                'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'))

        req = Request.blank('/photos/puppy.jpg',
                            method='PUT',
                            headers={
                                'Content-Type':
                                'image/jpeg',
                                'Content-Length':
                                '94328',
                                'Host':
                                'johnsmith.s3.amazonaws.com',
                                'Date':
                                'Tue, 27 Mar 2007 21:15:45 +0000',
                                'Authorization':
                                ('AWS AKIAIOSFODNN7EXAMPLE:'
                                 'MyyxeRY7whkBe+bq8fHCL/2kKUg='),
                            })
        sigv2_req = S3_Request(req.environ)
        expected_sts = '\n'.join([
            'PUT',
            '',
            'image/jpeg',
            'Tue, 27 Mar 2007 21:15:45 +0000',
            '/johnsmith/photos/puppy.jpg',
        ])
        self.assertEqual(expected_sts, sigv2_req._string_to_sign())
        self.assertTrue(
            sigv2_req.check_signature(
                'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'))

        req = Request.blank('/?prefix=photos&max-keys=50&marker=puppy',
                            headers={
                                'User-Agent':
                                'Mozilla/5.0',
                                'Host':
                                'johnsmith.s3.amazonaws.com',
                                'Date':
                                'Tue, 27 Mar 2007 19:42:41 +0000',
                                'Authorization':
                                ('AWS AKIAIOSFODNN7EXAMPLE:'
                                 'htDYFYduRNen8P9ZfE/s9SuKy0U='),
                            })
        sigv2_req = S3_Request(req.environ)
        expected_sts = '\n'.join([
            'GET',
            '',
            '',
            'Tue, 27 Mar 2007 19:42:41 +0000',
            '/johnsmith/',
        ])
        self.assertEqual(expected_sts, sigv2_req._string_to_sign())
        self.assertTrue(
            sigv2_req.check_signature(
                'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'))