diff --git a/extensions/webmail/imaputils.py b/extensions/webmail/imaputils.py
index 1fc972598..8372b3b46 100644
--- a/extensions/webmail/imaputils.py
+++ b/extensions/webmail/imaputils.py
@@ -31,9 +31,9 @@ class capability(object):
def __call__(self, method):
@wraps(method)
def wrapped_func(cls, *args, **kwargs):
- if self.name in cls.m.capabilities:
+ if self.name in cls.capabilities:
return method(cls, *args, **kwargs)
- return getattr(cls, self.fallback_method)(*args, **kwargs)
+ return getattr(cls, self.fallback_method)(cls, **kwargs)
return wrapped_func
@@ -131,9 +131,7 @@ class IMAPconnector(object):
self.criterions = []
self.address = parameters.get_admin("IMAP_SERVER")
self.port = int(parameters.get_admin("IMAP_PORT"))
- status, msg = self.login(user, password)
- if not status:
- raise WebmailError(msg)
+ self.login(user, password)
def _cmd(self, name, *args, **kwargs):
"""IMAP command wrapper
@@ -216,14 +214,20 @@ class IMAPconnector(object):
if hasattr(self, "current_mailbox"):
del self.current_mailbox
else:
- return
- status, msg = self.login(user, password)
- if not status:
- raise ImapError(msg)
+ return
+ self.login(user, password)
def login(self, user, passwd):
- import socket
+ """Custom login method
+
+ We connect to the server, issue a LOGIN command. If
+ successfull, we try to record a eventuel CAPABILITY untagged
+ response. Otherwise, we issue the command.
+ :param user: username
+ :param passwd: password
+ """
+ import socket
try:
secured = parameters.get_admin("IMAP_SECURED")
if secured == "yes":
@@ -231,19 +235,23 @@ class IMAPconnector(object):
else:
self.m = imaplib.IMAP4(self.address, self.port)
except (socket.error, imaplib.IMAP4.error, ssl.SSLError), error:
- return False, _("Connection to IMAP server failed, check your configuration")
- try:
- self.m.login(user, passwd)
- except (imaplib.IMAP4.error, ssl.SSLError), error:
- return False, _("Authentication failed, check your configuration")
- return True, None
+ raise ImapError(_("Connection to IMAP server failed: %s" % error))
+
+ data = self._cmd("LOGIN", user, passwd)
+ self.m.state = "AUTH"
+ if self.m.untagged_responses.has_key("CAPABILITY"):
+ self.capabilities = \
+ self.m.untagged_responses.pop('CAPABILITY')[0].split()
+ else:
+ data = self._cmd("CAPABILITY")
+ self.capabilities = data[0].split()
def logout(self):
try:
- self.m.select()
- except imaplib.IMAP4.error:
+ self._cmd("CHECK")
+ except ImapError, e:
pass
- self.m.logout()
+ self._cmd("LOGOUT")
del self.m
self.m = None
@@ -303,7 +311,7 @@ class IMAPconnector(object):
:return: an integer
"""
data = self._cmd("STATUS", mailbox.encode("imap4-utf-7"), "(UNSEEN)")
- m = self.unseen_pattern.match(data[0])
+ m = self.unseen_pattern.match(data[-1])
if m is None:
return 0
return int(m.group(1))
@@ -329,12 +337,24 @@ class IMAPconnector(object):
sdescr["class"] = "subfolders"
return True
- def _listmboxes_simple(self, topmailbox='INBOX', md_mailboxes=[]):
+ def _listmboxes_simple(self, topmailbox='INBOX', mailboxes=[], **kwargs):
+ #data = self._cmd("LIST", "", "*")
(status, data) = self.m.list()
result = []
+ newmboxes = []
for mb in data:
flags, delimiter, name = self.list_response_pattern.match(mb).groups()
name = name.strip('"').decode("imap4-utf-7")
+ pos = -1
+ for idx, mdm in enumerate(mailboxes):
+ if mdm["name"] == name:
+ pos = idx
+ break
+ if pos == -1:
+ descr = dict(name=name)
+ newmboxes += [descr]
+ else:
+ descr = mailboxes[idx]
if re.search("\%s" % delimiter, name):
parts = name.split(".")
if not descr.has_key("path"):
@@ -344,18 +364,11 @@ class IMAPconnector(object):
parts[1:]):
descr["class"] = "subfolders"
continue
- present = False
- descr = {"name" : name}
- for mdf in md_mailboxes:
- if mdf["name"] == name:
- present = True
- break
- if not present:
- result += [descr]
- from operator import itemgetter
- return sorted(result, key=itemgetter("name"))
- @capability('LIST-EXTENDED', '_listfolders_simple')
+ from operator import itemgetter
+ mailboxes += sorted(newmboxes, key=itemgetter("name"))
+
+ @capability('LIST-EXTENDED', '_listmboxes_simple')
def _listmboxes(self, topmailbox='', mailboxes=[], until_mailbox=None):
pattern = ("%s.%%" % topmailbox.encode("imap4-utf-7")) if len(topmailbox) else "%"
resp = self._cmd("LIST", "", pattern, "RETURN", "(CHILDREN)")
@@ -513,7 +526,7 @@ class IMAPconnector(object):
return True
def getquota(self, mailbox):
- if not "QUOTA" in self.m.capabilities:
+ if not "QUOTA" in self.capabilities:
self.quota_limit = self.quota_actual = None
return
diff --git a/extensions/webmail/static/js/webmail.js b/extensions/webmail/static/js/webmail.js
index c5260ce6e..48ac95f9f 100644
--- a/extensions/webmail/static/js/webmail.js
+++ b/extensions/webmail/static/js/webmail.js
@@ -160,6 +160,7 @@ Webmail.prototype = {
/*if (this.gspinner) {
this.gspinner.hide();
}*/
+ $(window).unbind("resize");
if (response.menu != undefined) {
$("#menubar").html(response.menu);
$("#searchfield").searchbar({navobj: this.navobject});
@@ -679,6 +680,9 @@ Webmail.prototype = {
e.preventDefault();
$link.attr("disabled", "disabled");
+ if (this.editormode == "html") {
+ CKEDITOR.instances[this.editorid].updateElement();
+ }
$.ajax({
url: $form.attr("action"),
data: args,
@@ -696,7 +700,7 @@ Webmail.prototype = {
e.preventDefault();
if ($tr.hasClass("unseen")) {
- var mb = this.navobject.params["name"];
+ var mb = this.get_current_mailbox();
this.change_unseen_messages(mb, -1);
}
this.navobject.reset().setparams({
@@ -737,8 +741,28 @@ Webmail.prototype = {
*
* It is also shared with other similar actions : reply, forward.
*/
+ resize_editor: function() {
+ CKEDITOR.instances[this.editorid].resize("100%",
+ $("#body_container").outerHeight(true));
+ },
+
compose_callback: function(resp) {
this.page_update(resp);
+ this.editormode = resp.editor;
+ if (resp.editor == "html") {
+ var instance = CKEDITOR.instances[this.editorid];
+
+ $(window).resize($.proxy(this.resize_editor, this));
+ if (instance) {
+ CKEDITOR.remove(instance);
+ }
+ CKEDITOR.replace(this.editorid, {
+ customConfig: static_url("js/editor_config.js")
+ });
+ CKEDITOR.on("instanceReady", $.proxy(function(evt) {
+ this.resize_editor();
+ }, this));
+ }
if (resp.id != undefined) {
this.navobject.setparam("id", resp.id).update(false, true);
}
diff --git a/extensions/webmail/templates/webmail/index.html b/extensions/webmail/templates/webmail/index.html
index 27330b615..b2653f49c 100644
--- a/extensions/webmail/templates/webmail/index.html
+++ b/extensions/webmail/templates/webmail/index.html
@@ -3,6 +3,7 @@
{% block html_head %}
+