show usage of SSL in protocol column in account overview
authorChristoph Hohmann <reboot@gmx.ch>
Mon, 6 Aug 2001 19:30:28 +0000 (19:30 +0000)
committerChristoph Hohmann <reboot@gmx.ch>
Mon, 6 Aug 2001 19:30:28 +0000 (19:30 +0000)
moved ssl options to a new pag in account prefs
added support for SMTP STARTTLS command
renamed some ssl options

ChangeLog.claws
src/account.c
src/imap.c
src/inc.c
src/prefs_account.c
src/prefs_account.h
src/send.c
src/smtp.c
src/ssl.c
src/ssl.h

index 702ab0966f06ff8f5d29afea3f484852d7354444..f8ece7fe5f104ad05c99cbb449717105aacc4f37 100644 (file)
@@ -1,3 +1,21 @@
+2001-08-06 [christoph]
+
+       * src/account.c
+               show usage of SSL in protocol column
+
+       * src/imap.c
+       * src/inc.c
+               renamed ssl options
+
+       * src/prefs_account.[ch]
+               moved ssl options to a new page
+
+       * src/send.c
+       * src/smtp.c
+       * src/ssl.[ch]
+               renamed ssl options
+               added support for SMTP STARTTLS command
+
 2001-08-05 [christoph]
 
        * configure.in
index cf5133e4b610688172c8ce2cd3ff877c78aa6642..ebf5463559da5608c7a9acef39ba799a4641b6bc 100644 (file)
@@ -649,11 +649,19 @@ static gint account_clist_set_row(PrefsAccount *ac_prefs, gint row)
 
        text[COL_DEFAULT] = ac_prefs->is_default ? "*" : "";
        text[COL_NAME] = ac_prefs->account_name;
+#if !USE_SSL
        text[COL_PROTOCOL] = ac_prefs->protocol == A_POP3  ? "POP3"  :
                             ac_prefs->protocol == A_APOP  ? "APOP"  :
                             ac_prefs->protocol == A_IMAP4 ? "IMAP4" :
                             ac_prefs->protocol == A_LOCAL ? "Local" :
                             ac_prefs->protocol == A_NNTP  ? "NNTP"  :  "";
+#else
+       text[COL_PROTOCOL] = ac_prefs->protocol == A_POP3  ? (!ac_prefs->ssl_pop ? "POP3" : "POP3 (SSL)") :
+                            ac_prefs->protocol == A_APOP  ? (!ac_prefs->ssl_pop ? "APOP" : "APOP (SSL)") :
+                            ac_prefs->protocol == A_IMAP4 ? (!ac_prefs->ssl_imap ? "IMAP4" : "IMAP4 (SSL)") :
+                            ac_prefs->protocol == A_LOCAL ? "Local" :
+                            ac_prefs->protocol == A_NNTP  ? "NNTP"  :  "";
+#endif
        text[COL_SERVER] = ac_prefs->protocol == A_NNTP
                ? ac_prefs->nntp_server : ac_prefs->recv_server;
 
index 924d964fd6221a5355a8b3efd77532dcc77272bc..b8838f72f1a02386009647bd25cccfbcdf26008b 100644 (file)
@@ -235,7 +235,7 @@ static IMAPSession *imap_session_get(Folder *folder)
                : IMAP4_PORT;
 #else
        port = folder->account->set_imapport ? folder->account->imapport
-               : (folder->account->imap_ssl ? IMAPS_PORT : IMAP4_PORT);
+               : (folder->account->ssl_imap ? IMAPS_PORT : IMAP4_PORT);
 #endif
 
        if (!rfolder->session) {
@@ -248,7 +248,7 @@ static IMAPSession *imap_session_get(Folder *folder)
                        imap_session_new(folder->account->recv_server, port,
                                         folder->account->userid,
                                         folder->account->passwd,
-                                        folder->account->imap_ssl);
+                                        folder->account->ssl_imap);
 #endif
                if (rfolder->session)
                        imap_parse_namespace(IMAP_SESSION(rfolder->session),
@@ -271,7 +271,7 @@ static IMAPSession *imap_session_get(Folder *folder)
                        imap_session_new(folder->account->recv_server, port,
                                         folder->account->userid,
                                         folder->account->passwd,
-                                        folder->account->imap_ssl);
+                                        folder->account->ssl_imap);
 #endif
                if (rfolder->session)
                        imap_parse_namespace(IMAP_SESSION(rfolder->session),
index 0d9acdbf4ef12904f56546362b807504304dfeb1..18841d4c299816b13f566ebfca52b22bf15acd56 100644 (file)
--- a/src/inc.c
+++ b/src/inc.c
@@ -566,7 +566,7 @@ static IncState inc_pop3_session_do(IncSession *session)
        server = pop3_state->ac_prefs->recv_server;
 #if USE_SSL
        port = pop3_state->ac_prefs->set_popport ?
-               pop3_state->ac_prefs->popport : (pop3_state->ac_prefs->pop_ssl ? 995 : 110);
+               pop3_state->ac_prefs->popport : (pop3_state->ac_prefs->ssl_pop ? 995 : 110);
 #else
        port = pop3_state->ac_prefs->set_popport ?
                pop3_state->ac_prefs->popport : 110;
@@ -606,7 +606,7 @@ static IncState inc_pop3_session_do(IncSession *session)
        atm->help_sock = sockinfo;
 
 #ifdef USE_SSL
-       if(pop3_state->ac_prefs->pop_ssl) {
+       if(pop3_state->ac_prefs->ssl_pop) {
                if(!ssl_init_socket(sockinfo)) {
                        pop3_automaton_terminate(NULL, atm);
                        automaton_destroy(atm);
index e79d9a823d9b49c455df0c23ba07124bb9f8298e..b9eb0f6fadbc456836c73b37daba69c041a7c6be 100644 (file)
@@ -124,6 +124,17 @@ static struct Privacy {
 } privacy;
 #endif /* USE_GPGME */
 
+#if USE_SSL
+static struct SSLPrefs {
+       GtkWidget *pop_chkbtn;
+       GtkWidget *imap_chkbtn;
+
+       GtkWidget *smtp_nossl_radiobtn;
+       GtkWidget *smtp_ssltunnel_radiobtn;
+       GtkWidget *smtp_sslstarttls_radiobtn;
+} ssl;
+#endif /* USE_SSL */
+
 static struct Advanced {
        GtkWidget *smtpport_chkbtn;
        GtkWidget *smtpport_entry;
@@ -138,11 +149,6 @@ static struct Advanced {
        GtkWidget *nntpport_entry;
        GtkWidget *domain_chkbtn;
        GtkWidget *domain_entry;
-#if USE_SSL
-       GtkWidget *smtpssl_chkbtn;
-       GtkWidget *popssl_chkbtn;
-       GtkWidget *imapssl_chkbtn;
-#endif
 } advanced;
 
 static void prefs_account_fix_size                     (void);
@@ -151,8 +157,8 @@ static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
 static void prefs_account_protocol_set_optmenu         (PrefParam *pparam);
 static void prefs_account_protocol_activated           (GtkMenuItem *menuitem);
 #if USE_GPGME
-static void prefs_account_sign_key_set_data_from_radiobtn (PrefParam *pparam);
-static void prefs_account_sign_key_set_radiobtn                  (PrefParam *pparam);
+static void prefs_account_enum_set_data_from_radiobtn (PrefParam *pparam);
+static void prefs_account_enum_set_radiobtn              (PrefParam *pparam);
 #endif /* USE_GPGME */
 
 static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
@@ -288,13 +294,29 @@ static PrefParam param[] = {
        /* Privacy */
        {"sign_key", NULL, &tmp_ac_prefs.sign_key, P_ENUM,
         &privacy.defaultkey_radiobtn,
-        prefs_account_sign_key_set_data_from_radiobtn,
-        prefs_account_sign_key_set_radiobtn},
+        prefs_account_enum_set_data_from_radiobtn,
+        prefs_account_enum_set_radiobtn},
        {"sign_key_id", NULL, &tmp_ac_prefs.sign_key_id, P_STRING,
         &privacy.customkey_entry,
         prefs_set_data_from_entry, prefs_set_entry},
 #endif /* USE_GPGME */
 
+#if USE_SSL
+       /* SSL Config */
+       {"ssl_smtp", "FALSE", &tmp_ac_prefs.ssl_smtp, P_ENUM,
+        &ssl.smtp_nossl_radiobtn,
+        prefs_account_enum_set_data_from_radiobtn,
+        prefs_account_enum_set_radiobtn},
+
+       {"ssl_pop", "FALSE", &tmp_ac_prefs.ssl_pop, P_BOOL,
+        &ssl.pop_chkbtn,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"ssl_imap", "FALSE", &tmp_ac_prefs.ssl_imap, P_BOOL,
+        &ssl.imap_chkbtn,
+        prefs_set_data_from_toggle, prefs_set_toggle},
+#endif /* USE_SSL */
+
        /* Advanced */
        {"set_smtpport", "FALSE", &tmp_ac_prefs.set_smtpport, P_BOOL,
         &advanced.smtpport_chkbtn,
@@ -336,20 +358,6 @@ static PrefParam param[] = {
         &advanced.domain_entry,
         prefs_set_data_from_entry, prefs_set_entry},
 
-#if USE_SSL
-       {"smtp_ssl", "FALSE", &tmp_ac_prefs.smtp_ssl, P_BOOL,
-        &advanced.smtpssl_chkbtn,
-        prefs_set_data_from_toggle, prefs_set_toggle},
-
-       {"pop_ssl", "FALSE", &tmp_ac_prefs.pop_ssl, P_BOOL,
-        &advanced.popssl_chkbtn,
-        prefs_set_data_from_toggle, prefs_set_toggle},
-
-       {"imap_ssl", "FALSE", &tmp_ac_prefs.imap_ssl, P_BOOL,
-        &advanced.imapssl_chkbtn,
-        prefs_set_data_from_toggle, prefs_set_toggle},
-#endif
-
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
 
@@ -361,6 +369,9 @@ static void prefs_account_compose_create    (void);
 #if USE_GPGME
 static void prefs_account_privacy_create       (void);
 #endif /* USE_GPGME */
+#if USE_SSL
+static void prefs_account_ssl_create           (void);
+#endif /* USE_SSL */
 static void prefs_account_advanced_create      (void);
 
 static void prefs_account_edit_custom_header   (void);
@@ -581,6 +592,10 @@ static void prefs_account_create(void)
 #if USE_GPGME
        prefs_account_privacy_create();
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"), page++);
+#endif /* USE_GPGME */
+#if USE_SSL
+       prefs_account_ssl_create();
+       SET_NOTEBOOK_LABEL(dialog.notebook, _("SSL"), page++);
 #endif /* USE_GPGME */
        prefs_account_advanced_create();
        SET_NOTEBOOK_LABEL(dialog.notebook, _("Advanced"), page++);
@@ -1214,6 +1229,81 @@ static void prefs_account_privacy_create(void)
 }
 #endif /* USE_GPGME */
 
+#if USE_SSL
+static void prefs_account_ssl_create(void)
+{
+       GtkWidget *vbox1;
+
+       GtkWidget *receive_frame;
+       GtkWidget *vbox2;
+       GtkWidget *pop_chkbtn;
+       GtkWidget *imap_chkbtn;
+
+       GtkWidget *send_frame;
+       GtkWidget *vbox3;
+       GtkWidget *smtp_nossl_radiobtn;
+       GtkWidget *smtp_ssltunnel_radiobtn;
+       GtkWidget *smtp_sslstarttls_radiobtn;
+
+       /* Vertial Box */
+       vbox1 = gtk_vbox_new (FALSE, VSPACING);
+       gtk_widget_show (vbox1);
+       gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
+       gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
+
+       /* Receive Options */
+       PACK_FRAME (vbox1, receive_frame, _("Receive"));
+
+       vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+       gtk_widget_show (vbox2);
+       gtk_container_add (GTK_CONTAINER (receive_frame), vbox2);
+       gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+
+       PACK_CHECK_BUTTON (vbox2, pop_chkbtn, _("Use SSL tunnel to connect to POP server"));
+       PACK_CHECK_BUTTON (vbox2, imap_chkbtn, _("Use SSL tunnel to connect to IMAP server"));
+
+       /* Send Options */
+       PACK_FRAME (vbox1, send_frame, _("Send"));
+
+       vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+       gtk_widget_show (vbox3);
+       gtk_container_add (GTK_CONTAINER (send_frame), vbox3);
+       gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
+
+       smtp_nossl_radiobtn = gtk_radio_button_new_with_label
+               (NULL, _("No SSL for SMTP"));
+       gtk_widget_show (smtp_nossl_radiobtn);
+       gtk_box_pack_start (GTK_BOX (vbox3), smtp_nossl_radiobtn,
+                           FALSE, FALSE, 0);
+       gtk_object_set_user_data (GTK_OBJECT (smtp_nossl_radiobtn),
+                                 GINT_TO_POINTER (SSL_SMTP_NONE));
+
+       smtp_ssltunnel_radiobtn = gtk_radio_button_new_with_label_from_widget
+               (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
+                _("Use SSL tunnel to connect to SMTP server"));
+       gtk_widget_show (smtp_ssltunnel_radiobtn);
+       gtk_box_pack_start (GTK_BOX (vbox3), smtp_ssltunnel_radiobtn,
+                           FALSE, FALSE, 0);
+       gtk_object_set_user_data (GTK_OBJECT (smtp_ssltunnel_radiobtn),
+                                 GINT_TO_POINTER (SSL_SMTP_TUNNEL));
+
+       smtp_sslstarttls_radiobtn = gtk_radio_button_new_with_label_from_widget
+               (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
+                _("Use STARTTLS command to start SMTP SSL session"));
+       gtk_widget_show (smtp_sslstarttls_radiobtn);
+       gtk_box_pack_start (GTK_BOX (vbox3), smtp_sslstarttls_radiobtn,
+                           FALSE, FALSE, 0);
+       gtk_object_set_user_data (GTK_OBJECT (smtp_sslstarttls_radiobtn),
+                                 GINT_TO_POINTER (SSL_SMTP_STARTTLS));
+
+       ssl.pop_chkbtn  = pop_chkbtn;
+       ssl.imap_chkbtn = imap_chkbtn;
+       ssl.smtp_nossl_radiobtn = smtp_nossl_radiobtn;
+       ssl.smtp_ssltunnel_radiobtn = smtp_ssltunnel_radiobtn;
+       ssl.smtp_sslstarttls_radiobtn = smtp_sslstarttls_radiobtn;
+}
+#endif /* USE_SSL */
+
 static void prefs_account_advanced_create(void)
 {
        GtkWidget *vbox1;
@@ -1232,11 +1322,6 @@ static void prefs_account_advanced_create(void)
        GtkWidget *entry_nntpport;
        GtkWidget *checkbtn_domain;
        GtkWidget *entry_domain;
-#ifdef USE_SSL
-       GtkWidget *checkbtn_smtpssl;
-       GtkWidget *checkbtn_popssl;
-       GtkWidget *checkbtn_imapssl;
-#endif
 
 #define PACK_HBOX(hbox) \
 { \
@@ -1267,30 +1352,18 @@ static void prefs_account_advanced_create(void)
        PACK_PORT_ENTRY (hbox1, entry_smtpport);
        SET_TOGGLE_SENSITIVITY (checkbtn_smtpport, entry_smtpport);
 
-#ifdef USE_SSL
-       PACK_CHECK_BUTTON (vbox2, checkbtn_smtpssl, _("Use SSL to connect to SMTP server"));
-#endif
-
        PACK_HBOX (hbox_popport);
        PACK_CHECK_BUTTON (hbox_popport, checkbtn_popport,
                           _("Specify POP3 port"));
        PACK_PORT_ENTRY (hbox_popport, entry_popport);
        SET_TOGGLE_SENSITIVITY (checkbtn_popport, entry_popport);
 
-#ifdef USE_SSL
-       PACK_CHECK_BUTTON (vbox2, checkbtn_popssl, _("Use SSL to connect to POP server"));
-#endif
-
        PACK_HBOX (hbox_imapport);
        PACK_CHECK_BUTTON (hbox_imapport, checkbtn_imapport,
                           _("Specify IMAP4 port"));
        PACK_PORT_ENTRY (hbox_imapport, entry_imapport);
        SET_TOGGLE_SENSITIVITY (checkbtn_imapport, entry_imapport);
 
-#ifdef USE_SSL
-       PACK_CHECK_BUTTON (vbox2, checkbtn_imapssl, _("Use SSL to connect to IMAP server"));
-#endif
-
        PACK_HBOX (hbox_nntpport);
        PACK_CHECK_BUTTON (hbox_nntpport, checkbtn_nntpport,
                           _("Specify NNTP port"));
@@ -1313,11 +1386,6 @@ static void prefs_account_advanced_create(void)
        advanced.popport_hbox           = hbox_popport;
        advanced.popport_chkbtn         = checkbtn_popport;
        advanced.popport_entry          = entry_popport;
-#ifdef USE_SSL
-       advanced.smtpssl_chkbtn          = checkbtn_smtpssl;
-       advanced.popssl_chkbtn           = checkbtn_popssl;
-       advanced.imapssl_chkbtn          = checkbtn_imapssl;
-#endif
        advanced.imapport_hbox          = hbox_imapport;
        advanced.imapport_chkbtn        = checkbtn_imapport;
        advanced.imapport_entry         = entry_imapport;
@@ -1417,7 +1485,7 @@ static void prefs_account_edit_custom_header(void)
 }
 
 #if USE_GPGME
-static void prefs_account_sign_key_set_data_from_radiobtn(PrefParam *pparam)
+static void prefs_account_enum_set_data_from_radiobtn(PrefParam *pparam)
 {
        GtkRadioButton *radiobtn;
        GSList *group;
@@ -1427,7 +1495,7 @@ static void prefs_account_sign_key_set_data_from_radiobtn(PrefParam *pparam)
        while (group != NULL) {
                GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
                if (gtk_toggle_button_get_active (btn)) {
-                       *((SignKeyType *)pparam->data) = GPOINTER_TO_INT
+                       *((gint *)pparam->data) = GPOINTER_TO_INT
                                (gtk_object_get_user_data (GTK_OBJECT (btn)));
                        break;
                }
@@ -1435,13 +1503,13 @@ static void prefs_account_sign_key_set_data_from_radiobtn(PrefParam *pparam)
        }
 }
 
-static void prefs_account_sign_key_set_radiobtn(PrefParam *pparam)
+static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
 {
        GtkRadioButton *radiobtn;
        GSList *group;
        gpointer data;
 
-       data = GINT_TO_POINTER (*((RecvProtocol *)pparam->data));
+       data = GINT_TO_POINTER (*((gint *)pparam->data));
        radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
        group = gtk_radio_button_group (radiobtn);
        while (group != NULL) {
@@ -1569,8 +1637,8 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_show(advanced.nntpport_hbox);
 
 #if USE_SSL
-               gtk_widget_hide(advanced.popssl_chkbtn);
-               gtk_widget_hide(advanced.imapssl_chkbtn);
+               gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
+               gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
 #endif
                break;
        case A_LOCAL:
@@ -1623,8 +1691,8 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                        (GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn), NULL);
 
 #if USE_SSL
-               gtk_widget_hide(advanced.popssl_chkbtn);
-               gtk_widget_hide(advanced.imapssl_chkbtn);
+               gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
+               gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
 #endif
                break;
        case A_IMAP4:
@@ -1679,8 +1747,8 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_hide(advanced.nntpport_hbox);
 
 #if USE_SSL
-               gtk_widget_hide(advanced.popssl_chkbtn);
-               gtk_widget_show(advanced.imapssl_chkbtn);
+               gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
+               gtk_widget_set_sensitive(ssl.imap_chkbtn, TRUE);
 #endif
                break;
        case A_POP3:
@@ -1736,8 +1804,8 @@ static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
                gtk_widget_hide(advanced.nntpport_hbox);
 
 #if USE_SSL
-               gtk_widget_show(advanced.popssl_chkbtn);
-               gtk_widget_hide(advanced.imapssl_chkbtn);
+               gtk_widget_set_sensitive(ssl.pop_chkbtn, TRUE);
+               gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
 #endif
                break;
        }
index 8d8f364c25975e44a0fa74541c8239b5a29dc2fe..11f0f01054efa39ebc637965188ad94410e53ffa 100644 (file)
@@ -47,6 +47,14 @@ typedef enum {
 } SignKeyType;
 #endif /* USE_GPGME */
 
+#if USE_SSL
+typedef enum {
+       SSL_SMTP_NONE,
+       SSL_SMTP_TUNNEL,
+       SSL_SMTP_STARTTLS
+} SSLSMTPType;
+#endif /* USE_SSL */
+
 struct _PrefsAccount
 {
        gchar *account_name;
@@ -105,6 +113,13 @@ struct _PrefsAccount
        gchar *sign_key_id;
 #endif /* USE_GPGME */
 
+#if USE_SSL
+       /* SSL Config */
+       gboolean  ssl_pop;
+       gboolean  ssl_imap;
+       SSLSMTPType  ssl_smtp;
+#endif /* USE_SSL */
+
        /* Advanced */
        gboolean  set_smtpport;
        gushort   smtpport;
@@ -116,11 +131,6 @@ struct _PrefsAccount
        gushort   nntpport;
        gboolean  set_domain;
        gchar    *domain;
-#if USE_SSL
-       gboolean  smtp_ssl;
-       gboolean  pop_ssl;
-       gboolean  imap_ssl;
-#endif
 
        /* Default or not */
        gboolean is_default;
index ea74478525d714148785f1b0d209db2fa45cfcc6..39d1811099799a16e9703c6653a60d8f7dfbe702 100644 (file)
@@ -75,10 +75,10 @@ static gint send_message_smtp       (GSList *to_list, const gchar *from,
                                 const gchar *server, gushort port,
                                 const gchar *domain, const gchar *userid,
                                 const gchar *passwd, gboolean use_smtp_auth,
-                                FILE *fp, gboolean use_ssl);
+                                FILE *fp, SSLSMTPType ssl);
 
 static SockInfo *send_smtp_open        (const gchar *server, gushort port,
-                                const gchar *domain, gboolean use_smtp_auth, gboolean use_ssl);
+                                const gchar *domain, gboolean use_smtp_auth, SSLSMTPType ssl);
 #endif
 
 static SendProgressDialog *send_progress_dialog_create(void);
@@ -109,21 +109,26 @@ gint send_message(const gchar *file, PrefsAccount *ac_prefs, GSList *to_list)
                                                ac_prefs->mail_command,
                                                fp);
        } else {
-#if USE_SSL
-               port = ac_prefs->set_smtpport ? ac_prefs->smtpport : (ac_prefs->smtp_ssl ? SSMTP_PORT : SMTP_PORT);
-#else
+#if !USE_SSL
                port = ac_prefs->set_smtpport ? ac_prefs->smtpport : SMTP_PORT;
+#else
+               port = ac_prefs->set_smtpport ? ac_prefs->smtpport : 
+                   (ac_prefs->ssl_smtp == SSL_SMTP_TUNNEL ? SSMTP_PORT : SMTP_PORT);
 #endif
                domain = ac_prefs->set_domain ? ac_prefs->domain : NULL;
 
+#if !USE_SSL
                val = send_message_smtp(to_list, ac_prefs->address,
                                        ac_prefs->smtp_server, port, domain,
                                         ac_prefs->userid, ac_prefs->passwd,
-                                       ac_prefs->use_smtp_auth, fp
-#if USE_SSL
-                                       , ac_prefs->smtp_ssl
+                                       ac_prefs->use_smtp_auth, fp);
+#else
+               val = send_message_smtp(to_list, ac_prefs->address,
+                                       ac_prefs->smtp_server, port, domain,
+                                        ac_prefs->userid, ac_prefs->passwd,
+                                       ac_prefs->use_smtp_auth, fp,
+                                       ac_prefs->ssl_smtp);
 #endif
-                                       );
        }
 
        fclose(fp);
@@ -237,7 +242,7 @@ gint send_message_queue(const gchar *file)
 #if !USE_SSL
                        port = ac->set_smtpport ? ac->smtpport : SMTP_PORT;
 #else
-                       port = ac->set_smtpport ? ac->smtpport : (ac->smtp_ssl ? SSMTP_PORT : SMTP_PORT);
+                       port = ac->set_smtpport ? ac->smtpport : (ac->ssl_smtp == SSL_SMTP_TUNNEL ? SSMTP_PORT : SMTP_PORT);
 #endif
                        domain = ac->set_domain ? ac->domain : NULL;
 #if !USE_SSL
@@ -247,7 +252,7 @@ gint send_message_queue(const gchar *file)
 #else
                        val = send_message_smtp
                                (to_list, from, server, port, domain,
-                                ac->userid, ac->passwd, ac->use_smtp_auth, fp, ac->smtp_ssl);
+                                ac->userid, ac->passwd, ac->use_smtp_auth, fp, ac->ssl_smtp);
 #endif
                } else {
                        g_warning(_("Account not found.\n"));
@@ -316,7 +321,7 @@ static gint send_message_smtp(GSList *to_list, const gchar *from,
                              const gchar *server, gushort port,
                              const gchar *domain, const gchar *userid,
                              const gchar *passwd, gboolean use_smtp_auth,
-                             FILE *fp, gboolean use_ssl)
+                             FILE *fp, SSLSMTPType ssl)
 #endif
 {
        SockInfo *smtp_sock = NULL;
@@ -359,7 +364,7 @@ static gint send_message_smtp(GSList *to_list, const gchar *from,
                           "connecting to server");
 #else
        SEND_EXIT_IF_ERROR((smtp_sock = send_smtp_open
-                               (server, port, domain, use_smtp_auth, use_ssl)),
+                               (server, port, domain, use_smtp_auth, ssl)),
                           "connecting to server");
 #endif
 
@@ -432,7 +437,7 @@ static SockInfo *send_smtp_open(const gchar *server, gushort port,
                           const gchar *domain, gboolean use_smtp_auth)
 #else
 static SockInfo *send_smtp_open(const gchar *server, gushort port,
-                          const gchar *domain, gboolean use_smtp_auth, gboolean use_ssl)
+                          const gchar *domain, gboolean use_smtp_auth, SSLSMTPType ssl)
 #endif
 {
        SockInfo *sock;
@@ -447,7 +452,7 @@ static SockInfo *send_smtp_open(const gchar *server, gushort port,
        }
 
 #if USE_SSL
-       if(use_ssl && !ssl_init_socket(sock)) {
+       if((ssl == SSL_SMTP_TUNNEL) && !ssl_init_socket(sock)) {
                log_warning(_("SSL connection failed"));
                sock_close(sock);
                return NULL;
@@ -457,13 +462,26 @@ static SockInfo *send_smtp_open(const gchar *server, gushort port,
        if (smtp_ok(sock) == SM_OK) {
                val = smtp_helo(sock, domain ? domain : get_domain_name(),
                                use_smtp_auth);
-               if (val == SM_OK) return sock;
+               if (val != SM_OK) {
+                       log_warning(_("Error occurred while sending HELO\n"));
+                       sock_close(sock);
+                       return NULL;
+               }
        }
 
-       log_warning(_("Error occurred while sending HELO\n"));
-       sock_close(sock);
+#if USE_SSL
+       if(ssl == SSL_SMTP_STARTTLS) {
+               val = smtp_starttls(sock, domain ? domain : get_domain_name(),
+                               use_smtp_auth);
+               if (val != SM_OK) {
+                       log_warning(_("Error occurred while sending STARTTLS\n"));
+                       sock_close(sock);
+                       return NULL;
+               }
+       }
+#endif
 
-       return NULL;
+       return sock;
 }
 
 
index 9591755bb02b4eaeaa78041f2f8409ab7d9c74e4..e36fb0e91e18ee507f7f7388ee32358e30370af6 100644 (file)
@@ -160,3 +160,24 @@ gint smtp_ok(SockInfo *sock)
 
        return SM_UNRECOVERABLE;
 }
+
+#if USE_SSL
+gint smtp_starttls(SockInfo *sock, const char *hostname, gboolean use_smtp_auth)
+{
+       gint ret;
+
+       sock_printf(sock, "STARTTLS\r\n", hostname);
+       if (verbose)
+               log_print("SMTP> STARTTLS\n", hostname);
+
+       ret = smtp_ok(sock);
+       if(ret != SM_OK)
+               return ret;
+               
+       if(!ssl_init_socket_with_method(sock, SSL_METHOD_TLSv1)) {
+               return SM_ERROR;
+       }
+
+       return smtp_helo(sock, hostname, use_smtp_auth);
+}
+#endif
\ No newline at end of file
index aed00645b51763a2eff13f1d6c6e77d53584e90b..308890ed3373c17f6e4e10122f431e6b03805bc1 100644 (file)
--- a/src/ssl.c
+++ b/src/ssl.c
@@ -27,7 +27,8 @@
 #include "utils.h"
 #include "ssl.h"
 
-SSL_CTX *ssl_ctx;
+SSL_CTX *ssl_ctx_SSLv23;
+SSL_CTX *ssl_ctx_TLSv1;
 
 void ssl_init() {
     SSL_METHOD *meth;
@@ -35,31 +36,60 @@ void ssl_init() {
     SSL_library_init();
     SSL_load_error_strings();
     
-    ssl_ctx = SSL_CTX_new(SSLv23_client_method());
-    if(ssl_ctx == NULL) {
-       debug_print(_("SSL disabled\n"));
+    ssl_ctx_SSLv23 = SSL_CTX_new(SSLv23_client_method());
+    if(ssl_ctx_SSLv23 == NULL) {
+       debug_print(_("SSLv23 not available\n"));
     } else {
-       debug_print(_("SSL loaded\n"));
+       debug_print(_("SSLv23 available\n"));
+    }
+
+    ssl_ctx_TLSv1 = SSL_CTX_new(TLSv1_client_method());
+    if(ssl_ctx_TLSv1 == NULL) {
+       debug_print(_("TLSv1 not available\n"));
+    } else {
+       debug_print(_("TLSv1 available\n"));
     }
 }
 
 void ssl_done() {
-    if(!ssl_ctx)
-       return;
-       
-    SSL_CTX_free(ssl_ctx);
+    if(ssl_ctx_SSLv23) {
+        SSL_CTX_free(ssl_ctx_SSLv23);
+    }
+
+    if(ssl_ctx_TLSv1) {
+        SSL_CTX_free(ssl_ctx_TLSv1);
+    }
 }
 
 gboolean ssl_init_socket(SockInfo *sockinfo) {
-    X509 *server_cert;
-
-    if(ssl_ctx == NULL) {
-       log_warning(_("SSL not available\n"));
+    return ssl_init_socket_with_method(sockinfo, SSL_METHOD_SSLv23);
+}
 
-       return FALSE;
+gboolean ssl_init_socket_with_method(SockInfo *sockinfo, SSL_METHODs method) {
+    X509 *server_cert;
+    int ret;
+
+    switch(method) {
+       case SSL_METHOD_SSLv23:
+           if(!ssl_ctx_SSLv23) {
+               log_warning(_("SSL method not available\n"));
+               return FALSE;
+           }
+           sockinfo->ssl = SSL_new(ssl_ctx_SSLv23);
+           break;
+       case SSL_METHOD_TLSv1:
+           if(!ssl_ctx_TLSv1) {
+               log_warning(_("SSL method not available\n"));
+               return FALSE;
+           }
+           sockinfo->ssl = SSL_new(ssl_ctx_TLSv1);
+           break;
+       default:
+           log_warning(_("Unknown SSL method *PROGRAM BUG*\n"));
+           return FALSE;
+           break;
     }
-
-    sockinfo->ssl = SSL_new(ssl_ctx);
+    
     if(sockinfo->ssl == NULL) {
        log_warning(_("Error creating ssl context\n"));
 
@@ -67,8 +97,8 @@ gboolean ssl_init_socket(SockInfo *sockinfo) {
     }
 
     SSL_set_fd(sockinfo->ssl, sockinfo->sock);
-    if(SSL_connect(sockinfo->ssl) == -1) {
-       log_warning(_("SSL connect failed\n"));
+    if((ret = SSL_connect(sockinfo->ssl)) == -1) {
+       log_warning(_("SSL connect failed (%s)\n"), ERR_error_string(ERR_get_error(), NULL));
 
        return FALSE;
     }
@@ -96,6 +126,8 @@ gboolean ssl_init_socket(SockInfo *sockinfo) {
 
        X509_free(server_cert);
     }
+    
+    return TRUE;
 }
 
 void ssl_done_socket(SockInfo *sockinfo) {
index 510843db6a2fd064d9caf953cc04b50e4934427e..5f2468f1092804383c43e361e1ebaf531520b32b 100644 (file)
--- a/src/ssl.h
+++ b/src/ssl.h
 
 #include "socket.h"
 
+typedef enum {
+    SSL_METHOD_SSLv23,
+    SSL_METHOD_TLSv1
+} SSL_METHODs;
+
 void ssl_init();
 void ssl_done();
 gboolean ssl_init_socket(SockInfo *sockinfo);
+gboolean ssl_init_socket_with_method(SockInfo *sockinfo, SSL_METHODs method);
 void ssl_done_socket(SockInfo *sockinfo);
 
 #endif /* __SSL_H__ */