doc/news.rst | 2 ++ pyderasn.py | 12 +++++++++++- diff --git a/doc/news.rst b/doc/news.rst index 0318df6d3df6b8fee77fc54ed715f81e346e28b311d2297ddc29c7f04effd0b5..d7a2b5ddf9492dfbbd7b0d19c5649b9e4bd00f92e545b8f54d3366076291b4a7 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -6,6 +6,8 @@ 5.6 --- * Convenient ``.decod()`` method, that raises if tail is not empty +* Control characters (like newlines) of text fields in pprinted output + are escaped .. _release5.5: diff --git a/pyderasn.py b/pyderasn.py index e753744d32eccfcd6ba2f87eada13bd2ea2b70aa2358c6a4ce46da279b8a632f..f4bc82b8bd7a308402364f4c62acbb5cbc09e928f269e21b8082c7ee6047a42a 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -655,6 +655,7 @@ from math import ceil from os import environ from string import ascii_letters from string import digits +from unicodedata import category as unicat from six import add_metaclass from six import binary_type @@ -3590,6 +3591,12 @@ _specs=self.specs, ) +def escape_control_unicode(c): + if unicat(c).startswith("C"): + c = repr(c).lstrip("u").strip("'") + return c + + class CommonString(OctetString): """Common class for all strings @@ -3708,7 +3715,10 @@ def pps(self, decode_path=(), no_unicode=False): value = None if self.ready: - value = hexenc(bytes(self)) if no_unicode else self.__unicode__() + value = ( + hexenc(bytes(self)) if no_unicode else + "".join(escape_control_unicode(c) for c in self.__unicode__()) + ) yield _pp( obj=self, asn1_type_name=self.asn1_type_name,