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