kio Library API Documentation

ksslinfodlg.cc

00001 /* This file is part of the KDE project
00002  *
00003  * Copyright (C) 2000,2001 George Staikos <staikos@kde.org>
00004  * Copyright (C) 2000 Malte Starostik <malte@kde.org>
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Library General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Library General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Library General Public License
00017  * along with this library; see the file COPYING.LIB.  If not, write to
00018  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00019  * Boston, MA 02111-1307, USA.
00020  */
00021 
00022 #include "ksslinfodlg.h"
00023 
00024 #include <kssl.h>
00025 
00026 #include <qlayout.h>
00027 #include <qframe.h>
00028 #include <qlabel.h>
00029 #include <qscrollview.h>
00030 #include <qfile.h>
00031 
00032 #include <kapplication.h>
00033 #include <kglobal.h>
00034 #include <klocale.h>
00035 #include <kprocess.h>
00036 #include <kiconloader.h>
00037 #include <kglobalsettings.h>
00038 #include <ksqueezedtextlabel.h>
00039 #include <kurllabel.h>
00040 //#include <kstandarddirs.h>
00041 //#include <krun.h>
00042 #include <kcombobox.h>
00043 #include <kpushbutton.h>
00044 #include <kstdguiitem.h>
00045 
00046 #include "ksslcertificate.h"
00047 #include "ksslcertchain.h"
00048 #include "ksslsigners.h"
00049 
00050 
00051 class KSSLInfoDlg::KSSLInfoDlgPrivate {
00052 private:
00053     friend class KSSLInfoDlg;
00054     bool m_secCon;
00055     QGridLayout *m_layout;
00056     KComboBox *_chain;
00057     KSSLCertificate *_cert;
00058     KSSLCertificate::KSSLValidationList _cert_ksvl;
00059 
00060     bool inQuestion;
00061 
00062     QLabel *_serialNum;
00063     QLabel *_csl;
00064     QLabel *_validFrom;
00065     QLabel *_validUntil;
00066     QLabel *_digest;
00067 
00068     QLabel *pixmap;
00069     QLabel *info;
00070 
00071     KSSLCertBox *_subject, *_issuer;
00072 };
00073 
00074 
00075 
00076 KSSLInfoDlg::KSSLInfoDlg(bool secureConnection, QWidget *parent, const char *name, bool modal)
00077  : KDialog(parent, name, modal, Qt::WDestructiveClose), d(new KSSLInfoDlgPrivate) {
00078     QVBoxLayout *topLayout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
00079     d->m_secCon = secureConnection;
00080     d->m_layout = new QGridLayout(topLayout, 3, 3, KDialog::spacingHint());
00081     d->m_layout->setColStretch(1, 1);
00082     d->m_layout->setColStretch(2, 1);
00083 
00084     d->pixmap = new QLabel(this);
00085     d->m_layout->addWidget(d->pixmap, 0, 0);
00086 
00087     d->info = new QLabel(this);
00088     d->m_layout->addWidget(d->info, 0, 1);
00089 
00090     if (KSSL::doesSSLWork()) {
00091         if (d->m_secCon) {
00092             d->pixmap->setPixmap(BarIcon("encrypted"));
00093             d->info->setText(i18n("Current connection is secured with SSL."));
00094         } else {
00095             d->pixmap->setPixmap(BarIcon("decrypted"));
00096             d->info->setText(i18n("Current connection is not secured with SSL."));
00097         }
00098     } else {
00099         d->pixmap->setPixmap(BarIcon("decrypted"));
00100         d->info->setText(i18n("SSL support is not available in this build of KDE."));
00101     }
00102     d->m_layout->addRowSpacing( 0, 50 ); // give minimum height to look better
00103 
00104     QHBoxLayout *buttonLayout = new QHBoxLayout(topLayout, KDialog::spacingHint());
00105     buttonLayout->addStretch( 1 );
00106 
00107     QPushButton *button;
00108 
00109     bool buttonicon =  KGlobalSettings::showIconsOnPushButtons();
00110     if (KSSL::doesSSLWork()) {
00111       button = new QPushButton(buttonicon ? SmallIcon("configure") : QPixmap(0), i18n("C&ryptography Configuration..."), this);
00112       connect(button, SIGNAL(clicked()), SLOT(launchConfig()));
00113       buttonLayout->addWidget( button );
00114     }
00115 
00116     button = new KPushButton(KStdGuiItem::close(), this);
00117     connect(button, SIGNAL(clicked()), SLOT(close()));
00118     buttonLayout->addWidget( button );
00119 
00120     button->setFocus();
00121 
00122     setCaption(i18n("KDE SSL Information"));
00123     d->inQuestion = false;
00124 }
00125 
00126 
00127 KSSLInfoDlg::~KSSLInfoDlg() {
00128     delete d;
00129 }
00130 
00131 void KSSLInfoDlg::launchConfig() {
00132   KProcess p;
00133   p << "kcmshell" << "crypto";
00134   p.start(KProcess::DontCare);
00135 }
00136 
00137 
00138 void KSSLInfoDlg::setSecurityInQuestion(bool isIt) {
00139    d->inQuestion = isIt;
00140    if (KSSL::doesSSLWork())
00141    if (isIt) {
00142       d->pixmap->setPixmap(BarIcon("halfencrypted"));
00143       if (d->m_secCon) {
00144          d->info->setText(i18n("The main part of this document is secured with SSL, but some parts are not."));
00145       } else {
00146          d->info->setText(i18n("Some of this document is secured with SSL, but the main part is not."));
00147       }
00148    } else {
00149       if (d->m_secCon) {
00150          d->pixmap->setPixmap(BarIcon("encrypted"));
00151          d->info->setText(i18n("Current connection is secured with SSL."));
00152       } else {
00153          d->pixmap->setPixmap(BarIcon("decrypted"));
00154          d->info->setText(i18n("Current connection is not secured with SSL."));
00155       }
00156    }
00157 }
00158 
00159 
00160 void KSSLInfoDlg::setup( KSSL & ssl, const QString & ip, const QString & url )
00161 {
00162     setup(
00163         &ssl.peerInfo().getPeerCertificate(),
00164         ip,
00165         url,
00166         ssl.connectionInfo().getCipher(),
00167         ssl.connectionInfo().getCipherDescription(),
00168         ssl.connectionInfo().getCipherVersion(),
00169         ssl.connectionInfo().getCipherUsedBits(),
00170         ssl.connectionInfo().getCipherBits(),
00171         ssl.peerInfo().getPeerCertificate().validate()
00172         );
00173 }
00174 
00175 void KSSLInfoDlg::setup(KSSLCertificate *cert,
00176                         const QString& ip, const QString& url,
00177                         const QString& cipher, const QString& cipherdesc,
00178                         const QString& sslversion, int usedbits, int bits,
00179                         KSSLCertificate::KSSLValidation /*certState*/) {
00180 // Needed to put the GUI stuff here to get the layouting right
00181 
00182     d->_cert = cert;
00183 
00184     QGridLayout *layout = new QGridLayout(4, 2, KDialog::spacingHint());
00185 
00186     layout->addWidget(new QLabel(i18n("Chain:"), this), 0, 0);
00187     d->_chain = new KComboBox(this);
00188     layout->addMultiCellWidget(d->_chain, 1, 1, 0, 1);
00189     connect(d->_chain, SIGNAL(activated(int)), this, SLOT(slotChain(int)));
00190 
00191     d->_chain->clear();
00192 
00193     if (cert->chain().isValid() && cert->chain().depth() > 1) {
00194        d->_chain->setEnabled(true);
00195        d->_chain->insertItem(i18n("0 - Site Certificate"));
00196        int cnt = 0;
00197        QPtrList<KSSLCertificate> cl = cert->chain().getChain();
00198        for (KSSLCertificate *c = cl.first(); c != 0; c = cl.next()) {
00199          KSSLX509Map map(c->getSubject());
00200      QString id;
00201      id = map.getValue("CN");
00202      if (id.length() == 0)
00203          id = map.getValue("O");
00204      if (id.length() == 0)
00205          id = map.getValue("OU");
00206          d->_chain->insertItem(QString::number(++cnt)+" - "+id);
00207        }
00208        d->_chain->setCurrentItem(0);
00209     } else d->_chain->setEnabled(false);
00210 
00211     layout->addWidget(new QLabel(i18n("Peer certificate:"), this), 2, 0);
00212     layout->addWidget(d->_subject = static_cast<KSSLCertBox*>(buildCertInfo(cert->getSubject())), 3, 0);
00213     layout->addWidget(new QLabel(i18n("Issuer:"), this), 2, 1);
00214     layout->addWidget(d->_issuer = static_cast<KSSLCertBox*>(buildCertInfo(cert->getIssuer())), 3, 1);
00215     d->m_layout->addMultiCell(layout, 1, 1, 0, 2);
00216 
00217     layout = new QGridLayout(11, 2, KDialog::spacingHint());
00218     layout->setColStretch(1, 1);
00219     layout->addWidget(new QLabel(i18n("IP address:"), this), 0, 0);
00220     layout->addWidget(new QLabel(ip, this), 0, 1);
00221     layout->addWidget(new QLabel(i18n("URL:"), this), 1, 0);
00222     KSqueezedTextLabel *urlLabel = new KSqueezedTextLabel(url, this);
00223     layout->addWidget(urlLabel, 1, 1);
00224     layout->addWidget(new QLabel(i18n("Certificate state:"), this), 2, 0);
00225 
00226     layout->addWidget(d->_csl = new QLabel("", this), 2, 1);
00227 
00228     update();
00229 
00230     layout->addWidget(new QLabel(i18n("Valid from:"), this), 3, 0);
00231     layout->addWidget(d->_validFrom = new QLabel("", this), 3, 1);
00232     layout->addWidget(new QLabel(i18n("Valid until:"), this), 4, 0);
00233     layout->addWidget(d->_validUntil = new QLabel("", this), 4, 1);
00234 
00235     layout->addWidget(new QLabel(i18n("Serial number:"), this), 5, 0);
00236     layout->addWidget(d->_serialNum = new QLabel("", this), 5, 1);
00237     layout->addWidget(new QLabel(i18n("MD5 digest:"), this), 6, 0);
00238     layout->addWidget(d->_digest = new QLabel("", this), 6, 1);
00239 
00240     layout->addWidget(new QLabel(i18n("Cipher in use:"), this), 7, 0);
00241     layout->addWidget(new QLabel(cipher, this), 7, 1);
00242     layout->addWidget(new QLabel(i18n("Details:"), this), 8, 0);
00243     layout->addWidget(new QLabel(cipherdesc.simplifyWhiteSpace(), this), 8, 1);
00244     layout->addWidget(new QLabel(i18n("SSL version:"), this), 9, 0);
00245     layout->addWidget(new QLabel(sslversion, this), 9, 1);
00246     layout->addWidget(new QLabel(i18n("Cipher strength:"), this), 10, 0);
00247     layout->addWidget(new QLabel(i18n("%1 bits used of a %2 bit cipher").arg(usedbits).arg(bits), this), 10, 1);
00248     d->m_layout->addMultiCell(layout, 2, 2, 0, 2);
00249 
00250     displayCert(cert);
00251 }
00252 
00253 void KSSLInfoDlg::setCertState(const QString &errorNrs)
00254 {
00255     d->_cert_ksvl.clear();
00256     QStringList errors = QStringList::split(':', errorNrs);
00257     for(QStringList::ConstIterator it = errors.begin();
00258         it != errors.end(); ++it)
00259     {
00260        d->_cert_ksvl << (KSSLCertificate::KSSLValidation) (*it).toInt();
00261     }
00262 }
00263 
00264 void KSSLInfoDlg::displayCert(KSSLCertificate *x) {
00265 QPalette cspl;
00266 
00267    d->_serialNum->setText(x->getSerialNumber());
00268 
00269    cspl = d->_validFrom->palette();
00270    if (x->getQDTNotBefore() > QDateTime::currentDateTime(Qt::UTC))
00271       cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
00272    else cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
00273    d->_validFrom->setPalette(cspl);
00274    d->_validFrom->setText(x->getNotBefore());
00275 
00276    cspl = d->_validUntil->palette();
00277    if (x->getQDTNotAfter() < QDateTime::currentDateTime(Qt::UTC))
00278       cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
00279    else cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
00280    d->_validUntil->setPalette(cspl);
00281    d->_validUntil->setText(x->getNotAfter());
00282 
00283    cspl = d->_csl->palette();
00284 
00285    KSSLCertificate::KSSLValidation ksv;
00286    KSSLCertificate::KSSLValidationList ksvl;
00287    if ((x == d->_cert) && !d->_cert_ksvl.isEmpty()) {
00288       ksvl = d->_cert_ksvl;
00289       ksv = ksvl.first();
00290    } else {
00291       ksv = x->validate();
00292       if (ksv == KSSLCertificate::SelfSigned) {
00293          if (x->getQDTNotAfter() > QDateTime::currentDateTime(Qt::UTC) &&
00294              x->getQDTNotBefore() < QDateTime::currentDateTime(Qt::UTC)) {
00295             if (KSSLSigners().useForSSL(*x))
00296                ksv = KSSLCertificate::Ok;
00297      } else {
00298             ksv = KSSLCertificate::Expired;
00299      }
00300       }
00301       ksvl << ksv;
00302    }
00303 
00304    if (ksv != KSSLCertificate::Ok) {
00305       cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
00306    } else {
00307       cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
00308    }
00309    d->_csl->setPalette(cspl);
00310 
00311    QString errorStr;
00312    for(KSSLCertificate::KSSLValidationList::ConstIterator it = ksvl.begin();
00313        it != ksvl.end(); ++it) {
00314       if (!errorStr.isEmpty())
00315          errorStr.append('\n');
00316       errorStr += KSSLCertificate::verifyText(*it);
00317    }
00318 
00319    d->_csl->setText(errorStr);
00320    d->_csl->setMinimumSize(d->_csl->sizeHint());
00321 
00322    d->_subject->setValues(x->getSubject());
00323    d->_issuer->setValues(x->getIssuer());
00324 
00325    d->_digest->setText(x->getMD5DigestText());
00326 }
00327 
00328 
00329 void KSSLInfoDlg::slotChain(int x) {
00330   if (x == 0) {
00331      displayCert(d->_cert);
00332   } else {
00333      QPtrList<KSSLCertificate> cl = d->_cert->chain().getChain();
00334      cl.setAutoDelete(true);
00335      for (int i = 0; i < x-1; i++)
00336         cl.remove((unsigned int)0);
00337      KSSLCertificate thisCert = *(cl.at(0));
00338      cl.remove((unsigned int)0);
00339      thisCert.chain().setChain(cl);
00340      displayCert(&thisCert);
00341   }
00342 }
00343 
00344 
00345 KSSLCertBox *KSSLInfoDlg::certInfoWidget(QWidget *parent, const QString &certName, QWidget *mailCatcher) {
00346     KSSLCertBox *result = new KSSLCertBox(parent);
00347     result->setValues(certName, mailCatcher);
00348     return result;
00349 }
00350 
00351 
00352 KSSLCertBox::KSSLCertBox(QWidget *parent, const char *name, WFlags f)
00353 :            QScrollView(parent, name, f)
00354 {
00355     _frame = NULL;
00356     setBackgroundMode(PaletteBackground);
00357 }
00358 
00359 
00360 void KSSLCertBox::setValues(QString certName, QWidget *mailCatcher) {
00361     KSSLX509Map cert(certName);
00362     QString tmp;
00363 
00364     if (_frame) {
00365        removeChild(_frame);
00366        delete _frame;
00367     }
00368 
00369     viewport()->setBackgroundMode(QWidget::PaletteButton);
00370     _frame = new QFrame(this);
00371     QGridLayout *grid = new QGridLayout(_frame, 1, 2, KDialog::marginHint(), KDialog::spacingHint());
00372     grid->setAutoAdd(true);
00373     QLabel *label;
00374     if (!(tmp = cert.getValue("O")).isEmpty()) {
00375         label = new QLabel(i18n("Organization:"), _frame);
00376         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00377         new QLabel(tmp, _frame);
00378     }
00379     if (!(tmp = cert.getValue("OU")).isEmpty()) {
00380         label = new QLabel(i18n("Organizational unit:"), _frame);
00381         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00382         new QLabel(tmp, _frame);
00383     }
00384     if (!(tmp = cert.getValue("L")).isEmpty()) {
00385         label = new QLabel(i18n("Locality:"), _frame);
00386         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00387         new QLabel(tmp, _frame);
00388     }
00389     if (!(tmp = cert.getValue("ST")).isEmpty()) {
00390         label = new QLabel(i18n("Federal State","State:"), _frame);
00391         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00392         new QLabel(tmp, _frame);
00393     }
00394     if (!(tmp = cert.getValue("C")).isEmpty()) {
00395         label = new QLabel(i18n("Country:"), _frame);
00396         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00397         new QLabel(tmp, _frame);
00398     }
00399     if (!(tmp = cert.getValue("CN")).isEmpty()) {
00400         label = new QLabel(i18n("Common name:"), _frame);
00401         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00402         new QLabel(tmp, _frame);
00403     }
00404     if (!(tmp = cert.getValue("Email")).isEmpty()) {
00405         label = new QLabel(i18n("Email:"), _frame);
00406         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00407         if (mailCatcher) {
00408            KURLLabel *mail = new KURLLabel(tmp, tmp, _frame);
00409            connect(mail, SIGNAL(leftClickedURL(const QString &)), mailCatcher, SLOT(mailClicked(const QString &)));
00410         } else {
00411            new QLabel(tmp, _frame);
00412         }
00413     }
00414     addChild(_frame);
00415     updateScrollBars();
00416     _frame->show();
00417     show();
00418 }
00419 
00420 
00421 QScrollView *KSSLInfoDlg::buildCertInfo(const QString &certName) {
00422 return KSSLInfoDlg::certInfoWidget(this, certName, this);
00423 }
00424 
00425 void KSSLInfoDlg::urlClicked(const QString &url) {
00426     kapp->invokeBrowser(url);
00427 }
00428 
00429 void KSSLInfoDlg::mailClicked(const QString &url) {
00430     kapp->invokeMailer(url, QString::null);
00431 }
00432 
00433 #include "ksslinfodlg.moc"
00434 
KDE Logo
This file is part of the documentation for kio Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Sep 30 05:18:27 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2003