1 
2 /***************************************************************************
3                    jabberregister.cpp  -  Register dialog for Jabber
4                              -------------------
5     begin                : Sun Jul 11 2004
6     copyright            : (C) 2004 by Till Gerken <till@tantalo.net>
7 
8     Copyright 2006 by Tommi Rantala <tommi.rantala@cs.helsinki.fi>
9 
10 		Kopete (C) 2001-2006 Kopete developers <kopete-devel@kde.org>
11  ***************************************************************************/
12 
13 /***************************************************************************
14  *                                                                         *
15  *   This program is free software; you can redistribute it and/or modify  *
16  *   it under the terms of the GNU General Public License as published by  *
17  *   the Free Software Foundation; either version 2 of the License, or     *
18  *   (at your option) any later version.                                   *
19  *                                                                         *
20  ***************************************************************************/
21 
22 #include "jabberregisteraccount.h"
23 
24 #include "jabber_protocol_debug.h"
25 #include <KLocalizedString>
26 
27 #include <kmessagebox.h>
28 #include <QLineEdit>
29 #include <knuminput.h>
30 #include <QPushButton>
31 #include <qlabel.h>
32 #include <qcheckbox.h>
33 #include <qtimer.h>
34 #include <qregexp.h>
35 
36 #include <QtCrypto>
37 #include "xmpp.h"
38 #include "xmpp_tasks.h"
39 
40 #include "kopeteuiglobal.h"
41 #include "kopetepasswordwidget.h"
42 #include "jabberprotocol.h"
43 #include "jabberaccount.h"
44 #include "jabberclient.h"
45 #include "jabbereditaccountwidget.h"
46 #include "jabberchooseserver.h"
47 #include "ui_dlgjabberregisteraccount.h"
48 
JabberRegisterAccount(JabberEditAccountWidget * parent)49 JabberRegisterAccount::JabberRegisterAccount ( JabberEditAccountWidget *parent )
50  : KDialog ( parent )
51 {
52 
53 	setCaption( i18n("Register New Jabber Account") );
54 	setButtons( KDialog::Ok | KDialog::Cancel );
55 	mParentWidget = parent;
56 
57 	// setup main dialog
58 	QWidget* w = new QWidget( this );
59 	mMainWidget = new Ui::DlgJabberRegisterAccount;
60 	mMainWidget->setupUi( w );
61 	setMainWidget ( w );
62 
63 	// replace "Ok" button with a "Register" button
64 	KGuiItem registerButton = KStandardGuiItem::ok();
65 	registerButton.setText ( i18n ( "Register" ) );
66 	setButtonGuiItem( KDialog::Ok, KGuiItem( registerButton ) );
67 
68 	showButtonSeparator ( true );
69 
70 	// clear variables
71 	jabberClient = new JabberClient ();
72 
73 	connect ( jabberClient, SIGNAL (csError(int)), this, SLOT (slotCSError(int)) );
74 	connect ( jabberClient, SIGNAL (tlsWarning(QCA::TLS::IdentityResult,QCA::Validity)), this, SLOT (slotHandleTLSWarning(QCA::TLS::IdentityResult,QCA::Validity)) );
75 	connect ( jabberClient, SIGNAL (connected()), this, SLOT (slotConnected()) );
76 	connect ( jabberClient, SIGNAL (debugMessage(QString)), this, SLOT (slotDebugMessage(QString)) );
77 
78 	jidRegExp.setPattern ( QStringLiteral("[\\w\\d.+_-]{1,}@[\\w\\d.-]{1,}") );
79 	hintPixmap = SmallIcon ( QStringLiteral("jabber_online") );
80 
81 	mSuccess = false;
82 
83 	// get all settings from the main dialog
84 	mMainWidget->leJID->setText ( parent->mID->text () );
85 	mMainWidget->lePassword->setText ( parent->mPass->password () );
86     mMainWidget->lePassword->setEchoMode(QLineEdit::Password);
87 	//	mMainWidget->lePasswordVerify->setText ( parent->mPass->password () ); //BUG 114631
88     mMainWidget->lePasswordVerify->setEchoMode(QLineEdit::Password);
89 	mMainWidget->cbUseSSL->setChecked ( parent->cbUseSSL->isChecked () );
90 	mMainWidget->cbOverrideHost->setChecked ( parent->cbCustomServer->isChecked () );
91 	mMainWidget->leServer->setText ( parent->mServer->text () );
92 	mMainWidget->sbPort->setValue ( parent->mPort->value () );
93 
94 	slotOverrideHostToggled();
95 
96 	connect ( this, SIGNAL (okClicked()), this, SLOT(slotOk()) );
97 	connect ( this, SIGNAL (cancelClicked()), this, SLOT (slotDeleteDialog()) );
98 	connect ( mMainWidget->btnChooseServer, SIGNAL (clicked()), this, SLOT (slotChooseServer()) );
99 	connect ( mMainWidget->leServer, SIGNAL (textChanged(QString)), this, SLOT (slotJIDInformation()) );
100 	connect ( mMainWidget->leJID, SIGNAL (textChanged(QString)), this, SLOT (slotJIDInformation()) );
101 	connect ( mMainWidget->cbUseSSL, SIGNAL (toggled(bool)), this, SLOT (slotSSLToggled()) );
102 	connect ( mMainWidget->cbOverrideHost, SIGNAL (toggled(bool)), this, SLOT (slotOverrideHostToggled()) );
103 
104 	connect ( mMainWidget->leServer, SIGNAL (textChanged(QString)), this, SLOT (validateData()) );
105 	connect ( mMainWidget->leJID, SIGNAL (textChanged(QString)), this, SLOT (validateData()) );
106 	connect ( mMainWidget->lePassword, SIGNAL (textChanged(QString)), this, SLOT (validateData()) );
107 	connect ( mMainWidget->lePasswordVerify, SIGNAL (textChanged(QString)), this, SLOT (validateData()) );
108 
109 	// display JID info now
110 	slotJIDInformation ();
111 
112 	// display validation info
113 	validateData ();
114 }
115 
~JabberRegisterAccount()116 JabberRegisterAccount::~JabberRegisterAccount()
117 {
118 	delete mMainWidget;
119 	delete jabberClient;
120 }
121 
accept()122 void JabberRegisterAccount::accept ()
123 {
124 
125 }
126 
slotDeleteDialog()127 void JabberRegisterAccount::slotDeleteDialog ()
128 {
129 
130 	deleteLater ();
131 
132 }
133 
validateData()134 void JabberRegisterAccount::validateData ()
135 {
136 
137 	bool valid = true;
138 	bool passwordHighlight = false;
139 
140 	if ( mMainWidget->cbOverrideHost->isChecked () && mMainWidget->leServer->text().isEmpty () )
141 	{
142 		mMainWidget->lblStatusMessage->setText ( i18n ( "Please enter a server name." ) );
143 		valid = false;
144 	}
145 
146 	if ( valid && !jidRegExp.exactMatch ( mMainWidget->leJID->text() ) )
147 	{
148 		mMainWidget->lblStatusMessage->setText ( i18n ( "Please enter a valid Jabber ID or click Choose." ) );
149 		mMainWidget->pixJID->setPixmap ( hintPixmap );
150 		valid = false;
151 	}
152 	else
153 	{
154 		mMainWidget->pixJID->setText ( QLatin1String("") );
155 	}
156 
157 	if ( valid &&
158 	   (  mMainWidget->lePassword->text().isEmpty () ||
159 	      mMainWidget->lePasswordVerify->text ().isEmpty () ) )
160 	{
161 		mMainWidget->lblStatusMessage->setText ( i18n ( "Please enter the same password twice." ) );
162 		valid = false;
163 		passwordHighlight = true;
164 	}
165 
166 	if ( valid &&  mMainWidget->lePassword->text () != mMainWidget->lePasswordVerify->text () )
167 	{
168 		mMainWidget->lblStatusMessage->setText ( i18n ( "Password entries do not match." ) );
169 		valid = false;
170 		passwordHighlight = true;
171 	}
172 
173 	if ( passwordHighlight == true )
174 	{
175 		mMainWidget->pixPassword->setPixmap ( hintPixmap );
176 		mMainWidget->pixPasswordVerify->setPixmap ( hintPixmap );
177 	}
178 	else {
179 		mMainWidget->pixPassword->setText ( QLatin1String("") );
180 		mMainWidget->pixPasswordVerify->setText ( QLatin1String("") );
181 	}
182 
183 	if ( valid )
184 	{
185 		// clear status message if we have valid data
186 		mMainWidget->lblStatusMessage->setText ( QLatin1String("") );
187 	}
188 
189 	enableButtonOk ( valid );
190 
191 }
192 
slotJIDInformation()193 void JabberRegisterAccount::slotJIDInformation ()
194 {
195 
196 	if ( !mMainWidget->leServer->text().isEmpty () &&
197 		 ( !jidRegExp.exactMatch ( mMainWidget->leJID->text () ) ||
198 		 ( mMainWidget->cbOverrideHost->isChecked () && mMainWidget->leJID->text().section ( '@', 1 ) != mMainWidget->leServer->text () ) ) )
199 	{
200 		mMainWidget->lblJIDInformation->setText ( i18n ( "Unless you know what you are doing, your JID should be of the form "
201 														 "\"username@server.com\".  In your case for example \"username@%1\"." ,
202 													  mMainWidget->leServer->text () ) );
203 	}
204 	else
205 	{
206 		mMainWidget->lblJIDInformation->setText ( QLatin1String("") );
207 	}
208 
209 }
210 
slotSSLToggled()211 void JabberRegisterAccount::slotSSLToggled ()
212 {
213 
214 	if ( mMainWidget->cbUseSSL->isChecked () )
215 	{
216 		if ( mMainWidget->sbPort->value () == 5222 )
217 		{
218 			mMainWidget->sbPort->setValue ( 5223 );
219 		}
220 	}
221 	else
222 	{
223 		if ( mMainWidget->sbPort->value () == 5223 )
224 		{
225 			mMainWidget->sbPort->setValue ( 5222 );
226 		}
227 	}
228 
229 }
230 
slotOverrideHostToggled()231 void JabberRegisterAccount::slotOverrideHostToggled()
232 {
233 
234 	bool overrideHost = mMainWidget->cbOverrideHost->isChecked ();
235 	mMainWidget->leServer->setEnabled ( overrideHost );
236 	mMainWidget->sbPort->setEnabled ( overrideHost );
237 	mMainWidget->lblServer->setEnabled ( overrideHost );
238 	mMainWidget->lblPort->setEnabled ( overrideHost );
239 	slotJIDInformation();
240 	validateData();
241 
242 }
243 
slotChooseServer()244 void JabberRegisterAccount::slotChooseServer ()
245 {
246 
247 	(new JabberChooseServer ( this ))->show ();
248 
249 }
250 
setServer(const QString & server)251 void JabberRegisterAccount::setServer ( const QString &server )
252 {
253 
254 	mMainWidget->leServer->setText ( server );
255 	mMainWidget->leJID->setText ( QStringLiteral ( "@%1" ).arg ( server ) );
256 
257 }
258 
slotOk()259 void JabberRegisterAccount::slotOk ()
260 {
261 
262 	mMainWidget->lblStatusMessage->setText ( QLatin1String("") );
263 
264 	qCDebug(JABBER_PROTOCOL_LOG) << "Registering a new Jabber account.";
265 
266 	enableButtonOk ( false );
267 
268 	mMainWidget->lblStatusMessage->setText ( i18n ( "Connecting to server..." ) );
269 
270 	// cancel any previous attempt
271 	jabberClient->disconnect ();
272 
273 	jabberClient->setUseSSL ( mMainWidget->cbUseSSL->isChecked () );
274 
275 	if ( mMainWidget->cbOverrideHost->isChecked () )
276 	{
277 		jabberClient->setUseXMPP09 ( true );
278 		jabberClient->setOverrideHost ( true, mMainWidget->leServer->text (), mMainWidget->sbPort->value () );
279 	}
280 	else
281 	{
282 		jabberClient->setUseXMPP09 ( false );
283 		jabberClient->setOverrideHost ( false );
284 	}
285 
286 	// start connection, no authentication
287 	switch ( jabberClient->connect ( XMPP::Jid ( mMainWidget->leJID->text () ), QString(), false ) )
288 	{
289 		case JabberClient::NoTLS:
290 			// no SSL support, at the connecting stage this means the problem is client-side
291 			KMessageBox::error(Kopete::UI::Global::mainWidget (),
292 								i18n ("SSL support could not be initialized for account %1. This is most likely because the QCA TLS plugin is not installed on your system.",
293 								  mMainWidget->leJID->text () ),
294 								i18n ("Jabber SSL Error"));
295 			break;
296 
297 		case JabberClient::Ok:
298 		default:
299 			// everything alright!
300 			break;
301 	}
302 
303 }
304 
disconnect()305 void JabberRegisterAccount::disconnect ()
306 {
307 
308 	if(jabberClient)
309 		jabberClient->disconnect ();
310 
311 	if ( !mSuccess )
312 		enableButtonOk ( true );
313 
314 }
315 
slotHandleTLSWarning(QCA::TLS::IdentityResult identityResult,QCA::Validity validityResult)316 void JabberRegisterAccount::slotHandleTLSWarning (
317 		QCA::TLS::IdentityResult identityResult,
318 		QCA::Validity validityResult )
319 {
320 	qCDebug(JABBER_PROTOCOL_LOG) << "Handling TLS warning...";
321 
322 	if ( JabberAccount::handleTLSWarning ( jabberClient, identityResult, validityResult ) )
323 	{
324 		// resume stream
325 		jabberClient->continueAfterTLSWarning ();
326 	}
327 	else
328 	{
329 		// disconnect stream
330 		disconnect ();
331 	}
332 
333 }
334 
slotCSError(int error)335 void JabberRegisterAccount::slotCSError (int error)
336 {
337 	qCDebug(JABBER_PROTOCOL_LOG) << "Error in stream signalled, disconnecting.";
338 
339 	Kopete::Account::DisconnectReason errorClass;
340 
341 	mMainWidget->lblStatusMessage->setText ( i18n ( "Protocol error." ) );
342 
343 	// display message to user
344 	JabberAccount::handleStreamError (error, jabberClient->clientStream()->errorCondition (), jabberClient->clientConnector()->errorCode (), mMainWidget->leServer->text (), errorClass, jabberClient->clientStream()->errorText());
345 
346 	disconnect ();
347 
348 }
349 
slotConnected()350 void JabberRegisterAccount::slotConnected ()
351 {
352 	qDebug (JABBER_PROTOCOL_LOG) << "Launching registration task...";
353 
354 	mMainWidget->lblStatusMessage->setText ( i18n ( "Connected successfully, registering new account..." ) );
355 
356 	XMPP::JT_Register * task = new XMPP::JT_Register (jabberClient->rootTask ());
357 	QObject::connect (task, SIGNAL (finished()), this, SLOT (slotRegisterUserDone()));
358 	task->reg (mMainWidget->leJID->text().section('@', 0, 0), mMainWidget->lePassword->text ());
359 	task->go (true);
360 
361 }
362 
slotRegisterUserDone()363 void JabberRegisterAccount::slotRegisterUserDone ()
364 {
365 	XMPP::JT_Register * task = (XMPP::JT_Register *) sender ();
366 
367 	if (task->success ())
368 	{
369 		mMainWidget->lblStatusMessage->setText ( i18n ( "Registration successful." ) );
370 
371 		// save settings to parent
372 		mParentWidget->mServer->setText ( mMainWidget->leServer->text () );
373 		mParentWidget->mID->setText ( mMainWidget->leJID->text () );
374 		mParentWidget->mPass->setPassword ( mMainWidget->lePassword->text () );
375 		mParentWidget->mPort->setValue ( mMainWidget->sbPort->value () );
376 		mParentWidget->cbUseSSL->setChecked ( mMainWidget->cbUseSSL->isChecked () );
377 		mParentWidget->cbCustomServer->setChecked ( mMainWidget->cbOverrideHost->isChecked () );
378 
379 		// disable input widgets
380 		mMainWidget->btnChooseServer->setEnabled ( false );
381 		mMainWidget->leServer->setEnabled ( false );
382 		mMainWidget->leJID->setEnabled ( false );
383 		mMainWidget->lePassword->setEnabled ( false );
384 		mMainWidget->lePasswordVerify->setEnabled ( false );
385 		mMainWidget->sbPort->setEnabled ( false );
386 		mMainWidget->cbUseSSL->setEnabled ( false );
387 		mMainWidget->cbOverrideHost->setEnabled ( false );
388 
389 		// disable input widget labels
390 		mMainWidget->lblServer->setEnabled ( false );
391 		mMainWidget->lblJID->setEnabled ( false );
392 		mMainWidget->lblPassword->setEnabled ( false );
393 		mMainWidget->lblPasswordVerify->setEnabled ( false );
394 		mMainWidget->lblPort->setEnabled ( false );
395 
396 		mSuccess = true;
397 
398 		// rewire buttons
399 		enableButtonOk ( false );
400 		setButtonGuiItem( KDialog::Cancel, KStandardGuiItem::close () );
401 		connect ( this, SIGNAL (closeClicked()), this, SLOT (slotDeleteDialog()) );
402 	}
403 	else
404 	{
405 		mMainWidget->lblStatusMessage->setText ( i18n ( "Registration failed." ) );
406 		KMessageBox::information (Kopete::UI::Global::mainWidget (),
407 								  i18n ("Unable to create an account on the server. The Jabber ID is probably already in use."),
408 								  i18n ("Jabber Account Registration"));
409 
410 	}
411 
412 	// FIXME: this is required because Iris crashes if we try
413 	//        to disconnect here. Hopefully Justin can fix this.
414 	QTimer::singleShot(0, this, SLOT(disconnect()));
415 
416 }
417 
slotDebugMessage(const QString & msg)418 void JabberRegisterAccount::slotDebugMessage ( const QString &msg )
419 {
420 
421 	qCDebug(JABBER_PROTOCOL_LOG) << msg;
422 
423 }
424 
425