# include "config.h"
#endif
+#include "defs.h"
+
#include <glib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <ctype.h>
+#include <time.h>
#include "intl.h"
#include "imap.h"
#include "socket.h"
+#include "ssl.h"
#include "recv.h"
#include "procmsg.h"
#include "procheader.h"
#include "codeconv.h"
#include "utils.h"
#include "inputdialog.h"
-#include "ssl.h"
#define IMAP4_PORT 143
#if USE_SSL
guint32 last_uid);
static void imap_delete_all_cached_messages (FolderItem *item);
-#if !USE_SSL
+#if USE_SSL
static SockInfo *imap_open (const gchar *server,
gushort port,
- gchar *buf);
+ gchar *buf,
+ gboolean use_ssl);
#else
static SockInfo *imap_open (const gchar *server,
gushort port,
- gchar *buf,
- gboolean use_ssl);
+ gchar *buf);
#endif
static gint imap_set_message_flags (IMAPSession *session,
g_return_val_if_fail(folder->type == F_IMAP, NULL);
g_return_val_if_fail(folder->account != NULL, NULL);
-#if !USE_SSL
+#if USE_SSL
port = folder->account->set_imapport ? folder->account->imapport
- : IMAP4_PORT;
+ : folder->account->ssl_imap ? IMAPS_PORT : IMAP4_PORT;
#else
port = folder->account->set_imapport ? folder->account->imapport
- : (folder->account->ssl_imap ? IMAPS_PORT : IMAP4_PORT);
+ : IMAP4_PORT;
#endif
if (!rfolder->session) {
rfolder->session =
-#if !USE_SSL
+#if USE_SSL
imap_session_new(folder->account->recv_server, port,
folder->account->userid,
- folder->account->passwd);
+ folder->account->passwd,
+ folder->account->ssl_imap);
#else
imap_session_new(folder->account->recv_server, port,
folder->account->userid,
- folder->account->passwd,
- folder->account->ssl_imap);
+ folder->account->passwd);
#endif
- if (rfolder->session)
+ if (rfolder->session) {
imap_parse_namespace(IMAP_SESSION(rfolder->session),
IMAP_FOLDER(folder));
+ rfolder->session->last_access_time = time(NULL);
+ }
+ statusbar_pop_all();
+ return IMAP_SESSION(rfolder->session);
+ }
+
+ if (time(NULL) - rfolder->session->last_access_time < SESSION_TIMEOUT) {
+ rfolder->session->last_access_time = time(NULL);
statusbar_pop_all();
return IMAP_SESSION(rfolder->session);
}
folder->account->recv_server, port);
session_destroy(rfolder->session);
rfolder->session =
-#if !USE_SSL
+#if USE_SSL
imap_session_new(folder->account->recv_server, port,
folder->account->userid,
- folder->account->passwd);
+ folder->account->passwd,
+ folder->account->ssl_imap);
#else
imap_session_new(folder->account->recv_server, port,
folder->account->userid,
- folder->account->passwd,
- folder->account->ssl_imap);
+ folder->account->passwd);
#endif
if (rfolder->session)
imap_parse_namespace(IMAP_SESSION(rfolder->session),
IMAP_FOLDER(folder));
}
+ if (rfolder->session)
+ rfolder->session->last_access_time = time(NULL);
statusbar_pop_all();
return IMAP_SESSION(rfolder->session);
}
return pass;
}
-#if !USE_SSL
-Session *imap_session_new(const gchar *server, gushort port,
- const gchar *user, const gchar *pass)
-#else
+#if USE_SSL
Session *imap_session_new(const gchar *server, gushort port,
const gchar *user, const gchar *pass,
gboolean use_ssl)
+#else
+Session *imap_session_new(const gchar *server, gushort port,
+ const gchar *user, const gchar *pass)
#endif
{
gchar buf[IMAPBUFSIZE];
log_message(_("creating IMAP4 connection to %s:%d ...\n"),
server, port);
-#if !USE_SSL
- if ((imap_sock = imap_open(server, port, buf)) == NULL)
-#else
+#if USE_SSL
if ((imap_sock = imap_open(server, port, buf, use_ssl)) == NULL)
+#else
+ if ((imap_sock = imap_open(server, port, buf)) == NULL)
#endif
return NULL;
if (imap_cmd_login(imap_sock, user, pass) != IMAP_SUCCESS) {
}
session = g_new(IMAPSession, 1);
- SESSION(session)->type = SESSION_IMAP;
- SESSION(session)->server = g_strdup(server);
- SESSION(session)->sock = imap_sock;
- SESSION(session)->connected = TRUE;
- SESSION(session)->phase = SESSION_READY;
- SESSION(session)->data = NULL;
+ SESSION(session)->type = SESSION_IMAP;
+ SESSION(session)->server = g_strdup(server);
+ SESSION(session)->sock = imap_sock;
+ SESSION(session)->connected = TRUE;
+ SESSION(session)->phase = SESSION_READY;
+ SESSION(session)->last_access_time = time(NULL);
+ SESSION(session)->data = NULL;
session->mbox = NULL;
session_list = g_list_append(session_list, session);
void imap_session_destroy(IMAPSession *session)
{
-#if USE_SSL
- ssl_done_socket(SESSION(session)->sock);
-#endif
sock_close(SESSION(session)->sock);
SESSION(session)->sock = NULL;
return IMAP_SUCCESS;
}
+#define QUOTE_IF_REQUIRED(out, str) \
+{ \
+ if (*str != '"' && strchr(str, ' ')) { \
+ gint len; \
+ len = strlen(str) + 3; \
+ Xalloca(out, len, return IMAP_ERROR); \
+ g_snprintf(out, len, "\"%s\"", str); \
+ } else { \
+ Xstrdup_a(out, str, return IMAP_ERROR); \
+ } \
+}
+
gint imap_remove_all_msg(Folder *folder, FolderItem *item)
{
gint exists, recent, unseen;
IMAPFolder *imapfolder;
FolderItem *new_item;
GSList *item_list, *cur;
- gchar *real_path;
+ gchar *real_path, *wildcard_path, *wildcard_path_;
g_return_if_fail(item != NULL);
g_return_if_fail(item->folder != NULL);
if (item->path) {
real_path = imap_get_real_path(imapfolder, item->path);
- imap_cmd_gen_send(SESSION(session)->sock, "LIST \"\" %s%c%%",
- real_path,
+ Xstrconcat_a(wildcard_path, real_path,"/%", return IMAP_ERROR);
+ QUOTE_IF_REQUIRED(wildcard_path_, wildcard_path);
+ imap_cmd_gen_send(SESSION(session)->sock, "LIST \"\" %s",
+ wildcard_path_,
namespace && namespace->separator
? namespace->separator : '/');
+ g_free(wildcard_path);
} else {
real_path = g_strdup(namespace && namespace->name
? namespace->name : "");
- imap_cmd_gen_send(SESSION(session)->sock, "LIST \"\" %s%%",
- real_path);
+ Xstrconcat_a(wildcard_path, real_path, "%", return IMAP_ERROR);
+ QUOTE_IF_REQUIRED(wildcard_path_, wildcard_path);
+ imap_cmd_gen_send(SESSION(session)->sock, "LIST \"\" %s",
+ wildcard_path_);
+ g_free(wildcard_path);
}
strtailchomp(real_path, namespace && namespace->separator
debug_print(_("done.\n"));
}
-#if !USE_SSL
-static SockInfo *imap_open(const gchar *server, gushort port, gchar *buf)
+#if USE_SSL
+static SockInfo *imap_open(const gchar *server, gushort port, gchar *buf,
+ gboolean use_ssl)
#else
-static SockInfo *imap_open(const gchar *server, gushort port, gchar *buf, gboolean use_ssl)
+static SockInfo *imap_open(const gchar *server, gushort port, gchar *buf)
#endif
{
SockInfo *sock;
}
#if USE_SSL
- if(use_ssl && !ssl_init_socket(sock)) {
+ if (use_ssl && !ssl_init_socket(sock)) {
sock_close(sock);
return NULL;
}
guint32 *uid_validity)
{
gchar *real_path;
+ gchar *real_path_;
gint ok;
GPtrArray *argbuf;
gchar *str;
argbuf = g_ptr_array_new();
real_path = imap_get_real_path(folder, path);
- if (strchr(real_path, ' ') != NULL)
- imap_cmd_gen_send(SESSION(session)->sock, "STATUS \"%s\" "
- "(MESSAGES RECENT UNSEEN UIDVALIDITY)",
- real_path);
- else
- imap_cmd_gen_send(SESSION(session)->sock, "STATUS %s "
- "(MESSAGES RECENT UNSEEN UIDVALIDITY)",
- real_path);
+ QUOTE_IF_REQUIRED(real_path_, real_path);
+ imap_cmd_gen_send(SESSION(session)->sock, "STATUS %s "
+ "(MESSAGES RECENT UNSEEN UIDVALIDITY)", real_path_);
ok = imap_cmd_ok(SESSION(session)->sock, argbuf);
if (ok != IMAP_SUCCESS) THROW(ok);
static gint imap_cmd_login(SockInfo *sock,
const gchar *user, const gchar *pass)
{
+ gchar *user_, *pass_;
gint ok;
- if (strchr(user, ' ') != NULL)
- imap_cmd_gen_send(sock, "LOGIN \"%s\" %s", user, pass);
- else
- imap_cmd_gen_send(sock, "LOGIN %s %s", user, pass);
+ QUOTE_IF_REQUIRED(user_, user);
+ QUOTE_IF_REQUIRED(pass_, pass);
+ imap_cmd_gen_send(sock, "LOGIN %s %s", user_, pass_);
ok = imap_cmd_ok(sock, NULL);
if (ok != IMAP_SUCCESS)
static gint imap_cmd_list(SockInfo *sock, const gchar *ref,
const gchar *mailbox, GPtrArray *argbuf)
{
- gchar *new_ref;
- gchar *new_mailbox;
+ gchar *ref_, *mailbox_;
if (!ref) ref = "\"\"";
if (!mailbox) mailbox = "\"\"";
- if (*ref != '"' && strchr(ref, ' ') != NULL)
- new_ref = g_strdup_printf("\"%s\"", ref);
- else
- new_ref = g_strdup(ref);
- if (*mailbox != '"' && strchr(mailbox, ' ') != NULL)
- new_mailbox = g_strdup_printf("\"%s\"", mailbox);
- else
- new_mailbox = g_strdup(mailbox);
-
- imap_cmd_gen_send(sock, "LIST %s %s", new_ref, new_mailbox);
-
- g_free(new_ref);
- g_free(new_mailbox);
+ QUOTE_IF_REQUIRED(ref_, ref);
+ QUOTE_IF_REQUIRED(mailbox_, mailbox);
+ imap_cmd_gen_send(sock, "LIST %s %s", ref_, mailbox_);
return imap_cmd_ok(sock, argbuf);
}
gchar *resp_str;
GPtrArray *argbuf;
gchar *select_cmd;
+ gchar *folder_;
*exists = *recent = *unseen = *uid_validity = 0;
argbuf = g_ptr_array_new();
else
select_cmd = "SELECT";
- if (strchr(folder, ' ') != NULL)
- imap_cmd_gen_send(sock, "%s \"%s\"", select_cmd, folder);
- else
- imap_cmd_gen_send(sock, "%s %s", select_cmd, folder);
+ QUOTE_IF_REQUIRED(folder_, folder);
+ imap_cmd_gen_send(sock, "%s %s", select_cmd, folder_);
if ((ok = imap_cmd_ok(sock, argbuf)) != IMAP_SUCCESS) THROW;
static gint imap_cmd_create(SockInfo *sock, const gchar *folder)
{
- if (strchr(folder, ' ') != NULL)
- imap_cmd_gen_send(sock, "CREATE \"%s\"", folder);
- else
- imap_cmd_gen_send(sock, "CREATE %s", folder);
+ gchar *folder_;
+
+ QUOTE_IF_REQUIRED(folder_, folder);
+ imap_cmd_gen_send(sock, "CREATE %s", folder_);
return imap_cmd_ok(sock, NULL);
}
static gint imap_cmd_delete(SockInfo *sock, const gchar *folder)
{
- if (strchr(folder, ' ') != NULL)
- imap_cmd_gen_send(sock, "DELETE \"%s\"", folder);
- else
- imap_cmd_gen_send(sock, "DELETE %s", folder);
+ gchar *folder_;
+
+ QUOTE_IF_REQUIRED(folder_, folder);
+ imap_cmd_gen_send(sock, "DELETE %s", folder_);
return imap_cmd_ok(sock, NULL);
}
{
gint ok;
gint size;
+ gchar *destfolder_;
g_return_val_if_fail(file != NULL, IMAP_ERROR);
size = get_file_size(file);
- imap_cmd_gen_send(sock, "APPEND %s {%d}", destfolder, size);
+ QUOTE_IF_REQUIRED(destfolder_, destfolder);
+ imap_cmd_gen_send(sock, "APPEND %s {%d}", destfolder_, size);
ok = imap_cmd_ok(sock, NULL);
if (ok != IMAP_SUCCESS) {
- log_warning(_("can't append %s to %s\n"), file, destfolder);
+ log_warning(_("can't append %s to %s\n"), file, destfolder_);
return -1;
}
static gint imap_cmd_copy(SockInfo *sock, guint32 uid, const gchar *destfolder)
{
gint ok;
+ gchar *destfolder_;
g_return_val_if_fail(destfolder != NULL, IMAP_ERROR);
- if (strchr(destfolder, ' ') != NULL)
- imap_cmd_gen_send(sock, "UID COPY %d \"%s\"", uid, destfolder);
- else
- imap_cmd_gen_send(sock, "UID COPY %d %s", uid, destfolder);
+ QUOTE_IF_REQUIRED(destfolder_, destfolder);
+ imap_cmd_gen_send(sock, "UID COPY %d %s", uid, destfolder_);
ok = imap_cmd_ok(sock, NULL);
if (ok != IMAP_SUCCESS) {
- log_warning(_("can't copy %d to %s\n"), uid, destfolder);
+ log_warning(_("can't copy %d to %s\n"), uid, destfolder_);
return -1;
}