12db4cc0e7
Fix missing Note access checks in by moving Note#search to updated NoteFinder Split from !2024 to partially solve https://gitlab.com/gitlab-org/gitlab-ce/issues/23867 ## Which fixes are in this MR? ⚠️ - Potentially untested 💣 - No test coverage 🚥 - Test coverage of some sort exists (a test failed when error raised) 🚦 - Test coverage of return value (a test failed when nil used) ✅ - Permissions check tested ### Note lookup without access check - [x] ✅ app/finders/notes_finder.rb:13 :download_code check - [x] ✅ app/finders/notes_finder.rb:19 `SnippetsFinder` - [x] ✅ app/models/note.rb:121 [`Issue#visible_to_user`] - [x] ✅ lib/gitlab/project_search_results.rb:113 - This is the only use of `app/models/note.rb:121` above, but importantly has no access checks at all. This means it leaks MR comments and snippets when those features are `team-only` in addition to the issue comments which would be fixed by `app/models/note.rb:121`. - It is only called from SearchController where `can?(current_user, :download_code, @project)` is checked, so commit comments are not leaked. ### Previous discussions - [x] https://dev.gitlab.org/gitlab/gitlabhq/merge_requests/2024/diffs#b915c5267a63628b0bafd23d37792ae73ceae272_13_13 `: download_code` check on commit - [x] https://dev.gitlab.org/gitlab/gitlabhq/merge_requests/2024/diffs#b915c5267a63628b0bafd23d37792ae73ceae272_19_19 `SnippetsFinder` should be used - `SnippetsFinder` should check if the snippets feature is enabled -> https://gitlab.com/gitlab-org/gitlab-ce/issues/25223 ### Acceptance criteria met? - [x] Tests added for new code - [x] TODO comments removed - [x] Squashed and removed skipped tests - [x] Changelog entry - [ ] State Gitlab versions affected and issue severity in description - [ ] Create technical debt issue for NotesFinder. - Either split into `NotesFinder::ForTarget` and `NotesFinder::Search` or consider object per notable type such as `NotesFinder::OnIssue`. For the first option could create `NotesFinder::Base` which is either inherited from or which can be included in the other two. - Avoid case statement anti-pattern in this finder with use of `NotesFinder::OnCommit` etc. Consider something on the finder for this? `Model.finder(user, project)` - Move `inc_author` to the controller, and implement `related_notes` to replace `non_diff_notes`/`mr_and_commit_notes` See merge request !2035
89 lines
2.3 KiB
Ruby
89 lines
2.3 KiB
Ruby
require_relative '../support/repo_helpers'
|
|
|
|
include ActionDispatch::TestProcess
|
|
|
|
FactoryGirl.define do
|
|
factory :note do
|
|
project
|
|
note "Note"
|
|
author
|
|
on_issue
|
|
|
|
factory :note_on_commit, traits: [:on_commit]
|
|
factory :note_on_issue, traits: [:on_issue], aliases: [:votable_note]
|
|
factory :note_on_merge_request, traits: [:on_merge_request]
|
|
factory :note_on_project_snippet, traits: [:on_project_snippet]
|
|
factory :system_note, traits: [:system]
|
|
|
|
factory :legacy_diff_note_on_commit, traits: [:on_commit, :legacy_diff_note], class: LegacyDiffNote
|
|
factory :legacy_diff_note_on_merge_request, traits: [:on_merge_request, :legacy_diff_note], class: LegacyDiffNote
|
|
|
|
factory :diff_note_on_merge_request, traits: [:on_merge_request], class: DiffNote do
|
|
position do
|
|
Gitlab::Diff::Position.new(
|
|
old_path: "files/ruby/popen.rb",
|
|
new_path: "files/ruby/popen.rb",
|
|
old_line: nil,
|
|
new_line: 14,
|
|
diff_refs: noteable.diff_refs
|
|
)
|
|
end
|
|
|
|
trait :resolved do
|
|
resolved_at { Time.now }
|
|
resolved_by { create(:user) }
|
|
end
|
|
end
|
|
|
|
factory :diff_note_on_commit, traits: [:on_commit], class: DiffNote do
|
|
position do
|
|
Gitlab::Diff::Position.new(
|
|
old_path: "files/ruby/popen.rb",
|
|
new_path: "files/ruby/popen.rb",
|
|
old_line: nil,
|
|
new_line: 14,
|
|
diff_refs: project.commit(commit_id).try(:diff_refs)
|
|
)
|
|
end
|
|
end
|
|
|
|
trait :on_commit do
|
|
noteable nil
|
|
noteable_type 'Commit'
|
|
noteable_id nil
|
|
commit_id RepoHelpers.sample_commit.id
|
|
end
|
|
|
|
trait :legacy_diff_note do
|
|
line_code "0_184_184"
|
|
end
|
|
|
|
trait :on_issue do
|
|
noteable { create(:issue, project: project) }
|
|
end
|
|
|
|
trait :on_merge_request do
|
|
noteable { create(:merge_request, source_project: project) }
|
|
end
|
|
|
|
trait :on_project_snippet do
|
|
noteable { create(:project_snippet, project: project) }
|
|
end
|
|
|
|
trait :system do
|
|
system true
|
|
end
|
|
|
|
trait :downvote do
|
|
note "thumbsdown"
|
|
end
|
|
|
|
trait :upvote do
|
|
note "thumbsup"
|
|
end
|
|
|
|
trait :with_attachment do
|
|
attachment { fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "`/png") }
|
|
end
|
|
end
|
|
end
|