[balsa] Change the POP3 configuration gui



commit d60066c6249ddbc6c7121f611685d96b62789367
Author: Albrecht Dreß <albrecht dress arcor de>
Date:   Fri Apr 7 19:55:34 2017 -0400

    Change the POP3 configuration gui
    
    This part of the patch includes the changes in the POP3 configuration gui and some minor tweaks.
    
    * src/mailbox-conf.c, src/mailbox-conf.h: implement changes in the POP3 configuration gui
    * src/main.c: remove pop3 debug option (use G_MESSAGES_DEBUG=all to emit debugging information via 
g_debug)
    * src/save-restore.c: simplify loading the cert passphrase
    
    Signed-off-by: Peter Bloomfield <PeterBloomfield bellsouth net>

 src/mailbox-conf.c |  440 +++++++++++++++++++++++++++++++---------------------
 src/mailbox-conf.h |    4 +-
 src/main.c         |    2 -
 src/save-restore.c |    3 +-
 4 files changed, 270 insertions(+), 179 deletions(-)
---
diff --git a/src/mailbox-conf.c b/src/mailbox-conf.c
index 1c8d9ac..90b5727 100644
--- a/src/mailbox-conf.c
+++ b/src/mailbox-conf.c
@@ -98,6 +98,7 @@ struct _MailboxConfWindow {
 
        /* for pop3 mailboxes */
        struct {
+               GtkWidget *security;
            GtkWidget *username;
            GtkWidget *password;
            GtkWidget *check;
@@ -136,6 +137,8 @@ static GtkWidget *create_local_mailbox_dialog(MailboxConfWindow *mcw);
 static GtkWidget *create_pop_mailbox_dialog(MailboxConfWindow *mcw);
 static GtkWidget *create_imap_mailbox_dialog(MailboxConfWindow *mcw);
 
+static void check_for_blank_fields(GtkWidget *widget, MailboxConfWindow *mcw);
+
 /* ========================================================= */
 /* BEGIN BalsaServerConf =================================== */
 struct menu_data {
@@ -243,6 +246,37 @@ balsa_server_conf_get_advanced_widget(BalsaServerConf *bsc, LibBalsaServer *s,
     return box;
 }
 
+static GtkWidget*
+balsa_server_conf_get_advanced_widget_new(BalsaServerConf *bsc)
+{
+    GtkWidget *box;
+    GtkWidget *label;
+
+    box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+
+    bsc->grid = GTK_GRID(libbalsa_create_grid());
+    gtk_container_set_border_width(GTK_CONTAINER(bsc->grid), 12);
+    gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(bsc->grid), FALSE, FALSE, 0);
+
+    bsc->used_rows = 0U;
+
+    /* client certificate configuration */
+    bsc->need_client_cert = balsa_server_conf_add_checkbox(bsc, _("Server requires client certificate"));
+
+    label = libbalsa_create_grid_label(_("Certificate _File:"), GTK_WIDGET(bsc->grid), bsc->used_rows);
+    bsc->client_cert_file = gtk_file_chooser_button_new(_("Choose Client Certificate"), 
GTK_FILE_CHOOSER_ACTION_OPEN);
+    gtk_widget_set_hexpand(bsc->client_cert_file, TRUE);
+    gtk_grid_attach(bsc->grid, bsc->client_cert_file, 1, bsc->used_rows++, 1, 1);
+    gtk_label_set_mnemonic_widget(GTK_LABEL(label), bsc->client_cert_file);
+
+    label = libbalsa_create_grid_label(_("Certificate _Pass Phrase:"), GTK_WIDGET(bsc->grid), 
bsc->used_rows);
+    bsc->client_cert_passwd = libbalsa_create_grid_entry(GTK_WIDGET(bsc->grid), NULL, NULL, 
bsc->used_rows++, NULL, label);
+    g_object_set(G_OBJECT(bsc->client_cert_passwd), "input-purpose", GTK_INPUT_PURPOSE_PASSWORD, NULL);
+    gtk_entry_set_visibility(GTK_ENTRY(bsc->client_cert_passwd), FALSE);
+
+    return box;
+}
+
 GtkWidget*
 balsa_server_conf_add_checkbox(BalsaServerConf *bsc,
                                const char *label)
@@ -310,6 +344,31 @@ pop3_enable_filter_cb(GtkWidget * w, MailboxConfWindow * mcw)
     GtkToggleButton *button = GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter);
     gtk_widget_set_sensitive(mcw->mb_data.pop3.filter_cmd,
                              gtk_toggle_button_get_active(button));
+    check_for_blank_fields(NULL, mcw);
+}
+
+static void
+client_cert_changed(GtkToggleButton *button, MailboxConfWindow *mcw)
+{
+       gboolean sensitive;
+
+       sensitive = gtk_toggle_button_get_active(button);
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_file, sensitive);
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_passwd, sensitive);
+    check_for_blank_fields(NULL, mcw);
+}
+
+static void
+security_changed(GtkComboBox *combo, MailboxConfWindow *mcw)
+{
+       gboolean sensitive;
+
+       sensitive = (gtk_combo_box_get_active(combo) + 1) != NET_CLIENT_CRYPT_NONE;
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.need_client_cert, sensitive);
+       sensitive = sensitive & 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.bsc.need_client_cert));
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_file, sensitive);
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_passwd, sensitive);
+    check_for_blank_fields(NULL, mcw);
 }
 
 /* BEGIN OF COMMONLY USED CALLBACKS SECTION ---------------------- */
@@ -614,111 +673,130 @@ mailbox_conf_edit(BalsaMailboxNode * mbnode)
                       dialog);
 }
 
-/*
- * Initialise the dialogs fields from mcw->mailbox
- */
 static void
-mailbox_conf_set_values(MailboxConfWindow *mcw)
+mailbox_conf_set_values_pop3(LibBalsaMailbox   *mailbox,
+                                                        MailboxConfWindow *mcw)
 {
-    LibBalsaMailbox * mailbox;
-
-    mailbox = mcw->mailbox;
-
-    g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
-
-    if (mcw->mailbox_name && mailbox->name)
-       gtk_entry_set_text(GTK_ENTRY(mcw->mailbox_name), mailbox->name);
-
-    if (LIBBALSA_IS_MAILBOX_LOCAL(mailbox)) {
-        if (mailbox->url) {
-            GtkFileChooser *chooser = GTK_FILE_CHOOSER(mcw->window);
-           LibBalsaMailboxLocal *local = LIBBALSA_MAILBOX_LOCAL(mailbox);
-            const gchar *path = libbalsa_mailbox_local_get_path(local);
-            gchar *basename = g_path_get_basename(path);
-            gtk_file_chooser_set_filename(chooser, path);
-            gtk_file_chooser_set_current_name(chooser, basename);
-            g_free(basename);
-        }
-    } else if (LIBBALSA_IS_MAILBOX_POP3(mailbox)) {
        LibBalsaMailboxPop3 *pop3;
        LibBalsaServer *server;
+       gboolean sensitive;
 
        pop3 = LIBBALSA_MAILBOX_POP3(mailbox);
        server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
 
+       /* basic settings */
+       if (server->host != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server), server->host);
+       }
+       gtk_combo_box_set_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security), server->security - 1);
 
-       if (server->host)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server), 
-                               server->host);
-       if (server->user)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.username), 
-                               server->user);
-       if (server->passwd)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.password),
-                              server->passwd);
-        balsa_server_conf_set_values(&mcw->mb_data.pop3.bsc, server);
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.disable_apop),
-                                    pop3->disable_apop);
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.enable_pipe),
-                                    pop3->enable_pipe);
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.check),
-                                    pop3->check);
-
-       gtk_toggle_button_set_active
-           (GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.delete_from_server),
-            pop3->delete_from_server);
-       gtk_toggle_button_set_active
-           (GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter),
-            pop3->filter);
-        gtk_widget_set_sensitive(mcw->mb_data.pop3.filter_cmd, pop3->filter);
-       if (pop3->filter_cmd)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.filter_cmd),
-                              pop3->filter_cmd);
+       if (server->user != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.username), server->user);
+       }
 
-    } else if (LIBBALSA_IS_MAILBOX_IMAP(mailbox)) {
-       LibBalsaMailboxImap *imap;
-       LibBalsaServer *server;
-        const gchar *path;
-       imap = LIBBALSA_MAILBOX_IMAP(mailbox);
-       server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+       if (server->passwd != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.password), server->passwd);
+       }
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.delete_from_server), 
pop3->delete_from_server);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.check), pop3->check);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter), pop3->filter);
+       if (pop3->filter_cmd != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.filter_cmd), pop3->filter_cmd);
+       }
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.filter_cmd, pop3->filter);
 
-       if (server->host)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.bsc.server), 
-                               server->host);
-       if (server->user)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.username),
-                              server->user);
-       gtk_toggle_button_set_active
-            (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.anonymous),
-            server->try_anonymous);
-       gtk_toggle_button_set_active
-            (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.remember),
-            server->remember_passwd);
-       if (server->passwd)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.password),
-                              server->passwd);
-        path = libbalsa_mailbox_imap_get_path(imap);
-       if (path)
-           gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.folderpath),
-                              path);
-        balsa_server_conf_set_values(&mcw->mb_data.imap.bsc, server);
-        if(libbalsa_imap_server_has_persistent_cache
-           (LIBBALSA_IMAP_SERVER(server)))
-            gtk_toggle_button_set_active
-                (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.enable_persistent),
-                 TRUE);
-        if(libbalsa_imap_server_has_bug(LIBBALSA_IMAP_SERVER(server),
-                                        ISBUG_FETCH))
-            gtk_toggle_button_set_active
-                (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.has_bugs),
-                 TRUE);
-        if(!server->try_anonymous)
-            gtk_widget_set_sensitive(GTK_WIDGET(mcw->mb_data.imap.anonymous),
-                                     FALSE);
-        if(!server->remember_passwd)
-            gtk_widget_set_sensitive(GTK_WIDGET(mcw->mb_data.imap.password),
-                                     FALSE);
+       /* advanced settings */
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.bsc.need_client_cert), 
server->client_cert);
+       sensitive = (server->security != NET_CLIENT_CRYPT_NONE);
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.need_client_cert, sensitive);
+       sensitive = sensitive & server->client_cert;
+
+    if (server->cert_file != NULL) {
+       gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(mcw->mb_data.pop3.bsc.client_cert_file), 
server->cert_file);
     }
+    gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_file, sensitive);
+
+       if (server->cert_passphrase != NULL) {
+               gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.client_cert_passwd), 
server->cert_passphrase);
+       }
+       gtk_widget_set_sensitive(mcw->mb_data.pop3.bsc.client_cert_passwd, sensitive);
+
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.disable_apop), pop3->disable_apop);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.enable_pipe), pop3->enable_pipe);
+}
+
+
+/*
+ * Initialise the dialogs fields from mcw->mailbox
+ */
+static void
+mailbox_conf_set_values(MailboxConfWindow *mcw)
+{
+       LibBalsaMailbox * mailbox;
+
+       mailbox = mcw->mailbox;
+
+       g_return_if_fail(LIBBALSA_IS_MAILBOX(mailbox));
+
+       if (mcw->mailbox_name && mailbox->name)
+               gtk_entry_set_text(GTK_ENTRY(mcw->mailbox_name), mailbox->name);
+
+       if (LIBBALSA_IS_MAILBOX_LOCAL(mailbox)) {
+               if (mailbox->url) {
+                       GtkFileChooser *chooser = GTK_FILE_CHOOSER(mcw->window);
+                       LibBalsaMailboxLocal *local = LIBBALSA_MAILBOX_LOCAL(mailbox);
+                       const gchar *path = libbalsa_mailbox_local_get_path(local);
+                       gchar *basename = g_path_get_basename(path);
+                       gtk_file_chooser_set_filename(chooser, path);
+                       gtk_file_chooser_set_current_name(chooser, basename);
+                       g_free(basename);
+               }
+       } else if (LIBBALSA_IS_MAILBOX_POP3(mailbox)) {
+               mailbox_conf_set_values_pop3(mailbox, mcw);
+       } else if (LIBBALSA_IS_MAILBOX_IMAP(mailbox)) {
+               LibBalsaMailboxImap *imap;
+               LibBalsaServer *server;
+               const gchar *path;
+               imap = LIBBALSA_MAILBOX_IMAP(mailbox);
+               server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+
+               if (server->host)
+                       gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.bsc.server),
+                               server->host);
+               if (server->user)
+                       gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.username),
+                               server->user);
+               gtk_toggle_button_set_active
+               (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.anonymous),
+                       server->try_anonymous);
+               gtk_toggle_button_set_active
+               (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.remember),
+                       server->remember_passwd);
+               if (server->passwd)
+                       gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.password),
+                               server->passwd);
+               path = libbalsa_mailbox_imap_get_path(imap);
+               if (path)
+                       gtk_entry_set_text(GTK_ENTRY(mcw->mb_data.imap.folderpath),
+                               path);
+               balsa_server_conf_set_values(&mcw->mb_data.imap.bsc, server);
+               if(libbalsa_imap_server_has_persistent_cache
+                       (LIBBALSA_IMAP_SERVER(server)))
+                       gtk_toggle_button_set_active
+                       (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.enable_persistent),
+                               TRUE);
+               if(libbalsa_imap_server_has_bug(LIBBALSA_IMAP_SERVER(server),
+                       ISBUG_FETCH))
+                       gtk_toggle_button_set_active
+                       (GTK_TOGGLE_BUTTON(mcw->mb_data.imap.has_bugs),
+                               TRUE);
+               if(!server->try_anonymous)
+                       gtk_widget_set_sensitive(GTK_WIDGET(mcw->mb_data.imap.anonymous),
+                               FALSE);
+               if(!server->remember_passwd)
+                       gtk_widget_set_sensitive(GTK_WIDGET(mcw->mb_data.imap.password),
+                               FALSE);
+       }
 }
 
 
@@ -729,7 +807,7 @@ mailbox_conf_set_values(MailboxConfWindow *mcw)
  * on any widget which can affect the validity of the input.
  */
 static void
-check_for_blank_fields(GtkWidget *widget, MailboxConfWindow *mcw)
+check_for_blank_fields(GtkWidget G_GNUC_UNUSED *widget, MailboxConfWindow *mcw)
 {
     gboolean sensitive;
 
@@ -753,9 +831,29 @@ check_for_blank_fields(GtkWidget *widget, MailboxConfWindow *mcw)
             || !*gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.imap.username)))
            sensitive = FALSE;
     } else if (g_type_is_a(mcw->mailbox_type, LIBBALSA_TYPE_MAILBOX_POP3) ) {
-       if (!*gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.username))
-            || !*gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server)))
-           sensitive = FALSE;
+       /* POP3: require user name and server */
+       if ((gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.username))[0] == '\0') ||
+            (gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server))[0] == '\0')) {
+               sensitive = FALSE;
+       }
+       /* procmail filtering requires command */
+       if (sensitive &&
+               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter)) &&
+               (gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.filter_cmd))[0] == '\0')) {
+               sensitive = FALSE;
+       }
+       /* encryption w/ client cert requires cert file */
+       if (sensitive &&
+               ((gtk_combo_box_get_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security)) + 1) != 
NET_CLIENT_CRYPT_NONE) &&
+               gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.bsc.need_client_cert))) {
+               gchar *cert_file;
+
+               cert_file = 
gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(mcw->mb_data.pop3.bsc.client_cert_file));
+               if ((cert_file == NULL) || (cert_file[0] == '\0')) {
+                       sensitive = FALSE;
+               }
+               g_free(cert_file);
+       }
     }
 
     gtk_dialog_set_response_sensitive(mcw->window, MCW_RESPONSE, sensitive);
@@ -790,43 +888,39 @@ fill_in_imap_data(MailboxConfWindow *mcw, gchar ** name, gchar ** path)
 static void
 update_pop_mailbox(MailboxConfWindow *mcw)
 {
-    LibBalsaMailboxPop3 * mailbox;
-    const gchar *cmd;
-    LibBalsaServer *server;
-    mailbox = LIBBALSA_MAILBOX_POP3(mcw->mailbox);
-
-    g_free(LIBBALSA_MAILBOX(mailbox)->name);
-    LIBBALSA_MAILBOX(mailbox)->name =
-       g_strdup(gtk_entry_get_text(GTK_ENTRY(mcw->mailbox_name)));
+       LibBalsaMailboxPop3 *mailbox;
+       LibBalsaServer *server;
+       BalsaServerConf *bsc;
 
-    server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
-    libbalsa_server_set_username(server,
-                                gtk_entry_get_text(GTK_ENTRY
-                                                   (mcw->mb_data.pop3.username)));
-    libbalsa_server_set_password(server,
-                                gtk_entry_get_text(GTK_ENTRY
-                                                   (mcw->mb_data.pop3.password)));
-    libbalsa_server_set_host(server,
-                            gtk_entry_get_text(GTK_ENTRY
-                                               (mcw->mb_data.pop3.bsc.server)),
-                             balsa_server_conf_get_use_ssl
-                             (&mcw->mb_data.pop3.bsc));
-    libbalsa_server_config_changed(server);
-    server->tls_mode = balsa_server_conf_get_tls_mode(&mcw->mb_data.pop3.bsc);
-    mailbox->check =
-       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.check));
-    mailbox->disable_apop =
-       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.disable_apop));
-    mailbox->enable_pipe =
-       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.enable_pipe));
-    mailbox->delete_from_server =
-       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
-                                    (mcw->mb_data.pop3.delete_from_server));
-    mailbox->filter =
-       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter));
-    cmd = gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.filter_cmd));
-    g_free(mailbox->filter_cmd);
-    mailbox->filter_cmd = cmd ? g_strdup(cmd) : NULL;
+       mailbox = LIBBALSA_MAILBOX_POP3(mcw->mailbox);
+       server = LIBBALSA_MAILBOX_REMOTE_SERVER(mailbox);
+       bsc = &mcw->mb_data.pop3.bsc;
+
+       /* basic data */
+       g_free(LIBBALSA_MAILBOX(mailbox)->name);
+       LIBBALSA_MAILBOX(mailbox)->name = g_strdup(gtk_entry_get_text(GTK_ENTRY(mcw->mailbox_name)));
+
+       libbalsa_server_set_host(server, gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.bsc.server)), FALSE);
+       server->security = gtk_combo_box_get_active(GTK_COMBO_BOX(mcw->mb_data.pop3.security)) + 1;
+
+       libbalsa_server_set_username(server, gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.username)));
+       libbalsa_server_set_password(server, gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.password)));
+       libbalsa_server_config_changed(server);
+
+       mailbox->check = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.check));
+       mailbox->delete_from_server = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON 
(mcw->mb_data.pop3.delete_from_server));
+       mailbox->filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.filter));
+       g_free(mailbox->filter_cmd);
+       mailbox->filter_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(mcw->mb_data.pop3.filter_cmd)));
+
+       /* advanced settings */
+       server->client_cert = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bsc->need_client_cert));
+       g_free(server->cert_file);
+       server->cert_file = g_strdup(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(bsc->client_cert_file)));;
+       g_free(server->cert_passphrase);
+       server->cert_passphrase = g_strdup(gtk_entry_get_text(GTK_ENTRY(bsc->client_cert_passwd)));
+       mailbox->disable_apop = 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.disable_apop));
+       mailbox->enable_pipe = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mcw->mb_data.pop3.enable_pipe));
 }
 
 /*
@@ -1175,82 +1269,78 @@ create_pop_mailbox_dialog(MailboxConfWindow *mcw)
 {
     GtkWidget *dialog;
     GtkWidget *notebook, *grid, *label, *advanced;
+    gint row;
 
     notebook = gtk_notebook_new();
     grid = libbalsa_create_grid();
     gtk_container_set_border_width(GTK_CONTAINER(grid), 12);
     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), grid,
                              gtk_label_new_with_mnemonic(_("_Basic")));
+    row = 0;
 
     /* mailbox name */
-    label = libbalsa_create_grid_label(_("Mailbox _name:"), grid, 0);
-    mcw->mailbox_name =
-        libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields),
-                                  mcw, 0, NULL, label);
+    label = libbalsa_create_grid_label(_("Mailbox _name:"), grid, row);
+    mcw->mailbox_name = libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields), mcw, row++, 
NULL, label);
     /* pop server */
-    label = libbalsa_create_grid_label(_("_Server:"), grid, 1);
+    label = libbalsa_create_grid_label(_("_Server:"), grid, row);
     mcw->mb_data.pop3.bsc.server =
-        libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields),
-                                  mcw, 1, "localhost", label);
-    mcw->mb_data.pop3.bsc.default_ports = POP3_DEFAULT_PORTS;
-
+       libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields), mcw, row++, "localhost", label);
+
+    /* security */
+    label = libbalsa_create_grid_label(_("Se_curity:"), grid, row);
+    mcw->mb_data.pop3.security = gtk_combo_box_text_new();
+    gtk_widget_set_hexpand(mcw->mb_data.pop3.security, TRUE);
+    mcw->mb_data.pop3.security = gtk_combo_box_text_new();
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mcw->mb_data.pop3.security), _("POP3 over SSL 
(POP3S)"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mcw->mb_data.pop3.security), _("TLS required"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mcw->mb_data.pop3.security), _("TLS if possible (not 
recommended)"));
+    gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(mcw->mb_data.pop3.security), _("None (not 
recommended)"));
+    gtk_grid_attach(GTK_GRID(grid), mcw->mb_data.pop3.security, 1, row++, 1, 1);
+    g_signal_connect(mcw->mb_data.pop3.security, "changed", G_CALLBACK(security_changed), mcw);
+    gtk_label_set_mnemonic_widget(GTK_LABEL(label), mcw->mb_data.pop3.security);
 
     /* username  */
-    label= libbalsa_create_grid_label(_("Use_r name:"), grid, 2);
+    label= libbalsa_create_grid_label(_("Use_r name:"), grid, row);
     mcw->mb_data.pop3.username =
-        libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields),
-                                   mcw, 2, g_get_user_name(), label);
+       libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields), mcw, row++, g_get_user_name(), 
label);
 
     /* password field */
-    label = libbalsa_create_grid_label(_("Pass_word:"), grid, 3);
-    mcw->mb_data.pop3.password =
-        libbalsa_create_grid_entry(grid, NULL, NULL, 3, NULL, label);
+    label = libbalsa_create_grid_label(_("Pass_word:"), grid, row);
+    mcw->mb_data.pop3.password = libbalsa_create_grid_entry(grid, NULL, NULL, row++, NULL, label);
     gtk_entry_set_visibility(GTK_ENTRY(mcw->mb_data.pop3.password), FALSE);
 
     /* toggle for deletion from server */
     mcw->mb_data.pop3.delete_from_server =
-       libbalsa_create_grid_check(_("_Delete messages from server"
-                                     " after download"),
-                                   grid, 4, TRUE);
+       libbalsa_create_grid_check(_("_Delete messages from server after download"), grid, row++, TRUE);
 
     /* toggle for check */
     mcw->mb_data.pop3.check =
-       libbalsa_create_grid_check(_("_Enable check for new mail"),
-                                   grid, 5, TRUE);
+       libbalsa_create_grid_check(_("_Enable check for new mail"), grid, row++, TRUE);
 
     /* Procmail */
     mcw->mb_data.pop3.filter =
-       libbalsa_create_grid_check(_("_Filter messages through procmail"),
-                                   grid, 6, FALSE);
-    g_signal_connect(G_OBJECT(mcw->mb_data.pop3.filter), "toggled",
-                     G_CALLBACK(pop3_enable_filter_cb), mcw);
-    label = libbalsa_create_grid_label(_("Fi_lter Command:"), grid, 7);
+       libbalsa_create_grid_check(_("_Filter messages through procmail"), grid, row++, FALSE);
+    g_signal_connect(G_OBJECT(mcw->mb_data.pop3.filter), "toggled", G_CALLBACK(pop3_enable_filter_cb), mcw);
+    label = libbalsa_create_grid_label(_("Fi_lter Command:"), grid, row);
     mcw->mb_data.pop3.filter_cmd =
-       libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields),
-                                   mcw, 7, "procmail -f -", label);
+       libbalsa_create_grid_entry(grid, G_CALLBACK(check_for_blank_fields), mcw, row++, "procmail -f -", 
label);
+
+    advanced = balsa_server_conf_get_advanced_widget_new(&mcw->mb_data.pop3.bsc);
+    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), advanced, gtk_label_new_with_mnemonic(_("_Advanced")));
+       g_signal_connect(mcw->mb_data.pop3.bsc.need_client_cert, "toggled", G_CALLBACK(client_cert_changed), 
mcw);
+       g_signal_connect(mcw->mb_data.pop3.bsc.client_cert_file, "file-set", 
G_CALLBACK(check_for_blank_fields), mcw);
 
-    advanced =
-        balsa_server_conf_get_advanced_widget(&mcw->mb_data.pop3.bsc,
-                                              NULL, 2);
-    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), advanced,
-                             gtk_label_new_with_mnemonic(_("_Advanced")));
     /* toggle for apop */
-    mcw->mb_data.pop3.disable_apop = 
-        balsa_server_conf_add_checkbox(&mcw->mb_data.pop3.bsc,
-                                       _("Disable _APOP"));
+    mcw->mb_data.pop3.disable_apop = balsa_server_conf_add_checkbox(&mcw->mb_data.pop3.bsc, _("Disable 
_APOP"));
     /* toggle for enabling pipeling */
-    mcw->mb_data.pop3.enable_pipe =
-        balsa_server_conf_add_checkbox(&mcw->mb_data.pop3.bsc,
-                                       _("Overlap commands"));
+    mcw->mb_data.pop3.enable_pipe = balsa_server_conf_add_checkbox(&mcw->mb_data.pop3.bsc, _("Overlap 
commands"));
 
     gtk_widget_show_all(notebook);
     gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
     gtk_widget_grab_focus(mcw->mailbox_name);
 
     dialog = create_generic_dialog(mcw);
-    gtk_container_add(GTK_CONTAINER
-                      (gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
-                      notebook);
+    gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), notebook);
     return dialog;
 }
 
diff --git a/src/mailbox-conf.h b/src/mailbox-conf.h
index 2dbbefc..8a32d1f 100644
--- a/src/mailbox-conf.h
+++ b/src/mailbox-conf.h
@@ -53,11 +53,13 @@ typedef struct {
     GtkGrid   *grid;       /* internal */
     GtkWidget *tls_option; /* internal */
     GtkWidget *server;     /* internal */
+    GtkWidget *need_client_cert;
+    GtkWidget *client_cert_file;
+    GtkWidget *client_cert_passwd;
     const gchar *default_ports;
     unsigned   used_rows;  /* internal */
 } BalsaServerConf;
 #define IMAP_DEFAULT_PORTS "143 993 imap imaps"
-#define POP3_DEFAULT_PORTS "110 995 pop3 pop3s"
 
 GtkWidget* balsa_server_conf_get_advanced_widget(BalsaServerConf *bsc,
                                                  LibBalsaServer *s,
diff --git a/src/main.c b/src/main.c
index 35282aa..0e60381 100644
--- a/src/main.c
+++ b/src/main.c
@@ -679,8 +679,6 @@ parse_options(int                       argc,
         {"get-stats", 's', 0, G_OPTION_ARG_NONE,
          &(cmd_get_stats),
          N_("Prints number unread and unsent messages"), NULL},
-        {"debug-pop", 'd', 0, G_OPTION_ARG_NONE, &PopDebug,
-         N_("Debug POP3 connection"), NULL},
         {"debug-imap", 'D', 0, G_OPTION_ARG_NONE, &ImapDebug,
          N_("Debug IMAP connection"), NULL},
         {"help", 'h', 0, G_OPTION_ARG_NONE, &help, N_("Show help options"), NULL},
diff --git a/src/save-restore.c b/src/save-restore.c
index dc04e72..5799fd8 100644
--- a/src/save-restore.c
+++ b/src/save-restore.c
@@ -968,7 +968,8 @@ config_global_load(void)
        if (passphrase) {
             gchar* tmp = libbalsa_rot(passphrase);
             g_free(passphrase);
-           libbalsa_smtp_server_set_cert_passphrase(smtp_server, tmp);
+           g_free(server->cert_passphrase);
+           server->cert_passphrase = tmp;
        }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]