Fix Enum field, which allows unrestricted values

For some reason, the Enum field allows valid_values to be None, which disables
all the is-this-a-valid-value checking, thus defeating the entire purpose of
the type. This patch removes that possibility so that we don't let anything
creep into the RPC-affecting API that would be unrestricted.

The change that introduced this was I7848f8b934c169a76b1cfd875f7905273f9f914b

Closes-Bug: #1441243
Change-Id: Ia33994402cca5b4569d72860ab5da675134f5a95
This commit is contained in:
Dan Smith 2015-04-07 09:13:32 -07:00
parent bf70df295b
commit c741f98e04
2 changed files with 18 additions and 5 deletions

View File

@ -254,18 +254,25 @@ class String(FieldType):
class Enum(String):
def __init__(self, valid_values=None, **kwargs):
def __init__(self, valid_values, **kwargs):
try:
length = len(valid_values)
except TypeError:
raise ValueError('valid_values is not a sequence'
' of permitted values')
if length == 0:
raise ValueError('valid_values may not be empty')
self._valid_values = valid_values
super(Enum, self).__init__(**kwargs)
def coerce(self, obj, attr, value):
if self._valid_values and value not in self._valid_values:
if value not in self._valid_values:
msg = _("Field value %s is invalid") % value
raise ValueError(msg)
return super(Enum, self).coerce(obj, attr, value)
def stringify(self, value):
if self._valid_values and value not in self._valid_values:
if value not in self._valid_values:
msg = _("Field value %s is invalid") % value
raise ValueError(msg)
return super(Enum, self).stringify(value)
@ -592,7 +599,7 @@ class StringField(AutoTypedField):
class EnumField(AutoTypedField):
def __init__(self, valid_values=None, **kwargs):
def __init__(self, valid_values, **kwargs):
self.AUTO_TYPE = Enum(valid_values=valid_values)
super(EnumField, self).__init__(**kwargs)
@ -674,7 +681,7 @@ class ListOfStringsField(AutoTypedField):
class ListOfEnumField(AutoTypedField):
def __init__(self, valid_values=None, **kwargs):
def __init__(self, valid_values, **kwargs):
self.AUTO_TYPE = List(Enum(valid_values=valid_values))
super(ListOfEnumField, self).__init__(**kwargs)

View File

@ -108,6 +108,12 @@ class TestEnum(TestField):
field2 = fields.EnumField(valid_values=['foo', 'bar1'])
self.assertNotEqual(str(field1), str(field2))
def test_without_valid_values(self):
self.assertRaises(ValueError, fields.EnumField, 1)
def test_with_empty_values(self):
self.assertRaises(ValueError, fields.EnumField, [])
class TestInteger(TestField):
def setUp(self):