aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/odhtdb/Database.hpp2
-rw-r--r--include/odhtdb/DatabaseStorage.hpp2
-rw-r--r--src/Database.cpp5
-rw-r--r--src/DatabaseStorage.cpp14
-rw-r--r--tests/main.cpp8
5 files changed, 31 insertions, 0 deletions
diff --git a/include/odhtdb/Database.hpp b/include/odhtdb/Database.hpp
index ca9369f..a68c601 100644
--- a/include/odhtdb/Database.hpp
+++ b/include/odhtdb/Database.hpp
@@ -189,6 +189,8 @@ namespace odhtdb
// Returns nodes, public key and private key of encrypted user.
// Throws DatabaseStorageWrongPassword if password for the stored user is wrong.
std::vector<NodeUserKeyPair> getStoredUserNodeDataDecrypted(const std::string &username, const std::string &password);
+
+ std::vector<OwnedMemory> getUserGroups(const Hash &nodeHash, const Signature::PublicKey &userPublicKey) const;
private:
void deserializeCreateRequest(const std::shared_ptr<dht::Value> &value, const Hash &hash, const std::shared_ptr<OwnedMemory> encryptionKey);
void deserializeAddRequest(const std::shared_ptr<dht::Value> &value, const Hash &requestDataHash, const std::shared_ptr<Hash> &nodeHash, const std::shared_ptr<OwnedMemory> encryptionKey);
diff --git a/include/odhtdb/DatabaseStorage.hpp b/include/odhtdb/DatabaseStorage.hpp
index f03bd9e..2b1e552 100644
--- a/include/odhtdb/DatabaseStorage.hpp
+++ b/include/odhtdb/DatabaseStorage.hpp
@@ -140,6 +140,8 @@ namespace odhtdb
const std::vector<dht::NodeExport>& getRemoteNodes() const;
void setRemoteNodes(const std::vector<dht::NodeExport> &remoteNodes);
+ std::vector<OwnedMemory> getUserGroups(const Hash &nodeHash, const Signature::PublicKey &userPublicKey) const;
+
const dht::crypto::Identity& getIdentity() const;
// Update storage state (remove quarantine objects if they are too old, etc)
diff --git a/src/Database.cpp b/src/Database.cpp
index 82cb21e..241d9a5 100644
--- a/src/Database.cpp
+++ b/src/Database.cpp
@@ -665,4 +665,9 @@ namespace odhtdb
{
return databaseStorage.getStoredUserNodeDataDecrypted(username, password);
}
+
+ vector<OwnedMemory> Database::getUserGroups(const Hash &nodeHash, const Signature::PublicKey &userPublicKey) const
+ {
+ return databaseStorage.getUserGroups(nodeHash, userPublicKey);
+ }
}
diff --git a/src/DatabaseStorage.cpp b/src/DatabaseStorage.cpp
index 3140c96..ed190e8 100644
--- a/src/DatabaseStorage.cpp
+++ b/src/DatabaseStorage.cpp
@@ -1025,6 +1025,20 @@ namespace odhtdb
fileOverwrite(remoteNodesFilePath, DataView(remoteNodePacker.serializer.getBuffer().data(), remoteNodePacker.serializer.getBuffer().size()));
}
+ vector<OwnedMemory> DatabaseStorage::getUserGroups(const Hash &nodeHash, const Signature::PublicKey &userPublicKey) const
+ {
+ vector<OwnedMemory> result;
+ SqlQuery query(sqliteDb, "SELECT groupId FROM NodeUserGroupAssoc WHERE node = ? AND userPublicKey = ?", { DataView(nodeHash.getData(), nodeHash.getSize()), DataView((void*)userPublicKey.getData(), userPublicKey.getSize()) });
+ while(query.next())
+ {
+ const DataView groupIdRaw = query.getBlob(0);
+ OwnedMemory groupId(new u8[groupIdRaw.size], groupIdRaw.size);
+ memcpy(groupId.data, groupIdRaw.data, groupIdRaw.size);
+ result.emplace_back(move(groupId));
+ }
+ return result;
+ }
+
bool DatabaseStorage::decryptNodeData(const Hash &nodeHash, const shared_ptr<OwnedMemory> decryptionKey)
{
sqlite3_reset(selectNodeStmt);
diff --git a/tests/main.cpp b/tests/main.cpp
index 5374c2d..dd56164 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -241,6 +241,14 @@ int main()
database.storeUserWithoutNodes("anotherUser", password);
if(!database.doesStoredUserExist("anotherUser"))
fail("Added user 'anotherUser' to database without any nodes, but it doesn't seem to be stored");
+
+ auto adminUserGroups = database.getUserGroups(*databaseNode.getRequestHash(), adminUserKey->getPublicKey());
+ if(adminUserGroups.size() != 1 || adminUserGroups[0].getView() != databaseCreateResponse->getNodeAdminGroupId()->getView())
+ fail("Admin group doesn't match group stored in database");
+
+ auto userGroups = database.getUserGroups(*databaseNode.getRequestHash(), localUserKeyPair.getPublicKey());
+ if(userGroups.size() != 1 || userGroups[0].getView() != databaseCreateResponse->getNodeAdminGroupId()->getView())
+ fail("User group doesn't match group stored in database");
}
Log::debug("Callback works when adding data while connected, now testing to reconnect and check if data remains...");
{