* Copyright notice from original mutt:
* Copyright (C) 1996-8 Michael R. Elkins <me@mutt.org>
* Copyright (C) 1996-9 Brandon Long <blong@fiction.net>
- * Copyright (C) 1999-2003 Brendan Cully <brendan@kublai.com>
+ * Copyright (C) 1999-2005 Brendan Cully <brendan@kublai.com>
*
* This file is part of mutt-ng, see http://www.muttng.org/.
* It's licensed under the GNU General Public License,
#include "mutt.h"
#include "mutt_curses.h"
#include "mx.h"
-#include "mailbox.h"
#include "globals.h"
#include "sort.h"
#include "browser.h"
if (mutt_bit_isset (idata->capabilities, ACL)) {
if (imap_check_acl (idata))
goto fail;
- if (!(mutt_bit_isset (idata->rights, IMAP_ACL_DELETE) ||
- mutt_bit_isset (idata->rights, IMAP_ACL_SEEN) ||
- mutt_bit_isset (idata->rights, IMAP_ACL_WRITE) ||
- mutt_bit_isset (idata->rights, IMAP_ACL_INSERT)))
+ if (!(mutt_bit_isset (idata->rights, ACL_DELETE) ||
+ mutt_bit_isset (idata->rights, ACL_SEEN) ||
+ mutt_bit_isset (idata->rights, ACL_WRITE) ||
+ mutt_bit_isset (idata->rights, ACL_INSERT)))
ctx->readonly = 1;
}
/* assume we have all rights if ACL is unavailable */
else {
- mutt_bit_set (idata->rights, IMAP_ACL_LOOKUP);
- mutt_bit_set (idata->rights, IMAP_ACL_READ);
- mutt_bit_set (idata->rights, IMAP_ACL_SEEN);
- mutt_bit_set (idata->rights, IMAP_ACL_WRITE);
- mutt_bit_set (idata->rights, IMAP_ACL_INSERT);
- mutt_bit_set (idata->rights, IMAP_ACL_POST);
- mutt_bit_set (idata->rights, IMAP_ACL_CREATE);
- mutt_bit_set (idata->rights, IMAP_ACL_DELETE);
+ mutt_bit_set (idata->rights, ACL_LOOKUP);
+ mutt_bit_set (idata->rights, ACL_READ);
+ mutt_bit_set (idata->rights, ACL_SEEN);
+ mutt_bit_set (idata->rights, ACL_WRITE);
+ mutt_bit_set (idata->rights, ACL_INSERT);
+ mutt_bit_set (idata->rights, ACL_POST);
+ mutt_bit_set (idata->rights, ACL_CREATE);
+ mutt_bit_set (idata->rights, ACL_DELETE);
}
ctx->hdrmax = count;
return count;
}
+/* Update the IMAP server to reflect the flags a single message. */
+
+int imap_sync_message (IMAP_DATA *idata, HEADER *hdr, BUFFER *cmd,
+ int *err_continue)
+{
+ char flags[LONG_STRING];
+ char uid[11];
+
+ hdr->changed = 0;
+
+ snprintf (uid, sizeof (uid), "%u", HEADER_DATA(hdr)->uid);
+ cmd->dptr = cmd->data;
+ mutt_buffer_addstr (cmd, "UID STORE ");
+ mutt_buffer_addstr (cmd, uid);
+
+ flags[0] = '\0';
+
+ imap_set_flag (idata, ACL_SEEN, hdr->read, "\\Seen ",
+ flags, sizeof (flags));
+ imap_set_flag (idata, ACL_WRITE, hdr->flagged,
+ "\\Flagged ", flags, sizeof (flags));
+ imap_set_flag (idata, ACL_WRITE, hdr->replied,
+ "\\Answered ", flags, sizeof (flags));
+ imap_set_flag (idata, ACL_DELETE, hdr->deleted,
+ "\\Deleted ", flags, sizeof (flags));
+
+ /* now make sure we don't lose custom tags */
+ if (mutt_bit_isset (idata->rights, ACL_WRITE))
+ imap_add_keywords (flags, hdr, idata->flags, sizeof (flags));
+
+ mutt_remove_trailing_ws (flags);
+
+ /* UW-IMAP is OK with null flags, Cyrus isn't. The only solution is to
+ * explicitly revoke all system flags (if we have permission) */
+ if (!*flags)
+ {
+ imap_set_flag (idata, ACL_SEEN, 1, "\\Seen ", flags, sizeof (flags));
+ imap_set_flag (idata, ACL_WRITE, 1, "\\Flagged ", flags, sizeof (flags));
+ imap_set_flag (idata, ACL_WRITE, 1, "\\Answered ", flags, sizeof (flags));
+ imap_set_flag (idata, ACL_DELETE, 1, "\\Deleted ", flags, sizeof (flags));
+
+ mutt_remove_trailing_ws (flags);
+
+ mutt_buffer_addstr (cmd, " -FLAGS.SILENT (");
+ } else
+ mutt_buffer_addstr (cmd, " FLAGS.SILENT (");
+
+ mutt_buffer_addstr (cmd, flags);
+ mutt_buffer_addstr (cmd, ")");
+
+ /* dumb hack for bad UW-IMAP 4.7 servers spurious FLAGS updates */
+ hdr->active = 0;
+
+ /* after all this it's still possible to have no flags, if you
+ * have no ACL rights */
+ if (*flags && (imap_exec (idata, cmd->data, 0) != 0) &&
+ err_continue && (*err_continue != M_YES))
+ {
+ *err_continue = imap_continue ("imap_sync_message: STORE failed",
+ idata->cmd.buf);
+ if (*err_continue != M_YES)
+ return -1;
+ }
+
+ hdr->active = 1;
+ idata->ctx->changed--;
+
+ return 0;
+}
+
/* update the IMAP server to reflect message changes done within mutt.
* Arguments
* ctx: the current context
IMAP_DATA *idata;
CONTEXT *appendctx = NULL;
BUFFER cmd;
- char flags[LONG_STRING];
- char uid[11];
int deleted;
int n;
int err_continue = M_NO; /* continue on error? */
memset (&cmd, 0, sizeof (cmd));
/* if we are expunging anyway, we can do deleted messages very quickly... */
- if (expunge && mutt_bit_isset (idata->rights, IMAP_ACL_DELETE)) {
+ if (expunge && mutt_bit_isset (idata->rights, ACL_DELETE)) {
mutt_buffer_addstr (&cmd, "UID STORE ");
deleted = imap_make_msg_set (idata, &cmd, M_DELETE, 1);
/* save status changes */
for (n = 0; n < ctx->msgcount; n++) {
if (ctx->hdrs[n]->active && ctx->hdrs[n]->changed) {
- ctx->hdrs[n]->changed = 0;
mutt_message (_("Saving message status flags... [%d/%d]"), n + 1,
ctx->msgcount);
- snprintf (uid, sizeof (uid), "%u", HEADER_DATA (ctx->hdrs[n])->uid);
- cmd.dptr = cmd.data;
- mutt_buffer_addstr (&cmd, "UID STORE ");
- mutt_buffer_addstr (&cmd, uid);
-
/* if the message has been rethreaded or attachments have been deleted
* we delete the message and reupload it.
* This works better if we're expunging, of course. */
else
_mutt_save_message (ctx->hdrs[n], appendctx, 1, 0, 0);
}
- flags[0] = '\0';
-
- imap_set_flag (idata, IMAP_ACL_SEEN, ctx->hdrs[n]->read, "\\Seen ",
- flags, sizeof (flags));
- imap_set_flag (idata, IMAP_ACL_WRITE, ctx->hdrs[n]->flagged,
- "\\Flagged ", flags, sizeof (flags));
- imap_set_flag (idata, IMAP_ACL_WRITE, ctx->hdrs[n]->replied,
- "\\Answered ", flags, sizeof (flags));
- imap_set_flag (idata, IMAP_ACL_DELETE, ctx->hdrs[n]->deleted,
- "\\Deleted ", flags, sizeof (flags));
-
- /* now make sure we don't lose custom tags */
- if (mutt_bit_isset (idata->rights, IMAP_ACL_WRITE))
- imap_add_keywords (flags, ctx->hdrs[n], idata->flags, sizeof (flags));
-
- mutt_remove_trailing_ws (flags);
-
- /* UW-IMAP is OK with null flags, Cyrus isn't. The only solution is to
- * explicitly revoke all system flags (if we have permission) */
- if (!*flags) {
- imap_set_flag (idata, IMAP_ACL_SEEN, 1, "\\Seen ", flags,
- sizeof (flags));
- imap_set_flag (idata, IMAP_ACL_WRITE, 1, "\\Flagged ", flags,
- sizeof (flags));
- imap_set_flag (idata, IMAP_ACL_WRITE, 1, "\\Answered ", flags,
- sizeof (flags));
- imap_set_flag (idata, IMAP_ACL_DELETE, 1, "\\Deleted ", flags,
- sizeof (flags));
-
- mutt_remove_trailing_ws (flags);
-
- mutt_buffer_addstr (&cmd, " -FLAGS.SILENT (");
- }
- else
- mutt_buffer_addstr (&cmd, " FLAGS.SILENT (");
-
- mutt_buffer_addstr (&cmd, flags);
- mutt_buffer_addstr (&cmd, ")");
-
- /* dumb hack for bad UW-IMAP 4.7 servers spurious FLAGS updates */
- ctx->hdrs[n]->active = 0;
-
- /* after all this it's still possible to have no flags, if you
- * have no ACL rights */
- if (*flags && (imap_exec (idata, cmd.data, 0) != 0) &&
- (err_continue != M_YES)) {
- err_continue = imap_continue ("imap_sync_mailbox: STORE failed",
- idata->cmd.buf);
- if (err_continue != M_YES) {
- rc = -1;
- goto out;
- }
- }
- ctx->hdrs[n]->active = 1;
+ if (imap_sync_message (idata, ctx->hdrs[n], &cmd, &err_continue) < 0) {
+ rc = -1;
+ goto out;
+ }
}
}
ctx->changed = 0;
/* We must send an EXPUNGE command if we're not closing. */
if (expunge && !(ctx->closing) &&
- mutt_bit_isset (idata->rights, IMAP_ACL_DELETE)) {
+ mutt_bit_isset (idata->rights, ACL_DELETE)) {
mutt_message _("Expunging messages from server...");
/* Set expunge bit so we don't get spurious reopened messages */
* command on a mailbox that you have selected
*/
- if (mutt_strcmp (mbox_unquoted, idata->mailbox) == 0
+ if (safe_strcmp (mbox_unquoted, idata->mailbox) == 0
|| (ascii_strcasecmp (mbox_unquoted, "INBOX") == 0
- && mutt_strcasecmp (mbox_unquoted, idata->mailbox) == 0)) {
+ && safe_strcasecmp (mbox_unquoted, idata->mailbox) == 0)) {
strfcpy (buf, "NOOP", sizeof (buf));
}
else if (mutt_bit_isset (idata->capabilities, IMAP4REV1) ||
/* The mailbox name may or may not be quoted here. We could try to
* munge the server response and compare with quoted (or vise versa)
* but it is probably more efficient to just strncmp against both. */
- if (mutt_strncmp (mbox_unquoted, s, mutt_strlen (mbox_unquoted)) == 0
- || mutt_strncmp (mbox, s, mutt_strlen (mbox)) == 0) {
+ if (safe_strncmp (mbox_unquoted, s, safe_strlen (mbox_unquoted)) == 0
+ || safe_strncmp (mbox, s, safe_strlen (mbox)) == 0) {
s = imap_next_word (s);
s = imap_next_word (s);
if (isdigit ((unsigned char) *s)) {
char mbox[LONG_STRING];
IMAP_MBOX mx;
- if (!mx_is_imap (path) || imap_parse_path (path, &mx)) {
+ if (mx_get_magic (path) == M_IMAP || imap_parse_path (path, &mx)) {
mutt_error (_("Bad mailbox name"));
return -1;
}
/* if the folder isn't selectable, append delimiter to force browse
* to enter it on second tab. */
if (noselect) {
- clen = mutt_strlen (list_word);
+ clen = safe_strlen (list_word);
list_word[clen++] = delim;
list_word[clen] = '\0';
}
/* copy in first word */
if (!completions) {
strfcpy (completion, list_word, sizeof (completion));
- matchlen = mutt_strlen (completion);
+ matchlen = safe_strlen (completion);
completions++;
continue;
}
/* reconnect if connection was lost */
int imap_reconnect (CONTEXT * ctx)
{
- IMAP_DATA *imap_data = (IMAP_DATA *) ctx->data;
+ IMAP_DATA *imap_data;
+
+ if (!ctx)
+ return (-1);
+
+ imap_data = (IMAP_DATA *) ctx->data;
if (imap_data) {
if (imap_data->status == IMAP_CONNECTED)