Skip to content

Commit

Permalink
Merge pull request #8709 from OpenMined/eelco/fix-mongo-get-permissions
Browse files Browse the repository at this point in the history
fix: get permissions from mongo store
  • Loading branch information
koenvanderveen committed Apr 15, 2024
2 parents ebddbb0 + c31ac95 commit be83bcf
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 3 deletions.
10 changes: 10 additions & 0 deletions packages/syft/src/syft/service/action/action_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,11 @@ def add_permissions(self, permissions: list[ActionObjectPermission]) -> None:
for permission in permissions:
self.add_permission(permission)

def _get_permissions_for_uid(self, uid: UID) -> Result[set[str], str]:
if uid in self.permissions:
return Ok(self.permissions[uid])
return Err(f"No permissions found for uid: {uid}")

def add_storage_permission(self, permission: StoragePermission) -> None:
permissions = self.storage_permissions[permission.uid]
permissions.add(permission.node_uid)
Expand All @@ -291,6 +296,11 @@ def has_storage_permission(self, permission: StoragePermission | UID) -> bool:
return permission.node_uid in self.storage_permissions[permission.uid]
return False

def _get_storage_permissions_for_uid(self, uid: UID) -> Result[set[UID], str]:
if uid in self.storage_permissions:
return Ok(self.storage_permissions[uid])
return Err(f"No storage permissions found for uid: {uid}")

def migrate_data(
self, to_klass: SyftObject, credentials: SyftVerifyKey
) -> Result[bool, str]:
Expand Down
9 changes: 6 additions & 3 deletions packages/syft/src/syft/service/sync/sync_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,12 @@ def get_permissions(
for item in items:
store = get_store(context, item)
if store is not None:
_id = item.id.id
permissions[_id] = store.permissions[_id]
storage_permissions[_id] = store.storage_permissions[_id]
# TODO fix error handling
uid = item.id.id
permissions[uid] = store._get_permissions_for_uid(uid).ok()
storage_permissions[uid] = store._get_storage_permissions_for_uid(
uid
).ok()
return permissions, storage_permissions

def get_all_syncable_items(
Expand Down
6 changes: 6 additions & 0 deletions packages/syft/src/syft/store/document_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,9 @@ def remove_permission(self, permission: ActionObjectPermission) -> None:
def has_permission(self, permission: ActionObjectPermission) -> bool:
raise NotImplementedError

def _get_permissions_for_uid(self, uid: UID) -> Result[set[str], str]:
raise NotImplementedError

def add_storage_permission(self, permission: StoragePermission) -> None:
raise NotImplementedError

Expand All @@ -533,6 +536,9 @@ def remove_storage_permission(self, permission: StoragePermission) -> None:
def has_storage_permission(self, permission: StoragePermission | UID) -> bool:
raise NotImplementedError

def _get_storage_permissions_for_uid(self, uid: UID) -> Result[set[UID], str]:
raise NotImplementedError

def _migrate_data(
self,
to_klass: SyftObject,
Expand Down
10 changes: 10 additions & 0 deletions packages/syft/src/syft/store/kv_document_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,11 @@ def has_permission(self, permission: ActionObjectPermission) -> bool:

return False

def _get_permissions_for_uid(self, uid: UID) -> Result[set[str], Err]:
if uid in self.permissions:
return Ok(self.permissions[uid])
return Err(f"No permissions found for uid: {uid}")

def add_storage_permission(self, permission: StoragePermission) -> None:
permissions = self.storage_permissions[permission.uid]
permissions.add(permission.node_uid)
Expand Down Expand Up @@ -337,6 +342,11 @@ def _all(
result = sorted(result, key=lambda x: getattr(x, order_by.key, ""))
return Ok(result)

def _get_storage_permissions_for_uid(self, uid: UID) -> Result[set[UID], Err]:
if uid in self.storage_permissions:
return Ok(self.storage_permissions[uid])
return Err(f"No storage permissions found for uid: {uid}")

def _remove_keys(
self,
store_key: QueryKey,
Expand Down
31 changes: 31 additions & 0 deletions packages/syft/src/syft/store/mongo_document_store.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# stdlib
from collections.abc import Callable
from typing import Any
from typing import Set # noqa: UP035

# third party
from pydantic import Field
Expand Down Expand Up @@ -500,6 +501,19 @@ def has_permission(self, permission: ActionObjectPermission) -> bool:

return False

def _get_permissions_for_uid(self, uid: UID) -> Result[Set[str], Err]: # noqa: UP006
collection_permissions_status = self.permissions
if collection_permissions_status.is_err():
return collection_permissions_status
collection_permissions: MongoCollection = collection_permissions_status.ok()

permissions: dict | None = collection_permissions.find_one({"_id": uid})

if permissions is None:
return Err(f"Permissions for object with UID {uid} not found!")

return Ok(set(permissions["permissions"]))

def add_permission(self, permission: ActionObjectPermission) -> Result[None, Err]:
collection_permissions_status = self.permissions
if collection_permissions_status.is_err():
Expand Down Expand Up @@ -633,6 +647,23 @@ def remove_storage_permission(
f"the node_uid {storage_permission.node_uid} does not exist in the storage permission!"
)

def _get_storage_permissions_for_uid(self, uid: UID) -> Result[Set[UID], Err]: # noqa: UP006
storage_permissions_or_err = self.storage_permissions
if storage_permissions_or_err.is_err():
return storage_permissions_or_err
storage_permissions_collection: MongoCollection = (
storage_permissions_or_err.ok()
)

storage_permissions: dict | None = storage_permissions_collection.find_one(
{"_id": uid}
)

if storage_permissions is None:
return Err(f"Storage permissions for object with UID {uid} not found!")

return Ok(set(storage_permissions["node_uids"]))

def take_ownership(
self, uid: UID, credentials: SyftVerifyKey
) -> Result[SyftSuccess, str]:
Expand Down

0 comments on commit be83bcf

Please sign in to comment.