diff --git a/src/core/src/public/QASecret.cpp b/src/core/src/public/QASecret.cpp index 0296b78..9da4cf8 100644 --- a/src/core/src/public/QASecret.cpp +++ b/src/core/src/public/QASecret.cpp @@ -8,14 +8,15 @@ #include "QASecret.h" #include - +#include namespace QASecret { bool init() { initSecretServiceResources(); + DBSecret::init(); - KeyStorage::initService(); + KeyStorage::initService(std::make_unique(DBSecret::database())); return true; } diff --git a/src/core/src/public/QASecret/keystorage.cpp b/src/core/src/public/QASecret/keystorage.cpp index a7915ba..24eb1ea 100644 --- a/src/core/src/public/QASecret/keystorage.cpp +++ b/src/core/src/public/QASecret/keystorage.cpp @@ -10,33 +10,45 @@ namespace QASecret { -KeyStorage::KeyStorage() {} +KeyStorage::KeyStorage(const QSharedPointer &db) { + _db = db; +} QByteArray KeyStorage::add(const QByteArray &value, const QString &alias) { - QByteArray&& key = QCryptographicHash::hash(value, QCryptographicHash::Sha256); - _storage[key] = value; - _aliases[alias] = value; - return key; + if (auto record = _db->getRecordByAlias(alias, true)) { + record->setData(value); + if (_db->saveRecord(record)) { + return record->getHash(); + } + } + + return {}; } void KeyStorage::remove(const QByteArray &key) { - _storage.remove(key); + _db->removeRecordByKey(key); } void KeyStorage::remove(const QString &alias) { - _aliases.remove(alias); + _db->removeRecordByAlias(alias); } QByteArray KeyStorage::get(const QByteArray &key) { - auto&& result = _storage.value(key); + if (auto&& result = _db->getRecordByHash(key)) { + return result->getData(); - return result; + } + + return ""; } QByteArray KeyStorage::get(const QString &alias) { - auto&& result = _aliases.value(alias); + if (auto&& result = _db->getRecordByAlias(alias)) { + return result->getData(); - return result; + } + + return ""; } } diff --git a/src/core/src/public/QASecret/keystorage.h b/src/core/src/public/QASecret/keystorage.h index 05e5da0..6ecc86d 100644 --- a/src/core/src/public/QASecret/keystorage.h +++ b/src/core/src/public/QASecret/keystorage.h @@ -8,18 +8,20 @@ #ifndef KEYSTORAGE_H #define KEYSTORAGE_H +#include "SecretDB/idatabase.h" #include "qaservice.h" #include namespace QASecret { + /** * @brief The KeyStorage class the storage store seccrets values on the simple key - value table. Where value is secrete and key is a sha256(secret) hash. */ class KeyStorage: public QuasarAppUtils::Service { public: - KeyStorage(); + KeyStorage(const QSharedPointer& db); /** * @brief add adds to storage new value, and return access key. @@ -56,8 +58,7 @@ public: QByteArray get(const QString& alias); private: - QHash _storage; - QHash _aliases; + QSharedPointer _db; }; } diff --git a/src/db/src/private/secretdatabase.cpp b/src/db/src/private/secretdatabase.cpp index 5b627c0..445b40e 100644 --- a/src/db/src/private/secretdatabase.cpp +++ b/src/db/src/private/secretdatabase.cpp @@ -39,4 +39,12 @@ bool SecretDataBase::saveRecord(const QSharedPointer &record) { return db()->replaceObject(record.staticCast(), true); } +bool SecretDataBase::removeRecordByAlias(const QString &alias) { + return deleteById(alias, &Record::setAlias); +} + +bool SecretDataBase::removeRecordByKey(const QByteArray &hash) { + return deleteById(hash, &Record::setHash); +} + } diff --git a/src/db/src/private/secretdatabase.h b/src/db/src/private/secretdatabase.h index 4794a8e..450efd3 100644 --- a/src/db/src/private/secretdatabase.h +++ b/src/db/src/private/secretdatabase.h @@ -25,6 +25,8 @@ public: QSharedPointer getRecordByHash(const QByteArray &hash, bool ifNotExistsCreate) override; bool saveRecord(const QSharedPointer &record) override; + bool removeRecordByAlias(const QString &alias) override; + bool removeRecordByKey(const QByteArray &hash) override; }; } #endif // BOTDATABASE_H diff --git a/src/db/src/public/SecretDB/idatabase.h b/src/db/src/public/SecretDB/idatabase.h index f4fe834..8904b3e 100644 --- a/src/db/src/public/SecretDB/idatabase.h +++ b/src/db/src/public/SecretDB/idatabase.h @@ -46,6 +46,20 @@ public: * @return true if the object will save */ virtual bool saveRecord(const QSharedPointer& record) = 0; + + /** + * @brief removeRecordByAlias This method will remove record by alias. + * @param alias alias of the record that will be removed. + * @return true if function finished succesful else false. + */ + virtual bool removeRecordByAlias(const QString& alias) = 0; + + /** + * @brief removeRecordByKey This method will remove record by hash key. + * @param hash is the key of the record that will be removed. + * @return true if function finished succesful else false. + */ + virtual bool removeRecordByKey(const QByteArray& hash) = 0; }; } diff --git a/tests/units/dbtest.cpp b/tests/units/dbtest.cpp index 1feceb4..b695b8b 100644 --- a/tests/units/dbtest.cpp +++ b/tests/units/dbtest.cpp @@ -61,4 +61,20 @@ void DBTest::test() { QVERIFY2(result2->getAlias() == result->getAlias(), "should be some as a prev object"); QVERIFY2(result2->getHash() == result->getHash(), "should be some as a prev object"); QVERIFY2(result2->getData() == result->getData(), "should be some as a prev object"); + + database->removeRecordByAlias("test"); + QVERIFY2(!database->getRecordByAlias("test"), "should be empty on first run"); + QVERIFY2(!database->getRecordByHash(dataHash), "should be empty on first run"); + + database->saveRecord(result); + result2 = database->getRecordByAlias("test"); + + QVERIFY2(result2->getAlias() == result->getAlias(), "should be some as a prev object"); + QVERIFY2(result2->getHash() == result->getHash(), "should be some as a prev object"); + QVERIFY2(result2->getData() == result->getData(), "should be some as a prev object"); + + database->removeRecordByKey(dataHash); + QVERIFY2(!database->getRecordByAlias("test"), "should be empty on first run"); + QVERIFY2(!database->getRecordByHash(dataHash), "should be empty on first run"); + }