From 23dde589c99165499348b9d08ba049cda5b4839f Mon Sep 17 00:00:00 2001 From: Jeremy Lenz Date: Mon, 6 Nov 2023 18:06:24 -0500 Subject: [PATCH] Fixes #36892 - Pass host results to REX slot; allow root node permissions to be extended Refs #36892 - improvements to regex & index layout --- app/controllers/api/v2/base_controller.rb | 16 +++++++++++++++- app/views/api/v2/layouts/index_layout.json.erb | 3 +-- .../api/v2/base_controller_subclass_test.rb | 12 ++++++++++++ .../react_app/components/HostsIndex/index.js | 3 ++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/v2/base_controller.rb b/app/controllers/api/v2/base_controller.rb index de48ea0ac91d..e711cee84ff6 100644 --- a/app/controllers/api/v2/base_controller.rb +++ b/app/controllers/api/v2/base_controller.rb @@ -47,7 +47,7 @@ class BaseController < Api::BaseController layout 'api/v2/layouts/index_layout', :only => :index helper_method :root_node_name, :metadata_total, :metadata_subtotal, :metadata_search, - :metadata_order, :metadata_by, :metadata_page, :metadata_per_page + :metadata_order, :metadata_by, :metadata_page, :metadata_per_page, :index_node_permissions_snippet def root_node_name @root_node_name ||= if Rabl.configuration.use_controller_name_as_json_root controller_name.split('/').last @@ -58,6 +58,20 @@ def root_node_name end end + # may be extended by plugins to add additional permissions + def index_node_permissions + { + :can_create => can_create?, + :can_edit => authorized_for(:controller => controller_name, :action => 'edit'), + } + end + + def index_node_permissions_snippet + # Remove the characters '{' from the beginning and '}' from the end of the string + # The {1}'s are to only remove one character from each end. + index_node_permissions.to_json.gsub(/\A{{1}|}{1}\z/, '') + end + def metadata_total @total ||= resource_scope.try(:size).to_i end diff --git a/app/views/api/v2/layouts/index_layout.json.erb b/app/views/api/v2/layouts/index_layout.json.erb index 3c056c97e1ce..105bd5a2fb8e 100644 --- a/app/views/api/v2/layouts/index_layout.json.erb +++ b/app/views/api/v2/layouts/index_layout.json.erb @@ -5,8 +5,7 @@ "per_page": <%= metadata_per_page.to_json %>, "search": <%= metadata_search.to_json.html_safe %>, <% if params.has_key?(:include_permissions) %> - "can_create": <%= can_create?.to_json %>, - "can_edit": <%= can_edit?.to_json %>, + <%= index_node_permissions_snippet.html_safe %>, <% end %> "sort": { "by": <%= metadata_by.to_json.html_safe %>, diff --git a/test/controllers/api/v2/base_controller_subclass_test.rb b/test/controllers/api/v2/base_controller_subclass_test.rb index 3e711c07b70a..b7acd1f2bc7f 100644 --- a/test/controllers/api/v2/base_controller_subclass_test.rb +++ b/test/controllers/api/v2/base_controller_subclass_test.rb @@ -129,4 +129,16 @@ def setup msg << "There may be more information in the server's logs." assert_equal JSON.parse(response.body)['error']['message'], msg end + + test "adds permissions to index node" do + @controller.stubs(:index_node_permissions).returns({:test_permission => true}) + result = @controller.index_node_permissions_snippet + assert_equal result, "\"test_permission\":true" + end + + test "correctly handles nested hashes in index_node_permissions" do + @controller.stubs(:index_node_permissions).returns({:test_permission => {:nested => true}}) + result = @controller.index_node_permissions_snippet + assert_equal result, "\"test_permission\":{\"nested\":true}" + end end diff --git a/webpack/assets/javascripts/react_app/components/HostsIndex/index.js b/webpack/assets/javascripts/react_app/components/HostsIndex/index.js index 5df6b4056a8c..5ca064561d50 100644 --- a/webpack/assets/javascripts/react_app/components/HostsIndex/index.js +++ b/webpack/assets/javascripts/react_app/components/HostsIndex/index.js @@ -213,7 +213,8 @@ const HostsIndex = () => {