SECURITY: only show restricted tag lists to authorized users (#20004)

Co-authored-by: Penar Musaraj <pmusaraj@gmail.com>
This commit is contained in:
Bianca Nenciu 2023-01-25 18:55:55 +02:00 committed by GitHub
parent 6d92c3cbda
commit 105fee978d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 1 deletions

View File

@ -5,12 +5,13 @@ class TagsController < ::ApplicationController
include TopicQueryParams include TopicQueryParams
before_action :ensure_tags_enabled before_action :ensure_tags_enabled
before_action :ensure_visible, only: %i[show info]
def self.show_methods def self.show_methods
Discourse.anonymous_filters.map { |f| :"show_#{f}" } Discourse.anonymous_filters.map { |f| :"show_#{f}" }
end end
before_action :ensure_visible, only: [:show, :info, *show_methods]
requires_login except: [:index, :show, :tag_feed, :search, :info, *show_methods] requires_login except: [:index, :show, :tag_feed, :search, :info, *show_methods]
skip_before_action :check_xhr, only: [:tag_feed, :show, :index, *show_methods] skip_before_action :check_xhr, only: [:tag_feed, :show, :index, *show_methods]

View File

@ -676,6 +676,18 @@ RSpec.describe TagsController do
expect(response.status).to eq(200) expect(response.status).to eq(200)
end end
it "returns a 404 when tag is restricted" do
tag_group = Fabricate(:tag_group, permissions: { "staff" => 1 }, tag_names: ["test"])
get "/tag/test/l/latest.json"
expect(response.status).to eq(404)
sign_in(admin)
get "/tag/test/l/latest.json"
expect(response.status).to eq(200)
end
context "with muted tags" do context "with muted tags" do
before do before do
TagUser.create!( TagUser.create!(
@ -755,6 +767,18 @@ RSpec.describe TagsController do
get "/tag/#{tag.name}/l/top.json?period=decadely" get "/tag/#{tag.name}/l/top.json?period=decadely"
expect(response.status).to eq(400) expect(response.status).to eq(400)
end end
it "returns a 404 if tag is restricted" do
tag_group = Fabricate(:tag_group, permissions: { "staff" => 1 }, tag_names: ["test"])
get "/tag/test/l/top.json"
expect(response.status).to eq(404)
sign_in(admin)
get "/tag/test/l/top.json"
expect(response.status).to eq(200)
end
end end
describe "#search" do describe "#search" do