From 5d9721e6bac8c8bc8f3e76326a16c65e097dbf6a Mon Sep 17 00:00:00 2001 From: Daniel Vaz Gaspar Date: Thu, 17 Dec 2020 14:27:14 +0000 Subject: [PATCH] feat(queries): security perm simplification (#12072) * feat(queries): security perm simplification * fix mig * update alembic down revision --- .../e37912a26567_security_converge_queries.py | 74 +++++++++++++++++++ superset/queries/api.py | 7 +- tests/security_tests.py | 3 +- 3 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 superset/migrations/versions/e37912a26567_security_converge_queries.py diff --git a/superset/migrations/versions/e37912a26567_security_converge_queries.py b/superset/migrations/versions/e37912a26567_security_converge_queries.py new file mode 100644 index 0000000000000..99928e64c7e90 --- /dev/null +++ b/superset/migrations/versions/e37912a26567_security_converge_queries.py @@ -0,0 +1,74 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""security converge queries + +Revision ID: e37912a26567 +Revises: 42b4c9e01447 +Create Date: 2020-12-16 12:15:28.291777 + +""" + +# revision identifiers, used by Alembic. +revision = "e37912a26567" +down_revision = "42b4c9e01447" + +from alembic import op +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm import Session + +from superset.migrations.shared.security_converge import ( + add_pvms, + get_reversed_new_pvms, + get_reversed_pvm_map, + migrate_roles, + Pvm, +) + +NEW_PVMS = {"Query": ("can_read",)} +PVM_MAP = { + Pvm("QueryView", "can_list"): (Pvm("Query", "can_read"),), + Pvm("QueryView", "can_show"): (Pvm("Query", "can_read"),), +} + + +def upgrade(): + bind = op.get_bind() + session = Session(bind=bind) + + # Add the new permissions on the migration itself + add_pvms(session, NEW_PVMS) + migrate_roles(session, PVM_MAP) + try: + session.commit() + except SQLAlchemyError as ex: + print(f"An error occurred while upgrading permissions: {ex}") + session.rollback() + + +def downgrade(): + bind = op.get_bind() + session = Session(bind=bind) + + # Add the old permissions on the migration itself + add_pvms(session, get_reversed_new_pvms(PVM_MAP)) + migrate_roles(session, get_reversed_pvm_map(PVM_MAP)) + try: + session.commit() + except SQLAlchemyError as ex: + print(f"An error occurred while downgrading permissions: {ex}") + session.rollback() + pass diff --git a/superset/queries/api.py b/superset/queries/api.py index 8f1a3fb843b0b..140818e0de352 100644 --- a/superset/queries/api.py +++ b/superset/queries/api.py @@ -18,7 +18,7 @@ from flask_appbuilder.models.sqla.interface import SQLAInterface -from superset.constants import RouteMethod +from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod from superset.databases.filters import DatabaseFilter from superset.models.sql_lab import Query from superset.queries.filters import QueryFilter @@ -33,6 +33,10 @@ class QueryRestApi(BaseSupersetModelRestApi): datamodel = SQLAInterface(Query) resource_name = "query" + + class_permission_name = "Query" + method_permission_name = MODEL_API_RW_METHOD_PERMISSION_MAP + allow_browser_login = True include_route_methods = { RouteMethod.GET, @@ -41,7 +45,6 @@ class QueryRestApi(BaseSupersetModelRestApi): RouteMethod.DISTINCT, } - class_permission_name = "QueryView" list_columns = [ "id", "changed_on", diff --git a/tests/security_tests.py b/tests/security_tests.py index 49448987c2200..5f3b2a60f3d78 100644 --- a/tests/security_tests.py +++ b/tests/security_tests.py @@ -55,6 +55,7 @@ "Dashboard", "CssTemplate", "Chart", + "Query", "SavedQuery", ) @@ -683,7 +684,7 @@ def assert_can_alpha(self, perm_set): self.assert_can_all("Annotation", perm_set) self.assert_can_all("CssTemplate", perm_set) self.assert_can_all("Dataset", perm_set) - self.assert_can_read("QueryView", perm_set) + self.assert_can_read("Query", perm_set) self.assertIn(("can_import_dashboards", "Superset"), perm_set) self.assertIn(("can_this_form_post", "CsvToDatabaseView"), perm_set) self.assertIn(("can_this_form_get", "CsvToDatabaseView"), perm_set)