Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: get permissions from mongo store #8709

Merged
merged 7 commits into from
Apr 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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