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)
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())
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)
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')
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))
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'))