summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrebs <drebs@leap.se>2013-12-28 20:09:03 -0200
committerdrebs <drebs@leap.se>2014-01-09 11:51:00 -0200
commit4381131163161c00f00a3eb300041374aa06d370 (patch)
tree2e286de83d56a5fe8d435ab1acd210402a398c1a
parentc2cccbcd4225049b35ea2c7be4bbe899532136ca (diff)
Convert unicode to str when raising in IMAP server (#4830).
-rw-r--r--changes/bug_4830_convert-unicode-to-str-when-raising1
-rw-r--r--src/leap/mail/imap/account.py32
-rw-r--r--src/leap/mail/imap/parser.py5
3 files changed, 32 insertions, 6 deletions
diff --git a/changes/bug_4830_convert-unicode-to-str-when-raising b/changes/bug_4830_convert-unicode-to-str-when-raising
new file mode 100644
index 0000000..86d9b1c
--- /dev/null
+++ b/changes/bug_4830_convert-unicode-to-str-when-raising
@@ -0,0 +1 @@
+ o Convert unicode to str when raising exceptions in IMAP server (#4830).
diff --git a/src/leap/mail/imap/account.py b/src/leap/mail/imap/account.py
index fd861e7..8f5b57b 100644
--- a/src/leap/mail/imap/account.py
+++ b/src/leap/mail/imap/account.py
@@ -36,6 +36,23 @@ from leap.soledad.client import Soledad
#######################################
+def _unicode_as_str(text):
+ """
+ Return some representation of C{text} as a str.
+
+ This is here mainly because Twisted's exception methods are not able to
+ print unicode text.
+
+ :param text: The text to convert.
+ :type text: unicode
+
+ :return: A representation of C{text} as str.
+ :rtype: str
+ """
+ # XXX is there a better str representation for unicode?
+ return repr(text)
+
+
class SoledadBackedAccount(WithMsgFields, IndexedDB, MBoxParser):
"""
An implementation of IAccount and INamespacePresenteer
@@ -128,7 +145,8 @@ class SoledadBackedAccount(WithMsgFields, IndexedDB, MBoxParser):
name = self._parse_mailbox_name(name)
if name not in self.mailboxes:
- raise imap4.MailboxException("No such mailbox")
+ raise imap4.MailboxException("No such mailbox: %s" %
+ _unicode_as_str(name))
return SoledadMailbox(name, soledad=self._soledad)
@@ -154,7 +172,7 @@ class SoledadBackedAccount(WithMsgFields, IndexedDB, MBoxParser):
name = self._parse_mailbox_name(name)
if name in self.mailboxes:
- raise imap4.MailboxCollision, name
+ raise imap4.MailboxCollision, _unicode_as_str(name)
if not creation_ts:
# by default, we pass an int value
@@ -240,7 +258,8 @@ class SoledadBackedAccount(WithMsgFields, IndexedDB, MBoxParser):
name = self._parse_mailbox_name(name)
if not name in self.mailboxes:
- raise imap4.MailboxException("No such mailbox")
+ raise imap4.MailboxException("No such mailbox: %s" %
+ _unicode_as_str(name))
mbox = self.getMailbox(name)
@@ -279,14 +298,14 @@ class SoledadBackedAccount(WithMsgFields, IndexedDB, MBoxParser):
newname = self._parse_mailbox_name(newname)
if oldname not in self.mailboxes:
- raise imap4.NoSuchMailbox, oldname
+ raise imap4.NoSuchMailbox, _unicode_as_str(oldname)
inferiors = self._inferiorNames(oldname)
inferiors = [(o, o.replace(oldname, newname, 1)) for o in inferiors]
for (old, new) in inferiors:
if new in self.mailboxes:
- raise imap4.MailboxCollision, new
+ raise imap4.MailboxCollision, _unicode_as_str(new)
for (old, new) in inferiors:
mbox = self._get_mailbox_by_name(old)
@@ -367,7 +386,8 @@ class SoledadBackedAccount(WithMsgFields, IndexedDB, MBoxParser):
"""
name = self._parse_mailbox_name(name)
if name not in self.subscriptions:
- raise imap4.MailboxException, "Not currently subscribed to " + name
+ raise imap4.MailboxException, \
+ "Not currently subscribed to %s" % _unicode_as_str(name)
self._set_subscription(name, False)
def listMailboxes(self, ref, wildcard):
diff --git a/src/leap/mail/imap/parser.py b/src/leap/mail/imap/parser.py
index 306dcf0..6a9ace9 100644
--- a/src/leap/mail/imap/parser.py
+++ b/src/leap/mail/imap/parser.py
@@ -102,6 +102,11 @@ class MBoxParser(object):
def _parse_mailbox_name(self, name):
"""
+ Return a normalized representation of the mailbox C{name}.
+
+ This method ensures that an eventual initial 'inbox' part of a
+ mailbox name is made uppercase.
+
:param name: the name of the mailbox
:type name: unicode