]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
allowable_chars property 4.4
authorSergey Matveev <stargrave@stargrave.org>
Mon, 5 Nov 2018 18:07:00 +0000 (21:07 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 5 Nov 2018 18:07:00 +0000 (21:07 +0300)
doc/news.rst
pyderasn.py
tests/test_pyderasn.py

index f5e81504cd3425d8bfb9fb4a9c2a5d9b7f229485..a0349649ef7d4784e0a32d51298f0183dcc5ce88 100644 (file)
@@ -6,6 +6,8 @@ News
 4.4
 ---
 * All errors are inherited from ASN1Error class
+* NumericString/PrintableString has allowable_chars property holding all
+  allowed characters
 
 .. _release4.3:
 
index 2e74bda53a344f683d7c0548a572aefbfa77d41e..4a9684fc0b9a6a9e000764fbbca938e223640f4b 100755 (executable)
@@ -555,6 +555,7 @@ from six import iterbytes
 from six import PY2
 from six import string_types
 from six import text_type
+from six import unichr as six_unichr
 from six.moves import xrange as six_xrange
 
 
@@ -3492,39 +3493,55 @@ class UTF8String(CommonString):
     asn1_type_name = "UTF8String"
 
 
-class NumericString(CommonString):
+class AllowableCharsMixin(object):
+    @property
+    def allowable_chars(self):
+        if PY2:
+            return self._allowable_chars
+        return set(six_unichr(c) for c in self._allowable_chars)
+
+
+class NumericString(AllowableCharsMixin, CommonString):
     """Numeric string
 
     Its value is properly sanitized: only ASCII digits with spaces can
     be stored.
+
+    >>> NumericString().allowable_chars
+    set(['3', '4', '7', '5', '1', '0', '8', '9', ' ', '6', '2'])
     """
     __slots__ = ()
     tag_default = tag_encode(18)
     encoding = "ascii"
     asn1_type_name = "NumericString"
-    allowable_chars = set(digits.encode("ascii") + b" ")
+    _allowable_chars = set(digits.encode("ascii") + b" ")
 
     def _value_sanitize(self, value):
         value = super(NumericString, self)._value_sanitize(value)
-        if not set(value) <= self.allowable_chars:
+        if not set(value) <= self._allowable_chars:
             raise DecodeError("non-numeric value")
         return value
 
 
-class PrintableString(CommonString):
+class PrintableString(AllowableCharsMixin, CommonString):
     """Printable string
 
     Its value is properly sanitized: see X.680 41.4 table 10.
+
+    >>> PrintableString().allowable_chars
+    >>> set([' ', "'", ..., 'z'])
     """
     __slots__ = ()
     tag_default = tag_encode(19)
     encoding = "ascii"
     asn1_type_name = "PrintableString"
-    allowable_chars = set((ascii_letters + digits + " '()+,-./:=?").encode("ascii"))
+    _allowable_chars = set(
+        (ascii_letters + digits + " '()+,-./:=?").encode("ascii")
+    )
 
     def _value_sanitize(self, value):
         value = super(PrintableString, self)._value_sanitize(value)
-        if not set(value) <= self.allowable_chars:
+        if not set(value) <= self._allowable_chars:
             raise DecodeError("non-printable value")
         return value
 
index 8f02a02ad0fddaff99d2509bea8e726eebf1606d..26addf001e5f164b8187fa19250a96902fa06e58 100644 (file)
@@ -5869,10 +5869,10 @@ class TestGoMarshalVectors(TestCase):
         seq["erste"] = PrintableString("test")
         self.assertSequenceEqual(seq.encode(), hexdec("3006130474657374"))
         # Asterisk is actually not allowable
-        PrintableString.allowable_chars |= set(b"*")
+        PrintableString._allowable_chars |= set(b"*")
         seq["erste"] = PrintableString("test*")
         self.assertSequenceEqual(seq.encode(), hexdec("30071305746573742a"))
-        PrintableString.allowable_chars -= set(b"*")
+        PrintableString._allowable_chars -= set(b"*")
 
         class Seq(Sequence):
             schema = (