diff --git a/radius.py b/radius.py index 20ac5a3..c1751d4 100755 --- a/radius.py +++ b/radius.py @@ -326,7 +326,8 @@ def __init__(self, initialdata={}): def __getkeys(self, value): """Return tuple of code, name for given code or name.""" if isinstance(value, int): - return value, ATTRS[value] + return value, ATTRS.get(value, None) + else: id = ATTR_NAMES[value.lower()] return id, ATTRS[id] @@ -355,8 +356,13 @@ def __setitem__(self, key, value): """ try: code, name = self.__getkeys(key) + except KeyError: - raise ValueError('Invalid radius attribute: %s' % key) + raise ValueError('Unknown radius attribute: %s' % key) + + if name is None: + LOGGER.warning('Unknown radius attribute code %s' % code) + values = self.get(code, []) values.append(value) UserDict.__setitem__(self, code, values) diff --git a/tests.py b/tests.py index 717abfc..289e8f4 100644 --- a/tests.py +++ b/tests.py @@ -52,10 +52,10 @@ def test_set_get_item(self): """Test setting and getting items.""" a = radius.Attributes() - # Cannot use invalid radius codes or names. - with self.assertRaises(ValueError): - a[128] = b'bar' + # Can use unknown radius codes. + a[128] = b'bar' + # Cannot use invalid radius names. with self.assertRaises(ValueError): a['foo'] = b'bar' @@ -66,7 +66,8 @@ def test_set_get_item(self): self.assertEqual([b'foobar'], a[radius.ATTR_USER_NAME]) self.assertEqual([b'foobar'], a['user-name']) self.assertEqual([b'foobar'], a['user-Name']) - self.assertEqual([('User-Name', ['foobar'])], list(a.nameditems())) + self.assertEqual( + [(None, ['bar']), ('User-Name', ['foobar'])], list(a.nameditems())) def test_init_update(self): """Test __init__ and update."""