SMTP over SSL (untested, feedback requested)
[claws.git] / src / imap.c
index 02b99ad2b8b7c64270525708b4584ee89d5a47c1..bb0494fa36ed8fcd87761979e30f37352d8aa623 100644 (file)
 #include "codeconv.h"
 #include "utils.h"
 #include "inputdialog.h"
+#include "ssl.h"
 
 #define IMAP4_PORT     143
+#if USE_SSL
+#define IMAPS_PORT     993
+#endif
 
 static GList *session_list = NULL;
 
@@ -78,9 +82,16 @@ static GSList *imap_delete_cached_messages   (GSList         *mlist,
                                                 guint32         last_uid);
 static void imap_delete_all_cached_messages    (FolderItem     *item);
 
+#if !USE_SSL
 static SockInfo *imap_open             (const gchar    *server,
                                         gushort         port,
                                         gchar          *buf);
+#else
+static SockInfo *imap_open             (const gchar    *server,
+                                        gushort         port,
+                                        gchar          *buf,
+                                        gboolean        use_ssl);
+#endif
 
 static gint imap_set_message_flags     (IMAPSession    *session,
                                         guint32         first_uid,
@@ -215,14 +226,26 @@ static IMAPSession *imap_session_get(Folder *folder)
        g_return_val_if_fail(folder->type == F_IMAP, NULL);
        g_return_val_if_fail(folder->account != NULL, NULL);
 
+#if !USE_SSL
        port = folder->account->set_imapport ? folder->account->imapport
                : IMAP4_PORT;
+#else
+       port = folder->account->set_imapport ? folder->account->imapport
+               : (folder->account->imap_ssl ? IMAPS_PORT : IMAP4_PORT);
+#endif
 
        if (!rfolder->session) {
                rfolder->session =
+#if !USE_SSL
                        imap_session_new(folder->account->recv_server, port,
                                         folder->account->userid,
                                         folder->account->passwd);
+#else
+                       imap_session_new(folder->account->recv_server, port,
+                                        folder->account->userid,
+                                        folder->account->passwd,
+                                        folder->account->imap_ssl);
+#endif
                if (rfolder->session)
                        imap_parse_namespace(IMAP_SESSION(rfolder->session),
                                             IMAP_FOLDER(folder));
@@ -236,9 +259,16 @@ static IMAPSession *imap_session_get(Folder *folder)
                            folder->account->recv_server, port);
                session_destroy(rfolder->session);
                rfolder->session =
+#if !USE_SSL
                        imap_session_new(folder->account->recv_server, port,
                                         folder->account->userid,
                                         folder->account->passwd);
+#else
+                       imap_session_new(folder->account->recv_server, port,
+                                        folder->account->userid,
+                                        folder->account->passwd,
+                                        folder->account->imap_ssl);
+#endif
                if (rfolder->session)
                        imap_parse_namespace(IMAP_SESSION(rfolder->session),
                                             IMAP_FOLDER(folder));
@@ -261,8 +291,14 @@ static gchar *imap_query_password(const gchar *server, const gchar *user)
        return pass;
 }
 
+#if !USE_SSL
 Session *imap_session_new(const gchar *server, gushort port,
                          const gchar *user, const gchar *pass)
+#else
+Session *imap_session_new(const gchar *server, gushort port,
+                         const gchar *user, const gchar *pass,
+                         gboolean use_ssl)
+#endif
 {
        gchar buf[IMAPBUFSIZE];
        IMAPSession *session;
@@ -283,7 +319,11 @@ Session *imap_session_new(const gchar *server, gushort port,
        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 ((imap_sock = imap_open(server, port, buf, use_ssl)) == NULL)
+#endif
                return NULL;
        if (imap_cmd_login(imap_sock, user, pass) != IMAP_SUCCESS) {
                imap_cmd_logout(imap_sock);
@@ -307,6 +347,9 @@ Session *imap_session_new(const gchar *server, gushort port,
 
 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;
 
@@ -1232,7 +1275,11 @@ static void imap_delete_all_cached_messages(FolderItem *item)
        debug_print(_("done.\n"));
 }
 
+#if !USE_SSL
 static SockInfo *imap_open(const gchar *server, gushort port, gchar *buf)
+#else
+static SockInfo *imap_open(const gchar *server, gushort port, gchar *buf, gboolean use_ssl)
+#endif
 {
        SockInfo *sock;
 
@@ -1242,6 +1289,13 @@ static SockInfo *imap_open(const gchar *server, gushort port, gchar *buf)
                return NULL;
        }
 
+#if USE_SSL
+       if(use_ssl && !ssl_init_socket(sock)) {
+               sock_close(sock);
+               return NULL;
+       }
+#endif
+
        imap_cmd_count = 0;
 
        if (imap_cmd_noop(sock) != IMAP_SUCCESS) {