From 3d93fb9e19e3c9a8b66a0d426fea3244c61effa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonatan=20P=C3=A5lsson?= Date: Wed, 19 Feb 2014 18:16:00 +0100 Subject: Preliminary support for SSL error dialog (only one error displayed currently) --- browser/browserhelper.cpp | 1 + browser/networkmanager.cpp | 25 ++++++++++++++++ browser/networkmanager.h | 11 +++++-- browser/unit-tests/browserdbus/testbrowserdbus.cpp | 17 +++++++++++ browser/unit-tests/browserdbus/testbrowserdbus.h | 2 ++ common/browserdbus.cpp | 19 ++++++++++++ common/browserdbus.h | 2 ++ common/browserdefs.h | 35 ++++++++++++++++++++++ 8 files changed, 110 insertions(+), 2 deletions(-) diff --git a/browser/browserhelper.cpp b/browser/browserhelper.cpp index 7878a7c..008ea24 100644 --- a/browser/browserhelper.cpp +++ b/browser/browserhelper.cpp @@ -106,5 +106,6 @@ void browserhelper::registertypes() { qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); + qDBusRegisterMetaType(); } diff --git a/browser/networkmanager.cpp b/browser/networkmanager.cpp index 57c853b..dbe14ca 100644 --- a/browser/networkmanager.cpp +++ b/browser/networkmanager.cpp @@ -16,6 +16,7 @@ #include #include #include +#include networkmanager::networkmanager(QNetworkAccessManager *nam, QObject *parent) : QObject(parent), m_nam (nam) @@ -24,6 +25,8 @@ networkmanager::networkmanager(QNetworkAccessManager *nam, QObject *parent) : connect(nam, SIGNAL(authenticationRequired(QNetworkReply *, QAuthenticator *)), this,SLOT (onAuthenticationRequired(QNetworkReply *, QAuthenticator *))); + connect(nam, SIGNAL(sslErrors(QNetworkReply *, const QList &)), + this,SLOT (onSslErrors(QNetworkReply *, const QList &))); } conn::brw::ERROR_IDS networkmanager::closeAuthenticationDialog(conn::brw::DIALOG_RESULT res, const conn::brw::AuthenticationData& data) @@ -33,6 +36,8 @@ conn::brw::ERROR_IDS networkmanager::closeAuthenticationDialog(conn::brw::DIALOG } conn::brw::ERROR_IDS networkmanager::closeSslErrorDialog(conn::brw::DIALOG_RESULT res, bool saveCert) { + emit doCloseSslErrorDialog(res == conn::brw::DR_OK, saveCert); + return conn::brw::EID_NO_ERROR; } void networkmanager::onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) @@ -53,3 +58,23 @@ void networkmanager::onAuthenticationRequired(QNetworkReply *reply, QAuthenticat qDebug() << "Action was cancelled"; } } + +void networkmanager::onSslErrors(QNetworkReply *reply, const QList & errors) +{ + conn::brw::SslError data; + data.sslError = conn::brw::UnableToGetIssuerCertificate; + emit onSslErrorDialog(data); + qDebug() << "SSL error; action required"; + QEventLoop loop; + connect (this, SIGNAL(doCloseSslErrorDialog(bool, bool)), this, SLOT(closeSsl(bool, bool))); + connect (this, SIGNAL(doCloseSslErrorDialog(bool, bool)), &loop, SLOT(quit())); + loop.exec(); + qDebug() << "SSL error action provided: isOK" << m_isSslOk << "save cert:" << m_sslSaveCert; + + if (m_isSslOk) { + reply->ignoreSslErrors(); + qDebug() << "Ignoring error"; + } else { + qDebug() << "Halting on error"; + } +} diff --git a/browser/networkmanager.h b/browser/networkmanager.h index 68e51ab..b5e9dcd 100644 --- a/browser/networkmanager.h +++ b/browser/networkmanager.h @@ -32,11 +32,12 @@ public: signals: void onAuthenticationDialog(const conn::brw::AuthenticationData &); void onAuthenticationDialogCancel(conn::brw::AuthenticationData &); - void onSslErrorDialog(conn::brw::AuthenticationData &); + void onSslErrorDialog(const conn::brw::SslError &); void onSslErrorDialogCancel(const conn::brw::SslError &); // Internal void doCloseAuthenticationDialog(bool, const conn::brw::AuthenticationData); + void doCloseSslErrorDialog(bool, bool); public Q_SLOTS: conn::brw::ERROR_IDS closeAuthenticationDialog(conn::brw::DIALOG_RESULT, const conn::brw::AuthenticationData&); @@ -44,14 +45,20 @@ public Q_SLOTS: // Internal void onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator); + void onSslErrors(QNetworkReply *reply, const QList & errors); void authenticate(bool b, const conn::brw::AuthenticationData ad) { m_authBool = b; m_authData = ad; } + void closeSsl(bool isOK, bool saveCert) + { + m_isSslOk = isOK; + m_sslSaveCert = saveCert; + } private: QNetworkAccessManager *m_nam; - bool m_authBool; + bool m_authBool, m_isSslOk, m_sslSaveCert; conn::brw::AuthenticationData m_authData; }; diff --git a/browser/unit-tests/browserdbus/testbrowserdbus.cpp b/browser/unit-tests/browserdbus/testbrowserdbus.cpp index 0380755..355589d 100644 --- a/browser/unit-tests/browserdbus/testbrowserdbus.cpp +++ b/browser/unit-tests/browserdbus/testbrowserdbus.cpp @@ -351,4 +351,21 @@ void TestBrowserDBus::testCanCloseAuthDialog() { qDebug() << ": user" << d.strUserName << "password:" << d.strPassword; m_bdb->closeAuthenticationDialog(conn::brw::DR_OK, d); } + +void TestBrowserDBus::testGetsNotifiedOnBadSSL() { + QSignalSpy spy (m_bdb, SIGNAL(onSslErrorDialog(const conn::brw::SslError&))); + m_bdb->createPageWindow(1,0,0,800,600); + m_bdb->loadurl("https://tv.eurosport.com/"); + QVERIFY(spy.wait(1000)); +} + +void TestBrowserDBus::testCanCloseSslDialog() { + QSignalSpy spy (m_bdb, SIGNAL(onSslErrorDialog(const conn::brw::SslError&))); + m_bdb->createPageWindow(1,0,0,800,600); + m_bdb->loadurl("https://tv.eurosport.com/"); + QVERIFY(spy.wait(1000)); + + m_bdb->closeSslErrorDialog(conn::brw::DR_OK, true); +} + QTEST_MAIN (TestBrowserDBus); diff --git a/browser/unit-tests/browserdbus/testbrowserdbus.h b/browser/unit-tests/browserdbus/testbrowserdbus.h index 0721653..9f9fb84 100644 --- a/browser/unit-tests/browserdbus/testbrowserdbus.h +++ b/browser/unit-tests/browserdbus/testbrowserdbus.h @@ -51,6 +51,8 @@ private slots: void testGetsNotifiedWhenSelectIsSelected(); void testGetsNotifiedOnAuthDialog(); void testCanCloseAuthDialog(); + void testGetsNotifiedOnBadSSL(); + void testCanCloseSslDialog(); private: QString testFileUrl() { diff --git a/common/browserdbus.cpp b/common/browserdbus.cpp index 1cdca89..aaed169 100644 --- a/common/browserdbus.cpp +++ b/common/browserdbus.cpp @@ -42,6 +42,8 @@ void BrowserDbus::registertypes() { qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); } void BrowserDbus::connectdbussession(QString id) { @@ -232,6 +234,8 @@ void BrowserDbus::createPageWindow(int deviceid, int x, int y, int width, int he connect(networkmanager, SIGNAL(onAuthenticationDialog(const conn::brw::AuthenticationData&)), this, SIGNAL(onAuthenticationDialog(const conn::brw::AuthenticationData&))); + connect(networkmanager, SIGNAL(onSslErrorDialog(const conn::brw::SslError&)), + this, SIGNAL(onSslErrorDialog(const conn::brw::SslError&))); } else { QDBusError error = reply.error(); qDebug() << "ERROR " << error.name() << error.message(); @@ -760,3 +764,18 @@ void BrowserDbus::closeAuthenticationDialog(conn::brw::DIALOG_RESULT r, const co qDebug() << "ERROR " << error.name() << error.message(); } } + +void BrowserDbus::closeSslErrorDialog(conn::brw::DIALOG_RESULT r, bool b) +{ + qDebug() << __PRETTY_FUNCTION__; + QStringList list; + + QDBusReply reply = networkmanager->closeSslErrorDialog(r,b); + if(reply.isValid()) { + conn::brw::ERROR_IDS ret = reply.value(); + qDebug() << "ERROR_IDS " << ret; + } else { + QDBusError error = reply.error(); + qDebug() << "ERROR " << error.name() << error.message(); + } +} diff --git a/common/browserdbus.h b/common/browserdbus.h index dc50157..1568a2e 100644 --- a/common/browserdbus.h +++ b/common/browserdbus.h @@ -78,6 +78,7 @@ public: Q_INVOKABLE void closePromptDialog(QString, conn::brw::DIALOG_RESULT); Q_INVOKABLE QStringList getPrevEnteredValues(QString name, QString value, conn::brw::INPUT_ELEMENT_TYPE type); Q_INVOKABLE void closeAuthenticationDialog(conn::brw::DIALOG_RESULT, const conn::brw::AuthenticationData&); + Q_INVOKABLE void closeSslErrorDialog(conn::brw::DIALOG_RESULT, bool); QString title() { return m_title; } @@ -114,6 +115,7 @@ signals: void onDialogCanceled(void); void onSelect(const QString &, const conn::brw::SelectableOptionList &, bool); void onAuthenticationDialog(const conn::brw::AuthenticationData&); + void onSslErrorDialog(const conn::brw::SslError&); public slots: void pageloadingstarted(); diff --git a/common/browserdefs.h b/common/browserdefs.h index 6f60c8f..167233e 100644 --- a/common/browserdefs.h +++ b/common/browserdefs.h @@ -15,6 +15,7 @@ #define BROWSERDEFS_H #include +#include namespace conn { namespace brw { @@ -741,6 +742,23 @@ namespace conn { UnspecifiedError = -1 }; + inline const QDBusArgument& operator>>(const QDBusArgument& args, SSL_ERROR& e) { + args.beginStructure(); + int temp =0; + args>>temp; + e = (SSL_ERROR)temp; + args.endStructure(); + return args; + } + + inline QDBusArgument& operator<<(QDBusArgument& args, const SSL_ERROR &e) { + args.beginStructure(); + int param = e; + args << param; + args.endStructure(); + return args; + } + /*! * The SslError structure describes the error information happens during ssl connection. */ @@ -759,7 +777,23 @@ namespace conn { */ QString strErrorMessage; //## attribute strErrorMessage }; + inline const QDBusArgument& operator>>(const QDBusArgument& args, SslError& s) { + args.beginStructure(); + args >> s.sslError + >> s.strUrl + >> s.strErrorMessage; + args.endStructure(); + return args; + } + inline QDBusArgument& operator<<(QDBusArgument& args, const SslError& s) { + args.beginStructure(); + args << s.sslError + << s.strUrl + << s.strErrorMessage; + args.endStructure(); + return args; + } } } @@ -784,5 +818,6 @@ Q_DECLARE_METATYPE(conn::brw::ErrorItem); Q_DECLARE_METATYPE(conn::brw::ERROR_SORT_TYPE); Q_DECLARE_METATYPE(conn::brw::AuthenticationData); Q_DECLARE_METATYPE(conn::brw::SslError); +Q_DECLARE_METATYPE(conn::brw::SSL_ERROR); #endif // BROWSERDEFS_H -- cgit v1.2.1