diff --git a/modoboa/extensions/webmail/exceptions.py b/modoboa/extensions/webmail/exceptions.py index f5e56cf41..51a42634a 100644 --- a/modoboa/extensions/webmail/exceptions.py +++ b/modoboa/extensions/webmail/exceptions.py @@ -6,14 +6,14 @@ """ import re from django.utils.translation import ugettext as _ -from modoboa.lib.exceptions import ModoboaException +from modoboa.lib.exceptions import ModoboaException, InternalError -class WebmailError(ModoboaException): - errorexpr = re.compile("\[([^\]]+)\]\s*([^\.]+)") +class WebmailInternalError(InternalError): + errorexpr = re.compile(r'\[([^\]]+)\]\s*([^\.]+)') def __init__(self, reason, ajax=False): - match = WebmailError.errorexpr.match(reason) + match = WebmailInternalError.errorexpr.match(reason) if not match: self.reason = reason else: @@ -24,6 +24,16 @@ class WebmailError(ModoboaException): return self.reason +class UnknownAction(ModoboaException): + """ + Use this exception when the webmail encounter an unknown action. + """ + http_code = 404 + + def __init__(self): + super(UnknownAction, self).__init__(_("Unknown action")) + + class ImapError(ModoboaException): def __init__(self, reason): self.reason = reason diff --git a/modoboa/extensions/webmail/imaputils.py b/modoboa/extensions/webmail/imaputils.py index 3afa1f70a..46cdd73f2 100644 --- a/modoboa/extensions/webmail/imaputils.py +++ b/modoboa/extensions/webmail/imaputils.py @@ -11,9 +11,10 @@ import time from functools import wraps from django.utils.translation import ugettext as _ from modoboa.lib import parameters, imap_utf7 +from modoboa.lib.exceptions import InternalError from modoboa.lib.connections import ConnectionsManager from modoboa.lib.webutils import static_url -from exceptions import ImapError, WebmailError +from exceptions import ImapError, WebmailInternalError from fetch_parser import parse_fetch_response #imaplib.Debug = 4 @@ -238,7 +239,7 @@ class IMAPconnector(object): data = self._cmd("LIST", "", "") m = self.list_response_pattern.match(data[0]) if m is None: - raise WebmailError(_("Failed to retrieve hierarchy delimiter")) + raise InternalError(_("Failed to retrieve hierarchy delimiter")) self.__hdelimiter = m.group('delimiter') return self.__hdelimiter @@ -564,20 +565,20 @@ class IMAPconnector(object): name = "%s%s%s" % (parent, self.hdelimiter, name) typ, data = self.m.create(self._encode_mbox_name(name)) if typ == "NO": - raise WebmailError(data[0]) + raise WebmailInternalError(data[0]) return True def rename_folder(self, oldname, newname): typ, data = self.m.rename(self._encode_mbox_name(oldname), self._encode_mbox_name(newname)) if typ == "NO": - raise WebmailError(data[0], ajax=True) + raise WebmailInternalError(data[0], ajax=True) return True def delete_folder(self, name): typ, data = self.m.delete(self._encode_mbox_name(name)) if typ == "NO": - raise WebmailError(data[0]) + raise WebmailInternalError(data[0]) return True def getquota(self, mailbox): diff --git a/modoboa/extensions/webmail/lib.py b/modoboa/extensions/webmail/lib.py index 427a917d1..c31eba136 100644 --- a/modoboa/extensions/webmail/lib.py +++ b/modoboa/extensions/webmail/lib.py @@ -10,12 +10,13 @@ from django.core.files.uploadhandler import FileUploadHandler, SkipFile from django.utils.translation import ugettext as _, ugettext_lazy from django.conf import settings from modoboa.lib import u2u_decode, tables, parameters +from modoboa.lib.exceptions import InternalError from modoboa.lib.webutils import size2integer from modoboa.lib.email_listing import EmailListing from modoboa.lib.emailutils import ( EmailAddress, Email, prepare_addresses, set_email_headers ) -from modoboa.extensions.webmail.exceptions import WebmailError +from modoboa.extensions.webmail.exceptions import WebmailInternalError from modoboa.extensions.webmail.imaputils import ( IMAPconnector, get_imapconnector, BodyStructure ) @@ -562,8 +563,8 @@ def save_attachment(f): dstdir = os.path.join(settings.MEDIA_ROOT, "webmail") try: fp = NamedTemporaryFile(dir=dstdir, delete=False) - except Exception, e: - raise WebmailError(str(e)) + except Exception as e: + raise InternalError(str(e)) for chunk in f.chunks(): fp.write(chunk) fp.close() @@ -706,19 +707,19 @@ def send_mail(request, posturl=None): int(parameters.get_admin("SMTP_PORT"))) if secmode == "starttls": s.starttls() - except Exception, text: - raise WebmailError(str(text)) + except Exception as text: + raise WebmailInternalError(str(text)) if parameters.get_admin("SMTP_AUTHENTICATION") == "yes": try: s.login(request.user.username, get_password(request)) except smtplib.SMTPException, e: - raise WebmailError(str(e)) + raise WebmailInternalError(str(e)) try: s.sendmail(request.user.email, rcpts, msg.as_string()) s.quit() except smtplib.SMTPException, e: - raise WebmailError(str(e)) + raise WebmailInternalError(str(e)) sentfolder = parameters.get_user(request.user, "SENT_FOLDER") IMAPconnector(user=request.user.username, diff --git a/modoboa/extensions/webmail/views.py b/modoboa/extensions/webmail/views.py index 58e4c949b..a58ce7432 100644 --- a/modoboa/extensions/webmail/views.py +++ b/modoboa/extensions/webmail/views.py @@ -11,11 +11,12 @@ from django.contrib.auth.decorators import login_required from django.views.decorators.csrf import csrf_exempt from django.views.decorators.gzip import gzip_page from modoboa.lib import parameters +from modoboa.lib.exceptions import ModoboaException, BadRequest from modoboa.lib.webutils import ( _render_to_string, ajax_response, render_to_json_response ) from modoboa.extensions.admin.lib import needs_mailbox -from .exceptions import WebmailError +from .exceptions import UnknownAction from .forms import FolderForm, AttachmentForm, ComposeMailForm from .imaputils import get_imapconnector, IMAPconnector, separate_mailbox from .lib import ( @@ -43,7 +44,7 @@ def getattachment(request): pnum = request.GET.get("partnumber", None) fname = request.GET.get("fname", None) if not mbox or not mailid or not pnum or not fname: - raise WebmailError(_("Invalid request")) + raise BadRequest(_("Invalid request")) imapc = get_imapconnector(request) partdef, payload = imapc.fetchpart(mailid, mbox, pnum) @@ -61,7 +62,7 @@ def getattachment(request): def move(request): for arg in ["msgset", "to"]: if not arg in request.GET: - raise WebmailError(_("Invalid request")) + raise BadRequest(_("Invalid request")) mbc = get_imapconnector(request) mbc.move(request.GET["msgset"], request.session["mbox"], request.GET["to"]) resp = listmailbox(request, request.session["mbox"], update_session=False) @@ -74,7 +75,7 @@ def delete(request): mbox = request.GET.get("mbox", None) selection = request.GET.getlist("selection[]", None) if mbox is None or selection is None: - raise WebmailError(_("Invalid request")) + raise BadRequest(_("Invalid request")) selection = [item for item in selection if item.isdigit()] mbc = get_imapconnector(request) mbc.move(",".join(selection), mbox, @@ -92,12 +93,12 @@ def mark(request, name): status = request.GET.get("status", None) ids = request.GET.get("ids", None) if status is None or ids is None: - raise WebmailError(_("Invalid request")) + raise BadRequest(_("Invalid request")) imapc = get_imapconnector(request) try: getattr(imapc, "mark_messages_%s" % status)(name, ids) except AttributeError: - raise WebmailError(_("Unknown action")) + raise UnknownAction return render_to_json_response({ 'action': status, 'mbox': name, @@ -109,7 +110,7 @@ def mark(request, name): @needs_mailbox() def empty(request, name): if name != parameters.get_user(request.user, "TRASH_FOLDER"): - raise WebmailError(_("Invalid request")) + raise BadRequest(_("Invalid request")) get_imapconnector(request).empty(name) content = "