kmail

accountwizard.cpp
1/*******************************************************************************
2**
3** Filename : accountwizard.cpp
4** Created on : 07 February, 2005
5** Copyright : (c) 2005 Tobias Koenig
6** Email : tokoe@kde.org
7**
8*******************************************************************************/
9
10/*******************************************************************************
11**
12** This program is free software; you can redistribute it and/or modify
13** it under the terms of the GNU General Public License as published by
14** the Free Software Foundation; either version 2 of the License, or
15** (at your option) any later version.
16**
17** In addition, as a special exception, the copyright holders give
18** permission to link the code of this program with any edition of
19** the TQt library by Trolltech AS, Norway (or with modified versions
20** of TQt that use the same license as TQt), and distribute linked
21** combinations including the two. You must obey the GNU General
22** Public License in all respects for all of the code used other than
23** TQt. If you modify this file, you may extend this exception to
24** your version of the file, but you are not obligated to do so. If
25** you do not wish to do so, delete this exception statement from
26** your version.
27*******************************************************************************/
28
29#include <kdialog.h>
30#include <tdefiledialog.h>
31#include <klineedit.h>
32#include <tdelistbox.h>
33#include <tdelocale.h>
34
35#include <tqcheckbox.h>
36#include <tqdir.h>
37#include <tqhbox.h>
38#include <tqlabel.h>
39#include <tqlayout.h>
40#include <tqpushbutton.h>
41#include <tqvbox.h>
42
43#include "kmacctlocal.h"
44#include "kmkernel.h"
45#include "popaccount.h"
46#include "kmacctimap.h"
47#include "kmacctcachedimap.h"
48#include "kmacctmaildir.h"
49#include "accountmanager.h"
51
52#include "globalsettings.h"
53#include "kmservertest.h"
54#include "kmtransport.h"
55#include "libkpimidentities/identity.h"
56#include "libkpimidentities/identitymanager.h"
57#include "protocols.h"
58
59#include "accountwizard.h"
60
61enum Capabilities
62{
63 Plain = 1,
64 Login = 2,
65 CRAM_MD5 = 4,
66 Digest_MD5 = 8,
67 Anonymous = 16,
68 APOP = 32,
69 Pipelining = 64,
70 TOP = 128,
71 UIDL = 256,
72 STLS = 512, // TLS for POP
73 STARTTLS = 512, // TLS for IMAP
74 GSSAPI = 1024,
75 NTLM = 2048,
76 AllCapa = 0xffffffff
77};
78
79class AccountTypeBox : public TDEListBox
80{
81 public:
82 enum Type { Local, POP3, IMAP, dIMAP, Maildir };
83
84 AccountTypeBox( TQWidget *parent )
85 : TDEListBox( parent, "AccountTypeBox" )
86 {
87 mTypeList << i18n( "Local mailbox" );
88 mTypeList << i18n( "POP3" );
89 mTypeList << i18n( "IMAP" );
90 mTypeList << i18n( "Disconnected IMAP" );
91 mTypeList << i18n( "Maildir mailbox" );
92
93 insertStringList( mTypeList );
94 }
95
96 void setType( Type type )
97 {
98 setCurrentItem( (int)type );
99 }
100
101 Type type() const
102 {
103 return (Type)currentItem();
104 }
105
106 private:
107 TQStringList mTypeList;
108};
109
110AccountWizard::AccountWizard( KMKernel *kernel, TQWidget *parent )
111 : KWizard( parent, "KWizard" ), mKernel( kernel ),
112 mAccount( 0 ), mTransportInfo( 0 ), mServerTest( 0 )
113{
114 setupWelcomePage();
115 setupAccountTypePage();
116 setupAccountInformationPage();
117 setupLoginInformationPage();
118 setupServerInformationPage();
119}
120
121void AccountWizard::start( KMKernel *kernel, TQWidget *parent )
122{
123 TDEConfigGroup wizardConfig( KMKernel::config(), "AccountWizard" );
124
125 if ( wizardConfig.readBoolEntry( "ShowOnStartup", true ) ) {
126 AccountWizard wizard( kernel, parent );
127 int result = wizard.exec();
128 if ( result == TQDialog::Accepted ) {
129 wizardConfig.writeEntry( "ShowOnStartup", false );
130 kernel->slotConfigChanged();
131 }
132 }
133}
134
135void AccountWizard::showPage( TQWidget *page )
136{
137 if ( page == mWelcomePage ) {
138 // do nothing
139 } else if ( page == mAccountTypePage ) {
140 if ( mTypeBox->currentItem() == -1 )
141 mTypeBox->setType( AccountTypeBox::POP3 );
142 } else if ( page == mAccountInformationPage ) {
143 if ( mRealName->text().isEmpty() && mEMailAddress->text().isEmpty() &&
144 mOrganization->text().isEmpty() ) {
145 KPIM::IdentityManager *manager = mKernel->identityManager();
146 const KPIM::Identity &identity = manager->defaultIdentity();
147
148 mRealName->setText( identity.fullName() );
149 mEMailAddress->setText( identity.primaryEmailAddress() );
150 mOrganization->setText( identity.organization() );
151 }
152 } else if ( page == mLoginInformationPage ) {
153 if ( mLoginName->text().isEmpty() ) {
154 // try to extract login from email address
155 TQString email = mEMailAddress->text();
156 int pos = email.find( '@' );
157 if ( pos != -1 )
158 mLoginName->setText( email.left( pos ) );
159
160 // take the whole email as login otherwise?!?
161 }
162 } else if ( page == mServerInformationPage ) {
163 if ( mTypeBox->type() == AccountTypeBox::Local ||
164 mTypeBox->type() == AccountTypeBox::Maildir ) {
165 mIncomingServerWdg->hide();
166 mIncomingLocationWdg->show();
167 mIncomingLabel->setText( i18n( "Location:" ) );
168
169 if ( mTypeBox->type() == AccountTypeBox::Local )
170 mIncomingLocation->setText( TQDir::homeDirPath() + "/inbox" );
171 else
172 mIncomingLocation->setText( TQDir::homeDirPath() + "/Mail/" );
173 } else {
174 mIncomingLocationWdg->hide();
175 mIncomingServerWdg->show();
176 mIncomingLabel->setText( i18n( "Incoming server:" ) );
177 }
178
179 setFinishEnabled( mServerInformationPage, true );
180 }
181
182 TQWizard::showPage( page );
183}
184
185void AccountWizard::setupWelcomePage()
186{
187 mWelcomePage = new TQVBox( this );
188 ((TQVBox*)mWelcomePage)->setSpacing( KDialog::spacingHint() );
189
190 TQLabel *label = new TQLabel( i18n( "Welcome to KMail" ), mWelcomePage );
191 TQFont font = label->font();
192 font.setBold( true );
193 label->setFont( font );
194
195 new TQLabel( i18n( "<qt>It seems you have started KMail for the first time. "
196 "You can use this wizard to setup your mail accounts. Just "
197 "enter the connection data that you received from your email provider "
198 "into the following pages.</qt>" ), mWelcomePage );
199
200 addPage( mWelcomePage, i18n( "Welcome" ) );
201}
202
203void AccountWizard::setupAccountTypePage()
204{
205 mAccountTypePage = new TQVBox( this );
206 ((TQVBox*)mAccountTypePage)->setSpacing( KDialog::spacingHint() );
207
208 new TQLabel( i18n( "Select what kind of account you would like to create" ), mAccountTypePage );
209
210 mTypeBox = new AccountTypeBox( mAccountTypePage );
211
212 addPage( mAccountTypePage, i18n( "Account Type" ) );
213}
214
215void AccountWizard::setupAccountInformationPage()
216{
217 mAccountInformationPage = new TQWidget( this );
218 TQGridLayout *layout = new TQGridLayout( mAccountInformationPage, 3, 2,
219 KDialog::marginHint(), KDialog::spacingHint() );
220
221 TQLabel *label = new TQLabel( i18n( "Real name:" ), mAccountInformationPage );
222 mRealName = new KLineEdit( mAccountInformationPage );
223 label->setBuddy( mRealName );
224
225 layout->addWidget( label, 0, 0 );
226 layout->addWidget( mRealName, 0, 1 );
227
228 label = new TQLabel( i18n( "E-mail address:" ), mAccountInformationPage );
229 mEMailAddress = new KLineEdit( mAccountInformationPage );
230 label->setBuddy( mEMailAddress );
231
232 layout->addWidget( label, 1, 0 );
233 layout->addWidget( mEMailAddress, 1, 1 );
234
235 label = new TQLabel( i18n( "Organization:" ), mAccountInformationPage );
236 mOrganization = new KLineEdit( mAccountInformationPage );
237 label->setBuddy( mOrganization );
238
239 layout->addWidget( label, 2, 0 );
240 layout->addWidget( mOrganization, 2, 1 );
241
242 addPage( mAccountInformationPage, i18n( "Account Information" ) );
243}
244
245void AccountWizard::setupLoginInformationPage()
246{
247 mLoginInformationPage = new TQWidget( this );
248 TQGridLayout *layout = new TQGridLayout( mLoginInformationPage, 2, 2,
249 KDialog::marginHint(), KDialog::spacingHint() );
250
251 TQLabel *label = new TQLabel( i18n( "Login name:" ), mLoginInformationPage );
252 mLoginName = new KLineEdit( mLoginInformationPage );
253 label->setBuddy( mLoginName );
254
255 layout->addWidget( label, 0, 0 );
256 layout->addWidget( mLoginName, 0, 1 );
257
258 label = new TQLabel( i18n( "Password:" ), mLoginInformationPage );
259 mPassword = new KLineEdit( mLoginInformationPage );
260 mPassword->setEchoMode( TQLineEdit::Password );
261 label->setBuddy( mPassword );
262
263 layout->addWidget( label, 1, 0 );
264 layout->addWidget( mPassword, 1, 1 );
265
266 addPage( mLoginInformationPage, i18n( "Login Information" ) );
267}
268
269void AccountWizard::setupServerInformationPage()
270{
271 mServerInformationPage = new TQWidget( this );
272 TQGridLayout *layout = new TQGridLayout( mServerInformationPage, 3, 2,
273 KDialog::marginHint(), KDialog::spacingHint() );
274
275 mIncomingLabel = new TQLabel( mServerInformationPage );
276
277 mIncomingServerWdg = new TQVBox( mServerInformationPage );
278 mIncomingServer = new KLineEdit( mIncomingServerWdg );
279 mIncomingUseSSL = new TQCheckBox( i18n( "Use secure connection (SSL)" ), mIncomingServerWdg );
280
281 mIncomingLocationWdg = new TQHBox( mServerInformationPage );
282 mIncomingLocation = new KLineEdit( mIncomingLocationWdg );
283 mChooseLocation = new TQPushButton( i18n( "Choose..." ), mIncomingLocationWdg );
284
285 connect( mChooseLocation, TQ_SIGNAL( clicked() ),
286 this, TQ_SLOT( chooseLocation() ) );
287
288 layout->addWidget( mIncomingLabel, 0, 0, AlignTop );
289 layout->addWidget( mIncomingLocationWdg, 0, 1 );
290 layout->addWidget( mIncomingServerWdg, 0, 1 );
291
292 TQLabel *label = new TQLabel( i18n( "Outgoing server:" ), mServerInformationPage );
293 mOutgoingServer = new KLineEdit( mServerInformationPage );
294 label->setBuddy( mOutgoingServer );
295
296 layout->addWidget( label, 1, 0 );
297 layout->addWidget( mOutgoingServer, 1, 1 );
298
299 mOutgoingUseSSL = new TQCheckBox( i18n( "Use secure connection (SSL)" ), mServerInformationPage );
300 layout->addWidget( mOutgoingUseSSL, 2, 1 );
301
302 mLocalDelivery = new TQCheckBox( i18n( "Use local delivery" ),
303 mServerInformationPage );
304 layout->addWidget( mLocalDelivery, 3, 0 );
305
306 connect( mLocalDelivery, TQ_SIGNAL( toggled( bool ) ),
307 mOutgoingServer, TQ_SLOT( setDisabled( bool ) ) );
308
309 addPage( mServerInformationPage, i18n( "Server Information" ) );
310}
311
312void AccountWizard::chooseLocation()
313{
314 TQString location;
315
316 if ( mTypeBox->type() == AccountTypeBox::Local ) {
317 location = KFileDialog::getSaveFileName( TQString(), TQString(), this );
318 } else if ( mTypeBox->type() == AccountTypeBox::Maildir ) {
319 location = KFileDialog::getExistingDirectory( TQString(), this );
320 }
321
322 if ( !location.isEmpty() )
323 mIncomingLocation->setText( location );
324}
325
326TQString AccountWizard::accountName() const
327{
328 // create account name
329 TQString name( i18n( "None" ) );
330
331 TQString email = mEMailAddress->text();
332 int pos = email.find( '@' );
333 if ( pos != -1 ) {
334 name = email.mid( pos + 1 );
335 name[ 0 ] = name[ 0 ].upper();
336 }
337
338 return name;
339}
340
341TQLabel *AccountWizard::createInfoLabel( const TQString &msg )
342{
343 TQLabel *label = new TQLabel( msg, this );
344 label->setFrameStyle( TQFrame::Panel | TQFrame::Raised );
345 label->resize( fontMetrics().width( msg ) + 20, label->height() * 2 );
346 label->move( width() / 2 - label->width() / 2, height() / 2 - label->height() / 2 );
347 label->show();
348
349 return label;
350}
351
352void AccountWizard::accept()
353{
354 // store identity information
355 KPIM::IdentityManager *manager = mKernel->identityManager();
356 KPIM::Identity &identity = manager->modifyIdentityForUoid( manager->defaultIdentity().uoid() );
357
358 identity.setFullName( mRealName->text() );
359 identity.setPrimaryEmailAddress( mEMailAddress->text() );
360 identity.setOrganization( mOrganization->text() );
361
362 manager->commit();
363
364 TQTimer::singleShot( 0, this, TQ_SLOT( createTransport() ) );
365}
366
367void AccountWizard::createTransport()
368{
369 // create outgoing account
370 TDEConfigGroup general( KMKernel::config(), "General" );
371
372 uint numTransports = general.readNumEntry( "transports", 0 );
373
374 for ( uint i = 1 ; i <= numTransports ; i++ ) {
375 KMTransportInfo *info = new KMTransportInfo();
376 info->readConfig( i );
377 mTransportInfoList.append( info );
378 }
379
380 mTransportInfo = new KMTransportInfo();
381
382 if ( mLocalDelivery->isChecked() ) { // local delivery
383 mTransportInfo->type = "sendmail";
384 mTransportInfo->name = i18n( "Sendmail" );
385 mTransportInfo->host = "/usr/sbin/sendmail"; // TODO: search for sendmail in PATH
386 mTransportInfo->auth = false;
387 mTransportInfo->setStorePasswd( false );
388
389 TQTimer::singleShot( 0, this, TQ_SLOT( transportCreated() ) );
390 } else { // delivery via SMTP
391 mTransportInfo->type = "smtp";
392 mTransportInfo->name = accountName();
393 mTransportInfo->host = mOutgoingServer->text();
394 mTransportInfo->user = mLoginName->text();
395 mTransportInfo->setPasswd( mPassword->text() );
396
397 int port = (mOutgoingUseSSL->isChecked() ? 465 : 25);
398 checkSmtpCapabilities( mTransportInfo->host, port );
399 }
400}
401
402void AccountWizard::transportCreated()
403{
404 mTransportInfoList.append( mTransportInfo );
405
406 TDEConfigGroup general( KMKernel::config(), "General" );
407 general.writeEntry( "transports", mTransportInfoList.count() );
408
409 for ( uint i = 0 ; i < mTransportInfoList.count() ; i++ )
410 mTransportInfo->writeConfig( i + 1 );
411
412 // No default transport? => set the first transport as the default
413 if ( GlobalSettings::self()->defaultTransport().isEmpty() ) {
414 TDEConfigGroup general( KMKernel::config(), "General" );
415
416 if ( mTransportInfoList.count() > 0 ) {
417 KMTransportInfo info;
418 info.readConfig( 1 );
419 TDEConfigGroup composer( KMKernel::config(), "Composer" );
420 GlobalSettings::self()->setDefaultTransport( info.name );
421 GlobalSettings::self()->setCurrentTransport( info.name );
422 }
423 }
424
425 mTransportInfoList.setAutoDelete( true );
426 mTransportInfoList.clear();
427
428 TQTimer::singleShot( 0, this, TQ_SLOT( createAccount() ) );
429}
430
431void AccountWizard::createAccount()
432{
433 // create incoming account
434 AccountManager *acctManager = mKernel->acctMgr();
435
436 int port = 0;
437
438 switch ( mTypeBox->type() ) {
439 case AccountTypeBox::Local:
440 {
441 mAccount = acctManager->create( "local", i18n( "Local Account" ) );
442 static_cast<KMAcctLocal*>( mAccount )->setLocation( mIncomingLocation->text() );
443 break;
444 }
445 case AccountTypeBox::POP3:
446 {
447 mAccount = acctManager->create( "pop", accountName() );
448 KMail::PopAccount *acct = static_cast<KMail::PopAccount*>( mAccount );
449 acct->setLogin( mLoginName->text() );
450 acct->setPasswd( mPassword->text() );
451 acct->setHost( mIncomingServer->text() );
452 port = mIncomingUseSSL->isChecked() ? 995 : 110;
453 break;
454 }
455 case AccountTypeBox::IMAP:
456 {
457 mAccount = acctManager->create( "imap", accountName() );
458 KMAcctImap *acct = static_cast<KMAcctImap*>( mAccount );
459 acct->setLogin( mLoginName->text() );
460 acct->setPasswd( mPassword->text() );
461 acct->setHost( mIncomingServer->text() );
462 port = mIncomingUseSSL->isChecked() ? 993 : 143;
463 break;
464 }
465 case AccountTypeBox::dIMAP:
466 {
467 mAccount = acctManager->create( "cachedimap", accountName() );
468 KMAcctCachedImap *acct = static_cast<KMAcctCachedImap*>( mAccount );
469 acct->setLogin( mLoginName->text() );
470 acct->setPasswd( mPassword->text() );
471 acct->setHost( mIncomingServer->text() );
472 port = mIncomingUseSSL->isChecked() ? 993 : 143;
473 break;
474 }
475 case AccountTypeBox::Maildir:
476 {
477 mAccount = acctManager->create( "maildir", i18n( "Local Account" ) );
478 static_cast<KMAcctMaildir*>( mAccount )->setLocation( mIncomingLocation->text() );
479 break;
480 }
481 }
482
483 if ( mTypeBox->type() == AccountTypeBox::POP3 )
484 checkPopCapabilities( mIncomingServer->text(), port );
485 else if ( mTypeBox->type() == AccountTypeBox::IMAP || mTypeBox->type() == AccountTypeBox::dIMAP )
486 checkImapCapabilities( mIncomingServer->text(), port );
487 else
488 TQTimer::singleShot( 0, this, TQ_SLOT( accountCreated() ) );
489}
490
491void AccountWizard::accountCreated()
492{
493 if ( mAccount )
494 {
495 mKernel->acctMgr()->add( mAccount );
496 mKernel->cleanupImapFolders();
497 }
498
499 finished();
500}
501
502void AccountWizard::finished()
503{
504 GlobalSettings::self()->writeConfig();
505
506 TQWizard::accept();
507}
508
509// ----- Security Checks --------------
510
511void AccountWizard::checkPopCapabilities( const TQString &server, int port )
512{
513 delete mServerTest;
514 mServerTest = new KMServerTest( POP_PROTOCOL, server, port );
515
516 connect( mServerTest, TQ_SIGNAL( capabilities( const TQStringList&, const TQStringList& ) ),
517 this, TQ_SLOT( popCapabilities( const TQStringList&, const TQStringList& ) ) );
518
519 mAuthInfoLabel = createInfoLabel( i18n( "Check for supported security capabilities of %1..." ).arg( server ) );
520}
521
522void AccountWizard::checkImapCapabilities( const TQString &server, int port )
523{
524 delete mServerTest;
525 mServerTest = new KMServerTest( IMAP_PROTOCOL, server, port );
526
527 connect( mServerTest, TQ_SIGNAL( capabilities( const TQStringList&, const TQStringList& ) ),
528 this, TQ_SLOT( imapCapabilities( const TQStringList&, const TQStringList& ) ) );
529
530 mAuthInfoLabel = createInfoLabel( i18n( "Check for supported security capabilities of %1..." ).arg( server ) );
531}
532
533void AccountWizard::checkSmtpCapabilities( const TQString &server, int port )
534{
535 delete mServerTest;
536 mServerTest = new KMServerTest( SMTP_PROTOCOL, server, port );
537
538 connect( mServerTest, TQ_SIGNAL( capabilities( const TQStringList&, const TQStringList&,
539 const TQString&, const TQString&, const TQString& ) ),
540 this, TQ_SLOT( smtpCapabilities( const TQStringList&, const TQStringList&,
541 const TQString&, const TQString&, const TQString& ) ) );
542
543 mAuthInfoLabel = createInfoLabel( i18n( "Check for supported security capabilities of %1..." ).arg( server ) );
544}
545
546void AccountWizard::popCapabilities( const TQStringList &capaNormalList,
547 const TQStringList &capaSSLList )
548{
549 uint capaNormal = popCapabilitiesFromStringList( capaNormalList );
550 uint capaTLS = 0;
551
552 if ( capaNormal & STLS )
553 capaTLS = capaNormal;
554
555 uint capaSSL = popCapabilitiesFromStringList( capaSSLList );
556
557 KMail::NetworkAccount *account = static_cast<KMail::NetworkAccount*>( mAccount );
558
559 bool useSSL = !capaSSLList.isEmpty();
560 bool useTLS = capaTLS != 0;
561
562 account->setUseSSL( useSSL );
563 account->setUseTLS( useTLS );
564
565 uint capa = (useSSL ? capaSSL : (useTLS ? capaTLS : capaNormal));
566
567 if ( capa & Plain )
568 account->setAuth( "PLAIN" );
569 else if ( capa & Login )
570 account->setAuth( "LOGIN" );
571 else if ( capa & CRAM_MD5 )
572 account->setAuth( "CRAM-MD5" );
573 else if ( capa & Digest_MD5 )
574 account->setAuth( "DIGEST-MD5" );
575 else if ( capa & NTLM )
576 account->setAuth( "NTLM" );
577 else if ( capa & GSSAPI )
578 account->setAuth( "GSSAPI" );
579 else if ( capa & APOP )
580 account->setAuth( "APOP" );
581 else
582 account->setAuth( "USER" );
583
584 account->setPort( useSSL ? 995 : 110 );
585
586 mServerTest->deleteLater();
587 mServerTest = 0;
588
589 delete mAuthInfoLabel;
590 mAuthInfoLabel = 0;
591
592 accountCreated();
593}
594
595
596void AccountWizard::imapCapabilities( const TQStringList &capaNormalList,
597 const TQStringList &capaSSLList )
598{
599 uint capaNormal = imapCapabilitiesFromStringList( capaNormalList );
600 uint capaTLS = 0;
601 if ( capaNormal & STARTTLS )
602 capaTLS = capaNormal;
603
604 uint capaSSL = imapCapabilitiesFromStringList( capaSSLList );
605
606 KMail::NetworkAccount *account = static_cast<KMail::NetworkAccount*>( mAccount );
607
608 bool useSSL = !capaSSLList.isEmpty();
609 bool useTLS = (capaTLS != 0);
610
611 account->setUseSSL( useSSL );
612 account->setUseTLS( useTLS );
613
614 uint capa = (useSSL ? capaSSL : (useTLS ? capaTLS : capaNormal));
615
616 if ( capa & CRAM_MD5 )
617 account->setAuth( "CRAM-MD5" );
618 else if ( capa & Digest_MD5 )
619 account->setAuth( "DIGEST-MD5" );
620 else if ( capa & NTLM )
621 account->setAuth( "NTLM" );
622 else if ( capa & GSSAPI )
623 account->setAuth( "GSSAPI" );
624 else if ( capa & Anonymous )
625 account->setAuth( "ANONYMOUS" );
626 else if ( capa & Login )
627 account->setAuth( "LOGIN" );
628 else if ( capa & Plain )
629 account->setAuth( "PLAIN" );
630 else
631 account->setAuth( "*" );
632
633 account->setPort( useSSL ? 993 : 143 );
634
635 mServerTest->deleteLater();
636 mServerTest = 0;
637
638 delete mAuthInfoLabel;
639 mAuthInfoLabel = 0;
640
641 accountCreated();
642}
643
644void AccountWizard::smtpCapabilities( const TQStringList &capaNormal,
645 const TQStringList &capaSSL,
646 const TQString &authNone,
647 const TQString &authSSL,
648 const TQString &authTLS )
649{
650 uint authBitsNone, authBitsSSL, authBitsTLS;
651
652 if ( authNone.isEmpty() && authSSL.isEmpty() && authTLS.isEmpty() ) {
653 // slave doesn't seem to support "* AUTH METHODS" metadata (or server can't do AUTH)
654 authBitsNone = authMethodsFromStringList( capaNormal );
655 if ( capaNormal.findIndex( "STARTTLS" ) != -1 )
656 authBitsTLS = authBitsNone;
657 else
658 authBitsTLS = 0;
659 authBitsSSL = authMethodsFromStringList( capaSSL );
660 } else {
661 authBitsNone = authMethodsFromString( authNone );
662 authBitsSSL = authMethodsFromString( authSSL );
663 authBitsTLS = authMethodsFromString( authTLS );
664 }
665
666 uint authBits = 0;
667 if ( capaNormal.findIndex( "STARTTLS" ) != -1 ) {
668 mTransportInfo->encryption = "TLS";
669 authBits = authBitsTLS;
670 } else if ( !capaSSL.isEmpty() ) {
671 mTransportInfo->encryption = "SSL";
672 authBits = authBitsSSL;
673 } else {
674 mTransportInfo->encryption = "NONE";
675 authBits = authBitsNone;
676 }
677
678 if ( authBits & Login )
679 mTransportInfo->authType = "LOGIN";
680 else if ( authBits & CRAM_MD5 )
681 mTransportInfo->authType = "CRAM-MD5";
682 else if ( authBits & Digest_MD5 )
683 mTransportInfo->authType = "DIGEST-MD5";
684 else if ( authBits & NTLM )
685 mTransportInfo->authType = "NTLM";
686 else if ( authBits & GSSAPI )
687 mTransportInfo->authType = "GSSAPI";
688 else
689 mTransportInfo->authType = "PLAIN";
690
691 mTransportInfo->port = ( !capaSSL.isEmpty() ? "465" : "25" );
692
693 mServerTest->deleteLater();
694 mServerTest = 0;
695
696 delete mAuthInfoLabel;
697 mAuthInfoLabel = 0;
698
699 transportCreated();
700}
701
702uint AccountWizard::popCapabilitiesFromStringList( const TQStringList & l )
703{
704 unsigned int capa = 0;
705
706 for ( TQStringList::const_iterator it = l.begin() ; it != l.end() ; ++it ) {
707 TQString cur = (*it).upper();
708 if ( cur == "PLAIN" )
709 capa |= Plain;
710 else if ( cur == "LOGIN" )
711 capa |= Login;
712 else if ( cur == "CRAM-MD5" )
713 capa |= CRAM_MD5;
714 else if ( cur == "DIGEST-MD5" )
715 capa |= Digest_MD5;
716 else if ( cur == "NTLM" )
717 capa |= NTLM;
718 else if ( cur == "GSSAPI" )
719 capa |= GSSAPI;
720 else if ( cur == "APOP" )
721 capa |= APOP;
722 else if ( cur == "STLS" )
723 capa |= STLS;
724 }
725
726 return capa;
727}
728
729uint AccountWizard::imapCapabilitiesFromStringList( const TQStringList & l )
730{
731 unsigned int capa = 0;
732
733 for ( TQStringList::const_iterator it = l.begin() ; it != l.end() ; ++it ) {
734 TQString cur = (*it).upper();
735 if ( cur == "AUTH=PLAIN" )
736 capa |= Plain;
737 else if ( cur == "AUTH=LOGIN" )
738 capa |= Login;
739 else if ( cur == "AUTH=CRAM-MD5" )
740 capa |= CRAM_MD5;
741 else if ( cur == "AUTH=DIGEST-MD5" )
742 capa |= Digest_MD5;
743 else if ( cur == "AUTH=NTLM" )
744 capa |= NTLM;
745 else if ( cur == "AUTH=GSSAPI" )
746 capa |= GSSAPI;
747 else if ( cur == "AUTH=ANONYMOUS" )
748 capa |= Anonymous;
749 else if ( cur == "STARTTLS" )
750 capa |= STARTTLS;
751 }
752
753 return capa;
754}
755
756uint AccountWizard::authMethodsFromString( const TQString & s )
757{
758 unsigned int result = 0;
759
760 TQStringList sl = TQStringList::split( '\n', s.upper() );
761 for ( TQStringList::const_iterator it = sl.begin() ; it != sl.end() ; ++it )
762 if ( *it == "SASL/LOGIN" )
763 result |= Login;
764 else if ( *it == "SASL/PLAIN" )
765 result |= Plain;
766 else if ( *it == "SASL/CRAM-MD5" )
767 result |= CRAM_MD5;
768 else if ( *it == "SASL/DIGEST-MD5" )
769 result |= Digest_MD5;
770 else if ( *it == "SASL/NTLM" )
771 result |= NTLM;
772 else if ( *it == "SASL/GSSAPI" )
773 result |= GSSAPI;
774
775 return result;
776}
777
778uint AccountWizard::authMethodsFromStringList( const TQStringList & sl )
779{
780 unsigned int result = 0;
781
782 for ( TQStringList::const_iterator it = sl.begin() ; it != sl.end() ; ++it )
783 if ( *it == "LOGIN" )
784 result |= Login;
785 else if ( *it == "PLAIN" )
786 result |= Plain;
787 else if ( *it == "CRAM-MD5" )
788 result |= CRAM_MD5;
789 else if ( *it == "DIGEST-MD5" )
790 result |= Digest_MD5;
791 else if ( *it == "NTLM" )
792 result |= NTLM;
793 else if ( *it == "GSSAPI" )
794 result |= GSSAPI;
795
796 return result;
797}
798
799#include "accountwizard.moc"
Central point of coordination in KMail.
Definition: kmkernel.h:92
The account manager is responsible for creating accounts of various types via the factory method crea...
KMAccount * create(const TQString &type, const TQString &name=TQString(), uint id=0)
Create a new account of given type with given name.
KMail account for pop mail account.
Definition: popaccount.h:27