diff options
author | Jonatan Pålsson <jonatan.palsson@pelagicore.com> | 2014-02-19 16:15:39 +0100 |
---|---|---|
committer | Jonatan Pålsson <jonatan.palsson@pelagicore.com> | 2014-02-19 16:20:17 +0100 |
commit | d7683b0ad757b807dd9617e8aee6614efca95c18 (patch) | |
tree | dab1959db053a8baf0a565ebb533a63559571919 | |
parent | b76617aa6cde293efb2e3ef539855ec6cfcc47ab (diff) | |
download | browser-poc-d7683b0ad757b807dd9617e8aee6614efca95c18.tar.gz |
Implemented onAuthenticationDialog
-rw-r--r-- | browser/browser.cpp | 12 | ||||
-rw-r--r-- | browser/browser.h | 4 | ||||
-rw-r--r-- | browser/browser.pro | 15 | ||||
-rw-r--r-- | browser/browserhelper.cpp | 9 | ||||
-rw-r--r-- | browser/networkmanager.cpp | 51 | ||||
-rw-r--r-- | browser/networkmanager.h | 58 | ||||
-rw-r--r-- | browser/unit-tests/browserdbus/browserdbus.pro | 3 | ||||
-rw-r--r-- | browser/unit-tests/browserdbus/testbrowserdbus.cpp | 7 | ||||
-rw-r--r-- | browser/unit-tests/browserdbus/testbrowserdbus.h | 1 | ||||
-rw-r--r-- | common/browserdbus.cpp | 9 | ||||
-rw-r--r-- | common/browserdbus.h | 3 | ||||
-rw-r--r-- | common/browserdefs.h | 106 | ||||
-rw-r--r-- | demoui/demoui.pro | 3 | ||||
-rw-r--r-- | testapp/testapp.pro | 3 |
14 files changed, 276 insertions, 8 deletions
diff --git a/browser/browser.cpp b/browser/browser.cpp index 96ab0f4..324817b 100644 --- a/browser/browser.cpp +++ b/browser/browser.cpp @@ -18,9 +18,10 @@ #include "browser.h" #include "browserview.h" #include "userinput.h" +#include "networkmanager.h" -browser::browser(cachemanager *manager, userinput *uip, QObject *parent) : - QObject(parent), m_cacheManager (manager), m_userInput (uip) +browser::browser(cachemanager *manager, userinput *uip, networkmanager *nm, QObject *parent) : + QObject(parent), m_cacheManager (manager), m_userInput (uip), m_networkManager(nm) { qDebug() << __PRETTY_FUNCTION__; } @@ -80,6 +81,13 @@ conn::brw::ERROR_IDS browser::createPageWindow(int a_eDeviceId, const conn::brw: exit(1); } + QString *networkmanagerservice = new QString( *webpagewindowservice + "/INetworkManager"); + qDebug() << *networkmanagerservice; + if(!conn.registerObject(*networkmanagerservice, m_networkManager)) { + qDebug() << "failed register object INetworkManager"; + exit(1); + } + emit onPageWindowCreated(a_hPageWindowHandle, conn::brw::EID_NO_ERROR); return conn::brw::EID_NO_ERROR; } diff --git a/browser/browser.h b/browser/browser.h index ec4b707..60d1271 100644 --- a/browser/browser.h +++ b/browser/browser.h @@ -23,12 +23,13 @@ #include "browserview.h" #include "cachemanager.h" #include "userinput.h" +#include "networkmanager.h" class browser : public QObject, protected QDBusContext { Q_OBJECT public: - explicit browser(cachemanager *, userinput *, QObject *parent = 0); + explicit browser(cachemanager *, userinput *, networkmanager *, QObject *parent = 0); webpagewindow *wpw; @@ -53,6 +54,7 @@ private: QHash<QString, BrowserView *> webviewhash; cachemanager *m_cacheManager; userinput *m_userInput; + networkmanager *m_networkManager; }; #endif // BROWSER_H diff --git a/browser/browser.pro b/browser/browser.pro index 7d0a6fc..f6e14b8 100644 --- a/browser/browser.pro +++ b/browser/browser.pro @@ -26,12 +26,17 @@ my_dbus_browser_adaptors.files += ../common/IBrowser.xml my_dbus_browser_adaptors.header_flags = -i browser.h -i ../common/browserdefs.h -l browser my_dbus_browser_adaptors.source_flags = -l browser +my_dbus_networkmanager_adaptors.files += ../common/INetworkManager.xml +my_dbus_networkmanager_adaptors.header_flags = -i networkmanager.h -i ../common/networkmanager.h -l networkmanager +my_dbus_networkmanager_adaptors.source_flags = -l networkmanager + DBUS_ADAPTORS += my_dbus_bookmark_adaptors \ my_dbus_cachemanager_adaptors \ my_dbus_userinput_adaptors \ my_dbus_webpagewindow_adaptors \ my_dbus_browser_adaptors \ - my_dbus_errorlogger_adaptors + my_dbus_errorlogger_adaptors \ + my_dbus_networkmanager_adaptors SOURCES += main.cpp \ bookmarkmanager.cpp \ @@ -44,6 +49,7 @@ SOURCES += main.cpp \ cachemanager.cpp \ errorlogger.cpp \ browserpage.cpp \ + networkmanager.cpp \ ../common/bookmark.cpp \ HEADERS += \ @@ -57,6 +63,7 @@ HEADERS += \ cachemanager.h \ errorlogger.h \ browserpage.h \ + networkmanager.h \ ../common/bookmark.h \ ../common/browserdefs.h \ @@ -72,3 +79,9 @@ system("$$[QT_INSTALL_PREFIX]/bin/qdbusxml2cpp -i errorlogger.h\ -l errorlogger\ -a ierrorlogger_adaptor\ ../common/IErrorLogger.xml") + +system("$$[QT_INSTALL_PREFIX]/bin/qdbusxml2cpp -i networkmanager.h\ + -i ../common/browserdefs.h\ + -l networkmanager\ + -a inetworkmanager_adaptor\ + ../common/INetworkManager.xml") diff --git a/browser/browserhelper.cpp b/browser/browserhelper.cpp index c564181..7878a7c 100644 --- a/browser/browserhelper.cpp +++ b/browser/browserhelper.cpp @@ -20,6 +20,7 @@ #include "ibrowser_adaptor.h" #include "icachemanager_adaptor.h" #include "ierrorlogger_adaptor.h" +#include "inetworkmanager_adaptor.h" browserhelper::browserhelper(QString instanceId, QObject *parent) : @@ -58,7 +59,10 @@ browserhelper::browserhelper(QString instanceId, QObject *parent) : exit(1); } - browser *br = new browser(cm, ui); + networkmanager *nm = new networkmanager(cm->getNetworkAccessManager()); + new INetworkManagerAdaptor(nm); + + browser *br = new browser(cm, ui, nm); new IBrowserAdaptor(br); if(!connection->registerObject("/Browser/IBrowser", br)) { qDebug() << "failed register object IBrowser"; @@ -99,5 +103,8 @@ void browserhelper::registertypes() { qDBusRegisterMetaType<conn::brw::OBJECT_HANDLE>(); qDBusRegisterMetaType<conn::brw::ObjectHandleList>(); qDBusRegisterMetaType<conn::brw::CACHE_POLICY>(); + qDBusRegisterMetaType<conn::brw::AuthenticationData>(); + qDBusRegisterMetaType<conn::brw::SelectableOption>(); + qDBusRegisterMetaType<conn::brw::SelectableOptionList>(); } diff --git a/browser/networkmanager.cpp b/browser/networkmanager.cpp new file mode 100644 index 0000000..10c6712 --- /dev/null +++ b/browser/networkmanager.cpp @@ -0,0 +1,51 @@ +/** + * Copyright (C) 2014, Pelagicore + * + * Author: Jonatan Pålsson <jonatan.palsson@pelagicore.com> + * + * This file is part of the GENIVI project Browser Proof-Of-Concept + * For further information, see http://genivi.org/ + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "networkmanager.h" +#include <QDebug> +#include <QDBusMessage> +#include <QAuthenticator> +#include <QEventLoop> + +networkmanager::networkmanager(QNetworkAccessManager *nam, QObject *parent) : + QObject(parent), m_nam (nam) +{ + qDebug() << __PRETTY_FUNCTION__; + + connect(nam, SIGNAL(authenticationRequired(QNetworkReply *, QAuthenticator *)), + this,SLOT (onAuthenticationRequired(QNetworkReply *, QAuthenticator *))); +} + +conn::brw::ERROR_IDS networkmanager::closeAuthenticationDialog(conn::brw::DIALOG_RESULT res, const conn::brw::AuthenticationData& data) +{ + emit doCloseAuthenticationDialog(res == conn::brw::DR_OK, data); + return conn::brw::EID_NO_ERROR; +} +conn::brw::ERROR_IDS networkmanager::closeSslErrorDialog(conn::brw::DIALOG_RESULT res, bool saveCert) +{ +} + +void networkmanager::onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator) +{ + conn::brw::AuthenticationData data; + emit onAuthenticationDialog(data); + qDebug() << "Authentication required"; + QEventLoop loop; + connect (this, SIGNAL(doCloseAuthenticationDialog(bool, const conn::brw::AuthenticationData)), this, SLOT(authenticate(bool, const conn::brw::AuthenticationData))); + connect (this, SIGNAL(doCloseAuthenticationDialog(bool, const conn::brw::AuthenticationData)), &loop, SLOT(quit())); + loop.exec(); + qDebug() << "Authentication provided"; + + authenticator->setUser(m_authData.strUserName); + authenticator->setPassword(m_authData.strPassword); +} diff --git a/browser/networkmanager.h b/browser/networkmanager.h new file mode 100644 index 0000000..68e51ab --- /dev/null +++ b/browser/networkmanager.h @@ -0,0 +1,58 @@ +/** + * Copyright (C) 2014, Pelagicore + * + * Author: Jonatan Pålsson <jonatan.palsson@pelagicore.com> + * + * This file is part of the GENIVI project Browser Proof-Of-Concept + * For further information, see http://genivi.org/ + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef NETWORKMAMAGER_H +#define NETWORKMAMAGER_H + +#include <QObject> +#include <QDBusContext> +#include <QDebug> +#include <QNetworkAccessManager> +#include <QAuthenticator> + +#include "../common/browserdefs.h" + +class networkmanager : public QObject, protected QDBusContext +{ + Q_OBJECT +public: + explicit networkmanager(QNetworkAccessManager *nam, QObject *parent = 0); + + +signals: + void onAuthenticationDialog(const conn::brw::AuthenticationData &); + void onAuthenticationDialogCancel(conn::brw::AuthenticationData &); + void onSslErrorDialog(conn::brw::AuthenticationData &); + void onSslErrorDialogCancel(const conn::brw::SslError &); + + // Internal + void doCloseAuthenticationDialog(bool, const conn::brw::AuthenticationData); + +public Q_SLOTS: + conn::brw::ERROR_IDS closeAuthenticationDialog(conn::brw::DIALOG_RESULT, const conn::brw::AuthenticationData&); + conn::brw::ERROR_IDS closeSslErrorDialog(conn::brw::DIALOG_RESULT, bool); + + // Internal + void onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator); + void authenticate(bool b, const conn::brw::AuthenticationData ad) + { + m_authBool = b; + m_authData = ad; + } +private: + QNetworkAccessManager *m_nam; + bool m_authBool; + conn::brw::AuthenticationData m_authData; +}; + +#endif // NETWORKMAMAGER_H diff --git a/browser/unit-tests/browserdbus/browserdbus.pro b/browser/unit-tests/browserdbus/browserdbus.pro index dd1bd0e..1333b71 100644 --- a/browser/unit-tests/browserdbus/browserdbus.pro +++ b/browser/unit-tests/browserdbus/browserdbus.pro @@ -11,7 +11,8 @@ QT += dbus webkitwidgets my_dbus_interfaces.files += ../../../common/IBookmarkManager.xml \ ../../../common/IUserInput.xml \ ../../../common/IWebPageWindow.xml \ - ../../../common/IBrowser.xml + ../../../common/IBrowser.xml \ + ../../../common/INetworkManager.xml my_dbus_interfaces.header_flags = -i ../../../common/browserdefs.h DBUS_INTERFACES += my_dbus_interfaces diff --git a/browser/unit-tests/browserdbus/testbrowserdbus.cpp b/browser/unit-tests/browserdbus/testbrowserdbus.cpp index 76b4c1f..afda8aa 100644 --- a/browser/unit-tests/browserdbus/testbrowserdbus.cpp +++ b/browser/unit-tests/browserdbus/testbrowserdbus.cpp @@ -331,4 +331,11 @@ void TestBrowserDBus::testGetsNotifiedWhenSelectIsSelected() { QProcess::execute("xdotool click 1"); QVERIFY(spy.wait(1000)); } + +void TestBrowserDBus::testGetsNotifiedOnAuthDialog() { + QSignalSpy spy (m_bdb, SIGNAL(onAuthenticationDialog(const conn::brw::AuthenticationData&))); + m_bdb->createPageWindow(1,0,0,800,600); + m_bdb->loadurl("http://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx"); + QVERIFY(spy.wait(5000)); +} QTEST_MAIN (TestBrowserDBus); diff --git a/browser/unit-tests/browserdbus/testbrowserdbus.h b/browser/unit-tests/browserdbus/testbrowserdbus.h index faaceeb..5dc4edc 100644 --- a/browser/unit-tests/browserdbus/testbrowserdbus.h +++ b/browser/unit-tests/browserdbus/testbrowserdbus.h @@ -49,6 +49,7 @@ private slots: void testAlertDialog(); void testGetPrevEnteredValues(); void testGetsNotifiedWhenSelectIsSelected(); + void testGetsNotifiedOnAuthDialog(); private: QString testFileUrl() { diff --git a/common/browserdbus.cpp b/common/browserdbus.cpp index 330fd67..45f11dd 100644 --- a/common/browserdbus.cpp +++ b/common/browserdbus.cpp @@ -41,6 +41,7 @@ void BrowserDbus::registertypes() { qDBusRegisterMetaType<conn::brw::BrowserActions>(); qDBusRegisterMetaType<conn::brw::OBJECT_HANDLE>(); qDBusRegisterMetaType<conn::brw::ObjectHandleList>(); + qDBusRegisterMetaType<conn::brw::AuthenticationData>(); } void BrowserDbus::connectdbussession(QString id) { @@ -223,6 +224,14 @@ void BrowserDbus::createPageWindow(int deviceid, int x, int y, int width, int he qDebug() << "failed create object /Browser/IWebPageWindow*/IUserInput"; connect(actualuserinput, SIGNAL(onInputText(QString,QString,conn::brw::INPUT_ELEMENT_TYPE,int,int,int,int)), this, SLOT(InputTextReceived(QString,QString,conn::brw::INPUT_ELEMENT_TYPE,int,int,int,int))); + + QString *networkmanagerservice = new QString(*webpagewindowservice + "/INetworkManager"); + + networkmanager = new conn::brw::INetworkManager(*dbusservicename, *networkmanagerservice, + QDBusConnection::sessionBus(), this); + + connect(networkmanager, SIGNAL(onAuthenticationDialog(const conn::brw::AuthenticationData&)), + this, SIGNAL(onAuthenticationDialog(const conn::brw::AuthenticationData&))); } else { QDBusError error = reply.error(); qDebug() << "ERROR " << error.name() << error.message(); diff --git a/common/browserdbus.h b/common/browserdbus.h index 65d7a04..155981d 100644 --- a/common/browserdbus.h +++ b/common/browserdbus.h @@ -21,6 +21,7 @@ #include "iuserinput_interface.h" #include "iwebpagewindow_interface.h" #include "ibrowser_interface.h" +#include "inetworkmanager_interface.h" #include "../common/bookmark.h" class BrowserDbus : public QObject @@ -111,6 +112,7 @@ signals: void onAlertDialog(QString); void onDialogCanceled(void); void onSelect(const QString &, const conn::brw::SelectableOptionList &, bool); + void onAuthenticationDialog(const conn::brw::AuthenticationData&); public slots: void pageloadingstarted(); @@ -127,6 +129,7 @@ private: conn::brw::IWebPageWindow *webpagewindow; conn::brw::IWebPageWindow *actualtab; conn::brw::IUserInput *actualuserinput; + conn::brw::INetworkManager *networkmanager; QList<conn::brw::OBJECT_HANDLE> handlelist; conn::brw::IBrowser *browser; QString m_title; diff --git a/common/browserdefs.h b/common/browserdefs.h index d2ce3c1..6f60c8f 100644 --- a/common/browserdefs.h +++ b/common/browserdefs.h @@ -656,6 +656,110 @@ namespace conn { return args; //#] } + + /*! + * Authentication data used for Server and Proxy authentication. + */ + //## type AuthenticationData + struct AuthenticationData + { + /*! + * Host name or Url for which the password is valid. In case of proxy authentication the customer receives "host:port" url, in case of the content authentication the url contans the resource URI. + */ + QString strHost; //## attribute strHost + /*! + * User name + */ + QString strUserName; //## attribute strUserName + /*! + * User password + */ + QString strPassword; //## attribute strPassword + /*! + * Defines to store password into database. + */ + bool bSave; //## attribute bSave + + AuthenticationData() + :strHost("") + ,strUserName("") + ,strPassword("") + ,bSave(true) + {} + }; + inline const QDBusArgument& operator>>(const QDBusArgument& args, AuthenticationData& ad) { + args.beginStructure(); + args >> ad.strHost + >> ad.strUserName + >> ad.strPassword + >> ad.bSave; + args.endStructure(); + return args; + } + + inline QDBusArgument& operator<<(QDBusArgument& args, const AuthenticationData& ad) { + args.beginStructure(); + args << ad.strHost + << ad.strUserName + << ad.strPassword + << ad.bSave; + args.endStructure(); + return args; + } + + /*! + * SslErrors + */ + //## type SSL_ERROR + enum SSL_ERROR { + NoError, + UnableToGetIssuerCertificate, + UnableToDecryptCertificateSignature, + UnableToDecodeIssuerPublicKey, + CertificateSignatureFailed, + CertificateNotYetValid, + CertificateExpired, + InvalidNotBeforeField, + InvalidNotAfterField, + SelfSignedCertificate, + SelfSignedCertificateInChain, + UnableToGetLocalIssuerCertificate, + UnableToVerifyFirstCertificate, + CertificateRevoked, + InvalidCaCertificate, + PathLengthExceeded, + InvalidPurpose, + CertificateUntrusted, + CertificateRejected, + SubjectIssuerMismatch, + hostnamemismatch, + AuthorityIssuerSerialNumberMismatch, + NoPeerCertificate, + HostNameMismatch, + NoSslSupport, + CertificateBlacklisted, + UnspecifiedError = -1 + }; + + /*! + * The SslError structure describes the error information happens during ssl connection. + */ + //## type SslError + struct SslError { + /*! + * Error code. It could be HTTP error codes, or internal codes. + */ + SSL_ERROR sslError; //## attribute sslError + /*! + * Url + */ + QString strUrl; //## attribute strUrl + /*! + * Short text description of the error. + */ + QString strErrorMessage; //## attribute strErrorMessage + }; + } } @@ -678,5 +782,7 @@ Q_DECLARE_METATYPE(conn::brw::CACHE_POLICY); Q_DECLARE_METATYPE(conn::brw::ErrorItemList); 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); #endif // BROWSERDEFS_H diff --git a/demoui/demoui.pro b/demoui/demoui.pro index 56f67a2..d9640ca 100644 --- a/demoui/demoui.pro +++ b/demoui/demoui.pro @@ -9,7 +9,8 @@ QML_IMPORT_PATH = my_dbus_interfaces.files += ../common/IBookmarkManager.xml \ ../common/IUserInput.xml \ ../common/IWebPageWindow.xml \ - ../common/IBrowser.xml + ../common/IBrowser.xml \ + ../common/INetworkManager.xml my_dbus_interfaces.header_flags = -i ../common/browserdefs.h DBUS_INTERFACES += my_dbus_interfaces diff --git a/testapp/testapp.pro b/testapp/testapp.pro index 7966569..da84a8b 100644 --- a/testapp/testapp.pro +++ b/testapp/testapp.pro @@ -16,7 +16,8 @@ TEMPLATE = app my_dbus_interfaces.files += ../common/IBookmarkManager.xml \ ../common/IUserInput.xml \ ../common/IWebPageWindow.xml \ - ../common/IBrowser.xml + ../common/IBrowser.xml \ + ../common/INetworkManager.xml my_dbus_interfaces.header_flags = -i ../common/browserdefs.h my_dbus_interfaces.files += ../common/ICacheManager.xml |