cancancan 2.1.4 → 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 +4 -4
- data/lib/cancan.rb +1 -0
- data/lib/cancan/ability.rb +1 -1
- data/lib/cancan/controller_additions.rb +2 -10
- 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
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
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/lib/cancan.rb
CHANGED
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,14 +384,6 @@ module CanCan
|
|
384
384
|
end
|
385
385
|
end
|
386
386
|
|
387
|
-
|
388
|
-
|
389
|
-
include CanCan::ControllerAdditions
|
390
|
-
end
|
391
|
-
end
|
392
|
-
|
393
|
-
if defined? ActionController::API
|
394
|
-
ActionController::API.class_eval do
|
395
|
-
include CanCan::ControllerAdditions
|
396
|
-
end
|
387
|
+
ActiveSupport.on_load(:action_controller) do
|
388
|
+
include CanCan::ControllerAdditions
|
397
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
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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)
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2018-04-
|
14
|
+
date: 2018-04-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- lib/cancan/matchers.rb
|
127
127
|
- lib/cancan/model_adapters/abstract_adapter.rb
|
128
128
|
- lib/cancan/model_adapters/active_record_4_adapter.rb
|
129
|
+
- lib/cancan/model_adapters/active_record_5_adapter.rb
|
129
130
|
- lib/cancan/model_adapters/active_record_adapter.rb
|
130
131
|
- lib/cancan/model_adapters/can_can/model_adapters/active_record_adapter/joins.rb
|
131
132
|
- lib/cancan/model_adapters/default_adapter.rb
|