Commit 766d8733 authored by Alex Pooley's avatar Alex Pooley Committed by Jan Provaznik

Align project and personal snippet abilities

Mostly a search and replace for *_project_snippet and *_personal_snippet
abilities across app and spec files. Replaced with just *_snippet and
falling back on the type of subject to determine which policies to
apply.

There are some less trivial changes included which relate to inferring
an abilities name from the subject class. Because ProjectSnippet is a
child of Snippet there is some special handling around the place. There
is perhaps potential to clean this up a bit as there is the same logic
spread out in various locations.

Various changes required after review

- Renamed before_action names
- Fixed snippet note mailer with spec
- Removed incorrect/unecessary policy parameter
- Fix personal snippet note policy spec
parent e1f85bb4
...@@ -15,17 +15,17 @@ class Projects::SnippetsController < Projects::ApplicationController ...@@ -15,17 +15,17 @@ class Projects::SnippetsController < Projects::ApplicationController
before_action :check_snippets_available! before_action :check_snippets_available!
before_action :snippet, only: [:show, :edit, :destroy, :update, :raw, :toggle_award_emoji, :mark_as_spam] before_action :snippet, only: [:show, :edit, :destroy, :update, :raw, :toggle_award_emoji, :mark_as_spam]
# Allow read any snippet # Allow create snippet
before_action :authorize_read_project_snippet!, except: [:new, :create, :index] before_action :authorize_create_snippet!, only: [:new, :create]
# Allow write(create) snippet # Allow read any snippet
before_action :authorize_create_project_snippet!, only: [:new, :create] before_action :authorize_read_snippet!, except: [:new, :create, :index]
# Allow modify snippet # Allow modify snippet
before_action :authorize_update_project_snippet!, only: [:edit, :update] before_action :authorize_update_snippet!, only: [:edit, :update]
# Allow destroy snippet # Allow destroy snippet
before_action :authorize_admin_project_snippet!, only: [:destroy] before_action :authorize_admin_snippet!, only: [:destroy]
respond_to :html respond_to :html
...@@ -115,16 +115,16 @@ class Projects::SnippetsController < Projects::ApplicationController ...@@ -115,16 +115,16 @@ class Projects::SnippetsController < Projects::ApplicationController
project_snippet_path(@project, @snippet) project_snippet_path(@project, @snippet)
end end
def authorize_read_project_snippet! def authorize_read_snippet!
return render_404 unless can?(current_user, :read_project_snippet, @snippet) return render_404 unless can?(current_user, :read_snippet, @snippet)
end end
def authorize_update_project_snippet! def authorize_update_snippet!
return render_404 unless can?(current_user, :update_project_snippet, @snippet) return render_404 unless can?(current_user, :update_snippet, @snippet)
end end
def authorize_admin_project_snippet! def authorize_admin_snippet!
return render_404 unless can?(current_user, :admin_project_snippet, @snippet) return render_404 unless can?(current_user, :admin_snippet, @snippet)
end end
def snippet_params def snippet_params
......
...@@ -33,7 +33,7 @@ class Snippets::NotesController < ApplicationController ...@@ -33,7 +33,7 @@ class Snippets::NotesController < ApplicationController
end end
def authorize_read_snippet! def authorize_read_snippet!
return render_404 unless can?(current_user, :read_personal_snippet, snippet) return render_404 unless can?(current_user, :read_snippet, snippet)
end end
def authorize_create_note! def authorize_create_note!
......
...@@ -126,7 +126,7 @@ class SnippetsController < ApplicationController ...@@ -126,7 +126,7 @@ class SnippetsController < ApplicationController
end end
def authorize_read_snippet! def authorize_read_snippet!
return if can?(current_user, :read_personal_snippet, @snippet) return if can?(current_user, :read_snippet, @snippet)
if current_user if current_user
render_404 render_404
...@@ -136,15 +136,15 @@ class SnippetsController < ApplicationController ...@@ -136,15 +136,15 @@ class SnippetsController < ApplicationController
end end
def authorize_update_snippet! def authorize_update_snippet!
return render_404 unless can?(current_user, :update_personal_snippet, @snippet) return render_404 unless can?(current_user, :update_snippet, @snippet)
end end
def authorize_admin_snippet! def authorize_admin_snippet!
return render_404 unless can?(current_user, :admin_personal_snippet, @snippet) return render_404 unless can?(current_user, :admin_snippet, @snippet)
end end
def authorize_create_snippet! def authorize_create_snippet!
return render_404 unless can?(current_user, :create_personal_snippet) return render_404 unless can?(current_user, :create_snippet)
end end
def snippet_params def snippet_params
......
...@@ -41,6 +41,8 @@ class UploadsController < ApplicationController ...@@ -41,6 +41,8 @@ class UploadsController < ApplicationController
case model case model
when Note when Note
can?(current_user, :read_project, model.project) can?(current_user, :read_project, model.project)
when Snippet, ProjectSnippet
can?(current_user, :read_snippet, model)
when User when User
# We validate the current user has enough (writing) # We validate the current user has enough (writing)
# access to itself when a secret is given. # access to itself when a secret is given.
......
...@@ -67,11 +67,11 @@ module Mutations ...@@ -67,11 +67,11 @@ module Mutations
end end
def authorized_resource?(project) def authorized_resource?(project)
Ability.allowed?(context[:current_user], :create_project_snippet, project) Ability.allowed?(context[:current_user], :create_snippet, project)
end end
def can_create_personal_snippet? def can_create_personal_snippet?
Ability.allowed?(context[:current_user], :create_personal_snippet) Ability.allowed?(context[:current_user], :create_snippet)
end end
end end
end end
......
...@@ -21,7 +21,7 @@ module Types ...@@ -21,7 +21,7 @@ module Types
permission_field :create_snippet permission_field :create_snippet
def create_snippet def create_snippet
Ability.allowed?(context[:current_user], :create_project_snippet, object) Ability.allowed?(context[:current_user], :create_snippet, object)
end end
end end
end end
......
...@@ -8,7 +8,7 @@ module Types ...@@ -8,7 +8,7 @@ module Types
permission_field :create_snippet permission_field :create_snippet
def create_snippet def create_snippet
Ability.allowed?(context[:current_user], :create_personal_snippet) Ability.allowed?(context[:current_user], :create_snippet)
end end
end end
end end
......
...@@ -425,7 +425,7 @@ module ProjectsHelper ...@@ -425,7 +425,7 @@ module ProjectsHelper
{ {
environments: :read_environment, environments: :read_environment,
milestones: :read_milestone, milestones: :read_milestone,
snippets: :read_project_snippet, snippets: :read_snippet,
settings: :admin_project, settings: :admin_project,
builds: :read_build, builds: :read_build,
clusters: :read_cluster, clusters: :read_cluster,
...@@ -443,7 +443,7 @@ module ProjectsHelper ...@@ -443,7 +443,7 @@ module ProjectsHelper
blobs: :download_code, blobs: :download_code,
commits: :download_code, commits: :download_code,
merge_requests: :read_merge_request, merge_requests: :read_merge_request,
notes: [:read_merge_request, :download_code, :read_issue, :read_project_snippet], notes: [:read_merge_request, :download_code, :read_issue, :read_snippet],
members: :read_project_member members: :read_project_member
) )
end end
......
...@@ -26,19 +26,17 @@ module Emails ...@@ -26,19 +26,17 @@ module Emails
mail_answer_note_thread(@merge_request, @note, note_thread_options(recipient_id, reason)) mail_answer_note_thread(@merge_request, @note, note_thread_options(recipient_id, reason))
end end
def note_project_snippet_email(recipient_id, note_id, reason = nil) def note_snippet_email(recipient_id, note_id, reason = nil)
setup_note_mail(note_id, recipient_id) setup_note_mail(note_id, recipient_id)
@snippet = @note.noteable @snippet = @note.noteable
@target_url = project_snippet_url(*note_target_url_options)
mail_answer_note_thread(@snippet, @note, note_thread_options(recipient_id, reason))
end
def note_personal_snippet_email(recipient_id, note_id, reason = nil) case @snippet
setup_note_mail(note_id, recipient_id) when ProjectSnippet
@target_url = project_snippet_url(*note_target_url_options)
when Snippet
@target_url = gitlab_snippet_url(@note.noteable)
end
@snippet = @note.noteable
@target_url = gitlab_snippet_url(@note.noteable)
mail_answer_note_thread(@snippet, @note, note_thread_options(recipient_id, reason)) mail_answer_note_thread(@snippet, @note, note_thread_options(recipient_id, reason))
end end
......
...@@ -24,7 +24,7 @@ class Ability ...@@ -24,7 +24,7 @@ class Ability
# read the given snippet. # read the given snippet.
def users_that_can_read_personal_snippet(users, snippet) def users_that_can_read_personal_snippet(users, snippet)
DeclarativePolicy.subject_scope do DeclarativePolicy.subject_scope do
users.select { |u| allowed?(u, :read_personal_snippet, snippet) } users.select { |u| allowed?(u, :read_snippet, snippet) }
end end
end end
......
...@@ -145,10 +145,8 @@ class Event < ApplicationRecord ...@@ -145,10 +145,8 @@ class Event < ApplicationRecord
Ability.allowed?(user, :read_issue, note? ? note_target : target) Ability.allowed?(user, :read_issue, note? ? note_target : target)
elsif merge_request? || merge_request_note? elsif merge_request? || merge_request_note?
Ability.allowed?(user, :read_merge_request, note? ? note_target : target) Ability.allowed?(user, :read_merge_request, note? ? note_target : target)
elsif personal_snippet_note? elsif personal_snippet_note? || project_snippet_note?
Ability.allowed?(user, :read_personal_snippet, note_target) Ability.allowed?(user, :read_snippet, note_target)
elsif project_snippet_note?
Ability.allowed?(user, :read_project_snippet, note_target)
elsif milestone? elsif milestone?
Ability.allowed?(user, :read_milestone, project) Ability.allowed?(user, :read_milestone, project)
else else
......
...@@ -367,7 +367,7 @@ class Note < ApplicationRecord ...@@ -367,7 +367,7 @@ class Note < ApplicationRecord
end end
def noteable_ability_name def noteable_ability_name
for_snippet? ? noteable.class.name.underscore : noteable_type.demodulize.underscore for_snippet? ? 'snippet' : noteable_type.demodulize.underscore
end end
def can_be_discussion_note? def can_be_discussion_note?
......
...@@ -2274,7 +2274,7 @@ class Project < ApplicationRecord ...@@ -2274,7 +2274,7 @@ class Project < ApplicationRecord
end end
def snippets_visible?(user = nil) def snippets_visible?(user = nil)
Ability.allowed?(user, :read_project_snippet, self) Ability.allowed?(user, :read_snippet, self)
end end
def max_attachment_size def max_attachment_size
......
...@@ -215,9 +215,7 @@ class Snippet < ApplicationRecord ...@@ -215,9 +215,7 @@ class Snippet < ApplicationRecord
end end
def embeddable? def embeddable?
ability = project_id? ? :read_project_snippet : :read_personal_snippet Ability.allowed?(nil, :read_snippet, self)
Ability.allowed?(nil, ability, self)
end end
def notes_with_associations def notes_with_associations
...@@ -240,7 +238,7 @@ class Snippet < ApplicationRecord ...@@ -240,7 +238,7 @@ class Snippet < ApplicationRecord
end end
def to_ability_name def to_ability_name
model_name.singular 'snippet'
end end
def valid_secret_token?(token) def valid_secret_token?(token)
......
...@@ -75,7 +75,7 @@ class GlobalPolicy < BasePolicy ...@@ -75,7 +75,7 @@ class GlobalPolicy < BasePolicy
rule { ~anonymous }.policy do rule { ~anonymous }.policy do
enable :read_instance_metadata enable :read_instance_metadata
enable :create_personal_snippet enable :create_snippet
end end
rule { admin }.policy do rule { admin }.policy do
...@@ -83,7 +83,7 @@ class GlobalPolicy < BasePolicy ...@@ -83,7 +83,7 @@ class GlobalPolicy < BasePolicy
enable :update_custom_attribute enable :update_custom_attribute
end end
rule { external_user }.prevent :create_personal_snippet rule { external_user }.prevent :create_snippet
end end
GlobalPolicy.prepend_if_ee('EE::GlobalPolicy') GlobalPolicy.prepend_if_ee('EE::GlobalPolicy')
...@@ -6,19 +6,19 @@ class PersonalSnippetPolicy < BasePolicy ...@@ -6,19 +6,19 @@ class PersonalSnippetPolicy < BasePolicy
condition(:internal_snippet, scope: :subject) { @subject.internal? } condition(:internal_snippet, scope: :subject) { @subject.internal? }
rule { public_snippet }.policy do rule { public_snippet }.policy do
enable :read_personal_snippet enable :read_snippet
enable :create_note enable :create_note
end end
rule { is_author | admin }.policy do rule { is_author | admin }.policy do
enable :read_personal_snippet enable :read_snippet
enable :update_personal_snippet enable :update_snippet
enable :admin_personal_snippet enable :admin_snippet
enable :create_note enable :create_note
end end
rule { internal_snippet & ~external_user }.policy do rule { internal_snippet & ~external_user }.policy do
enable :read_personal_snippet enable :read_snippet
enable :create_note enable :create_note
end end
...@@ -26,8 +26,5 @@ class PersonalSnippetPolicy < BasePolicy ...@@ -26,8 +26,5 @@ class PersonalSnippetPolicy < BasePolicy
rule { can?(:create_note) }.enable :award_emoji rule { can?(:create_note) }.enable :award_emoji
rule { can?(:read_all_resources) }.enable :read_personal_snippet rule { can?(:read_all_resources) }.enable :read_snippet
# Aliasing the ability to ease GraphQL permissions check
rule { can?(:read_personal_snippet) }.enable :read_snippet
end end
...@@ -9,7 +9,7 @@ class ProjectPolicy < BasePolicy ...@@ -9,7 +9,7 @@ class ProjectPolicy < BasePolicy
merge_request merge_request
label label
milestone milestone
project_snippet snippet
wiki wiki
note note
pipeline pipeline
...@@ -185,7 +185,7 @@ class ProjectPolicy < BasePolicy ...@@ -185,7 +185,7 @@ class ProjectPolicy < BasePolicy
enable :read_issue enable :read_issue
enable :read_label enable :read_label
enable :read_milestone enable :read_milestone
enable :read_project_snippet enable :read_snippet
enable :read_project_member enable :read_project_member
enable :read_note enable :read_note
enable :create_project enable :create_project
...@@ -208,7 +208,7 @@ class ProjectPolicy < BasePolicy ...@@ -208,7 +208,7 @@ class ProjectPolicy < BasePolicy
enable :download_code enable :download_code
enable :read_statistics enable :read_statistics
enable :download_wiki_code enable :download_wiki_code
enable :create_project_snippet enable :create_snippet
enable :update_issue enable :update_issue
enable :reopen_issue enable :reopen_issue
enable :admin_issue enable :admin_issue
...@@ -286,8 +286,8 @@ class ProjectPolicy < BasePolicy ...@@ -286,8 +286,8 @@ class ProjectPolicy < BasePolicy
rule { can?(:maintainer_access) }.policy do rule { can?(:maintainer_access) }.policy do
enable :admin_board enable :admin_board
enable :push_to_delete_protected_branch enable :push_to_delete_protected_branch
enable :update_project_snippet enable :update_snippet
enable :admin_project_snippet enable :admin_snippet
enable :admin_project_member enable :admin_project_member
enable :admin_note enable :admin_note
enable :admin_wiki enable :admin_wiki
...@@ -352,7 +352,7 @@ class ProjectPolicy < BasePolicy ...@@ -352,7 +352,7 @@ class ProjectPolicy < BasePolicy
end end
rule { snippets_disabled }.policy do rule { snippets_disabled }.policy do
prevent(*create_read_update_admin_destroy(:project_snippet)) prevent(*create_read_update_admin_destroy(:snippet))
end end
rule { wiki_disabled }.policy do rule { wiki_disabled }.policy do
...@@ -405,7 +405,7 @@ class ProjectPolicy < BasePolicy ...@@ -405,7 +405,7 @@ class ProjectPolicy < BasePolicy
enable :read_wiki enable :read_wiki
enable :read_label enable :read_label
enable :read_milestone enable :read_milestone
enable :read_project_snippet enable :read_snippet
enable :read_project_member enable :read_project_member
enable :read_merge_request enable :read_merge_request
enable :read_note enable :read_note
......
...@@ -14,44 +14,41 @@ class ProjectSnippetPolicy < BasePolicy ...@@ -14,44 +14,41 @@ class ProjectSnippetPolicy < BasePolicy
# We have to check both project feature visibility and a snippet visibility and take the stricter one # We have to check both project feature visibility and a snippet visibility and take the stricter one
# This will be simplified - check https://gitlab.com/gitlab-org/gitlab-foss/issues/27573 # This will be simplified - check https://gitlab.com/gitlab-org/gitlab-foss/issues/27573
rule { ~can?(:read_project) }.policy do rule { ~can?(:read_project) }.policy do
prevent :read_project_snippet prevent :read_snippet
prevent :update_project_snippet prevent :update_snippet
prevent :admin_project_snippet prevent :admin_snippet
end end
# we have to use this complicated prevent because the delegated project policy # we have to use this complicated prevent because the delegated project
# is overly greedy in allowing :read_project_snippet, since it doesn't have any # policy is overly greedy in allowing :read_snippet, since it doesn't have
# information about the snippet. However, :read_project_snippet on the *project* # any information about the snippet. However, :read_snippet on the *project*
# is used to hide/show various snippet-related controls, so we can't just move # is used to hide/show various snippet-related controls, so we can't just
# all of the handling here. # move all of the handling here.
rule do rule do
all?(private_snippet | (internal_snippet & external_user), all?(private_snippet | (internal_snippet & external_user),
~project.guest, ~project.guest,
~is_author, ~is_author,
~can?(:read_all_resources)) ~can?(:read_all_resources))
end.prevent :read_project_snippet end.prevent :read_snippet
rule { internal_snippet & ~is_author & ~admin }.policy do rule { internal_snippet & ~is_author & ~admin }.policy do
prevent :update_project_snippet prevent :update_snippet
prevent :admin_project_snippet prevent :admin_snippet
end end
rule { public_snippet }.enable :read_project_snippet rule { public_snippet }.enable :read_snippet
rule { is_author & ~project.reporter & ~admin }.policy do rule { is_author & ~project.reporter & ~admin }.policy do
prevent :admin_project_snippet prevent :admin_snippet
end end
rule { is_author | admin }.policy do rule { is_author | admin }.policy do
enable :read_project_snippet enable :read_snippet
enable :update_project_snippet enable :update_snippet
enable :admin_project_snippet enable :admin_snippet
end end
rule { ~can?(:read_project_snippet) }.prevent :create_note rule { ~can?(:read_snippet) }.prevent :create_note
# Aliasing the ability to ease GraphQL permissions check
rule { can?(:read_project_snippet) }.enable :read_snippet
end end
ProjectSnippetPolicy.prepend_if_ee('EE::ProjectSnippetPolicy') ProjectSnippetPolicy.prepend_if_ee('EE::ProjectSnippetPolicy')
...@@ -36,9 +36,7 @@ module Snippets ...@@ -36,9 +36,7 @@ module Snippets
attr_reader :snippet attr_reader :snippet
def user_can_delete_snippet? def user_can_delete_snippet?
return can?(current_user, :admin_project_snippet, snippet) if project can?(current_user, :admin_snippet, snippet)
can?(current_user, :admin_personal_snippet, snippet)
end end
def service_response_error(message, http_status) def service_response_error(message, http_status)
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
- if current_user && current_user.snippets.any? || @snippets.any? - if current_user && current_user.snippets.any? || @snippets.any?
.page-title-controls .page-title-controls
- if can?(current_user, :create_personal_snippet) - if can?(current_user, :create_snippet)
= link_to _("New snippet"), new_snippet_path, class: "btn btn-success", title: _("New snippet") = link_to _("New snippet"), new_snippet_path, class: "btn btn-success", title: _("New snippet")
.top-area .top-area
......
- @hide_top_links = true - @hide_top_links = true
- page_title "Snippets" - page_title "Snippets"
- header_title "Snippets", dashboard_snippets_path - header_title "Snippets", dashboard_snippets_path
- button_path = new_snippet_path if can?(current_user, :create_personal_snippet) - button_path = new_snippet_path if can?(current_user, :create_snippet)
= render 'dashboard/snippets_head' = render 'dashboard/snippets_head'
- if current_user.snippets.exists? - if current_user.snippets.exists?
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
- if @project&.persisted? - if @project&.persisted?
- create_project_issue = show_new_issue_link?(@project) - create_project_issue = show_new_issue_link?(@project)
- merge_project = merge_request_source_project_for_project(@project) - merge_project = merge_request_source_project_for_project(@project)
- create_project_snippet = can?(current_user, :create_project_snippet, @project) - create_project_snippet = can?(current_user, :create_snippet, @project)
- if create_project_issue || merge_project || create_project_snippet - if create_project_issue || merge_project || create_project_snippet
%li.dropdown-bold-header %li.dropdown-bold-header
...@@ -38,5 +38,5 @@ ...@@ -38,5 +38,5 @@
%li= link_to _('New project'), new_project_path, class: 'qa-global-new-project-link' %li= link_to _('New project'), new_project_path, class: 'qa-global-new-project-link'
- if current_user.can_create_group? - if current_user.can_create_group?
%li= link_to _('New group'), new_group_path %li= link_to _('New group'), new_group_path
- if current_user.can?(:create_personal_snippet) - if current_user.can?(:create_snippet)
%li= link_to _('New snippet'), new_snippet_path, class: 'qa-global-new-snippet-link' %li= link_to _('New snippet'), new_snippet_path, class: 'qa-global-new-snippet-link'
- can_create_issue = show_new_issue_link?(@project) - can_create_issue = show_new_issue_link?(@project)
- can_create_project_snippet = can?(current_user, :create_project_snippet, @project) - can_create_project_snippet = can?(current_user, :create_snippet, @project)
- can_push_code = can?(current_user, :push_code, @project) - can_push_code = can?(current_user, :push_code, @project)
- create_mr_from_new_fork = can?(current_user, :fork_project, @project) && can?(current_user, :create_merge_request_in, @project) - create_mr_from_new_fork = can?(current_user, :fork_project, @project) && can?(current_user, :create_merge_request_in, @project)
- merge_project = merge_request_source_project_for_project(@project) - merge_project = merge_request_source_project_for_project(@project)
......
- return unless current_user - return unless current_user
.d-none.d-sm-block .d-none.d-sm-block
- if can?(current_user, :update_project_snippet, @snippet) - if can?(current_user, :update_snippet, @snippet)
= link_to edit_project_snippet_path(@project, @snippet), class: "btn btn-grouped" do = link_to edit_project_snippet_path(@project, @snippet), class: "btn btn-grouped" do
= _('Edit') = _('Edit')
- if can?(current_user, :admin_project_snippet, @snippet) - if can?(current_user, :admin_snippet, @snippet)
= link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do = link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do
= _('Delete') = _('Delete')
- if can?(current_user, :create_project_snippet, @project) - if can?(current_user, :create_snippet, @project)
= link_to new_project_snippet_path(@project), class: 'btn btn-grouped btn-inverted btn-success', title: _("New snippet") do = link_to new_project_snippet_path(@project), class: 'btn btn-grouped btn-inverted btn-success', title: _("New snippet") do
= _('New snippet') = _('New snippet')
- if @snippet.submittable_as_spam_by?(current_user) - if @snippet.submittable_as_spam_by?(current_user)
= link_to _('Submit as spam'), mark_as_spam_project_snippet_path(@project, @snippet), method: :post, class: 'btn btn-grouped btn-spam', title: _('Submit as spam') = link_to _('Submit as spam'), mark_as_spam_project_snippet_path(@project, @snippet), method: :post, class: 'btn btn-grouped btn-spam', title: _('Submit as spam')
- if can?(current_user, :create_project_snippet, @project) || can?(current_user, :update_project_snippet, @snippet) - if can?(current_user, :create_snippet, @project) || can?(current_user, :update_snippet, @snippet)
.d-block.d-sm-none.dropdown .d-block.d-sm-none.dropdown
%button.btn.btn-default.btn-block.append-bottom-0.prepend-top-5{ data: { toggle: "dropdown" } } %button.btn.btn-default.btn-block.append-bottom-0.prepend-top-5{ data: { toggle: "dropdown" } }
= _('Options') = _('Options')
= icon('caret-down') = icon('caret-down')
.dropdown-menu.dropdown-menu-full-width .dropdown-menu.dropdown-menu-full-width
%ul %ul
- if can?(current_user, :create_project_snippet, @project) - if can?(current_user, :create_snippet, @project)
%li %li
= link_to new_project_snippet_path(@project), title: _("New snippet") do = link_to new_project_snippet_path(@project), title: _("New snippet") do
= _('New snippet') = _('New snippet')
- if can?(current_user, :admin_project_snippet, @snippet) - if can?(current_user, :admin_snippet, @snippet)
%li %li
= link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do = link_to project_snippet_path(@project, @snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do
= _('Delete') = _('Delete')
- if can?(current_user, :update_project_snippet, @snippet) - if can?(current_user, :update_snippet, @snippet)
%li %li
= link_to edit_project_snippet_path(@project, @snippet) do = link_to edit_project_snippet_path(@project, @snippet) do
= _('Edit') = _('Edit')
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
- include_private = @project.team.member?(current_user) || current_user.admin? - include_private = @project.team.member?(current_user) || current_user.admin?
= render partial: 'snippets/snippets_scope_menu', locals: { subject: @project, include_private: include_private } = render partial: 'snippets/snippets_scope_menu', locals: { subject: @project, include_private: include_private }
- if can?(current_user, :create_project_snippet, @project) - if can?(current_user, :create_snippet, @project)
.nav-controls .nav-controls
= link_to _("New snippet"), new_project_snippet_path(@project), class: "btn btn-success", title: _("New snippet") = link_to _("New snippet"), new_project_snippet_path(@project), class: "btn btn-success", title: _("New snippet")
......
- return unless current_user - return unless current_user
.d-none.d-sm-block .d-none.d-sm-block
- if can?(current_user, :update_personal_snippet, @snippet) - if can?(current_user, :update_snippet, @snippet)
= link_to edit_snippet_path(@snippet), class: "btn btn-grouped" do = link_to edit_snippet_path(@snippet), class: "btn btn-grouped" do
= _("Edit") = _("Edit")
- if can?(current_user, :admin_personal_snippet, @snippet) - if can?(current_user, :admin_snippet, @snippet)
= link_to gitlab_snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do = link_to gitlab_snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, class: "btn btn-grouped btn-inverted btn-remove", title: _('Delete Snippet') do
= _("Delete") = _("Delete")
- if can?(current_user, :create_personal_snippet) - if can?(current_user, :create_snippet)
= link_to new_snippet_path, class: "btn btn-grouped btn-success btn-inverted", title: _("New snippet") do = link_to new_snippet_path, class: "btn btn-grouped btn-success btn-inverted", title: _("New snippet") do
= _("New snippet") = _("New snippet")
- if @snippet.submittable_as_spam_by?(current_user) - if @snippet.submittable_as_spam_by?(current_user)
...@@ -18,15 +18,15 @@ ...@@ -18,15 +18,15 @@
= icon('caret-down') = icon('caret-down')
.dropdown-menu.dropdown-menu-full-width .dropdown-menu.dropdown-menu-full-width
%ul %ul
- if can?(current_user, :create_personal_snippet) - if can?(current_user, :create_snippet)
%li %li
= link_to new_snippet_path, title: _("New snippet") do = link_to new_snippet_path, title: _("New snippet") do
= _("New snippet") = _("New snippet")
- if can?(current_user, :admin_personal_snippet, @snippet) - if can?(current_user, :admin_snippet, @snippet)
%li %li
= link_to gitlab_snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do = link_to gitlab_snippet_path(@snippet), method: :delete, data: { confirm: _("Are you sure?") }, title: _('Delete Snippet') do
= _("Delete") = _("Delete")
- if can?(current_user, :update_personal_snippet, @snippet) - if can?(current_user, :update_snippet, @snippet)
%li %li
= link_to edit_snippet_path(@snippet) do = link_to edit_snippet_path(@snippet) do
= _("Edit") = _("Edit")
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
- current_user_empty_message_header = s_('UserProfile|You haven\'t created any snippets.') - current_user_empty_message_header = s_('UserProfile|You haven\'t created any snippets.')
- current_user_empty_message_description = s_('UserProfile|Snippets in GitLab can either be private, internal, or public.') - current_user_empty_message_description = s_('UserProfile|Snippets in GitLab can either be private, internal, or public.')
- primary_button_label = _('New snippet') - primary_button_label = _('New snippet')
- primary_button_link = new_snippet_path if can?(current_user, :create_personal_snippet) - primary_button_link = new_snippet_path if can?(current_user, :create_snippet)
- visitor_empty_message = s_('UserProfile|No snippets found.') - visitor_empty_message = s_('UserProfile|No snippets found.')
.snippets-list-holder .snippets-list-holder
......
...@@ -6,7 +6,7 @@ module EE ...@@ -6,7 +6,7 @@ module EE
extend ::Gitlab::Utils::Override extend ::Gitlab::Utils::Override
prepended do prepended do
rule { auditor }.enable :read_project_snippet rule { auditor }.enable :read_snippet
end end
end end
end end
...@@ -45,7 +45,7 @@ describe ProjectPolicy do ...@@ -45,7 +45,7 @@ describe ProjectPolicy do
download_code download_wiki_code read_project read_board read_list download_code download_wiki_code read_project read_board read_list
read_project_for_iids read_issue_iid read_merge_request_iid read_wiki read_project_for_iids read_issue_iid read_merge_request_iid read_wiki
read_issue read_label read_issue_link read_milestone read_issue read_label read_issue_link read_milestone
read_project_snippet read_project_member read_note read_cycle_analytics read_snippet read_project_member read_note read_cycle_analytics
read_pipeline read_build read_commit_status read_container_image read_pipeline read_build read_commit_status read_container_image
read_environment read_deployment read_merge_request read_pages read_environment read_deployment read_merge_request read_pages
create_merge_request_in award_emoji create_merge_request_in award_emoji
......
...@@ -8,8 +8,8 @@ describe ProjectSnippetPolicy do ...@@ -8,8 +8,8 @@ describe ProjectSnippetPolicy do
let(:snippet) { create(:project_snippet, snippet_visibility, project: project) } let(:snippet) { create(:project_snippet, snippet_visibility, project: project) }
let(:author_permissions) do let(:author_permissions) do
[ [
:update_project_snippet, :update_snippet,
:admin_project_snippet :admin_snippet
] ]
end end
...@@ -22,7 +22,7 @@ describe ProjectSnippetPolicy do ...@@ -22,7 +22,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { create(:user, :auditor) } let(:current_user) { create(:user, :auditor) }
it do it do
is_expected.to be_allowed(:read_project_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
end end
end end
......
...@@ -127,6 +127,8 @@ module API ...@@ -127,6 +127,8 @@ module API
case awardable case awardable
when Note when Note
read_ability(awardable.noteable) read_ability(awardable.noteable)
when Snippet, ProjectSnippet
:read_snippet
else else
:"read_#{awardable.class.to_s.underscore}" :"read_#{awardable.class.to_s.underscore}"
end end
......
...@@ -72,7 +72,15 @@ module API ...@@ -72,7 +72,15 @@ module API
end end
def noteable_read_ability_name(noteable) def noteable_read_ability_name(noteable)
"read_#{noteable.class.to_s.underscore}".to_sym "read_#{ability_name(noteable)}".to_sym
end
def ability_name(noteable)
if noteable.respond_to?(:to_ability_name)
noteable.to_ability_name
else
noteable.class.to_s.underscore
end
end end
def find_noteable(parent_type, parent_id, noteable_type, noteable_id) def find_noteable(parent_type, parent_id, noteable_type, noteable_id)
......
...@@ -60,7 +60,7 @@ module API ...@@ -60,7 +60,7 @@ module API
mutually_exclusive :code, :content mutually_exclusive :code, :content
end end
post ":id/snippets" do post ":id/snippets" do
authorize! :create_project_snippet, user_project authorize! :create_snippet, user_project
snippet_params = declared_params(include_missing: false).merge(request: request, api: true) snippet_params = declared_params(include_missing: false).merge(request: request, api: true)
snippet_params[:content] = snippet_params.delete(:code) if snippet_params[:code].present? snippet_params[:content] = snippet_params.delete(:code) if snippet_params[:code].present?
...@@ -97,7 +97,7 @@ module API ...@@ -97,7 +97,7 @@ module API
snippet = snippets_for_current_user.find_by(id: params.delete(:snippet_id)) snippet = snippets_for_current_user.find_by(id: params.delete(:snippet_id))
not_found!('Snippet') unless snippet not_found!('Snippet') unless snippet
authorize! :update_project_snippet, snippet authorize! :update_snippet, snippet
snippet_params = declared_params(include_missing: false) snippet_params = declared_params(include_missing: false)
.merge(request: request, api: true) .merge(request: request, api: true)
...@@ -126,7 +126,7 @@ module API ...@@ -126,7 +126,7 @@ module API
snippet = snippets_for_current_user.find_by(id: params[:snippet_id]) snippet = snippets_for_current_user.find_by(id: params[:snippet_id])
not_found!('Snippet') unless snippet not_found!('Snippet') unless snippet
authorize! :admin_project_snippet, snippet authorize! :admin_snippet, snippet
destroy_conditionally!(snippet) do |snippet| destroy_conditionally!(snippet) do |snippet|
service = ::Snippets::DestroyService.new(current_user, snippet) service = ::Snippets::DestroyService.new(current_user, snippet)
......
...@@ -106,7 +106,7 @@ module API ...@@ -106,7 +106,7 @@ module API
snippet = snippets_for_current_user.find_by_id(params.delete(:id)) snippet = snippets_for_current_user.find_by_id(params.delete(:id))
break not_found!('Snippet') unless snippet break not_found!('Snippet') unless snippet
authorize! :update_personal_snippet, snippet authorize! :update_snippet, snippet
attrs = declared_params(include_missing: false).merge(request: request, api: true) attrs = declared_params(include_missing: false).merge(request: request, api: true)
service_response = ::Snippets::UpdateService.new(nil, current_user, attrs).execute(snippet) service_response = ::Snippets::UpdateService.new(nil, current_user, attrs).execute(snippet)
...@@ -132,7 +132,7 @@ module API ...@@ -132,7 +132,7 @@ module API
snippet = snippets_for_current_user.find_by_id(params.delete(:id)) snippet = snippets_for_current_user.find_by_id(params.delete(:id))
break not_found!('Snippet') unless snippet break not_found!('Snippet') unless snippet
authorize! :admin_personal_snippet, snippet authorize! :admin_snippet, snippet
destroy_conditionally!(snippet) do |snippet| destroy_conditionally!(snippet) do |snippet|
service = ::Snippets::DestroyService.new(current_user, snippet) service = ::Snippets::DestroyService.new(current_user, snippet)
......
...@@ -12,7 +12,7 @@ module Banzai ...@@ -12,7 +12,7 @@ module Banzai
private private
def can_read_reference?(user, ref_project, node) def can_read_reference?(user, ref_project, node)
can?(user, :read_project_snippet, referenced_by([node]).first) can?(user, :read_snippet, referenced_by([node]).first)
end end
end end
end end
......
...@@ -686,7 +686,7 @@ describe Notify do ...@@ -686,7 +686,7 @@ describe Notify do
let(:project_snippet) { create(:project_snippet, project: project) } let(:project_snippet) { create(:project_snippet, project: project) }
let(:project_snippet_note) { create(:note_on_project_snippet, project: project, noteable: project_snippet) } let(:project_snippet_note) { create(:note_on_project_snippet, project: project, noteable: project_snippet) }
subject { described_class.note_project_snippet_email(project_snippet_note.author_id, project_snippet_note.id) } subject { described_class.note_snippet_email(project_snippet_note.author_id, project_snippet_note.id) }
it_behaves_like 'appearance header and footer enabled' it_behaves_like 'appearance header and footer enabled'
it_behaves_like 'appearance header and footer not enabled' it_behaves_like 'appearance header and footer not enabled'
...@@ -696,10 +696,20 @@ describe Notify do ...@@ -696,10 +696,20 @@ describe Notify do
end end
it_behaves_like 'a user cannot unsubscribe through footer link' it_behaves_like 'a user cannot unsubscribe through footer link'
it 'has the correct subject and body' do it 'has the correct subject' do
is_expected.to have_referable_subject(project_snippet, reply: true) is_expected.to have_referable_subject(project_snippet, reply: true)
end
it 'has the correct body' do
is_expected.to have_body_text project_snippet_note.note is_expected.to have_body_text project_snippet_note.note
end end
it 'links to the project snippet' do
target_url = project_snippet_url(project,
project_snippet_note.noteable,
{ anchor: "note_#{project_snippet_note.id}" })
is_expected.to have_body_text target_url
end
end end
describe 'project was moved' do describe 'project was moved' do
...@@ -1650,15 +1660,23 @@ describe Notify do ...@@ -1650,15 +1660,23 @@ describe Notify do
let(:personal_snippet) { create(:personal_snippet) } let(:personal_snippet) { create(:personal_snippet) }
let(:personal_snippet_note) { create(:note_on_personal_snippet, noteable: personal_snippet) } let(:personal_snippet_note) { create(:note_on_personal_snippet, noteable: personal_snippet) }
subject { described_class.note_personal_snippet_email(personal_snippet_note.author_id, personal_snippet_note.id) } subject { described_class.note_snippet_email(personal_snippet_note.author_id, personal_snippet_note.id) }
it_behaves_like 'a user cannot unsubscribe through footer link' it_behaves_like 'a user cannot unsubscribe through footer link'
it_behaves_like 'appearance header and footer enabled' it_behaves_like 'appearance header and footer enabled'
it_behaves_like 'appearance header and footer not enabled' it_behaves_like 'appearance header and footer not enabled'
it 'has the correct subject and body' do it 'has the correct subject' do
is_expected.to have_referable_subject(personal_snippet, reply: true) is_expected.to have_referable_subject(personal_snippet, reply: true)
end
it 'has the correct body' do
is_expected.to have_body_text personal_snippet_note.note is_expected.to have_body_text personal_snippet_note.note
end end
it 'links to the personal snippet' do
target_url = gitlab_snippet_url(personal_snippet_note.noteable)
is_expected.to have_body_text target_url
end
end end
end end
...@@ -718,12 +718,12 @@ describe Note do ...@@ -718,12 +718,12 @@ describe Note do
end end
describe '#noteable_ability_name' do describe '#noteable_ability_name' do
it 'returns project_snippet for a project snippet note' do it 'returns snippet for a project snippet note' do
expect(build(:note_on_project_snippet).noteable_ability_name).to eq('project_snippet') expect(build(:note_on_project_snippet).noteable_ability_name).to eq('snippet')
end end
it 'returns personal_snippet for a personal snippet note' do it 'returns snippet for a personal snippet note' do
expect(build(:note_on_personal_snippet).noteable_ability_name).to eq('personal_snippet') expect(build(:note_on_personal_snippet).noteable_ability_name).to eq('snippet')
end end
it 'returns merge_request for an MR note' do it 'returns merge_request for an MR note' do
......
...@@ -307,21 +307,21 @@ describe GlobalPolicy do ...@@ -307,21 +307,21 @@ describe GlobalPolicy do
end end
end end
describe 'create_personal_snippet' do describe 'create_snippet' do
context 'when anonymous' do context 'when anonymous' do
let(:current_user) { nil } let(:current_user) { nil }
it { is_expected.not_to be_allowed(:create_personal_snippet) } it { is_expected.not_to be_allowed(:create_snippet) }
end end
context 'regular user' do context 'regular user' do
it { is_expected.to be_allowed(:create_personal_snippet) } it { is_expected.to be_allowed(:create_snippet) }
end end
context 'when external' do context 'when external' do
let(:current_user) { build(:user, :external) } let(:current_user) { build(:user, :external) }
it { is_expected.not_to be_allowed(:create_personal_snippet) } it { is_expected.not_to be_allowed(:create_snippet) }
end end
end end
end end
...@@ -54,6 +54,27 @@ describe NotePolicy do ...@@ -54,6 +54,27 @@ describe NotePolicy do
end end
end end
context 'when the noteable is a personal snippet' do
let(:noteable) { create(:personal_snippet, :public) }
let(:note) { create(:note, noteable: noteable, author: user) }
it 'can edit note' do
expect(policy).to be_allowed(:admin_note)
expect(policy).to be_allowed(:resolve_note)
expect(policy).to be_allowed(:read_note)
end
context 'when it is private' do
let(:noteable) { create(:personal_snippet, :private) }
it 'can not edit nor read the note' do
expect(policy).to be_disallowed(:admin_note)
expect(policy).to be_disallowed(:resolve_note)
expect(policy).to be_disallowed(:read_note)
end
end
end
context 'when the project is public' do context 'when the project is public' do
context 'when the note author is not a project member' do context 'when the note author is not a project member' do
it 'can edit a note' do it 'can edit a note' do
...@@ -79,26 +100,6 @@ describe NotePolicy do ...@@ -79,26 +100,6 @@ describe NotePolicy do
end end
end end
context 'when the noteable is a personal snippet' do
let(:noteable) { create(:personal_snippet, :public) }
it 'can edit note' do
expect(policy).to be_allowed(:admin_note)
expect(policy).to be_allowed(:resolve_note)
expect(policy).to be_allowed(:read_note)
end
context 'when it is private' do
let(:noteable) { create(:personal_snippet, :private) }
it 'can not edit nor read the note' do
expect(policy).to be_disallowed(:admin_note)
expect(policy).to be_disallowed(:resolve_note)
expect(policy).to be_disallowed(:read_note)
end
end
end
context 'when a discussion is confidential' do context 'when a discussion is confidential' do
before do before do
issue.update_attribute(:confidential, true) issue.update_attribute(:confidential, true)
......
...@@ -10,8 +10,8 @@ describe PersonalSnippetPolicy do ...@@ -10,8 +10,8 @@ describe PersonalSnippetPolicy do
let(:author_permissions) do let(:author_permissions) do
[ [
:update_personal_snippet, :update_snippet,
:admin_personal_snippet :admin_snippet
] ]
end end
...@@ -24,7 +24,7 @@ describe PersonalSnippetPolicy do ...@@ -24,7 +24,7 @@ describe PersonalSnippetPolicy do
subject { permissions(admin_user) } subject { permissions(admin_user) }
it do it do
is_expected.to be_allowed(:read_personal_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_allowed(:create_note) is_expected.to be_allowed(:create_note)
is_expected.to be_allowed(:award_emoji) is_expected.to be_allowed(:award_emoji)
is_expected.to be_allowed(*author_permissions) is_expected.to be_allowed(*author_permissions)
...@@ -39,7 +39,7 @@ describe PersonalSnippetPolicy do ...@@ -39,7 +39,7 @@ describe PersonalSnippetPolicy do
subject { permissions(nil) } subject { permissions(nil) }
it do it do
is_expected.to be_allowed(:read_personal_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_disallowed(:create_note) is_expected.to be_disallowed(:create_note)
is_expected.to be_disallowed(:award_emoji) is_expected.to be_disallowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -50,7 +50,7 @@ describe PersonalSnippetPolicy do ...@@ -50,7 +50,7 @@ describe PersonalSnippetPolicy do
subject { permissions(regular_user) } subject { permissions(regular_user) }
it do it do
is_expected.to be_allowed(:read_personal_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_allowed(:create_note) is_expected.to be_allowed(:create_note)
is_expected.to be_allowed(:award_emoji) is_expected.to be_allowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -61,7 +61,7 @@ describe PersonalSnippetPolicy do ...@@ -61,7 +61,7 @@ describe PersonalSnippetPolicy do
subject { permissions(snippet.author) } subject { permissions(snippet.author) }
it do it do
is_expected.to be_allowed(:read_personal_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_allowed(:create_note) is_expected.to be_allowed(:create_note)
is_expected.to be_allowed(:award_emoji) is_expected.to be_allowed(:award_emoji)
is_expected.to be_allowed(*author_permissions) is_expected.to be_allowed(*author_permissions)
...@@ -78,7 +78,7 @@ describe PersonalSnippetPolicy do ...@@ -78,7 +78,7 @@ describe PersonalSnippetPolicy do
subject { permissions(nil) } subject { permissions(nil) }
it do it do
is_expected.to be_disallowed(:read_personal_snippet) is_expected.to be_disallowed(:read_snippet)
is_expected.to be_disallowed(:create_note) is_expected.to be_disallowed(:create_note)
is_expected.to be_disallowed(:award_emoji) is_expected.to be_disallowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -89,7 +89,7 @@ describe PersonalSnippetPolicy do ...@@ -89,7 +89,7 @@ describe PersonalSnippetPolicy do
subject { permissions(regular_user) } subject { permissions(regular_user) }
it do it do
is_expected.to be_allowed(:read_personal_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_allowed(:create_note) is_expected.to be_allowed(:create_note)
is_expected.to be_allowed(:award_emoji) is_expected.to be_allowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -100,7 +100,7 @@ describe PersonalSnippetPolicy do ...@@ -100,7 +100,7 @@ describe PersonalSnippetPolicy do
subject { permissions(external_user) } subject { permissions(external_user) }
it do it do
is_expected.to be_disallowed(:read_personal_snippet) is_expected.to be_disallowed(:read_snippet)
is_expected.to be_disallowed(:create_note) is_expected.to be_disallowed(:create_note)
is_expected.to be_disallowed(:award_emoji) is_expected.to be_disallowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -111,7 +111,7 @@ describe PersonalSnippetPolicy do ...@@ -111,7 +111,7 @@ describe PersonalSnippetPolicy do
subject { permissions(snippet.author) } subject { permissions(snippet.author) }
it do it do
is_expected.to be_allowed(:read_personal_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_allowed(:create_note) is_expected.to be_allowed(:create_note)
is_expected.to be_allowed(:award_emoji) is_expected.to be_allowed(:award_emoji)
is_expected.to be_allowed(*author_permissions) is_expected.to be_allowed(*author_permissions)
...@@ -128,7 +128,7 @@ describe PersonalSnippetPolicy do ...@@ -128,7 +128,7 @@ describe PersonalSnippetPolicy do
subject { permissions(nil) } subject { permissions(nil) }
it do it do
is_expected.to be_disallowed(:read_personal_snippet) is_expected.to be_disallowed(:read_snippet)
is_expected.to be_disallowed(:create_note) is_expected.to be_disallowed(:create_note)
is_expected.to be_disallowed(:award_emoji) is_expected.to be_disallowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -139,7 +139,7 @@ describe PersonalSnippetPolicy do ...@@ -139,7 +139,7 @@ describe PersonalSnippetPolicy do
subject { permissions(regular_user) } subject { permissions(regular_user) }
it do it do
is_expected.to be_disallowed(:read_personal_snippet) is_expected.to be_disallowed(:read_snippet)
is_expected.to be_disallowed(:create_note) is_expected.to be_disallowed(:create_note)
is_expected.to be_disallowed(:award_emoji) is_expected.to be_disallowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -150,7 +150,7 @@ describe PersonalSnippetPolicy do ...@@ -150,7 +150,7 @@ describe PersonalSnippetPolicy do
subject { permissions(external_user) } subject { permissions(external_user) }
it do it do
is_expected.to be_disallowed(:read_personal_snippet) is_expected.to be_disallowed(:read_snippet)
is_expected.to be_disallowed(:create_note) is_expected.to be_disallowed(:create_note)
is_expected.to be_disallowed(:award_emoji) is_expected.to be_disallowed(:award_emoji)
is_expected.to be_disallowed(*author_permissions) is_expected.to be_disallowed(*author_permissions)
...@@ -161,7 +161,7 @@ describe PersonalSnippetPolicy do ...@@ -161,7 +161,7 @@ describe PersonalSnippetPolicy do
subject { permissions(snippet.author) } subject { permissions(snippet.author) }
it do it do
is_expected.to be_allowed(:read_personal_snippet) is_expected.to be_allowed(:read_snippet)
is_expected.to be_allowed(:create_note) is_expected.to be_allowed(:create_note)
is_expected.to be_allowed(:award_emoji) is_expected.to be_allowed(:award_emoji)
is_expected.to be_allowed(*author_permissions) is_expected.to be_allowed(*author_permissions)
......
...@@ -17,7 +17,7 @@ describe ProjectPolicy do ...@@ -17,7 +17,7 @@ describe ProjectPolicy do
%i[ %i[
read_project read_board read_list read_wiki read_issue read_project read_board read_list read_wiki read_issue
read_project_for_iids read_issue_iid read_label read_project_for_iids read_issue_iid read_label
read_milestone read_project_snippet read_project_member read_note read_milestone read_snippet read_project_member read_note
create_project create_issue create_note upload_file create_merge_request_in create_project create_issue create_note upload_file create_merge_request_in
award_emoji read_release award_emoji read_release
] ]
...@@ -25,7 +25,7 @@ describe ProjectPolicy do ...@@ -25,7 +25,7 @@ describe ProjectPolicy do
let(:base_reporter_permissions) do let(:base_reporter_permissions) do
%i[ %i[
download_code fork_project create_project_snippet update_issue download_code fork_project create_snippet update_issue
admin_issue admin_label admin_list read_commit_status read_build admin_issue admin_label admin_list read_commit_status read_build
read_container_image read_pipeline read_environment read_deployment read_container_image read_pipeline read_environment read_deployment
read_merge_request download_wiki_code read_sentry_issue read_merge_request download_wiki_code read_sentry_issue
...@@ -48,8 +48,8 @@ describe ProjectPolicy do ...@@ -48,8 +48,8 @@ describe ProjectPolicy do
let(:base_maintainer_permissions) do let(:base_maintainer_permissions) do
%i[ %i[
push_to_delete_protected_branch update_project_snippet push_to_delete_protected_branch update_snippet
admin_project_snippet admin_project_member admin_note admin_wiki admin_project admin_snippet admin_project_member admin_note admin_wiki admin_project
admin_commit_status admin_build admin_container_image admin_commit_status admin_build admin_container_image
admin_pipeline admin_environment admin_deployment destroy_release add_cluster admin_pipeline admin_environment admin_deployment destroy_release add_cluster
daily_statistics daily_statistics
......
...@@ -12,8 +12,8 @@ describe ProjectSnippetPolicy do ...@@ -12,8 +12,8 @@ describe ProjectSnippetPolicy do
let(:author) { other_user } let(:author) { other_user }
let(:author_permissions) do let(:author_permissions) do
[ [
:update_project_snippet, :update_snippet,
:admin_project_snippet :admin_snippet
] ]
end end
...@@ -26,7 +26,7 @@ describe ProjectSnippetPolicy do ...@@ -26,7 +26,7 @@ describe ProjectSnippetPolicy do
end end
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
end end
...@@ -38,8 +38,8 @@ describe ProjectSnippetPolicy do ...@@ -38,8 +38,8 @@ describe ProjectSnippetPolicy do
context 'not snippet author' do context 'not snippet author' do
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(:admin_project_snippet) expect_disallowed(:admin_snippet)
end end
end end
end end
...@@ -53,7 +53,7 @@ describe ProjectSnippetPolicy do ...@@ -53,7 +53,7 @@ describe ProjectSnippetPolicy do
end end
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_allowed(*author_permissions) expect_allowed(*author_permissions)
end end
end end
...@@ -64,15 +64,15 @@ describe ProjectSnippetPolicy do ...@@ -64,15 +64,15 @@ describe ProjectSnippetPolicy do
end end
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(:admin_project_snippet) expect_disallowed(:admin_snippet)
end end
end end
context 'not a project member' do context 'not a project member' do
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(:admin_project_snippet) expect_disallowed(:admin_snippet)
end end
end end
end end
...@@ -85,7 +85,7 @@ describe ProjectSnippetPolicy do ...@@ -85,7 +85,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { nil } let(:current_user) { nil }
it do it do
expect_allowed(:read_project_snippet) expect_allowed(:read_snippet)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
end end
...@@ -94,7 +94,7 @@ describe ProjectSnippetPolicy do ...@@ -94,7 +94,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { regular_user } let(:current_user) { regular_user }
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
...@@ -105,7 +105,7 @@ describe ProjectSnippetPolicy do ...@@ -105,7 +105,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { external_user } let(:current_user) { external_user }
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
...@@ -115,7 +115,7 @@ describe ProjectSnippetPolicy do ...@@ -115,7 +115,7 @@ describe ProjectSnippetPolicy do
end end
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
end end
...@@ -129,7 +129,7 @@ describe ProjectSnippetPolicy do ...@@ -129,7 +129,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { nil } let(:current_user) { nil }
it do it do
expect_disallowed(:read_project_snippet) expect_disallowed(:read_snippet)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
end end
...@@ -138,7 +138,7 @@ describe ProjectSnippetPolicy do ...@@ -138,7 +138,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { regular_user } let(:current_user) { regular_user }
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
...@@ -149,7 +149,7 @@ describe ProjectSnippetPolicy do ...@@ -149,7 +149,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { external_user } let(:current_user) { external_user }
it do it do
expect_disallowed(:read_project_snippet, :create_note) expect_disallowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
...@@ -159,7 +159,7 @@ describe ProjectSnippetPolicy do ...@@ -159,7 +159,7 @@ describe ProjectSnippetPolicy do
end end
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
end end
...@@ -173,7 +173,7 @@ describe ProjectSnippetPolicy do ...@@ -173,7 +173,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { nil } let(:current_user) { nil }
it do it do
expect_disallowed(:read_project_snippet) expect_disallowed(:read_snippet)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
end end
...@@ -182,7 +182,7 @@ describe ProjectSnippetPolicy do ...@@ -182,7 +182,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { regular_user } let(:current_user) { regular_user }
it do it do
expect_disallowed(:read_project_snippet, :create_note) expect_disallowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
...@@ -193,7 +193,7 @@ describe ProjectSnippetPolicy do ...@@ -193,7 +193,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { external_user } let(:current_user) { external_user }
it do it do
expect_disallowed(:read_project_snippet, :create_note) expect_disallowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
...@@ -203,7 +203,7 @@ describe ProjectSnippetPolicy do ...@@ -203,7 +203,7 @@ describe ProjectSnippetPolicy do
end end
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_disallowed(*author_permissions) expect_disallowed(*author_permissions)
end end
end end
...@@ -214,7 +214,7 @@ describe ProjectSnippetPolicy do ...@@ -214,7 +214,7 @@ describe ProjectSnippetPolicy do
let(:current_user) { create(:admin) } let(:current_user) { create(:admin) }
it do it do
expect_allowed(:read_project_snippet, :create_note) expect_allowed(:read_snippet, :create_note)
expect_allowed(*author_permissions) expect_allowed(*author_permissions)
end end
end end
......
...@@ -62,8 +62,8 @@ describe SnippetPresenter do ...@@ -62,8 +62,8 @@ describe SnippetPresenter do
context 'with PersonalSnippet' do context 'with PersonalSnippet' do
let(:snippet) { personal_snippet } let(:snippet) { personal_snippet }
it 'checks read_personal_snippet' do it 'checks read_snippet' do
expect(presenter).to receive(:can?).with(user, :read_personal_snippet, snippet) expect(presenter).to receive(:can?).with(user, :read_snippet, snippet)
subject subject
end end
...@@ -72,8 +72,8 @@ describe SnippetPresenter do ...@@ -72,8 +72,8 @@ describe SnippetPresenter do
context 'with ProjectSnippet' do context 'with ProjectSnippet' do
let(:snippet) { project_snippet } let(:snippet) { project_snippet }
it 'checks read_project_snippet ' do it 'checks read_snippet ' do
expect(presenter).to receive(:can?).with(user, :read_project_snippet, snippet) expect(presenter).to receive(:can?).with(user, :read_snippet, snippet)
subject subject
end end
...@@ -86,8 +86,8 @@ describe SnippetPresenter do ...@@ -86,8 +86,8 @@ describe SnippetPresenter do
context 'with PersonalSnippet' do context 'with PersonalSnippet' do
let(:snippet) { personal_snippet } let(:snippet) { personal_snippet }
it 'checks update_personal_snippet' do it 'checks update_snippet' do
expect(presenter).to receive(:can?).with(user, :update_personal_snippet, snippet) expect(presenter).to receive(:can?).with(user, :update_snippet, snippet)
subject subject
end end
...@@ -96,8 +96,8 @@ describe SnippetPresenter do ...@@ -96,8 +96,8 @@ describe SnippetPresenter do
context 'with ProjectSnippet' do context 'with ProjectSnippet' do
let(:snippet) { project_snippet } let(:snippet) { project_snippet }
it 'checks update_project_snippet ' do it 'checks update_snippet ' do
expect(presenter).to receive(:can?).with(user, :update_project_snippet, snippet) expect(presenter).to receive(:can?).with(user, :update_snippet, snippet)
subject subject
end end
...@@ -110,8 +110,8 @@ describe SnippetPresenter do ...@@ -110,8 +110,8 @@ describe SnippetPresenter do
context 'with PersonalSnippet' do context 'with PersonalSnippet' do
let(:snippet) { personal_snippet } let(:snippet) { personal_snippet }
it 'checks admin_personal_snippet' do it 'checks admin_snippet' do
expect(presenter).to receive(:can?).with(user, :admin_personal_snippet, snippet) expect(presenter).to receive(:can?).with(user, :admin_snippet, snippet)
subject subject
end end
...@@ -120,8 +120,8 @@ describe SnippetPresenter do ...@@ -120,8 +120,8 @@ describe SnippetPresenter do
context 'with ProjectSnippet' do context 'with ProjectSnippet' do
let(:snippet) { project_snippet } let(:snippet) { project_snippet }
it 'checks admin_project_snippet ' do it 'checks admin_snippet ' do
expect(presenter).to receive(:can?).with(user, :admin_project_snippet, snippet) expect(presenter).to receive(:can?).with(user, :admin_snippet, snippet)
subject subject
end end
......
...@@ -13,7 +13,7 @@ RSpec.shared_context 'ProjectPolicy context' do ...@@ -13,7 +13,7 @@ RSpec.shared_context 'ProjectPolicy context' do
%i[ %i[
read_project read_board read_list read_wiki read_issue read_project read_board read_list read_wiki read_issue
read_project_for_iids read_issue_iid read_label read_project_for_iids read_issue_iid read_label
read_milestone read_project_snippet read_project_member read_note read_milestone read_snippet read_project_member read_note
create_project create_issue create_note upload_file create_merge_request_in create_project create_issue create_note upload_file create_merge_request_in
award_emoji award_emoji
] ]
...@@ -21,7 +21,7 @@ RSpec.shared_context 'ProjectPolicy context' do ...@@ -21,7 +21,7 @@ RSpec.shared_context 'ProjectPolicy context' do
let(:base_reporter_permissions) do let(:base_reporter_permissions) do
%i[ %i[
download_code fork_project create_project_snippet update_issue download_code fork_project create_snippet update_issue
admin_issue admin_label admin_list read_commit_status read_build admin_issue admin_label admin_list read_commit_status read_build
read_container_image read_pipeline read_environment read_deployment read_container_image read_pipeline read_environment read_deployment
read_merge_request download_wiki_code read_sentry_issue read_prometheus read_merge_request download_wiki_code read_sentry_issue read_prometheus
...@@ -45,8 +45,8 @@ RSpec.shared_context 'ProjectPolicy context' do ...@@ -45,8 +45,8 @@ RSpec.shared_context 'ProjectPolicy context' do
let(:base_maintainer_permissions) do let(:base_maintainer_permissions) do
%i[ %i[
push_to_delete_protected_branch update_project_snippet push_to_delete_protected_branch update_snippet
admin_project_snippet admin_project_member admin_note admin_wiki admin_project admin_snippet admin_project_member admin_note admin_wiki admin_project
admin_commit_status admin_build admin_container_image admin_commit_status admin_build admin_container_image
admin_pipeline admin_environment admin_deployment destroy_release add_cluster admin_pipeline admin_environment admin_deployment destroy_release add_cluster
daily_statistics daily_statistics
......
...@@ -234,8 +234,8 @@ RSpec.shared_examples 'snippet visibility' do ...@@ -234,8 +234,8 @@ RSpec.shared_examples 'snippet visibility' do
end end
context "For #{params[:project_type]} project and #{params[:user_type]} users" do context "For #{params[:project_type]} project and #{params[:user_type]} users" do
it 'agrees with the read_project_snippet policy' do it 'agrees with the read_snippet policy' do
expect(can?(user, :read_project_snippet, snippet)).to eq(outcome) expect(can?(user, :read_snippet, snippet)).to eq(outcome)
end end
it 'returns proper outcome' do it 'returns proper outcome' do
...@@ -297,8 +297,8 @@ RSpec.shared_examples 'snippet visibility' do ...@@ -297,8 +297,8 @@ RSpec.shared_examples 'snippet visibility' do
let!(:snippet) { create(:personal_snippet, visibility_level: snippet_visibility, author: author) } let!(:snippet) { create(:personal_snippet, visibility_level: snippet_visibility, author: author) }
context "For personal and #{params[:snippet_visibility]} snippets with #{params[:user_type]} user" do context "For personal and #{params[:snippet_visibility]} snippets with #{params[:user_type]} user" do
it 'agrees with read_personal_snippet policy' do it 'agrees with read_snippet policy' do
expect(can?(user, :read_personal_snippet, snippet)).to eq(outcome) expect(can?(user, :read_snippet, snippet)).to eq(outcome)
end end
it 'returns proper outcome' do it 'returns proper outcome' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment