From 811345c301f2d03375eabf9fa46a20bc5b061cc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 7 Nov 2019 09:54:22 +0100 Subject: [PATCH 1/5] fix memory leaks --- test/unitTests/UnitTest.cpp | 222 +++++++++++++----------------------- 1 file changed, 79 insertions(+), 143 deletions(-) diff --git a/test/unitTests/UnitTest.cpp b/test/unitTests/UnitTest.cpp index 0093e95..9212b2b 100644 --- a/test/unitTests/UnitTest.cpp +++ b/test/unitTests/UnitTest.cpp @@ -7,14 +7,14 @@ void UnitTest::initTestCase() void UnitTest::loginSuccessfully() { - auto testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(successLogin())); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); QVERIFY(spy.isValid()); - testAccess->login(); + testAccess.login(); spy.wait(timeout); QCOMPARE(spy.count(), 1); - QString json = testAccess->jsonResponse; + QString json = testAccess.jsonResponse; qDebug() << json; QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QVERIFY2(doc.object().value("id").isString(), "No parameter 'id' in response"); @@ -23,14 +23,12 @@ void UnitTest::loginSuccessfully() //POST request w/o datas void UnitTest::getSubjects() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); QVERIFY(spy.isValid()); - Response* response = testAccess->getSubjects(); + Response* response = testAccess.getSubjects(); QSignalSpy spy1(response, &Response::ready); - spy.wait(timeout); - QCOMPARE(spy.count(), 1); QCOMPARE(spy1.count(), 1); QString json = response->getJson(); @@ -39,13 +37,13 @@ void UnitTest::getSubjects() QVERIFY2(doc.object().value("items").isArray(), "No parameter 'id' in response"); qDebug() << doc.object().value("items").toArray()[0].toObject()["id"].toString(); QVERIFY2(doc.object().value("items").toArray()[0].toObject()["id"].isString(), "ada"); - + response->deleteLater(); } void UnitTest::getTokens() { - auto* testAccess = new RequestManager(); - Response* response = testAccess->getTokens(); + RequestManager testAccess; + Response* response = testAccess.getTokens(); QSignalSpy spy(response, &Response::ready); QCOMPARE(spy.count(), 0); spy.wait(timeout); @@ -57,149 +55,161 @@ void UnitTest::getTokens() QVERIFY2(doc.object().value("items").isArray(), "No parameter 'id' in response"); qDebug() << doc.object().value("items").toArray()[0].toObject()["id"].toString(); QVERIFY2(doc.object().value("items").toArray()[0].toObject()["id"].isString(), "ada"); + response->deleteLater(); } void UnitTest::getTokenSubject() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getTokenSubject(); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getTokenSubject(); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getSubjectsUpdated() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getSubjectsUpdated(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getSubjectsUpdated(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getSubjectsDeleted() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getSubjectsDeleted(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getSubjectsDeleted(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getTokensUpdated() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getTokensUpdated(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getTokensUpdated(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getTokensDeleted() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getTokensDeleted(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getTokensDeleted(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getAccessGroups() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getAccessGroups(); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getAccessGroups(); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getAccessGroupsUpdated() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getAccessGroupsUpdated(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getAccessGroupsUpdated(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getAccessGroupsDeleted() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getAccessGroupsDeleted(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getAccessGroupsDeleted(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getAccessGroupMembership() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getAccessGroupMembership(); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getAccessGroupMembership(); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getAccessGroupMembershipUpdated() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getAccessGroupMembershipUpdated(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getAccessGroupMembershipUpdated(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::getAccessGroupMembershipDeleted() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getAccessGroupMembershipDeleted(epochMS); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getAccessGroupMembershipDeleted(epochMS); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::setTokens() @@ -208,139 +218,65 @@ void UnitTest::setTokens() QHash> tokens; auto token = getTestToken(); tokens.insert(token->idToStringWithoutBraces(), token); - auto testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->setTokens(tokens); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.setTokens(tokens); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::deleteTokens() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); QList ids; ids.append("582c982d-6fd7-4856-8548-7ce542791c7a"); ids.append("3ff23b41-3da3-4b33-82ce-d8e2d8c9a546"); - Response* response = testAccess->deleteTokens(ids); + Response* response = testAccess.deleteTokens(ids); QCOMPARE(spy.count(), 0); spy.wait(timeout); QVERIFY(spy.isValid()); QCOMPARE(spy.count(), 1); QString json = response->getJson(); QVERIFY(!json.isEmpty()); + response->deleteLater(); } void UnitTest::subjectJSONParser() { - /* - QFile jsonData(QDir::current().filePath("subjects.json")); - - if (!jsonData.open(QIODevice::ReadOnly)) { - qCritical() << "Couldn't open config file config.json" << QDir::current().filePath("subjects.json"); - QCoreApplication::exit(-1); - return; - } - - QJsonDocument doc = QJsonDocument::fromJson(jsonData.readAll()); - QJsonObject obj = doc.object(); - QJsonArray arr = obj["items"].toArray(); - */ - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getSubjects(); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getSubjects(); spy.wait(timeout); QString json = response->getJson(); QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QJsonArray arr = doc.object()["items"].toArray(); - auto testSubject = new Subject(); - testSubject->fromJSON(arr[1].toObject()); - qDebug() << testSubject->getName() << " Size: " << arr.size(); - QVERIFY(!testSubject->getName().isEmpty()); + Subject testSubject; + testSubject.fromJSON(arr[1].toObject()); + qDebug() << testSubject.getName() << " Size: " << arr.size(); + QVERIFY(!testSubject.getName().isEmpty()); + response->deleteLater(); } void UnitTest::tokenJSONParser() { - auto* testAccess = new RequestManager(); - QSignalSpy spy(testAccess, SIGNAL(responseReady())); - Response* response = testAccess->getTokens(); + RequestManager testAccess; + QSignalSpy spy(&testAccess, &RequestManager::responseReady); + Response* response = testAccess.getTokens(); spy.wait(timeout); QString json = response->getJson(); QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); QJsonArray arr = doc.object()["items"].toArray(); - auto testToken = new Token(); - testToken->fromJSON(arr[5].toObject()); - qDebug() << testToken->getName() << " Size: " << arr.size(); - QVERIFY(!testToken->getName().isEmpty()); -} - -//void UnitTest::connectToDB() -//{ -// DatabaseManager *db = new DatabaseManager("192.168.1.94", "deloitte", "postgres", "34rjkciea12"); -// QVERIFY(db->getOpened()); -// qDebug() << db->getTestMessage(1); -// QVERIFY(true); -// QCOMPARE(db->getTestMessage(1), QStringLiteral("Hello world")); -// QCOMPARE(db->getTestMessage(db->createTestRecord("Now it's diffrent")), QStringLiteral("Now it's diffrent")); -//} - -/* -void UnitTest::debugConnection() -{ - QSslSocket ssl;// = new QSslSocket(); - ssl.connectToHostEncrypted("192.168.1.3", 8443); - ssl.ignoreSslErrors(); - if (!ssl.waitForEncrypted()) - { - qDebug() << ssl.errorString(); - } - QString tmp = "POST /AaaManager/authSession HTTP/1.1\r\nHost: 192.168.1.3:8443\r\nAuthorization: Basic c3BhY2V0aTpFN0ZFQTA3REJDODJGQjlCQTM0QjJFNDUzRTJFRkU4OUYwNTgzRTcxODc1NDM1MDdFRjExRTg0NzI2MDcxRkU0Mjg0NDUzNzJGMkU0NkI0NTVFQjBDNzk3NDdDNTFFMzYyRjQwM0NFMzk0NzNBMkE4QzJERkEwQ0U1Qzk4MjZDMA==\r\nUser-Agent: curl/7.65.3\r\nAccept: **\r\nContent-Type: application/json\r\nContent-Length: 164\r\n\r\n{\"password\":\"E7FEA07DBC82FB9BA34B2E453E2EFE89F0583E7187543507EF11E84726071FE428445372F2E46B455EB0C79747C51E362F403CE39473A2A8C2DFA0CE5C9826C0\",\"username\":\"spaceti\"}"; - qDebug().noquote() << tmp.toUtf8(); - ssl.write(tmp.toUtf8()); - QString data; - while (ssl.waitForReadyRead() && data.isEmpty()) - { - data.append(ssl.readAll().data()); - } - qDebug().noquote() << data; - int index = data.lastIndexOf("id"); - QString tkn = data.mid( index + 5, 36); - tkn = tkn + ":"; - qDebug() << "parsed token : " <localSaveTokens(); - QVERIFY(true); - -} - -void UnitTest::getUuid() -{ - qDebug() << QUuid::createUuid().toString().mid(1,36); - QCOMPARE(1,1); + Token testToken; + testToken.fromJSON(arr[5].toObject()); + qDebug() << testToken.getName() << " Size: " << arr.size(); + QVERIFY(!testToken.getName().isEmpty()); + response->deleteLater(); } std::shared_ptr UnitTest::getTestToken() From b914b1c11d69dd1f25dcc74c99b688abec13d3f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 7 Nov 2019 12:49:02 +0100 Subject: [PATCH 2/5] added staff to handle initialization error --- src/app/main.cpp | 10 ++++---- src/colnod/databasemanager.cpp | 15 +++++++++--- src/colnod/databasemanager.h | 5 +++- src/colnod/datamanager.cpp | 42 +++++++++++++++++++++------------- src/colnod/datamanager.h | 2 ++ src/colnod/logger.cpp | 5 ++-- src/colnod/logger.h | 4 +++- src/colnod/syncmanager.cpp | 12 +++++++--- src/colnod/syncmanager.h | 2 ++ test/unitTests/unittest.h | 5 ---- 10 files changed, 67 insertions(+), 35 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 3a95aa2..9c3aeda 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -16,6 +16,12 @@ int main(int argc, char *argv[]) parser.addOption(dryModeOption); parser.process(app); SyncManager api(parser.isSet(dryModeOption)); + if (!api.isValid()) + return 1; + QObject::connect(&api, &SyncManager::error, [](){ + qDebug() << "error"; + QCoreApplication::exit(1); + }); api.loadDataFromDB(); api.loadDataFromColnod(); QObject::connect(&api, &SyncManager::dataDownloaded, [&](){ @@ -26,9 +32,5 @@ int main(int argc, char *argv[]) api.syncDataFromColnodToDB(); api.syncDataFromDBToColnod(); }); - QObject::connect(&api, &SyncManager::error, [](){ - qDebug() << "error"; - QCoreApplication::exit(); - }); return QCoreApplication::exec(); } diff --git a/src/colnod/databasemanager.cpp b/src/colnod/databasemanager.cpp index e2a6059..934baaa 100644 --- a/src/colnod/databasemanager.cpp +++ b/src/colnod/databasemanager.cpp @@ -10,9 +10,13 @@ DatabaseManager::DatabaseManager(const QString& host, const QString& dbName, con db.setPassword(password); if (!db.open()) { - log("Opening error" + db.lastError().text()); + opened = false; + Logger::log("Opening error" + db.lastError().text()); emit error(); } + else{ + opened = true; + } } // add or update subject to db @@ -139,7 +143,7 @@ bool DatabaseManager::executeQuery(QSqlQuery &query, const QString &statement) if (!dryMode || getLastQuery(query).startsWith("SELECT")){ if (!query.exec()){ QString msg = QString("Source: Database Manager, Error: %1").arg(query.lastError().text()); - log(QString(msg)); + Logger::logToDb(QString(msg)); emit error(); } } @@ -151,7 +155,7 @@ bool DatabaseManager::executeQuery(QSqlQuery &query, const QString &statement) if (!dryMode || statement.startsWith("SELECT")){ if (!query.exec(statement)){ QString msg = QString("Source: Database Manager, Error: %1").arg(query.lastError().text()); - log(QString(msg)); + Logger::logToDb(QString(msg)); emit error(); } } @@ -300,3 +304,8 @@ bool DatabaseManager::checkDeletedToken(const QString &id) query.next(); return query.value(0).toBool(); } + +bool DatabaseManager::isOpen() +{ + return opened; +} diff --git a/src/colnod/databasemanager.h b/src/colnod/databasemanager.h index 1ce4b50..9604f7b 100644 --- a/src/colnod/databasemanager.h +++ b/src/colnod/databasemanager.h @@ -10,7 +10,7 @@ #include "subject.h" #include "token.h" #include -//#include "logger.h" +#include "logger.h" class DatabaseManager : public QObject @@ -41,6 +41,8 @@ public: QString getSubjectNameById(const QString &id); bool checkDeletedToken(const QString &id); + bool isOpen(); + private: bool checkIfExists(const QString& id, const QString& table); @@ -53,4 +55,5 @@ signals: private: QSqlDatabase db; bool dryMode = false; + bool opened = false; }; diff --git a/src/colnod/datamanager.cpp b/src/colnod/datamanager.cpp index c74fa82..b94008b 100644 --- a/src/colnod/datamanager.cpp +++ b/src/colnod/datamanager.cpp @@ -5,9 +5,15 @@ DataManager::DataManager(const bool &dryMode) { db = std::make_shared("192.168.1.94", "deloitte", "postgres", "34rjkciea12", dryMode); //db = std::make_shared("localhost", "deloitte", "postgres", "34rjkciea12"); - Logger::setDBMan(db); - nextLastSync = db->getNow(); - lastSync = db->getLastSync(); + if (db->isOpen()){ + Logger::setDBMan(db); + nextLastSync = db->getNow(); + lastSync = db->getLastSync(); + } + else { + emit error(); + QCoreApplication::quit(); + } connect(db.get(), &DatabaseManager::error, this, &DataManager::error); } @@ -77,20 +83,23 @@ void DataManager::fillSubjectsToUpdateColnod(const QString& response) // load working sets with updated/deleted tokens from DB void DataManager::fillTokensToChangeDB() { - QSqlQuery query = db->getUpdatedTokens(); - while (query.next()) - { - auto token = std::make_shared(); - token->fromSQLRecord(query); - if (token->getDeleted()){ // sort to delete / to update - tokensFromDBToDeleteFromColnod.append(token->idToStringWithoutBraces()); - } - else{ - tokensToUpdateFromDBToColnod.insert(token->idToStringWithoutBraces(), token); + if (db->isOpen()){ + QSqlQuery query = db->getUpdatedTokens(); + while (query.next()) + { + auto token = std::make_shared(); + token->fromSQLRecord(query); + if (token->getDeleted()){ // sort to delete / to update + tokensFromDBToDeleteFromColnod.append(token->idToStringWithoutBraces()); + } + else{ + tokensToUpdateFromDBToColnod.insert(token->idToStringWithoutBraces(), token); + } } + qDebug() << "DB:" << tokensToUpdateFromDBToColnod.size() << "tokens to update"; + qDebug() << "DB:" << tokensFromDBToDeleteFromColnod.size() << "tokens to delete"; } - qDebug() << "DB:" << tokensToUpdateFromDBToColnod.size() << "tokens to update"; - qDebug() << "DB:" << tokensFromDBToDeleteFromColnod.size() << "tokens to delete"; + else emit error(); } void DataManager::fillSubjectsToUpdateDB() @@ -278,7 +287,8 @@ void DataManager::clear() // on the very end of sync update last sync time to begin time of this sync void DataManager::updateLastSync() { - db->updateLastSync(nextLastSync); + if (db->isOpen()) + db->updateLastSync(nextLastSync); } // these to filter functions solve colision tokens -> remove when change on this token is earlier then change on the same token on the other side (Colnod/DB) diff --git a/src/colnod/datamanager.h b/src/colnod/datamanager.h index 0c365d2..37c26ee 100644 --- a/src/colnod/datamanager.h +++ b/src/colnod/datamanager.h @@ -50,6 +50,8 @@ public: const quint64 &getLastSync() {return lastSync;} const quint64 &getCurrentSync() {return nextLastSync;} + bool isDBOpened() {return db->isOpen();} + public slots: void clear(); void setLastUpdate(); diff --git a/src/colnod/logger.cpp b/src/colnod/logger.cpp index 1326479..05e6c91 100644 --- a/src/colnod/logger.cpp +++ b/src/colnod/logger.cpp @@ -1,4 +1,5 @@ #include "logger.h" +#include "databasemanager.h" #include @@ -24,8 +25,8 @@ void Logger::log(const QString& msg) void Logger::logToDb(const QString &msg) { - Q_ASSERT(Logger::dbMan); - Logger::dbMan->log(msg); + if (dbMan) + Logger::dbMan->log(msg); } void Logger::setDBMan(std::shared_ptr dbMan) diff --git a/src/colnod/logger.h b/src/colnod/logger.h index 7c62211..f28bc1d 100644 --- a/src/colnod/logger.h +++ b/src/colnod/logger.h @@ -3,7 +3,9 @@ #include #include #include -#include "databasemanager.h" +#include + +class DatabaseManager; class Logger diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index 8db22d9..c74727e 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -1,11 +1,10 @@ #include "syncmanager.h" SyncManager::SyncManager(bool dryMode) + :dryMode(dryMode) { reqMan = std::make_unique(); dataMan = std::make_unique(dryMode); - this->dryMode = dryMode; - connect(reqMan.get(), &RequestManager::error, this, &SyncManager::error); connect(dataMan.get(), &DataManager::error, this, &SyncManager::error); } @@ -125,8 +124,10 @@ void SyncManager::syncDataFromDBToColnod() if (!dataMan->getTokensToDeleteDB().isEmpty()){ syncDeletedDataFromDBToColnod(); } - else + else{ deleteFinished = true; + areDataUpdatedToColnod(); + } } // add or update tokens to Colnod @@ -184,6 +185,11 @@ void SyncManager::prepareDatabase() dataMan->emptyDatabase(); } +bool SyncManager::isValid() +{ + return dataMan->isDBOpened(); +} + // emit signal when all data is downloaded from Colnod void SyncManager::areChangedDataReady() { diff --git a/src/colnod/syncmanager.h b/src/colnod/syncmanager.h index b7fbf58..629c495 100644 --- a/src/colnod/syncmanager.h +++ b/src/colnod/syncmanager.h @@ -17,6 +17,8 @@ public: void prepareDatabase(); + bool isValid(); + public slots: void loadDataFromColnod(); void loadDataFromDB(); diff --git a/test/unitTests/unittest.h b/test/unitTests/unittest.h index 0e29652..5e6185b 100644 --- a/test/unitTests/unittest.h +++ b/test/unitTests/unittest.h @@ -37,11 +37,6 @@ private slots: void deleteTokens(); void subjectJSONParser(); void tokenJSONParser(); - //void connectToDB(); - //void debugConnection(); - void saveDataToDB(); - void getUuid(); - private: std::shared_ptr getTestToken(); From a324e390ae03bdee87e9b3cb8e662479ef220267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 7 Nov 2019 12:57:27 +0100 Subject: [PATCH 3/5] fix login test --- test/unitTests/UnitTest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unitTests/UnitTest.cpp b/test/unitTests/UnitTest.cpp index 9212b2b..8ef2339 100644 --- a/test/unitTests/UnitTest.cpp +++ b/test/unitTests/UnitTest.cpp @@ -8,7 +8,7 @@ void UnitTest::initTestCase() void UnitTest::loginSuccessfully() { RequestManager testAccess; - QSignalSpy spy(&testAccess, &RequestManager::responseReady); + QSignalSpy spy(&testAccess, &RequestManager::successLogin); QVERIFY(spy.isValid()); testAccess.login(); spy.wait(timeout); From a4f20f1c291c33c4290e3f633d2b16cfae0d1364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 7 Nov 2019 13:49:37 +0100 Subject: [PATCH 4/5] better way of handling error --- src/app/main.cpp | 10 ++++------ src/colnod/datamanager.cpp | 11 ++++------- src/colnod/syncmanager.cpp | 4 ++-- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 9c3aeda..0ff9f05 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -16,12 +16,6 @@ int main(int argc, char *argv[]) parser.addOption(dryModeOption); parser.process(app); SyncManager api(parser.isSet(dryModeOption)); - if (!api.isValid()) - return 1; - QObject::connect(&api, &SyncManager::error, [](){ - qDebug() << "error"; - QCoreApplication::exit(1); - }); api.loadDataFromDB(); api.loadDataFromColnod(); QObject::connect(&api, &SyncManager::dataDownloaded, [&](){ @@ -32,5 +26,9 @@ int main(int argc, char *argv[]) api.syncDataFromColnodToDB(); api.syncDataFromDBToColnod(); }); + QObject::connect(&api, &SyncManager::error, &app, [](){ + qDebug() << "error"; + QCoreApplication::exit(1); + }, Qt::QueuedConnection); return QCoreApplication::exec(); } diff --git a/src/colnod/datamanager.cpp b/src/colnod/datamanager.cpp index b94008b..723af35 100644 --- a/src/colnod/datamanager.cpp +++ b/src/colnod/datamanager.cpp @@ -3,18 +3,14 @@ DataManager::DataManager(const bool &dryMode) :dryMode(dryMode) { - db = std::make_shared("192.168.1.94", "deloitte", "postgres", "34rjkciea12", dryMode); + db = std::make_shared("192.168.1.4", "deloitte", "postgres", "34rjkciea12", dryMode); //db = std::make_shared("localhost", "deloitte", "postgres", "34rjkciea12"); if (db->isOpen()){ Logger::setDBMan(db); nextLastSync = db->getNow(); lastSync = db->getLastSync(); } - else { - emit error(); - QCoreApplication::quit(); - } - connect(db.get(), &DatabaseManager::error, this, &DataManager::error); + connect(db.get(), &DatabaseManager::error, this, &DataManager::error, Qt::QueuedConnection); } // load all tokens from colnod to comparing with working set from DB @@ -99,7 +95,8 @@ void DataManager::fillTokensToChangeDB() qDebug() << "DB:" << tokensToUpdateFromDBToColnod.size() << "tokens to update"; qDebug() << "DB:" << tokensFromDBToDeleteFromColnod.size() << "tokens to delete"; } - else emit error(); + else + emit error(); } void DataManager::fillSubjectsToUpdateDB() diff --git a/src/colnod/syncmanager.cpp b/src/colnod/syncmanager.cpp index c74727e..411058c 100644 --- a/src/colnod/syncmanager.cpp +++ b/src/colnod/syncmanager.cpp @@ -5,8 +5,8 @@ SyncManager::SyncManager(bool dryMode) { reqMan = std::make_unique(); dataMan = std::make_unique(dryMode); - connect(reqMan.get(), &RequestManager::error, this, &SyncManager::error); - connect(dataMan.get(), &DataManager::error, this, &SyncManager::error); + connect(reqMan.get(), &RequestManager::error, this, &SyncManager::error, Qt::QueuedConnection); + connect(dataMan.get(), &DataManager::error, this, &SyncManager::error, Qt::QueuedConnection); } void SyncManager::loadDataFromColnod() From f53b82de9b2dd2e990e5d2505ba464553f714a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Fischer?= Date: Thu, 7 Nov 2019 14:54:43 +0100 Subject: [PATCH 5/5] update readme --- README.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b652349..0ff36da 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ Acces Management System of Colsys: [Product info](http://produkty.colsys.cz/colnod/) ## TODO -- [ ] Debug Mode -- [ ] Logs +- [x] Dry Run Mode (0.1v) +- [x] Logs (0.1v) - Timestamp - Id of record - Destination @@ -12,7 +12,7 @@ Acces Management System of Colsys: [Product info](http://produkty.colsys.cz/coln - Token `action` to `subject_id` - Sbject `action` - `action` - updated, deleted, added -- [ ] App output +- [x] App output (0.1v) - To Colnod - Number of tokens added/deleted/updated - To DB @@ -54,9 +54,58 @@ Acces Management System of Colsys: [Product info](http://produkty.colsys.cz/coln } ``` -1. GET request - `/SubjectManager/getSubjects` - get subjects -2. GET request - `/TokenManager/getTokens` - get tokens -3. POST request - `/TokenManager/setTokens` - set tokens + +1. POST request - `/SubjectManager/getSubjects` - get subjects +2. POST request - `/SubjectManager/getSubjectsUpdated` - get tokens updated after `time` +3. POST request - `/SubjectManager/getSubjectsDeleted` - get tokens deleted after `time` +4. POST request - `/TokenManager/getTokens` - get tokens +5. POST request - `/TokenManager/getTokensUpdated` - get tokens updated after `time` +6. POST request - `/TokenManager/getTokensDeleted` - get tokens deleted after `time` +7. POST request - `/TokenManager/setTokens` - set tokens defined as `JSON` +8. POST request - `/TokenManager/deleteTokens` - delete tokens define as `JSON2` +9. POST request - `/AccessManager/getAccessGroups` - get access groups +10. POST request - `/AccessManager/getAccessGroupsUpdated` +11. POST request - `/AccessManager/getAccessGroupsDeleted` +12. POST request - `/AccessManager/getAccessGroupMembership` +13. POST request - `/AccessManager/getAccessGroupMembershipUpdated` +14. POST request - `/AccessManager/getAccessGroupMembershipDeleted` + - `time` = epoch time im miliseconds + ```time + { + "timestamp": 1568646217767 + } + ``` + - `JSON` + ```json + { + "items": [ + { + "id": "cf5cb80e-e6dd-45db-8edd-c9655447821c", + "name": "Testovaci pokus", + "description": "mobile", + "tokenType": "Token", + "tokenBits}": 32, + "tokenData": "7B9D31", + "timeToLive": 255, + "authErrors": 255, + "flags": [ + "Enabled", + "NoValidity" + ], + "subjectId": "72b37f7e-5761-4e6c-8e87-20c0bed0d904" + } + ] + } + ``` + - `JSON2` + ```json2 + { + "items": [ + "7272bcf6-b5ad-46dd-99a9-0c56faddf14c" + ] + } + ``` + ## RestAPI definitions @@ -80,11 +129,10 @@ curl -k --user "spaceti:E7FEA07DBC82FB9BA34B2E453E2EFE89F0583E7187543507EF11E847 ## Colnod Penta server -- Acces through: `penta-master` IP:`172.16.3.4` +- Acces through: `penta-master` IP: `172.16.4.4` - URL: `192.168.254.11:8443` - Port forwarding: `ssh -L 8443:192.168.254.11:8443 penta-master` - - `!!! does not work !!!` - + ```bash curl -k --user "spaceti:E7FEA07DBC82FB9BA34B2E453E2EFE89F0583E7187543507EF11E84726071FE428445372F2E46B455EB0C79747C51E362F403CE39473A2A8C2DFA0CE5C9826C0" -d '{"password":"E7FEA07DBC82FB9BA34B2E453E2EFE89F0583E7187543507EF11E84726071FE428445372F2E46B455EB0C79747C51E362F403CE39473A2A8C2DFA0CE5C9826C0","username":"spaceti"}' -H "Content-Type: application/json" https://192.168.254.11:8443/AaaManager/authSession ``` @@ -101,7 +149,7 @@ It is possible to chain requests: [see doc](https://support.insomnia.rest/articl ### Import workspace -- import: `Insomnia_2019_10_01.yaml` +- import: [Insomnia file on GitLab](https://gitlab.com/spaceti-app/integrations/acs/colnod-connector/blob/master/Insomnia_2019-10-15.yaml) ## Testing Blueprint API