diff --git a/app/logical/post_query_builder.rb b/app/logical/post_query_builder.rb index 84db854f1..6d775eb92 100644 --- a/app/logical/post_query_builder.rb +++ b/app/logical/post_query_builder.rb @@ -852,31 +852,30 @@ class PostQueryBuilder when "-fav" favuser = User.find_by_name(g2) - if favuser.hide_favorites? - raise User::PrivilegeError.new + if favuser.nil? || !Pundit.policy!([CurrentUser.user, nil], favuser).can_see_favorites? + raise User::PrivilegeError end - q[:tags][:exclude] << "fav:#{User.name_to_id(g2)}" + q[:tags][:exclude] << "fav:#{favuser.id}" when "fav" favuser = User.find_by_name(g2) - if favuser.hide_favorites? - raise User::PrivilegeError.new + if favuser.nil? || !Pundit.policy!([CurrentUser.user, nil], favuser).can_see_favorites? + raise User::PrivilegeError end - q[:tags][:related] << "fav:#{User.name_to_id(g2)}" + q[:tags][:related] << "fav:#{favuser.id}" when "ordfav" - user_id = User.name_to_id(g2) - favuser = User.find(user_id) + favuser = User.find_by_name(g2) - if favuser.hide_favorites? + if favuser.nil? || !Pundit.policy!([CurrentUser.user, nil], favuser).can_see_favorites? raise User::PrivilegeError.new end - q[:tags][:related] << "fav:#{user_id}" - q[:ordfav] = user_id + q[:tags][:related] << "fav:#{favuser.id}" + q[:ordfav] = favuser.id when "search" q[:saved_searches] ||= [] diff --git a/app/logical/recommender_service.rb b/app/logical/recommender_service.rb index 197025c87..6d84ec1ce 100644 --- a/app/logical/recommender_service.rb +++ b/app/logical/recommender_service.rb @@ -54,7 +54,7 @@ module RecommenderService end if user.present? - raise User::PrivilegeError if user.hide_favorites? + raise User::PrivilegeError unless Pundit.policy!([CurrentUser.user, nil], user).can_see_favorites? max_recommendations = params.fetch(:max_recommendations, user.favorite_count + 500).to_i.clamp(0, 50000) recs = RecommenderService.recommend_for_user(user, tags: params[:post_tags_match], limit: max_recommendations) elsif post.present? diff --git a/app/models/post.rb b/app/models/post.rb index 6a0a0e8b8..951e83fab 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -956,7 +956,9 @@ class Post < ApplicationRecord # users who favorited this post, ordered by users who favorited it first def favorited_users favorited_user_ids = fav_string.scan(/\d+/).map(&:to_i) - visible_users = User.find(favorited_user_ids).reject(&:hide_favorites?) + visible_users = User.find(favorited_user_ids).select do |user| + Pundit.policy!([CurrentUser.user, nil], user).can_see_favorites? + end ordered_users = visible_users.index_by(&:id).slice(*favorited_user_ids).values ordered_users end diff --git a/app/models/user.rb b/app/models/user.rb index 15f54232d..605c3e572 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -673,10 +673,6 @@ class User < ApplicationRecord include CountMethods extend SearchMethods - def hide_favorites? - !CurrentUser.is_admin? && enable_private_favorites? && CurrentUser.user.id != id - end - def initialize_attributes self.enable_post_navigation = true self.new_post_navigation_layout = true diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb index 7f600efb2..057141ab1 100644 --- a/app/policies/user_policy.rb +++ b/app/policies/user_policy.rb @@ -23,6 +23,10 @@ class UserPolicy < ApplicationPolicy user.is_member? end + def can_see_favorites? + user.is_admin? || record.id == user.id || !record.enable_private_favorites? + end + def permitted_attributes_for_create [:name, :password, :password_confirmation, { email_address_attributes: [:address] }] end diff --git a/app/views/users/_post_summary.html.erb b/app/views/users/_post_summary.html.erb index 3b85ade65..208a237ca 100644 --- a/app/views/users/_post_summary.html.erb +++ b/app/views/users/_post_summary.html.erb @@ -11,7 +11,7 @@ <% end %> -<% if presenter.has_favorites? && !user.hide_favorites? %> +<% if presenter.has_favorites? && policy(user).can_see_favorites? %>

<%= link_to "Favorites", posts_path(tags: "ordfav:#{user.name}") %> diff --git a/test/functional/recommended_posts_controller_test.rb b/test/functional/recommended_posts_controller_test.rb index 45e4dc4cd..153123a76 100644 --- a/test/functional/recommended_posts_controller_test.rb +++ b/test/functional/recommended_posts_controller_test.rb @@ -36,6 +36,12 @@ class RecommendedPostsControllerTest < ActionDispatch::IntegrationTest assert_select ".recommended-posts" assert_select ".recommended-posts #post_#{@post.id}" end + + should "not show recommendations for users with private favorites to other users" do + @other_user = create(:user, enable_private_favorites: true) + get_auth recommended_posts_path(search: { user_id: @other_user.id }), @user + assert_response 403 + end end end end