Cleanup allowing for tags to be available at later points, adds TAGMSG
[quassel.git] / src / qtui / sslinfodlg.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2019 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 (socket()->sslErrors().isEmpty())
71         ui.trusted->setText(tr("Yes"));
72     else {
73         QString errorString = tr("No, for the following reasons:<ul>");
74         foreach (const QSslError& error, socket()->sslErrors())
75             errorString += "<li>" + error.errorString() + "</li>";
76         errorString += "</ul>";
77         ui.trusted->setText(errorString);
78     }
79
80     ui.validity->setText(
81         tr("%1 to %2").arg(cert.effectiveDate().date().toString(Qt::ISODate), cert.expiryDate().date().toString(Qt::ISODate)));
82     ui.md5Digest->setText(prettyDigest(cert.digest(QCryptographicHash::Md5)));
83     ui.sha1Digest->setText(prettyDigest(cert.digest(QCryptographicHash::Sha1)));
84     ui.sha256Digest->setText(prettyDigest(cert.digest(QCryptographicHash::Sha256)));
85 }
86
87 // in Qt5, subjectInfo returns a QStringList(); turn this into a comma-separated string instead
88 QString SslInfoDlg::subjectInfo(const QSslCertificate& cert, QSslCertificate::SubjectInfo subjectInfo) const
89 {
90     return cert.subjectInfo(subjectInfo).join(", ");
91 }
92
93 // same here
94 QString SslInfoDlg::issuerInfo(const QSslCertificate& cert, QSslCertificate::SubjectInfo subjectInfo) const
95 {
96     return cert.issuerInfo(subjectInfo).join(", ");
97 }