KIO

ksslinfodialog.cpp
1 /*
2  This file is part of the KDE project
3  SPDX-FileCopyrightText: 2000, 2001 George Staikos <[email protected]>
4  SPDX-FileCopyrightText: 2000 Malte Starostik <[email protected]>
5 
6  SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #include "ksslinfodialog.h"
10 #include "ksslcertificatebox.h"
11 #include "ksslerror_p.h"
12 #include "ui_sslinfo.h"
13 
14 #include <QDialogButtonBox>
15 
16 #include <QSslCertificate>
17 
18 #include <KIconLoader> // BarIcon
19 #include <KLocalizedString>
20 
21 class Q_DECL_HIDDEN KSslInfoDialog::KSslInfoDialogPrivate
22 {
23 public:
24  QList<QSslCertificate> certificateChain;
25  QList<QList<QSslError::SslError>> certificateErrors;
26 
27  bool isMainPartEncrypted;
28  bool auxPartsEncrypted;
29 
30  Ui::SslInfo ui;
31  KSslCertificateBox *subject;
32  KSslCertificateBox *issuer;
33 };
34 
36  : QDialog(parent)
37  , d(new KSslInfoDialogPrivate)
38 {
39  setWindowTitle(i18n("KDE SSL Information"));
41 
42  QVBoxLayout *layout = new QVBoxLayout(this);
43 
44  QWidget *mainWidget = new QWidget(this);
45  d->ui.setupUi(mainWidget);
46  layout->addWidget(mainWidget);
47 
48  d->subject = new KSslCertificateBox(d->ui.certParties);
49  d->issuer = new KSslCertificateBox(d->ui.certParties);
50  d->ui.certParties->addTab(d->subject, i18nc("The receiver of the SSL certificate", "Subject"));
51  d->ui.certParties->addTab(d->issuer, i18nc("The authority that issued the SSL certificate", "Issuer"));
52 
53  d->isMainPartEncrypted = true;
54  d->auxPartsEncrypted = true;
55  updateWhichPartsEncrypted();
56 
57  QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
61  layout->addWidget(buttonBox);
62 }
63 
65 
66 void KSslInfoDialog::setMainPartEncrypted(bool mainEncrypted)
67 {
68  d->isMainPartEncrypted = mainEncrypted;
69  updateWhichPartsEncrypted();
70 }
71 
72 void KSslInfoDialog::setAuxiliaryPartsEncrypted(bool auxEncrypted)
73 {
74  d->auxPartsEncrypted = auxEncrypted;
75  updateWhichPartsEncrypted();
76 }
77 
78 void KSslInfoDialog::updateWhichPartsEncrypted()
79 {
80  if (d->isMainPartEncrypted) {
81  if (d->auxPartsEncrypted) {
82  d->ui.encryptionIndicator->setPixmap(QIcon::fromTheme(QStringLiteral("security-high")).pixmap(KIconLoader::SizeSmallMedium));
83  d->ui.explanation->setText(i18n("Current connection is secured with SSL."));
84  } else {
85  d->ui.encryptionIndicator->setPixmap(QIcon::fromTheme(QStringLiteral("security-medium")).pixmap(KIconLoader::SizeSmallMedium));
86  d->ui.explanation->setText(
87  i18n("The main part of this document is secured "
88  "with SSL, but some parts are not."));
89  }
90  } else {
91  if (d->auxPartsEncrypted) {
92  d->ui.encryptionIndicator->setPixmap(QIcon::fromTheme(QStringLiteral("security-medium")).pixmap(KIconLoader::SizeSmallMedium));
93  d->ui.explanation->setText(
94  i18n("Some of this document is secured with SSL, "
95  "but the main part is not."));
96  } else {
97  d->ui.encryptionIndicator->setPixmap(QIcon::fromTheme(QStringLiteral("security-low")).pixmap(KIconLoader::SizeSmallMedium));
98  d->ui.explanation->setText(i18n("Current connection is not secured with SSL."));
99  }
100  }
101 }
102 
103 #ifndef KIO_ANDROID_STUB
104 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 64)
106  const QString &ip,
107  const QString &host,
108  const QString &sslProtocol,
109  const QString &cipher,
110  int usedBits,
111  int bits,
112  const QList<QList<KSslError::Error>> &validationErrors)
113 {
114  QList<QList<QSslError::SslError>> qValidationErrors;
115  qValidationErrors.reserve(validationErrors.size());
116  for (const auto &l : validationErrors) {
118  qErrors.reserve(l.size());
119  for (const KSslError::Error e : l) {
120  qErrors.push_back(KSslErrorPrivate::errorFromKSslError(e));
121  }
122  qValidationErrors.push_back(qErrors);
123  }
124  setSslInfo(certificateChain, ip, host, sslProtocol, cipher, usedBits, bits, qValidationErrors);
125 }
126 #endif
127 #endif
128 
130  const QString &ip,
131  const QString &host,
132  const QString &sslProtocol,
133  const QString &cipher,
134  int usedBits,
135  int bits,
136  const QList<QList<QSslError::SslError>> &validationErrors)
137 {
138  d->certificateChain = certificateChain;
139  d->certificateErrors = validationErrors;
140 
141  d->ui.certSelector->clear();
142  for (const QSslCertificate &cert : certificateChain) {
143  QString name;
145  for (int j = 0; j < 3 && name.isEmpty(); j++) {
146  name = cert.subjectInfo(si[j]).join(QLatin1String(", "));
147  }
148  d->ui.certSelector->addItem(name);
149  }
150  if (certificateChain.size() < 2) {
151  d->ui.certSelector->setEnabled(false);
152  }
153  connect(d->ui.certSelector, qOverload<int>(&QComboBox::currentIndexChanged), this, &KSslInfoDialog::displayFromChain);
154  if (d->certificateChain.isEmpty()) {
155  d->certificateChain.append(QSslCertificate());
156  }
157  displayFromChain(0);
158 
159  d->ui.ip->setText(ip);
160  d->ui.address->setText(host);
161  d->ui.sslVersion->setText(sslProtocol);
162 
163  const QStringList cipherInfo = cipher.split(QLatin1Char('\n'), Qt::SkipEmptyParts);
164  if (cipherInfo.size() >= 4) {
165  d->ui.encryption->setText(i18nc("%1, using %2 bits of a %3 bit key",
166  "%1, %2 %3",
167  cipherInfo[0],
168  i18ncp("Part of: %1, using %2 bits of a %3 bit key", "using %1 bit", "using %1 bits", usedBits),
169  i18ncp("Part of: %1, using %2 bits of a %3 bit key", "of a %1 bit key", "of a %1 bit key", bits)));
170  d->ui.details->setText(QStringLiteral("Auth = %1, Kx = %2, MAC = %3").arg(cipherInfo[1], cipherInfo[2], cipherInfo[3]));
171  } else {
172  d->ui.encryption->setText(QString());
173  d->ui.details->setText(QString());
174  }
175 }
176 
177 void KSslInfoDialog::displayFromChain(int i)
178 {
179  const QSslCertificate &cert = d->certificateChain[i];
180 
181  QString trusted;
182  const QList<QSslError::SslError> errorsList = d->certificateErrors[i];
183  if (!errorsList.isEmpty()) {
184  trusted = i18nc("The certificate is not trusted", "NO, there were errors:");
185  for (QSslError::SslError e : errorsList) {
186  QSslError classError(e);
187  trusted += QLatin1Char('\n') + classError.errorString();
188  }
189  } else {
190  trusted = i18nc("The certificate is trusted", "Yes");
191  }
192  d->ui.trusted->setText(trusted);
193 
194  QString vp =
195  i18nc("%1 is the effective date of the certificate, %2 is the expiry date", "%1 to %2", cert.effectiveDate().toString(), cert.expiryDate().toString());
196  d->ui.validityPeriod->setText(vp);
197 
198  d->ui.serial->setText(QString::fromUtf8(cert.serialNumber()));
199  d->ui.digest->setText(QString::fromUtf8(cert.digest().toHex()));
200  d->ui.sha1Digest->setText(QString::fromUtf8(cert.digest(QCryptographicHash::Sha1).toHex()));
201 
202  d->subject->setCertificate(cert, KSslCertificateBox::Subject);
203  d->issuer->setCertificate(cert, KSslCertificateBox::Issuer);
204 }
205 
206 #ifndef KIO_ANDROID_STUB
207 #if KIOCORE_BUILD_DEPRECATED_SINCE(5, 65)
208 // static
210 {
211  const QStringList sl = es.split(QLatin1Char('\n'), Qt::KeepEmptyParts);
213  ret.reserve(sl.size());
214  for (const QString &s : sl) {
215  QList<KSslError::Error> certErrors;
216  const QStringList sl2 = s.split(QLatin1Char('\t'), Qt::SkipEmptyParts);
217  for (const QString &s2 : sl2) {
218  bool didConvert;
219  KSslError::Error error = KSslErrorPrivate::errorFromQSslError(static_cast<QSslError::SslError>(s2.toInt(&didConvert)));
220  if (didConvert) {
221  certErrors.append(error);
222  }
223  }
224  ret.append(certErrors);
225  }
226  return ret;
227 }
228 #endif
229 #endif
230 
231 // static
233 {
234  const QStringList sl = errorsString.split(QLatin1Char('\n'), Qt::KeepEmptyParts);
236  ret.reserve(sl.size());
237  for (const QString &s : sl) {
238  QList<QSslError::SslError> certErrors;
239  const QStringList sl2 = s.split(QLatin1Char('\t'), Qt::SkipEmptyParts);
240  for (const QString &s2 : sl2) {
241  bool didConvert;
242  QSslError::SslError error = static_cast<QSslError::SslError>(s2.toInt(&didConvert));
243  if (didConvert) {
244  certErrors.append(error);
245  }
246  }
247  ret.append(certErrors);
248  }
249  return ret;
250 }
void append(const T &value)
QWidget(QWidget *parent, Qt::WindowFlags f)
QString fromUtf8(const char *str, int size)
virtual void reject()
void setSslInfo(const QList< QSslCertificate > &certificateChain, const QString &ip, const QString &host, const QString &sslProtocol, const QString &cipher, int usedBits, int bits, const QList< QList< KSslError::Error >> &validationErrors)
Set information to display about the SSL connection.
QStringList split(const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
QLayout * layout() const const
QIcon fromTheme(const QString &name)
void push_back(const T &value)
QDateTime effectiveDate() const const
void setAttribute(Qt::WidgetAttribute attribute, bool on)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString i18ncp(const char *context, const char *singular, const char *plural, const TYPE &arg...)
void setStandardButtons(QDialogButtonBox::StandardButtons buttons)
void reserve(int alloc)
int size() const const
QString i18n(const char *text, const TYPE &arg...)
static QList< QList< KSslError::Error > > errorsFromString(const QString &s)
SkipEmptyParts
bool isEmpty() const const
void setWindowTitle(const QString &)
QDateTime expiryDate() const const
virtual void accept()
bool isEmpty() const const
KDE SSL Information Dialog.
ScriptableExtension * host() const
QByteArray toHex() const const
void addWidget(QWidget *w)
QByteArray digest(QCryptographicHash::Algorithm algorithm) const const
void currentIndexChanged(int index)
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QByteArray serialNumber() const const
KSslInfoDialog(QWidget *parent=nullptr)
Construct a KSSL Information Dialog.
static QList< QList< QSslError::SslError > > certificateErrorsFromString(const QString &errorsString)
Converts certificate errors as provided in the "ssl_cert_errors" meta data to a list of QSslError::Ss...
QString toString(Qt::DateFormat format) const const
WA_DeleteOnClose
~KSslInfoDialog() override
Destroy this dialog.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon May 8 2023 03:54:44 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.