Skip to content

Commit

Permalink
using NamedTuple instead of Tuple
Browse files Browse the repository at this point in the history
  • Loading branch information
painyjames committed Jan 27, 2022
1 parent c5ddcfc commit b2b230c
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 17 deletions.
17 changes: 6 additions & 11 deletions superset/databases/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,22 @@

class DatabaseFilter(BaseFilter):
# TODO(bogdan): consider caching.
def schema_access_databases(self) -> Set[str]: # noqa pylint: disable=no-self-use
return {
security_manager.unpack_perm(vm)[0]
for vm in security_manager.user_view_menu_names("schema_access")
}

def datasource_access_databases( # noqa pylint: disable=no-self-use
self,
def can_access_databases( # noqa pylint: disable=no-self-use
self, view_menu_name: str,
) -> Set[str]:
return {
security_manager.unpack_perm(vm)[0]
for vm in security_manager.user_view_menu_names("datasource_access")
security_manager.unpack_database_and_schema(vm).database
for vm in security_manager.user_view_menu_names(view_menu_name)
}

def apply(self, query: Query, value: Any) -> Query:
if security_manager.can_access_all_databases():
return query
database_perms = security_manager.user_view_menu_names("database_access")
schema_access_databases = self.schema_access_databases()
schema_access_databases = self.can_access_databases("schema_access")

datasource_access_databases = self.datasource_access_databases()
datasource_access_databases = self.can_access_databases("datasource_access")

return query.filter(
or_(
Expand Down
18 changes: 12 additions & 6 deletions superset/security/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
cast,
Dict,
List,
NamedTuple,
Optional,
Set,
Tuple,
TYPE_CHECKING,
Union,
)
Expand Down Expand Up @@ -78,6 +78,11 @@
logger = logging.getLogger(__name__)


class DatabaseAndSchema(NamedTuple):
database: str
schema: str


class SupersetSecurityListWidget(ListWidget): # pylint: disable=too-few-public-methods
"""
Redeclaring to avoid circular imports
Expand Down Expand Up @@ -237,13 +242,14 @@ def get_schema_perm( # pylint: disable=no-self-use

return None

def unpack_perm( # pylint: disable=no-self-use
def unpack_database_and_schema( # pylint: disable=no-self-use
self, schema_permission: str
) -> Tuple[str, str]:
# [database_name].[schema_name]
) -> DatabaseAndSchema:
# [database_name].[schema|table]

schema_name = schema_permission.split(".")[1][1:-1]
database_name = schema_permission.split(".")[0][1:-1]
return database_name, schema_name
return DatabaseAndSchema(database_name, schema_name)

def can_access(self, permission_name: str, view_name: str) -> bool:
"""
Expand Down Expand Up @@ -532,7 +538,7 @@ def get_schemas_accessible_by_user(

# schema_access
accessible_schemas = {
self.unpack_perm(s)[1]
self.unpack_database_and_schema(s).schema
for s in self.user_view_menu_names("schema_access")
if s.startswith(f"[{database}].")
}
Expand Down

0 comments on commit b2b230c

Please sign in to comment.