def _parse_uri(self): if not check_utf8(self.environ['PATH_INFO']): raise InvalidURI(self.path) if self.bucket_in_host: obj = self.environ['PATH_INFO'][1:] or None return self.bucket_in_host, obj bucket, obj = self.split_path(0, 2, True) if bucket and not validate_bucket_name(bucket): # Ignore GET service case raise InvalidBucketName(bucket) return (bucket, obj)
def GET(self, req): """ Handle GET Service request """ log_s3api_command(req, 'list-buckets') resp = req.get_response(self.app, query={'format': 'json'}) containers = json.loads(resp.body) containers = filter( lambda item: validate_bucket_name(item['name']), containers) # we don't keep the creation time of a bucket (s3cmd doesn't # work without that) so we use something bogus. elem = Element('ListAllMyBucketsResult') owner = SubElement(elem, 'Owner') SubElement(owner, 'ID').text = req.user_id SubElement(owner, 'DisplayName').text = req.user_id buckets = SubElement(elem, 'Buckets') for c in containers: if 'last_modified' in c: ts = last_modified_date_to_timestamp(c['last_modified']) creation_date = S3Timestamp(ts).s3xmlformat else: creation_date = '2009-02-03T16:45:09.000Z' if CONF.s3_acl and CONF.check_bucket_owner: try: cname = c['name'].encode('utf-8') c_resp = req.get_response(self.app, 'HEAD', cname) if 'X-Timestamp' in c_resp.sw_headers: creation_date = S3Timestamp( c_resp.sw_headers['X-Timestamp']).s3xmlformat except AccessDenied: continue except NoSuchBucket: continue bucket = SubElement(buckets, 'Bucket') SubElement(bucket, 'Name').text = c['name'] SubElement(bucket, 'CreationDate').text = creation_date body = tostring(elem) return HTTPOk(content_type='application/xml', body=body)
def GET(self, req): """ Handle GET Service request """ resp = req.get_response(self.app, query={'format': 'json'}) containers = json.loads(resp.body) containers = filter(lambda item: validate_bucket_name(item['name']), containers) # we don't keep the creation time of a backet (s3cmd doesn't # work without that) so we use something bogus. elem = Element('ListAllMyBucketsResult') owner = SubElement(elem, 'Owner') SubElement(owner, 'ID').text = req.user_id SubElement(owner, 'DisplayName').text = req.user_id buckets = SubElement(elem, 'Buckets') for c in containers: if CONF.s3_acl and CONF.check_bucket_owner: try: req.get_response(self.app, 'HEAD', c['name']) except AccessDenied: continue except NoSuchBucket: continue bucket = SubElement(buckets, 'Bucket') SubElement(bucket, 'Name').text = c['name'] SubElement(bucket, 'CreationDate').text = \ '2009-02-03T16:45:09.000Z' body = tostring(elem) return HTTPOk(content_type='application/xml', body=body)
def GET(self, req): """ Handle GET Service request """ resp = req.get_response(self.app, query={'format': 'json'}) containers = json.loads(resp.body) containers = filter( lambda item: validate_bucket_name(item['name']), containers) # we don't keep the creation time of a backet (s3cmd doesn't # work without that) so we use something bogus. elem = Element('ListAllMyBucketsResult') owner = SubElement(elem, 'Owner') SubElement(owner, 'ID').text = req.user_id SubElement(owner, 'DisplayName').text = req.user_id buckets = SubElement(elem, 'Buckets') for c in containers: if CONF.s3_acl and CONF.check_bucket_owner: try: req.get_response(self.app, 'HEAD', c['name']) except AccessDenied: continue except NoSuchBucket: continue bucket = SubElement(buckets, 'Bucket') SubElement(bucket, 'Name').text = c['name'] SubElement(bucket, 'CreationDate').text = \ '2009-02-03T16:45:09.000Z' body = tostring(elem) return HTTPOk(content_type='application/xml', body=body)
def test_validate_bucket_name_with_dns_compliant_bucket_names_false(self): with mock.patch('swift3.utils.CONF.dns_compliant_bucket_names', False): # good cases self.assertTrue(utils.validate_bucket_name('bucket')) self.assertTrue(utils.validate_bucket_name('bucket1')) self.assertTrue(utils.validate_bucket_name('bucket-1')) self.assertTrue(utils.validate_bucket_name('b.u.c.k.e.t')) self.assertTrue(utils.validate_bucket_name('a' * 63)) self.assertTrue(utils.validate_bucket_name('a' * 255)) self.assertTrue(utils.validate_bucket_name('a_a')) self.assertTrue(utils.validate_bucket_name('Bucket')) self.assertTrue(utils.validate_bucket_name('BUCKET')) self.assertTrue(utils.validate_bucket_name('bucket-')) self.assertTrue(utils.validate_bucket_name('bucket_')) self.assertTrue(utils.validate_bucket_name('bucket.-bucket')) self.assertTrue(utils.validate_bucket_name('bucket-.bucket')) self.assertTrue(utils.validate_bucket_name('bucket..bucket')) # bad cases self.assertFalse(utils.validate_bucket_name('a')) self.assertFalse(utils.validate_bucket_name('aa')) self.assertFalse(utils.validate_bucket_name('a+a')) # ending with dot seems invalid in US standard, too self.assertFalse(utils.validate_bucket_name('bucket.')) self.assertFalse(utils.validate_bucket_name('a' * 256))
def test_validate_bucket_name(self): # good cases self.assertTrue(utils.validate_bucket_name('bucket')) self.assertTrue(utils.validate_bucket_name('bucket1')) self.assertTrue(utils.validate_bucket_name('bucket-1')) self.assertTrue(utils.validate_bucket_name('b.u.c.k.e.t')) self.assertTrue(utils.validate_bucket_name('a' * 63)) # bad cases self.assertFalse(utils.validate_bucket_name('a')) self.assertFalse(utils.validate_bucket_name('aa')) self.assertFalse(utils.validate_bucket_name('a+a')) self.assertFalse(utils.validate_bucket_name('a_a')) self.assertFalse(utils.validate_bucket_name('Bucket')) self.assertFalse(utils.validate_bucket_name('BUCKET')) self.assertFalse(utils.validate_bucket_name('bucket-')) self.assertFalse(utils.validate_bucket_name('bucket.')) self.assertFalse(utils.validate_bucket_name('bucket_')) self.assertFalse(utils.validate_bucket_name('bucket.-bucket')) self.assertFalse(utils.validate_bucket_name('bucket-.bucket')) self.assertFalse(utils.validate_bucket_name('bucket..bucket')) self.assertFalse(utils.validate_bucket_name('a' * 64))