1/*
2 * Copyright 2007-2015, Haiku, Inc. All rights reserved.
3 * Copyright 2011, Clemens Zeidler <haiku@clemens-zeidler.de>
4 * Distributed under the terms of the MIT License.
5 */
6
7
8#include "AutoConfigWindow.h"
9
10#include "AutoConfig.h"
11#include "AutoConfigView.h"
12
13#include <Alert.h>
14#include <Application.h>
15#include <Catalog.h>
16#include <Directory.h>
17#include <File.h>
18#include <FindDirectory.h>
19#include <LayoutBuilder.h>
20#include <MailSettings.h>
21#include <Message.h>
22#include <Path.h>
23
24#include <crypt.h>
25
26
27#undef B_TRANSLATION_CONTEXT
28#define B_TRANSLATION_CONTEXT "AutoConfigWindow"
29
30
31const float kSpacing = 10;
32
33
34AutoConfigWindow::AutoConfigWindow(BRect rect, ConfigWindow *parent)
35	:
36	BWindow(rect, B_TRANSLATE("Create new account"), B_TITLED_WINDOW_LOOK,
37		B_MODAL_APP_WINDOW_FEEL, B_NOT_ZOOMABLE | B_AVOID_FRONT
38			| B_AUTO_UPDATE_SIZE_LIMITS, B_ALL_WORKSPACES),
39	fParentWindow(parent),
40	fAccount(NULL),
41	fMainConfigState(true),
42	fServerConfigState(false),
43	fAutoConfigServer(true)
44{
45	fContainerView = new BGroupView("config container");
46
47	fBackButton = new BButton("back", B_TRANSLATE("Back"),
48		new BMessage(kBackMsg));
49	fBackButton->SetEnabled(false);
50
51	fNextButton = new BButton("next", B_TRANSLATE("Next"),
52		new BMessage(kOkMsg));
53	fNextButton->MakeDefault(true);
54
55	fMainView = new AutoConfigView(fAutoConfig);
56	fMainView->SetLabel(B_TRANSLATE("Account settings"));
57	fContainerView->AddChild(fMainView);
58
59	BLayoutBuilder::Group<>(this, B_VERTICAL)
60		.SetInsets(B_USE_DEFAULT_SPACING)
61		.Add(fContainerView)
62		.AddGroup(B_HORIZONTAL)
63			.AddGlue()
64			.Add(fBackButton)
65			.Add(fNextButton);
66
67	// Add a shortcut to close the window using Command-W
68	AddShortcut('W', B_COMMAND_KEY, new BMessage(B_QUIT_REQUESTED));
69}
70
71
72AutoConfigWindow::~AutoConfigWindow()
73{
74}
75
76
77void
78AutoConfigWindow::MessageReceived(BMessage* msg)
79{
80	status_t status = B_ERROR;
81	BAlert* invalidMailAlert = NULL;
82
83	switch (msg->what) {
84		case kOkMsg:
85			if (fMainConfigState) {
86				fMainView->GetBasicAccountInfo(fAccountInfo);
87				if (!fMainView->IsValidMailAddress(fAccountInfo.email)) {
88					invalidMailAlert = new BAlert("invalidMailAlert",
89						B_TRANSLATE("Enter a valid e-mail address."),
90						B_TRANSLATE("OK"));
91					invalidMailAlert->SetFlags(invalidMailAlert->Flags()
92						| B_CLOSE_ON_ESCAPE);
93					invalidMailAlert->Go();
94					return;
95				}
96				if (fAutoConfigServer) {
97					status = fAutoConfig.GetInfoFromMailAddress(
98						fAccountInfo.email.String(),
99						&fAccountInfo.providerInfo);
100				}
101				if (status == B_OK) {
102					fParentWindow->Lock();
103					GenerateBasicAccount();
104					fParentWindow->Unlock();
105					Quit();
106				}
107				fMainConfigState = false;
108				fServerConfigState = true;
109				fMainView->Hide();
110
111				fServerView = new ServerSettingsView(fAccountInfo);
112				fContainerView->AddChild(fServerView);
113
114				fBackButton->SetEnabled(true);
115				fNextButton->SetLabel(B_TRANSLATE("Finish"));
116			} else {
117				fServerView->GetServerInfo(fAccountInfo);
118				fParentWindow->Lock();
119				GenerateBasicAccount();
120				fParentWindow->Unlock();
121				Quit();
122			}
123			break;
124
125		case kBackMsg:
126			if (fServerConfigState) {
127				fServerView->GetServerInfo(fAccountInfo);
128
129				fMainConfigState = true;
130				fServerConfigState = false;
131
132				fContainerView->RemoveChild(fServerView);
133				delete fServerView;
134
135				fMainView->Show();
136				fBackButton->SetEnabled(false);
137			}
138			break;
139
140		case kServerChangedMsg:
141			fAutoConfigServer = false;
142			break;
143
144		default:
145			BWindow::MessageReceived(msg);
146			break;
147	}
148}
149
150
151bool
152AutoConfigWindow::QuitRequested()
153{
154	return true;
155}
156
157
158BMailAccountSettings*
159AutoConfigWindow::GenerateBasicAccount()
160{
161	if (!fAccount) {
162		fParentWindow->Lock();
163		fAccount = fParentWindow->AddAccount();
164		fParentWindow->Unlock();
165	}
166
167	fAccount->SetName(fAccountInfo.accountName.String());
168	fAccount->SetRealName(fAccountInfo.name.String());
169	fAccount->SetReturnAddress(fAccountInfo.email.String());
170
171	BMessage& inboundArchive = fAccount->InboundSettings();
172	inboundArchive.MakeEmpty();
173	BString inServerName;
174	int32 authType = 0;
175	int32 ssl = 0;
176	if (fAccountInfo.inboundType == IMAP) {
177		inServerName = fAccountInfo.providerInfo.imap_server;
178		ssl = fAccountInfo.providerInfo.ssl_imap;
179		fAccount->SetInboundAddOn("IMAP");
180	} else {
181		inServerName = fAccountInfo.providerInfo.pop_server;
182		authType = fAccountInfo.providerInfo.authentification_pop;
183		ssl = fAccountInfo.providerInfo.ssl_pop;
184		fAccount->SetInboundAddOn("POP3");
185	}
186	inboundArchive.AddString("server", inServerName);
187	inboundArchive.AddInt32("auth_method", authType);
188	inboundArchive.AddInt32("flavor", ssl);
189	inboundArchive.AddString("username", fAccountInfo.loginName);
190	set_passwd(&inboundArchive, "cpasswd", fAccountInfo.password);
191	inboundArchive.AddBool("leave_mail_on_server", true);
192	inboundArchive.AddBool("delete_remote_when_local", true);
193
194	BMessage& outboundArchive = fAccount->OutboundSettings();
195	outboundArchive.MakeEmpty();
196	fAccount->SetOutboundAddOn("SMTP");
197	outboundArchive.AddString("server",
198		fAccountInfo.providerInfo.smtp_server);
199	outboundArchive.AddString("username", fAccountInfo.loginName);
200	set_passwd(&outboundArchive, "cpasswd", fAccountInfo.password);
201	outboundArchive.AddInt32("auth_method",
202		fAccountInfo.providerInfo.authentification_smtp);
203	outboundArchive.AddInt32("flavor",
204		fAccountInfo.providerInfo.ssl_smtp);
205
206	fParentWindow->Lock();
207	fParentWindow->AccountUpdated(fAccount);
208	fParentWindow->Unlock();
209
210	return fAccount;
211}
212