summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/utilities/importer.py15
-rw-r--r--src/mailman/utilities/tests/test_import.py22
2 files changed, 35 insertions, 2 deletions
diff --git a/src/mailman/utilities/importer.py b/src/mailman/utilities/importer.py
index 0822f3362..14214438b 100644
--- a/src/mailman/utilities/importer.py
+++ b/src/mailman/utilities/importer.py
@@ -103,6 +103,10 @@ def nonmember_action_mapping(value):
elif value == 3:
return Action.discard
+
+def unicode_to_string(value):
+ return str(value) if value is not None else None
+
# Attributes in Mailman 2 which have a different type in Mailman 3.
TYPES = dict(
@@ -124,6 +128,7 @@ TYPES = dict(
forward_unrecognized_bounces_to=UnrecognizedBounceDisposition,
default_member_action=member_action_mapping,
default_nonmember_action=nonmember_action_mapping,
+ moderator_password=unicode_to_string,
)
@@ -177,7 +182,15 @@ def import_config_pck(mlist, config_dict):
# strings).
if hasattr(mlist, key):
if isinstance(value, str):
- value = unicode(value, 'ascii')
+ for encoding in ("ascii", "utf-8"):
+ try:
+ value = unicode(value, encoding)
+ except UnicodeDecodeError, e:
+ continue
+ else:
+ break
+ if isinstance(value, str): # we did our best
+ value = unicode(value, 'ascii', 'replace')
# Some types require conversion.
converter = TYPES.get(key)
if converter is not None:
diff --git a/src/mailman/utilities/tests/test_import.py b/src/mailman/utilities/tests/test_import.py
index bc018f33d..d4ae72fbf 100644
--- a/src/mailman/utilities/tests/test_import.py
+++ b/src/mailman/utilities/tests/test_import.py
@@ -168,6 +168,12 @@ class TestBasicImport(unittest.TestCase):
self._import()
self.assertEqual(self._mlist.moderator_password, None)
+ def test_moderator_password_str(self):
+ # moderator_password must not be unicode
+ self._pckdict[b"mod_password"] = b'TESTVALUE'
+ self._import()
+ self.assertEqual(self._mlist.moderator_password, b'TESTVALUE')
+
def test_newsgroup_moderation(self):
# news_moderation -> newsgroup_moderation
# news_prefix_subject_too -> nntp_prefix_subject_too
@@ -205,6 +211,20 @@ class TestBasicImport(unittest.TestCase):
alias_set = IAcceptableAliasSet(self._mlist)
self.assertEqual(sorted(alias_set.aliases), aliases)
+ def test_info_non_ascii(self):
+ # info can contain non-ascii chars
+ info = 'O idioma aceito \xe9 somente Portugu\xeas do Brasil'
+ self._pckdict[b"info"] = info.encode("utf-8")
+ self._import()
+ self.assertEqual(self._mlist.info, info,
+ "Encoding to UTF-8 is not handled")
+ # test fallback to ascii with replace
+ self._pckdict[b"info"] = info.encode("iso-8859-1")
+ self._import()
+ self.assertEqual(self._mlist.info,
+ unicode(self._pckdict[b"info"], "ascii", "replace"),
+ "We don't fall back to replacing non-ascii chars")
+
class TestArchiveImport(unittest.TestCase):
@@ -560,7 +580,7 @@ class TestRosterImport(unittest.TestCase):
user = self._usermanager.get_user(addr)
self.assertTrue(user is not None,
"Address %s was not imported" % addr)
- self.assertEqual(user.password, '{plaintext}%spass' % name,
+ self.assertEqual(user.password, b'{plaintext}%spass' % name,
"Password for %s was not imported" % addr)
def test_same_user(self):