fix bug 4773, 'remove obsolescent AC_C_CONST'
[claws.git] / src / wizard.c
blobd37f624c4f4cf657939929f8c7fbd26ad4fa08f2
1 /*
2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2022 the Claws Mail team and Colin Leroy
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.
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.
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/>.
19 #ifdef HAVE_CONFIG_H
20 # include "config.h"
21 #include "claws-features.h"
22 #endif
24 #include "defs.h"
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <gtk/gtk.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <ctype.h>
36 #include "file-utils.h"
37 #include "utils.h"
38 #include "gtk/menu.h"
39 #include "plugin.h"
40 #include "account.h"
41 #include "prefs_account.h"
42 #include "mainwindow.h"
43 #include "stock_pixmap.h"
44 #include "setup.h"
45 #include "folder.h"
46 #include "alertpanel.h"
47 #include "filesel.h"
48 #ifdef USE_GNUTLS
49 #include "ssl.h"
50 #endif
51 #include "prefs_common.h"
52 #include "combobox.h"
53 #include "passwordstore.h"
55 typedef enum
57 GO_BACK,
58 GO_FORWARD,
59 CANCEL,
60 FINISHED
61 } PageNavigation;
63 int WELCOME_PAGE = -1;
64 int USER_PAGE = -1;
65 int SMTP_PAGE = -1;
66 int RECV_PAGE = -1;
67 int MAILBOX_PAGE = -1;
68 int DONE_PAGE = -1;
70 typedef struct
72 GtkWidget *window;
73 GSList *pages;
74 GtkWidget *notebook;
76 MainWindow *mainwin;
78 GtkWidget *email;
79 GtkWidget *full_name;
80 GtkWidget *organization;
82 GtkWidget *mailbox_name;
83 GtkWidget *mailbox_label;
85 GtkWidget *smtp_server;
86 GtkWidget *smtp_auth;
87 GtkWidget *smtp_username;
88 GtkWidget *smtp_password;
89 GtkWidget *smtp_username_label;
90 GtkWidget *smtp_password_label;
92 GtkWidget *recv_type;
93 GtkWidget *recv_label;
94 GtkWidget *recv_server;
95 GtkWidget *recv_username;
96 GtkWidget *recv_password;
97 GtkWidget *recv_username_label;
98 GtkWidget *recv_password_label;
99 GtkWidget *recv_imap_label;
100 GtkWidget *recv_imap_subdir;
101 GtkWidget *subsonly_checkbtn;
102 GtkWidget *no_imap_warning;
103 #ifdef USE_GNUTLS
104 GtkWidget *smtp_use_ssl;
105 GtkWidget *recv_use_ssl;
106 GtkWidget *smtp_use_tls;
107 GtkWidget *recv_use_tls;
108 GtkWidget *smtp_ssl_cert_file;
109 GtkWidget *recv_ssl_cert_file;
110 GtkWidget *smtp_ssl_cert_pass;
111 GtkWidget *recv_ssl_cert_pass;
112 GtkWidget *smtp_cert_table;
113 GtkWidget *recv_cert_table;
114 #endif
115 #if defined USE_GNUTLS
116 GtkWidget *auto_configure_lbl;
117 GtkWidget *auto_configure_btn;
118 GtkWidget *auto_configure_cancel_btn;
119 #endif
120 gboolean create_mailbox;
121 gboolean finished;
122 gboolean result;
124 } WizardWindow;
126 typedef struct _AccountTemplate {
127 gchar *name;
128 gchar *domain;
129 gchar *email;
130 gchar *organization;
131 gchar *smtpserver;
132 gboolean smtpauth;
133 gchar *smtpuser;
134 gchar *smtppass;
135 RecvProtocol recvtype;
136 gchar *recvserver;
137 gchar *recvuser;
138 gchar *recvpass;
139 gchar *imapdir;
140 gboolean subsonly;
141 gchar *mboxfile;
142 gchar *mailbox;
143 gboolean smtpssl;
144 gboolean recvssl;
145 gchar *smtpssl_cert;
146 gchar *recvssl_cert;
147 gchar *smtpssl_cert_pass;
148 gchar *recvssl_cert_pass;
149 } AccountTemplate;
151 static AccountTemplate tmpl;
153 static PrefParam template_params[] = {
154 {"name", "$USERNAME",
155 &tmpl.name, P_STRING, NULL, NULL, NULL},
156 {"domain", "$DEFAULTDOMAIN",
157 &tmpl.domain, P_STRING, NULL, NULL, NULL},
158 {"email", "$NAME_MAIL@$DOMAIN",
159 &tmpl.email, P_STRING, NULL, NULL, NULL},
160 {"organization", "",
161 &tmpl.organization, P_STRING, NULL, NULL, NULL},
162 {"smtpserver", "smtp.$DOMAIN",
163 &tmpl.smtpserver, P_STRING, NULL, NULL, NULL},
164 {"smtpauth", "FALSE",
165 &tmpl.smtpauth, P_BOOL, NULL, NULL, NULL},
166 {"smtpuser", "",
167 &tmpl.smtpuser, P_STRING, NULL, NULL, NULL},
168 {"smtppass", "",
169 &tmpl.smtppass, P_STRING, NULL, NULL, NULL},
170 {"recvtype", "0",
171 &tmpl.recvtype, P_ENUM, NULL, NULL, NULL},
172 {"recvserver", "pop.$DOMAIN",
173 &tmpl.recvserver, P_STRING, NULL, NULL, NULL},
174 {"recvuser", "$LOGIN",
175 &tmpl.recvuser, P_STRING, NULL, NULL, NULL},
176 {"recvpass", "",
177 &tmpl.recvpass, P_STRING, NULL, NULL, NULL},
178 {"imapdir", "",
179 &tmpl.imapdir, P_STRING, NULL, NULL, NULL},
180 {"subsonly", "TRUE",
181 &tmpl.subsonly, P_BOOL, NULL, NULL, NULL},
182 {"mboxfile", "/var/mail/$LOGIN",
183 &tmpl.mboxfile, P_STRING, NULL, NULL, NULL},
184 {"mailbox", "Mail",
185 &tmpl.mailbox, P_STRING, NULL, NULL, NULL},
186 {"smtpssl", "0",
187 &tmpl.smtpssl, P_INT, NULL, NULL, NULL},
188 {"recvssl", "0",
189 &tmpl.recvssl, P_INT, NULL, NULL, NULL},
190 {"smtpssl_cert", "",
191 &tmpl.smtpssl_cert, P_STRING, NULL, NULL, NULL},
192 {"recvssl_cert", "",
193 &tmpl.recvssl_cert, P_STRING, NULL, NULL, NULL},
194 {"smtpssl_cert_pass", "",
195 &tmpl.smtpssl_cert, P_STRING, NULL, NULL, NULL},
196 {"recvssl_cert_pass", "",
197 &tmpl.recvssl_cert, P_STRING, NULL, NULL, NULL},
198 {NULL, NULL, NULL, P_INT, NULL, NULL, NULL}
202 static gchar *accountrc_tmpl =
203 "[AccountTemplate]\n"
204 "#you can use $DEFAULTDOMAIN here\n"
205 "#domain must be defined before the variables that use it\n"
206 "#by default, domain is extracted from the hostname\n"
207 "#domain=\n"
208 "\n"
209 "#you can use $USERNAME for name (this is the default)\n"
210 "#name=\n"
211 "\n"
212 "#you can use $LOGIN, $NAME_MAIL and $DOMAIN here \n"
213 "#$NAME_MAIL is the name without uppercase and with dots instead\n"
214 "#of spaces\n"
215 "#the default is $NAME_MAIL@$DOMAIN\n"
216 "#email=\n"
217 "\n"
218 "#you can use $DOMAIN here\n"
219 "#the default organization is empty\n"
220 "#organization=\n"
221 "\n"
222 "#you can use $DOMAIN here \n"
223 "#the default is smtp.$DOMAIN\n"
224 "#smtpserver=\n"
225 "\n"
226 "#Whether to use smtp authentication\n"
227 "#the default is 0 (no)\n"
228 "#smtpauth=\n"
229 "\n"
230 "#SMTP username\n"
231 "#you can use $LOGIN, $NAME_MAIL, $DOMAIN or $EMAIL here\n"
232 "#the default is empty (same as reception username)\n"
233 "#smtpuser=\n"
234 "\n"
235 "#SMTP password\n"
236 "#the default is empty (same as reception password)\n"
237 "#smtppass=\n"
238 "\n"
239 "#recvtype can be:\n"
240 "#0 for pop3\n"
241 "#1 for imap\n"
242 "#3 for a local mbox file\n"
243 "#recvtype=\n"
244 "\n"
245 "#you can use $DOMAIN here \n"
246 "#the default is {pop,imap}.$DOMAIN\n"
247 "#recvserver=\n"
248 "\n"
249 "#you can use $LOGIN, $NAME_MAIL, $DOMAIN or $EMAIL here\n"
250 "#default is $LOGIN\n"
251 "#recvuser=\n"
252 "\n"
253 "#default is empty\n"
254 "#recvpass=\n"
255 "\n"
256 "#imap dir if imap (relative to the home on the server)\n"
257 "#default is empty\n"
258 "#imapdir=\n"
259 "\n"
260 "#show subscribed folders only, if imap\n"
261 "#default is TRUE\n"
262 "#subsonly=\n"
263 "\n"
264 "#mbox file if local\n"
265 "#you can use $LOGIN here\n"
266 "#default is /var/mail/$LOGIN\n"
267 "#mboxfile=\n"
268 "\n"
269 "#mailbox name if pop3 or local\n"
270 "#relative path from the user's home\n"
271 "#default is \"Mail\"\n"
272 "#mailbox=\n"
273 "\n"
274 "#whether to use encryption on SMTP connections\n"
275 "#default is 0, 1 is TLS, 2 is STARTTLS\n"
276 "#smtpssl=\n"
277 "\n"
278 "#whether to use encryption on POP3 or IMAP connections\n"
279 "#default is 0, 1 is TLS, 2 is STARTTLS\n"
280 "#recvssl=\n"
281 "\n"
282 "#TLS client certificate path for SMTP\n"
283 "#default is empty (no certificate)\n"
284 "#smtpssl_cert=\n"
285 "\n"
286 "#TLS client certificate path for POP/IMAP\n"
287 "#default is empty (no certificate)\n"
288 "#recvssl_cert=\n"
289 "\n"
290 "#TLS client certificate password for SMTP\n"
291 "#default is empty (no password)\n"
292 "#smtpssl_cert_pass=\n"
293 "\n"
294 "#TLS client certificate password for POP/IMAP\n"
295 "#default is empty (no password)\n"
296 "#recvssl_cert_pass=\n"
299 static gchar *wizard_get_default_domain_name(void)
301 static gchar *domain_name = NULL;
303 if (domain_name == NULL) {
304 domain_name = g_strdup(get_domain_name());
305 if (strchr(domain_name, '.') != NULL
306 && strchr(domain_name, '.') != strrchr(domain_name, '.')
307 && strlen(strchr(domain_name, '.')) > 6) {
308 gchar *tmp = g_strdup(strchr(domain_name, '.')+1);
309 g_free(domain_name);
310 domain_name = tmp;
313 return domain_name;
316 static gchar *get_name_for_mail(void)
318 gchar *name = NULL;
319 if (tmpl.name == NULL)
320 return NULL;
321 name = g_utf8_strdown(tmpl.name, -1);
322 while(strstr(name, " "))
323 *strstr(name, " ")='.';
325 return name;
328 #define PARSE_DEFAULT(str) { \
329 gchar *tmp = NULL, *new = NULL; \
330 if (str != NULL) { \
331 if (strstr(str, "$USERNAME")) { \
332 tmp = g_strdup(str); \
333 *strstr(tmp, "$USERNAME") = '\0'; \
334 new = g_strconcat(tmp, g_get_real_name(), \
335 strstr(str, "$USERNAME")+strlen("$USERNAME"), \
336 NULL); \
337 g_free(tmp); \
338 g_free(str); \
339 str = new; \
340 new = NULL; \
342 if (strstr(str, "$LOGIN")) { \
343 tmp = g_strdup(str); \
344 *strstr(tmp, "$LOGIN") = '\0'; \
345 new = g_strconcat(tmp, g_get_user_name(), \
346 strstr(str, "$LOGIN")+strlen("$LOGIN"), \
347 NULL); \
348 g_free(tmp); \
349 g_free(str); \
350 str = new; \
351 new = NULL; \
353 if (strstr(str, "$EMAIL")) { \
354 tmp = g_strdup(str); \
355 *strstr(tmp, "$EMAIL") = '\0'; \
356 new = g_strconcat(tmp, tmpl.email, \
357 strstr(str, "$EMAIL")+strlen("$EMAIL"), \
358 NULL); \
359 g_free(tmp); \
360 g_free(str); \
361 str = new; \
362 new = NULL; \
364 if (strstr(str, "$NAME_MAIL")) { \
365 tmp = g_strdup(str); \
366 *strstr(tmp, "$NAME_MAIL") = '\0'; \
367 new = g_strconcat(tmp, get_name_for_mail(), \
368 strstr(str, "$NAME_MAIL")+strlen("$NAME_MAIL"), \
369 NULL); \
370 g_free(tmp); \
371 g_free(str); \
372 str = new; \
373 new = NULL; \
375 if (strstr(str, "$DEFAULTDOMAIN")) { \
376 tmp = g_strdup(str); \
377 *strstr(tmp, "$DEFAULTDOMAIN") = '\0'; \
378 new = g_strconcat(tmp, wizard_get_default_domain_name(), \
379 strstr(str, "$DEFAULTDOMAIN")+strlen("$DEFAULTDOMAIN"), \
380 NULL); \
381 g_free(tmp); \
382 g_free(str); \
383 str = new; \
384 new = NULL; \
386 if (strstr(str, "$DOMAIN")) { \
387 tmp = g_strdup(str); \
388 *strstr(tmp, "$DOMAIN") = '\0'; \
389 new = g_strconcat(tmp, tmpl.domain, \
390 strstr(str, "$DOMAIN")+strlen("$DOMAIN"), \
391 NULL); \
392 g_free(tmp); \
393 g_free(str); \
394 str = new; \
395 new = NULL; \
399 static void wizard_read_defaults(void)
401 gchar *rcpath;
403 rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, "accountrc.tmpl", NULL);
404 if (!is_file_exist(rcpath)) {
405 str_write_to_file(accountrc_tmpl, rcpath, TRUE);
408 prefs_read_config(template_params, "AccountTemplate", rcpath, NULL);
410 PARSE_DEFAULT(tmpl.domain);
411 PARSE_DEFAULT(tmpl.name);
412 PARSE_DEFAULT(tmpl.email);
413 PARSE_DEFAULT(tmpl.organization);
414 PARSE_DEFAULT(tmpl.smtpserver);
415 PARSE_DEFAULT(tmpl.smtpuser);
416 PARSE_DEFAULT(tmpl.smtppass);
417 PARSE_DEFAULT(tmpl.recvserver);
418 PARSE_DEFAULT(tmpl.recvuser);
419 PARSE_DEFAULT(tmpl.recvpass);
420 PARSE_DEFAULT(tmpl.imapdir);
421 PARSE_DEFAULT(tmpl.mboxfile);
422 PARSE_DEFAULT(tmpl.mailbox);
424 g_print("defaults:"
425 "%s, %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %d, %d\n",
426 tmpl.name,tmpl.domain,tmpl.email,tmpl.organization,tmpl.smtpserver,
427 tmpl.recvtype,tmpl.recvserver,tmpl.recvuser,tmpl.recvpass,
428 tmpl.imapdir,tmpl.mboxfile,tmpl.mailbox,tmpl.smtpssl,tmpl.recvssl);
430 g_free(rcpath);
433 static void initialize_fonts(WizardWindow *wizard)
435 GtkWidget *widget = wizard->email;
436 gint size = pango_font_description_get_size(
437 gtk_widget_get_style(widget)->font_desc)
438 /PANGO_SCALE;
439 gchar *tmp, *new;
440 #ifdef G_OS_WIN32
441 PangoFontDescription *bold_desc;
442 gchar *curfont = pango_font_description_to_string(
443 gtk_widget_get_style(widget)->font_desc);
444 g_free(prefs_common.smallfont);
445 g_free(prefs_common.normalfont);
446 g_free(prefs_common.boldfont);
447 prefs_common.smallfont = g_strdup(curfont);
448 prefs_common.normalfont = g_strdup(curfont);
449 bold_desc = pango_font_description_from_string(curfont);
450 pango_font_description_set_weight(bold_desc, PANGO_WEIGHT_BOLD);
451 prefs_common.boldfont = pango_font_description_to_string(bold_desc);
452 pango_font_description_free(bold_desc);
453 g_free(curfont);
454 #endif
455 tmp = g_strdup(prefs_common.textfont);
456 if (strrchr(tmp, ' ')) {
457 *(strrchr(tmp, ' ')) = '\0';
458 new = g_strdup_printf("%s %d", tmp, size);
459 g_free(prefs_common.textfont);
460 prefs_common.textfont = new;
462 g_free(tmp);
464 tmp = g_strdup(prefs_common.smallfont);
465 if (strrchr(tmp, ' ')) {
466 *(strrchr(tmp, ' ')) = '\0';
467 new = g_strdup_printf("%s %d", tmp, size);
468 g_free(prefs_common.smallfont);
469 prefs_common.smallfont = new;
471 g_free(tmp);
473 tmp = g_strdup(prefs_common.normalfont);
474 if (strrchr(tmp, ' ')) {
475 *(strrchr(tmp, ' ')) = '\0';
476 new = g_strdup_printf("%s %d", tmp, size);
477 g_free(prefs_common.normalfont);
478 prefs_common.normalfont = new;
480 g_free(tmp);
482 tmp = g_strdup(prefs_common.boldfont);
483 if (strrchr(tmp, ' ')) {
484 *(strrchr(tmp, ' ')) = '\0';
485 new = g_strdup_printf("%s %d", tmp, size);
486 g_free(prefs_common.boldfont);
487 prefs_common.boldfont = new;
489 g_free(tmp);
492 #define XFACE "+}Axz@~a,-Yx?0Ysa|q}CLRH=89Y]\"')DSX^<6p\"d)'81yx5%G#u^o*7JG&[aPU0h1Ux.vb2yIjH83{5`/bVo|~nn/i83vE^E)qk-4W)_E.4Y=D*qvf/,Ci_=P<iY<M6"
493 #define FACE "iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAM1BMVEUAAAAcJCI\n\
494 ONl1JUi0+Z4daY2NZciPabV9ykS5kj6Wsl2ybmZOBsMjZxK2wzN3Pzczs7OsCAGN0AAAAAXRSTlM\n\
495 AQObYZgAAAAFiS0dEAIgFHUgAAAIVSURBVEjH1ZbtlqMgDIaFECoGhPu/2s0b0Lais/NzN6d1OJ7\n\
496 3yReQzrL8B5Zy3rvl9At52Pf2tv1vSMjtYj8jaa8XUyI/yn3YD6sigj/2Tf5Bn069MIsTPHvx/t5\n\
497 /3rU/6JCIY3YwGe26r/cwUfE3cFe5T28L0K5rJAUHEeYAQxs8DHojjk3M9wECU4xxjXisI8RA0gy\n\
498 oczJZJOjxiTFZVTchAnIRJrgdmEGDyFfAI3UuG5FmYTkR9RDrIC4H0SqV4pzpEcUp0HNLjwBv+jA\n\
499 dikUE5g9iBvzmu3sH2oDk4lnHd829+2Q9gj6kDqDPg7hsGwBzH02fE3ZCt6ZHmlNKIMjMeRwra5I\n\
500 ecgNoBnLGPmzaHPJIwLY8Sq2M/tLUJfj0QcqmfVXAdLSStIYF8dzWjBBb2VgvDa4mO9oc651OiUo\n\
501 BEKbZokdPATF9E9oKAjQJcJOniaPXrVZRAnVWaqIyqRoNC8ZJvgCcW8XN39RqxVP1rS8Yd4WnCdN\n\
502 aRTo2jJRDbg3vtCpEUGffgDPhqKDaSuVqYtOplFIvIcx3HUI5/MuIWl6vKyBjNlqEru8hbFXqBPA\n\
503 5TpHGIUZOePeaIyzfQ/g9Xg0opU1AvdfXM9floYhv92pPAE96OZtkPV8eivgQi9RTfwPUU36I26n\n\
504 Hy+WuCJzAT7efMSeA1TNf2/VugDz+dN139xfA5ffxGZDD+MvcP/uvyB80wzZ76wbz8gAAAABJRU5\n\
505 ErkJggg=="
507 static void write_welcome_email(WizardWindow *wizard)
509 gchar date[RFC822_DATE_BUFFSIZE];
510 gchar *head=NULL;
511 gchar *body=NULL;
512 gchar *msg=NULL;
513 const gchar *mailbox = gtk_entry_get_text(GTK_ENTRY(wizard->mailbox_name));
514 Folder *folder = folder_find_from_path(mailbox);
515 FolderItem *inbox = folder ? folder->inbox:NULL;
516 gchar *file = get_tmp_file();
517 gchar enc_from_name[BUFFSIZE], enc_to_name[BUFFSIZE], enc_subject[BUFFSIZE];
519 get_rfc822_date(date, sizeof(date));
521 conv_encode_header_full(enc_subject, sizeof(enc_subject),
522 C_("Welcome Mail Subject", "Welcome to Claws Mail"),
523 strlen("Subject: "), FALSE, CS_INTERNAL);
524 conv_encode_header_full(enc_to_name, sizeof(enc_to_name),
525 gtk_entry_get_text(GTK_ENTRY(wizard->full_name)),
526 strlen("To: "), TRUE, CS_INTERNAL);
527 conv_encode_header_full(enc_from_name, sizeof(enc_from_name),
528 _("The Claws Mail Team"),
529 strlen("From: "), TRUE, CS_INTERNAL);
531 head = g_strdup_printf(
532 "From: %s <%s>\n"
533 "To: %s <%s>\n"
534 "Date: %s\n"
535 "Subject: %s\n"
536 "X-Face: %s\n"
537 "Face: %s\n"
538 "Content-Type: text/plain; charset=UTF-8\n",
539 enc_from_name,
540 WELCOME_MSG_ADDR,
541 enc_to_name,
542 gtk_entry_get_text(GTK_ENTRY(wizard->email)),
543 date, enc_subject, XFACE, FACE);
544 body = g_strdup_printf(
545 _("\n"
546 "Welcome to Claws Mail\n"
547 "---------------------\n"
548 "\n"
549 "Now that you have set up your account you can fetch your\n"
550 "mail by clicking the 'Get Mail' button at the left of the\n"
551 "toolbar.\n"
552 "\n"
553 "Claws Mail has lots of extra features accessible via plugins,\n"
554 "like anti-spam filtering and learning (via the Bogofilter or\n"
555 "SpamAssassin plugins), privacy protection (via PGP/Mime), an RSS\n"
556 "aggregator, a calendar, and much more. You can load them from\n"
557 "the menu entry '/Configuration/Plugins'.\n"
558 "\n"
559 "You can change your Account Preferences by using the menu\n"
560 "entry '/Configuration/Preferences for current account'\n"
561 "and change the general Preferences by using\n"
562 "'/Configuration/Preferences'.\n"
563 "\n"
564 "You can find further information in the Claws Mail manual,\n"
565 "which can be accessed by using the menu entry '/Help/Manual'\n"
566 "or online at the URL given below.\n"
567 "\n"
568 "Useful URLs\n"
569 "-----------\n"
570 "Homepage: <%s>\n"
571 "Manual: <%s>\n"
572 "FAQ: <%s>\n"
573 "Themes: <%s>\n"
574 "Mailing Lists: <%s>\n"
575 "\n"
576 "LICENSE\n"
577 "-------\n"
578 "Claws Mail is free software, released under the terms\n"
579 "of the GNU General Public License, version 3 or later, as\n"
580 "published by the Free Software Foundation. The license can\n"
581 "be found at <%s>.\n"
582 "\n"
583 "DONATIONS\n"
584 "---------\n"
585 "If you wish to donate to the Claws Mail project you can do\n"
586 "so at <%s>.\n\n"),
587 HOMEPAGE_URI, MANUAL_URI, FAQ_URI, THEMES_URI, MAILING_LIST_URI,
588 GPL_URI, DONATE_URI);
590 msg = g_strconcat(head, body, NULL);
592 if (inbox && inbox->total_msgs == 0
593 && str_write_to_file(msg, file, TRUE) >= 0) {
594 MsgFlags flags = { MSG_UNREAD|MSG_NEW, 0};
595 folder_item_add_msg(inbox, file, &flags, FALSE);
597 g_free(head);
598 g_free(body);
599 g_free(msg);
600 claws_unlink(file);
602 #undef XFACE
604 static gboolean wizard_write_config(WizardWindow *wizard)
606 static gboolean mailbox_ok = FALSE;
607 PrefsAccount *prefs_account = prefs_account_new();
608 GList *account_list = NULL;
609 gchar *smtp_server, *recv_server;
610 gint smtp_port, recv_port;
611 #ifdef USE_GNUTLS
612 SSLType smtp_ssl_type, recv_ssl_type;
613 #endif
615 prefs_account->protocol = combobox_get_active_data(
616 GTK_COMBO_BOX(wizard->recv_type));
618 if (wizard->create_mailbox && prefs_account->protocol != A_IMAP4 &&
619 !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->mailbox_name)))) {
620 alertpanel_error(_("Please enter the mailbox name."));
621 g_free(prefs_account);
622 gtk_notebook_set_current_page (
623 GTK_NOTEBOOK(wizard->notebook),
624 MAILBOX_PAGE);
625 return FALSE;
628 if (!mailbox_ok) {
629 if (wizard->create_mailbox && prefs_account->protocol != A_IMAP4) {
630 mailbox_ok = setup_write_mailbox_path(wizard->mainwin,
631 gtk_entry_get_text(
632 GTK_ENTRY(wizard->mailbox_name)));
633 } else
634 mailbox_ok = TRUE;
637 if (!mailbox_ok) {
638 /* alertpanel done by setup_write_mailbox_path */
639 g_free(prefs_account);
640 gtk_notebook_set_current_page (
641 GTK_NOTEBOOK(wizard->notebook),
642 MAILBOX_PAGE);
643 return FALSE;
646 if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->full_name)))
647 || !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->email)))) {
648 alertpanel_error(_("Please enter your name and email address."));
649 g_free(prefs_account);
650 gtk_notebook_set_current_page (
651 GTK_NOTEBOOK(wizard->notebook),
652 USER_PAGE);
653 return FALSE;
656 if (prefs_account->protocol != A_LOCAL) {
657 if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->recv_username)))
658 || !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)))) {
659 alertpanel_error(_("Please enter your receiving server "
660 "and username."));
661 g_free(prefs_account);
662 gtk_notebook_set_current_page (
663 GTK_NOTEBOOK(wizard->notebook),
664 RECV_PAGE);
665 return FALSE;
667 } else {
668 if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)))) {
669 alertpanel_error(_("Please enter your username."));
670 g_free(prefs_account);
671 gtk_notebook_set_current_page (
672 GTK_NOTEBOOK(wizard->notebook),
673 RECV_PAGE);
674 return FALSE;
678 if (!strlen(gtk_entry_get_text(GTK_ENTRY(wizard->smtp_server)))) {
679 alertpanel_error(_("Please enter your SMTP server."));
680 g_free(prefs_account);
681 gtk_notebook_set_current_page (
682 GTK_NOTEBOOK(wizard->notebook),
683 SMTP_PAGE);
684 return FALSE;
687 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_auth))) {
688 if (prefs_account->protocol == A_LOCAL
689 && !strlen(gtk_entry_get_text(GTK_ENTRY(wizard->smtp_username)))) {
690 alertpanel_error(_("Please enter your SMTP username."));
691 g_free(prefs_account);
692 gtk_notebook_set_current_page (
693 GTK_NOTEBOOK(wizard->notebook),
694 SMTP_PAGE);
695 return FALSE;
696 } /* if it's not local we'll use the reception server */
699 if (prefs_account->protocol != A_LOCAL)
700 prefs_account->account_name = g_strdup_printf("%s@%s",
701 gtk_entry_get_text(GTK_ENTRY(wizard->recv_username)),
702 gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)));
703 else
704 prefs_account->account_name = g_strdup_printf("%s",
705 gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)));
707 recv_server = g_strdup(gtk_entry_get_text(GTK_ENTRY(wizard->recv_server)));
708 smtp_server = g_strdup(gtk_entry_get_text(GTK_ENTRY(wizard->smtp_server)));
710 if (prefs_account->protocol != A_LOCAL && strstr(recv_server, ":")) {
711 recv_port = atoi(strstr(recv_server, ":")+1);
712 *(strstr(recv_server, ":")) = '\0';
713 if (prefs_account->protocol == A_IMAP4) {
714 prefs_account->set_imapport = TRUE;
715 prefs_account->imapport = recv_port;
716 } else if (prefs_account->protocol == A_POP3) {
717 prefs_account->set_popport = TRUE;
718 prefs_account->popport = recv_port;
721 if (strstr(smtp_server, ":")) {
722 smtp_port = atoi(strstr(smtp_server, ":")+1);
723 *(strstr(smtp_server, ":")) = '\0';
724 prefs_account->set_smtpport = TRUE;
725 prefs_account->smtpport = smtp_port;
728 prefs_account->name = g_strdup(
729 gtk_entry_get_text(GTK_ENTRY(wizard->full_name)));
730 prefs_account->address = g_strdup(
731 gtk_entry_get_text(GTK_ENTRY(wizard->email)));
732 prefs_account->organization = g_strdup(
733 gtk_entry_get_text(GTK_ENTRY(wizard->organization)));
734 prefs_account->smtp_server = g_strdup(smtp_server);
736 if (wizard->create_mailbox && prefs_account->protocol != A_IMAP4) {
737 gchar *tmp;
738 tmp = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(wizard->mailbox_name)));
739 prefs_account->inbox = g_strdup_printf("#mh/%s/inbox",
740 (!strcmp("Mail", gtk_entry_get_text(GTK_ENTRY(wizard->mailbox_name))))
741 ?_("Mailbox"):tmp);
742 g_free(tmp);
743 prefs_account->local_inbox = g_strdup(prefs_account->inbox);
744 } else if (prefs_account->protocol != A_IMAP4) {
745 if (folder_get_default_inbox())
746 prefs_account->local_inbox =
747 folder_item_get_identifier(folder_get_default_inbox());
750 if (prefs_account->protocol != A_LOCAL)
751 prefs_account->recv_server = g_strdup(recv_server);
752 else
753 prefs_account->local_mbox = g_strdup(recv_server);
755 g_free(recv_server);
756 g_free(smtp_server);
758 prefs_account->userid = g_strdup(
759 gtk_entry_get_text(GTK_ENTRY(wizard->recv_username)));
760 prefs_account->smtp_userid = g_strdup(
761 gtk_entry_get_text(GTK_ENTRY(wizard->smtp_username)));
763 passwd_store_set_account(prefs_account->account_id, PWS_ACCOUNT_RECV,
764 gtk_entry_get_text(GTK_ENTRY(wizard->recv_password)),
765 FALSE);
766 passwd_store_set_account(prefs_account->account_id, PWS_ACCOUNT_SEND,
767 gtk_entry_get_text(GTK_ENTRY(wizard->smtp_password)),
768 FALSE);
770 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_auth))) {
771 prefs_account->use_smtp_auth = TRUE;
774 #ifdef USE_GNUTLS
775 smtp_ssl_type = SSL_NONE;
776 recv_ssl_type = SSL_NONE;
778 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_ssl))) {
779 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_tls)))
780 smtp_ssl_type = SSL_STARTTLS;
781 else
782 smtp_ssl_type = SSL_TUNNEL;
784 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->recv_use_ssl))) {
785 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wizard->recv_use_tls)))
786 recv_ssl_type = SSL_STARTTLS;
787 else
788 recv_ssl_type = SSL_TUNNEL;
791 prefs_account->ssl_smtp = smtp_ssl_type;
793 if (prefs_account->protocol == A_IMAP4)
794 prefs_account->ssl_imap = recv_ssl_type;
795 else
796 prefs_account->ssl_pop = recv_ssl_type;
798 prefs_account->out_ssl_client_cert_file = g_strdup(
799 gtk_entry_get_text(GTK_ENTRY(wizard->smtp_ssl_cert_file)));
800 prefs_account->in_ssl_client_cert_file = g_strdup(
801 gtk_entry_get_text(GTK_ENTRY(wizard->recv_ssl_cert_file)));
803 passwd_store_set_account(prefs_account->account_id, PWS_ACCOUNT_SEND_CERT,
804 gtk_entry_get_text(GTK_ENTRY(wizard->smtp_ssl_cert_pass)),
805 FALSE);
806 passwd_store_set_account(prefs_account->account_id, PWS_ACCOUNT_RECV_CERT,
807 gtk_entry_get_text(GTK_ENTRY(wizard->recv_ssl_cert_pass)),
808 FALSE);
809 #endif
811 if (prefs_account->protocol == A_IMAP4) {
812 gchar *directory = gtk_editable_get_chars(
813 GTK_EDITABLE(wizard->recv_imap_subdir), 0, -1);
814 if (directory && strlen(directory)) {
815 prefs_account->imap_dir = g_strdup(directory);
817 prefs_account->imap_subsonly =
818 gtk_toggle_button_get_active(
819 GTK_TOGGLE_BUTTON(wizard->subsonly_checkbtn));
820 g_free(directory);
823 account_list = g_list_append(account_list, prefs_account);
824 prefs_account_write_config_all(account_list);
825 prefs_account_free(prefs_account);
826 account_read_config_all();
828 initialize_fonts(wizard);
829 if (wizard->create_mailbox && prefs_account->protocol != A_IMAP4)
830 write_welcome_email(wizard);
832 #ifndef G_OS_WIN32
833 plugin_load_standard_plugins();
834 #endif
835 return TRUE;
838 static GtkWidget* create_page (WizardWindow *wizard, const char * title)
840 GtkWidget *w;
841 GtkWidget *vbox;
842 GtkWidget *hbox;
843 GtkWidget *image;
844 char *title_string;
846 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
847 gtk_container_set_border_width (GTK_CONTAINER(vbox), 10);
849 /* create the titlebar */
850 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
851 image = priv_pixmap_widget(PRIV_PIXMAP_CLAWS_MAIL_ICON);
852 gtk_box_pack_start (GTK_BOX(hbox), image, FALSE, FALSE, 0);
853 title_string = g_strconcat ("<span size=\"xx-large\" weight=\"ultrabold\">", title ? title : "", "</span>", NULL);
854 w = gtk_label_new (title_string);
855 gtk_label_set_use_markup (GTK_LABEL(w), TRUE);
856 g_free (title_string);
857 gtk_box_pack_start (GTK_BOX(hbox), w, FALSE, FALSE, 0);
859 /* pack the titlebar */
860 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
862 /* pack the separator */
863 gtk_box_pack_start (GTK_BOX(vbox), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 0);
865 return vbox;
868 #define PACK_BOX(hbox,text,entry) { \
869 GtkWidget *label = gtk_label_new(text); \
870 gtk_label_set_use_markup(GTK_LABEL(label), TRUE); \
871 gtk_label_set_xalign(GTK_LABEL(label), 1.0); \
872 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); \
873 gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0); \
876 static gchar *get_default_server(WizardWindow * wizard, const gchar *type)
878 if (!strcmp(type, "smtp")) {
879 if (!tmpl.smtpserver || !strlen(tmpl.smtpserver))
880 return g_strconcat(type, ".", tmpl.domain, NULL);
881 else
882 return g_strdup(tmpl.smtpserver);
883 } else {
884 if (!tmpl.recvserver || !strlen(tmpl.recvserver))
885 return g_strconcat(type, ".", tmpl.domain, NULL);
886 else
887 return g_strdup(tmpl.recvserver);
891 static gchar *get_default_account(WizardWindow * wizard)
893 gchar *result = NULL;
895 if (!tmpl.recvuser || !strlen(tmpl.recvuser)) {
896 result = gtk_editable_get_chars(
897 GTK_EDITABLE(wizard->email), 0, -1);
899 if (strstr(result, "@")) {
900 *(strstr(result,"@")) = '\0';
902 } else {
903 result = g_strdup(tmpl.recvuser);
905 return result;
908 static gchar *get_default_smtp_account(WizardWindow * wizard)
910 gchar *result = NULL;
912 if (!tmpl.smtpuser || !strlen(tmpl.smtpuser)) {
913 return g_strdup("");
914 } else {
915 result = g_strdup(tmpl.smtpuser);
917 return result;
920 static void wizard_email_changed(GtkWidget *widget, gpointer data)
922 WizardWindow *wizard = (WizardWindow *)data;
923 RecvProtocol protocol;
924 gchar *text;
925 protocol = combobox_get_active_data(GTK_COMBO_BOX(wizard->recv_type));
927 text = get_default_server(wizard, "smtp");
928 gtk_entry_set_text(GTK_ENTRY(wizard->smtp_server), text);
929 g_free(text);
931 text = get_default_account(wizard);
932 gtk_entry_set_text(GTK_ENTRY(wizard->recv_username), text);
933 g_free(text);
935 if (protocol == A_POP3) {
936 text = get_default_server(wizard, "pop");
937 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
938 g_free(text);
939 } else if (protocol == A_IMAP4) {
940 text = get_default_server(wizard, "imap");
941 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
942 g_free(text);
943 } else if (protocol == A_LOCAL) {
944 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), tmpl.mboxfile?tmpl.mboxfile:"");
949 static GtkWidget* user_page (WizardWindow * wizard)
951 GtkWidget *table = gtk_grid_new();
952 GtkWidget *vbox;
953 GtkWidget *label;
954 GtkWidget *user_table;
956 gtk_grid_set_row_spacing(GTK_GRID(table), 4);
957 gtk_grid_set_column_spacing(GTK_GRID(table), 8);
959 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW);
960 gtk_container_set_border_width(GTK_CONTAINER(vbox), VSPACING_NARROW_2);
962 gtk_grid_attach(GTK_GRID(table), vbox, 0, 1, 1, 1);
964 user_table = gtk_grid_new();
965 gtk_grid_set_row_spacing(GTK_GRID(user_table), VSPACING_NARROW);
966 gtk_box_pack_start(GTK_BOX(vbox), user_table, FALSE, FALSE, 0);
968 label = gtk_label_new(g_strconcat("<span weight=\"bold\">", _("Your name:"),
969 "</span>", NULL));
970 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
971 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
972 gtk_grid_attach(GTK_GRID(user_table), label, 0, 0, 1, 1);
974 wizard->full_name = gtk_entry_new();
975 gtk_entry_set_text(GTK_ENTRY(wizard->full_name), tmpl.name?tmpl.name:"");
976 gtk_grid_attach(GTK_GRID(user_table), wizard->full_name, 1, 0, 1, 1);
977 gtk_widget_set_hexpand(wizard->full_name, TRUE);
978 gtk_widget_set_halign(wizard->full_name, GTK_ALIGN_FILL);
979 gtk_widget_set_margin_start(wizard->full_name, 4);
981 label = gtk_label_new(g_strconcat("<span weight=\"bold\">", _("Your email address:"),
982 "</span>", NULL));
983 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
984 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
985 gtk_grid_attach(GTK_GRID(user_table), label, 0, 1, 1, 1);
987 wizard->email = gtk_entry_new();
988 gtk_entry_set_text(GTK_ENTRY(wizard->email), tmpl.email?tmpl.email:"");
989 gtk_grid_attach(GTK_GRID(user_table), wizard->email, 1, 1, 1, 1);
990 gtk_widget_set_hexpand(wizard->email, TRUE);
991 gtk_widget_set_halign(wizard->email, GTK_ALIGN_FILL);
992 gtk_widget_set_margin_start(wizard->email, 4);
994 label = gtk_label_new(_("Your organization:"));
995 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
996 gtk_grid_attach(GTK_GRID(user_table), label, 0, 2, 1, 1);
998 wizard->organization = gtk_entry_new();
999 gtk_entry_set_text(GTK_ENTRY(wizard->organization), tmpl.organization?tmpl.organization:"");
1000 gtk_grid_attach(GTK_GRID(user_table), wizard->organization, 1, 2, 1, 1);
1001 gtk_widget_set_hexpand(wizard->organization, TRUE);
1002 gtk_widget_set_halign(wizard->organization, GTK_ALIGN_FILL);
1003 gtk_widget_set_margin_start(wizard->organization, 4);
1005 g_signal_connect(G_OBJECT(wizard->email), "changed",
1006 G_CALLBACK(wizard_email_changed),
1007 wizard);
1008 return table;
1011 static GtkWidget* mailbox_page (WizardWindow * wizard)
1013 GtkWidget *table = gtk_grid_new();
1014 GtkWidget *vbox;
1015 GtkWidget *hbox;
1017 gtk_grid_set_row_spacing(GTK_GRID(table), 4);
1018 gtk_grid_set_column_spacing(GTK_GRID(table), 8);
1020 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW);
1021 gtk_container_set_border_width(GTK_CONTAINER(vbox), VSPACING_NARROW_2);
1023 gtk_grid_attach(GTK_GRID(table), vbox, 0, 1, 1, 1);
1025 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1026 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1028 wizard->mailbox_label = gtk_label_new(g_strconcat("<span weight=\"bold\">",
1029 _("Mailbox name:"), "</span>", NULL));
1030 gtk_label_set_use_markup(GTK_LABEL(wizard->mailbox_label), TRUE);
1031 gtk_label_set_xalign(GTK_LABEL(wizard->mailbox_label), 1.0);
1033 wizard->mailbox_name = gtk_entry_new();
1034 gtk_entry_set_text(GTK_ENTRY(wizard->mailbox_name), tmpl.mailbox?tmpl.mailbox:"");
1036 CLAWS_SET_TIP(wizard->mailbox_name, _("You can also specify an absolute path, for example: "
1037 "\"/home/john/Documents/Mail\""));
1039 gtk_box_pack_start(GTK_BOX(hbox), wizard->mailbox_label, FALSE, FALSE, 0);
1040 gtk_box_pack_start(GTK_BOX(hbox), wizard->mailbox_name, TRUE, TRUE, 0);
1042 return table;
1045 static void smtp_auth_changed (GtkWidget *btn, gpointer data)
1047 WizardWindow *wizard = (WizardWindow *)data;
1048 gboolean do_auth = gtk_toggle_button_get_active(
1049 GTK_TOGGLE_BUTTON(wizard->smtp_auth));
1050 gtk_widget_set_sensitive(wizard->smtp_username, do_auth);
1051 gtk_widget_set_sensitive(wizard->smtp_username_label, do_auth);
1052 gtk_widget_set_sensitive(wizard->smtp_password, do_auth);
1053 gtk_widget_set_sensitive(wizard->smtp_password_label, do_auth);
1056 #ifdef USE_GNUTLS
1057 static void cert_browse_cb(GtkWidget *widget, gpointer data)
1059 GtkEntry *dest = GTK_ENTRY(data);
1060 gchar *filename;
1061 gchar *utf8_filename;
1063 filename = filesel_select_file_open(_("Select certificate file"), NULL);
1064 if (!filename) return;
1066 utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
1067 if (!utf8_filename) {
1068 g_warning("cert_browse_cb(): failed to convert character set");
1069 utf8_filename = g_strdup(filename);
1071 gtk_entry_set_text(dest, utf8_filename);
1072 g_free(utf8_filename);
1074 #endif
1076 static GtkWidget* smtp_page (WizardWindow * wizard)
1078 GtkWidget *table = gtk_grid_new();
1079 GtkWidget *vbox;
1080 GtkWidget *hbox;
1081 GtkWidget *hbox_spc;
1082 GtkWidget *smtp_auth_table;
1083 GtkWidget *label;
1084 #ifdef USE_GNUTLS
1085 GtkWidget *button;
1086 GtkWidget *smtp_cert_table;
1087 #endif
1088 gchar *text;
1090 gtk_grid_set_row_spacing(GTK_GRID(table), 4);
1091 gtk_grid_set_column_spacing(GTK_GRID(table), 8);
1093 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW);
1094 gtk_container_set_border_width(GTK_CONTAINER(vbox), VSPACING_NARROW_2);
1096 gtk_grid_attach(GTK_GRID(table), vbox, 0, 1, 1, 1);
1098 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1099 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1100 wizard->smtp_server = gtk_entry_new();
1101 text = get_default_server(wizard, "smtp");
1102 gtk_entry_set_text(GTK_ENTRY(wizard->smtp_server), text);
1103 g_free(text);
1105 CLAWS_SET_TIP(wizard->smtp_server,
1106 _("You can specify the port number by appending it at the end: "
1107 "\"mail.example.com:25\""));
1109 PACK_BOX(hbox, g_strconcat("<span weight=\"bold\">", _("SMTP server address:"),
1110 "</span>", NULL), wizard->smtp_server);
1112 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1113 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1114 wizard->smtp_auth = gtk_check_button_new_with_label(
1115 _("Use authentication"));
1116 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->smtp_auth),
1117 tmpl.smtpauth);
1118 g_signal_connect(G_OBJECT(wizard->smtp_auth), "toggled",
1119 G_CALLBACK(smtp_auth_changed),
1120 wizard);
1121 gtk_box_pack_start(GTK_BOX(hbox), wizard->smtp_auth, FALSE, FALSE, 0);
1123 label = gtk_label_new(g_strconcat("<span size=\"small\">",
1124 _("(empty to use the same as receive)"), "</span>", NULL));
1125 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
1126 SET_TOGGLE_SENSITIVITY (wizard->smtp_auth, label);
1127 gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0);
1129 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1130 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1131 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1132 gtk_widget_set_size_request (hbox_spc, 12, -1);
1133 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1135 smtp_auth_table = gtk_grid_new();
1136 SET_TOGGLE_SENSITIVITY (wizard->smtp_auth, smtp_auth_table);
1137 gtk_box_pack_start(GTK_BOX(hbox), smtp_auth_table, TRUE, TRUE, 0);
1139 wizard->smtp_username_label = gtk_label_new(_("SMTP username:"));
1140 gtk_label_set_xalign(GTK_LABEL(wizard->smtp_username_label), 1.0);
1141 gtk_grid_attach(GTK_GRID(smtp_auth_table), wizard->smtp_username_label, 0, 0, 1, 1);
1143 text = get_default_smtp_account(wizard);
1144 wizard->smtp_username = gtk_entry_new();
1145 gtk_entry_set_text(GTK_ENTRY(wizard->smtp_username), text);
1146 g_free(text);
1147 gtk_grid_attach(GTK_GRID(smtp_auth_table), wizard->smtp_username, 1, 0, 1, 1);
1148 gtk_widget_set_margin_start(wizard->smtp_username, 4);
1149 gtk_widget_set_margin_bottom(wizard->smtp_username, 4);
1150 gtk_widget_set_hexpand(wizard->smtp_username, TRUE);
1151 gtk_widget_set_halign(wizard->smtp_username, GTK_ALIGN_FILL);
1153 wizard->smtp_password_label = gtk_label_new(_("SMTP password:"));
1154 gtk_label_set_xalign(GTK_LABEL(wizard->smtp_password_label), 1.0);
1155 gtk_grid_attach(GTK_GRID(smtp_auth_table), wizard->smtp_password_label, 0, 1, 1, 1);
1157 wizard->smtp_password = gtk_entry_new();
1158 gtk_entry_set_text(GTK_ENTRY(wizard->smtp_password), tmpl.smtppass?tmpl.smtppass:"");
1159 gtk_entry_set_visibility(GTK_ENTRY(wizard->smtp_password), FALSE);
1160 gtk_grid_attach(GTK_GRID(smtp_auth_table), wizard->smtp_password, 1, 1, 1, 1);
1161 gtk_widget_set_hexpand(wizard->smtp_password, TRUE);
1162 gtk_widget_set_halign(wizard->smtp_password, GTK_ALIGN_FILL);
1163 gtk_widget_set_margin_start(wizard->smtp_password, 4);
1165 #ifdef USE_GNUTLS
1166 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1167 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1168 wizard->smtp_use_ssl = gtk_check_button_new_with_label(
1169 _("Use TLS to connect to SMTP server"));
1170 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_ssl),
1171 tmpl.smtpssl != 0);
1172 gtk_box_pack_start(GTK_BOX(hbox), wizard->smtp_use_ssl, FALSE, FALSE, 0);
1174 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1175 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1176 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1177 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1178 gtk_widget_set_size_request (hbox_spc, 12, -1);
1179 wizard->smtp_use_tls = gtk_check_button_new_with_label(
1180 _("Use STARTTLS command to start encryption"));
1181 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->smtp_use_tls),
1182 tmpl.smtpssl == 2);
1183 gtk_box_pack_start(GTK_BOX(hbox), wizard->smtp_use_tls, FALSE, FALSE, 0);
1184 SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, wizard->smtp_use_tls);
1186 smtp_cert_table = gtk_grid_new();
1187 gtk_box_pack_start (GTK_BOX(vbox), smtp_cert_table, FALSE, FALSE, 4);
1188 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1189 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1190 gtk_widget_set_size_request (hbox_spc, 12, -1);
1191 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1192 label = gtk_label_new(_("Client TLS certificate (optional)"));
1193 gtk_label_set_xalign(GTK_LABEL(label), 0.0);
1194 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1195 gtk_grid_attach(GTK_GRID(smtp_cert_table), hbox, 0, 0, 1, 1);
1197 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1198 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1199 gtk_widget_set_size_request (hbox_spc, 12, -1);
1200 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1201 label = gtk_label_new(_("File:"));
1202 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
1203 gtk_widget_set_margin_start(label, 4);
1204 gtk_widget_set_margin_bottom(label, 4);
1205 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
1206 gtk_grid_attach(GTK_GRID(smtp_cert_table), hbox, 0, 1, 1, 1);
1208 wizard->smtp_ssl_cert_file = gtk_entry_new();
1209 gtk_entry_set_text(GTK_ENTRY(wizard->smtp_ssl_cert_file), tmpl.smtpssl_cert?tmpl.smtpssl_cert:"");
1210 gtk_grid_attach(GTK_GRID(smtp_cert_table), wizard->smtp_ssl_cert_file, 1, 1, 1, 1);
1211 gtk_widget_set_hexpand(wizard->smtp_ssl_cert_file, TRUE);
1212 gtk_widget_set_halign(wizard->smtp_ssl_cert_file, GTK_ALIGN_FILL);
1213 gtk_widget_set_margin_start(wizard->smtp_ssl_cert_file, 4);
1214 gtk_widget_set_margin_end(wizard->smtp_ssl_cert_file, 4);
1215 gtk_widget_set_margin_bottom(wizard->smtp_ssl_cert_file, 4);
1217 button = gtkut_get_browse_file_btn(_("Browse"));
1218 gtk_grid_attach(GTK_GRID(smtp_cert_table), button, 2, 1, 1, 1);
1220 g_signal_connect(G_OBJECT(button), "clicked",
1221 G_CALLBACK(cert_browse_cb), wizard->smtp_ssl_cert_file);
1223 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1224 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1225 gtk_widget_set_size_request (hbox_spc, 12, -1);
1226 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1227 label = gtk_label_new(_("Password:"));
1228 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
1229 gtk_widget_set_margin_start(label, 4);
1230 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
1231 gtk_grid_attach(GTK_GRID(smtp_cert_table), hbox, 0, 2, 1, 1);
1233 wizard->smtp_ssl_cert_pass = gtk_entry_new();
1234 gtk_entry_set_visibility(GTK_ENTRY(wizard->smtp_ssl_cert_pass), FALSE);
1235 gtk_entry_set_text(GTK_ENTRY(wizard->smtp_ssl_cert_pass), tmpl.smtpssl_cert_pass?tmpl.smtpssl_cert_pass:"");
1236 gtk_grid_attach(GTK_GRID(smtp_cert_table), wizard->smtp_ssl_cert_pass, 1, 2, 1, 1);
1237 gtk_widget_set_hexpand(wizard->smtp_ssl_cert_pass, TRUE);
1238 gtk_widget_set_halign(wizard->smtp_ssl_cert_pass, GTK_ALIGN_FILL);
1239 gtk_widget_set_margin_start(wizard->smtp_ssl_cert_pass, 4);
1241 SET_TOGGLE_SENSITIVITY (wizard->smtp_use_ssl, smtp_cert_table);
1242 wizard->smtp_cert_table = smtp_cert_table;
1243 #endif
1244 smtp_auth_changed(NULL, wizard);
1245 return table;
1248 static void wizard_protocol_change(WizardWindow *wizard, RecvProtocol protocol)
1250 gchar *text;
1252 if (protocol == A_POP3) {
1253 text = get_default_server(wizard, "pop");
1254 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
1255 gtk_widget_hide(wizard->recv_imap_label);
1256 gtk_widget_hide(wizard->recv_imap_subdir);
1257 gtk_widget_hide(wizard->subsonly_checkbtn);
1258 gtk_widget_show(wizard->recv_username);
1259 gtk_widget_show(wizard->recv_password);
1260 gtk_widget_show(wizard->recv_username_label);
1261 gtk_widget_show(wizard->recv_password_label);
1262 gtk_widget_hide(wizard->no_imap_warning);
1263 #ifdef USE_GNUTLS
1264 gtk_widget_show(wizard->recv_use_ssl);
1265 gtk_widget_show(wizard->recv_use_tls);
1266 gtk_widget_show(wizard->recv_cert_table);
1267 #endif
1268 #if defined USE_GNUTLS
1269 gtk_widget_show(wizard->auto_configure_btn);
1270 gtk_widget_hide(wizard->auto_configure_cancel_btn);
1271 gtk_widget_show(wizard->auto_configure_lbl);
1272 #endif
1273 gtk_label_set_text(GTK_LABEL(wizard->recv_label),
1274 g_strconcat("<span weight=\"bold\">", _("Server address:"),
1275 "</span>", NULL));
1276 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1277 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
1278 g_free(text);
1279 if (wizard->create_mailbox) {
1280 gtk_widget_show(wizard->mailbox_label);
1281 gtk_widget_show(wizard->mailbox_name);
1283 } else if (protocol == A_IMAP4) {
1284 #ifdef HAVE_LIBETPAN
1285 text = get_default_server(wizard, "imap");
1286 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
1287 gtk_widget_show(wizard->recv_imap_label);
1288 gtk_widget_show(wizard->recv_imap_subdir);
1289 gtk_widget_show(wizard->subsonly_checkbtn);
1290 gtk_widget_show(wizard->recv_username);
1291 gtk_widget_show(wizard->recv_password);
1292 gtk_widget_show(wizard->recv_username_label);
1293 gtk_widget_show(wizard->recv_password_label);
1294 gtk_widget_hide(wizard->no_imap_warning);
1295 #ifdef USE_GNUTLS
1296 gtk_widget_show(wizard->recv_use_ssl);
1297 gtk_widget_show(wizard->recv_use_tls);
1298 gtk_widget_show(wizard->recv_cert_table);
1299 #endif
1300 #if defined USE_GNUTLS
1301 gtk_widget_show(wizard->auto_configure_btn);
1302 gtk_widget_hide(wizard->auto_configure_cancel_btn);
1303 gtk_widget_show(wizard->auto_configure_lbl);
1304 #endif
1305 gtk_label_set_text(GTK_LABEL(wizard->recv_label),
1306 g_strconcat("<span weight=\"bold\">", _("Server address:"),
1307 "</span>", NULL));
1308 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1309 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
1310 g_free(text);
1311 if (wizard->create_mailbox) {
1312 gtk_widget_hide(wizard->mailbox_label);
1313 gtk_widget_hide(wizard->mailbox_name);
1315 #else
1316 gtk_widget_hide(wizard->recv_imap_label);
1317 gtk_widget_hide(wizard->recv_imap_subdir);
1318 gtk_widget_hide(wizard->subsonly_checkbtn);
1319 gtk_widget_hide(wizard->recv_username);
1320 gtk_widget_hide(wizard->recv_password);
1321 gtk_widget_hide(wizard->recv_username_label);
1322 gtk_widget_hide(wizard->recv_password_label);
1323 gtk_widget_show(wizard->no_imap_warning);
1324 if (wizard->create_mailbox) {
1325 gtk_widget_hide(wizard->mailbox_label);
1326 gtk_widget_hide(wizard->mailbox_name);
1328 #ifdef USE_GNUTLS
1329 gtk_widget_hide(wizard->recv_use_ssl);
1330 gtk_widget_hide(wizard->recv_use_tls);
1331 gtk_widget_hide(wizard->recv_cert_table);
1332 #endif
1333 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, FALSE);
1334 #endif
1335 } else if (protocol == A_LOCAL) {
1336 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), tmpl.mboxfile?tmpl.mboxfile:"");
1337 gtk_label_set_text(GTK_LABEL(wizard->recv_label),
1338 g_strconcat("<span weight=\"bold\">", _("Local mailbox:"),
1339 "</span>", NULL));
1340 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1341 gtk_widget_hide(wizard->no_imap_warning);
1342 gtk_widget_hide(wizard->recv_imap_label);
1343 gtk_widget_hide(wizard->recv_imap_subdir);
1344 gtk_widget_hide(wizard->subsonly_checkbtn);
1345 gtk_widget_hide(wizard->recv_username);
1346 gtk_widget_hide(wizard->recv_password);
1347 gtk_widget_hide(wizard->recv_username_label);
1348 gtk_widget_hide(wizard->recv_password_label);
1349 #if defined USE_GNUTLS
1350 gtk_widget_hide(wizard->auto_configure_btn);
1351 gtk_widget_hide(wizard->auto_configure_cancel_btn);
1352 gtk_widget_hide(wizard->auto_configure_lbl);
1353 #endif
1354 #ifdef USE_GNUTLS
1355 gtk_widget_hide(wizard->recv_use_ssl);
1356 gtk_widget_hide(wizard->recv_use_tls);
1357 gtk_widget_hide(wizard->recv_cert_table);
1358 #endif
1359 if (wizard->create_mailbox) {
1360 gtk_widget_show(wizard->mailbox_label);
1361 gtk_widget_show(wizard->mailbox_name);
1363 gtk_dialog_set_response_sensitive (GTK_DIALOG(wizard->window), GO_FORWARD, TRUE);
1367 static void wizard_protocol_changed(GtkComboBox *combo, gpointer data)
1369 WizardWindow *wizard = (WizardWindow *)data;
1370 RecvProtocol protocol = combobox_get_active_data(combo);
1372 wizard_protocol_change(wizard, protocol);
1375 #if defined USE_GNUTLS
1376 static void auto_configure_cb (GtkWidget *widget, gpointer data)
1378 gchar *address = NULL;
1379 AutoConfigureData *recv_data;
1380 AutoConfigureData *send_data;
1381 static GCancellable *recv_cancel = NULL;
1382 static GCancellable *send_cancel = NULL;
1383 WizardWindow *wizard = (WizardWindow *)data;
1384 RecvProtocol protocol = combobox_get_active_data(GTK_COMBO_BOX(wizard->recv_type));
1386 if (!recv_cancel) {
1387 recv_cancel = g_cancellable_new();
1388 send_cancel = g_cancellable_new();
1391 if (widget == wizard->auto_configure_cancel_btn) {
1392 g_cancellable_cancel(recv_cancel);
1393 g_cancellable_cancel(send_cancel);
1394 g_object_unref(recv_cancel);
1395 g_object_unref(send_cancel);
1396 recv_cancel = NULL;
1397 send_cancel = NULL;
1398 return;
1401 address = gtk_editable_get_chars(GTK_EDITABLE(wizard->email), 0, -1);
1403 if (strchr(address, '@') == NULL) {
1404 g_free(address);
1405 gtk_label_set_text(GTK_LABEL(wizard->auto_configure_lbl),
1406 _("Failed (wrong address)"));
1407 return;
1410 if (protocol == A_POP3 || protocol == A_IMAP4) {
1411 recv_data = g_new0(AutoConfigureData, 1);
1412 recv_data->configure_button = GTK_BUTTON(wizard->auto_configure_btn);
1413 recv_data->cancel_button = GTK_BUTTON(wizard->auto_configure_cancel_btn);
1414 recv_data->info_label = GTK_LABEL(wizard->auto_configure_lbl);
1415 recv_data->uid_entry = GTK_ENTRY(wizard->recv_username);
1416 recv_data->cancel = recv_cancel;
1417 switch(protocol) {
1418 case A_POP3:
1419 recv_data->ssl_service = "pop3s";
1420 recv_data->tls_service = "pop3";
1421 recv_data->address = g_strdup(address);
1422 recv_data->hostname_entry = GTK_ENTRY(wizard->recv_server);
1423 recv_data->set_port = NULL;
1424 recv_data->port = NULL;
1425 recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_tls);
1426 recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_ssl);
1427 recv_data->default_port = 110;
1428 recv_data->default_ssl_port = 995;
1429 break;
1430 case A_IMAP4:
1431 recv_data->ssl_service = "imaps";
1432 recv_data->tls_service = "imap";
1433 recv_data->address = g_strdup(address);
1434 recv_data->hostname_entry = GTK_ENTRY(wizard->recv_server);
1435 recv_data->set_port = NULL;
1436 recv_data->port = NULL;
1437 recv_data->tls_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_tls);
1438 recv_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(wizard->recv_use_ssl);
1439 recv_data->default_port = 143;
1440 recv_data->default_ssl_port = 993;
1441 break;
1442 default:
1443 cm_return_if_fail(FALSE);
1445 auto_configure_service(recv_data);
1448 send_data = g_new0(AutoConfigureData, 1);
1449 send_data->configure_button = GTK_BUTTON(wizard->auto_configure_btn);
1450 send_data->cancel_button = GTK_BUTTON(wizard->auto_configure_cancel_btn);
1451 send_data->info_label = GTK_LABEL(wizard->auto_configure_lbl);
1452 send_data->cancel = send_cancel;
1454 send_data->ssl_service = NULL;
1455 send_data->tls_service = "submission";
1456 send_data->address = g_strdup(address);
1457 send_data->hostname_entry = GTK_ENTRY(wizard->smtp_server);
1458 send_data->set_port = NULL;
1459 send_data->port = NULL;
1460 send_data->tls_checkbtn = GTK_TOGGLE_BUTTON(wizard->smtp_use_tls);
1461 send_data->ssl_checkbtn = GTK_TOGGLE_BUTTON(wizard->smtp_use_ssl);
1462 send_data->default_port = 25;
1463 send_data->default_ssl_port = -1;
1464 send_data->auth_checkbtn = GTK_TOGGLE_BUTTON(wizard->smtp_auth);
1466 auto_configure_service(send_data);
1468 g_free(address);
1470 #endif
1472 static GtkWidget* recv_page (WizardWindow * wizard)
1474 GtkWidget *table = gtk_grid_new();
1475 GtkWidget *vbox;
1476 GtkWidget *hbox;
1477 GtkWidget *hbox_spc;
1478 GtkWidget *recv_table;
1479 GtkWidget *label;
1480 #ifdef USE_GNUTLS
1481 GtkWidget *button;
1482 GtkWidget *recv_cert_table;
1483 #endif
1484 #if defined USE_GNUTLS
1485 GtkWidget *auto_configure_btn;
1486 GtkWidget *auto_configure_cancel_btn;
1487 GtkWidget *auto_configure_lbl;
1488 #endif
1489 GtkListStore *store;
1490 GtkTreeIter iter;
1491 gchar *text;
1492 gint index = 0;
1494 gtk_grid_set_row_spacing(GTK_GRID(table), 4);
1495 gtk_grid_set_column_spacing(GTK_GRID(table), 8);
1497 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW);
1498 gtk_container_set_border_width(GTK_CONTAINER(vbox), VSPACING_NARROW_2);
1500 gtk_grid_attach(GTK_GRID(table), vbox, 0, 1, 1, 1);
1502 recv_table = gtk_grid_new();
1504 gtk_box_pack_start(GTK_BOX(vbox), recv_table, FALSE, FALSE, 0);
1506 label = gtk_label_new(g_strconcat("<span weight=\"bold\">", _("Server type:"), "</span>", NULL));
1507 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
1508 gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
1509 gtk_grid_attach(GTK_GRID(recv_table), label, 0, 0, 1, 1);
1511 wizard->recv_type = gtkut_sc_combobox_create(NULL, FALSE);
1512 store = GTK_LIST_STORE(gtk_combo_box_get_model(
1513 GTK_COMBO_BOX(wizard->recv_type)));
1515 COMBOBOX_ADD(store, _("POP3"), A_POP3);
1516 COMBOBOX_ADD(store, _("IMAP"), A_IMAP4);
1517 COMBOBOX_ADD(store, _("Local mbox file"), A_LOCAL);
1519 switch(tmpl.recvtype) {
1520 case A_POP3:
1521 index = 0;
1522 break;
1523 case A_IMAP4:
1524 index = 1;
1525 break;
1526 case A_LOCAL:
1527 index = 2;
1528 break;
1529 default:
1530 index = 0;
1532 gtk_combo_box_set_active(GTK_COMBO_BOX (wizard->recv_type), index);
1533 gtk_widget_set_margin_start(wizard->recv_type, 4);
1534 g_signal_connect(G_OBJECT(wizard->recv_type), "changed",
1535 G_CALLBACK(wizard_protocol_changed),
1536 wizard);
1537 gtk_grid_attach(GTK_GRID(recv_table), wizard->recv_type, 1, 0, 1, 1);
1539 #if defined USE_GNUTLS
1540 auto_configure_btn = gtk_button_new_with_label(_("Auto-configure"));
1541 auto_configure_cancel_btn = gtk_button_new_with_label(_("Cancel"));
1542 gtk_grid_attach(GTK_GRID(recv_table), auto_configure_btn, 0, 1, 1, 1);
1544 auto_configure_lbl = gtk_label_new("");
1545 gtk_label_set_xalign(GTK_LABEL(auto_configure_lbl), 0.0);
1546 gtk_grid_attach(GTK_GRID(recv_table), auto_configure_lbl, 1, 1, 1, 1);
1548 gtk_widget_show(auto_configure_btn);
1549 gtk_widget_show(auto_configure_lbl);
1550 wizard->auto_configure_lbl = auto_configure_lbl;
1551 wizard->auto_configure_btn = auto_configure_btn;
1552 wizard->auto_configure_cancel_btn = auto_configure_cancel_btn;
1553 g_signal_connect (G_OBJECT (auto_configure_btn), "clicked",
1554 G_CALLBACK (auto_configure_cb), wizard);
1555 g_signal_connect (G_OBJECT (auto_configure_cancel_btn), "clicked",
1556 G_CALLBACK (auto_configure_cb), wizard);
1557 #endif
1559 wizard->recv_label = gtk_label_new(g_strconcat("<span weight=\"bold\">",
1560 _("Server address:"), "</span>", NULL));
1561 gtk_label_set_xalign(GTK_LABEL(wizard->recv_label), 1.0);
1562 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_label), TRUE);
1563 gtk_grid_attach(GTK_GRID(recv_table), wizard->recv_label, 0, 2, 1, 1);
1565 wizard->recv_server = gtk_entry_new();
1566 text = get_default_server(wizard, "pop");
1567 gtk_entry_set_text(GTK_ENTRY(wizard->recv_server), text);
1568 gtk_widget_set_margin_start(wizard->recv_server, 4);
1569 gtk_widget_set_margin_bottom(wizard->recv_server, 4);
1570 g_free(text);
1572 CLAWS_SET_TIP(wizard->recv_server,
1573 _("You can specify the port number by appending it at the end: "
1574 "\"mail.example.com:110\""));
1575 gtk_grid_attach(GTK_GRID(recv_table), wizard->recv_server, 1, 2, 1, 1);
1576 gtk_widget_set_hexpand(wizard->recv_server, TRUE);
1577 gtk_widget_set_halign(wizard->recv_server, GTK_ALIGN_FILL);
1579 wizard->recv_username_label = gtk_label_new(g_strconcat("<span weight=\"bold\">",
1580 _("Username:"),"</span>", NULL));
1581 gtk_label_set_xalign(GTK_LABEL(wizard->recv_username_label), 1.0);
1582 gtk_label_set_use_markup(GTK_LABEL(wizard->recv_username_label), TRUE);
1583 gtk_grid_attach(GTK_GRID(recv_table), wizard->recv_username_label, 0, 3, 1, 1);
1585 wizard->recv_username = gtk_entry_new();
1586 text = get_default_account(wizard);
1587 gtk_entry_set_text(GTK_ENTRY(wizard->recv_username), text);
1588 g_free(text);
1589 gtk_grid_attach(GTK_GRID(recv_table), wizard->recv_username, 1, 3, 1, 1);
1590 gtk_widget_set_hexpand(wizard->recv_username, TRUE);
1591 gtk_widget_set_halign(wizard->recv_username, GTK_ALIGN_FILL);
1592 gtk_widget_set_margin_start(wizard->recv_username, 4);
1593 gtk_widget_set_margin_bottom(wizard->recv_username, 4);
1595 wizard->recv_password_label = gtk_label_new(_("Password:"));
1596 gtk_label_set_xalign(GTK_LABEL(wizard->recv_password_label), 1.0);
1597 gtk_grid_attach(GTK_GRID(recv_table), wizard->recv_password_label, 0, 4, 1, 1);
1599 wizard->recv_password = gtk_entry_new();
1600 gtk_entry_set_text(GTK_ENTRY(wizard->recv_password), tmpl.recvpass?tmpl.recvpass:"");
1601 gtk_entry_set_visibility(GTK_ENTRY(wizard->recv_password), FALSE);
1602 gtk_grid_attach(GTK_GRID(recv_table), wizard->recv_password, 1, 4, 1, 1);
1603 gtk_widget_set_hexpand(wizard->recv_password, TRUE);
1604 gtk_widget_set_halign(wizard->recv_password, GTK_ALIGN_FILL);
1605 gtk_widget_set_margin_start(wizard->recv_password, 4);
1608 #ifdef USE_GNUTLS
1609 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1610 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1611 wizard->recv_use_ssl = gtk_check_button_new_with_label(
1612 _("Use TLS to connect to receiving server"));
1613 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->recv_use_ssl),
1614 tmpl.recvssl != 0);
1615 gtk_box_pack_start(GTK_BOX(hbox), wizard->recv_use_ssl, FALSE, FALSE, 0);
1617 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1618 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1619 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1620 gtk_widget_set_size_request (hbox_spc, 12, -1);
1621 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1622 wizard->recv_use_tls = gtk_check_button_new_with_label(
1623 _("Use STARTTLS command to start encryption"));
1624 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->recv_use_tls),
1625 tmpl.recvssl == 2);
1626 gtk_box_pack_start(GTK_BOX(hbox), wizard->recv_use_tls, FALSE, FALSE, 0);
1627 SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, wizard->recv_use_tls);
1629 recv_cert_table = gtk_grid_new();
1631 gtk_box_pack_start (GTK_BOX(vbox), recv_cert_table, FALSE, FALSE, 4);
1632 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1633 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1634 gtk_widget_set_size_request (hbox_spc, 12, -1);
1635 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1636 label = gtk_label_new(_("Client TLS certificate (optional)"));
1637 gtk_label_set_xalign(GTK_LABEL(label), 0.0);
1638 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1639 gtk_grid_attach(GTK_GRID(recv_cert_table), hbox, 0, 0, 1, 1);
1641 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1642 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1643 gtk_widget_set_size_request (hbox_spc, 12, -1);
1644 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1646 label = gtk_label_new(_("File:"));
1647 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
1648 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
1649 gtk_grid_attach(GTK_GRID(recv_cert_table), hbox, 0, 1, 1, 1);
1650 wizard->recv_ssl_cert_file = gtk_entry_new();
1651 gtk_entry_set_text(GTK_ENTRY(wizard->recv_ssl_cert_file), tmpl.recvssl_cert?tmpl.recvssl_cert:"");
1652 gtk_grid_attach(GTK_GRID(recv_cert_table), wizard->recv_ssl_cert_file, 1, 1, 1, 1);
1653 gtk_widget_set_hexpand(wizard->recv_ssl_cert_file, TRUE);
1654 gtk_widget_set_halign(wizard->recv_ssl_cert_file, GTK_ALIGN_FILL);
1655 gtk_widget_set_margin_start(wizard->recv_ssl_cert_file, 4);
1656 gtk_widget_set_margin_end(wizard->recv_ssl_cert_file, 4);
1657 gtk_widget_set_margin_bottom(wizard->recv_ssl_cert_file, 4);
1659 button = gtkut_get_browse_file_btn(_("Browse"));
1660 gtk_grid_attach(GTK_GRID(recv_cert_table), button, 2, 1, 1, 1);
1662 g_signal_connect(G_OBJECT(button), "clicked",
1663 G_CALLBACK(cert_browse_cb), wizard->recv_ssl_cert_file);
1665 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1666 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1667 gtk_widget_set_size_request (hbox_spc, 12, -1);
1668 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1669 label = gtk_label_new(_("Password:"));
1670 gtk_label_set_xalign(GTK_LABEL(label), 1.0);
1671 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
1672 gtk_grid_attach(GTK_GRID(recv_cert_table), hbox, 0, 2, 1, 1);
1674 wizard->recv_ssl_cert_pass = gtk_entry_new();
1675 gtk_entry_set_visibility(GTK_ENTRY(wizard->recv_ssl_cert_pass), FALSE);
1676 gtk_entry_set_text(GTK_ENTRY(wizard->recv_ssl_cert_pass), tmpl.recvssl_cert_pass?tmpl.recvssl_cert_pass:"");
1677 gtk_grid_attach(GTK_GRID(recv_cert_table), wizard->recv_ssl_cert_pass, 1, 2, 1, 1);
1678 gtk_widget_set_hexpand(wizard->recv_ssl_cert_pass, TRUE);
1679 gtk_widget_set_halign(wizard->recv_ssl_cert_pass, GTK_ALIGN_FILL);
1680 gtk_widget_set_margin_start(wizard->recv_ssl_cert_pass, 4);
1681 gtk_widget_set_margin_bottom(wizard->recv_ssl_cert_pass, 4);
1683 SET_TOGGLE_SENSITIVITY (wizard->recv_use_ssl, recv_cert_table);
1684 wizard->recv_cert_table = recv_cert_table;
1685 #endif
1686 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1687 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1688 wizard->recv_imap_subdir = gtk_entry_new();
1689 gtk_entry_set_text(GTK_ENTRY(wizard->recv_imap_subdir), tmpl.imapdir?tmpl.imapdir:"");
1690 wizard->recv_imap_label = gtk_label_new(_("IMAP server directory:"));
1691 gtk_label_set_xalign(GTK_LABEL(wizard->recv_imap_label), 1.0);
1692 gtk_box_pack_start(GTK_BOX(hbox), wizard->recv_imap_label, FALSE, FALSE, 0);
1693 gtk_box_pack_start(GTK_BOX(hbox), wizard->recv_imap_subdir, TRUE, TRUE, 0);
1695 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1696 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1697 hbox_spc = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1698 gtk_widget_set_size_request (hbox_spc, 12, -1);
1699 gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1700 wizard->subsonly_checkbtn = gtk_check_button_new_with_label(
1701 _("Show only subscribed folders"));
1702 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wizard->subsonly_checkbtn),
1703 tmpl.subsonly);
1704 gtk_box_pack_start(GTK_BOX(hbox), wizard->subsonly_checkbtn, FALSE, FALSE, 0);
1706 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW);
1707 gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
1708 wizard->no_imap_warning = gtk_label_new(g_strconcat("<span weight=\"bold\">",
1709 _("Warning: this version of Claws Mail\n"
1710 "has been built without IMAP support."), "</span>", NULL));
1711 gtk_label_set_use_markup(GTK_LABEL(wizard->no_imap_warning), TRUE);
1712 gtk_box_pack_start(GTK_BOX(hbox), wizard->no_imap_warning, FALSE, FALSE, 0);
1714 return table;
1717 static void
1718 wizard_response_cb (GtkDialog * dialog, int response, gpointer data)
1720 WizardWindow * wizard = (WizardWindow *)data;
1721 int current_page, num_pages;
1722 gboolean skip_mailbox_page = FALSE;
1723 gint protocol = combobox_get_active_data(GTK_COMBO_BOX(wizard->recv_type));
1725 if (protocol == A_IMAP4) {
1726 skip_mailbox_page = TRUE;
1729 num_pages = g_slist_length(wizard->pages);
1731 current_page = gtk_notebook_get_current_page (
1732 GTK_NOTEBOOK(wizard->notebook));
1733 if (response == CANCEL)
1735 wizard->result = FALSE;
1736 wizard->finished = TRUE;
1737 gtk_widget_destroy (GTK_WIDGET(dialog));
1739 else if (response == FINISHED)
1741 if (!wizard_write_config(wizard)) {
1742 current_page = gtk_notebook_get_current_page (
1743 GTK_NOTEBOOK(wizard->notebook));
1744 goto set_sens;
1746 wizard->result = TRUE;
1747 wizard->finished = TRUE;
1748 gtk_widget_destroy (GTK_WIDGET(dialog));
1750 else
1752 if (response == GO_BACK)
1754 if (current_page > 0) {
1755 current_page--;
1756 if (current_page == MAILBOX_PAGE && skip_mailbox_page) {
1757 /* mailbox */
1758 current_page--;
1760 gtk_notebook_set_current_page (
1761 GTK_NOTEBOOK(wizard->notebook),
1762 current_page);
1765 else if (response == GO_FORWARD)
1767 if (current_page < (num_pages-1)) {
1768 current_page++;
1769 if (current_page == MAILBOX_PAGE && skip_mailbox_page) {
1770 /* mailbox */
1771 current_page++;
1773 gtk_notebook_set_current_page (
1774 GTK_NOTEBOOK(wizard->notebook),
1775 current_page);
1778 set_sens:
1779 gtk_dialog_set_response_sensitive (dialog, GO_BACK,
1780 current_page > 0);
1781 gtk_dialog_set_response_sensitive (dialog, GO_FORWARD,
1782 current_page < (num_pages - 1));
1783 if (current_page == (num_pages -1)) {
1784 gtk_dialog_set_response_sensitive (dialog, FINISHED, TRUE);
1785 gtk_dialog_set_default_response(GTK_DIALOG(wizard->window), FINISHED);
1786 } else {
1787 gtk_dialog_set_response_sensitive (dialog, FINISHED, FALSE);
1788 gtk_dialog_set_default_response(GTK_DIALOG(wizard->window), GO_FORWARD);
1794 static gint wizard_close_cb(GtkWidget *widget, GdkEventAny *event,
1795 gpointer data)
1797 WizardWindow *wizard = (WizardWindow *)data;
1798 wizard->result = FALSE;
1799 wizard->finished = TRUE;
1801 return FALSE;
1804 #define PACK_WARNING(text) { \
1805 label = gtk_label_new(text); \
1806 gtk_label_set_xalign(GTK_LABEL(label), 0.0); \
1807 gtk_label_set_yalign(GTK_LABEL(label), 0.0); \
1808 gtk_box_pack_end(GTK_BOX(widget), label, FALSE, FALSE, 0); \
1811 gboolean run_wizard(MainWindow *mainwin, gboolean create_mailbox) {
1812 WizardWindow *wizard = g_new0(WizardWindow, 1);
1813 GtkWidget *page;
1814 GtkWidget *widget;
1815 GtkWidget *label;
1816 GtkWidget *scrolled_window;
1817 gchar *text;
1818 GSList *cur;
1819 gboolean result;
1820 gint i = 0;
1821 wizard->mainwin = mainwin;
1822 wizard->create_mailbox = create_mailbox;
1824 gtk_widget_hide(mainwin->window);
1826 wizard_read_defaults();
1828 wizard->window = gtk_dialog_new_with_buttons (_("Claws Mail Setup Wizard"),
1829 NULL, 0,
1830 _("_Previous"), GO_BACK,
1831 _("_Next"), GO_FORWARD,
1832 _("_Save"), FINISHED,
1833 _("_Cancel"), CANCEL,
1834 NULL);
1835 gtk_window_set_position(GTK_WINDOW(wizard->window), GTK_WIN_POS_CENTER);
1836 gtk_window_set_default_size(GTK_WINDOW(wizard->window), 550, 500);
1838 g_signal_connect(wizard->window, "response",
1839 G_CALLBACK(wizard_response_cb), wizard);
1840 gtk_widget_realize(wizard->window);
1841 gtk_dialog_set_default_response(GTK_DIALOG(wizard->window),
1842 GO_FORWARD);
1843 gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window),
1844 GO_BACK, FALSE);
1845 gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window),
1846 GO_FORWARD, TRUE);
1847 gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window),
1848 FINISHED, FALSE);
1849 gtk_dialog_set_response_sensitive(GTK_DIALOG(wizard->window),
1850 CANCEL, TRUE);
1852 wizard->notebook = gtk_notebook_new();
1853 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(wizard->notebook), FALSE);
1854 gtk_notebook_set_show_border(GTK_NOTEBOOK(wizard->notebook), FALSE);
1855 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(wizard->window))),
1856 wizard->notebook, TRUE, TRUE, 0);
1858 wizard->pages = NULL;
1860 /*welcome page: 0 */
1861 WELCOME_PAGE = i;
1862 page = create_page(wizard, _("Welcome to Claws Mail"));
1864 wizard->pages = g_slist_append(wizard->pages, page);
1865 widget = priv_pixmap_widget(PRIV_PIXMAP_CLAWS_MAIL_LOGO);
1867 gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1869 text = g_strdup(_("Welcome to the Claws Mail setup wizard.\n\n"
1870 "We will begin by defining some basic "
1871 "information about you and your most common "
1872 "mail options so that you can start to use "
1873 "Claws Mail in less than five minutes."));
1874 widget = gtk_label_new(text);
1875 gtk_label_set_line_wrap(GTK_LABEL(widget), TRUE);
1876 gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1877 g_free(text);
1879 /* user page: 1 */
1880 i++;
1881 USER_PAGE = i;
1882 widget = create_page (wizard, _("About You"));
1883 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
1884 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
1885 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1886 gtk_box_pack_start(GTK_BOX(widget), scrolled_window, TRUE, TRUE, 0);
1888 gtk_container_add(GTK_CONTAINER(scrolled_window), user_page(wizard));
1889 PACK_WARNING(_("Bold fields must be completed"));
1891 wizard->pages = g_slist_append(wizard->pages, widget);
1893 /* recv+auth page: 2 */
1894 i++;
1895 RECV_PAGE = i;
1896 widget = create_page (wizard, _("Receiving mail"));
1897 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
1898 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
1899 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1900 gtk_box_pack_start(GTK_BOX(widget), scrolled_window, TRUE, TRUE, 0);
1902 gtk_container_add(GTK_CONTAINER(scrolled_window), recv_page(wizard));
1903 PACK_WARNING(_("Bold fields must be completed"));
1905 wizard->pages = g_slist_append(wizard->pages, widget);
1907 /*smtp page: 3 */
1908 i++;
1909 SMTP_PAGE = i;
1910 widget = create_page (wizard, _("Sending mail"));
1911 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
1912 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
1913 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1914 gtk_box_pack_start(GTK_BOX(widget), scrolled_window, TRUE, TRUE, 0);
1916 gtk_container_add(GTK_CONTAINER(scrolled_window), smtp_page(wizard));
1917 PACK_WARNING(_("Bold fields must be completed"));
1919 wizard->pages = g_slist_append(wizard->pages, widget);
1921 /* mailbox page: 4 */
1922 if (create_mailbox) {
1923 i++;
1924 MAILBOX_PAGE = i;
1925 widget = create_page (wizard, _("Saving mail on disk"));
1926 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
1927 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
1928 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1929 gtk_box_pack_start(GTK_BOX(widget), scrolled_window, TRUE, TRUE, 0);
1931 gtk_container_add(GTK_CONTAINER(scrolled_window), mailbox_page(wizard));
1932 PACK_WARNING(_("Bold fields must be completed"));
1934 wizard->pages = g_slist_append(wizard->pages, widget);
1937 /* done page: 6 */
1938 i++;
1939 DONE_PAGE = i;
1940 page = create_page(wizard, _("Configuration finished"));
1942 wizard->pages = g_slist_append(wizard->pages, page);
1943 widget = priv_pixmap_widget(PRIV_PIXMAP_CLAWS_MAIL_LOGO);
1945 gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1947 text = g_strdup(_("Claws Mail is now ready.\n"
1948 "Click Save to start."));
1949 widget = gtk_label_new(text);
1950 gtk_box_pack_start (GTK_BOX(page), widget, FALSE, FALSE, 0);
1951 g_free(text);
1954 for (cur = wizard->pages; cur && cur->data; cur = cur->next) {
1955 gtk_notebook_append_page (GTK_NOTEBOOK(wizard->notebook),
1956 GTK_WIDGET(cur->data), NULL);
1959 g_signal_connect(G_OBJECT(wizard->window), "delete_event",
1960 G_CALLBACK(wizard_close_cb), wizard);
1961 gtk_widget_show_all (wizard->window);
1963 gtk_widget_hide(wizard->recv_imap_label);
1964 gtk_widget_hide(wizard->recv_imap_subdir);
1965 gtk_widget_hide(wizard->subsonly_checkbtn);
1966 #if defined USE_GNUTLS
1967 gtk_widget_hide(wizard->auto_configure_cancel_btn);
1968 #endif
1969 wizard_protocol_change(wizard, tmpl.recvtype);
1971 while (!wizard->finished)
1972 gtk_main_iteration();
1974 result = wizard->result;
1976 GTK_EVENTS_FLUSH();
1978 gtk_widget_show(mainwin->window);
1979 g_free(wizard);
1981 return result;