talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

prefs_account.c (114350B)


      1 /*
      2  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
      3  * Copyright (C) 1999-2025 the Claws Mail team and Hiroyuki Yamamoto
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License as published by
      7  * the Free Software Foundation; either version 3 of the License, or
      8  * (at your option) any later version.
      9  *
     10  * This program is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  * GNU General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU General Public License
     16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
     17  */
     18 
     19 #include "defs.h"
     20 
     21 #include <sys/socket.h>
     22 #include <netinet/in.h>
     23 
     24 #include <glib.h>
     25 #include <glib/gi18n.h>
     26 #include <gtk/gtk.h>
     27 #include <gdk/gdkkeysyms.h>
     28 #include <gtk/filesel.h>
     29 #include <stdio.h>
     30 #include <sys/types.h>
     31 #include <sys/stat.h>
     32 #include <string.h>
     33 #include <stdlib.h>
     34 #include <ctype.h>
     35 #include "main.h"
     36 #include "prefs_gtk.h"
     37 #include "prefs_account.h"
     38 #include "prefs_receive.h"
     39 #include "prefs_common.h"
     40 #include "prefs_customheader.h"
     41 #include "account.h"
     42 #include "mainwindow.h"
     43 #include "manage_window.h"
     44 #include "folder.h"
     45 #include "foldersel.h"
     46 #include "inc.h"
     47 #include "menu.h"
     48 #include "gtkutils.h"
     49 #include "utils.h"
     50 #include "alertpanel.h"
     51 #include "smtp.h"
     52 #include "imap.h"
     53 #include "pop.h"
     54 #include "remotefolder.h"
     55 #include "combobox.h"
     56 #include "setup.h"
     57 #include "hooks.h"
     58 #include "inputdialog.h"
     59 #include "common/ssl_certificate.h"
     60 #include "passwordstore.h"
     61 #include "file-utils.h"
     62 #include <gnutls/gnutls.h>
     63 
     64 static gboolean cancelled;
     65 static gboolean new_account;
     66 
     67 static PrefsAccount tmp_ac_prefs;
     68 
     69 static GtkWidget *sigfile_radiobtn;
     70 static GtkWidget *sigcmd_radiobtn;
     71 static GtkWidget *entry_sigpath;
     72 static GtkWidget *signature_browse_button;
     73 static GtkWidget *signature_edit_button;
     74 
     75 static GtkWidget *entry_in_cert_file;
     76 static GtkWidget *entry_out_cert_file;
     77 static GtkWidget *in_ssl_cert_browse_button;
     78 static GtkWidget *out_ssl_cert_browse_button;
     79 
     80 static GSList *prefs_pages = NULL;
     81 
     82 typedef struct BasicPage
     83 {
     84     PrefsPage page;
     85 
     86     GtkWidget *vbox;
     87 
     88 	GtkWidget *acname_entry;
     89 	GtkWidget *default_checkbtn;
     90 
     91 	GtkWidget *name_entry;
     92 	GtkWidget *addr_entry;
     93 
     94 	GtkWidget *serv_frame;
     95 	GtkWidget *serv_table;
     96 	gpointer *protocol_optmenu;
     97 	GtkWidget *recvserv_label;
     98 	GtkWidget *smtpserv_label;
     99 	GtkWidget *localmbox_label;
    100 	GtkWidget *mailcmd_label;
    101 	GtkWidget *recvserv_entry;
    102 	GtkWidget *smtpserv_entry;
    103 	GtkWidget *localmbox_entry;
    104 	GtkWidget *mailcmd_checkbtn;
    105 	GtkWidget *mailcmd_entry;
    106 	GtkWidget *uid_label;
    107 	GtkWidget *pass_label;
    108 	GtkWidget *uid_entry;
    109 	GtkWidget *pass_entry;
    110 	GtkWidget *auto_configure_btn;
    111 	GtkWidget *auto_configure_cancel_btn;
    112 	GtkWidget *auto_configure_lbl;
    113 } BasicPage;
    114 
    115 typedef struct ReceivePage
    116 {
    117     PrefsPage page;
    118 
    119     GtkWidget *vbox;
    120 
    121 	GtkWidget *pop3_frame;
    122 	GtkWidget *pop_auth_checkbtn;
    123 	GtkWidget *pop_auth_type_optmenu;
    124 	GtkWidget *rmmail_checkbtn;
    125 	GtkWidget *leave_time_spinbtn;
    126 	GtkWidget *leave_hour_spinbtn;
    127 	GtkWidget *inbox_label;
    128 	GtkWidget *inbox_entry;
    129 	GtkWidget *inbox_btn;
    130 
    131 	GtkWidget *local_frame;
    132 	GtkWidget *local_inbox_label;
    133 	GtkWidget *local_inbox_entry;
    134 	GtkWidget *local_inbox_btn;
    135 
    136 	GtkWidget *recvatgetall_checkbtn;
    137 
    138 	GtkWidget *imap_frame;
    139 	GtkWidget *imap_auth_type_optmenu;
    140 	GtkWidget *imapdir_label;
    141 	GtkWidget *imapdir_entry;
    142 	GtkWidget *subsonly_checkbtn;
    143 	GtkWidget *imap_batch_size_spinbtn;
    144 } ReceivePage;
    145 
    146 typedef struct SendPage
    147 {
    148     PrefsPage page;
    149 
    150     GtkWidget *vbox;
    151 
    152 	GtkWidget *msgid_checkbtn;
    153 	GtkWidget *xmailer_checkbtn;
    154 	GtkWidget *customhdr_checkbtn;
    155 	GtkWidget *msgid_with_addr_checkbtn;
    156 	GtkWidget *smtp_auth_checkbtn;
    157 	GtkWidget *smtp_auth_type_optmenu;
    158 	GtkWidget *smtp_uid_entry;
    159 	GtkWidget *smtp_pass_entry;
    160 	GtkWidget *pop_bfr_smtp_checkbtn;
    161 	GtkWidget *pop_bfr_smtp_tm_spinbtn;
    162 	GtkWidget *pop_auth_timeout_lbl;
    163 	GtkWidget *pop_auth_minutes_lbl;
    164 } SendPage;
    165 
    166 typedef struct
    167 {
    168 	gchar *auth_uri;
    169 	GtkWidget *entry;
    170 } AuthCodeQueryButtonData;
    171 
    172 typedef struct ComposePage
    173 {
    174 	PrefsPage page;
    175 
    176 	GtkWidget *vbox;
    177 
    178 	GtkWidget *autocc_checkbtn;
    179 	GtkWidget *autocc_entry;
    180 	GtkWidget *autobcc_checkbtn;
    181 	GtkWidget *autobcc_entry;
    182 	GtkWidget *autoreplyto_checkbtn;
    183 	GtkWidget *autoreplyto_entry;
    184 } ComposePage;
    185 
    186 typedef struct SSLPage
    187 {
    188     PrefsPage page;
    189 
    190     GtkWidget *vbox;
    191 
    192 	GtkWidget *pop_frame;
    193 	GtkWidget *pop_nossl_radiobtn;
    194 	GtkWidget *pop_ssltunnel_radiobtn;
    195 	GtkWidget *pop_starttls_radiobtn;
    196 
    197 	GtkWidget *imap_frame;
    198 	GtkWidget *imap_nossl_radiobtn;
    199 	GtkWidget *imap_ssltunnel_radiobtn;
    200 	GtkWidget *imap_starttls_radiobtn;
    201 
    202 	GtkWidget *send_frame;
    203 	GtkWidget *smtp_nossl_radiobtn;
    204 	GtkWidget *smtp_ssltunnel_radiobtn;
    205 	GtkWidget *smtp_starttls_radiobtn;
    206 
    207 	GtkWidget *entry_in_cert_file;
    208 	GtkWidget *entry_in_cert_pass;
    209 	GtkWidget *entry_out_cert_file;
    210 	GtkWidget *entry_out_cert_pass;
    211 
    212 	GtkWidget *use_nonblocking_ssl_checkbtn;
    213 } SSLPage;
    214 
    215 typedef struct AdvancedPage
    216 {
    217     PrefsPage page;
    218 
    219     GtkWidget *vbox;
    220 
    221 	GtkWidget *smtpport_checkbtn;
    222 	GtkWidget *smtpport_spinbtn;
    223 	GtkWidget *popport_hbox;
    224 	GtkWidget *popport_checkbtn;
    225 	GtkWidget *popport_spinbtn;
    226 	GtkWidget *imapport_hbox;
    227 	GtkWidget *imapport_checkbtn;
    228 	GtkWidget *imapport_spinbtn;
    229 	GtkWidget *domain_checkbtn;
    230 	GtkWidget *domain_entry;
    231 
    232 	GtkWidget *tunnelcmd_checkbtn;
    233 	GtkWidget *tunnelcmd_entry;
    234 
    235 	GtkWidget *sent_folder_checkbtn;
    236 	GtkWidget *sent_folder_entry;
    237 	GtkWidget *queue_folder_checkbtn;
    238 	GtkWidget *queue_folder_entry;
    239 	GtkWidget *draft_folder_checkbtn;
    240 	GtkWidget *draft_folder_entry;
    241 	GtkWidget *trash_folder_checkbtn;
    242 	GtkWidget *trash_folder_entry;
    243 } AdvancedPage;
    244 
    245 static BasicPage basic_page;
    246 static ReceivePage receive_page;
    247 static SendPage send_page;
    248 static ComposePage compose_page;
    249 static SSLPage ssl_page;
    250 static AdvancedPage advanced_page;
    251 
    252 struct BasicProtocol {
    253 	GtkWidget *combobox;
    254 	GtkWidget *label;
    255 	GtkWidget *descrlabel;
    256 	GtkWidget *no_imap_warn_icon;
    257 	GtkWidget *no_imap_warn_label;
    258 };
    259 
    260 static char *protocol_names[] = {
    261 	N_("POP"),
    262 	N_("IMAP"),
    263 	N_("Local mbox file"),
    264 	N_("None (SMTP only)")
    265 };
    266 
    267 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
    268 static void prefs_account_protocol_set_optmenu		(PrefParam *pparam);
    269 static void prefs_account_protocol_changed		(GtkComboBox *combobox, gpointer data);
    270 
    271 static void prefs_account_set_string_from_combobox (PrefParam *pparam);
    272 
    273 static void prefs_account_imap_auth_type_set_data_from_optmenu	(PrefParam *pparam);
    274 static void prefs_account_imap_auth_type_set_optmenu	(PrefParam *pparam);
    275 static void prefs_account_smtp_auth_type_set_data_from_optmenu (PrefParam *pparam);
    276 static void prefs_account_smtp_auth_type_set_optmenu	(PrefParam *pparam);
    277 static void prefs_account_pop_auth_type_set_data_from_optmenu (PrefParam *pparam);
    278 static void prefs_account_pop_auth_type_set_optmenu	(PrefParam *pparam);
    279 
    280 static void prefs_account_enum_set_data_from_radiobtn	(PrefParam *pparam);
    281 static void prefs_account_enum_set_radiobtn		(PrefParam *pparam);
    282 
    283 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,  gpointer user_data);
    284 static void prefs_account_showpwd_toggled(GtkEntry *entry, gpointer user_data);
    285 
    286 static PrefParam basic_param[] = {
    287 	{"account_name", NULL, &tmp_ac_prefs.account_name, P_STRING,
    288 	 &basic_page.acname_entry, prefs_set_data_from_entry, prefs_set_entry},
    289 
    290 	{"is_default", "FALSE", &tmp_ac_prefs.is_default, P_BOOL,
    291 	 &basic_page.default_checkbtn,
    292 	 prefs_set_data_from_toggle, prefs_set_toggle},
    293 
    294 	{"name", NULL, &tmp_ac_prefs.name, P_STRING,
    295 	 &basic_page.name_entry, prefs_set_data_from_entry, prefs_set_entry},
    296 
    297 	{"address", NULL, &tmp_ac_prefs.address, P_STRING,
    298 	 &basic_page.addr_entry, prefs_set_data_from_entry, prefs_set_entry},
    299 
    300 	{"protocol", NULL, &tmp_ac_prefs.protocol, P_ENUM,
    301 	 (GtkWidget **)&basic_page.protocol_optmenu,
    302 	 prefs_account_protocol_set_data_from_optmenu,
    303 	 prefs_account_protocol_set_optmenu},
    304 
    305 	{"receive_server", NULL, &tmp_ac_prefs.recv_server, P_STRING,
    306 	 &basic_page.recvserv_entry, prefs_set_data_from_entry, prefs_set_entry},
    307 
    308 	{"smtp_server", NULL, &tmp_ac_prefs.smtp_server, P_STRING,
    309 	 &basic_page.smtpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
    310 
    311 	{"local_mbox", "/var/mail", &tmp_ac_prefs.local_mbox, P_STRING,
    312 	 &basic_page.localmbox_entry, prefs_set_data_from_entry, prefs_set_entry},
    313 
    314 	{"use_mail_command", "FALSE", &tmp_ac_prefs.use_mail_command, P_BOOL,
    315 	 &basic_page.mailcmd_checkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
    316 
    317 	{"mail_command", "/usr/sbin/sendmail -t -i", &tmp_ac_prefs.mail_command, P_STRING,
    318 	 &basic_page.mailcmd_entry, prefs_set_data_from_entry, prefs_set_entry},
    319 
    320 	{"user_id", NULL, &tmp_ac_prefs.userid, P_STRING,
    321 	 &basic_page.uid_entry, prefs_set_data_from_entry, prefs_set_entry},
    322 
    323 	{"password", NULL, &tmp_ac_prefs.passwd, P_PASSWORD,
    324 	 NULL, NULL, NULL},
    325 
    326 	{"config_version", "-1", &tmp_ac_prefs.config_version, P_INT,
    327 		NULL, NULL, NULL},
    328 
    329 	{NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
    330 };
    331 
    332 static PrefParam receive_param[] = {
    333 	{"use_pop_auth", "FALSE", &tmp_ac_prefs.use_pop_auth, P_BOOL,
    334 	 &receive_page.pop_auth_checkbtn,
    335 	 prefs_set_data_from_toggle, prefs_set_toggle},
    336 
    337 	{"pop_auth_method", "0", &tmp_ac_prefs.pop_auth_type, P_ENUM,
    338 	 &receive_page.pop_auth_type_optmenu,
    339 	 prefs_account_pop_auth_type_set_data_from_optmenu,
    340 	 prefs_account_pop_auth_type_set_optmenu},
    341 
    342 	{"remove_mail", "TRUE", &tmp_ac_prefs.rmmail, P_BOOL,
    343 	 &receive_page.rmmail_checkbtn,
    344 	 prefs_set_data_from_toggle, prefs_set_toggle},
    345 
    346 	{"message_leave_time", "7", &tmp_ac_prefs.msg_leave_time, P_INT,
    347 	 &receive_page.leave_time_spinbtn,
    348 	 prefs_set_data_from_spinbtn, prefs_set_spinbtn},
    349 	{"message_leave_hour", "0", &tmp_ac_prefs.msg_leave_hour, P_INT,
    350 	 &receive_page.leave_hour_spinbtn,
    351 	 prefs_set_data_from_spinbtn, prefs_set_spinbtn},
    352 
    353 	{"imap_auth_method", "0", &tmp_ac_prefs.imap_auth_type, P_ENUM,
    354 	 &receive_page.imap_auth_type_optmenu,
    355 	 prefs_account_imap_auth_type_set_data_from_optmenu,
    356 	 prefs_account_imap_auth_type_set_optmenu},
    357 
    358 	{"receive_at_get_all", "TRUE", &tmp_ac_prefs.recv_at_getall, P_BOOL,
    359 	 &receive_page.recvatgetall_checkbtn,
    360 	 prefs_set_data_from_toggle, prefs_set_toggle},
    361 
    362 	{"inbox", "#mh/Mailbox/inbox", &tmp_ac_prefs.inbox, P_STRING,
    363 	 &receive_page.inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
    364 
    365 	{"local_inbox", "#mh/Mailbox/inbox", &tmp_ac_prefs.local_inbox, P_STRING,
    366 	 &receive_page.local_inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
    367 
    368 	{"imap_directory", NULL, &tmp_ac_prefs.imap_dir, P_STRING,
    369 	 &receive_page.imapdir_entry, prefs_set_data_from_entry, prefs_set_entry},
    370 
    371 	{"imap_subsonly", "TRUE", &tmp_ac_prefs.imap_subsonly, P_BOOL,
    372 	 &receive_page.subsonly_checkbtn,
    373 	 prefs_set_data_from_toggle, prefs_set_toggle},
    374 
    375 	{"imap_batch_size", "500", &tmp_ac_prefs.imap_batch_size, P_INT,
    376 	 &receive_page.imap_batch_size_spinbtn,
    377 	 prefs_set_data_from_spinbtn, prefs_set_spinbtn},
    378 
    379 	{NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
    380 };
    381 
    382 static PrefParam send_param[] = {
    383 	{"generate_msgid", "TRUE", &tmp_ac_prefs.gen_msgid, P_BOOL,
    384 	 &send_page.msgid_checkbtn,
    385 	 prefs_set_data_from_toggle, prefs_set_toggle},
    386 
    387 	{"generate_xmailer", "TRUE", &tmp_ac_prefs.gen_xmailer, P_BOOL,
    388 	 &send_page.xmailer_checkbtn,
    389 	 prefs_set_data_from_toggle, prefs_set_toggle},
    390 
    391 	{"add_custom_header", "FALSE", &tmp_ac_prefs.add_customhdr, P_BOOL,
    392 	 &send_page.customhdr_checkbtn,
    393 	 prefs_set_data_from_toggle, prefs_set_toggle},
    394 
    395 	{"msgid_with_addr", "FALSE", &tmp_ac_prefs.msgid_with_addr, P_BOOL,
    396 	 &send_page.msgid_with_addr_checkbtn,
    397 	 prefs_set_data_from_toggle, prefs_set_toggle},
    398 
    399 	 {"use_smtp_auth", "TRUE", &tmp_ac_prefs.use_smtp_auth, P_BOOL,
    400 	 &send_page.smtp_auth_checkbtn,
    401 	 prefs_set_data_from_toggle, prefs_set_toggle},
    402 
    403 	{"smtp_auth_method", "0", &tmp_ac_prefs.smtp_auth_type, P_ENUM,
    404 	 &send_page.smtp_auth_type_optmenu,
    405 	 prefs_account_smtp_auth_type_set_data_from_optmenu,
    406 	 prefs_account_smtp_auth_type_set_optmenu},
    407 
    408 	{"smtp_user_id", NULL, &tmp_ac_prefs.smtp_userid, P_STRING,
    409 	 &send_page.smtp_uid_entry, prefs_set_data_from_entry, prefs_set_entry},
    410 	{"smtp_password", NULL, &tmp_ac_prefs.smtp_passwd, P_PASSWORD,
    411 	 NULL, NULL, NULL},
    412 
    413 	{"pop_before_smtp", "FALSE", &tmp_ac_prefs.pop_before_smtp, P_BOOL,
    414 	 &send_page.pop_bfr_smtp_checkbtn,
    415 	 prefs_set_data_from_toggle, prefs_set_toggle},
    416 
    417 	{"pop_before_smtp_timeout", "5", &tmp_ac_prefs.pop_before_smtp_timeout, P_INT,
    418 	 &send_page.pop_bfr_smtp_tm_spinbtn,
    419 	 prefs_set_data_from_spinbtn, prefs_set_spinbtn},
    420 
    421 	{NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
    422 };
    423 
    424 static PrefParam compose_param[] = {
    425 	{"set_autocc", "FALSE", &tmp_ac_prefs.set_autocc, P_BOOL,
    426 	 &compose_page.autocc_checkbtn,
    427 	 prefs_set_data_from_toggle, prefs_set_toggle},
    428 
    429 	{"auto_cc", NULL, &tmp_ac_prefs.auto_cc, P_STRING,
    430 	 &compose_page.autocc_entry,
    431 	 prefs_set_data_from_entry, prefs_set_entry},
    432 
    433 	{"set_autobcc", "FALSE", &tmp_ac_prefs.set_autobcc, P_BOOL,
    434 	 &compose_page.autobcc_checkbtn,
    435 	 prefs_set_data_from_toggle, prefs_set_toggle},
    436 
    437 	{"auto_bcc", NULL, &tmp_ac_prefs.auto_bcc, P_STRING,
    438 	 &compose_page.autobcc_entry,
    439 	 prefs_set_data_from_entry, prefs_set_entry},
    440 
    441 	{"set_autoreplyto", "FALSE", &tmp_ac_prefs.set_autoreplyto, P_BOOL,
    442 	 &compose_page.autoreplyto_checkbtn,
    443 	 prefs_set_data_from_toggle, prefs_set_toggle},
    444 
    445 	{"auto_replyto", NULL, &tmp_ac_prefs.auto_replyto, P_STRING,
    446 	 &compose_page.autoreplyto_entry,
    447 	 prefs_set_data_from_entry, prefs_set_entry},
    448 
    449 	{NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
    450 };
    451 
    452 static PrefParam ssl_param[] = {
    453 	{"ssl_pop", "1", &tmp_ac_prefs.ssl_pop, P_ENUM,
    454 	 &ssl_page.pop_nossl_radiobtn,
    455 	 prefs_account_enum_set_data_from_radiobtn,
    456 	 prefs_account_enum_set_radiobtn},
    457 
    458 	{"ssl_imap", "1", &tmp_ac_prefs.ssl_imap, P_ENUM,
    459 	 &ssl_page.imap_nossl_radiobtn,
    460 	 prefs_account_enum_set_data_from_radiobtn,
    461 	 prefs_account_enum_set_radiobtn},
    462 
    463 	{"ssl_smtp", "1", &tmp_ac_prefs.ssl_smtp, P_ENUM,
    464 	 &ssl_page.smtp_nossl_radiobtn,
    465 	 prefs_account_enum_set_data_from_radiobtn,
    466 	 prefs_account_enum_set_radiobtn},
    467 
    468 	{"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL,
    469 	 &ssl_page.use_nonblocking_ssl_checkbtn,
    470 	 prefs_set_data_from_toggle, prefs_set_toggle},
    471 
    472 	{"use_tls_sni", "1", &tmp_ac_prefs.use_tls_sni, P_BOOL,
    473 	 NULL, NULL, NULL},
    474 
    475 	{"in_ssl_client_cert_file", "", &tmp_ac_prefs.in_ssl_client_cert_file, P_STRING,
    476 	 &ssl_page.entry_in_cert_file, prefs_set_data_from_entry, prefs_set_entry},
    477 
    478 	{"in_ssl_client_cert_pass", "", &tmp_ac_prefs.in_ssl_client_cert_pass, P_PASSWORD,
    479 	 NULL, NULL, NULL},
    480 
    481 	{"out_ssl_client_cert_file", "", &tmp_ac_prefs.out_ssl_client_cert_file, P_STRING,
    482 	 &ssl_page.entry_out_cert_file, prefs_set_data_from_entry, prefs_set_entry},
    483 
    484 	{"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD,
    485 	 NULL, NULL, NULL},
    486 
    487 	{NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
    488 };
    489 
    490 static PrefParam advanced_param[] = {
    491 	{"set_smtpport", "FALSE", &tmp_ac_prefs.set_smtpport, P_BOOL,
    492 	 &advanced_page.smtpport_checkbtn,
    493 	 prefs_set_data_from_toggle, prefs_set_toggle},
    494 
    495 	{"smtp_port", "25", &tmp_ac_prefs.smtpport, P_USHORT,
    496 	 &advanced_page.smtpport_spinbtn,
    497 	 prefs_set_data_from_spinbtn, prefs_set_spinbtn},
    498 
    499 	{"set_popport", "FALSE", &tmp_ac_prefs.set_popport, P_BOOL,
    500 	 &advanced_page.popport_checkbtn,
    501 	 prefs_set_data_from_toggle, prefs_set_toggle},
    502 
    503 	{"pop_port", "110", &tmp_ac_prefs.popport, P_USHORT,
    504 	 &advanced_page.popport_spinbtn,
    505 	 prefs_set_data_from_spinbtn, prefs_set_spinbtn},
    506 
    507 	{"set_imapport", "FALSE", &tmp_ac_prefs.set_imapport, P_BOOL,
    508 	 &advanced_page.imapport_checkbtn,
    509 	 prefs_set_data_from_toggle, prefs_set_toggle},
    510 
    511 	{"imap_port", "143", &tmp_ac_prefs.imapport, P_USHORT,
    512 	 &advanced_page.imapport_spinbtn,
    513 	 prefs_set_data_from_spinbtn, prefs_set_spinbtn},
    514 
    515 	{"set_domain", "FALSE", &tmp_ac_prefs.set_domain, P_BOOL,
    516 	 &advanced_page.domain_checkbtn,
    517 	 prefs_set_data_from_toggle, prefs_set_toggle},
    518 
    519 	{"domain", NULL, &tmp_ac_prefs.domain, P_STRING,
    520 	 &advanced_page.domain_entry,
    521 	 prefs_set_data_from_entry, prefs_set_entry},
    522 
    523 	{"gnutls_set_priority", "FALSE", &tmp_ac_prefs.set_gnutls_priority, P_BOOL,
    524 	 NULL, NULL, NULL},
    525 
    526 	{"gnutls_priority", NULL, &tmp_ac_prefs.gnutls_priority, P_STRING,
    527 	 NULL, NULL, NULL},
    528 
    529 	{"set_tunnelcmd", "FALSE", &tmp_ac_prefs.set_tunnelcmd, P_BOOL,
    530 	 &advanced_page.tunnelcmd_checkbtn,
    531 	 prefs_set_data_from_toggle, prefs_set_toggle},
    532 
    533 	{"tunnelcmd", NULL, &tmp_ac_prefs.tunnelcmd, P_STRING,
    534 	 &advanced_page.tunnelcmd_entry,
    535 	 prefs_set_data_from_entry, prefs_set_entry},
    536 
    537 	{"set_sent_folder", "FALSE", &tmp_ac_prefs.set_sent_folder, P_BOOL,
    538 	 &advanced_page.sent_folder_checkbtn,
    539 	 prefs_set_data_from_toggle, prefs_set_toggle},
    540 	{"sent_folder", NULL, &tmp_ac_prefs.sent_folder, P_STRING,
    541 	 &advanced_page.sent_folder_entry,
    542 	 prefs_set_data_from_entry, prefs_set_entry},
    543 
    544 	{"set_queue_folder", "FALSE", &tmp_ac_prefs.set_queue_folder, P_BOOL,
    545 	 &advanced_page.queue_folder_checkbtn,
    546 	 prefs_set_data_from_toggle, prefs_set_toggle},
    547 	{"queue_folder", NULL, &tmp_ac_prefs.queue_folder, P_STRING,
    548 	 &advanced_page.queue_folder_entry,
    549 	 prefs_set_data_from_entry, prefs_set_entry},
    550 
    551 	{"set_draft_folder", "FALSE", &tmp_ac_prefs.set_draft_folder, P_BOOL,
    552 	 &advanced_page.draft_folder_checkbtn,
    553 	 prefs_set_data_from_toggle, prefs_set_toggle},
    554 	{"draft_folder", NULL, &tmp_ac_prefs.draft_folder, P_STRING,
    555 	 &advanced_page.draft_folder_entry,
    556 	 prefs_set_data_from_entry, prefs_set_entry},
    557 
    558 	{"set_trash_folder", "FALSE", &tmp_ac_prefs.set_trash_folder, P_BOOL,
    559 	 &advanced_page.trash_folder_checkbtn,
    560 	 prefs_set_data_from_toggle, prefs_set_toggle},
    561 	{"trash_folder", NULL, &tmp_ac_prefs.trash_folder, P_STRING,
    562 	 &advanced_page.trash_folder_entry,
    563 	 prefs_set_data_from_entry, prefs_set_entry},
    564 
    565 
    566 	{NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
    567 };
    568 
    569 static gint prefs_account_get_new_id		(void);
    570 
    571 static void prefs_account_select_folder_cb	(GtkWidget	*widget, gpointer	 data);
    572 
    573 static void prefs_account_sigfile_radiobtn_cb	(GtkWidget	*widget, gpointer	 data);
    574 
    575 static void prefs_account_sigcmd_radiobtn_cb	(GtkWidget	*widget, gpointer	 data);
    576 
    577 static void prefs_account_signature_browse_cb	(GtkWidget	*widget, gpointer	 data);
    578 static void prefs_account_in_cert_browse_cb	(GtkWidget	*widget, gpointer	 data);
    579 
    580 static void prefs_account_out_cert_browse_cb	(GtkWidget	*widget, gpointer	 data);
    581 static void prefs_account_signature_edit_cb	(GtkWidget	*widget, gpointer	 data);
    582 
    583 static void pop_bfr_smtp_tm_set_sens		(GtkWidget	*widget, gpointer	 data);
    584 
    585 static void auto_configure_cb			(GtkWidget	*widget, gpointer	 data);
    586 
    587 static void prefs_account_edit_custom_header	(void);
    588 
    589 #define COMBOBOX_PRIVACY_PLUGIN_ID 3
    590 
    591 #define TABLE_YPAD 2
    592 
    593 static void basic_create_widget_func(PrefsPage * _page,
    594                                            GtkWindow * window,
    595                                            gpointer data)
    596 {
    597 	BasicPage *page = (BasicPage *) _page;
    598 	PrefsAccount *ac_prefs = (PrefsAccount *) data;
    599 
    600 	GtkWidget *vbox1;
    601 	GtkWidget *hbox;
    602 	GtkWidget *label;
    603 	GtkWidget *acname_entry;
    604 	GtkWidget *default_checkbtn;
    605 	GtkWidget *frame1;
    606 	GtkWidget *table1;
    607 	GtkWidget *name_entry;
    608 	GtkWidget *addr_entry;
    609 
    610 	GtkWidget *serv_frame;
    611 	GtkWidget *vbox2;
    612 	GtkWidget *optmenubox;
    613 	GtkWidget *optmenu;
    614 	GtkWidget *optlabel;
    615 	GtkWidget *no_imap_warn_icon;
    616 	GtkWidget *no_imap_warn_label;
    617 	GtkWidget *serv_table;
    618 	GtkWidget *recvserv_label;
    619 	GtkWidget *smtpserv_label;
    620 	GtkWidget *localmbox_label;
    621 	GtkWidget *mailcmd_label;
    622 	GtkWidget *recvserv_entry;
    623 	GtkWidget *smtpserv_entry;
    624 	GtkWidget *localmbox_entry;
    625 	GtkWidget *mailcmd_checkbtn;
    626 	GtkWidget *mailcmd_entry;
    627 	GtkWidget *uid_label;
    628 	GtkWidget *pass_label;
    629 	GtkWidget *uid_entry;
    630 	GtkWidget *pass_entry;
    631 	GtkWidget *auto_configure_btn;
    632 	GtkWidget *auto_configure_cancel_btn;
    633 	GtkWidget *auto_configure_lbl;
    634 	GtkListStore *menu;
    635 	GtkTreeIter iter;
    636 	gchar *buf;
    637 
    638 	struct BasicProtocol *protocol_optmenu;
    639 	gint i;
    640 
    641 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
    642 	gtk_widget_show (vbox1);
    643 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
    644 
    645 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    646 	gtk_widget_show (hbox);
    647 	gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
    648 
    649 	label = gtk_label_new (_("Name of account"));
    650 	gtk_widget_show (label);
    651 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
    652 
    653 	acname_entry = gtk_entry_new ();
    654 	gtk_widget_show (acname_entry);
    655 	gtk_box_pack_start (GTK_BOX (hbox), acname_entry, TRUE, TRUE, 0);
    656 
    657 	default_checkbtn = gtk_check_button_new_with_label (_("Set as default"));
    658 	gtk_widget_show (default_checkbtn);
    659 	gtk_box_pack_end (GTK_BOX (hbox), default_checkbtn, TRUE, FALSE, 0);
    660 
    661 	PACK_FRAME (vbox1, frame1, _("Personal information"));
    662 
    663 	table1 = gtk_grid_new();
    664 	gtk_widget_show (table1);
    665 	gtk_container_add (GTK_CONTAINER (frame1), table1);
    666 	gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
    667 	gtk_grid_set_row_spacing(GTK_GRID(table1), VSPACING_NARROW);
    668 	gtk_grid_set_column_spacing(GTK_GRID(table1), 8);
    669 
    670 	label = gtk_label_new (_("Full name"));
    671 	gtk_widget_show (label);
    672 	gtk_label_set_xalign(GTK_LABEL (label), 1.0);
    673 	gtk_grid_attach(GTK_GRID(table1), label, 0, 0, 1, 1);
    674 
    675 	label = gtk_label_new (_("Mail address"));
    676 	gtk_widget_show (label);
    677 	gtk_label_set_xalign(GTK_LABEL (label), 1.0);
    678 	gtk_grid_attach(GTK_GRID(table1), label, 0, 1, 1, 1);
    679 
    680 	name_entry = gtk_entry_new ();
    681 	gtk_widget_show (name_entry);
    682 	gtk_grid_attach(GTK_GRID(table1), name_entry, 1, 0, 1, 1);
    683 	gtk_widget_set_hexpand(name_entry, TRUE);
    684 	gtk_widget_set_halign(name_entry, GTK_ALIGN_FILL);
    685 
    686 	addr_entry = gtk_entry_new ();
    687 	gtk_widget_show (addr_entry);
    688 	gtk_grid_attach(GTK_GRID(table1), addr_entry, 1, 1, 1, 1);
    689 	gtk_widget_set_hexpand(addr_entry, TRUE);
    690 	gtk_widget_set_halign(addr_entry, GTK_ALIGN_FILL);
    691 
    692 	vbox2 = gtkut_get_options_frame(vbox1, &serv_frame, _("Server information"));
    693 
    694 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    695 	gtk_widget_show (hbox);
    696 	gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
    697 
    698 	label = gtk_label_new (_("Protocol"));
    699 	gtk_widget_show (label);
    700 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
    701 
    702 	/* Create GtkHBox for protocol combobox and label */
    703 	optmenubox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 20);
    704 	gtk_widget_show(optmenubox);
    705 	gtk_box_pack_start (GTK_BOX (hbox), optmenubox, FALSE, FALSE, 0);
    706 
    707 	/* Create and populate the combobox */
    708 	optmenu = gtkut_sc_combobox_create(NULL, FALSE);
    709 	gtk_box_pack_start(GTK_BOX (optmenubox), optmenu, FALSE, FALSE, 0);
    710 
    711 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
    712 	for( i = 0; i < NUM_RECV_PROTOCOLS; i++ )
    713 		if( protocol_names[i] != NULL )
    714 			COMBOBOX_ADD (menu, _(protocol_names[i]), i);
    715 
    716 	g_signal_connect(G_OBJECT(optmenu), "changed",
    717 			G_CALLBACK(prefs_account_protocol_changed), NULL);
    718 
    719 	/* Create protocol label, empty for now */
    720 	optlabel = gtk_label_new("");
    721 	gtk_label_set_use_markup(GTK_LABEL(optlabel), TRUE);
    722 	gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_CENTER);
    723 	gtk_box_pack_start(GTK_BOX (optmenubox), optlabel, FALSE, FALSE, 0);
    724 
    725 	auto_configure_btn = gtk_button_new_with_label(_("Auto-configure"));
    726 	gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_btn, FALSE, FALSE, 0);
    727 	auto_configure_cancel_btn = gtk_button_new_with_label(_("Cancel"));
    728 	gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_cancel_btn, FALSE, FALSE, 0);
    729 	auto_configure_lbl = gtk_label_new("");
    730 	gtk_label_set_justify(GTK_LABEL(auto_configure_lbl), GTK_JUSTIFY_LEFT);
    731 	gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_lbl, FALSE, FALSE, 0);
    732 	gtk_widget_show(auto_configure_btn);
    733 	gtk_widget_show(auto_configure_lbl);
    734 	g_signal_connect (G_OBJECT (auto_configure_btn), "clicked",
    735 			  G_CALLBACK (auto_configure_cb), NULL);
    736 	g_signal_connect (G_OBJECT (auto_configure_cancel_btn), "clicked",
    737 			  G_CALLBACK (auto_configure_cb), NULL);
    738 
    739 	no_imap_warn_icon = gtk_image_new_from_icon_name
    740                         ("dialog-warning-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR);
    741 	buf = g_strconcat("<span weight=\"bold\">",
    742 			_("Warning: this version of Claws Mail\n"
    743 			  "has been built without IMAP and News support."), "</span>", NULL);
    744 	no_imap_warn_label = gtk_label_new(buf);
    745 	g_free(buf);
    746 	gtk_label_set_use_markup(GTK_LABEL(no_imap_warn_label), TRUE);
    747 
    748 	gtk_box_pack_start(GTK_BOX (optmenubox), no_imap_warn_icon, FALSE, FALSE, 0);
    749 	gtk_box_pack_start(GTK_BOX (optmenubox), no_imap_warn_label, FALSE, FALSE, 0);
    750 	/* Set up a struct to store pointers to necessary widgets */
    751 	protocol_optmenu = g_new(struct BasicProtocol, 1);
    752 	protocol_optmenu->combobox = optmenu;
    753 	protocol_optmenu->label = optlabel;
    754 	protocol_optmenu->descrlabel = label;
    755 	protocol_optmenu->no_imap_warn_icon = no_imap_warn_icon;
    756 	protocol_optmenu->no_imap_warn_label = no_imap_warn_label;
    757 
    758 	serv_table = gtk_grid_new ();
    759 	gtk_widget_show (serv_table);
    760 	gtk_grid_set_row_spacing(GTK_GRID(serv_table), VSPACING_NARROW);
    761 	gtk_grid_set_column_spacing(GTK_GRID(serv_table), 8);
    762 	gtk_box_pack_start (GTK_BOX (vbox2), serv_table, FALSE, FALSE, 0);
    763 
    764 	recvserv_entry = gtk_entry_new ();
    765 	gtk_widget_show (recvserv_entry);
    766 	gtk_grid_attach(GTK_GRID(serv_table), recvserv_entry, 1, 2, 2, 1);
    767 	gtk_widget_set_hexpand(recvserv_entry, TRUE);
    768 	gtk_widget_set_halign(recvserv_entry, GTK_ALIGN_FILL);
    769 
    770 	localmbox_entry = gtk_entry_new ();
    771 	gtk_widget_show (localmbox_entry);
    772 	gtk_grid_attach(GTK_GRID(serv_table), localmbox_entry, 1, 3, 2, 1);
    773 	gtk_widget_set_hexpand(localmbox_entry, TRUE);
    774 	gtk_widget_set_halign(localmbox_entry, GTK_ALIGN_FILL);
    775 
    776 	smtpserv_entry = gtk_entry_new ();
    777 	gtk_widget_show (smtpserv_entry);
    778 	gtk_grid_attach(GTK_GRID(serv_table), smtpserv_entry, 1, 4, 2, 1);
    779 	gtk_widget_set_hexpand(smtpserv_entry, TRUE);
    780 	gtk_widget_set_halign(smtpserv_entry, GTK_ALIGN_FILL);
    781 
    782 	mailcmd_entry = gtk_entry_new ();
    783 	gtk_widget_show (mailcmd_entry);
    784 	gtk_grid_attach(GTK_GRID(serv_table), mailcmd_entry, 1, 6, 2, 1);
    785 	gtk_widget_set_hexpand(mailcmd_entry, TRUE);
    786 	gtk_widget_set_halign(mailcmd_entry, GTK_ALIGN_FILL);
    787 
    788 	uid_entry = gtk_entry_new ();
    789 	gtk_widget_show (uid_entry);
    790 	gtk_grid_attach(GTK_GRID(serv_table), uid_entry, 1, 7, 2, 1);
    791 	gtk_widget_set_hexpand(uid_entry, TRUE);
    792 	gtk_widget_set_halign(uid_entry, GTK_ALIGN_FILL);
    793 
    794 	pass_entry = gtk_entry_new ();
    795 	gtk_widget_show (pass_entry);
    796 	gtk_grid_attach(GTK_GRID(serv_table), pass_entry, 1, 8, 2, 1);
    797 	gtk_widget_set_hexpand(pass_entry, TRUE);
    798 	gtk_widget_set_halign(pass_entry, GTK_ALIGN_FILL);
    799 	gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE);
    800 	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(pass_entry),
    801 					  GTK_ENTRY_ICON_SECONDARY,
    802 					  "view-reveal-symbolic");
    803 	gtk_entry_set_icon_activatable(GTK_ENTRY(pass_entry),
    804 				       GTK_ENTRY_ICON_SECONDARY, TRUE);
    805 	gtk_entry_set_icon_tooltip_text(GTK_ENTRY(pass_entry),
    806 					GTK_ENTRY_ICON_SECONDARY, _("Show password"));
    807 	g_signal_connect(pass_entry, "icon-press",
    808 			 G_CALLBACK(prefs_account_showpwd_toggled), NULL);
    809 
    810 	recvserv_label = gtk_label_new (_("Server for receiving"));
    811 	gtk_widget_show (recvserv_label);
    812 	gtk_label_set_xalign(GTK_LABEL (recvserv_label), 1.0);
    813 	gtk_grid_attach(GTK_GRID(serv_table), recvserv_label, 0, 2, 1, 1);
    814 
    815 	localmbox_label = gtk_label_new (_("Local mailbox"));
    816 	gtk_widget_show (localmbox_label);
    817 	gtk_label_set_xalign(GTK_LABEL (localmbox_label), 1.0);
    818 	gtk_grid_attach(GTK_GRID(serv_table), localmbox_label, 0, 3, 1, 1);
    819 
    820 	smtpserv_label = gtk_label_new (_("SMTP server (send)"));
    821 	gtk_widget_show (smtpserv_label);
    822 	gtk_label_set_xalign(GTK_LABEL (smtpserv_label), 1.0);
    823 	gtk_grid_attach(GTK_GRID(serv_table), smtpserv_label, 0, 4, 1, 1);
    824 
    825 	mailcmd_checkbtn = gtk_check_button_new_with_label
    826 		(_("Use mail command rather than SMTP server"));
    827 	gtk_widget_show (mailcmd_checkbtn);
    828 	gtk_grid_attach(GTK_GRID(serv_table), mailcmd_checkbtn, 0, 5, 2, 1);
    829 
    830 	g_signal_connect(G_OBJECT(mailcmd_checkbtn), "toggled",
    831 			 G_CALLBACK(prefs_account_mailcmd_toggled),
    832 			 NULL);
    833 
    834 	mailcmd_label = gtk_label_new (_("command to send mails"));
    835 	gtk_widget_show (mailcmd_label);
    836 	gtk_label_set_xalign(GTK_LABEL (mailcmd_label), 1.0);
    837 	gtk_grid_attach(GTK_GRID(serv_table), mailcmd_label, 0, 6, 1, 1);
    838 
    839 	uid_label = gtk_label_new (_("User ID"));
    840 	gtk_widget_show (uid_label);
    841 	gtk_label_set_xalign(GTK_LABEL (uid_label), 1.0);
    842 	gtk_grid_attach(GTK_GRID(serv_table), uid_label, 0, 7, 1, 1);
    843 
    844 	pass_label = gtk_label_new (_("Password"));
    845 	gtk_widget_show (pass_label);
    846 	gtk_label_set_xalign(GTK_LABEL (pass_label), 1.0);
    847 	gtk_grid_attach(GTK_GRID(serv_table), pass_label, 0, 8, 1, 1);
    848 
    849 	page->acname_entry   = acname_entry;
    850 	page->default_checkbtn = default_checkbtn;
    851 
    852 	page->name_entry = name_entry;
    853 	page->addr_entry = addr_entry;
    854 
    855 	page->serv_frame       = serv_frame;
    856 	page->serv_table       = serv_table;
    857 	page->protocol_optmenu = (gpointer)protocol_optmenu;
    858 	page->recvserv_label   = recvserv_label;
    859 	page->recvserv_entry   = recvserv_entry;
    860 	page->smtpserv_label   = smtpserv_label;
    861 	page->smtpserv_entry   = smtpserv_entry;
    862 	page->localmbox_label   = localmbox_label;
    863 	page->localmbox_entry   = localmbox_entry;
    864 	page->mailcmd_checkbtn   = mailcmd_checkbtn;
    865 	page->mailcmd_label   = mailcmd_label;
    866 	page->mailcmd_entry   = mailcmd_entry;
    867 	page->uid_label        = uid_label;
    868 	page->pass_label       = pass_label;
    869 	page->uid_entry        = uid_entry;
    870 	page->pass_entry       = pass_entry;
    871 	page->auto_configure_btn = auto_configure_btn;
    872 	page->auto_configure_cancel_btn = auto_configure_cancel_btn;
    873 	page->auto_configure_lbl = auto_configure_lbl;
    874 
    875 	if (new_account) {
    876 		prefs_set_dialog_to_default(basic_param);
    877 		buf = g_strdup_printf(_("Account%d"), ac_prefs->account_id);
    878 		gtk_entry_set_text(GTK_ENTRY(basic_page.acname_entry), buf);
    879 		g_free(buf);
    880 	} else {
    881 		prefs_set_dialog(basic_param);
    882 
    883 		/* Passwords are handled outside of PrefParams. */
    884 		buf = passwd_store_get_account(ac_prefs->account_id,
    885 				PWS_ACCOUNT_RECV);
    886 		gtk_entry_set_text(GTK_ENTRY(page->pass_entry), buf != NULL ? buf : "");
    887 		if (buf != NULL) {
    888 			memset(buf, 0, strlen(buf));
    889 			g_free(buf);
    890 		}
    891 	}
    892 
    893 	page->vbox = vbox1;
    894 
    895 	page->page.widget = vbox1;
    896 }
    897 
    898 static void receive_create_widget_func(PrefsPage * _page,
    899                                            GtkWindow * window,
    900                                            gpointer data)
    901 {
    902 	ReceivePage *page = (ReceivePage *) _page;
    903 	PrefsAccount *ac_prefs = (PrefsAccount *) data;
    904 
    905 	GtkWidget *vbox1, *vbox2, *vbox3, *vbox5;
    906 	GtkWidget *hbox1, *hbox2, *hbox3;
    907 	GtkWidget *frame1;
    908 	GtkWidget *pop_auth_checkbtn;
    909 	GtkWidget *rmmail_checkbtn;
    910 	GtkWidget *hbox_spc;
    911 	GtkWidget *leave_time_label;
    912 	GtkWidget *leave_time_spinbtn;
    913 	GtkWidget *leave_hour_label;
    914 	GtkWidget *leave_hour_spinbtn;
    915 	GtkWidget *label;
    916 	GtkWidget *inbox_label;
    917 	GtkWidget *inbox_entry;
    918 	GtkWidget *inbox_btn;
    919 	GtkWidget *imap_frame;
    920  	GtkWidget *imapdir_label;
    921 	GtkWidget *imapdir_entry;
    922 	GtkWidget *subsonly_checkbtn;
    923 	GtkWidget *imap_batch_size_spinbtn;
    924 	GtkWidget *local_frame;
    925 	GtkWidget *local_vbox;
    926 	GtkWidget *local_hbox;
    927 	GtkWidget *local_inbox_label;
    928 	GtkWidget *local_inbox_entry;
    929 	GtkWidget *local_inbox_btn;
    930 	GtkAdjustment *adj;
    931 
    932 	GtkWidget *optmenu, *optmenu2;
    933 	GtkListStore *menu, *menu2;
    934 	GtkTreeIter iter;
    935 	GtkWidget *recvatgetall_checkbtn;
    936 
    937 	GtkWidget *frame;
    938 
    939 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
    940 	gtk_widget_show (vbox1);
    941 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
    942 
    943 	local_vbox = gtkut_get_options_frame(vbox1, &local_frame, _("Local"));
    944 
    945 	local_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    946 	gtk_widget_show (local_hbox);
    947 	gtk_box_pack_start (GTK_BOX (local_vbox), local_hbox, TRUE, TRUE, 0);
    948 
    949 	local_inbox_label = gtk_label_new (_("Default Inbox"));
    950 	gtk_widget_show (local_inbox_label);
    951 	gtk_box_pack_start (GTK_BOX (local_hbox), local_inbox_label, FALSE, FALSE, 0);
    952 
    953 	local_inbox_entry = gtk_entry_new ();
    954 	gtk_widget_show (local_inbox_entry);
    955 	CLAWS_SET_TIP(local_inbox_entry,
    956 			     _("Unfiltered messages will be stored in this folder"));
    957 	gtk_box_pack_start (GTK_BOX (local_hbox), local_inbox_entry, TRUE, TRUE, 0);
    958 
    959 	local_inbox_btn = gtkut_get_browse_file_btn(_("Bro_wse"));
    960 	gtk_widget_show (local_inbox_btn);
    961 	CLAWS_SET_TIP(local_inbox_btn,
    962 			     _("Unfiltered messages will be stored in this folder"));
    963 	gtk_box_pack_start (GTK_BOX (local_hbox), local_inbox_btn, FALSE, FALSE, 0);
    964 	g_signal_connect (G_OBJECT (local_inbox_btn), "clicked",
    965 			  G_CALLBACK (prefs_account_select_folder_cb),
    966 			  local_inbox_entry);
    967 
    968 	vbox2 = gtkut_get_options_frame(vbox1, &frame1, _("POP"));
    969 
    970 	PACK_CHECK_BUTTON (vbox2, pop_auth_checkbtn,
    971 			   _("Authenticate before POP connection"));
    972 
    973 	//vbox5 = gtk_vbox_new (FALSE, 0);
    974 	vbox5 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
    975 	gtk_widget_show (vbox5);
    976 	gtk_box_pack_start (GTK_BOX (vbox2), vbox5, FALSE, FALSE, 0);
    977 
    978 	hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    979 	gtk_widget_show (hbox3);
    980 	gtk_box_pack_start (GTK_BOX (vbox5), hbox3, FALSE, FALSE, 0);
    981 
    982 	hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
    983 	gtk_widget_show (hbox_spc);
    984 	gtk_box_pack_start (GTK_BOX (hbox3), hbox_spc, FALSE, FALSE, 0);
    985 	gtk_widget_set_size_request (hbox_spc, 12, -1);
    986 
    987 	label = gtk_label_new (_("Authentication method"));
    988 	gtk_widget_show (label);
    989 	gtk_box_pack_start (GTK_BOX (hbox3), label, FALSE, FALSE, 0);
    990 
    991 	optmenu2 = gtkut_sc_combobox_create(NULL, FALSE);
    992 	menu2 = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu2)));
    993 	gtk_widget_show (optmenu2);
    994 	gtk_box_pack_start (GTK_BOX (hbox3), optmenu2, FALSE, FALSE, 0);
    995 
    996 	COMBOBOX_ADD (menu2, _("Select"), 0);
    997 	COMBOBOX_ADD (menu2, NULL, 0);
    998 	COMBOBOX_ADD (menu2, "OAuth2", POPAUTH_OAUTH2);
    999 
   1000 	SET_TOGGLE_SENSITIVITY (pop_auth_checkbtn, vbox5);
   1001 
   1002 	PACK_CHECK_BUTTON (vbox2, rmmail_checkbtn,
   1003 			   _("Remove messages on server when received"));
   1004 
   1005 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1006 	gtk_widget_show (hbox1);
   1007 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
   1008 
   1009 	hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
   1010 	gtk_widget_show (hbox_spc);
   1011 	gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
   1012 	gtk_widget_set_size_request (hbox_spc, 12, -1);
   1013 
   1014 	leave_time_label = gtk_label_new (_("Remove after"));
   1015 	gtk_widget_show (leave_time_label);
   1016 	gtk_box_pack_start (GTK_BOX (hbox1), leave_time_label, FALSE, FALSE, 0);
   1017 
   1018 	leave_time_spinbtn = gtk_spin_button_new_with_range(0, 365, 1);
   1019 	gtk_widget_show (leave_time_spinbtn);
   1020 	CLAWS_SET_TIP(leave_time_spinbtn,
   1021 			     _("0 days and 0 hours : remove immediately"));
   1022 	gtk_box_pack_start (GTK_BOX (hbox1), leave_time_spinbtn, FALSE, FALSE, 0);
   1023 
   1024 	leave_time_label = gtk_label_new (_("days"));
   1025 	gtk_widget_show (leave_time_label);
   1026 	gtk_box_pack_start (GTK_BOX (hbox1), leave_time_label, FALSE, FALSE, 0);
   1027 
   1028 	leave_hour_spinbtn = gtk_spin_button_new_with_range(0, 23, 1);
   1029 	gtk_widget_show (leave_hour_spinbtn);
   1030 	CLAWS_SET_TIP(leave_hour_spinbtn,
   1031 			     _("0 days and 0 hours : remove immediately"));
   1032 	gtk_box_pack_start (GTK_BOX (hbox1), leave_hour_spinbtn, FALSE, FALSE, 0);
   1033 
   1034 	leave_hour_label = gtk_label_new (_("hours"));
   1035 	gtk_widget_show (leave_hour_label);
   1036 	gtk_box_pack_start (GTK_BOX (hbox1), leave_hour_label, FALSE, FALSE, 0);
   1037 
   1038 	SET_TOGGLE_SENSITIVITY (rmmail_checkbtn, hbox1);
   1039 
   1040 	PACK_SPACER(vbox2, vbox3, VSPACING_NARROW_2);
   1041 
   1042 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1043 	gtk_widget_show (hbox1);
   1044 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, TRUE, TRUE, 0);
   1045 
   1046 	inbox_label = gtk_label_new (_("Default Inbox"));
   1047 	gtk_widget_show (inbox_label);
   1048 	gtk_box_pack_start (GTK_BOX (hbox1), inbox_label, FALSE, FALSE, 0);
   1049 
   1050 	inbox_entry = gtk_entry_new ();
   1051 	gtk_widget_show (inbox_entry);
   1052 	CLAWS_SET_TIP(inbox_entry,
   1053 			     _("Unfiltered messages will be stored in this folder"));
   1054 	gtk_box_pack_start (GTK_BOX (hbox1), inbox_entry, TRUE, TRUE, 0);
   1055 
   1056 	inbox_btn = gtkut_get_browse_file_btn(_("Bro_wse"));
   1057 	gtk_widget_show (inbox_btn);
   1058 	CLAWS_SET_TIP(inbox_btn,
   1059 			     _("Unfiltered messages will be stored in this folder"));
   1060 	gtk_box_pack_start (GTK_BOX (hbox1), inbox_btn, FALSE, FALSE, 0);
   1061 	g_signal_connect (G_OBJECT (inbox_btn), "clicked",
   1062 			  G_CALLBACK (prefs_account_select_folder_cb),
   1063 			  inbox_entry);
   1064 
   1065 	vbox2 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP"));
   1066 
   1067 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1068 	gtk_widget_show (hbox1);
   1069 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
   1070 
   1071 	label = gtk_label_new (_("Authentication method"));
   1072 	gtk_widget_show (label);
   1073 	gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
   1074 
   1075 
   1076 	optmenu = gtkut_sc_combobox_create(NULL, FALSE);
   1077 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
   1078 	gtk_widget_show (optmenu);
   1079 	gtk_box_pack_start (GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
   1080 
   1081 	COMBOBOX_ADD (menu, _("Automatic"), 0);
   1082 	COMBOBOX_ADD (menu, NULL, 0);
   1083 	COMBOBOX_ADD (menu, _("Plain text"), IMAP_AUTH_PLAINTEXT);
   1084 	COMBOBOX_ADD (menu, "ANONYMOUS", IMAP_AUTH_ANON);
   1085 	COMBOBOX_ADD (menu, "GSSAPI", IMAP_AUTH_GSSAPI);
   1086 	COMBOBOX_ADD (menu, "SCRAM-SHA-1", IMAP_AUTH_SCRAM_SHA1);
   1087 	COMBOBOX_ADD (menu, "SCRAM-SHA-224", IMAP_AUTH_SCRAM_SHA224);
   1088 	COMBOBOX_ADD (menu, "SCRAM-SHA-256", IMAP_AUTH_SCRAM_SHA256);
   1089 	COMBOBOX_ADD (menu, "SCRAM-SHA-384", IMAP_AUTH_SCRAM_SHA384);
   1090 	COMBOBOX_ADD (menu, "SCRAM-SHA-512", IMAP_AUTH_SCRAM_SHA512);
   1091 	COMBOBOX_ADD (menu, "PLAIN", IMAP_AUTH_PLAIN);
   1092 	COMBOBOX_ADD (menu, "LOGIN", IMAP_AUTH_LOGIN);
   1093 	COMBOBOX_ADD (menu, "OAUTH2", IMAP_AUTH_OAUTH2);
   1094 
   1095 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1096 	gtk_widget_show (hbox1);
   1097 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
   1098 
   1099 	imapdir_label = gtk_label_new (_("IMAP server directory"));
   1100 	gtk_widget_show (imapdir_label);
   1101 	gtk_box_pack_start (GTK_BOX (hbox1), imapdir_label, FALSE, FALSE, 0);
   1102 
   1103 	imapdir_label = gtk_label_new(_("(usually empty)"));
   1104 	gtk_widget_show (imapdir_label);
   1105 	gtkut_widget_set_small_font_size (imapdir_label);
   1106 	gtk_box_pack_start (GTK_BOX (hbox1), imapdir_label, FALSE, FALSE, 0);
   1107 
   1108 	imapdir_entry = gtk_entry_new();
   1109 	gtk_widget_show (imapdir_entry);
   1110 	gtk_box_pack_start (GTK_BOX (hbox1), imapdir_entry, FALSE, FALSE, 0);
   1111 
   1112 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1113 	gtk_widget_show (hbox1);
   1114 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
   1115 
   1116 	PACK_CHECK_BUTTON (hbox1, subsonly_checkbtn,
   1117 			   _("Show subscribed folders only"));
   1118 
   1119 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1120 	gtk_widget_show (hbox1);
   1121 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
   1122 
   1123 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1124 	gtk_widget_show (hbox1);
   1125 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
   1126 
   1127 	label = gtk_label_new(_("Batch size"));
   1128 	gtk_widget_show (label);
   1129 	gtk_box_pack_start(GTK_BOX(hbox1), label, FALSE, FALSE, 0);
   1130 
   1131 	imap_batch_size_spinbtn = gtk_spin_button_new_with_range(0, 1000000, 1);
   1132 	gtk_widget_set_size_request(imap_batch_size_spinbtn, 64, -1);
   1133 	gtk_widget_show (imap_batch_size_spinbtn);
   1134 	gtk_box_pack_start(GTK_BOX(hbox1), imap_batch_size_spinbtn, FALSE, FALSE, 0);
   1135 
   1136 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1137 	gtk_widget_show (hbox1);
   1138 	gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
   1139 
   1140 	PACK_CHECK_BUTTON
   1141 		(vbox1, recvatgetall_checkbtn,
   1142 		 _("'Get Mail' checks for new messages on this account"));
   1143 
   1144 	page->pop3_frame               = frame1;
   1145 	page->pop_auth_checkbtn          = pop_auth_checkbtn;
   1146 	page->pop_auth_type_optmenu      = optmenu2;
   1147 	page->rmmail_checkbtn            = rmmail_checkbtn;
   1148 	page->leave_time_spinbtn         = leave_time_spinbtn;
   1149 	page->leave_hour_spinbtn         = leave_hour_spinbtn;
   1150 	page->inbox_label              = inbox_label;
   1151 	page->inbox_entry              = inbox_entry;
   1152 	page->inbox_btn                = inbox_btn;
   1153 
   1154 	page->imap_frame               = imap_frame;
   1155 	page->imap_auth_type_optmenu   = optmenu;
   1156 
   1157 	page->imapdir_label		= imapdir_label;
   1158 	page->imapdir_entry		= imapdir_entry;
   1159 	page->subsonly_checkbtn		= subsonly_checkbtn;
   1160 	page->imap_batch_size_spinbtn	= imap_batch_size_spinbtn;
   1161 	page->local_frame		= local_frame;
   1162 	page->local_inbox_label	= local_inbox_label;
   1163 	page->local_inbox_entry	= local_inbox_entry;
   1164 	page->local_inbox_btn		= local_inbox_btn;
   1165 
   1166 	page->recvatgetall_checkbtn      = recvatgetall_checkbtn;
   1167 
   1168 	tmp_ac_prefs = *ac_prefs;
   1169 
   1170 	if (new_account) {
   1171 		prefs_set_dialog_to_default(receive_param);
   1172 	} else
   1173 		prefs_set_dialog(receive_param);
   1174 
   1175 	page->vbox = vbox1;
   1176 
   1177 	page->page.widget = vbox1;
   1178 }
   1179 
   1180 static void send_create_widget_func(PrefsPage * _page,
   1181                                            GtkWindow * window,
   1182                                            gpointer data)
   1183 {
   1184 	SendPage *page = (SendPage *) _page;
   1185 	PrefsAccount *ac_prefs = (PrefsAccount *) data;
   1186 
   1187 	GtkWidget *vbox1;
   1188 	GtkWidget *vbox2;
   1189 	GtkWidget *frame;
   1190 	GtkWidget *msgid_checkbtn;
   1191 	GtkWidget *xmailer_checkbtn;
   1192 	GtkWidget *hbox;
   1193 	GtkWidget *customhdr_checkbtn;
   1194 	GtkWidget *customhdr_edit_btn;
   1195 	GtkWidget *checkbtn_msgid_with_addr;
   1196 	GtkWidget *vbox3;
   1197 	GtkWidget *smtp_auth_checkbtn;
   1198 	GtkWidget *optmenu;
   1199 	GtkListStore *menu;
   1200 	GtkTreeIter iter;
   1201 	GtkWidget *vbox4;
   1202 	GtkWidget *hbox_spc;
   1203 	GtkWidget *label;
   1204 	GtkWidget *smtp_uid_entry;
   1205 	GtkWidget *smtp_pass_entry;
   1206 	GtkWidget *vbox_spc;
   1207 	GtkWidget *pop_bfr_smtp_checkbtn;
   1208 	GtkWidget *pop_bfr_smtp_tm_spinbtn;
   1209 	GtkWidget *pop_auth_timeout_lbl;
   1210 	GtkWidget *pop_auth_minutes_lbl;
   1211 	gchar *buf;
   1212 
   1213 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
   1214 	gtk_widget_show (vbox1);
   1215 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
   1216 
   1217 	vbox2 = gtkut_get_options_frame(vbox1, &frame, _("Header"));
   1218 
   1219 	PACK_CHECK_BUTTON (vbox2, msgid_checkbtn, _("Generate Message-ID"));
   1220 
   1221 	PACK_CHECK_BUTTON (vbox2, checkbtn_msgid_with_addr,
   1222 			   _("Send account mail address in Message-ID"));
   1223 
   1224 	SET_TOGGLE_SENSITIVITY (msgid_checkbtn, checkbtn_msgid_with_addr);
   1225 
   1226 	PACK_CHECK_BUTTON (vbox2, xmailer_checkbtn,
   1227 			   _("Add user agent header"));
   1228 
   1229 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
   1230 	gtk_widget_show (hbox);
   1231 	gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
   1232 
   1233 	PACK_CHECK_BUTTON (hbox, customhdr_checkbtn,
   1234 			   _("Add user-defined header"));
   1235 
   1236 	customhdr_edit_btn = gtk_button_new_with_mnemonic(_("_Edit"));
   1237 	gtk_widget_show (customhdr_edit_btn);
   1238 	gtk_box_pack_start (GTK_BOX (hbox), customhdr_edit_btn,
   1239 			    FALSE, FALSE, 0);
   1240 	g_signal_connect (G_OBJECT (customhdr_edit_btn), "clicked",
   1241 			  G_CALLBACK (prefs_account_edit_custom_header),
   1242 			  NULL);
   1243 
   1244 	SET_TOGGLE_SENSITIVITY (customhdr_checkbtn, customhdr_edit_btn);
   1245 
   1246 	vbox3 = gtkut_get_options_frame(vbox1, &frame, _("Authentication"));
   1247 
   1248 	PACK_CHECK_BUTTON (vbox3, smtp_auth_checkbtn,
   1249 		_("SMTP Authentication (SMTP AUTH)"));
   1250 
   1251 	vbox4 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
   1252 	gtk_widget_show (vbox4);
   1253 	gtk_box_pack_start (GTK_BOX (vbox3), vbox4, FALSE, FALSE, 0);
   1254 
   1255 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1256 	gtk_widget_show (hbox);
   1257 	gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
   1258 
   1259 	hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
   1260 	gtk_widget_show (hbox_spc);
   1261 	gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
   1262 	gtk_widget_set_size_request (hbox_spc, 12, -1);
   1263 
   1264 	label = gtk_label_new (_("Authentication method"));
   1265 	gtk_widget_show (label);
   1266 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
   1267 
   1268 	optmenu = gtkut_sc_combobox_create(NULL, FALSE);
   1269 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
   1270 	gtk_widget_show (optmenu);
   1271 	gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
   1272 
   1273 	COMBOBOX_ADD (menu, _("Automatic"), 0);
   1274 	COMBOBOX_ADD (menu, NULL, 0);
   1275 	COMBOBOX_ADD (menu, "PLAIN", SMTPAUTH_PLAIN);
   1276 	COMBOBOX_ADD (menu, "LOGIN", SMTPAUTH_LOGIN);
   1277 	COMBOBOX_ADD (menu, "OAUTH2", SMTPAUTH_OAUTH2);
   1278 	gtk_list_store_set(menu, &iter, COMBOBOX_SENS, FALSE, -1);
   1279 
   1280 	PACK_SPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
   1281 
   1282 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1283 	gtk_widget_show (hbox);
   1284 	gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
   1285 
   1286 	hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
   1287 	gtk_widget_show (hbox_spc);
   1288 	gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
   1289 	gtk_widget_set_size_request (hbox_spc, 12, -1);
   1290 
   1291 	label = gtk_label_new (_("User ID"));
   1292 	gtk_widget_show (label);
   1293 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
   1294 
   1295 	smtp_uid_entry = gtk_entry_new ();
   1296 	gtk_widget_show (smtp_uid_entry);
   1297 	gtk_box_pack_start (GTK_BOX (hbox), smtp_uid_entry, TRUE, TRUE, 0);
   1298 
   1299 	label = gtk_label_new (_("Password"));
   1300 	gtk_widget_show (label);
   1301 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
   1302 
   1303 	smtp_pass_entry = gtk_entry_new ();
   1304 	gtk_widget_show (smtp_pass_entry);
   1305 	gtk_box_pack_start (GTK_BOX (hbox), smtp_pass_entry, TRUE, TRUE, 0);
   1306 	gtk_entry_set_visibility (GTK_ENTRY (smtp_pass_entry), FALSE);
   1307 	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(smtp_pass_entry),
   1308 					  GTK_ENTRY_ICON_SECONDARY,
   1309 					  "view-reveal-symbolic");
   1310 	gtk_entry_set_icon_activatable(GTK_ENTRY(smtp_pass_entry),
   1311 				       GTK_ENTRY_ICON_SECONDARY, TRUE);
   1312 	gtk_entry_set_icon_tooltip_text(GTK_ENTRY(smtp_pass_entry),
   1313 					GTK_ENTRY_ICON_SECONDARY, _("Show password"));
   1314 	g_signal_connect(smtp_pass_entry, "icon-press",
   1315 			 G_CALLBACK(prefs_account_showpwd_toggled), NULL);
   1316 
   1317 	PACK_SPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
   1318 
   1319 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1320 	gtk_widget_show (hbox);
   1321 	gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
   1322 
   1323 	hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
   1324 	gtk_widget_show (hbox_spc);
   1325 	gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
   1326 	gtk_widget_set_size_request (hbox_spc, 12, -1);
   1327 
   1328 	label = gtk_label_new
   1329 		(_("If you leave these entries empty, the same "
   1330 		   "user ID and password as receiving will be used."));
   1331 	gtk_widget_show (label);
   1332 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
   1333 	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
   1334 	gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
   1335 	gtkut_widget_set_small_font_size (label);
   1336 
   1337 	SET_TOGGLE_SENSITIVITY (smtp_auth_checkbtn, vbox4);
   1338 
   1339 	PACK_CHECK_BUTTON (vbox3, pop_bfr_smtp_checkbtn,
   1340 		_("Authenticate with POP before sending"));
   1341 
   1342 	g_signal_connect (G_OBJECT (pop_bfr_smtp_checkbtn), "clicked",
   1343 			  G_CALLBACK (pop_bfr_smtp_tm_set_sens),
   1344 			  NULL);
   1345 
   1346 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
   1347 	gtk_widget_show (hbox);
   1348 	gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
   1349 
   1350 	hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
   1351 	gtk_widget_show (hbox_spc);
   1352 	gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
   1353 	gtk_widget_set_size_request (hbox_spc, 12, -1);
   1354 
   1355 	pop_auth_timeout_lbl = gtk_label_new(_("POP authentication timeout"));
   1356 	gtk_widget_show (pop_auth_timeout_lbl);
   1357 	gtk_box_pack_start (GTK_BOX (hbox), pop_auth_timeout_lbl, FALSE, FALSE, 0);
   1358 
   1359 	pop_bfr_smtp_tm_spinbtn = gtk_spin_button_new_with_range(0, 1440, 1);
   1360 	gtk_widget_show (pop_bfr_smtp_tm_spinbtn);
   1361 	gtk_box_pack_start (GTK_BOX (hbox), pop_bfr_smtp_tm_spinbtn, FALSE, FALSE, 0);
   1362 
   1363 	pop_auth_minutes_lbl = gtk_label_new(_("minutes"));
   1364 	gtk_widget_show (pop_auth_minutes_lbl);
   1365 	gtk_box_pack_start (GTK_BOX (hbox), pop_auth_minutes_lbl, FALSE, FALSE, 0);
   1366 
   1367 	page->msgid_checkbtn     = msgid_checkbtn;
   1368 	page->xmailer_checkbtn   = xmailer_checkbtn;
   1369 	page->customhdr_checkbtn = customhdr_checkbtn;
   1370 	page->msgid_with_addr_checkbtn	= checkbtn_msgid_with_addr;
   1371 
   1372 	page->smtp_auth_checkbtn       = smtp_auth_checkbtn;
   1373 	page->smtp_auth_type_optmenu = optmenu;
   1374 	page->smtp_uid_entry         = smtp_uid_entry;
   1375 	page->smtp_pass_entry        = smtp_pass_entry;
   1376 	page->pop_bfr_smtp_checkbtn    = pop_bfr_smtp_checkbtn;
   1377 	page->pop_bfr_smtp_tm_spinbtn  = pop_bfr_smtp_tm_spinbtn;
   1378 	page->pop_auth_timeout_lbl   = pop_auth_timeout_lbl;
   1379 	page->pop_auth_minutes_lbl   = pop_auth_minutes_lbl;
   1380 
   1381 	tmp_ac_prefs = *ac_prefs;
   1382 
   1383 	if (new_account) {
   1384 		prefs_set_dialog_to_default(send_param);
   1385 	} else {
   1386 		prefs_set_dialog(send_param);
   1387 
   1388 		/* Passwords are handled outside of PrefParams. */
   1389 		buf = passwd_store_get_account(ac_prefs->account_id,
   1390 				PWS_ACCOUNT_SEND);
   1391 		gtk_entry_set_text(GTK_ENTRY(page->smtp_pass_entry), buf != NULL ? buf : "");
   1392 		if (buf != NULL) {
   1393 			memset(buf, 0, strlen(buf));
   1394 			g_free(buf);
   1395 		}
   1396 	}
   1397 
   1398 	pop_bfr_smtp_tm_set_sens (NULL, NULL);
   1399 
   1400 	page->vbox = vbox1;
   1401 
   1402 	page->page.widget = vbox1;
   1403 }
   1404 
   1405 static void compose_create_widget_func(PrefsPage * _page,
   1406                                            GtkWindow * window,
   1407                                            gpointer data)
   1408 {
   1409 	ComposePage *page = (ComposePage *) _page;
   1410 	PrefsAccount *ac_prefs = (PrefsAccount *) data;
   1411 
   1412 	GtkWidget *vbox1;
   1413 	GtkWidget *frame;
   1414 	GtkWidget *table;
   1415 	GtkWidget *autocc_checkbtn;
   1416 	GtkWidget *autocc_entry;
   1417 	GtkWidget *autobcc_checkbtn;
   1418 	GtkWidget *autobcc_entry;
   1419 	GtkWidget *autoreplyto_checkbtn;
   1420 	GtkWidget *autoreplyto_entry;
   1421 
   1422 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
   1423 	gtk_widget_show (vbox1);
   1424 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
   1425 
   1426 	PACK_FRAME (vbox1, frame, "Automatically set the following addresses");
   1427 
   1428 	table =  gtk_grid_new();
   1429 	gtk_widget_show (table);
   1430 	gtk_container_add (GTK_CONTAINER (frame), table);
   1431 	gtk_container_set_border_width (GTK_CONTAINER (table), 8);
   1432 	gtk_grid_set_row_spacing(GTK_GRID(table), VSPACING_NARROW_2);
   1433 	gtk_grid_set_column_spacing(GTK_GRID(table), 8);
   1434 
   1435 	autocc_checkbtn = gtk_check_button_new_with_label("Cc:");
   1436 	gtk_widget_show (autocc_checkbtn);
   1437 	gtk_grid_attach(GTK_GRID(table), autocc_checkbtn, 0, 0, 1, 1);
   1438 
   1439 	autocc_entry = gtk_entry_new ();
   1440 	gtk_widget_show (autocc_entry);
   1441 	gtk_grid_attach(GTK_GRID(table), autocc_entry, 1, 0, 1, 1);
   1442 	gtk_widget_set_hexpand(autocc_entry, TRUE);
   1443 	gtk_widget_set_halign(autocc_entry, GTK_ALIGN_FILL);
   1444 
   1445 	SET_TOGGLE_SENSITIVITY (autocc_checkbtn, autocc_entry);
   1446 
   1447 	autobcc_checkbtn = gtk_check_button_new_with_label("Bcc:");
   1448 	gtk_widget_show (autobcc_checkbtn);
   1449 	gtk_grid_attach(GTK_GRID(table), autobcc_checkbtn, 0, 1, 1, 1);
   1450 
   1451 	autobcc_entry = gtk_entry_new ();
   1452 	gtk_widget_show (autobcc_entry);
   1453 	gtk_grid_attach(GTK_GRID(table), autobcc_entry, 1, 1, 1, 1);
   1454 	gtk_widget_set_hexpand(autobcc_entry, TRUE);
   1455 	gtk_widget_set_halign(autobcc_entry, GTK_ALIGN_FILL);
   1456 
   1457 	SET_TOGGLE_SENSITIVITY (autobcc_checkbtn, autobcc_entry);
   1458 
   1459 	autoreplyto_checkbtn = gtk_check_button_new_with_label("Reply-To:");
   1460 	gtk_widget_show (autoreplyto_checkbtn);
   1461 	gtk_grid_attach(GTK_GRID(table), autoreplyto_checkbtn, 0, 2, 1, 1);
   1462 
   1463 	autoreplyto_entry = gtk_entry_new ();
   1464 	gtk_widget_show (autoreplyto_entry);
   1465 	gtk_grid_attach(GTK_GRID(table), autoreplyto_entry, 1, 2, 1, 1);
   1466 	gtk_widget_set_hexpand(autoreplyto_entry, TRUE);
   1467 	gtk_widget_set_halign(autoreplyto_entry, GTK_ALIGN_FILL);
   1468 
   1469 	SET_TOGGLE_SENSITIVITY (autoreplyto_checkbtn, autoreplyto_entry);
   1470 
   1471 	page->autocc_checkbtn      = autocc_checkbtn;
   1472 	page->autocc_entry       = autocc_entry;
   1473 	page->autobcc_checkbtn     = autobcc_checkbtn;
   1474 	page->autobcc_entry      = autobcc_entry;
   1475 	page->autoreplyto_checkbtn = autoreplyto_checkbtn;
   1476 	page->autoreplyto_entry  = autoreplyto_entry;
   1477 
   1478 	tmp_ac_prefs = *ac_prefs;
   1479 
   1480 	if (new_account) {
   1481 		prefs_set_dialog_to_default(compose_param);
   1482 	} else
   1483 		prefs_set_dialog(compose_param);
   1484 
   1485 	page->vbox = vbox1;
   1486 
   1487 	page->page.widget = vbox1;
   1488 }
   1489 
   1490 #define CREATE_RADIO_BUTTON(box, btn, btn_p, label, data)		\
   1491 {									\
   1492 	btn = gtk_radio_button_new_with_label_from_widget		\
   1493 		(GTK_RADIO_BUTTON (btn_p), label);			\
   1494 	gtk_widget_show (btn);						\
   1495 	gtk_box_pack_start (GTK_BOX (box), btn, FALSE, FALSE, 0);	\
   1496 	g_object_set_data (G_OBJECT (btn),				\
   1497 			   MENU_VAL_ID,					\
   1498 			   GINT_TO_POINTER (data));			\
   1499 }
   1500 
   1501 #define CREATE_RADIO_BUTTONS(box,					\
   1502 			     btn1, btn1_label, btn1_data,		\
   1503 			     btn2, btn2_label, btn2_data,		\
   1504 			     btn3, btn3_label, btn3_data)		\
   1505 {									\
   1506 	btn1 = gtk_radio_button_new_with_label(NULL, btn1_label);	\
   1507 	gtk_widget_show (btn1);						\
   1508 	gtk_box_pack_start (GTK_BOX (box), btn1, FALSE, FALSE, 0);	\
   1509 	g_object_set_data (G_OBJECT (btn1),				\
   1510 			   MENU_VAL_ID,					\
   1511 			   GINT_TO_POINTER (btn1_data));		\
   1512 									\
   1513 	CREATE_RADIO_BUTTON(box, btn2, btn1, btn2_label, btn2_data);	\
   1514 	CREATE_RADIO_BUTTON(box, btn3, btn1, btn3_label, btn3_data);	\
   1515 }
   1516 
   1517 static void pop_ssltunnel_toggled(GtkToggleButton *button,
   1518 					gpointer data)
   1519 {
   1520 	gboolean active = gtk_toggle_button_get_active(button);
   1521 
   1522 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
   1523 			advanced_page.popport_checkbtn)) == TRUE)
   1524 		return;
   1525 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(advanced_page.popport_spinbtn),
   1526 				  active ? 995 : 110);
   1527 }
   1528 
   1529 static void imap_ssltunnel_toggled(GtkToggleButton *button,
   1530 					gpointer data)
   1531 {
   1532 	gboolean active = gtk_toggle_button_get_active(button);
   1533 
   1534 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
   1535 			advanced_page.imapport_checkbtn)) == TRUE)
   1536 		return;
   1537 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(advanced_page.imapport_spinbtn),
   1538 				  active ? 993 : 143);
   1539 }
   1540 
   1541 static void smtp_ssltunnel_toggled(GtkToggleButton *button,
   1542 					gpointer data)
   1543 {
   1544 	gboolean active = gtk_toggle_button_get_active(button);
   1545 
   1546 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
   1547 			advanced_page.smtpport_checkbtn)) == TRUE)
   1548 		return;
   1549 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(advanced_page.smtpport_spinbtn),
   1550 				  active ? 465 : 25);
   1551 }
   1552 
   1553 static void ssl_create_widget_func(PrefsPage * _page,
   1554                                            GtkWindow * window,
   1555                                            gpointer data)
   1556 {
   1557 	SSLPage *page = (SSLPage *) _page;
   1558 	PrefsAccount *ac_prefs = (PrefsAccount *) data;
   1559 
   1560 	GtkWidget *vbox1;
   1561 
   1562 	GtkWidget *pop_frame;
   1563 	GtkWidget *vbox2;
   1564 	GtkWidget *pop_nossl_radiobtn;
   1565 	GtkWidget *pop_ssltunnel_radiobtn;
   1566 	GtkWidget *pop_starttls_radiobtn;
   1567 
   1568 	GtkWidget *imap_frame;
   1569 	GtkWidget *vbox3;
   1570 	GtkWidget *imap_nossl_radiobtn;
   1571 	GtkWidget *imap_ssltunnel_radiobtn;
   1572 	GtkWidget *imap_starttls_radiobtn;
   1573 
   1574 	GtkWidget *send_frame;
   1575 	GtkWidget *vbox5;
   1576 	GtkWidget *smtp_nossl_radiobtn;
   1577 	GtkWidget *smtp_ssltunnel_radiobtn;
   1578 	GtkWidget *smtp_starttls_radiobtn;
   1579 
   1580 	GtkWidget *cert_frame;
   1581 	GtkWidget *cert_table;
   1582 	GtkWidget *entry_in_cert_pass;
   1583 	GtkWidget *entry_out_cert_pass;
   1584 
   1585 	GtkWidget *vbox7;
   1586 	GtkWidget *use_nonblocking_ssl_checkbtn;
   1587 	GtkWidget *hbox;
   1588 	GtkWidget *hbox_spc;
   1589 	GtkWidget *label;
   1590 	gchar *buf;
   1591 
   1592 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
   1593 	gtk_widget_show (vbox1);
   1594 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
   1595 
   1596 	vbox2 = gtkut_get_options_frame(vbox1, &pop_frame, _("POP"));
   1597 
   1598 	CREATE_RADIO_BUTTONS(vbox2,
   1599 			     pop_nossl_radiobtn,
   1600 			     _("Don't use TLS"),
   1601 			     SSL_NONE,
   1602 			     pop_ssltunnel_radiobtn,
   1603 			     _("Use TLS"),
   1604 			     SSL_TUNNEL,
   1605 			     pop_starttls_radiobtn,
   1606 			     _("Use STARTTLS command to start encrypted session"),
   1607 			     SSL_STARTTLS);
   1608 	g_signal_connect(G_OBJECT(pop_ssltunnel_radiobtn), "toggled",
   1609 			 G_CALLBACK(pop_ssltunnel_toggled), NULL);
   1610 
   1611 	vbox3 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP"));
   1612 
   1613 	CREATE_RADIO_BUTTONS(vbox3,
   1614 			     imap_nossl_radiobtn,
   1615 			     _("Don't use TLS"),
   1616 			     SSL_NONE,
   1617 			     imap_ssltunnel_radiobtn,
   1618 			     _("Use TLS"),
   1619 			     SSL_TUNNEL,
   1620 			     imap_starttls_radiobtn,
   1621 			     _("Use STARTTLS command to start encrypted session"),
   1622 			     SSL_STARTTLS);
   1623 	g_signal_connect(G_OBJECT(imap_ssltunnel_radiobtn), "toggled",
   1624 			 G_CALLBACK(imap_ssltunnel_toggled), NULL);
   1625 
   1626 	vbox5 = gtkut_get_options_frame(vbox1, &send_frame, _("Send (SMTP)"));
   1627 
   1628 	CREATE_RADIO_BUTTONS(vbox5,
   1629 			     smtp_nossl_radiobtn,
   1630 			     _("Don't use TLS (but, if necessary, use STARTTLS)"),
   1631 			     SSL_NONE,
   1632 			     smtp_ssltunnel_radiobtn,
   1633 			     _("Use TLS"),
   1634 			     SSL_TUNNEL,
   1635 			     smtp_starttls_radiobtn,
   1636 			     _("Use STARTTLS command to start encrypted session"),
   1637 			     SSL_STARTTLS);
   1638 	g_signal_connect(G_OBJECT(smtp_ssltunnel_radiobtn), "toggled",
   1639 			 G_CALLBACK(smtp_ssltunnel_toggled), NULL);
   1640 
   1641 	PACK_FRAME(vbox1, cert_frame, _("Client certificates"));
   1642 
   1643 	cert_table = gtk_grid_new();
   1644 	gtk_container_add(GTK_CONTAINER(cert_frame), cert_table);
   1645 	gtk_container_set_border_width(GTK_CONTAINER(cert_table), 8);
   1646 	gtk_grid_set_row_spacing(GTK_GRID(cert_table), VSPACING_NARROW_2);
   1647 	gtk_grid_set_column_spacing(GTK_GRID(cert_table), 8);
   1648 
   1649 	label = gtk_label_new(_("Certificate for receiving"));
   1650 	gtk_label_set_xalign(GTK_LABEL(label), 1.0);
   1651 	entry_in_cert_file = gtk_entry_new();
   1652 	in_ssl_cert_browse_button = gtkut_get_browse_file_btn(_("Browse"));
   1653 	CLAWS_SET_TIP(label,
   1654 			     _("Client certificate file as a PKCS12 or PEM file"));
   1655 	CLAWS_SET_TIP(entry_in_cert_file,
   1656 			     _("Client certificate file as a PKCS12 or PEM file"));
   1657 	gtk_grid_attach(GTK_GRID(cert_table), label, 0, 0, 1, 1);
   1658 	gtk_grid_attach(GTK_GRID(cert_table), entry_in_cert_file, 1, 0, 1, 1);
   1659 	gtk_widget_set_hexpand(entry_in_cert_file, TRUE);
   1660 	gtk_widget_set_halign(entry_in_cert_file, GTK_ALIGN_FILL);
   1661 	gtk_grid_attach(GTK_GRID(cert_table), in_ssl_cert_browse_button, 2, 0, 1, 1);
   1662 
   1663 	label = gtk_label_new(_("Password"));
   1664 	gtk_label_set_xalign(GTK_LABEL(label), 1.0);
   1665 	entry_in_cert_pass = gtk_entry_new();
   1666 	gtk_entry_set_visibility(GTK_ENTRY(entry_in_cert_pass), FALSE);
   1667 	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_in_cert_pass),
   1668 					  GTK_ENTRY_ICON_SECONDARY,
   1669 					  "view-reveal-symbolic");
   1670 	gtk_entry_set_icon_activatable(GTK_ENTRY(entry_in_cert_pass),
   1671 				       GTK_ENTRY_ICON_SECONDARY, TRUE);
   1672 	gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry_in_cert_pass),
   1673 					GTK_ENTRY_ICON_SECONDARY, _("Show password"));
   1674 	g_signal_connect(entry_in_cert_pass, "icon-press",
   1675 			 G_CALLBACK(prefs_account_showpwd_toggled), NULL);
   1676 
   1677 	gtk_grid_attach(GTK_GRID(cert_table), label, 0, 1, 1, 1);
   1678 	gtk_grid_attach(GTK_GRID(cert_table), entry_in_cert_pass, 1, 1, 1, 1);
   1679 	gtk_widget_set_hexpand(entry_in_cert_pass, TRUE);
   1680 	gtk_widget_set_halign(entry_in_cert_pass, GTK_ALIGN_FILL);
   1681 
   1682 	label = gtk_label_new(_("Certificate for sending"));
   1683 	gtk_label_set_xalign(GTK_LABEL(label), 1.0);
   1684 	entry_out_cert_file = gtk_entry_new();
   1685 	out_ssl_cert_browse_button = gtkut_get_browse_file_btn(_("Browse"));
   1686 	CLAWS_SET_TIP(label,
   1687 			     _("Client certificate file as a PKCS12 or PEM file"));
   1688 	CLAWS_SET_TIP(entry_out_cert_file,
   1689 			     _("Client certificate file as a PKCS12 or PEM file"));
   1690 	gtk_grid_attach(GTK_GRID(cert_table), label, 0, 2, 1, 1);
   1691 	gtk_grid_attach(GTK_GRID(cert_table), entry_out_cert_file, 1, 2, 1, 1);
   1692 	gtk_widget_set_hexpand(entry_out_cert_file, TRUE);
   1693 	gtk_widget_set_halign(entry_out_cert_file, GTK_ALIGN_FILL);
   1694 	gtk_grid_attach(GTK_GRID(cert_table), out_ssl_cert_browse_button, 2, 2, 1, 1);
   1695 
   1696 	label = gtk_label_new(_("Password"));
   1697 	gtk_label_set_xalign(GTK_LABEL(label), 1.0);
   1698 	entry_out_cert_pass = gtk_entry_new();
   1699 	gtk_entry_set_visibility(GTK_ENTRY(entry_out_cert_pass), FALSE);
   1700 	gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_out_cert_pass),
   1701 					  GTK_ENTRY_ICON_SECONDARY,
   1702 					  "view-reveal-symbolic");
   1703 	gtk_entry_set_icon_activatable(GTK_ENTRY(entry_out_cert_pass),
   1704 				       GTK_ENTRY_ICON_SECONDARY, TRUE);
   1705 	gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry_out_cert_pass),
   1706 					GTK_ENTRY_ICON_SECONDARY, _("Show password"));
   1707 	g_signal_connect(entry_out_cert_pass, "icon-press",
   1708 			 G_CALLBACK(prefs_account_showpwd_toggled), NULL);
   1709 
   1710 	gtk_grid_attach(GTK_GRID(cert_table), label, 0, 3, 1, 1);
   1711 	gtk_grid_attach(GTK_GRID(cert_table), entry_out_cert_pass, 1, 3, 1, 1);
   1712 	gtk_widget_set_hexpand(entry_out_cert_pass, TRUE);
   1713 	gtk_widget_set_halign(entry_out_cert_pass, GTK_ALIGN_FILL);
   1714 
   1715 	gtk_widget_show_all(cert_table);
   1716 
   1717 	g_signal_connect(G_OBJECT(in_ssl_cert_browse_button), "clicked",
   1718 			 G_CALLBACK(prefs_account_in_cert_browse_cb), NULL);
   1719 	g_signal_connect(G_OBJECT(out_ssl_cert_browse_button), "clicked",
   1720 			 G_CALLBACK(prefs_account_out_cert_browse_cb), NULL);
   1721 
   1722 	vbox7 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
   1723 	gtk_widget_show (vbox7);
   1724 	gtk_box_pack_start (GTK_BOX (vbox1), vbox7, FALSE, FALSE, 0);
   1725 
   1726 	PACK_CHECK_BUTTON(vbox7, use_nonblocking_ssl_checkbtn, "Use non-blocking TLS");
   1727 
   1728 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
   1729 	gtk_widget_show (hbox);
   1730 	gtk_box_pack_start (GTK_BOX (vbox7), hbox, FALSE, FALSE, 0);
   1731 
   1732 	hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
   1733 	gtk_widget_show (hbox_spc);
   1734 	gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
   1735 	gtk_widget_set_size_request (hbox_spc, 16, -1);
   1736 
   1737 	label = gtk_label_new
   1738 		(_("Turn this off if you have TLS connection problems"));
   1739 	gtk_widget_show (label);
   1740 	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
   1741 	gtkut_widget_set_small_font_size (label);
   1742 
   1743 	page->pop_frame               = pop_frame;
   1744 	page->pop_nossl_radiobtn      = pop_nossl_radiobtn;
   1745 	page->pop_ssltunnel_radiobtn  = pop_ssltunnel_radiobtn;
   1746 	page->pop_starttls_radiobtn   = pop_starttls_radiobtn;
   1747 
   1748 	page->imap_frame              = imap_frame;
   1749 	page->imap_nossl_radiobtn     = imap_nossl_radiobtn;
   1750 	page->imap_ssltunnel_radiobtn = imap_ssltunnel_radiobtn;
   1751 	page->imap_starttls_radiobtn  = imap_starttls_radiobtn;
   1752 
   1753 	page->send_frame              = send_frame;
   1754 	page->smtp_nossl_radiobtn     = smtp_nossl_radiobtn;
   1755 	page->smtp_ssltunnel_radiobtn = smtp_ssltunnel_radiobtn;
   1756 	page->smtp_starttls_radiobtn  = smtp_starttls_radiobtn;
   1757 
   1758 	page->entry_in_cert_file      = entry_in_cert_file;
   1759 	page->entry_in_cert_pass      = entry_in_cert_pass;
   1760 	page->entry_out_cert_file     = entry_out_cert_file;
   1761 	page->entry_out_cert_pass     = entry_out_cert_pass;
   1762 
   1763 	page->use_nonblocking_ssl_checkbtn = use_nonblocking_ssl_checkbtn;
   1764 
   1765 	tmp_ac_prefs = *ac_prefs;
   1766 
   1767 	if (new_account) {
   1768 		prefs_set_dialog_to_default(ssl_param);
   1769 	} else {
   1770 		prefs_set_dialog(ssl_param);
   1771 
   1772 		/* Passwords are handled outside of PrefParams. */
   1773 		buf = passwd_store_get_account(ac_prefs->account_id,
   1774 				PWS_ACCOUNT_RECV_CERT);
   1775 		gtk_entry_set_text(GTK_ENTRY(page->entry_in_cert_pass), buf != NULL ? buf : "");
   1776 		if (buf != NULL) {
   1777 			memset(buf, 0, strlen(buf));
   1778 			g_free(buf);
   1779 		}
   1780 
   1781 		buf = passwd_store_get_account(ac_prefs->account_id,
   1782 				PWS_ACCOUNT_SEND_CERT);
   1783 		gtk_entry_set_text(GTK_ENTRY(page->entry_out_cert_pass), buf != NULL ? buf : "");
   1784 		if (buf != NULL) {
   1785 			memset(buf, 0, strlen(buf));
   1786 			g_free(buf);
   1787 		}
   1788 	}
   1789 
   1790 	page->vbox = vbox1;
   1791 
   1792 	page->page.widget = vbox1;
   1793 }
   1794 
   1795 #undef CREATE_RADIO_BUTTONS
   1796 
   1797 static void advanced_create_widget_func(PrefsPage * _page,
   1798                                            GtkWindow * window,
   1799                                            gpointer data)
   1800 {
   1801 	AdvancedPage *page = (AdvancedPage *) _page;
   1802 	PrefsAccount *ac_prefs = (PrefsAccount *) data;
   1803 
   1804 	GtkWidget *vbox1;
   1805 	GtkWidget *vbox2;
   1806 	GtkWidget *hbox1;
   1807 	GtkWidget *checkbtn_smtpport;
   1808 	GtkWidget *spinbtn_smtpport;
   1809 	GtkWidget *hbox_popport;
   1810 	GtkWidget *checkbtn_popport;
   1811 	GtkWidget *spinbtn_popport;
   1812 	GtkWidget *hbox_imapport;
   1813 	GtkWidget *checkbtn_imapport;
   1814 	GtkWidget *spinbtn_imapport;
   1815 	GtkWidget *checkbtn_domain;
   1816 	GtkWidget *entry_domain;
   1817 	gchar *tip_domain;
   1818 	GtkWidget *checkbtn_tunnelcmd;
   1819 	GtkWidget *entry_tunnelcmd;
   1820 	GtkWidget *folder_frame;
   1821 	GtkWidget *vbox3;
   1822 	GtkWidget *table;
   1823 	GtkWidget *sent_folder_checkbtn;
   1824 	GtkWidget *sent_folder_entry;
   1825 	GtkWidget *queue_folder_checkbtn;
   1826 	GtkWidget *queue_folder_entry;
   1827 	GtkWidget *draft_folder_checkbtn;
   1828 	GtkWidget *draft_folder_entry;
   1829 	GtkWidget *trash_folder_checkbtn;
   1830 	GtkWidget *trash_folder_entry;
   1831 	GtkSizeGroup *size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
   1832 
   1833 #define PACK_HBOX(hbox) \
   1834 	{ \
   1835 	hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); \
   1836 	gtk_widget_show (hbox); \
   1837 	gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); \
   1838 	}
   1839 
   1840 #define PACK_PORT_SPINBTN(box, spinbtn) \
   1841 	{ \
   1842 	spinbtn = gtk_spin_button_new_with_range(0, 65535, 1); \
   1843 	gtk_widget_show (spinbtn); \
   1844 	gtk_box_pack_start (GTK_BOX (box), spinbtn, FALSE, FALSE, 0); \
   1845 	}
   1846 
   1847 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
   1848 	gtk_widget_show (vbox1);
   1849 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
   1850 
   1851 	vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW_2);
   1852 	gtk_widget_show (vbox2);
   1853 	gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
   1854 
   1855 	PACK_HBOX (hbox1);
   1856 	PACK_CHECK_BUTTON (hbox1, checkbtn_smtpport, _("SMTP port"));
   1857 	PACK_PORT_SPINBTN (hbox1, spinbtn_smtpport);
   1858 	SET_TOGGLE_SENSITIVITY (checkbtn_smtpport, spinbtn_smtpport);
   1859 	gtk_size_group_add_widget(size_group, checkbtn_smtpport);
   1860 
   1861 	PACK_HBOX (hbox_popport);
   1862 	PACK_CHECK_BUTTON (hbox_popport, checkbtn_popport,
   1863 			   _("POP port"));
   1864 	PACK_PORT_SPINBTN (hbox_popport, spinbtn_popport);
   1865 	SET_TOGGLE_SENSITIVITY (checkbtn_popport, spinbtn_popport);
   1866 	gtk_size_group_add_widget(size_group, checkbtn_popport);
   1867 
   1868 	PACK_HBOX (hbox_imapport);
   1869 	PACK_CHECK_BUTTON (hbox_imapport, checkbtn_imapport,
   1870 			   _("IMAP port"));
   1871 	PACK_PORT_SPINBTN (hbox_imapport, spinbtn_imapport);
   1872 	SET_TOGGLE_SENSITIVITY (checkbtn_imapport, spinbtn_imapport);
   1873 	gtk_size_group_add_widget(size_group, checkbtn_imapport);
   1874 
   1875 	PACK_HBOX (hbox1);
   1876 	PACK_CHECK_BUTTON (hbox1, checkbtn_domain, _("Domain name"));
   1877 	gtk_size_group_add_widget(size_group, checkbtn_domain);
   1878 
   1879 	tip_domain = _("The domain name will be used in the generated "
   1880 			"Message-ID, and when connecting to SMTP servers");
   1881 
   1882 	CLAWS_SET_TIP(checkbtn_domain, tip_domain);
   1883 
   1884 	entry_domain = gtk_entry_new ();
   1885 	gtk_widget_show (entry_domain);
   1886 	gtk_box_pack_start (GTK_BOX (hbox1), entry_domain, TRUE, TRUE, 0);
   1887 	SET_TOGGLE_SENSITIVITY (checkbtn_domain, entry_domain);
   1888 	CLAWS_SET_TIP(entry_domain, tip_domain);
   1889 
   1890 	PACK_HBOX (hbox1);
   1891 	PACK_CHECK_BUTTON (hbox1, checkbtn_tunnelcmd,
   1892 			   _("Use command to communicate with server"));
   1893 	entry_tunnelcmd = gtk_entry_new ();
   1894 	gtk_widget_show (entry_tunnelcmd);
   1895 	gtk_box_pack_start (GTK_BOX (hbox1), entry_tunnelcmd, TRUE, TRUE, 0);
   1896 	SET_TOGGLE_SENSITIVITY (checkbtn_tunnelcmd, entry_tunnelcmd);
   1897 
   1898 #undef PACK_HBOX
   1899 #undef PACK_PORT_SPINBTN
   1900 
   1901 	/* special folder setting (maybe these options are redundant) */
   1902 
   1903 	vbox3 = gtkut_get_options_frame(vbox1, &folder_frame, _("Folder"));
   1904 
   1905 	table = gtk_grid_new();
   1906 	gtk_widget_show (table);
   1907 	gtk_container_add (GTK_CONTAINER (vbox3), table);
   1908 	gtk_grid_set_row_spacing(GTK_GRID(table), VSPACING_NARROW_2);
   1909 	gtk_grid_set_column_spacing(GTK_GRID(table), 4);
   1910 
   1911 #define SET_CHECK_BTN_AND_ENTRY(label, checkbtn, entry, n)		\
   1912 {									\
   1913 	GtkWidget *button;						\
   1914 									\
   1915 	checkbtn = gtk_check_button_new_with_label (label);		\
   1916 	gtk_widget_show (checkbtn);					\
   1917 	gtk_grid_attach(GTK_GRID(table), checkbtn, 0, n, 1, 1);		\
   1918 									\
   1919 	entry = gtk_entry_new ();					\
   1920 	gtk_widget_show (entry);					\
   1921 	gtk_grid_attach(GTK_GRID(table), entry, 1, n, 1, 1);		\
   1922 	gtk_widget_set_hexpand(entry, TRUE);				\
   1923 	gtk_widget_set_halign(entry, GTK_ALIGN_FILL);			\
   1924 									\
   1925 	button = gtkut_get_browse_file_btn(_("Browse"));		\
   1926 	gtk_widget_show (button);					\
   1927 	gtk_grid_attach(GTK_GRID(table), button, 2, n, 1, 1);		\
   1928 	g_signal_connect						\
   1929 		(G_OBJECT (button), "clicked",				\
   1930 		 G_CALLBACK (prefs_account_select_folder_cb),		\
   1931 		 entry);						\
   1932 									\
   1933 	SET_TOGGLE_SENSITIVITY (checkbtn, entry);			\
   1934 	SET_TOGGLE_SENSITIVITY (checkbtn, button);			\
   1935 }
   1936 
   1937 	SET_CHECK_BTN_AND_ENTRY(_("Put sent messages in"),
   1938 				sent_folder_checkbtn, sent_folder_entry, 0);
   1939 	SET_CHECK_BTN_AND_ENTRY(_("Put queued messages in"),
   1940 				queue_folder_checkbtn, queue_folder_entry, 1);
   1941 	SET_CHECK_BTN_AND_ENTRY(_("Put draft messages in"),
   1942 				draft_folder_checkbtn, draft_folder_entry, 2);
   1943 	SET_CHECK_BTN_AND_ENTRY(_("Put deleted messages in"),
   1944 				trash_folder_checkbtn, trash_folder_entry, 3);
   1945 
   1946 	page->smtpport_checkbtn	= checkbtn_smtpport;
   1947 	page->smtpport_spinbtn		= spinbtn_smtpport;
   1948 	page->popport_hbox		= hbox_popport;
   1949 	page->popport_checkbtn		= checkbtn_popport;
   1950 	page->popport_spinbtn		= spinbtn_popport;
   1951 	page->imapport_hbox		= hbox_imapport;
   1952 	page->imapport_checkbtn	= checkbtn_imapport;
   1953 	page->imapport_spinbtn		= spinbtn_imapport;
   1954 	page->domain_checkbtn		= checkbtn_domain;
   1955 	page->domain_entry		= entry_domain;
   1956 	page->tunnelcmd_checkbtn	= checkbtn_tunnelcmd;
   1957 	page->tunnelcmd_entry	= entry_tunnelcmd;
   1958 	page->sent_folder_checkbtn  = sent_folder_checkbtn;
   1959 	page->sent_folder_entry   = sent_folder_entry;
   1960 	page->queue_folder_checkbtn  = queue_folder_checkbtn;
   1961 	page->queue_folder_entry   = queue_folder_entry;
   1962 	page->draft_folder_checkbtn = draft_folder_checkbtn;
   1963 	page->draft_folder_entry  = draft_folder_entry;
   1964 	page->trash_folder_checkbtn = trash_folder_checkbtn;
   1965 	page->trash_folder_entry  = trash_folder_entry;
   1966 
   1967 	tmp_ac_prefs = *ac_prefs;
   1968 
   1969 	if (new_account) {
   1970 		prefs_set_dialog_to_default(advanced_param);
   1971 	} else
   1972 		prefs_set_dialog(advanced_param);
   1973 
   1974 	page->vbox = vbox1;
   1975 
   1976 	page->page.widget = vbox1;
   1977 
   1978 	g_object_unref(G_OBJECT(size_group));
   1979 }
   1980 
   1981 static gint prefs_basic_apply(void)
   1982 {
   1983 	RecvProtocol protocol;
   1984 	gchar *old_id = NULL;
   1985 	gchar *new_id = NULL;
   1986 	struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *) basic_page.protocol_optmenu;
   1987 	GtkWidget *optmenu = protocol_optmenu->combobox;
   1988 
   1989 	protocol = combobox_get_active_data(GTK_COMBO_BOX(optmenu));
   1990 
   1991 	if (*gtk_entry_get_text(GTK_ENTRY(basic_page.acname_entry)) == '\0') {
   1992 		alertpanel_error(_("Account name is not entered."));
   1993 		return -1;
   1994 	}
   1995 	if (strchr(gtk_entry_get_text(GTK_ENTRY(basic_page.acname_entry)), '/') != NULL &&
   1996 	    protocol == A_IMAP4) {
   1997 		alertpanel_error(_("Account name cannot contain '/'."));
   1998 		return -1;
   1999 	}
   2000 	if (*gtk_entry_get_text(GTK_ENTRY(basic_page.addr_entry)) == '\0') {
   2001 		alertpanel_error(_("Mail address is not entered."));
   2002 		return -1;
   2003 	}
   2004 
   2005 	if (((protocol == A_POP3) ||
   2006 	     (protocol == A_LOCAL && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic_page.mailcmd_checkbtn))) ||
   2007 	     (protocol == A_NONE)) &&
   2008            *gtk_entry_get_text(GTK_ENTRY(basic_page.smtpserv_entry)) == '\0') {
   2009 		alertpanel_error(_("SMTP server is not entered."));
   2010 		return -1;
   2011 	}
   2012 	if ((protocol == A_POP3 || protocol == A_IMAP4) &&
   2013 	    *gtk_entry_get_text(GTK_ENTRY(basic_page.uid_entry)) == '\0') {
   2014 		alertpanel_error(_("User ID is not entered."));
   2015 		return -1;
   2016 	}
   2017 	if (protocol == A_POP3 &&
   2018 	    *gtk_entry_get_text(GTK_ENTRY(basic_page.recvserv_entry)) == '\0') {
   2019 		alertpanel_error(_("POP server is not entered."));
   2020 		return -1;
   2021 	}
   2022 	if (protocol == A_POP3 || protocol == A_LOCAL) {
   2023 		GtkWidget *inbox_entry = (protocol == A_POP3 ? receive_page.inbox_entry : receive_page.local_inbox_entry );
   2024 		const gchar *mailbox = gtk_entry_get_text(GTK_ENTRY(inbox_entry));
   2025 		FolderItem *inbox =  folder_find_item_from_identifier(mailbox);
   2026 		if (!inbox) {
   2027 			gchar *id = NULL;
   2028 			setup_write_mailbox_path(mainwindow_get_mainwindow(), "Mail");
   2029 			id = folder_item_get_identifier(folder_get_default_inbox_for_class(F_MH));
   2030 			gtk_entry_set_text(GTK_ENTRY(receive_page.inbox_entry),
   2031 				id);
   2032 			gtk_entry_set_text(GTK_ENTRY(receive_page.local_inbox_entry),
   2033 				id);
   2034 			g_free(id);
   2035 			mailbox = gtk_entry_get_text(GTK_ENTRY(inbox_entry));
   2036 			inbox =  folder_find_item_from_identifier(mailbox);
   2037 		}
   2038 	    	if (inbox == NULL) {
   2039 			alertpanel_error(_("The default Inbox folder doesn't exist."));
   2040 			return -1;
   2041 		}
   2042 	}
   2043 	if (protocol == A_IMAP4 &&
   2044 	    *gtk_entry_get_text(GTK_ENTRY(basic_page.recvserv_entry)) == '\0') {
   2045 		alertpanel_error(_("IMAP server is not entered."));
   2046 		return -1;
   2047 	}
   2048 
   2049 	if (protocol == A_LOCAL &&
   2050 	    *gtk_entry_get_text(GTK_ENTRY(basic_page.localmbox_entry)) == '\0') {
   2051 		alertpanel_error(_("local mailbox filename is not entered."));
   2052 		return -1;
   2053 	}
   2054 
   2055 	if (protocol == A_LOCAL &&
   2056 	    gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic_page.mailcmd_checkbtn)) && *gtk_entry_get_text(GTK_ENTRY(basic_page.mailcmd_entry)) == '\0') {
   2057 		alertpanel_error(_("mail command is not entered."));
   2058 		return -1;
   2059 	}
   2060 
   2061 	if (protocol == A_IMAP4)
   2062 		old_id = g_strdup_printf("#imap/%s",
   2063 				tmp_ac_prefs.account_name ? tmp_ac_prefs.account_name : "(null)");
   2064 
   2065 	if (strchr(gtk_entry_get_text(GTK_ENTRY(basic_page.uid_entry)), '\n') != NULL) {
   2066 		alertpanel_error(_("User ID cannot contain a newline character."));
   2067 		if (old_id)
   2068 			g_free(old_id);
   2069 		return -1;
   2070 	}
   2071 
   2072 	if (strchr(gtk_entry_get_text(GTK_ENTRY(basic_page.pass_entry)), '\n') != NULL) {
   2073 		alertpanel_error(_("Password cannot contain a newline character."));
   2074 		if (old_id)
   2075 			g_free(old_id);
   2076 		return -1;
   2077 	}
   2078 
   2079 	prefs_set_data_from_dialog(basic_param);
   2080 
   2081 	/* Passwords are stored outside of PrefParams. */
   2082 	passwd_store_set_account(tmp_ac_prefs.account_id,
   2083 			PWS_ACCOUNT_RECV,
   2084 			gtk_entry_get_text(GTK_ENTRY(basic_page.pass_entry)),
   2085 			FALSE);
   2086 
   2087 	/* Manual password change - reset expiry on OAUTH2 tokens*/
   2088 	passwd_store_set_account(tmp_ac_prefs.account_id, PWS_ACCOUNT_OAUTH2_EXPIRY, "0", FALSE);
   2089 
   2090 	if (protocol == A_IMAP4) {
   2091 		new_id = g_strdup_printf("#imap/%s", tmp_ac_prefs.account_name);
   2092 		if (old_id)
   2093 			g_free(old_id);
   2094 		if (new_id)
   2095 			g_free(new_id);
   2096 	}
   2097 
   2098 	return 0;
   2099 }
   2100 
   2101 static gint prefs_receive_apply(void)
   2102 {
   2103 	if (strchr(gtk_entry_get_text(GTK_ENTRY(send_page.smtp_uid_entry)), '\n') != NULL) {
   2104 		alertpanel_error(_("SMTP user ID cannot contain a newline character."));
   2105 		return -1;
   2106 	}
   2107 
   2108 	if (strchr(gtk_entry_get_text(GTK_ENTRY(send_page.smtp_pass_entry)), '\n') != NULL) {
   2109 		alertpanel_error(_("SMTP password cannot contain a newline character."));
   2110 		return -1;
   2111 	}
   2112 
   2113 	prefs_set_data_from_dialog(receive_param);
   2114 
   2115 	return 0;
   2116 }
   2117 
   2118 static gint prefs_send_apply(void)
   2119 {
   2120 	prefs_set_data_from_dialog(send_param);
   2121 
   2122 	/* Passwords are stored outside of PrefParams. */
   2123 	passwd_store_set_account(tmp_ac_prefs.account_id,
   2124 			PWS_ACCOUNT_SEND,
   2125 			gtk_entry_get_text(GTK_ENTRY(send_page.smtp_pass_entry)),
   2126 			FALSE);
   2127 	/* Manual password change - reset expiry on OAUTH2 tokens*/
   2128 	if (tmp_ac_prefs.use_smtp_auth && tmp_ac_prefs.smtp_auth_type == SMTPAUTH_OAUTH2)
   2129 		passwd_store_set_account(tmp_ac_prefs.account_id, PWS_ACCOUNT_OAUTH2_EXPIRY, "0", FALSE);
   2130 
   2131 	return 0;
   2132 }
   2133 
   2134 static gint prefs_compose_apply(void)
   2135 {
   2136 	prefs_set_data_from_dialog(compose_param);
   2137 	return 0;
   2138 }
   2139 
   2140 static gint prefs_ssl_apply(void)
   2141 {
   2142 	prefs_set_data_from_dialog(ssl_param);
   2143 
   2144 	/* Passwords are stored outside of PrefParams. */
   2145 	passwd_store_set_account(tmp_ac_prefs.account_id,
   2146 			PWS_ACCOUNT_RECV_CERT,
   2147 			gtk_entry_get_text(GTK_ENTRY(ssl_page.entry_in_cert_pass)),
   2148 			FALSE);
   2149 	passwd_store_set_account(tmp_ac_prefs.account_id,
   2150 			PWS_ACCOUNT_SEND_CERT,
   2151 			gtk_entry_get_text(GTK_ENTRY(ssl_page.entry_out_cert_pass)),
   2152 			FALSE);
   2153 
   2154 	return 0;
   2155 }
   2156 
   2157 static gint prefs_advanced_apply(void)
   2158 {
   2159 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.domain_checkbtn)) &&
   2160 	    *gtk_entry_get_text(GTK_ENTRY(advanced_page.domain_entry)) == '\0') {
   2161 		alertpanel_error(_("domain is not specified."));
   2162 		return -1;
   2163 	}
   2164 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.sent_folder_checkbtn)) &&
   2165 	    *gtk_entry_get_text(GTK_ENTRY(advanced_page.sent_folder_entry)) == '\0') {
   2166 		alertpanel_error(_("sent folder is not selected."));
   2167 		return -1;
   2168 	}
   2169 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.queue_folder_checkbtn)) &&
   2170 	    *gtk_entry_get_text(GTK_ENTRY(advanced_page.queue_folder_entry)) == '\0') {
   2171 		alertpanel_error(_("queue folder is not selected."));
   2172 		return -1;
   2173 	}
   2174 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.draft_folder_checkbtn)) &&
   2175 	    *gtk_entry_get_text(GTK_ENTRY(advanced_page.draft_folder_entry)) == '\0') {
   2176 		alertpanel_error(_("draft folder is not selected."));
   2177 		return -1;
   2178 	}
   2179 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.trash_folder_checkbtn)) &&
   2180 	    *gtk_entry_get_text(GTK_ENTRY(advanced_page.trash_folder_entry)) == '\0') {
   2181 		alertpanel_error(_("trash folder is not selected."));
   2182 		return -1;
   2183 	}
   2184 
   2185 	prefs_set_data_from_dialog(advanced_param);
   2186 	return 0;
   2187 }
   2188 
   2189 static void basic_destroy_widget_func(PrefsPage *_page)
   2190 {
   2191 	/* BasicPage *page = (BasicPage *) _page; */
   2192 }
   2193 
   2194 static void receive_destroy_widget_func(PrefsPage *_page)
   2195 {
   2196 	/* ReceivePage *page = (ReceivePage *) _page; */
   2197 }
   2198 
   2199 static void send_destroy_widget_func(PrefsPage *_page)
   2200 {
   2201 	/* SendPage *page = (SendPage *) _page; */
   2202 }
   2203 
   2204 static void compose_destroy_widget_func(PrefsPage *_page)
   2205 {
   2206 	/* ComposePage *page = (ComposePage *) _page; */
   2207 }
   2208 
   2209 static void ssl_destroy_widget_func(PrefsPage *_page)
   2210 {
   2211 	/* SSLPage *page = (SSLPage *) _page; */
   2212 }
   2213 
   2214 static void advanced_destroy_widget_func(PrefsPage *_page)
   2215 {
   2216 	/* AdvancedPage *page = (AdvancedPage *) _page; */
   2217 }
   2218 
   2219 static gboolean basic_can_close_func(PrefsPage *_page)
   2220 {
   2221 	BasicPage *page = (BasicPage *) _page;
   2222 
   2223 	if (!page->page.page_open)
   2224 		return TRUE;
   2225 
   2226 	return prefs_basic_apply() >= 0;
   2227 }
   2228 
   2229 static gboolean receive_can_close_func(PrefsPage *_page)
   2230 {
   2231 	ReceivePage *page = (ReceivePage *) _page;
   2232 
   2233 	if (!page->page.page_open)
   2234 		return TRUE;
   2235 
   2236 	return prefs_receive_apply() >= 0;
   2237 }
   2238 
   2239 static gboolean send_can_close_func(PrefsPage *_page)
   2240 {
   2241 	SendPage *page = (SendPage *) _page;
   2242 
   2243 	if (!page->page.page_open)
   2244 		return TRUE;
   2245 
   2246 	return prefs_send_apply() >= 0;
   2247 }
   2248 
   2249 static gboolean compose_can_close_func(PrefsPage *_page)
   2250 {
   2251 	ComposePage *page = (ComposePage *) _page;
   2252 
   2253 	if (!page->page.page_open)
   2254 		return TRUE;
   2255 
   2256 	return prefs_compose_apply() >= 0;
   2257 }
   2258 
   2259 static gboolean ssl_can_close_func(PrefsPage *_page)
   2260 {
   2261 	SSLPage *page = (SSLPage *) _page;
   2262 
   2263 	if (!page->page.page_open)
   2264 		return TRUE;
   2265 
   2266 	return prefs_ssl_apply() >= 0;
   2267 }
   2268 
   2269 static gboolean advanced_can_close_func(PrefsPage *_page)
   2270 {
   2271 	AdvancedPage *page = (AdvancedPage *) _page;
   2272 
   2273 	if (!page->page.page_open)
   2274 		return TRUE;
   2275 
   2276 	return prefs_advanced_apply() >= 0;
   2277 }
   2278 
   2279 static void basic_save_func(PrefsPage *_page)
   2280 {
   2281 	BasicPage *page = (BasicPage *) _page;
   2282 
   2283 	if (!page->page.page_open)
   2284 		return;
   2285 
   2286 	if (prefs_basic_apply() >= 0)
   2287 		cancelled = FALSE;
   2288 }
   2289 
   2290 static void receive_save_func(PrefsPage *_page)
   2291 {
   2292 	ReceivePage *page = (ReceivePage *) _page;
   2293 
   2294 	if (!page->page.page_open)
   2295 		return;
   2296 
   2297 	if (prefs_receive_apply() >= 0)
   2298 		cancelled = FALSE;
   2299 }
   2300 
   2301 static void send_save_func(PrefsPage *_page)
   2302 {
   2303 	SendPage *page = (SendPage *) _page;
   2304 
   2305 	if (!page->page.page_open)
   2306 		return;
   2307 
   2308 	if (prefs_send_apply() >= 0)
   2309 		cancelled = FALSE;
   2310 }
   2311 
   2312 static void compose_save_func(PrefsPage *_page)
   2313 {
   2314 	ComposePage *page = (ComposePage *) _page;
   2315 
   2316 	if (!page->page.page_open)
   2317 		return;
   2318 
   2319 	if (prefs_compose_apply() >= 0)
   2320 		cancelled = FALSE;
   2321 }
   2322 
   2323 static void ssl_save_func(PrefsPage *_page)
   2324 {
   2325 	SSLPage *page = (SSLPage *) _page;
   2326 
   2327 	if (!page->page.page_open)
   2328 		return;
   2329 
   2330 	if (prefs_ssl_apply() >= 0)
   2331 		cancelled = FALSE;
   2332 }
   2333 
   2334 static void advanced_save_func(PrefsPage *_page)
   2335 {
   2336 	AdvancedPage *page = (AdvancedPage *) _page;
   2337 
   2338 	if (!page->page.page_open)
   2339 		return;
   2340 
   2341 	if (prefs_advanced_apply() >= 0)
   2342 		cancelled = FALSE;
   2343 }
   2344 
   2345 static void register_basic_page(void)
   2346 {
   2347 	static gchar *path[3];
   2348 
   2349 	path[0] = _("Account");
   2350 	path[1] = _("Basic");
   2351 	path[2] = NULL;
   2352 
   2353 	basic_page.page.path = path;
   2354 	basic_page.page.weight = 1000.0;
   2355 	basic_page.page.create_widget = basic_create_widget_func;
   2356 	basic_page.page.destroy_widget = basic_destroy_widget_func;
   2357 	basic_page.page.save_page = basic_save_func;
   2358 	basic_page.page.can_close = basic_can_close_func;
   2359 
   2360 	prefs_account_register_page((PrefsPage *) &basic_page);
   2361 }
   2362 
   2363 static void register_receive_page(void)
   2364 {
   2365 	static gchar *path[3];
   2366 
   2367 	path[0] = _("Account");
   2368 	path[1] = _("Receive");
   2369 	path[2] = NULL;
   2370 
   2371 	receive_page.page.path = path;
   2372 	receive_page.page.weight = 1000.0;
   2373 	receive_page.page.create_widget = receive_create_widget_func;
   2374 	receive_page.page.destroy_widget = receive_destroy_widget_func;
   2375 	receive_page.page.save_page = receive_save_func;
   2376 	receive_page.page.can_close = receive_can_close_func;
   2377 
   2378 	prefs_account_register_page((PrefsPage *) &receive_page);
   2379 }
   2380 
   2381 static void register_send_page(void)
   2382 {
   2383 	static gchar *path[3];
   2384 
   2385 	path[0] = _("Account");
   2386 	path[1] = (gchar *) C_("Preferences menu item", "Send");
   2387 	path[2] = NULL;
   2388 
   2389 	send_page.page.path = path;
   2390 	send_page.page.weight = 1000.0;
   2391 	send_page.page.create_widget = send_create_widget_func;
   2392 	send_page.page.destroy_widget = send_destroy_widget_func;
   2393 	send_page.page.save_page = send_save_func;
   2394 	send_page.page.can_close = send_can_close_func;
   2395 
   2396 	prefs_account_register_page((PrefsPage *) &send_page);
   2397 }
   2398 
   2399 static void register_compose_page(void)
   2400 {
   2401 	static gchar *path[3];
   2402 
   2403 	path[0] = _("Account");
   2404 	path[1] = _("Write");
   2405 	path[2] = NULL;
   2406 
   2407 	compose_page.page.path = path;
   2408 	compose_page.page.weight = 1000.0;
   2409 	compose_page.page.create_widget = compose_create_widget_func;
   2410 	compose_page.page.destroy_widget = compose_destroy_widget_func;
   2411 	compose_page.page.save_page = compose_save_func;
   2412 	compose_page.page.can_close = compose_can_close_func;
   2413 
   2414 	prefs_account_register_page((PrefsPage *) &compose_page);
   2415 }
   2416 
   2417 static void register_ssl_page(void)
   2418 {
   2419 	static gchar *path[3];
   2420 
   2421 	path[0] = _("Account");
   2422 	path[1] = _("TLS");
   2423 	path[2] = NULL;
   2424 
   2425 	ssl_page.page.path = path;
   2426 	ssl_page.page.weight = 1000.0;
   2427 	ssl_page.page.create_widget = ssl_create_widget_func;
   2428 	ssl_page.page.destroy_widget = ssl_destroy_widget_func;
   2429 	ssl_page.page.save_page = ssl_save_func;
   2430 	ssl_page.page.can_close = ssl_can_close_func;
   2431 
   2432 	prefs_account_register_page((PrefsPage *) &ssl_page);
   2433 }
   2434 
   2435 static gboolean sslcert_get_client_cert_hook(gpointer source, gpointer data)
   2436 {
   2437 	SSLClientCertHookData *hookdata = (SSLClientCertHookData *)source;
   2438 	PrefsAccount *account = (PrefsAccount *)hookdata->account;
   2439 	gchar *pwd_id;
   2440 
   2441 	hookdata->cert_path = NULL;
   2442 	hookdata->password = NULL;
   2443 
   2444 	if (!g_list_find(account_get_list(), account)) {
   2445 		g_warning("can't find account");
   2446 		return TRUE;
   2447 	}
   2448 
   2449 	if (hookdata->is_smtp) {
   2450 		if (account->out_ssl_client_cert_file && *account->out_ssl_client_cert_file)
   2451 			hookdata->cert_path = account->out_ssl_client_cert_file;
   2452 		pwd_id = PWS_ACCOUNT_SEND_CERT;
   2453 	} else {
   2454 		if (account->in_ssl_client_cert_file && *account->in_ssl_client_cert_file)
   2455 			hookdata->cert_path = account->in_ssl_client_cert_file;
   2456 		pwd_id = PWS_ACCOUNT_RECV_CERT;
   2457 	}
   2458 
   2459 	hookdata->password = passwd_store_get_account(account->account_id, pwd_id);
   2460 	return TRUE;
   2461 }
   2462 
   2463 struct GetPassData {
   2464 	GCond cond;
   2465 	GMutex mutex;
   2466 	gchar **pass;
   2467 };
   2468 
   2469 
   2470 static gboolean do_get_pass(gpointer data)
   2471 {
   2472 	struct GetPassData *pass_data = (struct GetPassData *)data;
   2473 	g_mutex_lock(&pass_data->mutex);
   2474 	*(pass_data->pass) = input_dialog_query_password("the PKCS12 client certificate", NULL);
   2475 	g_cond_signal(&pass_data->cond);
   2476 	g_mutex_unlock(&pass_data->mutex);
   2477 	return FALSE;
   2478 }
   2479 static gboolean sslcert_get_password(gpointer source, gpointer data)
   2480 {
   2481 	struct GetPassData pass_data;
   2482 	/* do complicated stuff to be able to call GTK from the mainloop */
   2483 	g_cond_init(&pass_data.cond);
   2484 	g_mutex_init(&pass_data.mutex);
   2485 	pass_data.pass = (gchar **)source;
   2486 
   2487 	g_mutex_lock(&pass_data.mutex);
   2488 
   2489 	g_idle_add(do_get_pass, &pass_data);
   2490 
   2491 	g_cond_wait(&pass_data.cond, &pass_data.mutex);
   2492 	g_cond_clear(&pass_data.cond);
   2493 	g_mutex_unlock(&pass_data.mutex);
   2494 	g_mutex_clear(&pass_data.mutex);
   2495 
   2496 	return TRUE;
   2497 }
   2498 
   2499 static void register_advanced_page(void)
   2500 {
   2501 	static gchar *path[3];
   2502 
   2503 	path[0] = _("Account");
   2504 	path[1] = _("Advanced");
   2505 	path[2] = NULL;
   2506 
   2507 	advanced_page.page.path = path;
   2508 	advanced_page.page.weight = 1000.0;
   2509 	advanced_page.page.create_widget = advanced_create_widget_func;
   2510 	advanced_page.page.destroy_widget = advanced_destroy_widget_func;
   2511 	advanced_page.page.save_page = advanced_save_func;
   2512 	advanced_page.page.can_close = advanced_can_close_func;
   2513 
   2514 	prefs_account_register_page((PrefsPage *) &advanced_page);
   2515 }
   2516 
   2517 void prefs_account_init()
   2518 {
   2519 	register_basic_page();
   2520 	register_receive_page();
   2521 	register_send_page();
   2522 	register_compose_page();
   2523 	register_ssl_page();
   2524 	hooks_register_hook(SSLCERT_GET_CLIENT_CERT_HOOKLIST, sslcert_get_client_cert_hook, NULL);
   2525 	hooks_register_hook(SSL_CERT_GET_PASSWORD, sslcert_get_password, NULL);
   2526 	register_advanced_page();
   2527 }
   2528 
   2529 PrefsAccount *prefs_account_new(void)
   2530 {
   2531 	PrefsAccount *ac_prefs;
   2532 
   2533 	ac_prefs = g_new0(PrefsAccount, 1);
   2534 	memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
   2535 	prefs_set_default(basic_param);
   2536 	prefs_set_default(receive_param);
   2537 	prefs_set_default(send_param);
   2538 	prefs_set_default(compose_param);
   2539 	prefs_set_default(ssl_param);
   2540 	prefs_set_default(advanced_param);
   2541 	*ac_prefs = tmp_ac_prefs;
   2542 	ac_prefs->account_id = prefs_account_get_new_id();
   2543 	return ac_prefs;
   2544 }
   2545 
   2546 PrefsAccount *prefs_account_new_from_config(const gchar *label)
   2547 {
   2548 	const gchar *p = label;
   2549 	gchar *rcpath;
   2550 	gint id;
   2551 	PrefsAccount *ac_prefs;
   2552 
   2553 	cm_return_val_if_fail(label != NULL, NULL);
   2554 
   2555 	ac_prefs = g_new0(PrefsAccount, 1);
   2556 
   2557 	/* Load default values to tmp_ac_prefs first, ... */
   2558 	memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
   2559 	prefs_set_default(basic_param);
   2560 	prefs_set_default(receive_param);
   2561 	prefs_set_default(send_param);
   2562 	prefs_set_default(compose_param);
   2563 	prefs_set_default(ssl_param);
   2564 	prefs_set_default(advanced_param);
   2565 
   2566 	/* ... overriding them with values from stored config file. */
   2567 	rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
   2568 	prefs_read_config(basic_param, label, rcpath, NULL);
   2569 	prefs_read_config(receive_param, label, rcpath, NULL);
   2570 	prefs_read_config(send_param, label, rcpath, NULL);
   2571 	prefs_read_config(compose_param, label, rcpath, NULL);
   2572 	prefs_read_config(ssl_param, label, rcpath, NULL);
   2573 	prefs_read_config(advanced_param, label, rcpath, NULL);
   2574 	g_free(rcpath);
   2575 
   2576 	*ac_prefs = tmp_ac_prefs;
   2577 
   2578 	while (*p && !g_ascii_isdigit(*p)) p++;
   2579 	id = atoi(p);
   2580 	if (id < 0) g_warning("wrong account id: %d", id);
   2581 	ac_prefs->account_id = id;
   2582 
   2583 	/* For older configurations, move stored passwords into the
   2584 	 * password store. */
   2585 	gboolean passwords_migrated = FALSE;
   2586 
   2587 	if (ac_prefs->passwd != NULL && strlen(ac_prefs->passwd) > 1) {
   2588 		passwd_store_set_account(ac_prefs->account_id,
   2589 				PWS_ACCOUNT_RECV, ac_prefs->passwd, TRUE);
   2590 		passwords_migrated = TRUE;
   2591 	}
   2592 	if (ac_prefs->smtp_passwd != NULL && strlen(ac_prefs->smtp_passwd) > 1) {
   2593 		passwd_store_set_account(ac_prefs->account_id,
   2594 				PWS_ACCOUNT_SEND, ac_prefs->smtp_passwd, TRUE);
   2595 		passwords_migrated = TRUE;
   2596 	}
   2597 	if (ac_prefs->in_ssl_client_cert_pass != NULL
   2598 			&& strlen(ac_prefs->in_ssl_client_cert_pass) > 1) {
   2599 		passwd_store_set_account(ac_prefs->account_id,
   2600 				PWS_ACCOUNT_RECV_CERT, ac_prefs->in_ssl_client_cert_pass, TRUE);
   2601 		passwords_migrated = TRUE;
   2602 	}
   2603 	if (ac_prefs->out_ssl_client_cert_pass != NULL
   2604 			&& strlen(ac_prefs->out_ssl_client_cert_pass) > 1) {
   2605 		passwd_store_set_account(ac_prefs->account_id,
   2606 				PWS_ACCOUNT_SEND_CERT, ac_prefs->out_ssl_client_cert_pass, TRUE);
   2607 		passwords_migrated = TRUE;
   2608 	}
   2609 
   2610 	/* Write out password store to file immediately, to prevent
   2611 	 * their loss. */
   2612 	if (passwords_migrated)
   2613 		passwd_store_write_config();
   2614 
   2615 	ac_prefs->receive_in_progress = FALSE;
   2616 
   2617 	prefs_custom_header_read_config(ac_prefs);
   2618 
   2619 	return ac_prefs;
   2620 }
   2621 
   2622 #define WRITE_PARAM(PARAM_TABLE) \
   2623 		if (prefs_write_param(PARAM_TABLE, pfile->fp) < 0) { \
   2624 			g_warning("failed to write configuration to file"); \
   2625 			prefs_file_close_revert(pfile); \
   2626 			g_free(rcpath); \
   2627 			return; \
   2628  		}
   2629 
   2630 void prefs_account_write_config_all(GList *account_list)
   2631 {
   2632 	GList *cur;
   2633 	gchar *rcpath;
   2634 	PrefFile *pfile;
   2635 
   2636 	rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
   2637 	if ((pfile = prefs_write_open(rcpath)) == NULL) {
   2638 		g_free(rcpath);
   2639 		return;
   2640 	}
   2641 
   2642 	for (cur = account_list; cur != NULL; cur = cur->next) {
   2643 		tmp_ac_prefs = *(PrefsAccount *)cur->data;
   2644 		if (fprintf(pfile->fp, "[Account: %d]\n", tmp_ac_prefs.account_id) <= 0) {
   2645 			g_free(pfile);
   2646 			g_free(rcpath);
   2647 			return;
   2648 		}
   2649 
   2650 		WRITE_PARAM(basic_param)
   2651 		WRITE_PARAM(receive_param)
   2652 		WRITE_PARAM(send_param)
   2653 		WRITE_PARAM(compose_param)
   2654 		WRITE_PARAM(ssl_param)
   2655 		WRITE_PARAM(advanced_param)
   2656 
   2657 		if (cur->next) {
   2658 			if (fputc('\n', pfile->fp) == EOF) {
   2659 				FILE_OP_ERROR(rcpath, "fputc");
   2660 				prefs_file_close_revert(pfile);
   2661 				g_free(rcpath);
   2662 				return;
   2663 			}
   2664 		}
   2665 	}
   2666 	g_free(rcpath);
   2667 
   2668 	if (prefs_file_close(pfile) < 0)
   2669 		g_warning("failed to write configuration to file");
   2670 
   2671 	passwd_store_write_config();
   2672 }
   2673 #undef WRITE_PARAM
   2674 
   2675 void prefs_account_free(PrefsAccount *ac_prefs)
   2676 {
   2677 	if (!ac_prefs) return;
   2678 
   2679 	tmp_ac_prefs = *ac_prefs;
   2680 	prefs_free(basic_param);
   2681 	prefs_free(receive_param);
   2682 	prefs_free(send_param);
   2683 	prefs_free(compose_param);
   2684 	prefs_free(ssl_param);
   2685 	prefs_free(advanced_param);
   2686 }
   2687 
   2688 static gint prefs_account_get_new_id(void)
   2689 {
   2690 	GList *ac_list;
   2691 	PrefsAccount *ac;
   2692 	static gint last_id = 0;
   2693 
   2694 	for (ac_list = account_get_list(); ac_list != NULL;
   2695 	     ac_list = ac_list->next) {
   2696 		ac = (PrefsAccount *)ac_list->data;
   2697 		if (last_id < ac->account_id)
   2698 			last_id = ac->account_id;
   2699 	}
   2700 
   2701 	return last_id + 1;
   2702 }
   2703 
   2704 static void destroy_dialog(gpointer data)
   2705 {
   2706 	PrefsAccount *ac_prefs = (PrefsAccount *) data;
   2707 	if (!cancelled) {
   2708 		gboolean update_fld_list = FALSE;
   2709 		if (ac_prefs->protocol == A_IMAP4 && !new_account) {
   2710 			if ((&tmp_ac_prefs)->imap_subsonly != ac_prefs->imap_subsonly) {
   2711 				update_fld_list = TRUE;
   2712 			}
   2713 		}
   2714 		*ac_prefs = tmp_ac_prefs;
   2715 		if (update_fld_list)
   2716 			folderview_rescan_tree(ac_prefs->folder, FALSE);
   2717 	} else /* the customhdr_list may have changed, update it anyway */
   2718 		ac_prefs->customhdr_list = (&tmp_ac_prefs)->customhdr_list;
   2719 
   2720 
   2721 	gtk_main_quit();
   2722 }
   2723 
   2724 PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs, gboolean *dirty)
   2725 {
   2726 	gchar *title;
   2727 
   2728 	if (prefs_rc_is_readonly(ACCOUNT_RC))
   2729 		return ac_prefs;
   2730 
   2731 	debug_print("Opening account preferences window...\n");
   2732 
   2733 	inc_lock();
   2734 
   2735 	cancelled = TRUE;
   2736 
   2737 	if (!ac_prefs) {
   2738 		ac_prefs = prefs_account_new();
   2739 		new_account = TRUE;
   2740 	} else
   2741 		new_account = FALSE;
   2742 
   2743 	if (new_account)
   2744 		title = g_strdup (_("Preferences for new account"));
   2745 	else
   2746 		title = g_strdup_printf (_("%s - Account preferences"),
   2747 				ac_prefs->account_name);
   2748 
   2749 	prefswindow_open_full(title, prefs_pages, ac_prefs, destroy_dialog,
   2750 			&prefs_common.editaccountwin_width, &prefs_common.editaccountwin_height,
   2751 			TRUE, NULL, NULL, NULL);
   2752 	g_free(title);
   2753 	gtk_main();
   2754 
   2755 	inc_unlock();
   2756 
   2757 	if (!cancelled && dirty != NULL)
   2758 		*dirty = TRUE;
   2759 	if (cancelled && new_account)
   2760 		return NULL;
   2761 	else {
   2762 		if (ac_prefs->recv_server)
   2763 			g_strstrip(ac_prefs->recv_server);
   2764 		if (ac_prefs->smtp_server)
   2765 			g_strstrip(ac_prefs->smtp_server);
   2766 
   2767 		return ac_prefs;
   2768 	}
   2769 }
   2770 
   2771 static void pop_bfr_smtp_tm_set_sens(GtkWidget *widget, gpointer data)
   2772 {
   2773 	gtk_widget_set_sensitive(send_page.pop_bfr_smtp_tm_spinbtn,
   2774 				 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn)));
   2775 	gtk_widget_set_sensitive(send_page.pop_auth_timeout_lbl,
   2776 				 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn)));
   2777 	gtk_widget_set_sensitive(send_page.pop_auth_minutes_lbl,
   2778 				 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn)));
   2779 }
   2780 
   2781 static void prefs_account_select_folder_cb(GtkWidget *widget, gpointer data)
   2782 {
   2783 	FolderItem *item;
   2784 	gchar *id;
   2785 
   2786 	item = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL, FALSE, NULL);
   2787 	if (item && item->path) {
   2788 		id = folder_item_get_identifier(item);
   2789 		if (id) {
   2790 			gtk_entry_set_text(GTK_ENTRY(data), id);
   2791 			g_free(id);
   2792 		}
   2793 	}
   2794 }
   2795 
   2796 static void auto_configure_cb (GtkWidget *widget, gpointer data)
   2797 {
   2798 	gchar *address = NULL;
   2799 	AutoConfigureData *recv_data;
   2800 	AutoConfigureData *send_data;
   2801 	static GCancellable *recv_cancel = NULL;
   2802 	static GCancellable *send_cancel = NULL;
   2803 	RecvProtocol protocol;
   2804 	struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *) basic_page.protocol_optmenu;
   2805 	GtkWidget *optmenu = protocol_optmenu->combobox;
   2806 
   2807 	if (!recv_cancel) {
   2808 		recv_cancel = g_cancellable_new();
   2809 		send_cancel = g_cancellable_new();
   2810 	}
   2811 
   2812 	if (widget == basic_page.auto_configure_cancel_btn) {
   2813 		g_cancellable_cancel(recv_cancel);
   2814 		g_cancellable_cancel(send_cancel);
   2815 		g_object_unref(recv_cancel);
   2816 		g_object_unref(send_cancel);
   2817 		recv_cancel = NULL;
   2818 		send_cancel = NULL;
   2819 		return;
   2820 	}
   2821 
   2822 	protocol = combobox_get_active_data(GTK_COMBO_BOX(optmenu));
   2823 
   2824 	address = gtk_editable_get_chars(GTK_EDITABLE(basic_page.addr_entry), 0, -1);
   2825 
   2826 	if (strchr(address, '@') == NULL) {
   2827 		g_free(address);
   2828 		gtk_label_set_text(GTK_LABEL(basic_page.auto_configure_lbl),
   2829 			   _("Failed (wrong address)"));
   2830 		return;
   2831 	}
   2832 
   2833 	if (protocol == A_POP3 || protocol == A_IMAP4) {
   2834 		recv_data = g_new0(AutoConfigureData, 1);
   2835 		recv_data->configure_button = GTK_BUTTON(basic_page.auto_configure_btn);
   2836 		recv_data->cancel_button = GTK_BUTTON(basic_page.auto_configure_cancel_btn);
   2837 		recv_data->info_label = GTK_LABEL(basic_page.auto_configure_lbl);
   2838 		recv_data->cancel = recv_cancel;
   2839 		switch(protocol) {
   2840 		case A_POP3:
   2841 			recv_data->ssl_service = "pop3s";
   2842 			recv_data->tls_service = "pop3";
   2843 			recv_data->address = g_strdup(address);
   2844 			recv_data->hostname_entry = GTK_ENTRY(basic_page.recvserv_entry);
   2845 			recv_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.popport_checkbtn);
   2846 			recv_data->port = GTK_SPIN_BUTTON(advanced_page.popport_spinbtn);
   2847 			recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.pop_starttls_radiobtn);
   2848 			recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.pop_ssltunnel_radiobtn);
   2849 			recv_data->default_port = 110;
   2850 			recv_data->default_ssl_port = 995;
   2851 			recv_data->uid_entry = GTK_ENTRY(basic_page.uid_entry);
   2852 			break;
   2853 		case A_IMAP4:
   2854 			recv_data->ssl_service = "imaps";
   2855 			recv_data->tls_service = "imap";
   2856 			recv_data->address = g_strdup(address);
   2857 			recv_data->hostname_entry = GTK_ENTRY(basic_page.recvserv_entry);
   2858 			recv_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.imapport_checkbtn);
   2859 			recv_data->port = GTK_SPIN_BUTTON(advanced_page.imapport_spinbtn);
   2860 			recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.imap_starttls_radiobtn);
   2861 			recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.imap_ssltunnel_radiobtn);
   2862 			recv_data->default_port = 143;
   2863 			recv_data->default_ssl_port = 993;
   2864 			recv_data->uid_entry = GTK_ENTRY(basic_page.uid_entry);
   2865 			break;
   2866 		default:
   2867 			cm_return_if_fail(FALSE);
   2868 		}
   2869 		auto_configure_service(recv_data);
   2870 	}
   2871 
   2872 	send_data = g_new0(AutoConfigureData, 1);
   2873 	send_data->configure_button = GTK_BUTTON(basic_page.auto_configure_btn);
   2874 	send_data->cancel_button = GTK_BUTTON(basic_page.auto_configure_cancel_btn);
   2875 	send_data->info_label = GTK_LABEL(basic_page.auto_configure_lbl);
   2876 	send_data->cancel = send_cancel;
   2877 
   2878 	send_data->ssl_service = NULL;
   2879 	send_data->tls_service = "submission";
   2880 	send_data->address = g_strdup(address);
   2881 	send_data->hostname_entry = GTK_ENTRY(basic_page.smtpserv_entry);
   2882 	send_data->set_port = GTK_TOGGLE_BUTTON(advanced_page.smtpport_checkbtn);
   2883 	send_data->port = GTK_SPIN_BUTTON(advanced_page.smtpport_spinbtn);
   2884 	send_data->tls_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.smtp_starttls_radiobtn);
   2885 	send_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(ssl_page.smtp_ssltunnel_radiobtn);
   2886 	send_data->default_port = 25;
   2887 	send_data->default_ssl_port = -1;
   2888 	send_data->uid_entry = NULL;
   2889 	send_data->auth_checkbtn = GTK_TOGGLE_BUTTON(send_page.smtp_auth_checkbtn);
   2890 
   2891 	auto_configure_service(send_data);
   2892 
   2893 	g_free(address);
   2894 }
   2895 
   2896 static void prefs_account_sigfile_radiobtn_cb(GtkWidget *widget, gpointer data)
   2897 {
   2898 	gtk_widget_set_sensitive(GTK_WIDGET(signature_browse_button), TRUE);
   2899 	gtk_widget_set_sensitive(GTK_WIDGET(signature_edit_button), TRUE);
   2900 }
   2901 
   2902 static void prefs_account_sigcmd_radiobtn_cb(GtkWidget *widget, gpointer data)
   2903 {
   2904 	gtk_widget_set_sensitive(GTK_WIDGET(signature_browse_button), FALSE);
   2905 	gtk_widget_set_sensitive(GTK_WIDGET(signature_edit_button), FALSE);
   2906 }
   2907 
   2908 static void prefs_account_signature_browse_cb(GtkWidget *widget, gpointer data)
   2909 {
   2910 	gchar *filename;
   2911 	gchar *utf8_filename;
   2912 
   2913 	filename = filesel_select_file_open(_("Select signature file"), NULL);
   2914 	if (!filename) return;
   2915 
   2916 	utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
   2917 	if (!utf8_filename) {
   2918 		g_warning("prefs_account_signature_browse_cb(): failed to convert character set");
   2919 		utf8_filename = g_strdup(filename);
   2920 	}
   2921 	gtk_entry_set_text(GTK_ENTRY(entry_sigpath), utf8_filename);
   2922 	g_free(utf8_filename);
   2923 }
   2924 
   2925 static void prefs_account_in_cert_browse_cb(GtkWidget *widget, gpointer data)
   2926 {
   2927 	gchar *filename;
   2928 	gchar *utf8_filename;
   2929 
   2930 	filename = filesel_select_file_open(_("Select certificate file"), NULL);
   2931 	if (!filename) return;
   2932 
   2933 	utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
   2934 	if (!utf8_filename) {
   2935 		g_warning("prefs_account_cert_browse_cb(): failed to convert character set");
   2936 		utf8_filename = g_strdup(filename);
   2937 	}
   2938 	gtk_entry_set_text(GTK_ENTRY(entry_in_cert_file), utf8_filename);
   2939 	g_free(utf8_filename);
   2940 }
   2941 
   2942 static void prefs_account_out_cert_browse_cb(GtkWidget *widget, gpointer data)
   2943 {
   2944 	gchar *filename;
   2945 	gchar *utf8_filename;
   2946 
   2947 	filename = filesel_select_file_open(_("Select certificate file"), NULL);
   2948 	if (!filename) return;
   2949 
   2950 	utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
   2951 	if (!utf8_filename) {
   2952 		g_warning("prefs_account_cert_browse_cb(): failed to convert character set");
   2953 		utf8_filename = g_strdup(filename);
   2954 	}
   2955 	gtk_entry_set_text(GTK_ENTRY(entry_out_cert_file), utf8_filename);
   2956 	g_free(utf8_filename);
   2957 }
   2958 
   2959 static void prefs_account_signature_edit_cb(GtkWidget *widget, gpointer data)
   2960 {
   2961 	const gchar *sigpath = gtk_entry_get_text(GTK_ENTRY(data));
   2962 	if (!is_file_exist(sigpath))
   2963 		str_write_to_file(sigpath, "");
   2964 	open_txt_editor(sigpath, prefs_common_get_ext_editor_cmd());
   2965 }
   2966 
   2967 static void prefs_account_edit_custom_header(void)
   2968 {
   2969 	prefs_custom_header_open(&tmp_ac_prefs);
   2970 }
   2971 
   2972 static void prefs_account_enum_set_data_from_radiobtn(PrefParam *pparam)
   2973 {
   2974 	GtkRadioButton *radiobtn;
   2975 	GSList *group;
   2976 
   2977 	radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
   2978 	group = gtk_radio_button_get_group (radiobtn);
   2979 	while (group != NULL) {
   2980 		GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
   2981 		if (gtk_toggle_button_get_active (btn)) {
   2982 			*((gint *)pparam->data) = GPOINTER_TO_INT
   2983 				(g_object_get_data (G_OBJECT (btn), MENU_VAL_ID));
   2984 			break;
   2985 		}
   2986 		group = group->next;
   2987 	}
   2988 }
   2989 
   2990 static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
   2991 {
   2992 	GtkRadioButton *radiobtn;
   2993 	GSList *group;
   2994 	gpointer data;
   2995 
   2996 	data = GINT_TO_POINTER (*((gint *)pparam->data));
   2997 	radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
   2998 	group = gtk_radio_button_get_group (radiobtn);
   2999 	while (group != NULL) {
   3000 		GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
   3001 		gpointer data1 = g_object_get_data (G_OBJECT (btn), MENU_VAL_ID);
   3002 		if (data1 == data) {
   3003 			gtk_toggle_button_set_active (btn, TRUE);
   3004 			break;
   3005 		}
   3006 		group = group->next;
   3007 	}
   3008 }
   3009 
   3010 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
   3011 {
   3012 	struct BasicProtocol *protocol_optmenu =
   3013 		(struct BasicProtocol *)*pparam->widget;
   3014 	GtkWidget *optmenu = protocol_optmenu->combobox;
   3015 
   3016 	*((RecvProtocol *)pparam->data) =
   3017 		combobox_get_active_data(GTK_COMBO_BOX(optmenu));
   3018 }
   3019 
   3020 static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
   3021 {
   3022 	RecvProtocol protocol;
   3023 	struct BasicProtocol *protocol_optmenu =
   3024 		(struct BasicProtocol *)*pparam->widget;
   3025 	GtkWidget *optmenu = protocol_optmenu->combobox;
   3026 	GtkWidget *optlabel = protocol_optmenu->label;
   3027 	GtkWidget *descrlabel = protocol_optmenu->descrlabel;
   3028 	gchar *label = NULL;
   3029 
   3030 	protocol = *((RecvProtocol *)pparam->data);
   3031 
   3032 	/* Set combobox to correct value even if it will be hidden, so
   3033 	 * we won't break existing accounts when saving. */
   3034 	combobox_select_by_data(GTK_COMBO_BOX(optmenu), protocol);
   3035 
   3036 	/* Set up widgets accordingly */
   3037 	if( new_account ) {
   3038 		gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol"));
   3039 		gtk_widget_hide(optlabel);
   3040 		gtk_widget_show(optmenu);
   3041 	} else {
   3042 		gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol:"));
   3043 		label = g_markup_printf_escaped("<b>%s</b>", protocol_names[protocol]);
   3044 		gtk_label_set_markup(GTK_LABEL(optlabel), label);
   3045 		g_free(label);
   3046 		gtk_widget_hide(optmenu);
   3047 		gtk_widget_show(optlabel);
   3048 		if (protocol == A_IMAP4) {
   3049 			if (new_account)
   3050 				gtk_toggle_button_set_active(
   3051 					GTK_TOGGLE_BUTTON(send_page.msgid_checkbtn),
   3052 					TRUE);
   3053 			gtk_widget_hide(send_page.msgid_checkbtn);
   3054 		} else
   3055 			gtk_widget_show(send_page.msgid_checkbtn);
   3056 
   3057 		gtk_widget_show(send_page.xmailer_checkbtn);
   3058 	}
   3059 }
   3060 
   3061 static void prefs_account_imap_auth_type_set_data_from_optmenu(PrefParam *pparam)
   3062 {
   3063 	*((RecvProtocol *)pparam->data) =
   3064 			combobox_get_active_data(GTK_COMBO_BOX(*pparam->widget));
   3065 }
   3066 
   3067 static void prefs_account_imap_auth_type_set_optmenu(PrefParam *pparam)
   3068 {
   3069 	IMAPAuthType type = *((IMAPAuthType *)pparam->data);
   3070 	GtkComboBox *optmenu = GTK_COMBO_BOX(*pparam->widget);
   3071 
   3072 	combobox_select_by_data(optmenu, type);
   3073 }
   3074 
   3075 static void prefs_account_smtp_auth_type_set_data_from_optmenu(PrefParam *pparam)
   3076 {
   3077 	*((RecvProtocol *)pparam->data) =
   3078 		combobox_get_active_data(GTK_COMBO_BOX(*pparam->widget));
   3079 }
   3080 
   3081 static void prefs_account_smtp_auth_type_set_optmenu(PrefParam *pparam)
   3082 {
   3083 	SMTPAuthType type = *((SMTPAuthType *)pparam->data);
   3084 	GtkComboBox *optmenu = GTK_COMBO_BOX(*pparam->widget);
   3085 
   3086 	combobox_select_by_data(optmenu, type);
   3087 }
   3088 
   3089 static void prefs_account_pop_auth_type_set_data_from_optmenu(PrefParam *pparam)
   3090 {
   3091 	*((RecvProtocol *)pparam->data) =
   3092 		combobox_get_active_data(GTK_COMBO_BOX(*pparam->widget));
   3093 }
   3094 
   3095 static void prefs_account_pop_auth_type_set_optmenu(PrefParam *pparam)
   3096 {
   3097 	POPAuthType type = *((POPAuthType *)pparam->data);
   3098 	GtkComboBox *optmenu = GTK_COMBO_BOX(*pparam->widget);
   3099 
   3100 	combobox_select_by_data(optmenu, type);
   3101 }
   3102 
   3103 static void prefs_account_set_string_from_combobox(PrefParam *pparam)
   3104 {
   3105 	GtkWidget *combobox;
   3106 	GtkListStore *menu;
   3107 	GtkTreeIter iter;
   3108 	gchar **str;
   3109 
   3110 	cm_return_if_fail(*pparam->widget != NULL);
   3111 
   3112 	combobox = *pparam->widget;
   3113 	cm_return_if_fail(gtk_combo_box_get_active_iter(
   3114 				GTK_COMBO_BOX(combobox), &iter));
   3115 
   3116 	str = (gchar **)pparam->data;
   3117 	g_free(*str);
   3118 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combobox)));
   3119 	gtk_tree_model_get(GTK_TREE_MODEL(menu), &iter,
   3120 			COMBOBOX_PRIVACY_PLUGIN_ID, &(*str),
   3121 			-1);
   3122 }
   3123 
   3124 static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
   3125 {
   3126 	RecvProtocol protocol;
   3127 	struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *)basic_page.protocol_optmenu;
   3128 
   3129 	protocol = combobox_get_active_data(combobox);
   3130 
   3131 	gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
   3132 	gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
   3133 
   3134 	switch(protocol) {
   3135 	case A_LOCAL:
   3136 		gtk_widget_show(send_page.msgid_checkbtn);
   3137 		gtk_widget_show(send_page.xmailer_checkbtn);
   3138 		gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
   3139 		gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
   3140 		gtk_grid_set_row_spacing(GTK_GRID(basic_page.serv_table), VSPACING_NARROW);
   3141 
   3142 		gtk_widget_hide(basic_page.recvserv_label);
   3143 		gtk_widget_hide(basic_page.recvserv_entry);
   3144 		gtk_widget_show(basic_page.smtpserv_label);
   3145 		gtk_widget_show(basic_page.smtpserv_entry);
   3146 		gtk_widget_show(basic_page.localmbox_label);
   3147 		gtk_widget_show(basic_page.localmbox_entry);
   3148 		gtk_widget_show(basic_page.mailcmd_label);
   3149 		gtk_widget_show(basic_page.mailcmd_entry);
   3150 		gtk_widget_show(basic_page.mailcmd_checkbtn);
   3151  		gtk_widget_hide(basic_page.uid_label);
   3152 		gtk_widget_hide(basic_page.pass_label);
   3153 		gtk_widget_hide(basic_page.uid_entry);
   3154 		gtk_widget_hide(basic_page.pass_entry);
   3155 
   3156 		gtk_widget_set_sensitive(basic_page.uid_label,  TRUE);
   3157 		gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
   3158 		gtk_widget_set_sensitive(basic_page.uid_entry,  TRUE);
   3159 		gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
   3160 		gtk_widget_hide(receive_page.pop3_frame);
   3161 		gtk_widget_hide(receive_page.imap_frame);
   3162 		gtk_widget_show(receive_page.local_frame);
   3163 
   3164 		gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, TRUE);
   3165 		prefs_account_mailcmd_toggled
   3166 			(GTK_TOGGLE_BUTTON(basic_page.mailcmd_checkbtn), NULL);
   3167 
   3168 		/* update pop_before_smtp sensitivity */
   3169 		gtk_toggle_button_set_active
   3170 			(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn), FALSE);
   3171 		gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, FALSE);
   3172 		gtk_widget_set_sensitive(send_page.pop_bfr_smtp_tm_spinbtn, FALSE);
   3173 
   3174 		if (!tmp_ac_prefs.account_name) {
   3175 			gtk_toggle_button_set_active
   3176 				(GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn),
   3177 				 TRUE);
   3178 		}
   3179 
   3180 		gtk_widget_hide(ssl_page.pop_frame);
   3181 		gtk_widget_hide(ssl_page.imap_frame);
   3182 		gtk_widget_show(ssl_page.send_frame);
   3183 		gtk_widget_hide(advanced_page.popport_hbox);
   3184 		gtk_widget_hide(advanced_page.imapport_hbox);
   3185 		gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
   3186 		gtk_widget_hide(advanced_page.tunnelcmd_entry);
   3187 		gtk_widget_hide(receive_page.imapdir_label);
   3188 		gtk_widget_hide(receive_page.imapdir_entry);
   3189 		gtk_widget_hide(receive_page.subsonly_checkbtn);
   3190 		gtk_widget_hide(receive_page.imap_batch_size_spinbtn);
   3191 		break;
   3192 	case A_IMAP4:
   3193 		if (new_account)
   3194 			gtk_toggle_button_set_active(
   3195 				GTK_TOGGLE_BUTTON(send_page.msgid_checkbtn),
   3196 				TRUE);
   3197 		gtk_widget_hide(send_page.msgid_checkbtn);
   3198 		gtk_widget_show(send_page.xmailer_checkbtn);
   3199 		gtk_grid_set_row_spacing(GTK_GRID(basic_page.serv_table), VSPACING_NARROW);
   3200 
   3201 		gtk_widget_set_sensitive(basic_page.recvserv_label, TRUE);
   3202 		gtk_widget_set_sensitive(basic_page.recvserv_entry, TRUE);
   3203 		gtk_widget_show(basic_page.recvserv_label);
   3204 		gtk_widget_show(basic_page.recvserv_entry);
   3205 		gtk_widget_show(basic_page.smtpserv_label);
   3206 		gtk_widget_show(basic_page.smtpserv_entry);
   3207  		gtk_widget_hide(basic_page.localmbox_label);
   3208 		gtk_widget_hide(basic_page.localmbox_entry);
   3209 		gtk_widget_hide(basic_page.mailcmd_label);
   3210 		gtk_widget_hide(basic_page.mailcmd_entry);
   3211  		gtk_widget_hide(basic_page.mailcmd_checkbtn);
   3212  		gtk_widget_show(basic_page.uid_label);
   3213 		gtk_widget_show(basic_page.pass_label);
   3214 		gtk_widget_show(basic_page.uid_entry);
   3215 		gtk_widget_show(basic_page.pass_entry);
   3216 
   3217 		gtk_widget_set_sensitive(basic_page.uid_label,  TRUE);
   3218 		gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
   3219 		gtk_widget_set_sensitive(basic_page.uid_entry,  TRUE);
   3220 		gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
   3221 		gtk_widget_hide(receive_page.pop3_frame);
   3222 		gtk_widget_show(receive_page.imap_frame);
   3223 		gtk_widget_hide(receive_page.local_frame);
   3224 		gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, TRUE);
   3225 		gtk_widget_set_sensitive(basic_page.smtpserv_entry, TRUE);
   3226 		gtk_widget_set_sensitive(basic_page.smtpserv_label, TRUE);
   3227 
   3228 		/* update pop_before_smtp sensitivity */
   3229 		gtk_toggle_button_set_active
   3230 			(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn), FALSE);
   3231 		gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, FALSE);
   3232 		gtk_widget_set_sensitive(send_page.pop_bfr_smtp_tm_spinbtn, FALSE);
   3233 
   3234 		if (!tmp_ac_prefs.account_name) {
   3235 			gtk_toggle_button_set_active
   3236 				(GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn),
   3237 				 FALSE);
   3238 		}
   3239 
   3240 		gtk_widget_hide(ssl_page.pop_frame);
   3241 		gtk_widget_show(ssl_page.imap_frame);
   3242 		gtk_widget_show(ssl_page.send_frame);
   3243 		gtk_widget_hide(advanced_page.popport_hbox);
   3244 		gtk_widget_show(advanced_page.imapport_hbox);
   3245 		gtk_widget_show(advanced_page.tunnelcmd_checkbtn);
   3246 		gtk_widget_show(advanced_page.tunnelcmd_entry);
   3247 		gtk_widget_show(receive_page.imapdir_label);
   3248 		gtk_widget_show(receive_page.imapdir_entry);
   3249 		gtk_widget_show(receive_page.subsonly_checkbtn);
   3250 		gtk_widget_show(receive_page.imap_batch_size_spinbtn);
   3251 		break;
   3252 	case A_NONE:
   3253 		gtk_widget_show(send_page.msgid_checkbtn);
   3254 		gtk_widget_show(send_page.xmailer_checkbtn);
   3255 		gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
   3256 		gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
   3257 		gtk_grid_set_row_spacing(GTK_GRID(basic_page.serv_table), VSPACING_NARROW);
   3258 
   3259 		gtk_widget_set_sensitive(basic_page.recvserv_label, FALSE);
   3260 		gtk_widget_set_sensitive(basic_page.recvserv_entry, FALSE);
   3261 		gtk_widget_hide(basic_page.recvserv_label);
   3262 		gtk_widget_hide(basic_page.recvserv_entry);
   3263  		gtk_widget_show(basic_page.smtpserv_label);
   3264 		gtk_widget_show(basic_page.smtpserv_entry);
   3265 		gtk_widget_hide(basic_page.localmbox_label);
   3266 		gtk_widget_hide(basic_page.localmbox_entry);
   3267 		gtk_widget_hide(basic_page.mailcmd_label);
   3268 		gtk_widget_hide(basic_page.mailcmd_entry);
   3269  		gtk_widget_hide(basic_page.mailcmd_checkbtn);
   3270 		gtk_widget_hide(basic_page.uid_label);
   3271 		gtk_widget_hide(basic_page.pass_label);
   3272 		gtk_widget_hide(basic_page.uid_entry);
   3273 		gtk_widget_hide(basic_page.pass_entry);
   3274 
   3275 		gtk_widget_set_sensitive(basic_page.uid_label,  FALSE);
   3276 		gtk_widget_set_sensitive(basic_page.pass_label, FALSE);
   3277 		gtk_widget_set_sensitive(basic_page.uid_entry,  FALSE);
   3278 		gtk_widget_set_sensitive(basic_page.pass_entry, FALSE);
   3279 		gtk_widget_set_sensitive(receive_page.pop3_frame, FALSE);
   3280 		gtk_widget_hide(receive_page.pop3_frame);
   3281 		gtk_widget_hide(receive_page.imap_frame);
   3282 		gtk_widget_hide(receive_page.local_frame);
   3283 		gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, FALSE);
   3284 
   3285 		gtk_widget_set_sensitive(basic_page.smtpserv_entry, TRUE);
   3286 		gtk_widget_set_sensitive(basic_page.smtpserv_label, TRUE);
   3287 
   3288 		/* update pop_before_smtp sensitivity */
   3289 		gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, FALSE);
   3290 		pop_bfr_smtp_tm_set_sens(NULL, NULL);
   3291 
   3292 		gtk_toggle_button_set_active
   3293 			(GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn), FALSE);
   3294 
   3295 		gtk_widget_hide(ssl_page.pop_frame);
   3296 		gtk_widget_hide(ssl_page.imap_frame);
   3297 		gtk_widget_show(ssl_page.send_frame);
   3298 		gtk_widget_hide(advanced_page.popport_hbox);
   3299 		gtk_widget_hide(advanced_page.imapport_hbox);
   3300 		gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
   3301 		gtk_widget_hide(advanced_page.tunnelcmd_entry);
   3302 		gtk_widget_hide(receive_page.imapdir_label);
   3303 		gtk_widget_hide(receive_page.imapdir_entry);
   3304 		gtk_widget_hide(receive_page.subsonly_checkbtn);
   3305 		gtk_widget_hide(receive_page.imap_batch_size_spinbtn);
   3306 		break;
   3307 	case A_POP3:
   3308 		/* continue to default: */
   3309 	default:
   3310 		gtk_widget_show(send_page.msgid_checkbtn);
   3311 		gtk_widget_show(send_page.xmailer_checkbtn);
   3312 		gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
   3313 		gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
   3314 		gtk_grid_set_row_spacing(GTK_GRID(basic_page.serv_table), VSPACING_NARROW);
   3315 
   3316  		gtk_widget_set_sensitive(basic_page.recvserv_label, TRUE);
   3317 		gtk_widget_set_sensitive(basic_page.recvserv_entry, TRUE);
   3318 		gtk_widget_show(basic_page.recvserv_label);
   3319 		gtk_widget_show(basic_page.recvserv_entry);
   3320 		gtk_widget_show(basic_page.smtpserv_label);
   3321 		gtk_widget_show(basic_page.smtpserv_entry);
   3322  		gtk_widget_hide(basic_page.localmbox_label);
   3323 		gtk_widget_hide(basic_page.localmbox_entry);
   3324  		gtk_widget_hide(basic_page.mailcmd_label);
   3325 		gtk_widget_hide(basic_page.mailcmd_entry);
   3326  		gtk_widget_hide(basic_page.mailcmd_checkbtn);
   3327  		gtk_widget_show(basic_page.uid_label);
   3328 		gtk_widget_show(basic_page.pass_label);
   3329 		gtk_widget_show(basic_page.uid_entry);
   3330 		gtk_widget_show(basic_page.pass_entry);
   3331 
   3332 		gtk_widget_set_sensitive(basic_page.uid_label,  TRUE);
   3333 		gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
   3334 		gtk_widget_set_sensitive(basic_page.uid_entry,  TRUE);
   3335 		gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
   3336 		gtk_widget_set_sensitive(receive_page.pop3_frame, TRUE);
   3337 		gtk_widget_show(receive_page.pop3_frame);
   3338 		gtk_widget_hide(receive_page.imap_frame);
   3339 		gtk_widget_hide(receive_page.local_frame);
   3340 		gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, TRUE);
   3341 
   3342 		gtk_widget_set_sensitive(basic_page.smtpserv_entry, TRUE);
   3343 		gtk_widget_set_sensitive(basic_page.smtpserv_label, TRUE);
   3344 
   3345 		/* update pop_before_smtp sensitivity */
   3346 		gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, TRUE);
   3347 		pop_bfr_smtp_tm_set_sens(NULL, NULL);
   3348 
   3349 		if (!tmp_ac_prefs.account_name) {
   3350 			gtk_toggle_button_set_active
   3351 				(GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn),
   3352 				 TRUE);
   3353 		}
   3354 
   3355 		gtk_widget_show(ssl_page.pop_frame);
   3356 		gtk_widget_hide(ssl_page.imap_frame);
   3357 		gtk_widget_show(ssl_page.send_frame);
   3358 		gtk_widget_show(advanced_page.popport_hbox);
   3359 		gtk_widget_hide(advanced_page.imapport_hbox);
   3360 		gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
   3361 		gtk_widget_hide(advanced_page.tunnelcmd_entry);
   3362 		gtk_widget_hide(receive_page.imapdir_label);
   3363 		gtk_widget_hide(receive_page.imapdir_entry);
   3364 		gtk_widget_hide(receive_page.subsonly_checkbtn);
   3365 		gtk_widget_hide(receive_page.imap_batch_size_spinbtn);
   3366 		break;
   3367 	}
   3368 
   3369 	gtk_widget_queue_resize(basic_page.serv_frame);
   3370 }
   3371 
   3372 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
   3373 					  gpointer user_data)
   3374 {
   3375 	gboolean use_mailcmd;
   3376 
   3377 	use_mailcmd = gtk_toggle_button_get_active (button);
   3378 
   3379 	gtk_widget_set_sensitive(basic_page.mailcmd_entry,  use_mailcmd);
   3380 	gtk_widget_set_sensitive(basic_page.mailcmd_label, use_mailcmd);
   3381 	gtk_widget_set_sensitive(basic_page.smtpserv_entry, !use_mailcmd);
   3382 	gtk_widget_set_sensitive(basic_page.smtpserv_label, !use_mailcmd);
   3383 	gtk_widget_set_sensitive(basic_page.uid_entry,  !use_mailcmd);
   3384 	gtk_widget_set_sensitive(basic_page.pass_entry, !use_mailcmd);
   3385 }
   3386 
   3387 static void prefs_account_showpwd_toggled(GtkEntry *entry,
   3388 						   gpointer user_data)
   3389 {
   3390 	gboolean visible = gtk_entry_get_visibility(GTK_ENTRY(entry));
   3391 
   3392 	if (visible) {
   3393 		gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
   3394 		gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry),
   3395 						  GTK_ENTRY_ICON_SECONDARY,
   3396 						  "view-reveal-symbolic");
   3397 		gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry),
   3398 						GTK_ENTRY_ICON_SECONDARY,
   3399 						_("Show password"));
   3400 	} else {
   3401 		gtk_entry_set_visibility(GTK_ENTRY(entry), TRUE);
   3402 		gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry),
   3403 						  GTK_ENTRY_ICON_SECONDARY,
   3404 						  "view-conceal-symbolic");
   3405 		gtk_entry_set_icon_tooltip_text(GTK_ENTRY(entry),
   3406 						GTK_ENTRY_ICON_SECONDARY,
   3407 						_("Hide password"));
   3408 	}
   3409 }
   3410 
   3411 gchar *prefs_account_generate_msgid(PrefsAccount *account)
   3412 {
   3413 	gchar *addr, *tmbuf, *buf = NULL;
   3414 	GDateTime *now;
   3415 	gchar *user_addr = account->msgid_with_addr ? g_strdup(account->address) : NULL;
   3416 
   3417 	if (account->set_domain && account->domain) {
   3418 		buf = g_strdup(account->domain);
   3419 	} else if (!strncmp(get_domain_name(), "localhost", strlen("localhost"))) {
   3420 		buf = g_strdup(
   3421 				strchr(account->address, '@') ?
   3422 				strchr(account->address, '@')+1 :
   3423 				account->address);
   3424 	}
   3425 
   3426 	if (user_addr != NULL) {
   3427 		addr = g_strdup_printf(".%s", user_addr);
   3428 	} else {
   3429 		addr = g_strdup_printf("@%s",
   3430 				buf != NULL && strlen(buf) > 0 ?
   3431 				buf : get_domain_name());
   3432 	}
   3433 
   3434 	if (buf != NULL)
   3435 		g_free(buf);
   3436 	if (user_addr != NULL)
   3437 		g_free(user_addr);
   3438 
   3439 	/* Replace all @ but the last one in addr, with underscores.
   3440 	 * RFC 2822 States that msg-id syntax only allows one @.
   3441 	 */
   3442 	while (strchr(addr, '@') != NULL && strchr(addr, '@') != strrchr(addr, '@'))
   3443 		*(strchr(addr, '@')) = '_';
   3444 
   3445 	now = (prefs_common.hide_timezone)? g_date_time_new_now_utc() :
   3446 					    g_date_time_new_now_local();
   3447 	tmbuf = g_date_time_format(now, "%Y%m%d%H%M%S");
   3448 	buf = g_strdup_printf("%s.%08x%s", tmbuf, (guint)rand(), addr);
   3449 	g_date_time_unref(now);
   3450 	g_free(tmbuf);
   3451 	g_free(addr);
   3452 
   3453 	debug_print("Generated Message-ID string '%s'\n", buf);
   3454 	return buf;
   3455 }
   3456 
   3457 void prefs_account_register_page(PrefsPage *page)
   3458 {
   3459 	prefs_pages = g_slist_append(prefs_pages, page);
   3460 
   3461 }
   3462 
   3463 void prefs_account_unregister_page(PrefsPage *page)
   3464 {
   3465 	prefs_pages = g_slist_remove(prefs_pages, page);
   3466 }
   3467 
   3468 char *prefs_account_cache_dir(const char *server, const char *userid)
   3469 {
   3470 	char dir[PATH_MAX];
   3471 	snprintf(dir, sizeof(dir), "%s/imapcache/%s", get_rc_dir(), server);
   3472 	if (userid == NULL)
   3473 		return strdup(dir);
   3474 	strlcat(dir, "/", sizeof(dir));
   3475 	strlcat(dir, userid, sizeof(dir));
   3476 	return strdup(dir);
   3477 }