cancancan 2.1.2 → 2.2.0
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 +5 -5
- data/cancancan.gemspec +1 -1
- data/lib/cancan/ability.rb +1 -1
- data/lib/cancan/controller_additions.rb +2 -5
- data/lib/cancan/exceptions.rb +3 -2
- data/lib/cancan/model_adapters/active_record_4_adapter.rb +2 -20
- data/lib/cancan/model_adapters/active_record_5_adapter.rb +70 -0
- data/lib/cancan/version.rb +1 -1
- data/lib/cancan.rb +1 -0
- metadata +21 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: cd789707449c90277a31d5808e55c36140b88b3aa3c2b9035640d777220b2d27
|
|
4
|
+
data.tar.gz: 64fbbaa5657ae8b334e7096f33eb12b975a224ea7c516c0091d3d7ac94c0acbd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 70ba8098042c7114a7cf419a892c12794089da88046873fb6abf1c45dac3854731adb860ff95d2556f7e9ffad4543b5f53dc05579defd5ff8273bcf51476e0ce
|
|
7
|
+
data.tar.gz: 5d390ebd7fa75ffbff3783502d6bf329d5949787b70ccd26559d40be4471c61efb8f4ea4adc2d53b6bac81f9e32e619d3569c268ff8a6277f16cab72ea162bf5
|
data/cancancan.gemspec
CHANGED
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
|
18
18
|
s.files = `git ls-files lib init.rb cancancan.gemspec`.split($INPUT_RECORD_SEPARATOR)
|
|
19
19
|
s.require_paths = ['lib']
|
|
20
20
|
|
|
21
|
-
s.required_ruby_version = '>= 2.
|
|
21
|
+
s.required_ruby_version = '>= 2.2.0'
|
|
22
22
|
|
|
23
23
|
s.add_development_dependency 'bundler', '~> 1.3'
|
|
24
24
|
s.add_development_dependency 'rubocop', '~> 0.48.1'
|
data/lib/cancan/ability.rb
CHANGED
|
@@ -173,7 +173,7 @@ module CanCan
|
|
|
173
173
|
end
|
|
174
174
|
if cannot?(action, subject, *args)
|
|
175
175
|
message ||= unauthorized_message(action, subject)
|
|
176
|
-
raise AccessDenied.new(message, action, subject)
|
|
176
|
+
raise AccessDenied.new(message, action, subject, args)
|
|
177
177
|
end
|
|
178
178
|
subject
|
|
179
179
|
end
|
|
@@ -384,9 +384,6 @@ module CanCan
|
|
|
384
384
|
end
|
|
385
385
|
end
|
|
386
386
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
next unless ActionController.const_defined?(klass)
|
|
390
|
-
ActionController.const_get(klass).class_eval { include CanCan::ControllerAdditions }
|
|
391
|
-
end
|
|
387
|
+
ActiveSupport.on_load(:action_controller) do
|
|
388
|
+
include CanCan::ControllerAdditions
|
|
392
389
|
end
|
data/lib/cancan/exceptions.rb
CHANGED
|
@@ -33,13 +33,14 @@ module CanCan
|
|
|
33
33
|
# See ControllerAdditions#authorized! for more information on rescuing from this exception
|
|
34
34
|
# and customizing the message using I18n.
|
|
35
35
|
class AccessDenied < Error
|
|
36
|
-
attr_reader :action, :subject
|
|
36
|
+
attr_reader :action, :subject, :conditions
|
|
37
37
|
attr_writer :default_message
|
|
38
38
|
|
|
39
|
-
def initialize(message = nil, action = nil, subject = nil)
|
|
39
|
+
def initialize(message = nil, action = nil, subject = nil, conditions = nil)
|
|
40
40
|
@message = message
|
|
41
41
|
@action = action
|
|
42
42
|
@subject = subject
|
|
43
|
+
@conditions = conditions
|
|
43
44
|
@default_message = I18n.t(:"unauthorized.default", default: 'You are not authorized to access this page.')
|
|
44
45
|
end
|
|
45
46
|
|
|
@@ -3,7 +3,7 @@ module CanCan
|
|
|
3
3
|
class ActiveRecord4Adapter < AbstractAdapter
|
|
4
4
|
include ActiveRecordAdapter
|
|
5
5
|
def self.for_class?(model_class)
|
|
6
|
-
model_class <= ActiveRecord::Base
|
|
6
|
+
ActiveRecord::VERSION::MAJOR == 4 && model_class <= ActiveRecord::Base
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
# TODO: this should be private
|
|
@@ -39,11 +39,8 @@ module CanCan
|
|
|
39
39
|
|
|
40
40
|
# Rails 4.2 deprecates `sanitize_sql_hash_for_conditions`
|
|
41
41
|
def sanitize_sql(conditions)
|
|
42
|
-
if ActiveRecord::VERSION::
|
|
43
|
-
sanitize_sql_activerecord5(conditions)
|
|
44
|
-
elsif ActiveRecord::VERSION::MINOR >= 2 && conditions.is_a?(Hash)
|
|
42
|
+
if ActiveRecord::VERSION::MINOR >= 2 && conditions.is_a?(Hash)
|
|
45
43
|
sanitize_sql_activerecord4(conditions)
|
|
46
|
-
|
|
47
44
|
else
|
|
48
45
|
@model_class.send(:sanitize_sql, conditions)
|
|
49
46
|
end
|
|
@@ -59,21 +56,6 @@ module CanCan
|
|
|
59
56
|
@model_class.send(:connection).visitor.compile b
|
|
60
57
|
end.join(' AND ')
|
|
61
58
|
end
|
|
62
|
-
|
|
63
|
-
def sanitize_sql_activerecord5(conditions)
|
|
64
|
-
table = @model_class.send(:arel_table)
|
|
65
|
-
table_metadata = ActiveRecord::TableMetadata.new(@model_class, table)
|
|
66
|
-
predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
|
|
67
|
-
|
|
68
|
-
conditions = predicate_builder.resolve_column_aliases(conditions)
|
|
69
|
-
conditions = @model_class.send(:expand_hash_conditions_for_aggregates, conditions)
|
|
70
|
-
|
|
71
|
-
conditions.stringify_keys!
|
|
72
|
-
|
|
73
|
-
predicate_builder.build_from_hash(conditions).map do |b|
|
|
74
|
-
@model_class.send(:connection).visitor.compile b
|
|
75
|
-
end.join(' AND ')
|
|
76
|
-
end
|
|
77
59
|
end
|
|
78
60
|
end
|
|
79
61
|
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module CanCan
|
|
2
|
+
module ModelAdapters
|
|
3
|
+
class ActiveRecord5Adapter < ActiveRecord4Adapter
|
|
4
|
+
AbstractAdapter.inherited(self)
|
|
5
|
+
|
|
6
|
+
def self.for_class?(model_class)
|
|
7
|
+
ActiveRecord::VERSION::MAJOR == 5 && model_class <= ActiveRecord::Base
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# rails 5 is capable of using strings in enum
|
|
11
|
+
# but often people use symbols in rules
|
|
12
|
+
def self.matches_condition?(subject, name, value)
|
|
13
|
+
return super if Array.wrap(value).all? { |x| x.is_a? Integer }
|
|
14
|
+
|
|
15
|
+
attribute = subject.send(name)
|
|
16
|
+
if value.is_a?(Enumerable)
|
|
17
|
+
value.map(&:to_s).include? attribute
|
|
18
|
+
else
|
|
19
|
+
attribute == value.to_s
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# As of rails 4, `includes()` no longer causes active record to
|
|
26
|
+
# look inside the where clause to decide to outer join tables
|
|
27
|
+
# you're using in the where. Instead, `references()` is required
|
|
28
|
+
# in addition to `includes()` to force the outer join.
|
|
29
|
+
def build_relation(*where_conditions)
|
|
30
|
+
relation = @model_class.where(*where_conditions)
|
|
31
|
+
relation = relation.includes(joins).references(joins) if joins.present?
|
|
32
|
+
relation
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Rails 4.2 deprecates `sanitize_sql_hash_for_conditions`
|
|
36
|
+
def sanitize_sql(conditions)
|
|
37
|
+
if conditions.is_a?(Hash)
|
|
38
|
+
sanitize_sql_activerecord5(conditions)
|
|
39
|
+
else
|
|
40
|
+
@model_class.send(:sanitize_sql, conditions)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def sanitize_sql_activerecord5(conditions)
|
|
45
|
+
table = @model_class.send(:arel_table)
|
|
46
|
+
table_metadata = ActiveRecord::TableMetadata.new(@model_class, table)
|
|
47
|
+
predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
|
|
48
|
+
|
|
49
|
+
conditions = predicate_builder.resolve_column_aliases(conditions)
|
|
50
|
+
|
|
51
|
+
conditions.stringify_keys!
|
|
52
|
+
|
|
53
|
+
predicate_builder.build_from_hash(conditions).map do |b|
|
|
54
|
+
visit_nodes(b)
|
|
55
|
+
end.join(' AND ')
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def visit_nodes(b)
|
|
59
|
+
# Rails 5.2 adds a BindParam node that prevents the visitor method from properly compiling the SQL query
|
|
60
|
+
if ActiveRecord::VERSION::MINOR >= 2
|
|
61
|
+
connection = @model_class.send(:connection)
|
|
62
|
+
collector = Arel::Collectors::SubstituteBinds.new(connection, Arel::Collectors::SQLString.new)
|
|
63
|
+
connection.visitor.accept(b, collector).value
|
|
64
|
+
else
|
|
65
|
+
@model_class.send(:connection).visitor.compile(b)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
data/lib/cancan/version.rb
CHANGED
data/lib/cancan.rb
CHANGED
metadata
CHANGED
|
@@ -1,47 +1,48 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cancancan
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alessandro Rodi (Renuo AG)
|
|
8
8
|
- Bryan Rite
|
|
9
9
|
- Ryan Bates
|
|
10
10
|
- Richard Wilson
|
|
11
|
-
autorequire:
|
|
11
|
+
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date:
|
|
14
|
+
date: 2018-04-15 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
|
+
name: bundler
|
|
17
18
|
requirement: !ruby/object:Gem::Requirement
|
|
18
19
|
requirements:
|
|
19
20
|
- - "~>"
|
|
20
21
|
- !ruby/object:Gem::Version
|
|
21
22
|
version: '1.3'
|
|
22
|
-
name: bundler
|
|
23
|
-
prerelease: false
|
|
24
23
|
type: :development
|
|
24
|
+
prerelease: false
|
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
26
|
requirements:
|
|
27
27
|
- - "~>"
|
|
28
28
|
- !ruby/object:Gem::Version
|
|
29
29
|
version: '1.3'
|
|
30
30
|
- !ruby/object:Gem::Dependency
|
|
31
|
+
name: rubocop
|
|
31
32
|
requirement: !ruby/object:Gem::Requirement
|
|
32
33
|
requirements:
|
|
33
34
|
- - "~>"
|
|
34
35
|
- !ruby/object:Gem::Version
|
|
35
36
|
version: 0.48.1
|
|
36
|
-
name: rubocop
|
|
37
|
-
prerelease: false
|
|
38
37
|
type: :development
|
|
38
|
+
prerelease: false
|
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
40
40
|
requirements:
|
|
41
41
|
- - "~>"
|
|
42
42
|
- !ruby/object:Gem::Version
|
|
43
43
|
version: 0.48.1
|
|
44
44
|
- !ruby/object:Gem::Dependency
|
|
45
|
+
name: rake
|
|
45
46
|
requirement: !ruby/object:Gem::Requirement
|
|
46
47
|
requirements:
|
|
47
48
|
- - "~>"
|
|
@@ -50,9 +51,8 @@ dependencies:
|
|
|
50
51
|
- - ">="
|
|
51
52
|
- !ruby/object:Gem::Version
|
|
52
53
|
version: 10.1.1
|
|
53
|
-
name: rake
|
|
54
|
-
prerelease: false
|
|
55
54
|
type: :development
|
|
55
|
+
prerelease: false
|
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - "~>"
|
|
@@ -62,6 +62,7 @@ dependencies:
|
|
|
62
62
|
- !ruby/object:Gem::Version
|
|
63
63
|
version: 10.1.1
|
|
64
64
|
- !ruby/object:Gem::Dependency
|
|
65
|
+
name: rspec
|
|
65
66
|
requirement: !ruby/object:Gem::Requirement
|
|
66
67
|
requirements:
|
|
67
68
|
- - "~>"
|
|
@@ -70,9 +71,8 @@ dependencies:
|
|
|
70
71
|
- - ">="
|
|
71
72
|
- !ruby/object:Gem::Version
|
|
72
73
|
version: 3.2.0
|
|
73
|
-
name: rspec
|
|
74
|
-
prerelease: false
|
|
75
74
|
type: :development
|
|
75
|
+
prerelease: false
|
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
|
77
77
|
requirements:
|
|
78
78
|
- - "~>"
|
|
@@ -82,6 +82,7 @@ dependencies:
|
|
|
82
82
|
- !ruby/object:Gem::Version
|
|
83
83
|
version: 3.2.0
|
|
84
84
|
- !ruby/object:Gem::Dependency
|
|
85
|
+
name: appraisal
|
|
85
86
|
requirement: !ruby/object:Gem::Requirement
|
|
86
87
|
requirements:
|
|
87
88
|
- - "~>"
|
|
@@ -90,9 +91,8 @@ dependencies:
|
|
|
90
91
|
- - ">="
|
|
91
92
|
- !ruby/object:Gem::Version
|
|
92
93
|
version: 2.0.0
|
|
93
|
-
name: appraisal
|
|
94
|
-
prerelease: false
|
|
95
94
|
type: :development
|
|
95
|
+
prerelease: false
|
|
96
96
|
version_requirements: !ruby/object:Gem::Requirement
|
|
97
97
|
requirements:
|
|
98
98
|
- - "~>"
|
|
@@ -101,7 +101,8 @@ dependencies:
|
|
|
101
101
|
- - ">="
|
|
102
102
|
- !ruby/object:Gem::Version
|
|
103
103
|
version: 2.0.0
|
|
104
|
-
description: Simple authorization solution for Rails. All permissions are stored in
|
|
104
|
+
description: Simple authorization solution for Rails. All permissions are stored in
|
|
105
|
+
a single location.
|
|
105
106
|
email: alessandro.rodi@renuo.ch
|
|
106
107
|
executables: []
|
|
107
108
|
extensions: []
|
|
@@ -125,6 +126,7 @@ files:
|
|
|
125
126
|
- lib/cancan/matchers.rb
|
|
126
127
|
- lib/cancan/model_adapters/abstract_adapter.rb
|
|
127
128
|
- lib/cancan/model_adapters/active_record_4_adapter.rb
|
|
129
|
+
- lib/cancan/model_adapters/active_record_5_adapter.rb
|
|
128
130
|
- lib/cancan/model_adapters/active_record_adapter.rb
|
|
129
131
|
- lib/cancan/model_adapters/can_can/model_adapters/active_record_adapter/joins.rb
|
|
130
132
|
- lib/cancan/model_adapters/default_adapter.rb
|
|
@@ -139,7 +141,7 @@ homepage: https://github.com/CanCanCommunity/cancancan
|
|
|
139
141
|
licenses:
|
|
140
142
|
- MIT
|
|
141
143
|
metadata: {}
|
|
142
|
-
post_install_message:
|
|
144
|
+
post_install_message:
|
|
143
145
|
rdoc_options: []
|
|
144
146
|
require_paths:
|
|
145
147
|
- lib
|
|
@@ -147,16 +149,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
147
149
|
requirements:
|
|
148
150
|
- - ">="
|
|
149
151
|
- !ruby/object:Gem::Version
|
|
150
|
-
version: 2.
|
|
152
|
+
version: 2.2.0
|
|
151
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
154
|
requirements:
|
|
153
155
|
- - ">="
|
|
154
156
|
- !ruby/object:Gem::Version
|
|
155
157
|
version: '0'
|
|
156
158
|
requirements: []
|
|
157
|
-
rubyforge_project:
|
|
158
|
-
rubygems_version: 2.4
|
|
159
|
-
signing_key:
|
|
159
|
+
rubyforge_project:
|
|
160
|
+
rubygems_version: 2.7.4
|
|
161
|
+
signing_key:
|
|
160
162
|
specification_version: 4
|
|
161
163
|
summary: Simple authorization solution for Rails.
|
|
162
164
|
test_files: []
|