summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonatan Pålsson <jonatan.palsson@pelagicore.com>2014-02-19 18:16:00 +0100
committerJonatan Pålsson <jonatan.palsson@pelagicore.com>2014-02-19 18:16:00 +0100
commit3d93fb9e19e3c9a8b66a0d426fea3244c61effa3 (patch)
tree429d1770335958c909a72ae01ed87407722d5114
parenta2f6848c0b94ae205620583f170ab18d6a89fc4b (diff)
downloadbrowser-poc-3d93fb9e19e3c9a8b66a0d426fea3244c61effa3.tar.gz
Preliminary support for SSL error dialog (only one error displayed currently)
-rw-r--r--browser/browserhelper.cpp1
-rw-r--r--browser/networkmanager.cpp25
-rw-r--r--browser/networkmanager.h11
-rw-r--r--browser/unit-tests/browserdbus/testbrowserdbus.cpp17
-rw-r--r--browser/unit-tests/browserdbus/testbrowserdbus.h2
-rw-r--r--common/browserdbus.cpp19
-rw-r--r--common/browserdbus.h2
-rw-r--r--common/browserdefs.h35
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<conn::brw::AuthenticationData>();
qDBusRegisterMetaType<conn::brw::SelectableOption>();
qDBusRegisterMetaType<conn::brw::SelectableOptionList>();
+ qDBusRegisterMetaType<conn::brw::SslError>();
}
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 <QDBusMessage>
#include <QAuthenticator>
#include <QEventLoop>
+#include <QNetworkReply>
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<QSslError> &)),
+ this,SLOT (onSslErrors(QNetworkReply *, const QList<QSslError> &)));
}
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<QSslError> & 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<QSslError> & 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<conn::brw::OBJECT_HANDLE>();
qDBusRegisterMetaType<conn::brw::ObjectHandleList>();
qDBusRegisterMetaType<conn::brw::AuthenticationData>();
+ qDBusRegisterMetaType<conn::brw::SSL_ERROR>();
+ qDBusRegisterMetaType<conn::brw::SslError>();
}
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<conn::brw::ERROR_IDS> 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 <QDBusArgument>
+#include <QDebug>
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