diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 09:45:46 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-02-18 09:45:46 +0000 |
commit | a7b3560714b4d9cc4ab32dffcd1f74a284b93580 (patch) | |
tree | 7452bd5c3545c2fa67a28aa013835fb4fa071baf /app/models/note.rb | |
parent | ee9173579ae56a3dbfe5afe9f9410c65bb327ca7 (diff) | |
download | gitlab-ce-a7b3560714b4d9cc4ab32dffcd1f74a284b93580.tar.gz |
Add latest changes from gitlab-org/gitlab@14-8-stable-eev14.8.0-rc42
Diffstat (limited to 'app/models/note.rb')
-rw-r--r-- | app/models/note.rb | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/app/models/note.rb b/app/models/note.rb index a143c21c0f9..3f3fa968393 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -27,10 +27,14 @@ class Note < ApplicationRecord redact_field :note - TYPES_RESTRICTED_BY_ABILITY = { + TYPES_RESTRICTED_BY_PROJECT_ABILITY = { branch: :download_code }.freeze + TYPES_RESTRICTED_BY_GROUP_ABILITY = { + contact: :read_crm_contact + }.freeze + # Aliases to make application_helper#edited_time_ago_with_tooltip helper work properly with notes. # See https://gitlab.com/gitlab-org/gitlab-foss/merge_requests/10392/diffs#note_28719102 alias_attribute :last_edited_by, :updated_by @@ -119,7 +123,7 @@ class Note < ApplicationRecord scope :inc_author, -> { includes(:author) } scope :with_api_entity_associations, -> { preload(:note_diff_file, :author) } scope :inc_relations_for_view, -> do - includes(:project, { author: :status }, :updated_by, :resolved_by, :award_emoji, + includes({ project: :group }, { author: :status }, :updated_by, :resolved_by, :award_emoji, { system_note_metadata: :description_version }, :note_diff_file, :diff_note_positions, :suggestions) end @@ -565,10 +569,10 @@ class Note < ApplicationRecord noteable.user_mentions.where(note: self) end - def system_note_with_references_visible_for?(user) + def system_note_visible_for?(user) return true unless system? - (!system_note_with_references? || all_referenced_mentionables_allowed?(user)) && system_note_viewable_by?(user) + system_note_viewable_by?(user) && all_referenced_mentionables_allowed?(user) end def parent_user @@ -617,10 +621,17 @@ class Note < ApplicationRecord def system_note_viewable_by?(user) return true unless system_note_metadata - restriction = TYPES_RESTRICTED_BY_ABILITY[system_note_metadata.action.to_sym] - return Ability.allowed?(user, restriction, project) if restriction + system_note_viewable_by_project_ability?(user) && system_note_viewable_by_group_ability?(user) + end - true + def system_note_viewable_by_project_ability?(user) + project_restriction = TYPES_RESTRICTED_BY_PROJECT_ABILITY[system_note_metadata.action.to_sym] + !project_restriction || Ability.allowed?(user, project_restriction, project) + end + + def system_note_viewable_by_group_ability?(user) + group_restriction = TYPES_RESTRICTED_BY_GROUP_ABILITY[system_note_metadata.action.to_sym] + !group_restriction || Ability.allowed?(user, group_restriction, project&.group) end def keep_around_commit @@ -646,6 +657,8 @@ class Note < ApplicationRecord end def all_referenced_mentionables_allowed?(user) + return true unless system_note_with_references? + if user_visible_reference_count.present? && total_reference_count.present? # if they are not equal, then there are private/confidential references as well user_visible_reference_count > 0 && user_visible_reference_count == total_reference_count |