"""
Galaxy Security
"""
from typing import (
List,
Optional,
)
from typing_extensions import Literal
from galaxy.util.bunch import Bunch
ActionModel = Literal["grant", "restrict"]
[docs]class Action:
action: str
description: str
model: ActionModel
[docs] def __init__(self, action: str, description: str, model: ActionModel):
self.action = action
self.description = description
self.model = model
[docs]class RBACAgent:
"""Class that handles galaxy security"""
permitted_actions = Bunch(
DATASET_MANAGE_PERMISSIONS=Action(
"manage permissions",
"Users having associated role can manage the roles associated with permissions on this dataset.",
"grant",
),
DATASET_ACCESS=Action(
"access",
"Users having all associated roles can import this dataset into their history for analysis.",
"restrict",
),
LIBRARY_ACCESS=Action(
"access library", "Restrict access to this library to only users having associated role", "restrict"
),
LIBRARY_ADD=Action(
"add library item", "Users having associated role can add library items to this library item", "grant"
),
LIBRARY_MODIFY=Action(
"modify library item", "Users having associated role can modify this library item", "grant"
),
LIBRARY_MANAGE=Action(
"manage library permissions",
"Users having associated role can manage roles associated with permissions on this library item",
"grant",
),
)
[docs] def get_action(self, name: str, default: Optional[Action] = None) -> Optional[Action]:
"""Get a permitted action by its dict key or action name"""
for k, v in self.permitted_actions.items():
if k == name or v.action == name:
return v
return default
[docs] def get_actions(self) -> List[Action]:
"""Get all permitted actions as a list of Action objects"""
return list(self.permitted_actions.__dict__.values())
[docs] def get_item_actions(self, action, item):
raise Exception(f"No valid method of retrieving action ({action}) for item {item}.")
[docs] def guess_derived_permissions_for_datasets(self, datasets=None):
datasets = datasets or []
raise Exception("Unimplemented Method")
[docs] def can_access_dataset(self, roles, dataset):
raise Exception("Unimplemented Method")
[docs] def can_manage_dataset(self, roles, dataset):
raise Exception("Unimplemented Method")
[docs] def can_access_library(self, roles, library):
raise Exception("Unimplemented Method")
[docs] def can_add_library_item(self, roles, item):
raise Exception("Unimplemented Method")
[docs] def can_modify_library_item(self, roles, item):
raise Exception("Unimplemented Method")
[docs] def can_change_object_store_id(self, user, dataset):
raise Exception("Unimplemented Method")
[docs] def can_manage_library_item(self, roles, item):
raise Exception("Unimplemented Method")
[docs] def associate_components(self, **kwd):
raise Exception(f"No valid method of associating provided components: {kwd}")
[docs] def create_private_user_role(self, user):
raise Exception("Unimplemented Method")
[docs] def get_private_user_role(self, user):
raise Exception("Unimplemented Method")
[docs] def user_set_default_permissions(self, user, permissions=None, history=False, dataset=False):
permissions = permissions or {}
raise Exception("Unimplemented Method")
[docs] def history_set_default_permissions(self, history, permissions=None, dataset=False, bypass_manage_permission=False):
raise Exception("Unimplemented Method")
[docs] def set_all_dataset_permissions(self, dataset, permissions, new=False):
raise Exception("Unimplemented Method")
[docs] def set_dataset_permission(self, dataset, permission):
raise Exception("Unimplemented Method")
[docs] def set_all_library_permissions(self, trans, dataset, permissions):
raise Exception("Unimplemented Method")
[docs] def set_library_item_permission(self, library_item, permission):
raise Exception("Unimplemented Method")
[docs] def library_is_public(self, library):
raise Exception("Unimplemented Method")
[docs] def make_library_public(self, library):
raise Exception("Unimplemented Method")
[docs] def get_accessible_libraries(self, trans, user):
raise Exception("Unimplemented Method")
[docs] def get_permitted_libraries(self, trans, user, actions):
raise Exception("Unimplemented Method")
[docs] def folder_is_public(self, library):
raise Exception("Unimplemented Method")
[docs] def make_folder_public(self, folder, count=0):
raise Exception("Unimplemented Method")
[docs] def dataset_is_public(self, dataset):
raise Exception("Unimplemented Method")
[docs] def make_dataset_public(self, dataset):
raise Exception("Unimplemented Method")
[docs] def get_permissions(self, library_dataset):
raise Exception("Unimplemented Method")
[docs] def get_all_roles(self, trans, cntrller):
raise Exception("Unimplemented Method")
[docs] def get_legitimate_roles(self, trans, item, cntrller):
raise Exception("Unimplemented Method")
[docs] def derive_roles_from_access(self, trans, item_id, cntrller, library=False, **kwd):
raise Exception("Unimplemented Method")
[docs] def get_component_associations(self, **kwd):
raise Exception("Unimplemented Method")
[docs] def components_are_associated(self, **kwd):
return bool(self.get_component_associations(**kwd))
[docs] def convert_permitted_action_strings(self, permitted_action_strings):
"""
When getting permitted actions from an untrusted source like a
form, ensure that they match our actual permitted actions.
"""
return [
_
for _ in [self.permitted_actions.get(action_string) for action_string in permitted_action_strings]
if _ is not None
]
[docs]def get_permitted_actions(filter=None):
"""Utility method to return a subset of RBACAgent's permitted actions"""
if filter is None:
return RBACAgent.permitted_actions
tmp_bunch = Bunch()
[tmp_bunch.dict().__setitem__(k, v) for k, v in RBACAgent.permitted_actions.items() if k.startswith(filter)]
return tmp_bunch