diff options
-rw-r--r-- | CHANGES.rst | 6 | ||||
-rw-r--r-- | pyasn1/__init__.py | 2 | ||||
-rw-r--r-- | pyasn1/type/char.py | 69 | ||||
-rw-r--r-- | pyasn1/type/univ.py | 4 | ||||
-rw-r--r-- | tests/type/test_char.py | 5 |
5 files changed, 42 insertions, 44 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index ec0f303..92c7a67 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,4 +1,10 @@ +Revision 0.3.4, released XX-08-2017 +----------------------------------- + +- Fixed Character types instantiation from OctetString type -- double + unicode decoding may have scrambled the data + Revision 0.3.3, released 27-08-2017 ----------------------------------- diff --git a/pyasn1/__init__.py b/pyasn1/__init__.py index 5dd7945..8b713b4 100644 --- a/pyasn1/__init__.py +++ b/pyasn1/__init__.py @@ -1,7 +1,7 @@ import sys # http://www.python.org/dev/peps/pep-0396/ -__version__ = '0.3.3' +__version__ = '0.3.4' if sys.version_info[:2] < (2, 4): raise RuntimeError('PyASN1 requires Python 2.4 or later') diff --git a/pyasn1/type/char.py b/pyasn1/type/char.py index b95e9a7..155af21 100644 --- a/pyasn1/type/char.py +++ b/pyasn1/type/char.py @@ -53,36 +53,29 @@ class AbstractCharacterString(univ.OctetString): return self._value.encode(self.encoding) except UnicodeEncodeError: raise error.PyAsn1Error( - 'Can\'t encode string \'%s\' with \'%s\' codec' % (self._value, self.encoding) + "Can't encode string '%s' with codec %s" % (self._value, self.encoding) ) def __unicode__(self): - return unicode(self._value) + return self._value def prettyIn(self, value): - if isinstance(value, unicode): - return value - elif isinstance(value, str): - try: + try: + if isinstance(value, unicode): + return value + elif isinstance(value, str): return value.decode(self.encoding) - except (LookupError, UnicodeDecodeError): - raise error.PyAsn1Error( - 'Can\'t decode string \'%s\' with \'%s\' codec' % (value, self.encoding) - ) - elif isinstance(value, (tuple, list)): - try: + elif isinstance(value, (tuple, list)): return self.prettyIn(''.join([chr(x) for x in value])) - except ValueError: - raise error.PyAsn1Error( - 'Bad %s initializer \'%s\'' % (self.__class__.__name__, value) - ) - else: - try: + elif isinstance(value, univ.OctetString): + return value.asOctets().decode(self.encoding) + else: return unicode(value) - except UnicodeDecodeError: - raise error.PyAsn1Error( - 'Can\'t turn object \'%s\' into unicode' % (value,) - ) + + except (UnicodeDecodeError, LookupError): + raise error.PyAsn1Error( + "Can't decode string '%s' with codec %s" % (value, self.encoding) + ) def asOctets(self, padding=True): return str(self) @@ -99,28 +92,26 @@ class AbstractCharacterString(univ.OctetString): return self._value.encode(self.encoding) except UnicodeEncodeError: raise error.PyAsn1Error( - 'Can\'t encode string \'%s\' with \'%s\' codec' % (self._value, self.encoding) + "Can't encode string '%s' with codec %s" % (self._value, self.encoding) ) def prettyIn(self, value): - if isinstance(value, str): - return value - elif isinstance(value, bytes): - try: + try: + if isinstance(value, str): + return value + elif isinstance(value, bytes): return value.decode(self.encoding) - except UnicodeDecodeError: - raise error.PyAsn1Error( - 'Can\'t decode string \'%s\' with \'%s\' codec' % (value, self.encoding) - ) - elif isinstance(value, (tuple, list)): - return self.prettyIn(bytes(value)) - else: - try: + elif isinstance(value, (tuple, list)): + return self.prettyIn(bytes(value)) + elif isinstance(value, univ.OctetString): + return value.asOctets().decode(self.encoding) + else: return str(value) - except (UnicodeDecodeError, ValueError): - raise error.PyAsn1Error( - 'Can\'t turn object \'%s\' into unicode' % (value,) - ) + + except (UnicodeDecodeError, LookupError): + raise error.PyAsn1Error( + "Can't decode string '%s' with codec %s" % (value, self.encoding) + ) def asOctets(self, padding=True): return bytes(self) diff --git a/pyasn1/type/univ.py b/pyasn1/type/univ.py index 98c6204..b9b8fa0 100644 --- a/pyasn1/type/univ.py +++ b/pyasn1/type/univ.py @@ -921,7 +921,7 @@ class OctetString(base.AbstractSimpleAsn1Item): return value.encode(self.encoding) except (LookupError, UnicodeEncodeError): raise error.PyAsn1Error( - 'Can\'t encode string \'%s\' with \'%s\' codec' % (value, self.encoding) + "Can't encode string '%s' with codec %s" % (value, self.encoding) ) elif isinstance(value, (tuple, list)): try: @@ -942,7 +942,7 @@ class OctetString(base.AbstractSimpleAsn1Item): except UnicodeDecodeError: raise error.PyAsn1Error( - 'Can\'t decode string \'%s\' with \'%s\' codec' % (self._value, self.encoding) + "Can't decode string '%s' with codec %s" % (self._value, self.encoding) ) def asOctets(self): diff --git a/tests/type/test_char.py b/tests/type/test_char.py index 4b17127..82b612b 100644 --- a/tests/type/test_char.py +++ b/tests/type/test_char.py @@ -61,11 +61,12 @@ class AbstractStringTestCase: def testInit(self): assert self.asn1Type(self.pythonString) == self.pythonString assert self.asn1Type(self.pythonString.encode(self.encoding)) == self.pythonString + assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding))) == self.pythonString assert self.asn1Type(self.initializer, encoding=self.encoding) == self.pythonString def testInitFromAsn1(self): - assert self.asn1Type(self.asn1Type(self.pythonString)) == self.pythonString - assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding), encoding=self.encoding)) == self.pythonString + assert self.asn1Type(self.asn1Type(self.pythonString)) == self.pythonString + assert self.asn1Type(univ.OctetString(self.pythonString.encode(self.encoding), encoding=self.encoding)) == self.pythonString def testAsOctets(self): assert self.asn1String.asOctets() == self.pythonString.encode(self.encoding), 'testAsOctets() fails' |