2008-09-24 [colin] 3.5.0cvs125
[claws.git] / src / wizard.c
index 1b4322975d3c83be35880a2da0ba5d3217a853b8..031e565a6ad4aed6d57513efe73920fcfe0a194e 100644 (file)
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <gdk/gdkkeysyms.h>
-#include <gtk/gtkwidget.h>
-#include <gtk/gtkvbox.h>
-#include <gtk/gtkbox.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtkentry.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtknotebook.h>
-#include <gtk/gtktogglebutton.h>
-#include <gtk/gtkcheckbutton.h>
 #include <gtk/gtk.h>
 
 #include <stdio.h>
@@ -57,6 +48,7 @@
 #include "setup.h"
 #include "folder.h"
 #include "alertpanel.h"
+#include "filesel.h"
 #if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
 #include "ssl.h"
 #endif
@@ -122,6 +114,12 @@ typedef struct
        GtkWidget *recv_use_ssl;
        GtkWidget *smtp_use_tls;
        GtkWidget *recv_use_tls;
+       GtkWidget *smtp_ssl_cert_file;
+       GtkWidget *recv_ssl_cert_file;
+       GtkWidget *smtp_ssl_cert_pass;
+       GtkWidget *recv_ssl_cert_pass;
+       GtkWidget *smtp_cert_table;
+       GtkWidget *recv_cert_table;
 #endif
 
 #ifdef MAEMO
@@ -159,6 +157,10 @@ typedef struct _AccountTemplate {
        gchar *mailbox;
        gboolean smtpssl;
        gboolean recvssl;
+       gchar *smtpssl_cert;
+       gchar *recvssl_cert;
+       gchar *smtpssl_cert_pass;
+       gchar *recvssl_cert_pass;
 } AccountTemplate;
 
 static AccountTemplate tmpl;
@@ -200,6 +202,14 @@ static PrefParam template_params[] = {
         &tmpl.smtpssl, P_INT, NULL, NULL, NULL},
        {"recvssl", "0",
         &tmpl.recvssl, P_INT, NULL, NULL, NULL},
+       {"smtpssl_cert", "",
+        &tmpl.smtpssl_cert, P_STRING, NULL, NULL, NULL},
+       {"recvssl_cert", "",
+        &tmpl.recvssl_cert, P_STRING, NULL, NULL, NULL},
+       {"smtpssl_cert_pass", "",
+        &tmpl.smtpssl_cert, P_STRING, NULL, NULL, NULL},
+       {"recvssl_cert_pass", "",
+        &tmpl.recvssl_cert, P_STRING, NULL, NULL, NULL},
        {NULL, NULL, NULL, P_INT, NULL, NULL, NULL}
 };
 
@@ -225,7 +235,7 @@ static gchar *accountrc_tmpl =
        "#organization=\n"
        "\n"
        "#you can use $DOMAIN here \n"
-       "#the default is stmp.$DOMAIN\n"
+       "#the default is smtp.$DOMAIN\n"
        "#smtpserver=\n"
        "\n"
        "#Whether to use smtp authentication\n"
@@ -276,13 +286,30 @@ static gchar *accountrc_tmpl =
        "#default is \"Mail\"\n"
        "#mailbox=\n"
        "\n"
-       "#whether to use ssl on STMP connections\n"
+       "#whether to use ssl on smtp connections\n"
        "#default is 0, 1 is ssl, 2 is starttls\n"
        "#smtpssl=\n"
        "\n"
        "#whether to use ssl on pop or imap connections\n"
        "#default is 0, 1 is ssl, 2 is starttls\n"
-       "#recvssl=\n";
+       "#recvssl=\n"
+       "\n"
+       "#SSL client certificate path for SMTP\n"
+       "#default is empty (no certificate)\n"
+       "#smtpssl_cert=\n"
+       "\n"
+       "#SSL client certificate path for POP/IMAP\n"
+       "#default is empty (no certificate)\n"
+       "#recvssl_cert=\n"
+       "\n"
+       "#SSL client certificate password for SMTP\n"
+       "#default is empty (no password)\n"
+       "#smtpssl_cert_pass=\n"
+       "\n"
+       "#SSL client certificate password for POP/IMAP\n"
+       "#default is empty (no password)\n"
+       "#recvssl_cert_pass=\n"
+       ;
 
 static gchar *wizard_get_default_domain_name(void)
 {
@@ -302,10 +329,10 @@ static gchar *wizard_get_default_domain_name(void)
 
 static gchar *get_name_for_mail(void)
 {
-       gchar *name = g_strdup(tmpl.name);
-       if (name == NULL)
+       gchar *name = NULL;
+       if (tmpl.name == NULL)
                return NULL;
-       g_strdown(name);
+       name = g_utf8_strdown(tmpl.name, -1);
        while(strstr(name, " "))
                *strstr(name, " ")='.';
        
@@ -425,7 +452,20 @@ static void initialize_fonts(WizardWindow *wizard)
                        widget->style->font_desc)
                      /PANGO_SCALE;
        gchar *tmp, *new;
-       
+#ifdef G_OS_WIN32
+       PangoFontDescription *bold_desc;
+       gchar *curfont = pango_font_description_to_string(widget->style->font_desc);
+       g_free(prefs_common.smallfont);
+       g_free(prefs_common.normalfont);
+       g_free(prefs_common.boldfont);
+       prefs_common.smallfont = g_strdup(curfont);
+       prefs_common.normalfont = g_strdup(curfont);
+       bold_desc = pango_font_description_from_string(curfont);
+       pango_font_description_set_weight(bold_desc, PANGO_WEIGHT_BOLD);
+       prefs_common.boldfont = pango_font_description_to_string(bold_desc);
+       pango_font_description_free(bold_desc);
+       g_free(curfont);
+#endif 
        tmp = g_strdup(prefs_common.textfont);
        if (strrchr(tmp, ' ')) {
                *(strrchr(tmp, ' ')) = '\0';
@@ -572,7 +612,7 @@ static void write_welcome_email(WizardWindow *wizard)
        g_free(head);
        g_free(body);
        g_free(msg);
-       g_unlink(file);
+       claws_unlink(file);
 }
 #undef XFACE
 
@@ -782,6 +822,14 @@ static gboolean wizard_write_config(WizardWindow *wizard)
        else
                prefs_account->ssl_pop = recv_ssl_type;
 
+       prefs_account->out_ssl_client_cert_file = g_strdup(
+                               gtk_entry_get_text(GTK_ENTRY(wizard->smtp_ssl_cert_file)));
+       prefs_account->out_ssl_client_cert_pass = g_strdup(
+                               gtk_entry_get_text(GTK_ENTRY(wizard->smtp_ssl_cert_pass)));
+       prefs_account->in_ssl_client_cert_file = g_strdup(
+                               gtk_entry_get_text(GTK_ENTRY(wizard->recv_ssl_cert_file)));
+       prefs_account->in_ssl_client_cert_pass = g_strdup(
+                               gtk_entry_get_text(GTK_ENTRY(wizard->recv_ssl_cert_pass)));
 #endif
        if (prefs_account->protocol == A_IMAP4) {
                gchar *directory = gtk_editable_get_chars(
@@ -1060,7 +1108,7 @@ static GtkWidget* mailbox_page (WizardWindow * wizard)
        gchar *uri, *mount_path;
 #endif
        GtkWidget *hbox;
-       GtkTooltips *tips = gtk_tooltips_new();
+       CLAWS_TIP_DECL();
 
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
@@ -1082,10 +1130,8 @@ static GtkWidget* mailbox_page (WizardWindow * wizard)
 
        gtk_entry_set_text(GTK_ENTRY(wizard->mailbox_name), tmpl.mailbox?tmpl.mailbox:"");
 
-       gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), wizard->mailbox_name,
-                            _("You can also specify an absolute path, for example: "
-                              "\"/home/john/Documents/Mail\""),
-                            NULL);
+       CLAWS_SET_TIP(wizard->mailbox_name, _("You can also specify an absolute path, for example: "
+                              "\"/home/john/Documents/Mail\""));
 
        gtk_box_pack_start(GTK_BOX(hbox), wizard->mailbox_label, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(hbox), wizard->mailbox_name, TRUE, TRUE, 0);
@@ -1166,13 +1212,38 @@ static void smtp_auth_changed (GtkWidget *btn, gpointer data)
        gtk_widget_set_sensitive(wizard->smtp_password_label, do_auth);
 }
 
+#if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
+static void cert_browse_cb(GtkWidget *widget, gpointer data)
+{
+       GtkEntry *dest = GTK_ENTRY(data);
+       gchar *filename;
+       gchar *utf8_filename;
+
+       filename = filesel_select_file_open(_("Select certificate file"), NULL);
+       if (!filename) return;
+
+       utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
+       if (!utf8_filename) {
+               g_warning("cert_browse_cb(): failed to convert character set.");
+               utf8_filename = g_strdup(filename);
+       }
+       gtk_entry_set_text(dest, utf8_filename);
+       g_free(utf8_filename);
+}
+#endif
+
 static GtkWidget* smtp_page (WizardWindow * wizard)
 {
        GtkWidget *table = gtk_table_new(1, 1, FALSE);
        GtkWidget *vbox;
        GtkWidget *hbox;
-       GtkTooltips *tips = gtk_tooltips_new();
+#if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
+       GtkWidget *label;
+       GtkWidget *button;
+       GtkWidget *smtp_cert_table;
+#endif
        gchar *text;
+       CLAWS_TIP_DECL();
        
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
@@ -1190,10 +1261,9 @@ static GtkWidget* smtp_page (WizardWindow * wizard)
        gtk_entry_set_text(GTK_ENTRY(wizard->smtp_server), text);
        g_free(text);
 
-       gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), wizard->smtp_server,
+       CLAWS_SET_TIP(wizard->smtp_server,
                             _("You can specify the port number by appending it at the end: "
-                              "\"mail.example.com:25\""),
-                            NULL);
+                              "\"mail.example.com:25\""));
 
        PACK_BOX(hbox, _("<span weight=\"bold\">SMTP server address:</span>"),
                 wizard->smtp_server);
@@ -1230,6 +1300,10 @@ static GtkWidget* smtp_page (WizardWindow * wizard)
        wizard->smtp_password = gtk_entry_new();
        gtk_entry_set_text(GTK_ENTRY(wizard->smtp_password), tmpl.smtppass?tmpl.smtppass:""); 
        gtk_entry_set_visibility(GTK_ENTRY(wizard->smtp_password), FALSE);
+#ifdef MAEMO
+       hildon_gtk_entry_set_input_mode(GTK_ENTRY(wizard->smtp_password), 
+               HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
+#endif
        wizard->smtp_password_label = gtk_label_new(_("SMTP password:\n"
                                        "<span size=\"small\">(empty to use the same as receive)</span>"));
        gtk_label_set_use_markup(GTK_LABEL(wizard->smtp_password_label), TRUE);
@@ -1254,6 +1328,39 @@ static GtkWidget* smtp_page (WizardWindow * wizard)
                        tmpl.smtpssl == 2);
        gtk_box_pack_start(GTK_BOX(hbox), wizard->smtp_use_tls, FALSE, FALSE, 0);
        SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, wizard->smtp_use_tls);
+       
+       smtp_cert_table = gtk_table_new(3,3, FALSE);
+       gtk_container_set_border_width(GTK_CONTAINER(smtp_cert_table), 8);
+       gtk_box_pack_start (GTK_BOX(vbox), smtp_cert_table, FALSE, FALSE, 0);
+       label = gtk_label_new(_("Client SSL certificate (optional)"));
+       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       gtk_table_attach(GTK_TABLE(smtp_cert_table), label, 0, 3, 0, 1, GTK_FILL, 0, 0, 0);
+       label = gtk_label_new(_("File"));
+       gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+       gtk_table_attach(GTK_TABLE(smtp_cert_table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0);
+       wizard->smtp_ssl_cert_file = gtk_entry_new();
+       gtk_entry_set_text(GTK_ENTRY(wizard->smtp_ssl_cert_file), tmpl.smtpssl_cert?tmpl.smtpssl_cert:"");
+       gtk_table_attach(GTK_TABLE(smtp_cert_table), wizard->smtp_ssl_cert_file, 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
+       button = gtkut_get_browse_file_btn(_("Browse"));
+       gtk_table_attach(GTK_TABLE(smtp_cert_table), button, 2, 3, 1, 2, GTK_FILL, 0, 0, 0);
+       SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, label);
+       SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, wizard->smtp_ssl_cert_file);
+       SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, button);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(cert_browse_cb), wizard->smtp_ssl_cert_file);
+
+       hbox = gtk_hbox_new(FALSE, VSPACING_NARROW);
+       gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+       label = gtk_label_new(_("Password"));
+       gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+       gtk_table_attach(GTK_TABLE(smtp_cert_table), label, 0, 1, 2, 3, GTK_FILL, 0, 0, 0);
+       wizard->smtp_ssl_cert_pass = gtk_entry_new();
+       gtk_entry_set_visibility(GTK_ENTRY(wizard->smtp_ssl_cert_pass), FALSE);
+       gtk_entry_set_text(GTK_ENTRY(wizard->smtp_ssl_cert_pass), tmpl.smtpssl_cert_pass?tmpl.smtpssl_cert_pass:"");
+       gtk_table_attach(GTK_TABLE(smtp_cert_table), wizard->smtp_ssl_cert_pass, 1, 2, 2, 3, GTK_FILL, 0, 0, 0);
+       SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, label);
+       SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, wizard->smtp_ssl_cert_pass);
+       wizard->smtp_cert_table = smtp_cert_table;
 #endif
        smtp_auth_changed(NULL, wizard);
        return table;
@@ -1277,6 +1384,7 @@ static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
 #if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
                gtk_widget_show(wizard->recv_use_ssl);
                gtk_widget_show(wizard->recv_use_tls);
+               gtk_widget_show(wizard->recv_cert_table);
 #endif
                gtk_label_set_text(GTK_LABEL(wizard->recv_label), _("<span weight=\"bold\">Server address:</span>"));
                gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
@@ -1301,6 +1409,7 @@ static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
 #if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
                gtk_widget_show(wizard->recv_use_ssl);
                gtk_widget_show(wizard->recv_use_tls);
+               gtk_widget_show(wizard->recv_cert_table);
 #endif
                gtk_label_set_text(GTK_LABEL(wizard->recv_label), _("<span weight=\"bold\">Server address:</span>"));
                gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
@@ -1326,6 +1435,7 @@ static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
 #if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
                gtk_widget_hide(wizard->recv_use_ssl);
                gtk_widget_hide(wizard->recv_use_tls);
+               gtk_widget_hide(wizard->recv_cert_table);
 #endif
                gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, FALSE);
 #endif
@@ -1344,6 +1454,7 @@ static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
 #if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
                gtk_widget_hide(wizard->recv_use_ssl);
                gtk_widget_hide(wizard->recv_use_tls);
+               gtk_widget_hide(wizard->recv_cert_table);
 #endif
                if (wizard->create_mailbox) {
                        gtk_widget_show(wizard->mailbox_label);
@@ -1364,13 +1475,18 @@ static void wizard_protocol_changed(GtkComboBox *combo, gpointer data)
 static GtkWidget* recv_page (WizardWindow * wizard)
 {
        GtkWidget *table = gtk_table_new(1,1, FALSE);
-       GtkTooltips *tips = gtk_tooltips_new();
        GtkWidget *vbox;
        GtkWidget *hbox;
+#if (defined(USE_OPENSSL) || defined (USE_GNUTLS))
+       GtkWidget *label;
+       GtkWidget *button;
+       GtkWidget *recv_cert_table;
+#endif
        GtkListStore *store;
        GtkTreeIter iter;
        gchar *text;
        gint index = 0;
+       CLAWS_TIP_DECL();
 
        gtk_table_set_row_spacings(GTK_TABLE(table), 4);
        gtk_table_set_col_spacings(GTK_TABLE(table), 8);
@@ -1418,10 +1534,9 @@ static GtkWidget* recv_page (WizardWindow * wizard)
        gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
        g_free(text);
        
-       gtk_tooltips_set_tip(GTK_TOOLTIPS(tips), wizard->recv_server,
+       CLAWS_SET_TIP(wizard->recv_server,
                             _("You can specify the port number by appending it at the end: "
-                              "\"mail.example.com:110\""),
-                            NULL);
+                              "\"mail.example.com:110\""));
 
        wizard->recv_label = gtk_label_new(_("<span weight=\"bold\">Server address:</span>"));
        gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
@@ -1452,6 +1567,10 @@ static GtkWidget* recv_page (WizardWindow * wizard)
        if (GTK_IS_MISC(wizard->recv_password_label))                                                 
                gtk_misc_set_alignment(GTK_MISC(wizard->recv_password_label), 1, 0.5);        
        gtk_entry_set_visibility(GTK_ENTRY(wizard->recv_password), FALSE);
+#ifdef MAEMO
+       hildon_gtk_entry_set_input_mode(GTK_ENTRY(wizard->recv_password), 
+               HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
+#endif
        gtk_box_pack_start(GTK_BOX(hbox), wizard->recv_password_label, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(hbox), wizard->recv_password, TRUE, TRUE, 0);
        
@@ -1472,6 +1591,39 @@ static GtkWidget* recv_page (WizardWindow * wizard)
                        tmpl.recvssl == 2);
        gtk_box_pack_start(GTK_BOX(hbox), wizard->recv_use_tls, FALSE, FALSE, 0);
        SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, wizard->recv_use_tls);
+
+       recv_cert_table = gtk_table_new(3,3, FALSE);
+       gtk_container_set_border_width(GTK_CONTAINER(recv_cert_table), 8);
+       gtk_box_pack_start (GTK_BOX(vbox), recv_cert_table, FALSE, FALSE, 0);
+       label = gtk_label_new(_("Client SSL certificate (optional)"));
+       gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+       gtk_table_attach(GTK_TABLE(recv_cert_table), label, 0, 3, 0, 1, GTK_FILL, 0, 0, 0);
+       label = gtk_label_new(_("File"));
+       gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+       gtk_table_attach(GTK_TABLE(recv_cert_table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0);
+       wizard->recv_ssl_cert_file = gtk_entry_new();
+       gtk_entry_set_text(GTK_ENTRY(wizard->recv_ssl_cert_file), tmpl.recvssl_cert?tmpl.recvssl_cert:"");
+       gtk_table_attach(GTK_TABLE(recv_cert_table), wizard->recv_ssl_cert_file, 1, 2, 1, 2, GTK_FILL, 0, 0, 0);
+       button = gtkut_get_browse_file_btn(_("Browse"));
+       gtk_table_attach(GTK_TABLE(recv_cert_table), button, 2, 3, 1, 2, GTK_FILL, 0, 0, 0);
+       SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, label);
+       SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, wizard->recv_ssl_cert_file);
+       SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, button);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(cert_browse_cb), wizard->recv_ssl_cert_file);
+
+       hbox = gtk_hbox_new(FALSE, VSPACING_NARROW);
+       gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+       label = gtk_label_new(_("Password"));
+       gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
+       gtk_table_attach(GTK_TABLE(recv_cert_table), label, 0, 1, 2, 3, GTK_FILL, 0, 0, 0);
+       wizard->recv_ssl_cert_pass = gtk_entry_new();
+       gtk_entry_set_visibility(GTK_ENTRY(wizard->recv_ssl_cert_pass), FALSE);
+       gtk_entry_set_text(GTK_ENTRY(wizard->recv_ssl_cert_pass), tmpl.recvssl_cert_pass?tmpl.recvssl_cert_pass:"");
+       gtk_table_attach(GTK_TABLE(recv_cert_table), wizard->recv_ssl_cert_pass, 1, 2, 2, 3, GTK_FILL, 0, 0, 0);
+       SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, label);
+       SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, wizard->recv_ssl_cert_pass);
+       wizard->recv_cert_table = recv_cert_table;
 #endif 
        hbox = gtk_hbox_new(FALSE, VSPACING_NARROW);
        gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
@@ -1621,6 +1773,7 @@ gboolean run_wizard(MainWindow *mainwin, gboolean create_mailbox) {
                        GTK_STOCK_SAVE, FINISHED,
                        GTK_STOCK_CANCEL, CANCEL,
                        NULL);
+       gtk_widget_set_size_request(wizard->window, -1, 480);
 
        g_signal_connect(wizard->window, "response", 
                          G_CALLBACK(wizard_response_cb), wizard);