Check smtp auth if autoconfig works. This is probably required.
[claws.git] / src / prefs_account.c
index 32eeeed9f32bdf127af776213020778081f478bf..d9d52bb316236fa99dcaee3c692a1eb9b4a78312 100644 (file)
@@ -119,6 +119,9 @@ typedef struct BasicPage
        GtkWidget *pass_label;
        GtkWidget *uid_entry;
        GtkWidget *pass_entry;
+       GtkWidget *auto_configure_btn;
+       GtkWidget *auto_configure_cancel_btn;
+       GtkWidget *auto_configure_lbl;
 } BasicPage;
 
 typedef struct ReceivePage
@@ -904,6 +907,11 @@ static void prefs_account_signature_edit_cb        (GtkWidget      *widget,
 static void pop_bfr_smtp_tm_set_sens           (GtkWidget      *widget,
                                                 gpointer        data);
 
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+static void auto_configure_cb                  (GtkWidget      *widget,
+                                                gpointer        data);
+
+#endif
 static void prefs_account_edit_custom_header   (void);
 
 
@@ -913,19 +921,6 @@ static void prefs_account_edit_custom_header       (void);
  * system choice. */
 static void privacy_system_activated(GtkWidget *combobox)
 {
-       const gchar *system_id;
-       gint privacy_enabled_int;
-       GtkTreeIter iter;
-       GtkListStore *menu = GTK_LIST_STORE(gtk_combo_box_get_model(
-                               GTK_COMBO_BOX(combobox)));
-
-       gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combobox), &iter);
-
-       gtk_tree_model_get(GTK_TREE_MODEL(menu), &iter,
-                       COMBOBOX_PRIVACY_PLUGIN_ID, &system_id,
-                       COMBOBOX_DATA, &privacy_enabled_int,
-                       -1);
-       
        gtk_widget_set_sensitive (privacy_page.save_clear_text_checkbtn, 
                !gtk_toggle_button_get_active(
                                GTK_TOGGLE_BUTTON(privacy_page.encrypt_to_self_checkbtn)));
@@ -1012,6 +1007,9 @@ static void basic_create_widget_func(PrefsPage * _page,
        GtkWidget *pass_label;
        GtkWidget *uid_entry;
        GtkWidget *pass_entry;
+       GtkWidget *auto_configure_btn;
+       GtkWidget *auto_configure_cancel_btn;
+       GtkWidget *auto_configure_lbl;
        GtkListStore *menu;
        GtkTreeIter iter;
 
@@ -1121,6 +1119,22 @@ static void basic_create_widget_func(PrefsPage * _page,
        gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_CENTER);
        gtk_box_pack_start(GTK_BOX (optmenubox), optlabel, FALSE, FALSE, 0);
 
+       auto_configure_btn = gtk_button_new_with_label(_("Auto-configure"));
+       gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_btn, FALSE, FALSE, 0);
+       auto_configure_cancel_btn = gtk_button_new_with_label(_("Cancel"));
+       gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_cancel_btn, FALSE, FALSE, 0);
+       auto_configure_lbl = gtk_label_new("");
+       gtk_label_set_justify(GTK_LABEL(auto_configure_lbl), GTK_JUSTIFY_LEFT);
+       gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_lbl, FALSE, FALSE, 0);
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+       gtk_widget_show(auto_configure_btn);
+       gtk_widget_show(auto_configure_lbl);
+       g_signal_connect (G_OBJECT (auto_configure_btn), "clicked",
+                         G_CALLBACK (auto_configure_cb), NULL);
+       g_signal_connect (G_OBJECT (auto_configure_cancel_btn), "clicked",
+                         G_CALLBACK (auto_configure_cb), NULL);
+#endif
+
        no_imap_warn_icon = gtk_image_new_from_stock
                         (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
        no_imap_warn_label = gtk_label_new(_("<span weight=\"bold\">Warning: this version of Claws Mail\n"
@@ -1305,6 +1319,9 @@ static void basic_create_widget_func(PrefsPage * _page,
        page->pass_label       = pass_label;
        page->uid_entry        = uid_entry;
        page->pass_entry       = pass_entry;
+       page->auto_configure_btn = auto_configure_btn;
+       page->auto_configure_cancel_btn = auto_configure_cancel_btn;
+       page->auto_configure_lbl = auto_configure_lbl;
 
        if (new_account) {
                PrefsAccount *def_ac;
@@ -1698,7 +1715,7 @@ static void send_create_widget_func(PrefsPage * _page,
                           _("Send account mail address in Message-ID"));
 
        PACK_CHECK_BUTTON (vbox2, xmailer_checkbtn,
-                          _("Generate X-Mailer header"));
+                          _("Add user agent header"));
 
        hbox = gtk_hbox_new (FALSE, 12);
        gtk_widget_show (hbox);
@@ -2634,6 +2651,7 @@ static void advanced_create_widget_func(PrefsPage * _page,
        GtkWidget *trash_folder_entry;
        GtkWidget *imap_use_trash_checkbtn;
        GtkSizeGroup *size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
 #define PACK_HBOX(hbox) \
        { \
        hbox = gtk_hbox_new (FALSE, 8); \
@@ -2822,6 +2840,8 @@ static void advanced_create_widget_func(PrefsPage * _page,
        page->vbox = vbox1;
 
        page->page.widget = vbox1;
+       
+       g_object_unref(G_OBJECT(size_group));
 }
        
 static gint prefs_basic_apply(void)
@@ -3505,6 +3525,8 @@ void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
                privacy_prefs = NULL;
        }
 
+       ac_prefs->receive_in_progress = FALSE;
+
        prefs_custom_header_read_config(ac_prefs);
 }
 
@@ -3700,10 +3722,9 @@ PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs, gboolean *dirty)
 
        if (!cancelled && dirty != NULL)
                *dirty = TRUE;
-       if (cancelled && new_account) {
-               prefs_account_free(ac_prefs);
+       if (cancelled && new_account)
                return NULL;
-       else {
+       else {
                if (ac_prefs->recv_server)
                        g_strstrip(ac_prefs->recv_server);
                if (ac_prefs->smtp_server)
@@ -3775,6 +3796,106 @@ static void prefs_account_select_folder_cb(GtkWidget *widget, gpointer data)
        }
 }
 
+#if (defined USE_GNUTLS && GLIB_CHECK_VERSION(2,22,0))
+static void auto_configure_cb (GtkWidget *widget, gpointer data)
+{
+       gchar *address = NULL;
+       const gchar *domain = NULL;
+       AutoConfigureData *recv_data;
+       AutoConfigureData *send_data;
+       static GCancellable *recv_cancel = NULL;
+       static GCancellable *send_cancel = NULL;
+       RecvProtocol protocol;
+       struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *) basic_page.protocol_optmenu;
+       GtkWidget *optmenu = protocol_optmenu->combobox;
+
+       if (!recv_cancel) {
+               recv_cancel = g_cancellable_new();
+               send_cancel = g_cancellable_new();
+       }
+
+       if (widget == basic_page.auto_configure_cancel_btn) {
+               g_cancellable_cancel(recv_cancel);
+               g_cancellable_cancel(send_cancel);
+               g_object_unref(recv_cancel);
+               g_object_unref(send_cancel);
+               recv_cancel = NULL;
+               send_cancel = NULL;
+               return;
+       }
+
+       protocol = combobox_get_active_data(GTK_COMBO_BOX(optmenu));
+
+       address = gtk_editable_get_chars(GTK_EDITABLE(basic_page.addr_entry), 0, -1);
+
+       if (strchr(address, '@') < 0) {
+               g_free(address);
+               gtk_label_set_text(GTK_LABEL(basic_page.auto_configure_lbl),
+                          _("Failed (wrong address)"));
+       }
+       domain = strchr(address, '@') + 1;
+
+       if (protocol == A_POP3 || protocol == A_IMAP4) {
+               recv_data = g_new0(AutoConfigureData, 1);
+               recv_data->configure_button = GTK_BUTTON(basic_page.auto_configure_btn);
+               recv_data->cancel_button = GTK_BUTTON(basic_page.auto_configure_cancel_btn);
+               recv_data->info_label = GTK_LABEL(basic_page.auto_configure_lbl);
+               recv_data->cancel = recv_cancel;
+               switch(protocol) {
+               case A_POP3:
+                       recv_data->ssl_service = "pop3s";
+                       recv_data->tls_service = "pop3";
+                       recv_data->domain = g_strdup(domain);
+                       recv_data->hostname_entry = GTK_ENTRY(basic_page.recvserv_entry);
+                       recv_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.popport_checkbtn);
+                       recv_data->port = GTK_SPIN_BUTTON(advanced_page.popport_spinbtn);
+                       recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.pop_starttls_radiobtn);
+                       recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.pop_ssltunnel_radiobtn);
+                       recv_data->default_port = 110;
+                       recv_data->default_ssl_port = 995;
+                       break;
+               case A_IMAP4:
+                       recv_data->ssl_service = "imaps";
+                       recv_data->tls_service = "imap";
+                       recv_data->domain = g_strdup(domain);
+                       recv_data->hostname_entry = GTK_ENTRY(basic_page.recvserv_entry);
+                       recv_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.imapport_checkbtn);
+                       recv_data->port = GTK_SPIN_BUTTON(advanced_page.imapport_spinbtn);
+                       recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.imap_starttls_radiobtn);
+                       recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.imap_ssltunnel_radiobtn);
+                       recv_data->default_port = 143;
+                       recv_data->default_ssl_port = 993;
+                       break;
+               default:
+                       cm_return_if_fail(FALSE);
+               }
+               auto_configure_service(recv_data);
+       }
+
+       send_data = g_new0(AutoConfigureData, 1);
+       send_data->configure_button = GTK_BUTTON(basic_page.auto_configure_btn);
+       send_data->cancel_button = GTK_BUTTON(basic_page.auto_configure_cancel_btn);
+       send_data->info_label = GTK_LABEL(basic_page.auto_configure_lbl);
+       send_data->cancel = send_cancel;
+
+       send_data->ssl_service = NULL;
+       send_data->tls_service = "submission";
+       send_data->domain = g_strdup(domain);
+       send_data->hostname_entry = GTK_ENTRY(basic_page.smtpserv_entry);
+       send_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.smtpport_checkbtn);
+       send_data->port = GTK_SPIN_BUTTON(advanced_page.smtpport_spinbtn);
+       send_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.smtp_starttls_radiobtn);
+       send_data->ssl_checkbtn = NULL;
+       send_data->default_port = 25;
+       send_data->default_ssl_port = -1;
+       send_data->auth_checkbtn = send_page.smtp_auth_checkbtn;
+
+       auto_configure_service(send_data);
+
+       g_free(address);
+}
+#endif
+
 static void prefs_account_sigfile_radiobtn_cb(GtkWidget *widget, gpointer data)
 {
        gtk_widget_set_sensitive(GTK_WIDGET(signature_browse_button), TRUE);
@@ -4086,6 +4207,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
 
        gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
        gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
+
        switch(protocol) {
        case A_NNTP:
 #ifndef HAVE_LIBETPAN
@@ -4496,6 +4618,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(receive_page.low_bandwidth_checkbtn);
                break;
        case A_POP3:
+               /* continue to default: */
        default:
                gtk_widget_show(send_page.msgid_checkbtn);
                gtk_widget_show(send_page.xmailer_checkbtn);