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 }