diff --git a/src/metabase/query_processor/middleware/permissions.clj b/src/metabase/query_processor/middleware/permissions.clj index a302fcdce3e450b9c9ddf914d4614d1ef132d556..a442ed2bb45ff85a5a291d87b24a3a324e02d8b4 100644 --- a/src/metabase/query_processor/middleware/permissions.clj +++ b/src/metabase/query_processor/middleware/permissions.clj @@ -124,7 +124,7 @@ (defn- query-action-perms [{:keys [database]}] - #{(perms/execute-query-perms-path database)}) + #{(perms/data-perms-path database)}) (s/defn check-query-action-permissions* "Check that User with `user-id` has permissions to run query action `query`, or throw an exception." @@ -135,7 +135,7 @@ (when-not (has-data-perms? (required-perms outer-query)) (check-block-permissions outer-query)) (when-not (has-data-perms? (query-action-perms outer-query)) - (throw (perms-exception required-perms)))) + (throw (perms-exception (required-perms outer-query))))) (defn check-query-action-permissions "Middleware that check that the current user has permissions to run the current query action." diff --git a/test/metabase/api/dashboard_test.clj b/test/metabase/api/dashboard_test.clj index eb11f348d6cee28a521991633fad0e82416e1540..f846055073702a0162a226310bf455136a6554f1 100644 --- a/test/metabase/api/dashboard_test.clj +++ b/test/metabase/api/dashboard_test.clj @@ -2826,13 +2826,14 @@ (:cause (mt/user-http-request :crowberto :post 400 execute-path {:parameters {"name" "Birds"}}))))) - (testing "Without execute rights on the DB" + (testing "Without read rights on the DB" + (perms/revoke-data-perms! (perms-group/all-users) (mt/db)) (mt/with-actions-enabled (is (partial= {:message "You do not have permissions to run this query."} (mt/user-http-request :rasta :post 403 execute-path {:parameters {"name" "Birds"}}))))) (testing "With execute rights on the DB" - (perms/update-global-execution-permission! (:id (perms-group/all-users)) :all) + (perms/grant-full-data-permissions! (perms-group/all-users) (mt/db)) (try (mt/with-actions-enabled (is (contains? #{{:ID 76, :NAME "Birds"} @@ -2841,7 +2842,7 @@ {:parameters {"name" "Birds"}}) :created-row)))) (finally - (perms/update-global-execution-permission! (:id (perms-group/all-users)) :none))))))))))) + (perms/revoke-data-perms! (perms-group/all-users) (mt/db)))))))))))) (deftest dashcard-custom-action-execution-auth-test (mt/with-temp-copy-of-db @@ -2860,20 +2861,21 @@ (:cause (mt/user-http-request :crowberto :post 400 execute-path {:parameters {"id" 1}}))))) - (testing "Without execute rights on the DB" + (testing "Without read rights on the DB" + (perms/revoke-data-perms! (perms-group/all-users) (mt/db)) (mt/with-actions-enabled (is (partial= {:message "You don't have permissions to do that."} (mt/user-http-request :rasta :post 403 execute-path {:parameters {"id" 1}}))))) - (testing "With execute rights on the DB" - (perms/update-global-execution-permission! (:id (perms-group/all-users)) :all) + (testing "With read rights on the DB" + (perms/grant-full-data-permissions! (perms-group/all-users) (mt/db)) (try (mt/with-actions-enabled (is (= {:rows-affected 1} (mt/user-http-request :rasta :post 200 execute-path {:parameters {"id" 1}})))) (finally - (perms/update-global-execution-permission! (:id (perms-group/all-users)) :none))))))))))) + (perms/revoke-data-perms! (perms-group/all-users) (mt/db)))))))))))) (deftest dashcard-execution-fetch-prefill-test (mt/test-drivers (mt/normal-drivers-with-feature :actions) @@ -2918,51 +2920,53 @@ (is (partial= {:message "No destination parameter found for #{\"price\"}. Found: #{\"id\" \"name\"}"} (mt/user-http-request :crowberto :post 400 execute-path {:parameters {"id" 1 "name" "Blueberries" "price" 1234}}))))))))))) -(defn- ee-features-enabled? [] - (u/ignore-exceptions - (classloader/require 'metabase-enterprise.advanced-permissions.models.permissions) - (some? (resolve 'metabase-enterprise.advanced-permissions.models.permissions/update-db-execute-permissions!)))) +;; Not relevant for 46; uncomment and make work for 47 +(comment + (defn- ee-features-enabled? [] + (u/ignore-exceptions + (classloader/require 'metabase-enterprise.advanced-permissions.models.permissions) + (some? (resolve 'metabase-enterprise.advanced-permissions.models.permissions/update-db-execute-permissions!)))) -(deftest dashcard-action-execution-granular-auth-test - (when (ee-features-enabled?) - (mt/with-temp-copy-of-db - (mt/with-actions-test-data-and-actions-enabled - (mt/with-actions [{:keys [action-id model-id]} {}] - (testing "Executing dashcard with action" - (mt/with-temp* [Dashboard [{dashboard-id :id}] - DashboardCard [{dashcard-id :id} - {:dashboard_id dashboard-id - :action_id action-id - :card_id model-id}]] - (let [execute-path (format "dashboard/%s/dashcard/%s/execute" - dashboard-id - dashcard-id)] - (testing "with :advanced-permissions feature flag" - (premium-features-test/with-premium-features #{:advanced-permissions} - (testing "for non-magic group" - (mt/with-temp* [PermissionsGroup [{group-id :id}] - PermissionsGroupMembership [_ {:user_id (mt/user->id :rasta) - :group_id group-id}]] - (is (partial= {:message "You don't have permissions to do that."} - (mt/user-http-request :rasta :post 403 execute-path - {:parameters {"id" 1}})) - "Execution permission should be required") - (mt/user-http-request - :crowberto :put 200 "permissions/execution/graph" - (assoc-in (perms/execution-perms-graph) [:groups group-id (mt/id)] :all)) - (is (= :all - (get-in (perms/execution-perms-graph) [:groups group-id (mt/id)])) - "Should be able to set execution permission") - (is (= {:rows-affected 1} - (mt/user-http-request :rasta :post 200 execute-path - {:parameters {"id" 1}})) - "Execution and data permissions should be enough") - - (perms/update-data-perms-graph! [group-id (mt/id) :data] - {:schemas :block}) - (perms/update-data-perms-graph! [(:id (perms-group/all-users)) (mt/id) :data] - {:schemas :block}) - (is (partial= {:message "You don't have permissions to do that."} - (mt/user-http-request :rasta :post 403 execute-path - {:parameters {"id" 1}})) - "Data permissions should be required"))))))))))))) + (deftest dashcard-action-execution-granular-auth-test + (when (ee-features-enabled?) + (mt/with-temp-copy-of-db + (mt/with-actions-test-data-and-actions-enabled + (mt/with-actions [{:keys [action-id model-id]} {}] + (testing "Executing dashcard with action" + (mt/with-temp* [Dashboard [{dashboard-id :id}] + DashboardCard [{dashcard-id :id} + {:dashboard_id dashboard-id + :action_id action-id + :card_id model-id}]] + (let [execute-path (format "dashboard/%s/dashcard/%s/execute" + dashboard-id + dashcard-id)] + (testing "with :advanced-permissions feature flag" + (premium-features-test/with-premium-features #{:advanced-permissions} + (testing "for non-magic group" + (mt/with-temp* [PermissionsGroup [{group-id :id}] + PermissionsGroupMembership [_ {:user_id (mt/user->id :rasta) + :group_id group-id}]] + (is (partial= {:message "You don't have permissions to do that."} + (mt/user-http-request :rasta :post 403 execute-path + {:parameters {"id" 1}})) + "Execution permission should be required") + (mt/user-http-request + :crowberto :put 200 "permissions/execution/graph" + (assoc-in (perms/execution-perms-graph) [:groups group-id (mt/id)] :all)) + (is (= :all + (get-in (perms/execution-perms-graph) [:groups group-id (mt/id)])) + "Should be able to set execution permission") + (is (= {:rows-affected 1} + (mt/user-http-request :rasta :post 200 execute-path + {:parameters {"id" 1}})) + "Execution and data permissions should be enough") + + (perms/update-data-perms-graph! [group-id (mt/id) :data] + {:schemas :block}) + (perms/update-data-perms-graph! [(:id (perms-group/all-users)) (mt/id) :data] + {:schemas :block}) + (is (partial= {:message "You don't have permissions to do that."} + (mt/user-http-request :rasta :post 403 execute-path + {:parameters {"id" 1}})) + "Data permissions should be required"))))))))))))))