kmail Library API Documentation

kmtransport.cpp

00001 
00020 #include <config.h>
00021 #include <assert.h>
00022 
00023 #include "kmtransport.h"
00024 
00025 #include <qbuttongroup.h>
00026 #include <qcheckbox.h>
00027 #include <qlayout.h>
00028 #include <klineedit.h>
00029 #include <qradiobutton.h>
00030 #include <qtabwidget.h>
00031 #include <qvalidator.h>
00032 #include <qlabel.h>
00033 #include <qpushbutton.h>
00034 #include <qwhatsthis.h>
00035 
00036 #include <kfiledialog.h>
00037 #include <klocale.h>
00038 #include <kmessagebox.h>
00039 #include <kseparator.h>
00040 #include <kdebug.h>
00041 
00042 #include "kmservertest.h"
00043 #include "kmaccount.h"
00044 #include "kmkernel.h"
00045 #include "protocols.h"
00046 
00047 KMTransportInfo::KMTransportInfo()
00048 {
00049   name = i18n("Unnamed");
00050   port = "25";
00051   auth = FALSE;
00052   storePass = FALSE;
00053   specifyHostname = false;
00054 }
00055 
00056 
00057 KMTransportInfo::~KMTransportInfo()
00058 {
00059 }
00060 
00061 
00062 void KMTransportInfo::readConfig(int id)
00063 {
00064   KConfig *config = KMKernel::config();
00065   KConfigGroupSaver saver(config, "Transport " + QString::number(id));
00066   type = config->readEntry("type", "smtp");
00067   name = config->readEntry("name", i18n("Unnamed"));
00068   host = config->readEntry("host", "localhost");
00069   port = config->readEntry("port", "25");
00070   user = config->readEntry("user");
00071   pass = KMAccount::decryptStr(config->readEntry("pass"));
00072   precommand = config->readPathEntry("precommand");
00073   encryption = config->readEntry("encryption");
00074   authType = config->readEntry("authtype");
00075   auth = config->readBoolEntry("auth");
00076   storePass = config->readBoolEntry("storepass");
00077   specifyHostname = config->readBoolEntry("specifyHostname", false);
00078   localHostname = config->readEntry("localHostname");
00079 }
00080 
00081 
00082 void KMTransportInfo::writeConfig(int id)
00083 {
00084   KConfig *config = KMKernel::config();
00085   KConfigGroupSaver saver(config, "Transport " + QString::number(id));
00086   config->writeEntry("type", type);
00087   config->writeEntry("name", name);
00088   config->writeEntry("host", host);
00089   config->writeEntry("port", port);
00090   config->writeEntry("user", user);
00091   config->writeEntry("pass", (storePass) ? KMAccount::encryptStr(pass) :
00092                                            QString("") );
00093   config->writePathEntry("precommand", precommand);
00094   config->writeEntry("encryption", encryption);
00095   config->writeEntry("authtype", authType);
00096   config->writeEntry("auth", auth);
00097   config->writeEntry("storepass", storePass);
00098   config->writeEntry("specifyHostname", specifyHostname);
00099   config->writeEntry("localHostname", localHostname);
00100 }
00101 
00102 
00103 int KMTransportInfo::findTransport(const QString &name)
00104 {
00105   KConfig *config = KMKernel::config();
00106   KConfigGroupSaver saver(config, "General");
00107   int numTransports = config->readNumEntry("transports", 0);
00108   for (int i = 1; i <= numTransports; i++)
00109   {
00110     KConfigGroupSaver saver(config, "Transport " + QString::number(i));
00111     if (config->readEntry("name") == name) return i;
00112   }
00113   return 0;
00114 }
00115 
00116 
00117 QStringList KMTransportInfo::availableTransports()
00118 {
00119   QStringList result;
00120   KConfig *config = KMKernel::config();
00121   KConfigGroupSaver saver(config, "General");
00122   int numTransports = config->readNumEntry("transports", 0);
00123   for (int i = 1; i <= numTransports; i++)
00124   {
00125     KConfigGroupSaver saver(config, "Transport " + QString::number(i));
00126     result.append(config->readEntry("name"));
00127   }
00128   return result;
00129 }
00130 
00131 
00132 KMTransportSelDlg::KMTransportSelDlg( QWidget *parent, const char *name,
00133   bool modal )
00134   : KDialogBase( parent, name, modal, i18n("Add Transport"), Ok|Cancel, Ok )
00135 {
00136   QFrame *page = makeMainWidget();
00137   QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
00138 
00139   QButtonGroup *group = new QButtonGroup( i18n("Transport"), page );
00140   connect(group, SIGNAL(clicked(int)), SLOT(buttonClicked(int)) );
00141 
00142   topLayout->addWidget( group, 10 );
00143   QVBoxLayout *vlay = new QVBoxLayout( group, spacingHint()*2, spacingHint() );
00144   vlay->addSpacing( fontMetrics().lineSpacing() );
00145 
00146   QRadioButton *radioButton1 = new QRadioButton( i18n("SM&TP"), group );
00147   vlay->addWidget( radioButton1 );
00148   QRadioButton *radioButton2 = new QRadioButton( i18n("&Sendmail"), group );
00149   vlay->addWidget( radioButton2 );
00150 
00151   vlay->addStretch( 10 );
00152 
00153   radioButton1->setChecked(true); // Pop is most common ?
00154   buttonClicked(0);
00155 }
00156 
00157 void KMTransportSelDlg::buttonClicked( int id )
00158 {
00159   mSelectedButton = id;
00160 }
00161 
00162 
00163 int KMTransportSelDlg::selected( void ) const
00164 {
00165   return mSelectedButton;
00166 }
00167 
00168 
00169 KMTransportDialog::KMTransportDialog( const QString & caption,
00170                       KMTransportInfo *transportInfo,
00171                       QWidget *parent, const char *name,
00172                       bool modal )
00173   : KDialogBase( parent, name, modal, caption, Ok|Cancel, Ok, true ),
00174     mServerTest( 0 ),
00175     mTransportInfo( transportInfo ),
00176     mAuthNone( AllAuth ), mAuthSSL( AllAuth ), mAuthTLS( AllAuth )
00177 {
00178   assert(transportInfo != 0);
00179 
00180   if( transportInfo->type == QString::fromLatin1("sendmail") )
00181   {
00182     makeSendmailPage();
00183   } else {
00184     makeSmtpPage();
00185   }
00186 
00187   setupSettings();
00188 }
00189 
00190 
00191 KMTransportDialog::~KMTransportDialog()
00192 {
00193 }
00194 
00195 
00196 void KMTransportDialog::makeSendmailPage()
00197 {
00198   QFrame *page = makeMainWidget();
00199   QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
00200 
00201   mSendmail.titleLabel = new QLabel( page );
00202   mSendmail.titleLabel->setText( i18n("Transport: Sendmail") );
00203   QFont titleFont( mSendmail.titleLabel->font() );
00204   titleFont.setBold( true );
00205   mSendmail.titleLabel->setFont( titleFont );
00206   topLayout->addWidget( mSendmail.titleLabel );
00207   KSeparator *hline = new KSeparator( KSeparator::HLine, page);
00208   topLayout->addWidget( hline );
00209 
00210   QGridLayout *grid = new QGridLayout( topLayout, 3, 3, spacingHint() );
00211   grid->addColSpacing( 1, fontMetrics().maxWidth()*15 );
00212   grid->setRowStretch( 2, 10 );
00213   grid->setColStretch( 1, 10 );
00214 
00215   QLabel *label = new QLabel( i18n("&Name:"), page );
00216   grid->addWidget( label, 0, 0 );
00217   mSendmail.nameEdit = new KLineEdit( page );
00218   label->setBuddy( mSendmail.nameEdit );
00219   grid->addWidget( mSendmail.nameEdit, 0, 1 );
00220 
00221   label = new QLabel( i18n("&Location:"), page );
00222   grid->addWidget( label, 1, 0 );
00223   mSendmail.locationEdit = new KLineEdit( page );
00224   label->setBuddy(mSendmail.locationEdit);
00225   grid->addWidget( mSendmail.locationEdit, 1, 1 );
00226   mSendmail.chooseButton =
00227     new QPushButton( i18n("Choos&e..."), page );
00228   connect( mSendmail.chooseButton, SIGNAL(clicked()),
00229            this, SLOT(slotSendmailChooser()) );
00230 
00231   connect( mSendmail.locationEdit, SIGNAL(textChanged ( const QString & )),
00232            this, SLOT(slotSendmailEditPath(const QString &)) );
00233 
00234   mSendmail.chooseButton->setAutoDefault( false );
00235   grid->addWidget( mSendmail.chooseButton, 1, 2 );
00236   slotSendmailEditPath(mSendmail.locationEdit->text());
00237 }
00238 
00239 void KMTransportDialog::slotSendmailEditPath(const QString & _text)
00240 {
00241   enableButtonOK( !_text.isEmpty() );
00242 }
00243 
00244 void KMTransportDialog::makeSmtpPage()
00245 {
00246   QFrame *page = makeMainWidget();
00247   QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
00248 
00249   mSmtp.titleLabel = new QLabel( page );
00250   mSmtp.titleLabel->setText( i18n("Transport: SMTP") );
00251   QFont titleFont( mSmtp.titleLabel->font() );
00252   titleFont.setBold( true );
00253   mSmtp.titleLabel->setFont( titleFont );
00254   topLayout->addWidget( mSmtp.titleLabel );
00255   KSeparator *hline = new KSeparator( KSeparator::HLine, page);
00256   topLayout->addWidget( hline );
00257 
00258   QTabWidget *tabWidget = new QTabWidget(page);
00259   topLayout->addWidget( tabWidget );
00260 
00261   QWidget *page1 = new QWidget( tabWidget );
00262   tabWidget->addTab( page1, i18n("&General") );
00263 
00264   QGridLayout *grid = new QGridLayout( page1, 14, 2, spacingHint() );
00265   grid->addColSpacing( 1, fontMetrics().maxWidth()*15 );
00266   grid->setRowStretch( 13, 10 );
00267   grid->setColStretch( 1, 10 );
00268 
00269   QLabel *label = new QLabel( i18n("&Name:"), page1 );
00270   grid->addWidget( label, 0, 0 );
00271   mSmtp.nameEdit = new KLineEdit( page1 );
00272   QWhatsThis::add(mSmtp.nameEdit,
00273                   i18n("The name that KMail will use when "
00274                        "referring to this server."));
00275   label->setBuddy( mSmtp.nameEdit );
00276   grid->addWidget( mSmtp.nameEdit, 0, 1 );
00277 
00278   label = new QLabel( i18n("&Host:"), page1 );
00279   grid->addWidget( label, 3, 0 );
00280   mSmtp.hostEdit = new KLineEdit( page1 );
00281   QWhatsThis::add(mSmtp.hostEdit,
00282                   i18n("The domain name or numerical address "
00283                        "of the SMTP server."));
00284   label->setBuddy( mSmtp.hostEdit );
00285   grid->addWidget( mSmtp.hostEdit, 3, 1 );
00286 
00287   label = new QLabel( i18n("&Port:"), page1 );
00288   grid->addWidget( label, 4, 0 );
00289   mSmtp.portEdit = new KLineEdit( page1 );
00290   mSmtp.portEdit->setValidator( new QIntValidator(this) );
00291   QWhatsThis::add(mSmtp.portEdit,
00292                   i18n("The port number that the SMTP server "
00293                        "is listening on. The default port is 25."));
00294   label->setBuddy( mSmtp.portEdit );
00295   grid->addWidget( mSmtp.portEdit, 4, 1 );
00296 
00297   label = new QLabel( i18n("Preco&mmand:"), page1 );
00298   grid->addWidget( label, 5, 0 );
00299   mSmtp.precommand = new KLineEdit( page1 );
00300   QWhatsThis::add(mSmtp.precommand,
00301                   i18n("A command to run locally, prior "
00302                        "to sending email. This can be used "
00303                        "to set up ssh tunnels, for example. "
00304                        "Leave it empty if no command should be run."));
00305   label->setBuddy(mSmtp.precommand);
00306   grid->addWidget( mSmtp.precommand, 5, 1 );
00307 
00308   QFrame* line = new QFrame( page1 );
00309   line->setFrameStyle( QFrame::HLine | QFrame::Plain );
00310   grid->addMultiCellWidget( line, 6, 6, 0, 1 );
00311 
00312   mSmtp.authCheck =
00313     new QCheckBox( i18n("Server &requires authentication"), page1 );
00314   QWhatsThis::add(mSmtp.authCheck,
00315                   i18n("Check this option if your SMTP server "
00316                        "requires authentication before accepting "
00317                        "mail. This is known as "
00318                        "'Authenticated SMTP' or simply ASMTP."));
00319   connect(mSmtp.authCheck, SIGNAL(clicked()),
00320           SLOT(slotRequiresAuthClicked()));
00321   grid->addMultiCellWidget( mSmtp.authCheck, 7, 7, 0, 1 );
00322 
00323   mSmtp.loginLabel = new QLabel( i18n("&Login:"), page1 );
00324   grid->addWidget( mSmtp.loginLabel, 8, 0 );
00325   mSmtp.loginEdit = new KLineEdit( page1 );
00326   mSmtp.loginLabel->setBuddy( mSmtp.loginEdit );
00327   QWhatsThis::add(mSmtp.loginEdit,
00328                   i18n("The user name to send to the server "
00329                        "for authorization"));
00330   grid->addWidget( mSmtp.loginEdit, 8, 1 );
00331 
00332   mSmtp.passwordLabel = new QLabel( i18n("P&assword:"), page1 );
00333   grid->addWidget( mSmtp.passwordLabel, 9, 0 );
00334   mSmtp.passwordEdit = new KLineEdit( page1 );
00335   mSmtp.passwordEdit->setEchoMode( QLineEdit::Password );
00336   mSmtp.passwordLabel->setBuddy( mSmtp.passwordEdit );
00337   QWhatsThis::add(mSmtp.passwordEdit,
00338                   i18n("The password to send to the server "
00339                        "for authorization"));
00340   grid->addWidget( mSmtp.passwordEdit, 9, 1 );
00341 
00342   mSmtp.storePasswordCheck =
00343     new QCheckBox( i18n("&Store SMTP password in configuration file"), page1 );
00344   QWhatsThis::add(mSmtp.storePasswordCheck,
00345                   i18n("Check this option to have KMail store "
00346                   "the SMTP password in its configuration "
00347                   "file. The password is stored in an "
00348                   "obfuscated format, but should not be "
00349                   "considered secure from decryption efforts "
00350                   "if access to the configuration file is obtained."));
00351   grid->addMultiCellWidget( mSmtp.storePasswordCheck, 10, 10, 0, 1 );
00352 
00353   line = new QFrame( page1 );
00354   line->setFrameStyle( QFrame::HLine | QFrame::Plain );
00355   grid->addMultiCellWidget( line, 11, 11, 0, 1 );
00356 
00357   mSmtp.specifyHostnameCheck =
00358     new QCheckBox( i18n("Sen&d custom hostname to server"), page1 );
00359   grid->addMultiCellWidget( mSmtp.specifyHostnameCheck, 12, 12, 0, 1 );
00360   QWhatsThis::add(mSmtp.specifyHostnameCheck,
00361                   i18n("Check this option to have KMail use "
00362                        "a custom hostname when identifying itself "
00363                        "to the mail server."
00364                        "<p>This is useful when your system's hostname "
00365                        "may not be set correctly or to mask your "
00366                        "system's true hostname."));
00367 
00368   mSmtp.localHostnameLabel = new QLabel( i18n("Hos&tname:"), page1 );
00369   grid->addWidget( mSmtp.localHostnameLabel, 13, 0);
00370   mSmtp.localHostnameEdit = new KLineEdit( page1 );
00371   QWhatsThis::add(mSmtp.localHostnameEdit,
00372                   i18n("Enter the hostname KMail should use when "
00373                        "identifying itself to the server."));
00374   mSmtp.localHostnameLabel->setBuddy( mSmtp.localHostnameEdit );
00375   grid->addWidget( mSmtp.localHostnameEdit, 13, 1 );
00376   connect( mSmtp.specifyHostnameCheck, SIGNAL(toggled(bool)),
00377            mSmtp.localHostnameEdit, SLOT(setEnabled(bool)));
00378   connect( mSmtp.specifyHostnameCheck, SIGNAL(toggled(bool)),
00379            mSmtp.localHostnameLabel, SLOT(setEnabled(bool)));
00380 
00381   QWidget *page2 = new QWidget( tabWidget );
00382   tabWidget->addTab( page2, i18n("S&ecurity") );
00383   QVBoxLayout *vlay = new QVBoxLayout( page2, spacingHint() );
00384   mSmtp.encryptionGroup = new QButtonGroup( 1, Qt::Horizontal,
00385     i18n("Encryption"), page2 );
00386   mSmtp.encryptionNone =
00387     new QRadioButton( i18n("&None"), mSmtp.encryptionGroup );
00388   mSmtp.encryptionSSL =
00389     new QRadioButton( i18n("&SSL"), mSmtp.encryptionGroup );
00390   mSmtp.encryptionTLS =
00391     new QRadioButton( i18n("&TLS"), mSmtp.encryptionGroup );
00392   connect(mSmtp.encryptionGroup, SIGNAL(clicked(int)),
00393     SLOT(slotSmtpEncryptionChanged(int)));
00394   vlay->addWidget( mSmtp.encryptionGroup );
00395 
00396   mSmtp.authGroup = new QButtonGroup( 1, Qt::Horizontal,
00397     i18n("Authentication Method"), page2 );
00398   mSmtp.authLogin = new QRadioButton( i18n("Please translate this "
00399     "authentication method only if you have a good reason", "&LOGIN"),
00400     mSmtp.authGroup );
00401   mSmtp.authPlain = new QRadioButton( i18n("Please translate this "
00402     "authentication method only if you have a good reason", "&PLAIN"),
00403     mSmtp.authGroup  );
00404   mSmtp.authCramMd5 = new QRadioButton( i18n("CRAM-MD&5"), mSmtp.authGroup );
00405   mSmtp.authDigestMd5 = new QRadioButton( i18n("&DIGEST-MD5"), mSmtp.authGroup );
00406   vlay->addWidget( mSmtp.authGroup );
00407 
00408   vlay->addStretch();
00409 
00410   QHBoxLayout *buttonLay = new QHBoxLayout( vlay );
00411   mSmtp.checkCapabilities =
00412     new QPushButton( i18n("Check &What the Server Supports"), page2 );
00413   connect(mSmtp.checkCapabilities, SIGNAL(clicked()),
00414     SLOT(slotCheckSmtpCapabilities()));
00415   buttonLay->addStretch();
00416   buttonLay->addWidget( mSmtp.checkCapabilities );
00417 }
00418 
00419 
00420 void KMTransportDialog::setupSettings()
00421 {
00422   if (mTransportInfo->type == "sendmail")
00423   {
00424     mSendmail.nameEdit->setText(mTransportInfo->name);
00425     mSendmail.locationEdit->setText(mTransportInfo->host);
00426   } else {
00427     mSmtp.nameEdit->setText(mTransportInfo->name);
00428     mSmtp.hostEdit->setText(mTransportInfo->host);
00429     mSmtp.portEdit->setText(mTransportInfo->port);
00430     mSmtp.authCheck->setChecked(mTransportInfo->auth);
00431     mSmtp.loginEdit->setText(mTransportInfo->user);
00432     mSmtp.passwordEdit->setText(mTransportInfo->pass);
00433     mSmtp.storePasswordCheck->setChecked(mTransportInfo->storePass);
00434     mSmtp.precommand->setText(mTransportInfo->precommand);
00435     mSmtp.specifyHostnameCheck->setChecked(mTransportInfo->specifyHostname);
00436     mSmtp.localHostnameEdit->setText(mTransportInfo->localHostname);
00437 
00438     if (mTransportInfo->encryption == "TLS")
00439       mSmtp.encryptionTLS->setChecked(TRUE);
00440     else if (mTransportInfo->encryption == "SSL")
00441       mSmtp.encryptionSSL->setChecked(TRUE);
00442     else mSmtp.encryptionNone->setChecked(TRUE);
00443 
00444     if (mTransportInfo->authType == "LOGIN")
00445       mSmtp.authLogin->setChecked(TRUE);
00446     else if (mTransportInfo->authType == "CRAM-MD5")
00447       mSmtp.authCramMd5->setChecked(TRUE);
00448     else if (mTransportInfo->authType == "DIGEST-MD5")
00449       mSmtp.authDigestMd5->setChecked(TRUE);
00450     else mSmtp.authPlain->setChecked(TRUE);
00451 
00452     slotRequiresAuthClicked();
00453     mSmtp.localHostnameEdit->setEnabled(mTransportInfo->specifyHostname);
00454     mSmtp.localHostnameLabel->setEnabled(mTransportInfo->specifyHostname);
00455   }
00456 }
00457 
00458 
00459 void KMTransportDialog::saveSettings()
00460 {
00461   if (mTransportInfo->type == "sendmail")
00462   {
00463     mTransportInfo->name = mSendmail.nameEdit->text().stripWhiteSpace();
00464     mTransportInfo->host = mSendmail.locationEdit->text().stripWhiteSpace();
00465   } else {
00466     mTransportInfo->name = mSmtp.nameEdit->text();
00467     mTransportInfo->host = mSmtp.hostEdit->text().stripWhiteSpace();
00468     mTransportInfo->port = mSmtp.portEdit->text().stripWhiteSpace();
00469     mTransportInfo->auth = mSmtp.authCheck->isChecked();
00470     mTransportInfo->user = mSmtp.loginEdit->text().stripWhiteSpace();
00471     mTransportInfo->pass = mSmtp.passwordEdit->text();
00472     mTransportInfo->storePass = mSmtp.storePasswordCheck->isChecked();
00473     mTransportInfo->precommand = mSmtp.precommand->text().stripWhiteSpace();
00474     mTransportInfo->specifyHostname = mSmtp.specifyHostnameCheck->isChecked();
00475     mTransportInfo->localHostname = mSmtp.localHostnameEdit->text().stripWhiteSpace();
00476 
00477     mTransportInfo->encryption = (mSmtp.encryptionTLS->isChecked()) ? "TLS" :
00478     (mSmtp.encryptionSSL->isChecked()) ? "SSL" : "NONE";
00479 
00480     mTransportInfo->authType = (mSmtp.authLogin->isChecked()) ? "LOGIN" :
00481     (mSmtp.authCramMd5->isChecked()) ? "CRAM-MD5" :
00482     (mSmtp.authDigestMd5->isChecked()) ? "DIGEST-MD5" : "PLAIN";
00483   }
00484 }
00485 
00486 
00487 void KMTransportDialog::slotSendmailChooser()
00488 {
00489   KFileDialog dialog("/", QString::null, this, 0, true );
00490   dialog.setCaption(i18n("Choose sendmail Location") );
00491 
00492   if( dialog.exec() == QDialog::Accepted )
00493   {
00494     KURL url = dialog.selectedURL();
00495     if( url.isEmpty() == true )
00496     {
00497       return;
00498     }
00499 
00500     if( url.isLocalFile() == false )
00501     {
00502       KMessageBox::sorry( 0, i18n( "Only local files allowed." ) );
00503       return;
00504     }
00505 
00506     mSendmail.locationEdit->setText( url.path() );
00507   }
00508 }
00509 
00510 
00511 void KMTransportDialog::slotRequiresAuthClicked()
00512 {
00513   bool b = mSmtp.authCheck->isChecked();
00514   mSmtp.loginLabel->setEnabled(b);
00515   mSmtp.loginEdit->setEnabled(b);
00516   mSmtp.passwordLabel->setEnabled(b);
00517   mSmtp.passwordEdit->setEnabled(b);
00518   mSmtp.storePasswordCheck->setEnabled(b);
00519   mSmtp.authGroup->setEnabled(b);
00520 }
00521 
00522 
00523 void KMTransportDialog::slotSmtpEncryptionChanged(int id)
00524 {
00525   kdDebug(5006) << "KMTransportDialog::slotSmtpEncryptionChanged( " << id << " )" << endl;
00526   // adjust SSL port:
00527   if (id == SSL || mSmtp.portEdit->text() == "465")
00528     mSmtp.portEdit->setText((id == SSL) ? "465" : "25");
00529 
00530   // switch supported auth methods:
00531   QButton * old = mSmtp.authGroup->selected();
00532   int authMethods = id == TLS ? mAuthTLS : id == SSL ? mAuthSSL : mAuthNone ;
00533   enableAuthMethods( authMethods );
00534   if ( !old->isEnabled() )
00535     checkHighest( mSmtp.authGroup );
00536 }
00537 
00538 void KMTransportDialog::enableAuthMethods( unsigned int auth ) {
00539   kdDebug(5006) << "KMTransportDialog::enableAuthMethods( " << auth << " )" << endl;
00540   mSmtp.authPlain->setEnabled( auth & PLAIN );
00541   // LOGIN doesn't offer anything over PLAIN, requires more server
00542   // roundtrips and is not an official SASL mechanism, but a MS-ism,
00543   // so only enable it if PLAIN isn't available:
00544   mSmtp.authLogin->setEnabled( auth & LOGIN && !(auth & PLAIN));
00545   mSmtp.authCramMd5->setEnabled( auth & CRAM_MD5 );
00546   mSmtp.authDigestMd5->setEnabled( auth & DIGEST_MD5 );
00547 }
00548 
00549 unsigned int KMTransportDialog::authMethodsFromString( const QString & s ) {
00550   unsigned int result = 0;
00551   QStringList sl = QStringList::split( '\n', s.upper() );
00552   for ( QStringList::const_iterator it = sl.begin() ; it != sl.end() ; ++it )
00553     if (  *it == "SASL/LOGIN" )
00554       result |= LOGIN;
00555     else if ( *it == "SASL/PLAIN" )
00556       result |= PLAIN;
00557     else if ( *it == "SASL/CRAM-MD5" )
00558       result |= CRAM_MD5;
00559     else if ( *it == "SASL/DIGEST-MD5" )
00560       result |= DIGEST_MD5;
00561   return result;
00562 }
00563 
00564 unsigned int KMTransportDialog::authMethodsFromStringList( const QStringList & sl ) {
00565   unsigned int result = 0;
00566   for ( QStringList::const_iterator it = sl.begin() ; it != sl.end() ; ++it )
00567     if ( *it == "LOGIN" )
00568       result |= LOGIN;
00569     else if ( *it == "PLAIN" )
00570       result |= PLAIN;
00571     else if ( *it == "CRAM-MD5" )
00572       result |= CRAM_MD5;
00573     else if ( *it == "DIGEST-MD5" )
00574       result |= DIGEST_MD5;
00575   return result;
00576 }
00577 
00578 void KMTransportDialog::slotCheckSmtpCapabilities()
00579 {
00580   delete mServerTest;
00581   mServerTest = new KMServerTest(SMTP_PROTOCOL, mSmtp.hostEdit->text(),
00582     mSmtp.portEdit->text().toInt());
00583   connect( mServerTest,
00584            SIGNAL( capabilities( const QStringList &, const QStringList &,
00585                                  const QString &, const QString &,
00586                                  const QString & )),
00587            this,
00588            SLOT( slotSmtpCapabilities( const QStringList &,
00589                                        const QStringList &, const QString &,
00590                                        const QString &, const QString & ) ) );
00591   mSmtp.checkCapabilities->setEnabled(FALSE);
00592 }
00593 
00594 
00595 void KMTransportDialog::checkHighest(QButtonGroup *btnGroup)
00596 {
00597   for ( int i = btnGroup->count() - 1; i >= 0 ; --i )
00598   {
00599     QButton * btn = btnGroup->find(i);
00600     if (btn && btn->isEnabled())
00601     {
00602       btn->animateClick();
00603       return;
00604     }
00605   }
00606 }
00607 
00608 
00609 void KMTransportDialog::slotSmtpCapabilities( const QStringList & capaNormal,
00610                                               const QStringList & capaSSL,
00611                                               const QString & authNone,
00612                                               const QString & authSSL,
00613                                               const QString & authTLS )
00614 {
00615   mSmtp.checkCapabilities->setEnabled( true );
00616   kdDebug(5006) << "KMTransportDialog::slotSmtpCapabilities( ..., "
00617         << authNone << ", " << authSSL << ", " << authTLS << " )" << endl;
00618   mSmtp.encryptionNone->setEnabled( !capaNormal.isEmpty() );
00619   mSmtp.encryptionSSL->setEnabled( !capaSSL.isEmpty() );
00620   mSmtp.encryptionTLS->setEnabled( capaNormal.findIndex("STARTTLS") != -1 );
00621   if ( authNone.isEmpty() && authSSL.isEmpty() && authTLS.isEmpty() ) {
00622     // slave doesn't seem to support "* AUTH METHODS" metadata (or server can't do AUTH)
00623     mAuthNone = authMethodsFromStringList( capaNormal );
00624     if ( mSmtp.encryptionTLS->isEnabled() )
00625       mAuthTLS = mAuthNone;
00626     else
00627       mAuthTLS = 0;
00628     mAuthSSL = authMethodsFromStringList( capaSSL );
00629   }
00630   else {
00631     mAuthNone = authMethodsFromString( authNone );
00632     mAuthSSL = authMethodsFromString( authSSL );
00633     mAuthTLS = authMethodsFromString( authTLS );
00634   }
00635   kdDebug(5006) << "mAuthNone = " << mAuthNone
00636                 << "; mAuthSSL = " << mAuthSSL
00637                 << "; mAuthTLS = " << mAuthTLS << endl;
00638   checkHighest( mSmtp.encryptionGroup );
00639   delete mServerTest;
00640   mServerTest = 0;
00641 }
00642 
00643 
00644 void KMTransportDialog::slotOk()
00645 {
00646   saveSettings();
00647   accept();
00648 }
00649 
00650 
00651 #include "kmtransport.moc"
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Aug 23 18:21:32 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003