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 <qpushbutton.h>
00028 #include <qframe.h>
00029 #include <qlabel.h>
00030 #include <qscrollview.h>
00031 #include <qfile.h>
00032 
00033 #include <kapplication.h>
00034 #include <kglobal.h>
00035 #include <klocale.h>
00036 #include <kprocess.h>
00037 #include <kiconloader.h>
00038 #include <kglobalsettings.h>
00039 #include <kurllabel.h>
00040 //#include <kstandarddirs.h>
00041 //#include <krun.h>
00042 #include <kcombobox.h>
00043 #include "ksslcertificate.h"
00044 #include "ksslcertchain.h"
00045 #include "ksslsigners.h"
00046 
00047 
00048 class KSSLInfoDlg::KSSLInfoDlgPrivate {
00049 private:
00050     friend class KSSLInfoDlg;
00051     bool m_secCon;
00052     QGridLayout *m_layout;
00053     KComboBox *_chain;
00054     KSSLCertificate *_cert;
00055     bool inQuestion;
00056 
00057     QLabel *_serialNum;
00058     QLabel *_csl;
00059     QLabel *_validFrom;
00060     QLabel *_validUntil;
00061     QLabel *_digest;
00062 
00063     QLabel *pixmap;
00064     QLabel *info;
00065 
00066     KSSLCertBox *_subject, *_issuer;
00067 };
00068 
00069 
00070 
00071 KSSLInfoDlg::KSSLInfoDlg(bool secureConnection, QWidget *parent, const char *name, bool modal)
00072  : KDialog(parent, name, modal, Qt::WDestructiveClose), d(new KSSLInfoDlgPrivate) {
00073     QVBoxLayout *topLayout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
00074     d->m_secCon = secureConnection;
00075     d->m_layout = new QGridLayout(topLayout, 3, 3, KDialog::spacingHint());
00076     d->m_layout->setColStretch(1, 1);
00077     d->m_layout->setColStretch(2, 1);
00078 
00079     d->pixmap = new QLabel(this);
00080     d->m_layout->addWidget(d->pixmap, 0, 0);
00081 
00082     d->info = new QLabel(this);
00083     d->m_layout->addWidget(d->info, 0, 1);
00084 
00085     if (KSSL::doesSSLWork()) {
00086         if (d->m_secCon) {
00087             d->pixmap->setPixmap(BarIcon("encrypted"));
00088             d->info->setText(i18n("Current connection is secured with SSL."));
00089         } else {
00090             d->pixmap->setPixmap(BarIcon("decrypted"));
00091             d->info->setText(i18n("Current connection is not secured with SSL."));
00092         }
00093     } else {
00094         d->pixmap->setPixmap(BarIcon("decrypted"));
00095         d->info->setText(i18n("SSL support is not available in this build of KDE."));
00096     }
00097     d->m_layout->addRowSpacing( 0, 50 ); // give minimum height to look better
00098 
00099     QHBoxLayout *buttonLayout = new QHBoxLayout(topLayout, KDialog::spacingHint());
00100     buttonLayout->addStretch( 1 );
00101 
00102     QPushButton *button;
00103 
00104     if (KSSL::doesSSLWork()) {
00105       button = new QPushButton(i18n("C&ryptography Configuration..."), this);
00106       connect(button, SIGNAL(clicked()), SLOT(launchConfig()));
00107       buttonLayout->addWidget( button );
00108     }
00109 
00110     button = new QPushButton(i18n("&Close"), this);
00111     connect(button, SIGNAL(clicked()), SLOT(close()));
00112     buttonLayout->addWidget( button );
00113 
00114     button->setFocus();
00115 
00116     setCaption(i18n("KDE SSL Information"));
00117     d->inQuestion = false;
00118 }
00119 
00120 
00121 KSSLInfoDlg::~KSSLInfoDlg() {
00122     delete d;
00123 }
00124 
00125 void KSSLInfoDlg::launchConfig() {
00126   KProcess p;
00127   p << "kcmshell" << "crypto";
00128   p.start(KProcess::DontCare);
00129 }
00130 
00131 
00132 void KSSLInfoDlg::setSecurityInQuestion(bool isIt) {
00133    d->inQuestion = isIt;
00134    if (KSSL::doesSSLWork())
00135    if (isIt) {
00136       d->pixmap->setPixmap(BarIcon("halfencrypted"));
00137       if (d->m_secCon) {
00138          d->info->setText(i18n("The main part of this document is secured with SSL, but some parts are not."));
00139       } else {
00140          d->info->setText(i18n("Some of this document is secured with SSL, but the main part is not."));
00141       }
00142    } else {
00143       if (d->m_secCon) {
00144          d->pixmap->setPixmap(BarIcon("encrypted"));
00145          d->info->setText(i18n("Current connection is secured with SSL."));
00146       } else {
00147          d->pixmap->setPixmap(BarIcon("decrypted"));
00148          d->info->setText(i18n("Current connection is not secured with SSL."));
00149       }
00150    }
00151 }
00152 
00153 
00154 void KSSLInfoDlg::setup( KSSL & ssl, const QString & ip, const QString & url )
00155 {
00156     setup(
00157         &ssl.peerInfo().getPeerCertificate(),
00158         ip,
00159         url,
00160         ssl.connectionInfo().getCipher(),
00161         ssl.connectionInfo().getCipherDescription(),
00162         ssl.connectionInfo().getCipherVersion(),
00163         ssl.connectionInfo().getCipherUsedBits(),
00164         ssl.connectionInfo().getCipherBits(),
00165         ssl.peerInfo().getPeerCertificate().validate()
00166         );
00167 }
00168 
00169 void KSSLInfoDlg::setup(KSSLCertificate *cert,
00170                         const QString& ip, const QString& url,
00171                         const QString& cipher, const QString& cipherdesc,
00172                         const QString& sslversion, int usedbits, int bits,
00173                         KSSLCertificate::KSSLValidation /*certState*/) {
00174 // Needed to put the GUI stuff here to get the layouting right
00175 
00176     d->_cert = cert;
00177 
00178     QGridLayout *layout = new QGridLayout(4, 2, KDialog::spacingHint());
00179 
00180     layout->addWidget(new QLabel(i18n("Chain:"), this), 0, 0);
00181     d->_chain = new KComboBox(this);
00182     layout->addMultiCellWidget(d->_chain, 1, 1, 0, 1);
00183     connect(d->_chain, SIGNAL(activated(int)), this, SLOT(slotChain(int)));
00184 
00185     d->_chain->clear();
00186 
00187     if (cert->chain().isValid() && cert->chain().depth() > 1) {
00188        d->_chain->setEnabled(true);
00189        d->_chain->insertItem(i18n("0 - Site Certificate"));
00190        int cnt = 0;
00191        QPtrList<KSSLCertificate> cl = cert->chain().getChain();
00192        for (KSSLCertificate *c = cl.first(); c != 0; c = cl.next()) {
00193          KSSLX509Map map(c->getSubject());
00194      QString id;
00195      id = map.getValue("CN");
00196      if (id.length() == 0)
00197          id = map.getValue("O");
00198      if (id.length() == 0)
00199          id = map.getValue("OU");
00200          d->_chain->insertItem(QString::number(++cnt)+" - "+id);
00201        }
00202        d->_chain->setCurrentItem(0);
00203     } else d->_chain->setEnabled(false);
00204 
00205     layout->addWidget(new QLabel(i18n("Peer certificate:"), this), 2, 0);
00206     layout->addWidget(d->_subject = dynamic_cast<KSSLCertBox*>(buildCertInfo(cert->getSubject())), 3, 0);
00207     layout->addWidget(new QLabel(i18n("Issuer:"), this), 2, 1);
00208     layout->addWidget(d->_issuer = dynamic_cast<KSSLCertBox*>(buildCertInfo(cert->getIssuer())), 3, 1);
00209     d->m_layout->addMultiCell(layout, 1, 1, 0, 2);
00210 
00211     layout = new QGridLayout(11, 2, KDialog::spacingHint());
00212     layout->setColStretch(1, 1);
00213     layout->addWidget(new QLabel(i18n("IP address:"), this), 0, 0);
00214     layout->addWidget(new QLabel(ip, this), 0, 1);
00215     layout->addWidget(new QLabel(i18n("URL:"), this), 1, 0);
00216     // truncate the label if it will be too long
00217     QString urllabel;
00218     if (url.length() > 80) {
00219       urllabel = url.left(80) + " ...";
00220     } else urllabel = url;
00221     KURLLabel *urlLabel = new KURLLabel(url, urllabel, this);
00222     layout->addWidget(urlLabel, 1, 1);
00223     connect(urlLabel, SIGNAL(leftClickedURL(const QString &)), SLOT(urlClicked(const QString &)));
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     urlLabel->setTextFormat(Qt::PlainText);
00251     d->_serialNum->setTextFormat(Qt::PlainText);
00252     d->_csl->setTextFormat(Qt::PlainText);
00253     d->_validFrom->setTextFormat(Qt::PlainText);
00254     d->_validUntil->setTextFormat(Qt::PlainText);
00255     d->_digest->setTextFormat(Qt::PlainText);
00256 
00257     displayCert(cert);
00258 }
00259 
00260 
00261 void KSSLInfoDlg::displayCert(KSSLCertificate *x) {
00262 QPalette cspl;
00263 
00264    d->_serialNum->setText(x->getSerialNumber());
00265 
00266    cspl = d->_validFrom->palette();
00267    if (x->getQDTNotBefore() > QDateTime::currentDateTime())
00268       cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
00269    else cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
00270    d->_validFrom->setPalette(cspl);
00271    d->_validFrom->setText(x->getNotBefore());
00272 
00273    cspl = d->_validUntil->palette();
00274    if (x->getQDTNotAfter() < QDateTime::currentDateTime())
00275       cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
00276    else cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
00277    d->_validUntil->setPalette(cspl);
00278    d->_validUntil->setText(x->getNotAfter());
00279 
00280    cspl = d->_csl->palette();
00281    KSSLCertificate::KSSLValidation ksv = x->validate();
00282    if (ksv == KSSLCertificate::SelfSigned) {
00283       if (x->getQDTNotAfter() > QDateTime::currentDateTime() &&
00284           x->getQDTNotBefore() < QDateTime::currentDateTime()) {
00285           if (KSSLSigners().useForSSL(*x))
00286              ksv = KSSLCertificate::Ok;
00287       } else {
00288           ksv = KSSLCertificate::Expired;
00289       }
00290    }
00291 
00292    if (ksv != KSSLCertificate::Ok)
00293       cspl.setColor(QColorGroup::Foreground, QColor(196,33,21));
00294    else cspl.setColor(QColorGroup::Foreground, QColor(42,153,59));
00295    d->_csl->setPalette(cspl);
00296 
00297    d->_csl->setText(KSSLCertificate::verifyText(ksv));
00298 
00299    d->_subject->setValues(x->getSubject());
00300    d->_issuer->setValues(x->getIssuer());
00301 
00302    d->_digest->setText(x->getMD5DigestText());
00303 }
00304 
00305 
00306 void KSSLInfoDlg::slotChain(int x) {
00307   if (x == 0) {
00308      displayCert(d->_cert);
00309   } else {
00310      QPtrList<KSSLCertificate> cl = d->_cert->chain().getChain();
00311      cl.setAutoDelete(true);
00312      for (int i = 0; i < x-1; i++)
00313         cl.remove((unsigned int)0);
00314      KSSLCertificate thisCert = *(cl.at(0));
00315      cl.remove((unsigned int)0);
00316      thisCert.chain().setChain(cl);
00317      displayCert(&thisCert);
00318   }
00319 }
00320 
00321 
00322 KSSLCertBox *KSSLInfoDlg::certInfoWidget(QWidget *parent, const QString &certName, QWidget *mailCatcher) {
00323     KSSLCertBox *result = new KSSLCertBox(parent);
00324     result->setValues(certName, mailCatcher);
00325     return result;
00326 }
00327 
00328 
00329 KSSLCertBox::KSSLCertBox(QWidget *parent, const char *name, WFlags f) 
00330 :            QScrollView(parent, name, f)
00331 {
00332     _frame = NULL;
00333     setBackgroundMode(PaletteBackground);
00334 }
00335 
00336 
00337 void KSSLCertBox::setValues(QString certName, QWidget *mailCatcher) {
00338     KSSLX509Map cert(certName);
00339     QString tmp;
00340 
00341     if (_frame) {
00342        removeChild(_frame);
00343        delete _frame;
00344     }
00345 
00346     viewport()->setBackgroundMode(QWidget::PaletteButton);
00347     _frame = new QFrame(this);
00348     QGridLayout *grid = new QGridLayout(_frame, 1, 2, KDialog::marginHint(), KDialog::spacingHint());
00349     grid->setAutoAdd(true);
00350     QLabel *label;
00351     if (!(tmp = cert.getValue("O")).isEmpty()) {
00352         label = new QLabel(i18n("Organization:"), _frame);
00353         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00354         (new QLabel(tmp, _frame))->setTextFormat(Qt::PlainText);
00355     }
00356     if (!(tmp = cert.getValue("OU")).isEmpty()) {
00357         label = new QLabel(i18n("Organizational unit:"), _frame);
00358         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00359         (new QLabel(tmp, _frame))->setTextFormat(Qt::PlainText);
00360     }
00361     if (!(tmp = cert.getValue("L")).isEmpty()) {
00362         label = new QLabel(i18n("Locality:"), _frame);
00363         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00364         (new QLabel(tmp, _frame))->setTextFormat(Qt::PlainText);
00365     }
00366     if (!(tmp = cert.getValue("ST")).isEmpty()) {
00367         label = new QLabel(i18n("State:"), _frame);
00368         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00369         (new QLabel(tmp, _frame))->setTextFormat(Qt::PlainText);
00370     }
00371     if (!(tmp = cert.getValue("C")).isEmpty()) {
00372         label = new QLabel(i18n("Country:"), _frame);
00373         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00374         (new QLabel(tmp, _frame))->setTextFormat(Qt::PlainText);
00375     }
00376     if (!(tmp = cert.getValue("CN")).isEmpty()) {
00377         label = new QLabel(i18n("Common name:"), _frame);
00378         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00379         (new QLabel(tmp, _frame))->setTextFormat(Qt::PlainText);
00380     }
00381     if (!(tmp = cert.getValue("Email")).isEmpty()) {
00382         label = new QLabel(i18n("Email:"), _frame);
00383         label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
00384         if (mailCatcher) {
00385            KURLLabel *mail = new KURLLabel(tmp, tmp, _frame);
00386            connect(mail, SIGNAL(leftClickedURL(const QString &)), mailCatcher, SLOT(mailClicked(const QString &)));
00387         } else {
00388            (new QLabel(tmp, _frame))->setTextFormat(Qt::PlainText);
00389         }
00390     }
00391     addChild(_frame);
00392     updateScrollBars();
00393     _frame->show();
00394     show();
00395 }
00396 
00397 
00398 QScrollView *KSSLInfoDlg::buildCertInfo(const QString &certName) {
00399 return KSSLInfoDlg::certInfoWidget(this, certName, this);
00400 }
00401 
00402 void KSSLInfoDlg::urlClicked(const QString &url) {
00403     kapp->invokeBrowser(url);
00404 }
00405 
00406 void KSSLInfoDlg::mailClicked(const QString &url) {
00407     kapp->invokeMailer(url, QString::null);
00408 }
00409 
00410 #include "ksslinfodlg.moc"
00411 
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.0.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Mon Oct 24 13:06:08 2011 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2001