[PATCHv2] Beware of possible unicode strings (#876293)
Vratislav Podzimek
vpodzime at redhat.com
Thu Dec 6 10:35:14 UTC 2012
__str__ method should return byte string, not unicode string. But as we
don't have a ensure this in every KS_OBJECT.__str__ method, let's add
encode("utf-8") call to the result if it is a unicode string.
Also add test for these issues.
Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
---
pykickstart/base.py | 10 +++++++--
tests/parser/handle_unicode.py | 49 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 57 insertions(+), 2 deletions(-)
create mode 100644 tests/parser/handle_unicode.py
diff --git a/pykickstart/base.py b/pykickstart/base.py
index 4ef442c..e12b86c 100644
--- a/pykickstart/base.py
+++ b/pykickstart/base.py
@@ -281,10 +281,16 @@ class BaseHandler(KickstartObject):
for prio in lst:
for obj in self._writeOrder[prio]:
- retval += obj.__str__()
+ obj_str = obj.__str__()
+ if type(obj_str) == types.UnicodeType:
+ obj_str = obj_str.encode("utf-8")
+ retval += obj_str
for script in self.scripts:
- retval += script.__str__()
+ script_str = script.__str__()
+ if type(script_str) == types.UnicodeType:
+ script_str = script_str.encode("utf-8")
+ retval += script_str
retval += self.packages.__str__()
diff --git a/tests/parser/handle_unicode.py b/tests/parser/handle_unicode.py
new file mode 100644
index 0000000..22ebd10
--- /dev/null
+++ b/tests/parser/handle_unicode.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+import unittest
+from tests.baseclass import *
+
+from pykickstart import constants
+from pykickstart.errors import KickstartParseError
+from pykickstart import version
+
+class HandleUnicode_TestCase(ParserTest):
+ ks = """
+rootpw ááááááááá
+
+%post
+echo áááááá
+%end
+"""
+
+ def runTest(self):
+ unicode_str1 = u"ááááááááá"
+ unicode_str2 = u"áááááá"
+ encoded_str1 = unicode_str1.encode("utf-8")
+ encoded_str2 = unicode_str2.encode("utf-8")
+
+ # parser should parse string including non-ascii characters
+ self.parser.readKickstartFromString(self.ks)
+
+ # str(handler) should not cause traceback and should contain the
+ # original non-ascii strings as utf-8 encoded byte strings and
+ # str(self.handler) should not fail -- i.e. self.handler.__str__()
+ # should return byte string not unicode string
+ self.assertIn(encoded_str1, str(self.handler))
+ self.assertIn(encoded_str2, str(self.handler))
+
+ # set root password to unicode string
+ self.handler.rootpw.password = unicode_str1
+
+ # str(handler) should not cause traceback and should contain the
+ # original unicode string as utf-8 encoded byte string
+ self.assertIn(encoded_str1, str(self.handler))
+
+ # set root password to encoded string
+ self.handler.rootpw.password = encoded_str1
+
+ # str(handler) should not cause traceback and should contain the
+ # original unicode string as utf-8 encoded byte string
+ self.assertIn(encoded_str1, str(self.handler))
+
+if __name__ == "__main__":
+ unittest.main()
--
1.7.11.7
More information about the anaconda-patches
mailing list