Commit c931c521 authored by Jan Provaznik's avatar Jan Provaznik

Merge branch 'ap-39087-align-personal-project-snippet-abilities' into 'master'

Align project and personal snippet abilities

Closes #39087

See merge request gitlab-org/gitlab!22500
parents e1f85bb4 766d8733
...@@ -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