Add a new parameter type, SerialNumber, as a subclass of Str

Transmitting a big integer like a random serial number over
either xmlrpc or JSON is problematic because they only support
32-bit integers at best. A random serial number can be as big
as 128 bits (theoretically 160 but dogtag limits it).

Treat as a string instead. Internally the value can be treated
as an Integer to conversions to/from hex as needed but for
transmission purposes handle it as a string.

Fixes: https://pagure.io/freeipa/issue/2016

Signed-off-by: Rob Crittenden <rcritten@redhat.com>
Reviewed-By: Florence Blanc-Renaud <flo@redhat.com>
Reviewed-By: Francisco Trivino <ftrivino@redhat.com>
Reviewed-By: Alexander Bokovoy <abokovoy@redhat.com>
This commit is contained in:
Rob Crittenden
2022-02-24 12:53:35 -05:00
committed by Florence Blanc-Renaud
parent d3481449ee
commit 83be923ac5
5 changed files with 107 additions and 19 deletions

View File

@@ -1858,3 +1858,44 @@ class test_DNParam(ClassChecker):
for value in good:
assert mthd(value) == tuple(DN(oneval) for oneval in value)
assert o.convert(None) is None
class test_SerialNumber(ClassChecker):
"""
Test the `ipalib.parameters.SerialNumber` class.
"""
_cls = parameters.SerialNumber
def test_init(self):
"""
Test the `ipalib.parameters.SerialNumber.__init__` method.
"""
o = self.cls('my_serial')
assert o.type is str
assert o.length is None
def test_validate_scalar(self):
"""
Test the `ipalib.parameters.SerialNumber._convert_scalar` method.
"""
o = self.cls('my_serial')
mthd = o._validate_scalar
for value in ('1234', '0xabcd', '0xABCD'):
assert mthd(value) is None
bad = ['Hello', '123A']
for value in bad:
e = raises(errors.ValidationError, mthd, value)
assert e.name == 'my_serial'
assert_equal(e.error, 'must be an integer')
bad = ['-1234', '-0xAFF']
for value in bad:
e = raises(errors.ValidationError, mthd, value)
assert e.name == 'my_serial'
assert_equal(e.error, 'must be at least 0')
bad = ['0xGAH', '0x',]
for value in bad:
e = raises(errors.ValidationError, mthd, value)
assert e.name == 'my_serial'
assert_equal(
e.error, 'invalid valid hex'
)