Updated project permission helpers [SCI-6041]

This commit is contained in:
Martin Artnik 2021-09-07 11:27:52 +02:00
parent 7e6ca3be8a
commit 975a8910a8
17 changed files with 74 additions and 91 deletions

View file

@ -94,7 +94,7 @@ module AccessPermissions
end end
def check_manage_permissions def check_manage_permissions
render_403 unless can_manage_project_access?(@project) render_403 unless can_manage_project_users?(@project)
end end
def check_read_permissions def check_read_permissions

View file

@ -22,7 +22,7 @@ module Api
end end
def create def create
raise PermissionError.new(Experiment, :create) unless can_create_experiments?(@project) raise PermissionError.new(Experiment, :create) unless can_create_project_experiments?(@project)
experiment = @project.experiments.create!(experiment_params.merge!(created_by: current_user, experiment = @project.experiments.create!(experiment_params.merge!(created_by: current_user,
last_modified_by: current_user)) last_modified_by: current_user))

View file

@ -89,7 +89,7 @@ class CommentsController < ApplicationController
def check_create_permissions def check_create_permissions
case @commentable case @commentable
when Project when Project
render_403 and return unless can_create_comments_in_project?(@commentable) render_403 and return unless can_create_project_comments?(@commentable)
when MyModule when MyModule
render_403 and return unless can_create_comments_in_module?(@commentable) render_403 and return unless can_create_comments_in_module?(@commentable)
when Step when Step

View file

@ -70,7 +70,7 @@ module Dashboard
end end
unless @experiment unless @experiment
render_403 unless can_create_experiments?(current_user, @project) render_403 unless can_create_project_experiments?(current_user, @project)
return return
end end

View file

@ -314,7 +314,7 @@ class ExperimentsController < ApplicationController
end end
def check_create_permissions def check_create_permissions
render_403 unless can_create_experiments?(@project) render_403 unless can_create_project_experiments?(@project)
end end
def check_manage_permissions def check_manage_permissions

View file

@ -51,7 +51,7 @@ class ProjectCommentsController < ApplicationController
end end
def check_create_permissions def check_create_permissions
render_403 unless can_create_comments_in_project?(@project) render_403 unless can_create_project_comments?(@project)
end end
def check_manage_permissions def check_manage_permissions

View file

@ -161,7 +161,7 @@ class TagsController < ApplicationController
end end
def check_manage_permissions def check_manage_permissions
render_403 unless can_manage_tags?(@project) render_403 unless can_manage_project?(@project)
end end
def tag_params def tag_params

View file

@ -63,7 +63,7 @@ module CommentHelper
when 'Step', 'Result' when 'Step', 'Result'
can_create_comments_in_module?(object.my_module) can_create_comments_in_module?(object.my_module)
when 'Project' when 'Project'
can_create_comments_in_project?(object) can_create_project_comments?(object)
else else
false false
end end

View file

@ -32,8 +32,8 @@ class UserRole < ApplicationRecord
permissions: permissions:
[ [
ProjectPermissions::READ, ProjectPermissions::READ,
ProjectPermissions::CREATE_EXPERIMENTS, ProjectPermissions::EXPERIMENTS_CREATE,
ProjectPermissions::CREATE_COMMENTS, ProjectPermissions::COMMENTS_CREATE,
ExperimentPermissions::READ, ExperimentPermissions::READ,
ExperimentPermissions::MANAGE, ExperimentPermissions::MANAGE,
ExperimentPermissions::ARCHIVE, ExperimentPermissions::ARCHIVE,
@ -57,7 +57,7 @@ class UserRole < ApplicationRecord
permissions: permissions:
[ [
ProjectPermissions::READ, ProjectPermissions::READ,
ProjectPermissions::CREATE_COMMENTS, ProjectPermissions::COMMENTS_CREATE,
ExperimentPermissions::READ, ExperimentPermissions::READ,
MyModulePermissions::READ, MyModulePermissions::READ,
MyModulePermissions::CREATE_COMMENTS, MyModulePermissions::CREATE_COMMENTS,

View file

@ -6,10 +6,10 @@ Canaid::Permissions.register_for(Project) do
# Project must be active for all the specified permissions # Project must be active for all the specified permissions
%i(manage_project %i(manage_project
archive_project archive_project
create_experiments create_project_experiments
create_comments_in_project create_project_comments
manage_tags manage_project_tags
manage_project_access) manage_project_users)
.each do |perm| .each do |perm|
can perm do |_, project| can perm do |_, project|
project.active? project.active?
@ -23,21 +23,7 @@ Canaid::Permissions.register_for(Project) do
project.permission_granted?(user, ProjectPermissions::READ) project.permission_granted?(user, ProjectPermissions::READ)
end end
end end
# project: read, read activities, read comments, read users, read archive,
# read notifications
# reports: read
can :read_project do |_, _|
# Already checked by the wrapper
true
end
# team: export projects
can :export_project do |_, _|
# Already checked by the wrapper
true
end
# project: update/delete, assign/reassign/unassign users
can :manage_project do |user, project| can :manage_project do |user, project|
project.permission_granted?(user, ProjectPermissions::MANAGE) && project.permission_granted?(user, ProjectPermissions::MANAGE) &&
MyModule.joins(experiment: :project) MyModule.joins(experiment: :project)
@ -52,64 +38,55 @@ Canaid::Permissions.register_for(Project) do
end end
end end
# project: manage access policies can :read_project_folders do |user, project|
can :manage_project_access do |user, project| project.permission_granted?(user, ProjectPermissions::FOLDERS_READ)
project.permission_granted?(user, ProjectPermissions::MANAGE_ACCESS) end
can :manage_project_users do |user, project|
project.permission_granted?(user, ProjectPermissions::USERS_MANAGE)
end end
# project: archive
can :archive_project do |user, project| can :archive_project do |user, project|
project.permission_granted?(user, ProjectPermissions::ARCHIVE) project.permission_granted?(user, ProjectPermissions::MANAGE)
end end
# NOTE: Must not be dependent on canaid parmision for which we check if it's
# active
# project: restore
can :restore_project do |user, project| can :restore_project do |user, project|
project.archived? && project.permission_granted?(user, ProjectPermissions::RESTORE) project.archived? && project.permission_granted?(user, ProjectPermissions::MANAGE)
end end
# experiment: create can :create_project_experiments do |user, project|
project.permission_granted?(user, ProjectPermissions::EXPERIMENTS_CREATE)
can :create_experiments do |user, project|
project.permission_granted?(user, ProjectPermissions::CREATE_EXPERIMENTS)
end end
can :manage_experiments do |user, project| can :read_project_experiments do |user, project|
project.permission_granted?(user, ProjectPermissions::CREATE_EXPERIMENTS) project.permission_granted?(user, ProjectPermissions::EXPERIMENTS_READ)
end end
# project: create comment can :read_archived_project_experiments do |user, project|
can :create_comments_in_project do |user, project| project.permission_granted?(user, ProjectPermissions::EXPERIMENTS_READ_ARCHIVED)
project.permission_granted?(user, ProjectPermissions::CREATE_COMMENTS)
end end
# project: create/update/delete tag can :read_canvas_of_project_experiments do |user, project|
# module: assign/reassign/unassign tag project.permission_granted?(user, ProjectPermissions::EXPERIMENTS_READ_CANVAS)
can :manage_tags do |user, project| end
project.permission_granted?(user, ProjectPermissions::MANAGE_TAGS)
end can :read_activities_of_project_experiments do |user, project|
end project.permission_granted?(user, ProjectPermissions::EXPERIMENTS_ACTIVITIES_READ)
end
Canaid::Permissions.register_for(ProjectComment) do
# Project must be active for all the specified permissions can :read_users_of_project_experiments do |user, project|
%i(manage_comment_in_project) project.permission_granted?(user, ProjectPermissions::EXPERIMENTS_USERS_READ)
.each do |perm| end
can perm do |_, project_comment|
project_comment.project.active? can :create_project_comments do |user, project|
end project.permission_granted?(user, ProjectPermissions::COMMENTS_CREATE)
end end
# project: update/delete comment can :manage_project_comments do |user, project|
can :manage_comment_in_project do |user, project_comment| project.permission_granted?(user, ProjectPermissions::COMMENTS_MANAGE)
project_comment.project.present? && (project_comment.user == user || end
project.permission_granted?(user, ProjectPermissions::MANAGE_COMMENTS))
end can :manage_project_tags do |user, project|
end project.permission_granted?(user, ProjectPermissions::MANAGE)
Canaid::Permissions.register_for(ProjectFolder) do
# ProjectFolder: delete
can :delete_project_folder do |_, project_folder|
!project_folder.projects.exists? && !project_folder.project_folders.exists?
end end
end end

View file

@ -5,7 +5,7 @@ json.modal controller.render_to_string(
formats: [:html], formats: [:html],
locals: { locals: {
resource: @project, resource: @project,
can_manage_resource: can_manage_project_access?(@project) can_manage_resource: can_manage_project_users?(@project)
}, },
layout: false layout: false
) )

View file

@ -3,7 +3,7 @@
<%= render partial: 'shared/comments/comments.html.erb', locals: { <%= render partial: 'shared/comments/comments.html.erb', locals: {
object: @project, object: @project,
comments: comments, comments: comments,
can_create_comments: can_create_comments_in_project?(@project), can_create_comments: can_create_project_comments?(@project),
create_url: project_project_comments_path(@project, format: :json), create_url: project_project_comments_path(@project, format: :json),
more_url: project_project_comments_path(@project, format: :json, from: comments.first&.id) more_url: project_project_comments_path(@project, format: :json, from: comments.first&.id)
} %> } %>

View file

@ -51,7 +51,7 @@
<!-- Project members access --> <!-- Project members access -->
<% if can_read_project?(project) %> <% if can_read_project?(project) %>
<li class="form-dropdown-item"> <li class="form-dropdown-item">
<%= link_to can_manage_project_access?(project) ? edit_access_permissions_project_path(project) : access_permissions_project_path(project), <%= link_to can_manage_project_users?(project) ? edit_access_permissions_project_path(project) : access_permissions_project_path(project),
class: 'btn btn-light', class: 'btn btn-light',
data: { action: 'remote-modal'} do %> data: { action: 'remote-modal'} do %>
<i class="fas fa-door-open"></i> <i class="fas fa-door-open"></i>

View file

@ -50,7 +50,7 @@
<div class="data-row user-cell table-cell"> <div class="data-row user-cell table-cell">
<span class="card-label"><%= t('projects.index.card.users') %></span> <span class="card-label"><%= t('projects.index.card.users') %></span>
<div class="value"> <div class="value">
<% if can_manage_project_access?(project) %> <% if can_manage_project_users?(project) %>
<%= link_to edit_access_permissions_project_path(project), class: 'project-users-link', data: { action: 'remote-modal' } do %> <%= link_to edit_access_permissions_project_path(project), class: 'project-users-link', data: { action: 'remote-modal' } do %>
<%= render partial: 'projects/index/users_list.html.erb', locals: { project: project } %> <%= render partial: 'projects/index/users_list.html.erb', locals: { project: project } %>
<span class="new-user global-avatar-container"> <span class="new-user global-avatar-container">

View file

@ -1,6 +1,6 @@
<div id="projectShowToolbar" class="project-show-toolbar"> <div id="projectShowToolbar" class="project-show-toolbar">
<!-- new experiment button --> <!-- new experiment button -->
<% if can_create_experiments?(@project) %> <% if can_create_project_experiments?(@project) %>
<%= button_to new_project_experiment_url(@project), <%= button_to new_project_experiment_url(@project),
remote: true, remote: true,
form_class: 'new-experiment-form', form_class: 'new-experiment-form',

View file

@ -4,15 +4,21 @@ module PermissionExtends
module ProjectPermissions module ProjectPermissions
%w( %w(
READ READ
EXPORT READ_ARCHIVED
MANAGE MANAGE
ARCHIVE FOLDERS_READ
RESTORE ACTIVITIES_READ
CREATE_EXPERIMENTS USERS_READ
CREATE_COMMENTS USERS_MANAGE
MANAGE_COMMENTS COMMENTS_READ
MANAGE_TAGS COMMENTS_CREATE
MANAGE_ACCESS COMMENTS_MANAGE
EXPERIMENTS_READ
EXPERIMENTS_READ_ARCHIVED
EXPERIMENTS_CREATE
EXPERIMENTS_READ_CANVAS
EXPERIMENTS_ACTIVITIES_READ
EXPERIMENTS_USERS_READ
).each { |permission| const_set(permission, "project_#{permission.underscore}") } ).each { |permission| const_set(permission, "project_#{permission.underscore}") }
end end

View file

@ -13,8 +13,8 @@ FactoryBot.define do
permissions { permissions {
[ [
ProjectPermissions::READ, ProjectPermissions::READ,
ProjectPermissions::CREATE_EXPERIMENTS, ProjectPermissions::EXPERIMENTS_CREATE,
ProjectPermissions::CREATE_COMMENTS, ProjectPermissions::COMMENTS_CREATE,
ExperimentPermissions::READ, ExperimentPermissions::READ,
ExperimentPermissions::MANAGE, ExperimentPermissions::MANAGE,
ExperimentPermissions::ARCHIVE, ExperimentPermissions::ARCHIVE,
@ -37,7 +37,7 @@ FactoryBot.define do
permissions { permissions {
[ [
ProjectPermissions::READ, ProjectPermissions::READ,
ProjectPermissions::CREATE_COMMENTS, ProjectPermissions::COMMENTS_CREATE,
ExperimentPermissions::READ, ExperimentPermissions::READ,
MyModulePermissions::READ, MyModulePermissions::READ,
MyModulePermissions::CREATE_COMMENTS, MyModulePermissions::CREATE_COMMENTS,