diff --git a/src/serversdk/databasetable.cpp b/src/serversdk/databasetable.cpp index afc1038..918c04c 100644 --- a/src/serversdk/databasetable.cpp +++ b/src/serversdk/databasetable.cpp @@ -18,6 +18,8 @@ QByteArray DatabaseTable::jsonData() const } + + /** Creates universal variant structure to hold key / value pairs */ QVariantMap DatabaseTable::toVariantMap() const { @@ -41,6 +43,35 @@ QVariantMap DatabaseTable::toVariantMap() const return variantMap; } +bool DatabaseTable::fromVariantMap(const QVariantMap &variantMap) +{ + + const QMetaObject *metaObj = this->metaObject(); + for (int i = metaObj->propertyOffset(); i < metaObj->propertyCount(); ++i) { + QMetaProperty prop = metaObj->property(i); + // Skip non USER so -> ( Q_PROPERTY( ...... USER false ) only + if (!prop.isUser()) + continue; + + // Property name + QString name = prop.name(); + // Get value from variant map + + QVariant value = variantMap.value(name); + prop.write(this, value); + + } + return true; +} + +bool DatabaseTable::fromJson(const QByteArray &data) +{ + QJsonDocument doc = QJsonDocument::fromJson(data); + QVariantMap variant = qvariant_cast(doc.toVariant()); + + return fromVariantMap(variant); +} + diff --git a/src/serversdk/databasetable.h b/src/serversdk/databasetable.h index 5c2f739..96d5dca 100644 --- a/src/serversdk/databasetable.h +++ b/src/serversdk/databasetable.h @@ -28,8 +28,9 @@ class DatabaseTable : public QObject public: explicit DatabaseTable(QObject *parent = nullptr); QByteArray jsonData() const; + bool fromJson(const QByteArray &data); QVariantMap toVariantMap() const; - + bool fromVariantMap(const QVariantMap &variantMap); }; } // namespace serversdk diff --git a/src/serversdk/request.cpp b/src/serversdk/request.cpp index 622d3b1..00112f8 100644 --- a/src/serversdk/request.cpp +++ b/src/serversdk/request.cpp @@ -23,9 +23,10 @@ QNetworkRequest Request::networkRequest() const if ( !userName().isEmpty() && !password().isEmpty() ) request.setRawHeader("Authorization", this->basicAuthorization().toUtf8()); - + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=UTF-8"); if ( !token().isEmpty() ) { request.setRawHeader("Authorization", this->bearerAuthorization().toUtf8()); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=UTF-8"); } // Enabled compression @@ -133,7 +134,6 @@ QString Request::basicAuthorization() const QByteArray data = concatenated.toLocal8Bit().toBase64(); QString headerData = "Basic " + data; return headerData; - //request.setRawHeader("Authorization", headerData.toLocal8Bit()); } QString Request::bearerAuthorization() const diff --git a/src/serversdk/requestmanager.cpp b/src/serversdk/requestmanager.cpp index 9e110e3..3a16445 100644 --- a/src/serversdk/requestmanager.cpp +++ b/src/serversdk/requestmanager.cpp @@ -19,6 +19,8 @@ RequestManager::RequestManager(QObject *parent) connect(&mNetworkAccessManager, &QNetworkAccessManager::authenticationRequired, [](){ qCWarning(sdknetwork) << "server need authentication"; }); + connect(&mNetworkAccessManager, &QNetworkAccessManager::sslErrors, this, &RequestManager::sslErrors); + } /** @@ -52,7 +54,6 @@ void RequestManager::processRequest(const std::shared_ptr& request) // Add to map to get correct request when reply is used in signal mRequestMap.insert(reply, request); - connect(reply, &QNetworkReply::sslErrors, this, &RequestManager::sslErrors); connect(reply, &QNetworkReply::downloadProgress, this, &RequestManager::downloadProgress); connect(reply, &QNetworkReply::finished, this, [=]() { @@ -68,11 +69,15 @@ void RequestManager::processRequest(const std::shared_ptr& request) * @brief Handle sslErrors -> only debug output * @param sslErrors ( from QNetworkReply::sslErrors ) */ -void RequestManager::sslErrors(const QList &sslErrors) +void RequestManager::sslErrors(QNetworkReply *reply, const QList &sslErrors) { for (const QSslError &error : sslErrors) { qCDebug(sdknetwork) << QStringLiteral("SSL error:") << error.errorString(); } + + if (ignoreSsl()) { + reply->ignoreSslErrors(sslErrors); + } } /** @@ -113,4 +118,14 @@ void RequestManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) emit progresss(bytesReceived, bytesTotal); } +bool RequestManager::ignoreSsl() const +{ + return mIgnoreSsl; +} + +void RequestManager::setIgnoreSsl(bool ignoreSsl) +{ + mIgnoreSsl = ignoreSsl; +} + } // core diff --git a/src/serversdk/requestmanager.h b/src/serversdk/requestmanager.h index 429d684..3540af1 100644 --- a/src/serversdk/requestmanager.h +++ b/src/serversdk/requestmanager.h @@ -22,8 +22,11 @@ public: void processRequest(const std::shared_ptr& request); + bool ignoreSsl() const; + void setIgnoreSsl(bool ignoreSsl); + private: - Q_SLOT void sslErrors(const QList &sslErrors); + Q_SLOT void sslErrors(QNetworkReply *reply, const QList &sslErrors); Q_SLOT void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); @@ -34,6 +37,7 @@ signals: private: QNetworkAccessManager mNetworkAccessManager; QMap> mRequestMap; + bool mIgnoreSsl = false; }; } // core diff --git a/test/auto/auto.pro b/test/auto/auto.pro index 2ce442a..a9e3fb7 100644 --- a/test/auto/auto.pro +++ b/test/auto/auto.pro @@ -1,8 +1,9 @@ TEMPLATE = subdirs SUBDIRS += \ - tst_soap \ - tst_request \ + request/tst_soap.pro \ + request/tst_request.pro \ + request/tst_requestmanager.pro \ database/tst_databasemanager.pro \ database/tst_sqlite.pro \ database/tst_databasetable.pro \ diff --git a/test/auto/tst_request/tst_request.cpp b/test/auto/request/tst_request.cpp similarity index 100% rename from test/auto/tst_request/tst_request.cpp rename to test/auto/request/tst_request.cpp diff --git a/test/auto/tst_request/tst_request.pro b/test/auto/request/tst_request.pro similarity index 100% rename from test/auto/tst_request/tst_request.pro rename to test/auto/request/tst_request.pro diff --git a/test/auto/request/tst_requestmanager.cpp b/test/auto/request/tst_requestmanager.cpp new file mode 100644 index 0000000..ab568ff --- /dev/null +++ b/test/auto/request/tst_requestmanager.cpp @@ -0,0 +1,90 @@ +#include + +#include "serversdk/requestmanager.h" +#include "serversdk/databasetable.h" + +#include "serversdk/core.h" + +class LoginTable : public serversdk::DatabaseTable { + Q_OBJECT + TABLE_PROPERTY(QString, username, set_username, ""); + TABLE_PROPERTY(QString, password, set_password, "") +}; + +class Token : public serversdk::DatabaseTable { + Q_OBJECT + TABLE_PROPERTY(QUuid, id, set_id, ""); +}; + + +namespace serversdk { + +class RequestManagerTest : public QObject +{ + Q_OBJECT +private: + Q_SLOT void colnodAuthorization_test(); +}; + +void RequestManagerTest::colnodAuthorization_test() +{ + // Colnod + auto login = std::make_unique(); + login->set_username("spaceti"); + login->set_password("E7FEA07DBC82FB9BA34B2E453E2EFE89F0583E7187543507EF11E84726071FE428445372F2E46B455EB0C79747C51E362F403CE39473A2A8C2DFA0CE5C9826C0"); + + + + serversdk::RequestManager reqMan; + reqMan.setIgnoreSsl(true); + + auto loginRequest = std::make_shared("POST", "https://192.168.1.3:8443/AaaManager/authSession", login->jsonData()); + loginRequest->setUserName(login->username()); + loginRequest->setPassword(login->password()); + QCOMPARE(loginRequest->basicAuthorization(), QStringLiteral("Basic c3BhY2V0aTpFN0ZFQTA3REJDODJGQjlCQTM0QjJFNDUzRTJFRkU4OUYwNTgzRTcxODc1NDM1MDdFRjExRTg0NzI2MDcxRkU0Mjg0NDUzNzJGMkU0NkI0NTVFQjBDNzk3NDdDNTFFMzYyRjQwM0NFMzk0NzNBMkE4QzJERkEwQ0U1Qzk4MjZDMA==")); + + QSignalSpy spyFinished(loginRequest.get(), &serversdk::Request::finished); + reqMan.processRequest(loginRequest); + + QVERIFY(spyFinished.wait()); + QCOMPARE(spyFinished.count(), 1 ); + + + auto data = loginRequest->responseData(); + + + Token token; + token.fromJson(data); + + qDebug() << "token is" << token.id(); + + + + + + + + qDebug() << "repsonse data:" << loginRequest->responseData(); + + + + + + if (loginRequest->networkReply()->error()) { + qDebug() << "error for reply:" << loginRequest->networkReply()->errorString(); + if (!loginRequest->responseData().isEmpty() && !loginRequest->responseData().contains("error")){ + auto jsonDoc = QJsonDocument::fromJson(loginRequest->responseData()); + QString token = jsonDoc.object()["id"].toString(); + } + else { + qDebug() << "Login failed."; + } + } + +} + +} + +QTEST_MAIN(serversdk::RequestManagerTest) + +#include "tst_requestmanager.moc" diff --git a/test/auto/request/tst_requestmanager.pro b/test/auto/request/tst_requestmanager.pro new file mode 100644 index 0000000..2e25959 --- /dev/null +++ b/test/auto/request/tst_requestmanager.pro @@ -0,0 +1,8 @@ +QT += core sql network testlib +CONFIG += testcase # neccesary to have posibility to run: make check UnitTest + +SOURCES += \ + tst_requestmanager.cpp + + +include(../../../serversdkint.pri) diff --git a/test/auto/tst_soap/tst_soap.pro b/test/auto/request/tst_soap.pro similarity index 100% rename from test/auto/tst_soap/tst_soap.pro rename to test/auto/request/tst_soap.pro diff --git a/test/auto/tst_soap/tst_soaptest.cpp b/test/auto/request/tst_soaptest.cpp similarity index 100% rename from test/auto/tst_soap/tst_soaptest.cpp rename to test/auto/request/tst_soaptest.cpp