#define IMAP_IS_DELETED(flags) ((flags & IMAP_FLAG_DELETED) != 0)
#define IMAP_IS_DRAFT(flags) ((flags & IMAP_FLAG_DRAFT) != 0)
#define IMAP_IS_FORWARDED(flags) ((flags & IMAP_FLAG_FORWARDED) != 0)
+#define IMAP_IS_SPAM(flags) ((flags & IMAP_FLAG_SPAM) != 0)
+#define IMAP_IS_HAM(flags) ((flags & IMAP_FLAG_HAM) != 0)
#define IMAP4_PORT 143
static IMAPSession *imap_session_new (Folder *folder,
const PrefsAccount *account);
-static gint imap_session_authenticate(IMAPSession *session,
- const PrefsAccount *account);
+static gint imap_session_authenticate(IMAPSession *session,
+ PrefsAccount *account);
static void imap_session_destroy (Session *session);
static gchar *imap_fetch_msg (Folder *folder,
case MAILIMAP_NO_ERROR:
return;
case MAILIMAP_NO_ERROR_AUTHENTICATED:
- log_warning(LOG_PROTOCOL, _("IMAP error: authenticated\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: authenticated\n"), session->server);
break;
case MAILIMAP_NO_ERROR_NON_AUTHENTICATED:
- log_warning(LOG_PROTOCOL, _("IMAP error: not authenticated\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: not authenticated\n"), session->server);
break;
case MAILIMAP_ERROR_BAD_STATE:
- log_warning(LOG_PROTOCOL, _("IMAP error: bad state\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: bad state\n"), session->server);
break;
case MAILIMAP_ERROR_STREAM:
- log_warning(LOG_PROTOCOL, _("IMAP error: stream error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: stream error\n"), session->server);
break;
case MAILIMAP_ERROR_PARSE:
- log_warning(LOG_PROTOCOL, _("IMAP error: parse error "
- "(very probably non-RFC compliance from the server)\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: parse error "
+ "(very probably non-RFC compliance from the server)\n"), session->server);
break;
case MAILIMAP_ERROR_CONNECTION_REFUSED:
- log_warning(LOG_PROTOCOL, _("IMAP error: connection refused\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: connection refused\n"), session->server);
break;
case MAILIMAP_ERROR_MEMORY:
- log_warning(LOG_PROTOCOL, _("IMAP error: memory error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: memory error\n"), session->server);
break;
case MAILIMAP_ERROR_FATAL:
- log_warning(LOG_PROTOCOL, _("IMAP error: fatal error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: fatal error\n"), session->server);
break;
case MAILIMAP_ERROR_PROTOCOL:
- log_warning(LOG_PROTOCOL, _("IMAP error: protocol error"
- "(very probably non-RFC compliance from the server)\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: protocol error"
+ "(very probably non-RFC compliance from the server)\n"), session->server);
break;
case MAILIMAP_ERROR_DONT_ACCEPT_CONNECTION:
- log_warning(LOG_PROTOCOL, _("IMAP error: connection not accepted\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: connection not accepted\n"), session->server);
break;
case MAILIMAP_ERROR_APPEND:
- log_warning(LOG_PROTOCOL, _("IMAP error: APPEND error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: APPEND error\n"), session->server);
break;
case MAILIMAP_ERROR_NOOP:
- log_warning(LOG_PROTOCOL, _("IMAP error: NOOP error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: NOOP error\n"), session->server);
break;
case MAILIMAP_ERROR_LOGOUT:
- log_warning(LOG_PROTOCOL, _("IMAP error: LOGOUT error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: LOGOUT error\n"), session->server);
break;
case MAILIMAP_ERROR_CAPABILITY:
- log_warning(LOG_PROTOCOL, _("IMAP error: CAPABILITY error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: CAPABILITY error\n"), session->server);
break;
case MAILIMAP_ERROR_CHECK:
- log_warning(LOG_PROTOCOL, _("IMAP error: CHECK error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: CHECK error\n"), session->server);
break;
case MAILIMAP_ERROR_CLOSE:
- log_warning(LOG_PROTOCOL, _("IMAP error: CLOSE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: CLOSE error\n"), session->server);
break;
case MAILIMAP_ERROR_EXPUNGE:
- log_warning(LOG_PROTOCOL, _("IMAP error: EXPUNGE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXPUNGE error\n"), session->server);
break;
case MAILIMAP_ERROR_COPY:
- log_warning(LOG_PROTOCOL, _("IMAP error: COPY error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: COPY error\n"), session->server);
break;
case MAILIMAP_ERROR_UID_COPY:
- log_warning(LOG_PROTOCOL, _("IMAP error: UID COPY error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID COPY error\n"), session->server);
break;
case MAILIMAP_ERROR_CREATE:
- log_warning(LOG_PROTOCOL, _("IMAP error: CREATE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: CREATE error\n"), session->server);
break;
case MAILIMAP_ERROR_DELETE:
- log_warning(LOG_PROTOCOL, _("IMAP error: DELETE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: DELETE error\n"), session->server);
break;
case MAILIMAP_ERROR_EXAMINE:
- log_warning(LOG_PROTOCOL, _("IMAP error: EXAMINE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXAMINE error\n"), session->server);
break;
case MAILIMAP_ERROR_FETCH:
- log_warning(LOG_PROTOCOL, _("IMAP error: FETCH error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: FETCH error\n"), session->server);
break;
case MAILIMAP_ERROR_UID_FETCH:
- log_warning(LOG_PROTOCOL, _("IMAP error: UID FETCH error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID FETCH error\n"), session->server);
break;
case MAILIMAP_ERROR_LIST:
- log_warning(LOG_PROTOCOL, _("IMAP error: LIST error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: LIST error\n"), session->server);
break;
case MAILIMAP_ERROR_LOGIN:
- log_warning(LOG_PROTOCOL, _("IMAP error: LOGIN error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: LOGIN error\n"), session->server);
break;
case MAILIMAP_ERROR_LSUB:
- log_warning(LOG_PROTOCOL, _("IMAP error: LSUB error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: LSUB error\n"), session->server);
break;
case MAILIMAP_ERROR_RENAME:
- log_warning(LOG_PROTOCOL, _("IMAP error: RENAME error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: RENAME error\n"), session->server);
break;
case MAILIMAP_ERROR_SEARCH:
- log_warning(LOG_PROTOCOL, _("IMAP error: SEARCH error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: SEARCH error\n"), session->server);
break;
case MAILIMAP_ERROR_UID_SEARCH:
- log_warning(LOG_PROTOCOL, _("IMAP error: UID SEARCH error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID SEARCH error\n"), session->server);
break;
case MAILIMAP_ERROR_SELECT:
- log_warning(LOG_PROTOCOL, _("IMAP error: SELECT error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: SELECT error\n"), session->server);
break;
case MAILIMAP_ERROR_STATUS:
- log_warning(LOG_PROTOCOL, _("IMAP error: STATUS error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: STATUS error\n"), session->server);
break;
case MAILIMAP_ERROR_STORE:
- log_warning(LOG_PROTOCOL, _("IMAP error: STORE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: STORE error\n"), session->server);
break;
case MAILIMAP_ERROR_UID_STORE:
- log_warning(LOG_PROTOCOL, _("IMAP error: UID STORE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: UID STORE error\n"), session->server);
break;
case MAILIMAP_ERROR_SUBSCRIBE:
- log_warning(LOG_PROTOCOL, _("IMAP error: SUBSCRIBE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: SUBSCRIBE error\n"), session->server);
break;
case MAILIMAP_ERROR_UNSUBSCRIBE:
- log_warning(LOG_PROTOCOL, _("IMAP error: UNSUBSCRIBE error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: UNSUBSCRIBE error\n"), session->server);
break;
case MAILIMAP_ERROR_STARTTLS:
- log_warning(LOG_PROTOCOL, _("IMAP error: STARTTLS error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: STARTTLS error\n"), session->server);
break;
case MAILIMAP_ERROR_INVAL:
- log_warning(LOG_PROTOCOL, _("IMAP error: INVAL error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: INVAL error\n"), session->server);
break;
case MAILIMAP_ERROR_EXTENSION:
- log_warning(LOG_PROTOCOL, _("IMAP error: EXTENSION error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: EXTENSION error\n"), session->server);
break;
case MAILIMAP_ERROR_SASL:
- log_warning(LOG_PROTOCOL, _("IMAP error: SASL error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: SASL error\n"), session->server);
break;
-#if (LIBETPAN_VERSION_MAJOR > 0 || LIBETPAN_VERSION_MINOR > 48)
#if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
case MAILIMAP_ERROR_SSL:
- log_warning(LOG_PROTOCOL, _("IMAP error: SSL error\n"));
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: SSL error\n"), session->server);
break;
-#endif
#endif
default:
- log_warning(LOG_PROTOCOL, _("IMAP error: Unknown error [%d]\n"),
- libetpan_errcode);
+ log_warning(LOG_PROTOCOL, _("IMAP error on %s: Unknown error [%d]\n"),
+ session->server, libetpan_errcode);
break;
}
static gint imap_auth(IMAPSession *session, const gchar *user, const gchar *pass,
IMAPAuthType type)
{
- gint ok = MAILIMAP_ERROR_BAD_STATE;
+ gint ok = MAILIMAP_ERROR_LOGIN;
static time_t last_login_err = 0;
gchar *ext_info = "";
int r;
authenticated = FALSE;
}
else {
-#if (LIBETPAN_VERSION_MAJOR > 0 || LIBETPAN_VERSION_MINOR > 48)
#if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
if (r == MAILIMAP_ERROR_SSL)
log_error(LOG_PROTOCOL, _("SSL handshake failed\n"));
else
-#endif
#endif
imap_handle_error(NULL, r);
}
session = g_new0(IMAPSession, 1);
- session_init(SESSION(session));
+ session_init(SESSION(session), account, FALSE);
SESSION(session)->type = SESSION_IMAP;
SESSION(session)->server = g_strdup(account->recv_server);
SESSION(session)->port = port;
}
static gint imap_session_authenticate(IMAPSession *session,
- const PrefsAccount *account)
+ PrefsAccount *account)
{
gchar *pass, *acc_pass;
gboolean failed = FALSE;
pass = acc_pass;
if (!pass && account->imap_auth_type != IMAP_AUTH_ANON) {
gchar *tmp_pass;
- tmp_pass = input_dialog_query_password(account->recv_server, account->userid);
+ tmp_pass = input_dialog_query_password_keep(account->recv_server,
+ account->userid,
+ &(account->session_passwd));
if (!tmp_pass)
return MAILIMAP_NO_ERROR;
Xstrdup_a(pass, tmp_pass, {g_free(tmp_pass); return MAILIMAP_NO_ERROR;});
if (!failed && !is_fatal(ok)) {
acc_pass = NULL;
failed = TRUE;
+ if (account->session_passwd != NULL) {
+ g_free(account->session_passwd);
+ account->session_passwd = NULL;
+ }
goto try_again;
} else {
if (prefs_common.no_recv_err_panel) {
if (filename == NULL)
return -1;
- fp = fopen(filename, "rb");
+ fp = g_fopen(filename, "rb");
if (!fp)
return -1;
for (cur = tags_set; cur; cur = cur->next) {
gint cur_tag = GPOINTER_TO_INT(cur->data);
const gchar *str = tags_get_tag(cur_tag);
- list_set = g_slist_prepend(list_set, g_strdup(str));
+ if (strcmp(str, "$Forwarded") && strcmp(str, "Junk") && strcmp(str, "NonJunk") && strcmp(str, "NotJunk") && strcmp(str, "NoJunk") && strcmp(str, "Junk") )
+ list_set = g_slist_prepend(list_set, g_strdup(str));
}
if (list_set) {
ok = imap_set_message_flags(session,
for (cur = tags_unset; cur; cur = cur->next) {
gint cur_tag = GPOINTER_TO_INT(cur->data);
const gchar *str = tags_get_tag(cur_tag);
- list_unset = g_slist_prepend(list_unset, g_strdup(str));
+ if (strcmp(str, "$Forwarded") && strcmp(str, "Junk") && strcmp(str, "NonJunk") && strcmp(str, "NotJunk") && strcmp(str, "NoJunk") && strcmp(str, "Junk") )
+ list_unset = g_slist_prepend(list_unset, g_strdup(str));
}
if (list_unset) {
ok = imap_set_message_flags(session,
iflags |= IMAP_FLAG_ANSWERED;
if (MSG_IS_FORWARDED(*fileinfo->flags))
iflags |= IMAP_FLAG_FORWARDED;
+ if (MSG_IS_SPAM(*fileinfo->flags))
+ iflags |= IMAP_FLAG_SPAM;
+ else
+ iflags |= IMAP_FLAG_HAM;
if (!MSG_IS_UNREAD(*fileinfo->flags))
iflags |= IMAP_FLAG_SEEN;
"has been compiled without OpenSSL "
"support.\n"),
SESSION(session)->server);
- return MAILIMAP_ERROR_BAD_STATE;
+ return MAILIMAP_ERROR_LOGIN;
#endif
} else {
log_error(LOG_PROTOCOL, _("Server logins are disabled.\n"));
- return MAILIMAP_ERROR_BAD_STATE;
+ return MAILIMAP_ERROR_LOGIN;
}
}
if ( MSG_IS_FORWARDED(msginfo->flags) && !(newflags & MSG_FORWARDED))
flags_unset |= IMAP_FLAG_FORWARDED;
+ if (!MSG_IS_SPAM(msginfo->flags) && (newflags & MSG_SPAM)) {
+ flags_set |= IMAP_FLAG_SPAM;
+ flags_unset |= IMAP_FLAG_HAM;
+ }
+ if ( MSG_IS_SPAM(msginfo->flags) && !(newflags & MSG_SPAM)) {
+ flags_set |= IMAP_FLAG_HAM;
+ flags_unset |= IMAP_FLAG_SPAM;
+ }
if (!MSG_IS_DELETED(msginfo->flags) && (newflags & MSG_DELETED))
flags_set |= IMAP_FLAG_DELETED;
if ( MSG_IS_DELETED(msginfo->flags) && !(newflags & MSG_DELETED))
GHashTable *tags_hash = NULL;
gboolean full_search = stuff->full_search;
GSList *sorted_list = NULL;
- GSList *unseen = NULL, *answered = NULL, *flagged = NULL, *deleted = NULL, *forwarded = NULL;
+ GSList *unseen = NULL, *answered = NULL, *flagged = NULL, *deleted = NULL, *forwarded = NULL, *spam = NULL;
GSList *seq_list, *cur;
gboolean reverse_seen = FALSE;
gboolean selected_folder;
}
}
+ if (flag_ok(IMAP_FOLDER_ITEM(fitem), IMAP_FLAG_SPAM)) {
+ r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_SPAM,
+ full_search ? NULL:imapset, &lep_uidlist);
+ if (r == MAILIMAP_NO_ERROR) {
+ GSList * uidlist;
+
+ uidlist = imap_uid_list_from_lep(lep_uidlist);
+ mailimap_search_result_free(lep_uidlist);
+
+ spam = g_slist_concat(spam, uidlist);
+ } else {
+ imap_handle_error(SESSION(session), r);
+ goto bail;
+ }
+ }
+
r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_DELETED,
full_search ? NULL:imapset, &lep_uidlist);
if (r == MAILIMAP_NO_ERROR) {
msginfo = (MsgInfo *) elem->data;
flags = msginfo->flags.perm_flags;
wasnew = (flags & MSG_NEW);
- oldflags = flags & ~(MSG_NEW|MSG_UNREAD|MSG_REPLIED|MSG_FORWARDED|MSG_MARKED|MSG_DELETED);
+ oldflags = flags & ~(MSG_NEW|MSG_UNREAD|MSG_REPLIED|MSG_FORWARDED|MSG_MARKED|MSG_DELETED|MSG_SPAM);
if (folder->account && folder->account->low_bandwidth) {
if (fitem->opened || fitem->processing_pending || fitem == folder->inbox) {
- flags &= ~((reverse_seen ? 0 : MSG_UNREAD | MSG_NEW) | MSG_REPLIED | MSG_FORWARDED | MSG_MARKED);
+ flags &= ~((reverse_seen ? 0 : MSG_UNREAD | MSG_NEW) | MSG_REPLIED | MSG_FORWARDED | MSG_MARKED | MSG_SPAM);
} else {
flags &= ~((reverse_seen ? 0 : MSG_UNREAD | MSG_NEW | MSG_MARKED));
}
flags |= MSG_FORWARDED;
else
flags &= ~MSG_FORWARDED;
+ if (gslist_find_next_num(&spam, msginfo->msgnum) == msginfo->msgnum)
+ flags |= MSG_SPAM;
+ else
+ flags &= ~MSG_SPAM;
if (gslist_find_next_num(&deleted, msginfo->msgnum) == msginfo->msgnum)
flags |= MSG_DELETED;
else
g_slist_free(deleted);
g_slist_free(answered);
g_slist_free(forwarded);
+ g_slist_free(spam);
g_slist_free(unseen);
g_slist_free(sorted_list);
if (IMAP_IS_FORWARDED(flags) && flag_ok(item, IMAP_FLAG_FORWARDED))
mailimap_flag_list_add(flag_list,
mailimap_flag_new_flag_keyword(strdup("$Forwarded")));
+ if (IMAP_IS_SPAM(flags) && flag_ok(item, IMAP_FLAG_SPAM))
+ mailimap_flag_list_add(flag_list,
+ mailimap_flag_new_flag_keyword(strdup("Junk")));
+ else if (IMAP_IS_HAM(flags) && flag_ok(item, IMAP_FLAG_HAM))
+ mailimap_flag_list_add(flag_list,
+ mailimap_flag_new_flag_keyword(strdup("NonJunk")));
for (; cur; cur = cur->next) {
gchar *enc_str =