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