[network/falkon] src/lib/network: Add certificate information into SSL error dialog

Juraj Oravec null at kde.org
Mon Jun 9 21:39:28 BST 2025


Git commit ae6cf52f112d359009f3b7950e74cef501ae5717 by Juraj Oravec.
Committed on 09/06/2025 at 20:32.
Pushed by jurajo into branch 'master'.

Add certificate information into SSL error dialog

FIXED-IN: 25.08
FEATURE: 505141
GUI:

Signed-off-by: Juraj Oravec <jurajoravec at mailo.com>

M  +2    -1    src/lib/network/networkmanager.cpp
M  +33   -0    src/lib/network/sslerrordialog.cpp
M  +4    -0    src/lib/network/sslerrordialog.h
M  +75   -21   src/lib/network/sslerrordialog.ui

https://invent.kde.org/network/falkon/-/commit/ae6cf52f112d359009f3b7950e74cef501ae5717

diff --git a/src/lib/network/networkmanager.cpp b/src/lib/network/networkmanager.cpp
index aadcfd8f3..ef1a7a57d 100644
--- a/src/lib/network/networkmanager.cpp
+++ b/src/lib/network/networkmanager.cpp
@@ -89,7 +89,7 @@ bool NetworkManager::certificateError(QWebEngineCertificateError &error, QWidget
         error.defer();
 
     QString title = tr("SSL Certificate Error!");
-    QString text1 = tr("The page you are trying to access has the following errors in the SSL certificate:");
+    QString text1 = tr("The page <strong>%1</strong> you are trying to access has the following errors in the SSL certificate:").arg(host);
     QString text2 = tr("Would you like to make an exception for this certificate?");
 
     const auto errorDescription = error.description();
@@ -97,6 +97,7 @@ bool NetworkManager::certificateError(QWebEngineCertificateError &error, QWidget
 
     SslErrorDialog dialog(parent);
     dialog.setText(message);
+    dialog.setCertificateChain(error.certificateChain());
     dialog.exec();
 
     switch (dialog.result()) {
diff --git a/src/lib/network/sslerrordialog.cpp b/src/lib/network/sslerrordialog.cpp
index 2fbd6f366..a5ac3b585 100644
--- a/src/lib/network/sslerrordialog.cpp
+++ b/src/lib/network/sslerrordialog.cpp
@@ -20,6 +20,7 @@
 #include "iconprovider.h"
 
 #include <QPushButton>
+#include <QPlainTextEdit>
 
 SslErrorDialog::SslErrorDialog(QWidget* parent)
     : QDialog(parent)
@@ -31,7 +32,12 @@ SslErrorDialog::SslErrorDialog(QWidget* parent)
     ui->buttonBox->addButton(tr("Only for this session"), QDialogButtonBox::ApplyRole);
     ui->buttonBox->button(QDialogButtonBox::No)->setFocus();
 
+    ui->certTabWidget->hide();
+    ui->certDetailsButton->hide();
+    adjustSize();
+
     connect(ui->buttonBox, &QDialogButtonBox::clicked, this, &SslErrorDialog::buttonClicked);
+    connect(ui->certDetailsButton, &QPushButton::clicked, this, &SslErrorDialog::toggleCertificateDetails);
 }
 
 SslErrorDialog::~SslErrorDialog()
@@ -44,6 +50,23 @@ void SslErrorDialog::setText(const QString &text)
     ui->text->setText(text);
 }
 
+void SslErrorDialog::setCertificateChain(const QList<QSslCertificate> &certificateChain)
+{
+    if (certificateChain.isEmpty()) {
+        return;
+    }
+
+    ui->certDetailsButton->show();
+
+    for (auto &certificate : certificateChain) {
+        auto *certDescription = new QPlainTextEdit(ui->certTabWidget);
+        certDescription->setPlainText(certificate.toText());
+        certDescription->setReadOnly(true);
+        ui->certTabWidget->indexOf(certDescription);
+        ui->certTabWidget->addTab(certDescription, certificate.subjectDisplayName());
+    }
+}
+
 SslErrorDialog::Result SslErrorDialog::result()
 {
     return m_result;
@@ -73,3 +96,13 @@ void SslErrorDialog::buttonClicked(QAbstractButton* button)
         break;
     }
 }
+
+void SslErrorDialog::toggleCertificateDetails()
+{
+    if (ui->certTabWidget->isVisible()) {
+        ui->certTabWidget->hide();
+    }
+    else {
+        ui->certTabWidget->show();
+    }
+}
diff --git a/src/lib/network/sslerrordialog.h b/src/lib/network/sslerrordialog.h
index df406a35a..087bebbf3 100644
--- a/src/lib/network/sslerrordialog.h
+++ b/src/lib/network/sslerrordialog.h
@@ -19,6 +19,7 @@
 #define SSLERRORDIALOG_H
 
 #include <QDialog>
+#include <QSslCertificate>
 
 namespace Ui
 {
@@ -40,10 +41,13 @@ public:
     ~SslErrorDialog();
 
     void setText(const QString &text);
+    void setCertificateChain(const QList<QSslCertificate> &certificateChain);
+
     Result result();
 
 private Q_SLOTS:
     void buttonClicked(QAbstractButton* button);
+    void toggleCertificateDetails();
 
 private:
     Ui::SslErrorDialog* ui;
diff --git a/src/lib/network/sslerrordialog.ui b/src/lib/network/sslerrordialog.ui
index a0ccaf7eb..8c5c9cbde 100644
--- a/src/lib/network/sslerrordialog.ui
+++ b/src/lib/network/sslerrordialog.ui
@@ -7,39 +7,26 @@
     <x>0</x>
     <y>0</y>
     <width>511</width>
-    <height>72</height>
+    <height>366</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>SSL Certificate Error!</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout">
+  <layout class="QGridLayout" name="gridLayout" rowstretch="0,1,0">
    <item row="0" column="0">
     <widget class="QLabel" name="icon">
      <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+      <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
      </property>
     </widget>
    </item>
-   <item row="0" column="1">
-    <widget class="QLabel" name="text">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="alignment">
-      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0" colspan="2">
+   <item row="2" column="0" colspan="3">
     <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
       <spacer name="horizontalSpacer_3">
        <property name="orientation">
-        <enum>Qt::Horizontal</enum>
+        <enum>Qt::Orientation::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
@@ -58,17 +45,17 @@
         </sizepolicy>
        </property>
        <property name="orientation">
-        <enum>Qt::Horizontal</enum>
+        <enum>Qt::Orientation::Horizontal</enum>
        </property>
        <property name="standardButtons">
-        <set>QDialogButtonBox::No|QDialogButtonBox::Yes</set>
+        <set>QDialogButtonBox::StandardButton::No|QDialogButtonBox::StandardButton::Yes</set>
        </property>
       </widget>
      </item>
      <item>
       <spacer name="horizontalSpacer_4">
        <property name="orientation">
-        <enum>Qt::Horizontal</enum>
+        <enum>Qt::Orientation::Horizontal</enum>
        </property>
        <property name="sizeHint" stdset="0">
         <size>
@@ -80,6 +67,73 @@
      </item>
     </layout>
    </item>
+   <item row="0" column="2">
+    <widget class="QLabel" name="text">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" colspan="3">
+    <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1,0">
+     <item>
+      <layout class="QHBoxLayout" name="certificateLayout">
+       <item>
+        <widget class="QPushButton" name="certDetailsButton">
+         <property name="text">
+          <string>Toggle Certificate Details</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Orientation::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QTabWidget" name="certTabWidget">
+       <property name="currentIndex">
+        <number>-1</number>
+       </property>
+       <property name="tabBarAutoHide">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Orientation::Vertical</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Policy::MinimumExpanding</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>0</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
   </layout>
  </widget>
  <resources/>


More information about the kde-doc-english mailing list