From 09c4747ab6042d25a657b5973b8091655c36e503 Mon Sep 17 00:00:00 2001 From: nowrep Date: Tue, 22 Mar 2011 21:36:15 +0100 Subject: [PATCH] Added basic SSL Certificate support and improved about site dialog (not final version yet) --- src/bookmarks/bookmarkswidget.ui | 8 +- src/data/icons.qrc | 3 + src/navigation/locationbar.cpp | 20 +- src/network/networkmanager.cpp | 40 ++- src/network/networkmanager.h | 2 +- src/other/aboutdialog.cpp | 2 +- src/preferences/preferences.cpp | 1 - src/preferences/preferences.ui | 3 + src/preferences/sslmanager.h | 1 + src/webview/siteinfo.cpp | 39 ++- src/webview/siteinfo.h | 4 + src/webview/siteinfo.ui | 545 ++++++++++++++++++++++++++----- src/webview/siteinfowidget.cpp | 8 +- src/webview/siteinfowidget.ui | 10 +- src/webview/webpage.cpp | 8 +- src/webview/webpage.h | 4 + src/webview/webview.cpp | 2 +- src/webview/webview.h | 2 +- 18 files changed, 586 insertions(+), 116 deletions(-) diff --git a/src/bookmarks/bookmarkswidget.ui b/src/bookmarks/bookmarkswidget.ui index 65de6220b..fafe94b49 100644 --- a/src/bookmarks/bookmarkswidget.ui +++ b/src/bookmarks/bookmarkswidget.ui @@ -6,10 +6,16 @@ 0 0 - 282 + 250 166 + + + 0 + 0 + + diff --git a/src/data/icons.qrc b/src/data/icons.qrc index 97d5a2794..f02b0f700 100644 --- a/src/data/icons.qrc +++ b/src/data/icons.qrc @@ -66,5 +66,8 @@ icons/other/keys.png icons/other/bigrss.png icons/preferences/applications-fonts.png + icons/preferences/applications-graphics.png + icons/preferences/document-properties.png + icons/preferences/stock_keyring.png diff --git a/src/navigation/locationbar.cpp b/src/navigation/locationbar.cpp index 8587daee1..19b515681 100644 --- a/src/navigation/locationbar.cpp +++ b/src/navigation/locationbar.cpp @@ -26,6 +26,7 @@ #include "bookmarksmodel.h" #include "siteinfowidget.h" #include "rsswidget.h" +#include "webpage.h" LocationBar::LocationBar(QupZilla* mainClass, QWidget* parent) : LineEdit(parent) @@ -174,6 +175,9 @@ void LocationBar::rssIconClicked() void LocationBar::checkBookmark() { + if (!m_bookmarksModel) + m_bookmarksModel = mApp->bookmarks(); + if (m_bookmarksModel->isBookmarked(QUrl(text()))) { m_bookmarkButton->setPixmap(QPixmap(":/icons/locationbar/star.png")); m_bookmarkButton->setToolTip(tr("Edit this bookmark")); @@ -217,14 +221,14 @@ void LocationBar::showUrl(const QUrl &url, bool empty) setText(url.toEncoded()); setCursorPosition(0); } - if (url.scheme() == "https") - setPrivacy(true); - else setPrivacy(false); - if (p_QupZilla->weView()->isLoading()) { + WebView* view = p_QupZilla->weView(); + setPrivacy(view->webPage()->sslCertificate().isValid()); + + if (view->isLoading()) { p_QupZilla->ipLabel()->hide(); p_QupZilla->progressBar()->setVisible(true); - p_QupZilla->progressBar()->setValue(p_QupZilla->weView()->getLoading()); + p_QupZilla->progressBar()->setValue(view->getLoading()); p_QupZilla->buttonStop()->setVisible(true); p_QupZilla->buttonReload()->setVisible(false); p_QupZilla->statusBar()->showMessage(tr("Loading...")); @@ -236,12 +240,8 @@ void LocationBar::showUrl(const QUrl &url, bool empty) p_QupZilla->ipLabel()->show(); } hideGoButton(); - - if (!m_bookmarksModel) - m_bookmarksModel = mApp->bookmarks(); checkBookmark(); - - m_rssIcon->setVisible(p_QupZilla->weView()->hasRss()); + m_rssIcon->setVisible(view->hasRss()); } diff --git a/src/network/networkmanager.cpp b/src/network/networkmanager.cpp index 63a80cc4e..8de499109 100644 --- a/src/network/networkmanager.cpp +++ b/src/network/networkmanager.cpp @@ -20,6 +20,7 @@ #include "autofillmodel.h" #include "networkmanagerproxy.h" #include "mainapplication.h" +#include "webpage.h" NetworkManager::NetworkManager(QupZilla* mainClass, QObject* parent) : NetworkManagerProxy(mainClass, parent) @@ -28,7 +29,7 @@ NetworkManager::NetworkManager(QupZilla* mainClass, QObject* parent) : { connect(this, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(authentication(QNetworkReply*, QAuthenticator* ))); connect(this, SIGNAL(sslErrors(QNetworkReply*,QList)), this, SLOT(sslError(QNetworkReply*,QList))); -// connect(this, SIGNAL(finished(QNetworkReply*)), this, SLOT(setSSLConfiguration(QNetworkReply*))); + connect(this, SIGNAL(finished(QNetworkReply*)), this, SLOT(setSSLConfiguration(QNetworkReply*))); loadSettings(); } @@ -46,23 +47,32 @@ void NetworkManager::loadSettings() } m_ignoreAllWarnings = settings.value("IgnoreAllSSLWarnings", false).toBool(); settings.endGroup(); + + QSslConfiguration config = QSslConfiguration::defaultConfiguration(); + config.setProtocol(QSsl::AnyProtocol); + QSslConfiguration::setDefaultConfiguration(config); + } -//void NetworkManager::setSSLConfiguration(QNetworkReply *reply) -//{ -// if (!reply->sslConfiguration().isNull()) { -// QNetworkRequest request = reply->request(); -// QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100)); -// QWebPage* webPage = (QWebPage*)(v.value()); -// v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 102)); -// WebView* webView = (WebView*)(v.value()); -// if (!webPage || !webView) -// return; +void NetworkManager::setSSLConfiguration(QNetworkReply *reply) +{ + if (!reply->sslConfiguration().isNull()) { + QSslCertificate cert = reply->sslConfiguration().peerCertificate(); + if (!cert.isValid()) + return; -// if (webView->url().host() == reply->url().host()) -// qDebug() << reply->sslConfiguration().peerCertificate() << webPage << webView; -// } -//} + QNetworkRequest request = reply->request(); + QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100)); + WebPage* webPage = (WebPage*)(v.value()); + v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 102)); + WebView* webView = (WebView*)(v.value()); + if (!webPage || !webView) + return; + + if (webView->url().host() == reply->url().host()) + webPage->setSSLCertificate( cert ); + } +} void NetworkManager::sslError(QNetworkReply* reply, QList errors) { diff --git a/src/network/networkmanager.h b/src/network/networkmanager.h index 30969ddfd..6c5d5c7c6 100644 --- a/src/network/networkmanager.h +++ b/src/network/networkmanager.h @@ -53,7 +53,7 @@ signals: public slots: void authentication(QNetworkReply* reply, QAuthenticator* auth); void sslError(QNetworkReply* reply, QList errors); -// void setSSLConfiguration(QNetworkReply* reply); + void setSSLConfiguration(QNetworkReply* reply); private: QupZilla* p_QupZilla; diff --git a/src/other/aboutdialog.cpp b/src/other/aboutdialog.cpp index 68c3f9667..c4b1ef933 100644 --- a/src/other/aboutdialog.cpp +++ b/src/other/aboutdialog.cpp @@ -51,7 +51,7 @@ void AboutDialog::showAbout() m_aboutHtml.append(tr("

© %1 %2
All rights reserved.
").arg(QupZilla::COPYRIGHT, QupZilla::AUTHOR)); m_aboutHtml.append(tr("Build time: %1

").arg(QupZilla::BUILDTIME)); m_aboutHtml.append(QString("

%1

").arg(QupZilla::WWWADDRESS)); - m_aboutHtml.append("

"+mApp->getWindow()->weView()->getPage()->userAgentForUrl(QUrl())+"

"); + m_aboutHtml.append("

"+mApp->getWindow()->weView()->webPage()->userAgentForUrl(QUrl())+"

"); m_aboutHtml.append(""); } ui->textBrowser->setHtml(m_aboutHtml); diff --git a/src/preferences/preferences.cpp b/src/preferences/preferences.cpp index 01b3a3800..ce155048f 100644 --- a/src/preferences/preferences.cpp +++ b/src/preferences/preferences.cpp @@ -512,7 +512,6 @@ void Preferences::saveSettings() Preferences::~Preferences() { - qDebug() << __FUNCTION__ << "called"; delete ui; delete m_autoFillManager; delete m_pluginsList; diff --git a/src/preferences/preferences.ui b/src/preferences/preferences.ui index 928b1c534..f57ad27b6 100644 --- a/src/preferences/preferences.ui +++ b/src/preferences/preferences.ui @@ -26,6 +26,9 @@ 16777215 + + Qt::NoFocus + false diff --git a/src/preferences/sslmanager.h b/src/preferences/sslmanager.h index 70d275c2e..3adddcd36 100644 --- a/src/preferences/sslmanager.h +++ b/src/preferences/sslmanager.h @@ -43,6 +43,7 @@ private slots: void ignoreAll(bool state); private: + void refresh(); Ui::SSLManager* ui; QList m_certs; }; diff --git a/src/webview/siteinfo.cpp b/src/webview/siteinfo.cpp index 379e7fb3f..3eae443d0 100644 --- a/src/webview/siteinfo.cpp +++ b/src/webview/siteinfo.cpp @@ -19,6 +19,7 @@ #include "ui_siteinfo.h" #include "qupzilla.h" #include "webview.h" +#include "webpage.h" SiteInfo::SiteInfo(QupZilla* mainClass, QWidget* parent) : QDialog(parent) @@ -29,12 +30,14 @@ SiteInfo::SiteInfo(QupZilla* mainClass, QWidget* parent) : WebView* view = p_QupZilla->weView(); QWebFrame* frame = view->page()->mainFrame(); QString title = view->title(); - if (title.isEmpty()) - title = tr("No Named Page"); + QSslCertificate cert = view->webPage()->sslCertificate(); - ui->siteName->setText(title); + //GENERAL + ui->heading->setText(QString("%1:").arg(title)); ui->siteAddress->setText(frame->baseUrl().toString()); + + //Meta QWebElementCollection meta = frame->findAllElements("meta"); for (int i = 0; itreeTags->addTopLevelItem(item); } + //MEDIA QWebElementCollection img = frame->findAllElements("img"); for (int i = 0; itreeImages->addTopLevelItem(item); } + //SECURITY + if (cert.isValid()) { + ui->certLabel->setText(tr("Your connection to this page is secured: ")); + //Issued to + ui->issuedToCN->setText( cert.subjectInfo(QSslCertificate::CommonName) ); + ui->issuedToO->setText( cert.subjectInfo(QSslCertificate::Organization) ); + ui->issuedToOU->setText( cert.subjectInfo(QSslCertificate::OrganizationalUnitName) ); + ui->issuedToSN->setText( cert.serialNumber() ); + //Issued By + ui->issuedByCN->setText( cert.issuerInfo(QSslCertificate::CommonName) ); + ui->issuedByO->setText( cert.issuerInfo(QSslCertificate::Organization) ); + ui->issuedByOU->setText( cert.issuerInfo(QSslCertificate::OrganizationalUnitName) ); + //Validity + ui->validityIssuedOn->setText( cert.effectiveDate().toString("dddd d. MMMM yyyy") ); + ui->validityExpiresOn->setText( cert.expiryDate().toString("dddd d. MMMM yyyy") ); + } else { + ui->certFrame->setVisible(false); + ui->certLabel->setText(tr("Your connection to this page is not secured!")); + } + + connect(ui->listWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*))); +} + +void SiteInfo::itemChanged(QListWidgetItem *item) +{ + if (!item) + return; + int index = item->whatsThis().toInt(); + ui->stackedWidget->setCurrentIndex(index); } SiteInfo::~SiteInfo() diff --git a/src/webview/siteinfo.h b/src/webview/siteinfo.h index e01515421..44730fd90 100644 --- a/src/webview/siteinfo.h +++ b/src/webview/siteinfo.h @@ -19,6 +19,7 @@ #define SITEINFO_H #include +#include namespace Ui { class SiteInfo; @@ -33,6 +34,9 @@ public: explicit SiteInfo(QupZilla* mainClass, QWidget* parent = 0); ~SiteInfo(); +private slots: + void itemChanged(QListWidgetItem* item); + private: Ui::SiteInfo* ui; QupZilla* p_QupZilla; diff --git a/src/webview/siteinfo.ui b/src/webview/siteinfo.ui index a69247ce9..5cdd9b73a 100644 --- a/src/webview/siteinfo.ui +++ b/src/webview/siteinfo.ui @@ -6,53 +6,19 @@ 0 0 - 727 - 571 + 590 + 455 Site Info - + :/icons/qupzilla.png:/icons/qupzilla.png - - - - 200 - - - - Tag - - - - - Value - - - - - - - - 200 - - - - Image - - - - - Image address - - - - - + Qt::Horizontal @@ -62,52 +28,479 @@ - - + + - Site address: - - - - - - - - 0 - 0 - - - - Site name: + - - - + + + + 0 + 0 + + + + 16777215 + 55 + + + + Qt::NoFocus + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + QListView::Static + + + QListView::LeftToRight + + + QListView::Fixed + + + QListView::IconMode + + + true + + + 0 + + + + General + + + 0 + + + + :/icons/preferences/document-properties.png:/icons/preferences/document-properties.png + + + + + Media + + + 1 + + + + :/icons/preferences/applications-graphics.png:/icons/preferences/applications-graphics.png + + + + + Security + + + 2 + + + + :/icons/preferences/stock_keyring.png:/icons/preferences/stock_keyring.png + + - - - - - - - - - - - Meta tags of site: - - - - - - - Images on site: + + + + 0 + + + + 0 + + + 0 + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + + + + + + + + Size: + + + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + Site address: + + + + + + + Encoding: + + + + + + + + + Meta tags of site: + + + + + + + 200 + + + + Tag + + + + + Value + + + + + + + + + 0 + 0 + + + + <b>Security information</b> + + + + + + + + + + + + + + + 0 + 0 + + + + Details + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + label_9 + treeTags + label_2 + securityLabel + secDetailsButton + horizontalSpacer + + + + + 0 + + + 0 + + + + + + 16777215 + 150 + + + + false + + + 200 + + + + Image + + + + + Image address + + + + + + + + <b>Preview</b> + + + + + + + + + + + + 0 + + + 0 + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + <b>Issued To</b> + + + + + + + Common Name (CN): + + + + + + + + + + + + + + Organization (O): + + + + + + + + + + + + + + Organizational Unit (OU): + + + + + + + + + + + + + + Serial Number: + + + + + + + + + + + + + + <b>Issued By</b> + + + + + + + Common Name (CN): + + + + + + + + + + + + + + Organization (O): + + + + + + + + + + + + + + Organizational Unit (OU): + + + + + + + + + + + + + + <b>Validity</b> + + + + + + + Issued On: + + + + + + + + + + + + + + Expires On: + + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + @@ -120,7 +513,7 @@ - + diff --git a/src/webview/siteinfowidget.cpp b/src/webview/siteinfowidget.cpp index 79adb05f6..a7aa53b57 100644 --- a/src/webview/siteinfowidget.cpp +++ b/src/webview/siteinfowidget.cpp @@ -18,21 +18,22 @@ #include "siteinfowidget.h" #include "ui_siteinfowidget.h" #include "qupzilla.h" +#include "webpage.h" SiteInfoWidget::SiteInfoWidget(QupZilla* mainClass, QWidget* parent) : QMenu(parent) ,ui(new Ui::SiteInfoWidget) ,p_QupZilla(mainClass) { - QUrl url = p_QupZilla->weView()->url(); + WebView* view = p_QupZilla->weView(); + QUrl url = view->url(); if (url.isEmpty()) return; this->setAttribute(Qt::WA_DeleteOnClose); ui->setupUi(this); - QString scheme = url.scheme(); - if (scheme == "https") { + if (view->webPage()->sslCertificate().isValid()) { ui->secureLabel->setText(tr("Your connection to this site is secured.")); ui->secureIcon->setPixmap(QPixmap(":/icons/locationbar/accept.png")); } @@ -41,6 +42,7 @@ SiteInfoWidget::SiteInfoWidget(QupZilla* mainClass, QWidget* parent) : ui->secureIcon->setPixmap(QPixmap(":/icons/locationbar/warning.png")); } + QString scheme = url.scheme(); QSqlQuery query; QString host = url.host(); QString host2 = host; diff --git a/src/webview/siteinfowidget.ui b/src/webview/siteinfowidget.ui index 4dffe0df5..88aa8aa7c 100644 --- a/src/webview/siteinfowidget.ui +++ b/src/webview/siteinfowidget.ui @@ -6,10 +6,16 @@ 0 0 - 213 - 140 + 117 + 89 + + + 0 + 0 + + diff --git a/src/webview/webpage.cpp b/src/webview/webpage.cpp index 87d252c34..281d14a98 100644 --- a/src/webview/webpage.cpp +++ b/src/webview/webpage.cpp @@ -31,7 +31,7 @@ WebPage::WebPage(WebView* parent, QupZilla* mainClass) setForwardUnsupportedContent(true); setPluginFactory(new WebPluginFactory(this)); connect(this, SIGNAL(unsupportedContent(QNetworkReply*)), SLOT(handleUnsupportedContent(QNetworkReply*))); -// connect(this, SIGNAL()) + connect(this, SIGNAL(loadStarted()), this, SLOT(clearSSLCert())); } void WebPage::handleUnsupportedContent(QNetworkReply* reply) @@ -60,6 +60,12 @@ void WebPage::handleUnsupportedContent(QNetworkReply* reply) qDebug() << "error" << reply->errorString(); } +void WebPage::setSSLCertificate(QSslCertificate cert) +{ +// if (cert != m_SslCert) + m_SslCert = cert; +} + bool WebPage::acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest &request, NavigationType type) { m_lastRequest = request; diff --git a/src/webview/webpage.h b/src/webview/webpage.h index beac0fef7..dfaccdb8b 100644 --- a/src/webview/webpage.h +++ b/src/webview/webpage.h @@ -40,6 +40,8 @@ public: void populateNetworkRequest(QNetworkRequest &request); ~WebPage(); + void setSSLCertificate(QSslCertificate cert); + QSslCertificate sslCertificate() { return m_SslCert; } QString userAgentForUrl(const QUrl &url) const; bool supportsExtension(Extension extension) const { return (extension == ErrorPageExtension); } bool extension(Extension extension, const ExtensionOption* option, ExtensionReturn* output); @@ -47,6 +49,7 @@ public: protected slots: QWebPage* createWindow(QWebPage::WebWindowType type); void handleUnsupportedContent(QNetworkReply* url); + void clearSSLCert() { m_SslCert = 0; } protected: bool acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest &request, NavigationType type); @@ -55,6 +58,7 @@ protected: QNetworkRequest m_lastRequest; QWebPage::NavigationType m_lastRequestType; WebView* m_view; + QSslCertificate m_SslCert; }; #endif // WEBPAGE_H diff --git a/src/webview/webview.cpp b/src/webview/webview.cpp index 55e0d7b9f..f5b394e27 100644 --- a/src/webview/webview.cpp +++ b/src/webview/webview.cpp @@ -73,7 +73,7 @@ WebView::WebView(QupZilla* mainClass, QWidget* parent) m_zoomLevels << 30 << 50 << 67 << 80 << 90 << 100 << 110 << 120 << 133 << 150 << 170 << 200 << 240 << 300; } -WebPage* WebView::getPage() const +WebPage* WebView::webPage() const { return m_page; } diff --git a/src/webview/webview.h b/src/webview/webview.h index 4d687d62d..d4f45f958 100644 --- a/src/webview/webview.h +++ b/src/webview/webview.h @@ -50,7 +50,7 @@ public: QUrl url() const; QString title() const; void reload(); - WebPage* getPage() const; + WebPage* webPage() const; QString getIp() { return m_currentIp; } QLabel* animationLoading(int index, bool addMovie); void addNotification(QWidget* notif);