Skip to content

Commit 1b5e35c

Browse files
daspecsterlukesneeringer
authored andcommitted
Raise ValueError exception if bucket name is invalid. (#3160)
1 parent 1bd4f11 commit 1b5e35c

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

storage/google/cloud/storage/_helpers.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,25 @@
2121
from hashlib import md5
2222

2323

24+
def _validate_name(name):
25+
"""Pre-flight ``Bucket`` name validation.
26+
27+
:type name: str or :data:`NoneType`
28+
:param name: Proposed bucket name.
29+
30+
:rtype: str or :data:`NoneType`
31+
:returns: ``name`` if valid.
32+
"""
33+
if name is None:
34+
return
35+
36+
# The first and las characters must be alphanumeric.
37+
if not all([name[0].isalnum(), name[-1].isalnum()]):
38+
raise ValueError(
39+
'Bucket names must start and end with a number or letter.')
40+
return name
41+
42+
2443
class _PropertyMixin(object):
2544
"""Abstract mixin for cloud storage classes with associated propertties.
2645
@@ -29,11 +48,12 @@ class _PropertyMixin(object):
2948
- path
3049
3150
:type name: str
32-
:param name: The name of the object.
51+
:param name: The name of the object. Bucket names must start and end with a
52+
number or letter.
3353
"""
3454

3555
def __init__(self, name=None):
36-
self.name = name
56+
self.name = _validate_name(name)
3757
self._properties = {}
3858
self._changes = set()
3959

storage/google/cloud/storage/bucket.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ class Bucket(_PropertyMixin):
8181
for the bucket (which requires a project).
8282
8383
:type name: str
84-
:param name: The name of the bucket.
84+
:param name: The name of the bucket. Bucket names must start and end with a
85+
number or letter.
8586
"""
8687

8788
_MAX_OBJECTS_FOR_ITERATION = 256

storage/unit_tests/test__helpers.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,19 @@ def test_client_is_abstract(self):
4646
mixin = self._make_one()
4747
self.assertRaises(NotImplementedError, lambda: mixin.client)
4848

49+
def test_bucket_name_value(self):
50+
bucket_name = 'testing123'
51+
mixin = self._make_one(name=bucket_name)
52+
self.assertEqual(mixin.name, bucket_name)
53+
54+
bad_start_bucket_name = '/testing123'
55+
with self.assertRaises(ValueError):
56+
self._make_one(name=bad_start_bucket_name)
57+
58+
bad_end_bucket_name = 'testing123/'
59+
with self.assertRaises(ValueError):
60+
self._make_one(name=bad_end_bucket_name)
61+
4962
def test_reload(self):
5063
connection = _Connection({'foo': 'Foo'})
5164
client = _Client(connection)

0 commit comments

Comments
 (0)