effective_roles 2.0.0 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/models/concerns/acts_as_role_restricted.rb +10 -6
- data/config/effective_roles.rb +4 -1
- data/lib/effective_roles.rb +52 -15
- data/lib/effective_roles/engine.rb +3 -3
- data/lib/effective_roles/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '068af67420f4d68373480a8b0f738ae2cc01913b3ec327cff95a01c8dcec0f24'
|
4
|
+
data.tar.gz: b5cc82efb23a36fa31475bfd27bfe69a8d9d2f41813a3ad3397f131a69669814
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb8776abf2ed21d03a6c83d51458581143cca3fa0fa2fba64342ec7c05f441fc396a257cf2b4f3d858ff3a5a3bc6479ff1a08af3f5612a6cae8363f6b3f1a8db
|
7
|
+
data.tar.gz: 3d60cf7e471cf5858ba94f60b959e91000a143551d7a15cbe4f4c2759e8aa7e57e7e381452cd45f9ad67b5bd1a42be8235aa5cc067cba339a8d6ea9c567fe198
|
@@ -14,7 +14,7 @@
|
|
14
14
|
module ActsAsRoleRestricted
|
15
15
|
extend ActiveSupport::Concern
|
16
16
|
|
17
|
-
module
|
17
|
+
module Base
|
18
18
|
def acts_as_role_restricted(multiple: false)
|
19
19
|
@acts_as_role_restricted_opts = { multiple: multiple }
|
20
20
|
include ::ActsAsRoleRestricted
|
@@ -29,13 +29,9 @@ module ActsAsRoleRestricted
|
|
29
29
|
|
30
30
|
validates :roles_mask, numericality: true, allow_nil: true
|
31
31
|
|
32
|
-
validate(if: -> { changes.include?(:roles_mask) }) do
|
32
|
+
validate(if: -> { changes.include?(:roles_mask) && EffectiveRoles.assignable_roles_present?(self) }) do
|
33
33
|
user = current_user || EffectiveRoles.current_user || (EffectiveLogging.current_user if defined?(EffectiveLogging))
|
34
34
|
|
35
|
-
if user.blank? && EffectiveRoles.assignable_roles.present? && defined?(Rails::Server)
|
36
|
-
self.errors.add(:roles, 'current_user must be present when assigning roles')
|
37
|
-
end
|
38
|
-
|
39
35
|
roles_was = EffectiveRoles.roles_for(changes[:roles_mask].first)
|
40
36
|
changed = (roles + roles_was) - (roles & roles_was) # XOR
|
41
37
|
|
@@ -45,6 +41,14 @@ module ActsAsRoleRestricted
|
|
45
41
|
authorized = roles.dup
|
46
42
|
unauthorized.each { |role| authorized.include?(role) ? authorized.delete(role) : authorized.push(role) }
|
47
43
|
|
44
|
+
if unauthorized.present?
|
45
|
+
Rails.logger.info "\e[31m unassignable roles: #{unauthorized.map { |role| ":#{role}" }.to_sentence}"
|
46
|
+
end
|
47
|
+
|
48
|
+
if unauthorized.present? && user.blank? && defined?(Rails::Server)
|
49
|
+
self.errors.add(:roles, 'current_user must be present when assigning roles')
|
50
|
+
end
|
51
|
+
|
48
52
|
self.roles_mask = EffectiveRoles.roles_mask_for(authorized)
|
49
53
|
end
|
50
54
|
|
data/config/effective_roles.rb
CHANGED
@@ -53,6 +53,8 @@ EffectiveRoles.setup do |config|
|
|
53
53
|
# :superadmin => [:superadmin, :admin, :member], # Superadmins may create Pages for any role
|
54
54
|
# :admin => [:admin, :member], # Admins may create Pages for admin and members
|
55
55
|
# :member => [:member] # Members may create Pages for members
|
56
|
+
# },
|
57
|
+
# 'Post' => false # Don't enforce assignable roles validation
|
56
58
|
# }
|
57
59
|
#
|
58
60
|
# Or just keep it simple, and use this Hash syntax of permissions for every resource
|
@@ -60,7 +62,8 @@ EffectiveRoles.setup do |config|
|
|
60
62
|
# config.assignable_roles = {
|
61
63
|
# :superadmin => [:superadmin, :admin, :member], # Superadmins may assign any resource any role
|
62
64
|
# :admin => [:admin, :member], # Admins may only assign the :admin or :member role
|
63
|
-
# :member => []
|
65
|
+
# :member => [], # Members may not assign any roles
|
66
|
+
# :new_record => [:member] # Member may be assigned to a new_record without a current_user
|
64
67
|
# }
|
65
68
|
|
66
69
|
# Authorization Method
|
data/lib/effective_roles.rb
CHANGED
@@ -92,29 +92,66 @@ module EffectiveRoles
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def self.assignable_roles_collection(resource, current_user = nil, multiple: nil)
|
95
|
-
return roles
|
95
|
+
return roles unless assignable_roles_present?(resource)
|
96
96
|
|
97
|
-
raise 'EffectiveRoles config.assignable_roles_for must be a Hash, Array or nil' unless [Hash, Array].include?(assignable_roles.class)
|
98
|
-
raise('expected resource to respond to is_role_restricted?') unless resource.respond_to?(:is_role_restricted?)
|
99
|
-
raise('expected current_user to respond to is_role_restricted?') if current_user && !current_user.respond_to?(:is_role_restricted?)
|
100
|
-
|
101
|
-
multiple = resource.acts_as_role_restricted_options[:multiple] if multiple.nil?
|
102
97
|
current_user ||= (EffectiveRoles.current_user || (EffectiveLogging.current_user if defined?(EffectiveLogging)))
|
103
98
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
assignable_roles[resource.try(:class).to_s] || []
|
99
|
+
if current_user && !current_user.respond_to?(:is_role_restricted?)
|
100
|
+
raise('expected current_user to respond to is_role_restricted?')
|
101
|
+
end
|
102
|
+
|
103
|
+
if !resource.respond_to?(:is_role_restricted?)
|
104
|
+
raise('expected current_user to respond to is_role_restricted?')
|
111
105
|
end
|
112
106
|
|
107
|
+
assigned_roles = if assignable_roles.kind_of?(Hash)
|
108
|
+
assignable = (assignable_roles[resource.class.to_s] || assignable_roles || {})
|
109
|
+
assigned = [] # our return value
|
110
|
+
|
111
|
+
if current_user.blank?
|
112
|
+
assigned = assignable.values.flatten
|
113
|
+
end
|
114
|
+
|
115
|
+
if current_user.present?
|
116
|
+
assigned = current_user.roles.map { |role| assignable[role] }.flatten.compact
|
117
|
+
end
|
118
|
+
|
119
|
+
if assignable[:new_record] && resource.new_record?
|
120
|
+
assigned += Array(assignable[:new_record])
|
121
|
+
end
|
122
|
+
|
123
|
+
if assignable[:persisted] && resource.persisted?
|
124
|
+
assigned += Array(assignable[:persisted])
|
125
|
+
end
|
126
|
+
|
127
|
+
assigned
|
128
|
+
elsif assignable_roles.kind_of?(Array)
|
129
|
+
assignable_roles
|
130
|
+
end.uniq
|
131
|
+
|
113
132
|
# Check boxes
|
114
|
-
|
133
|
+
multiple = resource.acts_as_role_restricted_options[:multiple] if multiple.nil?
|
134
|
+
return assigned_roles if multiple
|
115
135
|
|
116
136
|
# Radios
|
117
|
-
(resource.roles -
|
137
|
+
(resource.roles - assigned_roles).present? ? [] : assigned_roles
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.assignable_roles_present?(resource)
|
141
|
+
return false if assignable_roles.nil?
|
142
|
+
|
143
|
+
raise 'EffectiveRoles config.assignable_roles_for must be a Hash, Array or nil' unless [Hash, Array].include?(assignable_roles.class)
|
144
|
+
raise('expected resource to respond to is_role_restricted?') unless resource.respond_to?(:is_role_restricted?)
|
145
|
+
|
146
|
+
return assignable_roles.present? if assignable_roles.kind_of?(Array)
|
147
|
+
|
148
|
+
if assignable_roles.kind_of?(Array)
|
149
|
+
assignable_roles
|
150
|
+
elsif assignable_roles.key?(resource.class.to_s)
|
151
|
+
assignable_roles[resource.class.to_s]
|
152
|
+
else
|
153
|
+
assignable_roles
|
154
|
+
end.present?
|
118
155
|
end
|
119
156
|
|
120
157
|
# This is used by the effective_roles_summary_table helper method
|
@@ -1,13 +1,13 @@
|
|
1
|
+
require 'effective_roles/set_current_user'
|
2
|
+
|
1
3
|
module EffectiveRoles
|
2
4
|
class Engine < ::Rails::Engine
|
3
5
|
engine_name 'effective_roles'
|
4
6
|
|
5
|
-
config.autoload_paths += Dir["#{config.root}/app/models/concerns", "#{config.root}/lib/"]
|
6
|
-
|
7
7
|
# Include acts_as_addressable concern and allow any ActiveRecord object to call it
|
8
8
|
initializer 'effective_roles.active_record' do |app|
|
9
9
|
ActiveSupport.on_load :active_record do
|
10
|
-
ActiveRecord::Base.extend(ActsAsRoleRestricted::
|
10
|
+
ActiveRecord::Base.extend(ActsAsRoleRestricted::Base)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_roles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -53,7 +53,7 @@ homepage: https://github.com/code-and-effect/effective_roles
|
|
53
53
|
licenses:
|
54
54
|
- MIT
|
55
55
|
metadata: {}
|
56
|
-
post_install_message:
|
56
|
+
post_install_message:
|
57
57
|
rdoc_options: []
|
58
58
|
require_paths:
|
59
59
|
- lib
|
@@ -68,8 +68,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
requirements: []
|
71
|
-
rubygems_version: 3.
|
72
|
-
signing_key:
|
71
|
+
rubygems_version: 3.1.2
|
72
|
+
signing_key:
|
73
73
|
specification_version: 4
|
74
74
|
summary: Assign multiple roles to any User or other ActiveRecord object. Select only
|
75
75
|
the appropriate objects based on intelligent, chainable ActiveRecord::Relation finder
|