Beispiel #1
0
static QString cert_info_string(const QCA::Certificate &cert)
{
	QString out;
	out += CertViewDlg::tr("Serial Number: %1").arg(cert.serialNumber().toString()) + '\n';
	out += print_info(CertViewDlg::tr("Subject"), cert.subjectInfo());
	out += print_info(CertViewDlg::tr("Issuer"), cert.issuerInfo());
	out += CertViewDlg::tr("Validity") + '\n';
	out += QString("   ") + CertViewDlg::tr("Not before: %1").arg(cert.notValidBefore().toString()) + '\n';
	out += QString("   ") + CertViewDlg::tr("Not after:  %1").arg(cert.notValidAfter().toString()) + '\n';
	return out;
}
CertificateDisplayDialog::CertificateDisplayDialog(const QCA::Certificate &cert, int result, QCA::Validity validity, QWidget *parent) : QDialog(parent)
{
	ui_.setupUi(this);
	setModal(true);

	connect(ui_.pb_close, SIGNAL(clicked()), SLOT(close()));
	ui_.pb_close->setDefault(true);
	ui_.pb_close->setFocus();

	if(cert.isNull()) {
		return;
	}

	if (result == QCA::TLS::Valid) {
		ui_.lb_valid->setText(tr("The certificate is valid."));
		setLabelStatus(*ui_.lb_valid, true);
	}
	else {
		ui_.lb_valid->setText(tr("The certificate is NOT valid!") + "\n" + QString(tr("Reason: %1.")).arg(CertificateHelpers::resultToString(result, validity)));
		setLabelStatus(*ui_.lb_valid, false);
	}

	QDateTime now = QDateTime::currentDateTime();
	QDateTime notBefore = cert.notValidBefore();
	QDateTime notAfter = cert.notValidAfter();
	ui_.lb_notBefore->setText(cert.notValidBefore().toString());
	setLabelStatus(*ui_.lb_notBefore, now > notBefore);
	ui_.lb_notAfter->setText(cert.notValidAfter().toString());
	setLabelStatus(*ui_.lb_notAfter, now < notAfter);

	ui_.lb_sn->setText(cert.serialNumber().toString());

	QString str;
	QString direction = qApp->layoutDirection() == Qt::RightToLeft ? "rtl" : "ltr";
	str += "<table dir=\"" + direction + "\">";
	str += makePropTable(tr("Subject Details:"), cert.subjectInfo());
	str += makePropTable(tr("Issuer Details:"), cert.issuerInfo());
	str += "</table>";
	for (int i=0; i < 2; i++) {
		QString hashstr = QCA::Hash(i == 0 ? "md5" : "sha1").hashToString(cert.toDER()).toUpper().replace(QRegExp("(..)"), ":\\1").mid(1);
		str += QString("Fingerprint(%1): %2<br>").arg(i == 0 ? "MD5" : "SHA-1").arg(hashstr);
	}
	ui_.tb_cert->setText(str);
}
Beispiel #3
0
// shared by PsiAccount and MiniClient
bool CertificateHelpers::checkCertificate(QCA::TLS* tls, XMPP::QCATLSHandler *tlsHandler, QString &tlsOverrideDomain, QByteArray &tlsOverrideCert, QObject * canceler, const QString &title, const QString &host) {
	QCA::Certificate cert = tls->peerCertificateChain().primary();
	int result = tls->peerIdentityResult();
	QString hostnameOverrideable;

	if (result == QCA::TLS::Valid && !tlsHandler->certMatchesHostname()) {
		QList<QString> lst = cert.subjectInfo().values(QCA::CommonName);
		if (lst.size() == 1) {
			hostnameOverrideable = lst[0];
		}
		if (lst.size() != 1 || lst[0].isEmpty() || lst[0] != tlsOverrideDomain) {
			result = QCA::TLS::HostMismatch;
		}
	}

	// if this cert equals the user trusted certificate, just trust the user's choice.
	if (result != QCA::TLS::Valid && !tlsOverrideCert.isEmpty()) {
		if (cert.toDER() == tlsOverrideCert) {
			result = QCA::TLS::Valid;
		}
	}

	if (result != QCA::TLS::Valid) {
		CertificateErrorDialog errorDialog(
				title, host, cert,
				result, tls->peerCertificateValidity(),
				hostnameOverrideable, tlsOverrideDomain, tlsOverrideCert);
		if (canceler) {
			QObject::connect(canceler, SIGNAL(disconnected()), &errorDialog, SLOT(reject()), Qt::AutoConnection);
			QObject::connect(canceler, SIGNAL(reconnecting()), &errorDialog, SLOT(reject()), Qt::AutoConnection);
		}
		if (errorDialog.exec() == QDialog::Accepted) {
			return true;
		}
		else {
			return false;
		}
	}
	else {
		return true;
	}
}
CertificateDisplayDialog::CertificateDisplayDialog(const QCA::Certificate &cert, int result, QCA::Validity validity, QWidget *parent) : QDialog(parent)
{
	// raw code from uic
	resize(518, 369);
	vboxLayout = new QVBoxLayout(this);
	vboxLayout->setSpacing(6);
	vboxLayout->setMargin(11);
	vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
	hboxLayout = new QHBoxLayout();
	hboxLayout->setSpacing(6);
	hboxLayout->setMargin(0);
	hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
	vboxLayout1 = new QVBoxLayout();
	vboxLayout1->setSpacing(6);
	vboxLayout1->setMargin(0);
	vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
	textLabel4 = new QLabel;
	textLabel4->setObjectName(QString::fromUtf8("textLabel4"));

	vboxLayout1->addWidget(textLabel4);

	lb_valid = new QLabel;
	lb_valid->setObjectName(QString::fromUtf8("lb_valid"));

	vboxLayout1->addWidget(lb_valid);

	textLabel2 = new QLabel;
	textLabel2->setObjectName(QString::fromUtf8("textLabel2"));

	vboxLayout1->addWidget(textLabel2);

	lb_notBefore = new QLabel;
	lb_notBefore->setObjectName(QString::fromUtf8("lb_notBefore"));

	vboxLayout1->addWidget(lb_notBefore);

	textLabel3 = new QLabel;
	textLabel3->setObjectName(QString::fromUtf8("textLabel3"));

	vboxLayout1->addWidget(textLabel3);

	lb_notAfter = new QLabel;
	lb_notAfter->setObjectName(QString::fromUtf8("lb_notAfter"));

	vboxLayout1->addWidget(lb_notAfter);

	textLabel1 = new QLabel;
	textLabel1->setObjectName(QString::fromUtf8("textLabel1"));

	vboxLayout1->addWidget(textLabel1);

	lb_sn = new QLabel;
	lb_sn->setObjectName(QString::fromUtf8("lb_sn"));

	vboxLayout1->addWidget(lb_sn);

	spacerItem = new QSpacerItem(20, 106, QSizePolicy::Minimum, QSizePolicy::Expanding);

	vboxLayout1->addItem(spacerItem);


	hboxLayout->addLayout(vboxLayout1);

	tb_cert = new QTextBrowser;
	tb_cert->setObjectName(QString::fromUtf8("tb_cert"));
	tb_cert->setMinimumSize(QSize(350, 300));
	tb_cert->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

	hboxLayout->addWidget(tb_cert);


	vboxLayout->addLayout(hboxLayout);

	line1 = new QFrame;
	line1->setObjectName(QString::fromUtf8("line1"));
	line1->setFrameShape(QFrame::HLine);
	line1->setFrameShadow(QFrame::Sunken);
	line1->setFrameShape(QFrame::HLine);

	vboxLayout->addWidget(line1);

	hboxLayout1 = new QHBoxLayout();
	hboxLayout1->setSpacing(6);
	hboxLayout1->setMargin(0);
	hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
	spacerItem1 = new QSpacerItem(421, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

	hboxLayout1->addItem(spacerItem1);

	pb_close = new QPushButton;
	pb_close->setObjectName(QString::fromUtf8("pb_close"));

	hboxLayout1->addWidget(pb_close);
	vboxLayout->addLayout(hboxLayout1);

	setWindowTitle(tr("Certificate Information"));
	textLabel4->setText(tr("Certificate Validation") + ':');
	lb_valid->setText(QString());
	textLabel2->setText(tr("Valid From") + ':');
	lb_notBefore->setText(QString());
	textLabel3->setText(tr("Valid Until") + ':');
	lb_notAfter->setText(QString());
	textLabel1->setText(tr("Serial Number") + ':');
	lb_sn->setText(QString());
	pb_close->setText(tr("Close"));

	// end of raw code from uic
	setModal(true);

	connect(pb_close, SIGNAL(clicked()), SLOT(close()));
	pb_close->setDefault(true);
	pb_close->setFocus();

	if (cert.isNull())
		return;

	if (result == QCA::TLS::Valid)
	{
		lb_valid->setText(tr("The certificate is valid."));
		setLabelStatus(*lb_valid, true);
	}
	else
	{
		lb_valid->setText(tr("The certificate is NOT valid!") + '\n' + QString(tr("Reason: %1.")).arg(CertificateHelpers::resultToString(result, validity)));
		setLabelStatus(*lb_valid, false);
	}

	QDateTime now = QDateTime::currentDateTime();
	QDateTime notBefore = cert.notValidBefore();
	QDateTime notAfter = cert.notValidAfter();
	lb_notBefore->setText(cert.notValidBefore().toString());
	setLabelStatus(*lb_notBefore, now > notBefore);
	lb_notAfter->setText(cert.notValidAfter().toString());
	setLabelStatus(*lb_notAfter, now < notAfter);

	lb_sn->setText(cert.serialNumber().toString());

	QString str;
	str += "<table>";
	str += makePropTable(tr("Subject Details:"), cert.subjectInfo());
	str += makePropTable(tr("Issuer Details:"), cert.issuerInfo());
	str += "</table>";
	for (int i=0; i < 2; i++)
	{
		QString hashstr = QCA::Hash(i == 0 ? "md5" : "sha1").hashToString(cert.toDER()).toUpper().replace(QRegExp("(..)"), ":\\1").mid(1);
		str += QString("Fingerprint(%1): %2<br>").arg(i == 0 ? "MD5" : "SHA-1").arg(hashstr);
	}
	tb_cert->setText(str);
}