From c0dfaf98ac60fc928a2df5f7f355b262f0fcaf91 Mon Sep 17 00:00:00 2001 From: Reuben Pereira Date: Sat, 30 Jun 2018 14:47:03 +0530 Subject: A working implementation of a project reference filter which links project references to project profile. --- lib/banzai/reference_parser/project_parser.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 lib/banzai/reference_parser/project_parser.rb (limited to 'lib/banzai/reference_parser/project_parser.rb') diff --git a/lib/banzai/reference_parser/project_parser.rb b/lib/banzai/reference_parser/project_parser.rb new file mode 100644 index 00000000000..54fd3c38a85 --- /dev/null +++ b/lib/banzai/reference_parser/project_parser.rb @@ -0,0 +1,17 @@ +module Banzai + module ReferenceParser + class ProjectParser < BaseParser + self.reference_type = :project + + def references_relation + Project + end + + private + + def can_read_reference?(user, ref_project, node) + can?(user, :read_project, ref_project) + end + end + end +end -- cgit v1.2.1 From 2730ae1d869af4ddd48dc312d230c1bcafec19b5 Mon Sep 17 00:00:00 2001 From: Reuben Pereira Date: Thu, 5 Jul 2018 01:26:09 +0530 Subject: Use a custom ProjectParser#nodes_visible_to_user function so that the user permissions for all project references can be checked together --- lib/banzai/reference_parser/project_parser.rb | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'lib/banzai/reference_parser/project_parser.rb') diff --git a/lib/banzai/reference_parser/project_parser.rb b/lib/banzai/reference_parser/project_parser.rb index 54fd3c38a85..787cb671b2d 100644 --- a/lib/banzai/reference_parser/project_parser.rb +++ b/lib/banzai/reference_parser/project_parser.rb @@ -7,10 +7,29 @@ module Banzai Project end + def nodes_visible_to_user(user, nodes) + nodes_projects_hash = lazy { projects_for_nodes(nodes) } + project_attr = 'data-project' + + readable_project_ids = projects_readable_by_user(nodes_projects_hash.values, user) + + nodes.select do |node| + if node.has_attribute?(project_attr) + readable_project_ids.include?(nodes_projects_hash[node].try(:id)) + else + true + end + end + end + private - def can_read_reference?(user, ref_project, node) - can?(user, :read_project, ref_project) + # Returns an Array of Project ids that can be read by the given user. + # + # projects - The projects to reduce down to those readable by the user. + # user - The User for which to check the projects + def projects_readable_by_user(projects, user) + Project.public_or_visible_to_user(user).where("projects.id IN (?)", projects.collect(&:id)).pluck(:id) end end end -- cgit v1.2.1 From a08b5144fe64cf7afde116334c91e95f54c9f4fb Mon Sep 17 00:00:00 2001 From: Reuben Pereira Date: Thu, 5 Jul 2018 21:13:46 +0530 Subject: Use map instead of collect in the ProjectParser#projects_readable_by_user function --- lib/banzai/reference_parser/project_parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/banzai/reference_parser/project_parser.rb') diff --git a/lib/banzai/reference_parser/project_parser.rb b/lib/banzai/reference_parser/project_parser.rb index 787cb671b2d..2bf02e3df53 100644 --- a/lib/banzai/reference_parser/project_parser.rb +++ b/lib/banzai/reference_parser/project_parser.rb @@ -29,7 +29,7 @@ module Banzai # projects - The projects to reduce down to those readable by the user. # user - The User for which to check the projects def projects_readable_by_user(projects, user) - Project.public_or_visible_to_user(user).where("projects.id IN (?)", projects.collect(&:id)).pluck(:id) + Project.public_or_visible_to_user(user).where("projects.id IN (?)", projects.map(&:id)).pluck(:id) end end end -- cgit v1.2.1 From 8cc646fa0ec05820c83a163df74605f04c8877ea Mon Sep 17 00:00:00 2001 From: Reuben Pereira Date: Sun, 15 Jul 2018 17:25:04 +0530 Subject: Remove nodes_visible_to_user from ProjectParser and memoize readable_project_ids --- lib/banzai/reference_parser/project_parser.rb | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) (limited to 'lib/banzai/reference_parser/project_parser.rb') diff --git a/lib/banzai/reference_parser/project_parser.rb b/lib/banzai/reference_parser/project_parser.rb index 2bf02e3df53..a329af42681 100644 --- a/lib/banzai/reference_parser/project_parser.rb +++ b/lib/banzai/reference_parser/project_parser.rb @@ -1,35 +1,28 @@ module Banzai module ReferenceParser class ProjectParser < BaseParser + include Gitlab::Utils::StrongMemoize + self.reference_type = :project def references_relation Project end - def nodes_visible_to_user(user, nodes) - nodes_projects_hash = lazy { projects_for_nodes(nodes) } - project_attr = 'data-project' - - readable_project_ids = projects_readable_by_user(nodes_projects_hash.values, user) - - nodes.select do |node| - if node.has_attribute?(project_attr) - readable_project_ids.include?(nodes_projects_hash[node].try(:id)) - else - true - end - end - end - private # Returns an Array of Project ids that can be read by the given user. # # projects - The projects to reduce down to those readable by the user. # user - The User for which to check the projects - def projects_readable_by_user(projects, user) - Project.public_or_visible_to_user(user).where("projects.id IN (?)", projects.map(&:id)).pluck(:id) + def readable_project_ids_for(projects, user) + strong_memoize(:readable_project_ids_for) do + Project.public_or_visible_to_user(user).where("projects.id IN (?)", projects.map(&:id)).pluck(:id) + end + end + + def can_read_reference?(user, ref_project, node) + readable_project_ids_for(@projects_for_nodes.values, user).include?(ref_project.try(:id)) end end end -- cgit v1.2.1 From 34e912b538b54619920b714b5177798597758808 Mon Sep 17 00:00:00 2001 From: Reuben Pereira Date: Tue, 31 Jul 2018 00:48:59 +0530 Subject: Use a hash to memoize readable_project_ids with user objects as keys --- lib/banzai/reference_parser/project_parser.rb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'lib/banzai/reference_parser/project_parser.rb') diff --git a/lib/banzai/reference_parser/project_parser.rb b/lib/banzai/reference_parser/project_parser.rb index a329af42681..2a33b00ddbd 100644 --- a/lib/banzai/reference_parser/project_parser.rb +++ b/lib/banzai/reference_parser/project_parser.rb @@ -13,16 +13,15 @@ module Banzai # Returns an Array of Project ids that can be read by the given user. # - # projects - The projects to reduce down to those readable by the user. # user - The User for which to check the projects - def readable_project_ids_for(projects, user) - strong_memoize(:readable_project_ids_for) do - Project.public_or_visible_to_user(user).where("projects.id IN (?)", projects.map(&:id)).pluck(:id) - end + def readable_project_ids_for(user) + @project_ids_by_user ||= {} + @project_ids_by_user[user] ||= + Project.public_or_visible_to_user(user).where("projects.id IN (?)", @projects_for_nodes.values.map(&:id)).pluck(:id) end def can_read_reference?(user, ref_project, node) - readable_project_ids_for(@projects_for_nodes.values, user).include?(ref_project.try(:id)) + readable_project_ids_for(user).include?(ref_project.try(:id)) end end end -- cgit v1.2.1 From ad8158e460d04e9cf97f255daf26379a81bdda89 Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Fri, 10 Aug 2018 12:41:01 +0100 Subject: Add frozen_string_literal to recently-added files from the community --- lib/banzai/reference_parser/project_parser.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/banzai/reference_parser/project_parser.rb') diff --git a/lib/banzai/reference_parser/project_parser.rb b/lib/banzai/reference_parser/project_parser.rb index 2a33b00ddbd..b4e3a55b4f1 100644 --- a/lib/banzai/reference_parser/project_parser.rb +++ b/lib/banzai/reference_parser/project_parser.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Banzai module ReferenceParser class ProjectParser < BaseParser -- cgit v1.2.1