mirror of
https://gitlab.com/spaceti-app/integrations/common/server-sdk.git
synced 2026-07-12 19:00:44 +02:00
DatabaseTable can read and write data to JSON + manager can ignore ssl errors
This commit is contained in:
parent
a80552654b
commit
30925777b4
@ -18,6 +18,8 @@ QByteArray DatabaseTable::jsonData() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Creates universal variant structure to hold key / value pairs */
|
/** Creates universal variant structure to hold key / value pairs */
|
||||||
QVariantMap DatabaseTable::toVariantMap() const
|
QVariantMap DatabaseTable::toVariantMap() const
|
||||||
{
|
{
|
||||||
@ -41,6 +43,35 @@ QVariantMap DatabaseTable::toVariantMap() const
|
|||||||
return variantMap;
|
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<QVariantMap>(doc.toVariant());
|
||||||
|
|
||||||
|
return fromVariantMap(variant);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -28,8 +28,9 @@ class DatabaseTable : public QObject
|
|||||||
public:
|
public:
|
||||||
explicit DatabaseTable(QObject *parent = nullptr);
|
explicit DatabaseTable(QObject *parent = nullptr);
|
||||||
QByteArray jsonData() const;
|
QByteArray jsonData() const;
|
||||||
|
bool fromJson(const QByteArray &data);
|
||||||
QVariantMap toVariantMap() const;
|
QVariantMap toVariantMap() const;
|
||||||
|
bool fromVariantMap(const QVariantMap &variantMap);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace serversdk
|
} // namespace serversdk
|
||||||
|
|||||||
@ -23,9 +23,10 @@ QNetworkRequest Request::networkRequest() const
|
|||||||
|
|
||||||
if ( !userName().isEmpty() && !password().isEmpty() )
|
if ( !userName().isEmpty() && !password().isEmpty() )
|
||||||
request.setRawHeader("Authorization", this->basicAuthorization().toUtf8());
|
request.setRawHeader("Authorization", this->basicAuthorization().toUtf8());
|
||||||
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=UTF-8");
|
||||||
if ( !token().isEmpty() ) {
|
if ( !token().isEmpty() ) {
|
||||||
request.setRawHeader("Authorization", this->bearerAuthorization().toUtf8());
|
request.setRawHeader("Authorization", this->bearerAuthorization().toUtf8());
|
||||||
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=UTF-8");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enabled compression
|
// Enabled compression
|
||||||
@ -133,7 +134,6 @@ QString Request::basicAuthorization() const
|
|||||||
QByteArray data = concatenated.toLocal8Bit().toBase64();
|
QByteArray data = concatenated.toLocal8Bit().toBase64();
|
||||||
QString headerData = "Basic " + data;
|
QString headerData = "Basic " + data;
|
||||||
return headerData;
|
return headerData;
|
||||||
//request.setRawHeader("Authorization", headerData.toLocal8Bit());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Request::bearerAuthorization() const
|
QString Request::bearerAuthorization() const
|
||||||
|
|||||||
@ -19,6 +19,8 @@ RequestManager::RequestManager(QObject *parent)
|
|||||||
connect(&mNetworkAccessManager, &QNetworkAccessManager::authenticationRequired, [](){
|
connect(&mNetworkAccessManager, &QNetworkAccessManager::authenticationRequired, [](){
|
||||||
qCWarning(sdknetwork) << "server need authentication";
|
qCWarning(sdknetwork) << "server need authentication";
|
||||||
});
|
});
|
||||||
|
connect(&mNetworkAccessManager, &QNetworkAccessManager::sslErrors, this, &RequestManager::sslErrors);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,7 +54,6 @@ void RequestManager::processRequest(const std::shared_ptr<Request>& request)
|
|||||||
// Add to map to get correct request when reply is used in signal
|
// Add to map to get correct request when reply is used in signal
|
||||||
mRequestMap.insert(reply, request);
|
mRequestMap.insert(reply, request);
|
||||||
|
|
||||||
connect(reply, &QNetworkReply::sslErrors, this, &RequestManager::sslErrors);
|
|
||||||
connect(reply, &QNetworkReply::downloadProgress, this, &RequestManager::downloadProgress);
|
connect(reply, &QNetworkReply::downloadProgress, this, &RequestManager::downloadProgress);
|
||||||
|
|
||||||
connect(reply, &QNetworkReply::finished, this, [=]() {
|
connect(reply, &QNetworkReply::finished, this, [=]() {
|
||||||
@ -68,11 +69,15 @@ void RequestManager::processRequest(const std::shared_ptr<Request>& request)
|
|||||||
* @brief Handle sslErrors -> only debug output
|
* @brief Handle sslErrors -> only debug output
|
||||||
* @param sslErrors ( from QNetworkReply::sslErrors )
|
* @param sslErrors ( from QNetworkReply::sslErrors )
|
||||||
*/
|
*/
|
||||||
void RequestManager::sslErrors(const QList<QSslError> &sslErrors)
|
void RequestManager::sslErrors(QNetworkReply *reply, const QList<QSslError> &sslErrors)
|
||||||
{
|
{
|
||||||
for (const QSslError &error : sslErrors) {
|
for (const QSslError &error : sslErrors) {
|
||||||
qCDebug(sdknetwork) << QStringLiteral("SSL error:") << error.errorString();
|
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);
|
emit progresss(bytesReceived, bytesTotal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RequestManager::ignoreSsl() const
|
||||||
|
{
|
||||||
|
return mIgnoreSsl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RequestManager::setIgnoreSsl(bool ignoreSsl)
|
||||||
|
{
|
||||||
|
mIgnoreSsl = ignoreSsl;
|
||||||
|
}
|
||||||
|
|
||||||
} // core
|
} // core
|
||||||
|
|||||||
@ -22,8 +22,11 @@ public:
|
|||||||
void processRequest(const std::shared_ptr<Request>& request);
|
void processRequest(const std::shared_ptr<Request>& request);
|
||||||
|
|
||||||
|
|
||||||
|
bool ignoreSsl() const;
|
||||||
|
void setIgnoreSsl(bool ignoreSsl);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Q_SLOT void sslErrors(const QList<QSslError> &sslErrors);
|
Q_SLOT void sslErrors(QNetworkReply *reply, const QList<QSslError> &sslErrors);
|
||||||
Q_SLOT void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
Q_SLOT void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
||||||
|
|
||||||
|
|
||||||
@ -34,6 +37,7 @@ signals:
|
|||||||
private:
|
private:
|
||||||
QNetworkAccessManager mNetworkAccessManager;
|
QNetworkAccessManager mNetworkAccessManager;
|
||||||
QMap<QNetworkReply*, std::shared_ptr<Request>> mRequestMap;
|
QMap<QNetworkReply*, std::shared_ptr<Request>> mRequestMap;
|
||||||
|
bool mIgnoreSsl = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // core
|
} // core
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
SUBDIRS += \
|
SUBDIRS += \
|
||||||
tst_soap \
|
request/tst_soap.pro \
|
||||||
tst_request \
|
request/tst_request.pro \
|
||||||
|
request/tst_requestmanager.pro \
|
||||||
database/tst_databasemanager.pro \
|
database/tst_databasemanager.pro \
|
||||||
database/tst_sqlite.pro \
|
database/tst_sqlite.pro \
|
||||||
database/tst_databasetable.pro \
|
database/tst_databasetable.pro \
|
||||||
|
|||||||
90
test/auto/request/tst_requestmanager.cpp
Normal file
90
test/auto/request/tst_requestmanager.cpp
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#include <QtTest>
|
||||||
|
|
||||||
|
#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<LoginTable>();
|
||||||
|
login->set_username("spaceti");
|
||||||
|
login->set_password("E7FEA07DBC82FB9BA34B2E453E2EFE89F0583E7187543507EF11E84726071FE428445372F2E46B455EB0C79747C51E362F403CE39473A2A8C2DFA0CE5C9826C0");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
serversdk::RequestManager reqMan;
|
||||||
|
reqMan.setIgnoreSsl(true);
|
||||||
|
|
||||||
|
auto loginRequest = std::make_shared<serversdk::Request>("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"
|
||||||
8
test/auto/request/tst_requestmanager.pro
Normal file
8
test/auto/request/tst_requestmanager.pro
Normal file
@ -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)
|
||||||
Loading…
x
Reference in New Issue
Block a user