cmake: avoid de-duplication of user's CXXFLAGS
[quassel.git] / src / qtui / sslinfodlg.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2022 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
19  ***************************************************************************/
20
21 #include "sslinfodlg.h"
22
23 #include <QDateTime>
24 #include <QHostAddress>
25 #include <QSslCipher>
26 #include <QSslSocket>
27
28 #include "util.h"
29
30 // ========================================
31 //  SslInfoDlg
32 // ========================================
33
34 SslInfoDlg::SslInfoDlg(const QSslSocket* socket, QWidget* parent)
35     : QDialog(parent)
36     , _socket(socket)
37 {
38     ui.setupUi(this);
39
40     QSslCipher cipher = socket->sessionCipher();
41
42     ui.hostname->setText(socket->peerName());
43     ui.address->setText(socket->peerAddress().toString());
44     ui.encryption->setText(cipher.name());
45     ui.protocol->setText(cipher.protocolString());
46
47     connect(ui.certificateChain, selectOverload<int>(&QComboBox::currentIndexChanged), this, &SslInfoDlg::setCurrentCert);
48     foreach (const QSslCertificate& cert, socket->peerCertificateChain()) {
49         ui.certificateChain->addItem(subjectInfo(cert, QSslCertificate::CommonName));
50     }
51 }
52
53 void SslInfoDlg::setCurrentCert(int index)
54 {
55     QSslCertificate cert = socket()->peerCertificateChain().at(index);
56     ui.subjectCommonName->setText(subjectInfo(cert, QSslCertificate::CommonName));
57     ui.subjectOrganization->setText(subjectInfo(cert, QSslCertificate::Organization));
58     ui.subjectOrganizationalUnit->setText(subjectInfo(cert, QSslCertificate::OrganizationalUnitName));
59     ui.subjectCountry->setText(subjectInfo(cert, QSslCertificate::CountryName));
60     ui.subjectState->setText(subjectInfo(cert, QSslCertificate::StateOrProvinceName));
61     ui.subjectCity->setText(subjectInfo(cert, QSslCertificate::LocalityName));
62
63     ui.issuerCommonName->setText(issuerInfo(cert, QSslCertificate::CommonName));
64     ui.issuerOrganization->setText(issuerInfo(cert, QSslCertificate::Organization));
65     ui.issuerOrganizationalUnit->setText(issuerInfo(cert, QSslCertificate::OrganizationalUnitName));
66     ui.issuerCountry->setText(issuerInfo(cert, QSslCertificate::CountryName));
67     ui.issuerState->setText(issuerInfo(cert, QSslCertificate::StateOrProvinceName));
68     ui.issuerCity->setText(issuerInfo(cert, QSslCertificate::LocalityName));
69
70 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
71     const auto& sslErrors = socket()->sslErrors();
72 #else
73     const auto& sslErrors = socket()->sslHandshakeErrors();
74 #endif
75     if (sslErrors.isEmpty()) {
76         ui.trusted->setText(tr("Yes"));
77     }
78     else {
79         QString errorString = tr("No, for the following reasons:<ul>");
80         for (const auto& error : sslErrors) {
81             errorString += "<li>" + error.errorString() + "</li>";
82         }
83         errorString += "</ul>";
84         ui.trusted->setText(errorString);
85     }
86
87     ui.validity->setText(
88         tr("%1 to %2").arg(cert.effectiveDate().date().toString(Qt::ISODate), cert.expiryDate().date().toString(Qt::ISODate)));
89     ui.md5Digest->setText(prettyDigest(cert.digest(QCryptographicHash::Md5)));
90     ui.sha1Digest->setText(prettyDigest(cert.digest(QCryptographicHash::Sha1)));
91     ui.sha256Digest->setText(prettyDigest(cert.digest(QCryptographicHash::Sha256)));
92 }
93
94 // in Qt5, subjectInfo returns a QStringList(); turn this into a comma-separated string instead
95 QString SslInfoDlg::subjectInfo(const QSslCertificate& cert, QSslCertificate::SubjectInfo subjectInfo) const
96 {
97     return cert.subjectInfo(subjectInfo).join(", ");
98 }
99
100 // same here
101 QString SslInfoDlg::issuerInfo(const QSslCertificate& cert, QSslCertificate::SubjectInfo subjectInfo) const
102 {
103     return cert.issuerInfo(subjectInfo).join(", ");
104 }