first version to show an save certificates from files or urls
This commit is contained in:
		
							
								
								
									
										133
									
								
								src/certificate.hxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								src/certificate.hxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
				
			|||||||
 | 
					/*! @file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @id $Id$
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					//       1         2         3         4         5         6         7         8
 | 
				
			||||||
 | 
					// 45678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CERTIFICATE_HXX
 | 
				
			||||||
 | 
					#define CERTIFICATE_HXX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ui_certificate.hxx>
 | 
				
			||||||
 | 
					#include <QtCore/QDateTime>
 | 
				
			||||||
 | 
					#include <QTreeWidget>
 | 
				
			||||||
 | 
					#include <QTreeWidgetItem>
 | 
				
			||||||
 | 
					#include <QtNetwork/QSslCertificate>
 | 
				
			||||||
 | 
					#include <QMdiSubWindow>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QtCore/QDebug>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if QT_VERSION >= 0x050000
 | 
				
			||||||
 | 
					namespace QSsl {
 | 
				
			||||||
 | 
					  typedef AlternativeNameEntryType AlternateNameEntryType;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Certificate: public QWidget, protected Ui::Certificate {
 | 
				
			||||||
 | 
					    Q_OBJECT;
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
					    Certificate(QWidget * parent = 0): QWidget(parent) {
 | 
				
			||||||
 | 
					      setupUi(this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    Certificate& certificate(const QSslCertificate& cert) {
 | 
				
			||||||
 | 
					      _certificate = cert;
 | 
				
			||||||
 | 
					      _cert->clear();
 | 
				
			||||||
 | 
					#if QT_VERSION < 0x050000
 | 
				
			||||||
 | 
					      if (!cert.isValid()) return *this;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      _cert->addTopLevelItem
 | 
				
			||||||
 | 
					        ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					          (QStringList()<<tr("Valid Since")
 | 
				
			||||||
 | 
					           <<cert.effectiveDate().toString(Qt::SystemLocaleLongDate))));
 | 
				
			||||||
 | 
					      _cert->addTopLevelItem
 | 
				
			||||||
 | 
					        ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					          (QStringList()<<tr("Valid Until")
 | 
				
			||||||
 | 
					           <<cert.expiryDate().toString(Qt::SystemLocaleLongDate))));
 | 
				
			||||||
 | 
					      if (!cert.subjectInfo(QByteArray("serialNumber")).isEmpty()) {
 | 
				
			||||||
 | 
					        _cert->addTopLevelItem
 | 
				
			||||||
 | 
					          ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					            (QStringList()<<tr("SuisseID Number")
 | 
				
			||||||
 | 
					             <<cert.subjectInfo(QByteArray("serialNumber")))));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      _cert->addTopLevelItem
 | 
				
			||||||
 | 
					        ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					          (QStringList()<<tr("Certificate Serial Number")
 | 
				
			||||||
 | 
					           <<cert.serialNumber())));
 | 
				
			||||||
 | 
					      // _cert->addTopLevelItem
 | 
				
			||||||
 | 
					      //   ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					      //     (QStringList()<<tr("Version")
 | 
				
			||||||
 | 
					      //      <<cert.version())));
 | 
				
			||||||
 | 
					      QTreeWidgetItem *it(0);
 | 
				
			||||||
 | 
					      _cert->addTopLevelItem
 | 
				
			||||||
 | 
					        ((it = new QTreeWidgetItem(QStringList()<<tr("Subject Info")<<"")));
 | 
				
			||||||
 | 
					      for (QSslCertificate::SubjectInfo
 | 
				
			||||||
 | 
					             si(QSslCertificate::StateOrProvinceName);
 | 
				
			||||||
 | 
					           si>=QSslCertificate::Organization;
 | 
				
			||||||
 | 
					           si=(QSslCertificate::SubjectInfo)((int)si-1))
 | 
				
			||||||
 | 
					        if (!cert.subjectInfo(si).isEmpty())
 | 
				
			||||||
 | 
					          it->addChild
 | 
				
			||||||
 | 
					            ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					              (QStringList()<<subjectInfo(si)<<cert.subjectInfo(si))));
 | 
				
			||||||
 | 
					      QTreeWidgetItem *it2(0);
 | 
				
			||||||
 | 
					      it->addChild
 | 
				
			||||||
 | 
					        ((it2 = new QTreeWidgetItem
 | 
				
			||||||
 | 
					          (QStringList()<<tr("Alternate Subject")<<"")));
 | 
				
			||||||
 | 
					      QMultiMap<QSsl::AlternateNameEntryType, QString>
 | 
				
			||||||
 | 
					#if QT_VERSION <0x050000
 | 
				
			||||||
 | 
					        asns(cert.alternateSubjectNames())
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					        asns(cert.subjectAlternativeNames())
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        ;
 | 
				
			||||||
 | 
					   for (QMultiMap<QSsl::AlternateNameEntryType, QString>::iterator
 | 
				
			||||||
 | 
					             asn(asns.begin()); asn!=asns.end(); ++asn)
 | 
				
			||||||
 | 
					        it2->addChild
 | 
				
			||||||
 | 
					          ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					            (QStringList()<<alternateName(asn.key())<<asn.value())));
 | 
				
			||||||
 | 
					      _cert->addTopLevelItem
 | 
				
			||||||
 | 
					        ((it = new QTreeWidgetItem(QStringList()<<tr("Issuer Info")<<"")));
 | 
				
			||||||
 | 
					      for (QSslCertificate::SubjectInfo
 | 
				
			||||||
 | 
					             si(QSslCertificate::StateOrProvinceName);
 | 
				
			||||||
 | 
					           si>=QSslCertificate::Organization;
 | 
				
			||||||
 | 
					           si=(QSslCertificate::SubjectInfo)((int)si-1))
 | 
				
			||||||
 | 
					        if (!cert.issuerInfo(si).isEmpty())
 | 
				
			||||||
 | 
					          it->addChild
 | 
				
			||||||
 | 
					            ((new QTreeWidgetItem
 | 
				
			||||||
 | 
					              (QStringList()<<subjectInfo(si)<<cert.issuerInfo(si))));
 | 
				
			||||||
 | 
					      _cert->expandAll();
 | 
				
			||||||
 | 
					      _cert->resizeColumnToContents(0);
 | 
				
			||||||
 | 
					      _cert->resizeColumnToContents(1);
 | 
				
			||||||
 | 
					      return *this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QSslCertificate certificate() {
 | 
				
			||||||
 | 
					      return _certificate;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QString alternateName(QSsl::AlternateNameEntryType an) {
 | 
				
			||||||
 | 
					      switch (an) {
 | 
				
			||||||
 | 
					        case QSsl::EmailEntry: return tr("E-Mail");
 | 
				
			||||||
 | 
					        case QSsl::DnsEntry: return tr("URL");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return tr("error", "unknown certificate subject alternate name");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QString subjectInfo(QSslCertificate::SubjectInfo si) {
 | 
				
			||||||
 | 
					      switch (si) {
 | 
				
			||||||
 | 
					        case QSslCertificate::Organization:
 | 
				
			||||||
 | 
					          return tr("Organization");
 | 
				
			||||||
 | 
					        case QSslCertificate::CommonName:
 | 
				
			||||||
 | 
					          return tr("Common Name");
 | 
				
			||||||
 | 
					        case QSslCertificate::LocalityName:
 | 
				
			||||||
 | 
					          return tr("Locality");
 | 
				
			||||||
 | 
					        case QSslCertificate::OrganizationalUnitName:
 | 
				
			||||||
 | 
					          return tr("Organizational Unit");
 | 
				
			||||||
 | 
					        case QSslCertificate::CountryName:
 | 
				
			||||||
 | 
					          return tr("Country");
 | 
				
			||||||
 | 
					        case QSslCertificate::StateOrProvinceName:
 | 
				
			||||||
 | 
					          return tr("State or Province");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return tr("error", "unknown certificate subject info");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  protected:
 | 
				
			||||||
 | 
					    QSslCertificate _certificate;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										59
									
								
								src/certificate.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/certificate.ui
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<ui version="4.0">
 | 
				
			||||||
 | 
					 <class>Certificate</class>
 | 
				
			||||||
 | 
					 <widget class="QWidget" name="Certificate">
 | 
				
			||||||
 | 
					  <property name="geometry">
 | 
				
			||||||
 | 
					   <rect>
 | 
				
			||||||
 | 
					    <x>0</x>
 | 
				
			||||||
 | 
					    <y>0</y>
 | 
				
			||||||
 | 
					    <width>400</width>
 | 
				
			||||||
 | 
					    <height>320</height>
 | 
				
			||||||
 | 
					   </rect>
 | 
				
			||||||
 | 
					  </property>
 | 
				
			||||||
 | 
					  <property name="windowTitle">
 | 
				
			||||||
 | 
					   <string>Form</string>
 | 
				
			||||||
 | 
					  </property>
 | 
				
			||||||
 | 
					  <layout class="QGridLayout" name="gridLayout">
 | 
				
			||||||
 | 
					   <item row="0" column="0">
 | 
				
			||||||
 | 
					    <widget class="QTreeWidget" name="_cert">
 | 
				
			||||||
 | 
					     <property name="editTriggers">
 | 
				
			||||||
 | 
					      <set>QAbstractItemView::NoEditTriggers</set>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					     <property name="alternatingRowColors">
 | 
				
			||||||
 | 
					      <bool>true</bool>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					     <property name="rootIsDecorated">
 | 
				
			||||||
 | 
					      <bool>true</bool>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					     <property name="sortingEnabled">
 | 
				
			||||||
 | 
					      <bool>false</bool>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					     <property name="wordWrap">
 | 
				
			||||||
 | 
					      <bool>true</bool>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					     <attribute name="headerVisible">
 | 
				
			||||||
 | 
					      <bool>false</bool>
 | 
				
			||||||
 | 
					     </attribute>
 | 
				
			||||||
 | 
					     <attribute name="headerCascadingSectionResizes">
 | 
				
			||||||
 | 
					      <bool>true</bool>
 | 
				
			||||||
 | 
					     </attribute>
 | 
				
			||||||
 | 
					     <attribute name="headerShowSortIndicator" stdset="0">
 | 
				
			||||||
 | 
					      <bool>false</bool>
 | 
				
			||||||
 | 
					     </attribute>
 | 
				
			||||||
 | 
					     <column>
 | 
				
			||||||
 | 
					      <property name="text">
 | 
				
			||||||
 | 
					       <string>Attribute</string>
 | 
				
			||||||
 | 
					      </property>
 | 
				
			||||||
 | 
					     </column>
 | 
				
			||||||
 | 
					     <column>
 | 
				
			||||||
 | 
					      <property name="text">
 | 
				
			||||||
 | 
					       <string>Value</string>
 | 
				
			||||||
 | 
					      </property>
 | 
				
			||||||
 | 
					     </column>
 | 
				
			||||||
 | 
					    </widget>
 | 
				
			||||||
 | 
					   </item>
 | 
				
			||||||
 | 
					  </layout>
 | 
				
			||||||
 | 
					 </widget>
 | 
				
			||||||
 | 
					 <resources/>
 | 
				
			||||||
 | 
					 <connections/>
 | 
				
			||||||
 | 
					</ui>
 | 
				
			||||||
@@ -11,18 +11,93 @@
 | 
				
			|||||||
#ifndef CERTMAN_HXX
 | 
					#ifndef CERTMAN_HXX
 | 
				
			||||||
#define CERTMAN_HXX
 | 
					#define CERTMAN_HXX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <QMainWindow>
 | 
					#include <certificate.hxx>
 | 
				
			||||||
 | 
					#include <openfromurl.hxx>
 | 
				
			||||||
#include <ui_certman.hxx>
 | 
					#include <ui_certman.hxx>
 | 
				
			||||||
 | 
					#include <QMainWindow>
 | 
				
			||||||
 | 
					#include <QFileDialog>
 | 
				
			||||||
 | 
					#include <QFileInfo>
 | 
				
			||||||
 | 
					#include <QRegExp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <QDebug>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Main Window
 | 
					/// Main Window
 | 
				
			||||||
/** Main window for certman */
 | 
					/** Main window for certman */
 | 
				
			||||||
class CertMan: public QMainWindow, protected Ui::CertMan {
 | 
					class CertMan: public QMainWindow, protected Ui::CertMan {
 | 
				
			||||||
    Q_OBJECT;
 | 
					    Q_OBJECT;
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    explicit CertMan(QWidget *parent = 0): QMainWindow(parent) {
 | 
					    explicit CertMan(QWidget *parent = 0):
 | 
				
			||||||
 | 
					        QMainWindow(parent),
 | 
				
			||||||
 | 
					        _openFromURL(this) {
 | 
				
			||||||
      setupUi(this);
 | 
					      setupUi(this);
 | 
				
			||||||
 | 
					      connect(&_openFromURL, SIGNAL(certificate(QUrl, QSslCertificate)),
 | 
				
			||||||
 | 
					              SLOT(certificate(QUrl, QSslCertificate)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    virtual ~CertMan() {}
 | 
					    virtual ~CertMan() {}
 | 
				
			||||||
 | 
					  protected slots:
 | 
				
			||||||
 | 
					    void on__actionOpenCertificate_triggered() {
 | 
				
			||||||
 | 
					      QString fileName = QFileDialog::getOpenFileName(this);
 | 
				
			||||||
 | 
					      if (fileName.isEmpty()) return;
 | 
				
			||||||
 | 
					      QFile file(fileName);
 | 
				
			||||||
 | 
					      file.open(QIODevice::ReadOnly);
 | 
				
			||||||
 | 
					      QSslCertificate c(&file);
 | 
				
			||||||
 | 
					      file.close();
 | 
				
			||||||
 | 
					      if (c.isNull()) {
 | 
				
			||||||
 | 
					        qDebug()<<QObject::trUtf8("Cannot read PEM certificate from file: %1")
 | 
				
			||||||
 | 
					          .arg(fileName);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      Certificate* win(new Certificate(_mdi));
 | 
				
			||||||
 | 
					      _mdi->addSubWindow(win)->setWindowTitle(QFileInfo(fileName).fileName());
 | 
				
			||||||
 | 
					      win->show();
 | 
				
			||||||
 | 
					      win->certificate(c);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void on__actionOpenFromURL_triggered() {
 | 
				
			||||||
 | 
					      if (_openFromURL.exec()==QDialog::Accepted) {
 | 
				
			||||||
 | 
					        _openFromURL.read();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void certificate(QUrl url, QSslCertificate cert) {
 | 
				
			||||||
 | 
					      qDebug()<<"got certificate: "<<cert.subjectInfo(QSslCertificate::CommonName).join("/");
 | 
				
			||||||
 | 
					      Certificate* win(new Certificate(_mdi));
 | 
				
			||||||
 | 
					      _mdi->addSubWindow(win)->setWindowTitle
 | 
				
			||||||
 | 
					        (url.host()+" - "+
 | 
				
			||||||
 | 
					         cert.subjectInfo(QSslCertificate::CommonName).join("/"));
 | 
				
			||||||
 | 
					      win->show();
 | 
				
			||||||
 | 
					      win->certificate(cert);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void on__actionSaveAs_triggered() {
 | 
				
			||||||
 | 
					      QMdiSubWindow* win(_mdi->currentSubWindow());
 | 
				
			||||||
 | 
					      if (!win) return;
 | 
				
			||||||
 | 
					      Certificate* cert(dynamic_cast<Certificate*>(win->widget()));
 | 
				
			||||||
 | 
					      QString fileName(QFileDialog::getSaveFileName
 | 
				
			||||||
 | 
					                       (this,
 | 
				
			||||||
 | 
					                        win->windowTitle(),
 | 
				
			||||||
 | 
					                        win->windowTitle()
 | 
				
			||||||
 | 
					                        .replace(" ", "_").replace(QRegExp("\.(pem|der)$"), "")
 | 
				
			||||||
 | 
					                        +".pem",
 | 
				
			||||||
 | 
					                        tr("Certificates (*.der *.pem *.txt)")));
 | 
				
			||||||
 | 
					      if (fileName.isEmpty()) return;
 | 
				
			||||||
 | 
					      QFile file(fileName);
 | 
				
			||||||
 | 
					      file.open(QIODevice::WriteOnly);
 | 
				
			||||||
 | 
					      QFileInfo fileInfo(fileName);
 | 
				
			||||||
 | 
					      if (fileInfo.suffix()=="der") {
 | 
				
			||||||
 | 
					        QDataStream out(&file);
 | 
				
			||||||
 | 
					        out<<cert->certificate().toDer();
 | 
				
			||||||
 | 
					      } else if (fileInfo.suffix()=="pem") {
 | 
				
			||||||
 | 
					        QDataStream out(&file);
 | 
				
			||||||
 | 
					        out<<cert->certificate().toPem();
 | 
				
			||||||
 | 
					      } else if (fileInfo.suffix()=="txt") {
 | 
				
			||||||
 | 
					        QTextStream out(&file);
 | 
				
			||||||
 | 
					        out<<cert->certificate().toText();
 | 
				
			||||||
 | 
					      } else { // defaults to pem
 | 
				
			||||||
 | 
					        QDataStream out(&file);
 | 
				
			||||||
 | 
					        out<<cert->certificate().toPem();
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      file.close();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  private:
 | 
				
			||||||
 | 
					    OpenFromURL _openFromURL;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										109
									
								
								src/certman.ui
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								src/certman.ui
									
									
									
									
									
								
							@@ -13,7 +13,13 @@
 | 
				
			|||||||
  <property name="windowTitle">
 | 
					  <property name="windowTitle">
 | 
				
			||||||
   <string>CertMan</string>
 | 
					   <string>CertMan</string>
 | 
				
			||||||
  </property>
 | 
					  </property>
 | 
				
			||||||
  <widget class="QWidget" name="centralwidget"/>
 | 
					  <widget class="QWidget" name="centralwidget">
 | 
				
			||||||
 | 
					   <layout class="QGridLayout" name="gridLayout">
 | 
				
			||||||
 | 
					    <item row="0" column="0">
 | 
				
			||||||
 | 
					     <widget class="QMdiArea" name="_mdi"/>
 | 
				
			||||||
 | 
					    </item>
 | 
				
			||||||
 | 
					   </layout>
 | 
				
			||||||
 | 
					  </widget>
 | 
				
			||||||
  <widget class="QMenuBar" name="menubar">
 | 
					  <widget class="QMenuBar" name="menubar">
 | 
				
			||||||
   <property name="geometry">
 | 
					   <property name="geometry">
 | 
				
			||||||
    <rect>
 | 
					    <rect>
 | 
				
			||||||
@@ -23,9 +29,108 @@
 | 
				
			|||||||
     <height>22</height>
 | 
					     <height>22</height>
 | 
				
			||||||
    </rect>
 | 
					    </rect>
 | 
				
			||||||
   </property>
 | 
					   </property>
 | 
				
			||||||
 | 
					   <widget class="QMenu" name="menuFile">
 | 
				
			||||||
 | 
					    <property name="title">
 | 
				
			||||||
 | 
					     <string>File</string>
 | 
				
			||||||
 | 
					    </property>
 | 
				
			||||||
 | 
					    <addaction name="_actionOpenCertificate"/>
 | 
				
			||||||
 | 
					    <addaction name="_actionOpenFromURL"/>
 | 
				
			||||||
 | 
					    <addaction name="_actionSaveAs"/>
 | 
				
			||||||
 | 
					    <addaction name="separator"/>
 | 
				
			||||||
 | 
					    <addaction name="_actionExit"/>
 | 
				
			||||||
 | 
					    <addaction name="separator"/>
 | 
				
			||||||
 | 
					   </widget>
 | 
				
			||||||
 | 
					   <widget class="QMenu" name="menuWindows">
 | 
				
			||||||
 | 
					    <property name="title">
 | 
				
			||||||
 | 
					     <string>Windows</string>
 | 
				
			||||||
 | 
					    </property>
 | 
				
			||||||
 | 
					    <addaction name="_actionCascade"/>
 | 
				
			||||||
 | 
					    <addaction name="_actionTile"/>
 | 
				
			||||||
 | 
					   </widget>
 | 
				
			||||||
 | 
					   <addaction name="menuFile"/>
 | 
				
			||||||
 | 
					   <addaction name="menuWindows"/>
 | 
				
			||||||
  </widget>
 | 
					  </widget>
 | 
				
			||||||
  <widget class="QStatusBar" name="statusbar"/>
 | 
					  <widget class="QStatusBar" name="statusbar"/>
 | 
				
			||||||
 | 
					  <action name="_actionOpenCertificate">
 | 
				
			||||||
 | 
					   <property name="text">
 | 
				
			||||||
 | 
					    <string>Open Certificate ...</string>
 | 
				
			||||||
 | 
					   </property>
 | 
				
			||||||
 | 
					  </action>
 | 
				
			||||||
 | 
					  <action name="_actionExit">
 | 
				
			||||||
 | 
					   <property name="text">
 | 
				
			||||||
 | 
					    <string>Exit</string>
 | 
				
			||||||
 | 
					   </property>
 | 
				
			||||||
 | 
					  </action>
 | 
				
			||||||
 | 
					  <action name="_actionCascade">
 | 
				
			||||||
 | 
					   <property name="text">
 | 
				
			||||||
 | 
					    <string>Cascade</string>
 | 
				
			||||||
 | 
					   </property>
 | 
				
			||||||
 | 
					  </action>
 | 
				
			||||||
 | 
					  <action name="_actionTile">
 | 
				
			||||||
 | 
					   <property name="text">
 | 
				
			||||||
 | 
					    <string>Tile</string>
 | 
				
			||||||
 | 
					   </property>
 | 
				
			||||||
 | 
					  </action>
 | 
				
			||||||
 | 
					  <action name="_actionOpenFromURL">
 | 
				
			||||||
 | 
					   <property name="text">
 | 
				
			||||||
 | 
					    <string>Open From URL ...</string>
 | 
				
			||||||
 | 
					   </property>
 | 
				
			||||||
 | 
					  </action>
 | 
				
			||||||
 | 
					  <action name="_actionSaveAs">
 | 
				
			||||||
 | 
					   <property name="text">
 | 
				
			||||||
 | 
					    <string>Save As ...</string>
 | 
				
			||||||
 | 
					   </property>
 | 
				
			||||||
 | 
					  </action>
 | 
				
			||||||
 </widget>
 | 
					 </widget>
 | 
				
			||||||
 <resources/>
 | 
					 <resources/>
 | 
				
			||||||
 <connections/>
 | 
					 <connections>
 | 
				
			||||||
 | 
					  <connection>
 | 
				
			||||||
 | 
					   <sender>_actionExit</sender>
 | 
				
			||||||
 | 
					   <signal>triggered()</signal>
 | 
				
			||||||
 | 
					   <receiver>CertMan</receiver>
 | 
				
			||||||
 | 
					   <slot>close()</slot>
 | 
				
			||||||
 | 
					   <hints>
 | 
				
			||||||
 | 
					    <hint type="sourcelabel">
 | 
				
			||||||
 | 
					     <x>-1</x>
 | 
				
			||||||
 | 
					     <y>-1</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					    <hint type="destinationlabel">
 | 
				
			||||||
 | 
					     <x>399</x>
 | 
				
			||||||
 | 
					     <y>299</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					   </hints>
 | 
				
			||||||
 | 
					  </connection>
 | 
				
			||||||
 | 
					  <connection>
 | 
				
			||||||
 | 
					   <sender>_actionTile</sender>
 | 
				
			||||||
 | 
					   <signal>triggered()</signal>
 | 
				
			||||||
 | 
					   <receiver>_mdi</receiver>
 | 
				
			||||||
 | 
					   <slot>tileSubWindows()</slot>
 | 
				
			||||||
 | 
					   <hints>
 | 
				
			||||||
 | 
					    <hint type="sourcelabel">
 | 
				
			||||||
 | 
					     <x>-1</x>
 | 
				
			||||||
 | 
					     <y>-1</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					    <hint type="destinationlabel">
 | 
				
			||||||
 | 
					     <x>399</x>
 | 
				
			||||||
 | 
					     <y>299</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					   </hints>
 | 
				
			||||||
 | 
					  </connection>
 | 
				
			||||||
 | 
					  <connection>
 | 
				
			||||||
 | 
					   <sender>_actionCascade</sender>
 | 
				
			||||||
 | 
					   <signal>triggered()</signal>
 | 
				
			||||||
 | 
					   <receiver>_mdi</receiver>
 | 
				
			||||||
 | 
					   <slot>cascadeSubWindows()</slot>
 | 
				
			||||||
 | 
					   <hints>
 | 
				
			||||||
 | 
					    <hint type="sourcelabel">
 | 
				
			||||||
 | 
					     <x>-1</x>
 | 
				
			||||||
 | 
					     <y>-1</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					    <hint type="destinationlabel">
 | 
				
			||||||
 | 
					     <x>399</x>
 | 
				
			||||||
 | 
					     <y>299</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					   </hints>
 | 
				
			||||||
 | 
					  </connection>
 | 
				
			||||||
 | 
					 </connections>
 | 
				
			||||||
</ui>
 | 
					</ui>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								src/certman_de.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/certman_de.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE TS>
 | 
				
			||||||
 | 
					<TS version="2.1" language="de">
 | 
				
			||||||
 | 
					</TS>
 | 
				
			||||||
							
								
								
									
										4
									
								
								src/certman_en.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/certman_en.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE TS>
 | 
				
			||||||
 | 
					<TS version="2.1" language="en">
 | 
				
			||||||
 | 
					</TS>
 | 
				
			||||||
							
								
								
									
										4
									
								
								src/certman_fr.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/certman_fr.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE TS>
 | 
				
			||||||
 | 
					<TS version="2.1" language="fr">
 | 
				
			||||||
 | 
					</TS>
 | 
				
			||||||
							
								
								
									
										4
									
								
								src/certman_it.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/certman_it.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE TS>
 | 
				
			||||||
 | 
					<TS version="2.1" language="it">
 | 
				
			||||||
 | 
					</TS>
 | 
				
			||||||
@@ -33,10 +33,10 @@ QT_PLUGINS = iconengines imageformats platforms
 | 
				
			|||||||
noinst_HEADERS = version.hxx
 | 
					noinst_HEADERS = version.hxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## list all %.hxx files with Q_OBJECT as moc_%.cxx
 | 
					## list all %.hxx files with Q_OBJECT as moc_%.cxx
 | 
				
			||||||
certman_MOCFILES = moc_certman.cxx
 | 
					certman_MOCFILES = moc_certman.cxx moc_certificate.cxx moc_openfromurl.cxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## list all %.ui files as ui_%.hxx
 | 
					## list all %.ui files as ui_%.hxx
 | 
				
			||||||
certman_UIFILES = ui_certman.hxx
 | 
					certman_UIFILES = ui_certman.hxx ui_certificate.hxx ui_openfromurl.hxx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## list all %.qrc resource files as qrc_%.cxx
 | 
					## list all %.qrc resource files as qrc_%.cxx
 | 
				
			||||||
## note: if there exists a directory %, the file %.qrc is generated from that
 | 
					## note: if there exists a directory %, the file %.qrc is generated from that
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										73
									
								
								src/openfromurl.hxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/openfromurl.hxx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
				
			|||||||
 | 
					/*! @file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @id $Id$
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					//       1         2         3         4         5         6         7         8
 | 
				
			||||||
 | 
					// 45678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef OPENFROMURL_HXX
 | 
				
			||||||
 | 
					#define OPENFROMURL_HXX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ui_openfromurl.hxx>
 | 
				
			||||||
 | 
					#include <QDialog>
 | 
				
			||||||
 | 
					#include <QNetworkAccessManager>
 | 
				
			||||||
 | 
					#include <QNetworkReply>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OpenFromURL: public QDialog, public Ui::OpenFromURL {
 | 
				
			||||||
 | 
					    Q_OBJECT;
 | 
				
			||||||
 | 
					  public:
 | 
				
			||||||
 | 
					    OpenFromURL(QWidget* p): QDialog(p) {
 | 
				
			||||||
 | 
					      setupUi(this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    QString url() {
 | 
				
			||||||
 | 
					      return _url->currentText();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void read() {
 | 
				
			||||||
 | 
					      QNetworkReply* reply
 | 
				
			||||||
 | 
					        (_net.head(QNetworkRequest(QUrl("https://"+_url->currentText()))));
 | 
				
			||||||
 | 
					      connect(reply, SIGNAL(finished()), SLOT(finished()));
 | 
				
			||||||
 | 
					      connect(reply, SIGNAL(encrypted()), SLOT(encrypted()));
 | 
				
			||||||
 | 
					      connect(reply, SIGNAL(sslErrors(const QList<QSslError>&)),
 | 
				
			||||||
 | 
					              SLOT(sslErrors(const QList<QSslError>&)));
 | 
				
			||||||
 | 
					      connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
 | 
				
			||||||
 | 
					              SLOT(error(QNetworkReply::NetworkError)));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  signals:
 | 
				
			||||||
 | 
					    void certificate(QUrl, QSslCertificate);
 | 
				
			||||||
 | 
					  protected slots:
 | 
				
			||||||
 | 
					    void on__buttons_accepted() {
 | 
				
			||||||
 | 
					      _url->addItem(_url->currentText());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void finished() {
 | 
				
			||||||
 | 
					      qDebug()<<"finished";
 | 
				
			||||||
 | 
					      QNetworkReply* reply(dynamic_cast<QNetworkReply*>(sender()));
 | 
				
			||||||
 | 
					      QList<QSslCertificate> certs(reply->sslConfiguration()
 | 
				
			||||||
 | 
					                                   .peerCertificateChain());
 | 
				
			||||||
 | 
					      qDebug()<<"number of peer certificates: "<<certs.size();
 | 
				
			||||||
 | 
					      if (certs.size()) {
 | 
				
			||||||
 | 
					        Q_FOREACH(QSslCertificate cert, certs) { 
 | 
				
			||||||
 | 
					          certificate(reply->url(), cert); 
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        QSslCertificate cert(reply->sslConfiguration().peerCertificate());
 | 
				
			||||||
 | 
					        if (!cert.isNull()) {
 | 
				
			||||||
 | 
					          certificate(reply->url(), cert);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          qDebug()<<"no peer certificate found";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void encrypted() {
 | 
				
			||||||
 | 
					      qDebug()<<"encrypted";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void sslErrors(const QList<QSslError>& errors) {
 | 
				
			||||||
 | 
					      qDebug()<<"sslErrors";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    void error(QNetworkReply::NetworkError code) {
 | 
				
			||||||
 | 
					      qDebug()<<"error";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  private:
 | 
				
			||||||
 | 
					    QNetworkAccessManager _net;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										101
									
								
								src/openfromurl.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/openfromurl.ui
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<ui version="4.0">
 | 
				
			||||||
 | 
					 <class>OpenFromURL</class>
 | 
				
			||||||
 | 
					 <widget class="QDialog" name="OpenFromURL">
 | 
				
			||||||
 | 
					  <property name="geometry">
 | 
				
			||||||
 | 
					   <rect>
 | 
				
			||||||
 | 
					    <x>0</x>
 | 
				
			||||||
 | 
					    <y>0</y>
 | 
				
			||||||
 | 
					    <width>434</width>
 | 
				
			||||||
 | 
					    <height>89</height>
 | 
				
			||||||
 | 
					   </rect>
 | 
				
			||||||
 | 
					  </property>
 | 
				
			||||||
 | 
					  <property name="windowTitle">
 | 
				
			||||||
 | 
					   <string>Open Certificate From URL</string>
 | 
				
			||||||
 | 
					  </property>
 | 
				
			||||||
 | 
					  <layout class="QVBoxLayout" name="verticalLayout">
 | 
				
			||||||
 | 
					   <item>
 | 
				
			||||||
 | 
					    <layout class="QHBoxLayout" name="horizontalLayout">
 | 
				
			||||||
 | 
					     <item>
 | 
				
			||||||
 | 
					      <widget class="QLabel" name="label">
 | 
				
			||||||
 | 
					       <property name="text">
 | 
				
			||||||
 | 
					        <string>Hostname:</string>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					      </widget>
 | 
				
			||||||
 | 
					     </item>
 | 
				
			||||||
 | 
					     <item>
 | 
				
			||||||
 | 
					      <widget class="QComboBox" name="_url">
 | 
				
			||||||
 | 
					       <property name="sizePolicy">
 | 
				
			||||||
 | 
					        <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
 | 
				
			||||||
 | 
					         <horstretch>0</horstretch>
 | 
				
			||||||
 | 
					         <verstretch>0</verstretch>
 | 
				
			||||||
 | 
					        </sizepolicy>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					       <property name="editable">
 | 
				
			||||||
 | 
					        <bool>true</bool>
 | 
				
			||||||
 | 
					       </property>
 | 
				
			||||||
 | 
					      </widget>
 | 
				
			||||||
 | 
					     </item>
 | 
				
			||||||
 | 
					    </layout>
 | 
				
			||||||
 | 
					   </item>
 | 
				
			||||||
 | 
					   <item>
 | 
				
			||||||
 | 
					    <spacer name="verticalSpacer">
 | 
				
			||||||
 | 
					     <property name="orientation">
 | 
				
			||||||
 | 
					      <enum>Qt::Vertical</enum>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					     <property name="sizeHint" stdset="0">
 | 
				
			||||||
 | 
					      <size>
 | 
				
			||||||
 | 
					       <width>20</width>
 | 
				
			||||||
 | 
					       <height>4</height>
 | 
				
			||||||
 | 
					      </size>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					    </spacer>
 | 
				
			||||||
 | 
					   </item>
 | 
				
			||||||
 | 
					   <item>
 | 
				
			||||||
 | 
					    <widget class="QDialogButtonBox" name="_buttons">
 | 
				
			||||||
 | 
					     <property name="orientation">
 | 
				
			||||||
 | 
					      <enum>Qt::Horizontal</enum>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					     <property name="standardButtons">
 | 
				
			||||||
 | 
					      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
 | 
				
			||||||
 | 
					     </property>
 | 
				
			||||||
 | 
					    </widget>
 | 
				
			||||||
 | 
					   </item>
 | 
				
			||||||
 | 
					  </layout>
 | 
				
			||||||
 | 
					 </widget>
 | 
				
			||||||
 | 
					 <resources/>
 | 
				
			||||||
 | 
					 <connections>
 | 
				
			||||||
 | 
					  <connection>
 | 
				
			||||||
 | 
					   <sender>_buttons</sender>
 | 
				
			||||||
 | 
					   <signal>accepted()</signal>
 | 
				
			||||||
 | 
					   <receiver>OpenFromURL</receiver>
 | 
				
			||||||
 | 
					   <slot>accept()</slot>
 | 
				
			||||||
 | 
					   <hints>
 | 
				
			||||||
 | 
					    <hint type="sourcelabel">
 | 
				
			||||||
 | 
					     <x>248</x>
 | 
				
			||||||
 | 
					     <y>254</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					    <hint type="destinationlabel">
 | 
				
			||||||
 | 
					     <x>157</x>
 | 
				
			||||||
 | 
					     <y>274</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					   </hints>
 | 
				
			||||||
 | 
					  </connection>
 | 
				
			||||||
 | 
					  <connection>
 | 
				
			||||||
 | 
					   <sender>_buttons</sender>
 | 
				
			||||||
 | 
					   <signal>rejected()</signal>
 | 
				
			||||||
 | 
					   <receiver>OpenFromURL</receiver>
 | 
				
			||||||
 | 
					   <slot>reject()</slot>
 | 
				
			||||||
 | 
					   <hints>
 | 
				
			||||||
 | 
					    <hint type="sourcelabel">
 | 
				
			||||||
 | 
					     <x>316</x>
 | 
				
			||||||
 | 
					     <y>260</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					    <hint type="destinationlabel">
 | 
				
			||||||
 | 
					     <x>286</x>
 | 
				
			||||||
 | 
					     <y>274</y>
 | 
				
			||||||
 | 
					    </hint>
 | 
				
			||||||
 | 
					   </hints>
 | 
				
			||||||
 | 
					  </connection>
 | 
				
			||||||
 | 
					 </connections>
 | 
				
			||||||
 | 
					</ui>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user