cancancan 1.8.4 → 1.9.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/.travis.yml +15 -0
- data/Appraisals +28 -0
- data/CHANGELOG.rdoc +7 -0
- data/README.rdoc +1 -1
- data/gemfiles/activerecord_4.0.gemfile +17 -0
- data/gemfiles/activerecord_4.1.gemfile +17 -0
- data/lib/cancan.rb +11 -1
- data/lib/cancan/controller_additions.rb +1 -1
- data/lib/cancan/controller_resource.rb +14 -7
- data/lib/cancan/model_adapters/active_record_3_adapter.rb +47 -0
- data/lib/cancan/model_adapters/active_record_4_adapter.rb +21 -0
- data/lib/cancan/model_adapters/active_record_adapter.rb +8 -40
- data/lib/cancan/version.rb +1 -1
- data/spec/cancan/controller_resource_spec.rb +36 -25
- data/spec/cancan/model_adapters/active_record_adapter_spec.rb +37 -5
- data/spec/spec_helper.rb +3 -1
- metadata +8 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 59fd5f683924f32658036d91ec731a03dc2620f0
|
|
4
|
+
data.tar.gz: 80ada1d8d82e08dae4f39afa0f4fc6e0bba1a43b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f7854cb0fd225fc65ca36e2ae8b3d257e2509ebc092801a1802686bd2537dcb3c53f0e522f3d9a43b15ded9765a026c9d11c3588f4a4ff28bd752606fa01788c
|
|
7
|
+
data.tar.gz: e98f2b6d8defb75df838a82a5c0a28befdec610db7be82f119e70a922d953963fc7c268d014668ccf28c5fd54ccabbda9ca8d8bba4e175b587a36093f4da76b4
|
data/.travis.yml
CHANGED
|
@@ -11,6 +11,8 @@ gemfile:
|
|
|
11
11
|
- gemfiles/activerecord_3.0.gemfile
|
|
12
12
|
- gemfiles/activerecord_3.1.gemfile
|
|
13
13
|
- gemfiles/activerecord_3.2.gemfile
|
|
14
|
+
- gemfiles/activerecord_4.0.gemfile
|
|
15
|
+
- gemfiles/activerecord_4.1.gemfile
|
|
14
16
|
- gemfiles/datamapper_1.x.gemfile
|
|
15
17
|
- gemfiles/mongoid_2.x.gemfile
|
|
16
18
|
- gemfiles/sequel_3.x.gemfile
|
|
@@ -19,6 +21,19 @@ services:
|
|
|
19
21
|
matrix:
|
|
20
22
|
allow_failures:
|
|
21
23
|
- rvm: rbx
|
|
24
|
+
exclude:
|
|
25
|
+
- rvm: 1.8.7
|
|
26
|
+
gemfile: gemfiles/activerecord_4.0.gemfile
|
|
27
|
+
- rvm: 1.8.7
|
|
28
|
+
gemfile: gemfiles/activerecord_4.1.gemfile
|
|
29
|
+
- rvm: 1.9.2
|
|
30
|
+
gemfile: gemfiles/activerecord_4.0.gemfile
|
|
31
|
+
- rvm: 1.9.2
|
|
32
|
+
gemfile: gemfiles/activerecord_4.1.gemfile
|
|
33
|
+
- rvm: ree
|
|
34
|
+
gemfile: gemfiles/activerecord_4.0.gemfile
|
|
35
|
+
- rvm: ree
|
|
36
|
+
gemfile: gemfiles/activerecord_4.1.gemfile
|
|
22
37
|
notifications:
|
|
23
38
|
recipients:
|
|
24
39
|
- bryan@bryanrite.com
|
data/Appraisals
CHANGED
|
@@ -39,6 +39,34 @@ appraise "activerecord_3.2" do
|
|
|
39
39
|
end
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
appraise "activerecord_4.0" do
|
|
43
|
+
gem "activerecord", "~> 4.0.5", :require => "active_record"
|
|
44
|
+
gem 'activesupport', '~> 4.0.5', :require => 'active_support/all'
|
|
45
|
+
|
|
46
|
+
gemfile.platforms :jruby do
|
|
47
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
|
48
|
+
gem "jdbc-sqlite3"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
gemfile.platforms :ruby, :mswin, :mingw do
|
|
52
|
+
gem "sqlite3"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
appraise "activerecord_4.1" do
|
|
57
|
+
gem "activerecord", "~> 4.1.1", :require => "active_record"
|
|
58
|
+
gem 'activesupport', '~> 4.1.1', :require => 'active_support/all'
|
|
59
|
+
|
|
60
|
+
gemfile.platforms :jruby do
|
|
61
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
|
62
|
+
gem "jdbc-sqlite3"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
gemfile.platforms :ruby, :mswin, :mingw do
|
|
66
|
+
gem "sqlite3"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
42
70
|
appraise "datamapper_1.x" do
|
|
43
71
|
gem 'activesupport', '~> 3.0', :require => 'active_support/all'
|
|
44
72
|
gem "dm-core", "~> 1.0.2"
|
data/CHANGELOG.rdoc
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
Develop
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
1.9.0 (July 20th, 2014)
|
|
5
|
+
|
|
6
|
+
* Fix cancancan#59 - Parameters are automatically detected and santitized for all actions, not just create and update. (bryanrite)
|
|
7
|
+
|
|
8
|
+
* Fix cancancan#97, 72, 40, 39, 26 - Support Active Record 4 properly with references on nested permissions. (scpike, tdg5, Crystark)
|
|
9
|
+
|
|
10
|
+
|
|
4
11
|
1.8.4 (June 24th, 2014)
|
|
5
12
|
|
|
6
13
|
* Fix cancancan#86 - Fixes previous RSpec 3 update as there was a bug in the fix for RSpec 2.99. (bryanrite)
|
data/README.rdoc
CHANGED
|
@@ -22,7 +22,7 @@ Any help is greatly appreciated, feel free to submit pull-requests or open issue
|
|
|
22
22
|
|
|
23
23
|
In <b>Rails 3 and 4</b>, add this to your Gemfile and run the +bundle+ command.
|
|
24
24
|
|
|
25
|
-
gem 'cancancan', '~> 1.
|
|
25
|
+
gem 'cancancan', '~> 1.9'
|
|
26
26
|
|
|
27
27
|
In <b>Rails 2</b>, add this to your environment.rb file.
|
|
28
28
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# This file was generated by Appraisal
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
gem "activerecord", "~> 4.0.5", :require => "active_record"
|
|
6
|
+
gem "activesupport", "~> 4.0.5", :require => "active_support/all"
|
|
7
|
+
|
|
8
|
+
platforms :jruby do
|
|
9
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
|
10
|
+
gem "jdbc-sqlite3"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
platforms :ruby, :mswin, :mingw do
|
|
14
|
+
gem "sqlite3"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
gemspec :path => "../"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# This file was generated by Appraisal
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
gem "activerecord", "~> 4.1.1", :require => "active_record"
|
|
6
|
+
gem "activesupport", "~> 4.1.1", :require => "active_support/all"
|
|
7
|
+
|
|
8
|
+
platforms :jruby do
|
|
9
|
+
gem "activerecord-jdbcsqlite3-adapter"
|
|
10
|
+
gem "jdbc-sqlite3"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
platforms :ruby, :mswin, :mingw do
|
|
14
|
+
gem "sqlite3"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
gemspec :path => "../"
|
data/lib/cancan.rb
CHANGED
|
@@ -9,7 +9,17 @@ require 'cancan/inherited_resource'
|
|
|
9
9
|
|
|
10
10
|
require 'cancan/model_adapters/abstract_adapter'
|
|
11
11
|
require 'cancan/model_adapters/default_adapter'
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
if defined? ActiveRecord
|
|
14
|
+
require 'cancan/model_adapters/active_record_adapter'
|
|
15
|
+
if ActiveRecord.respond_to?(:version) &&
|
|
16
|
+
ActiveRecord.version >= Gem::Version.new("4")
|
|
17
|
+
require 'cancan/model_adapters/active_record_4_adapter'
|
|
18
|
+
else
|
|
19
|
+
require 'cancan/model_adapters/active_record_3_adapter'
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
13
23
|
require 'cancan/model_adapters/data_mapper_adapter' if defined? DataMapper
|
|
14
24
|
require 'cancan/model_adapters/mongoid_adapter' if defined?(Mongoid) && defined?(Mongoid::Document)
|
|
15
25
|
require 'cancan/model_adapters/sequel_adapter' if defined? Sequel
|
|
@@ -294,7 +294,7 @@ module CanCan
|
|
|
294
294
|
|
|
295
295
|
def self.included(base)
|
|
296
296
|
base.extend ClassMethods
|
|
297
|
-
base.helper_method :can?, :cannot?, :current_ability
|
|
297
|
+
base.helper_method :can?, :cannot?, :current_ability if base.respond_to? :helper_method
|
|
298
298
|
end
|
|
299
299
|
|
|
300
300
|
# Raises a CanCan::AccessDenied exception if the current_ability cannot
|
|
@@ -220,22 +220,29 @@ module CanCan
|
|
|
220
220
|
end
|
|
221
221
|
|
|
222
222
|
def resource_params
|
|
223
|
-
if
|
|
223
|
+
if parameters_require_sanitizing? && params_method.present?
|
|
224
224
|
return case params_method
|
|
225
225
|
when Symbol then @controller.send(params_method)
|
|
226
226
|
when String then @controller.instance_eval(params_method)
|
|
227
227
|
when Proc then params_method.call(@controller)
|
|
228
228
|
end
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
return @params[params_key] if @params[params_key]
|
|
229
|
+
else
|
|
230
|
+
resource_params_by_namespaced_name
|
|
232
231
|
end
|
|
232
|
+
end
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
def parameters_require_sanitizing?
|
|
235
|
+
save_actions.include?(@params[:action].to_sym) || resource_params_by_namespaced_name.present?
|
|
235
236
|
end
|
|
236
237
|
|
|
237
238
|
def resource_params_by_namespaced_name
|
|
238
|
-
@params
|
|
239
|
+
if @options[:instance_name] && @params.has_key?(extract_key(@options[:instance_name]))
|
|
240
|
+
@params[extract_key(@options[:instance_name])]
|
|
241
|
+
elsif @options[:class] && @params.has_key?(extract_key(@options[:class]))
|
|
242
|
+
@params[extract_key(@options[:class])]
|
|
243
|
+
else
|
|
244
|
+
@params[extract_key(namespaced_name)]
|
|
245
|
+
end
|
|
239
246
|
end
|
|
240
247
|
|
|
241
248
|
def params_method
|
|
@@ -277,7 +284,7 @@ module CanCan
|
|
|
277
284
|
[:new, :create] + Array(@options[:new])
|
|
278
285
|
end
|
|
279
286
|
|
|
280
|
-
def
|
|
287
|
+
def save_actions
|
|
281
288
|
[:create, :update]
|
|
282
289
|
end
|
|
283
290
|
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module CanCan
|
|
2
|
+
module ModelAdapters
|
|
3
|
+
class ActiveRecord3Adapter < AbstractAdapter
|
|
4
|
+
include ActiveRecordAdapter
|
|
5
|
+
def self.for_class?(model_class)
|
|
6
|
+
model_class <= ActiveRecord::Base
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def self.override_condition_matching?(subject, name, value)
|
|
10
|
+
name.kind_of?(MetaWhere::Column) if defined? MetaWhere
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.matches_condition?(subject, name, value)
|
|
14
|
+
subject_value = subject.send(name.column)
|
|
15
|
+
if name.method.to_s.ends_with? "_any"
|
|
16
|
+
value.any? { |v| meta_where_match? subject_value, name.method.to_s.sub("_any", ""), v }
|
|
17
|
+
elsif name.method.to_s.ends_with? "_all"
|
|
18
|
+
value.all? { |v| meta_where_match? subject_value, name.method.to_s.sub("_all", ""), v }
|
|
19
|
+
else
|
|
20
|
+
meta_where_match? subject_value, name.method, value
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.meta_where_match?(subject_value, method, value)
|
|
25
|
+
case method.to_sym
|
|
26
|
+
when :eq then subject_value == value
|
|
27
|
+
when :not_eq then subject_value != value
|
|
28
|
+
when :in then value.include?(subject_value)
|
|
29
|
+
when :not_in then !value.include?(subject_value)
|
|
30
|
+
when :lt then subject_value < value
|
|
31
|
+
when :lteq then subject_value <= value
|
|
32
|
+
when :gt then subject_value > value
|
|
33
|
+
when :gteq then subject_value >= value
|
|
34
|
+
when :matches then subject_value =~ Regexp.new("^" + Regexp.escape(value).gsub("%", ".*") + "$", true)
|
|
35
|
+
when :does_not_match then !meta_where_match?(subject_value, :matches, value)
|
|
36
|
+
else raise NotImplemented, "The #{method} MetaWhere condition is not supported."
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def build_relation(*where_conditions)
|
|
43
|
+
@model_class.where(*where_conditions).includes(joins)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module CanCan
|
|
2
|
+
module ModelAdapters
|
|
3
|
+
class ActiveRecord4Adapter < AbstractAdapter
|
|
4
|
+
include ActiveRecordAdapter
|
|
5
|
+
def self.for_class?(model_class)
|
|
6
|
+
model_class <= ActiveRecord::Base
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
# As of rails 4, `includes()` no longer causes active record to
|
|
12
|
+
# look inside the where clause to decide to outer join tables
|
|
13
|
+
# you're using in the where. Instead, `references()` is required
|
|
14
|
+
# in addition to `includes()` to force the outer join.
|
|
15
|
+
#
|
|
16
|
+
def build_relation(*where_conditions)
|
|
17
|
+
@model_class.where(*where_conditions).includes(joins).references(joins)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -1,41 +1,6 @@
|
|
|
1
1
|
module CanCan
|
|
2
2
|
module ModelAdapters
|
|
3
|
-
|
|
4
|
-
def self.for_class?(model_class)
|
|
5
|
-
model_class <= ActiveRecord::Base
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def self.override_condition_matching?(subject, name, value)
|
|
9
|
-
name.kind_of?(MetaWhere::Column) if defined? MetaWhere
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def self.matches_condition?(subject, name, value)
|
|
13
|
-
subject_value = subject.send(name.column)
|
|
14
|
-
if name.method.to_s.ends_with? "_any"
|
|
15
|
-
value.any? { |v| meta_where_match? subject_value, name.method.to_s.sub("_any", ""), v }
|
|
16
|
-
elsif name.method.to_s.ends_with? "_all"
|
|
17
|
-
value.all? { |v| meta_where_match? subject_value, name.method.to_s.sub("_all", ""), v }
|
|
18
|
-
else
|
|
19
|
-
meta_where_match? subject_value, name.method, value
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def self.meta_where_match?(subject_value, method, value)
|
|
24
|
-
case method.to_sym
|
|
25
|
-
when :eq then subject_value == value
|
|
26
|
-
when :not_eq then subject_value != value
|
|
27
|
-
when :in then value.include?(subject_value)
|
|
28
|
-
when :not_in then !value.include?(subject_value)
|
|
29
|
-
when :lt then subject_value < value
|
|
30
|
-
when :lteq then subject_value <= value
|
|
31
|
-
when :gt then subject_value > value
|
|
32
|
-
when :gteq then subject_value >= value
|
|
33
|
-
when :matches then subject_value =~ Regexp.new("^" + Regexp.escape(value).gsub("%", ".*") + "$", true)
|
|
34
|
-
when :does_not_match then !meta_where_match?(subject_value, :matches, value)
|
|
35
|
-
else raise NotImplemented, "The #{method} MetaWhere condition is not supported."
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
3
|
+
module ActiveRecordAdapter
|
|
39
4
|
# Returns conditions intended to be used inside a database query. Normally you will not call this
|
|
40
5
|
# method directly, but instead go through ModelAdditions#accessible_by.
|
|
41
6
|
#
|
|
@@ -99,11 +64,10 @@ module CanCan
|
|
|
99
64
|
if override_scope
|
|
100
65
|
@model_class.where(nil).merge(override_scope)
|
|
101
66
|
elsif @model_class.respond_to?(:where) && @model_class.respond_to?(:joins)
|
|
102
|
-
mergeable_conditions
|
|
103
|
-
|
|
104
|
-
@model_class.where(conditions).includes(joins)
|
|
67
|
+
if mergeable_conditions?
|
|
68
|
+
build_relation(conditions)
|
|
105
69
|
else
|
|
106
|
-
|
|
70
|
+
build_relation(*(@rules.map(&:conditions)))
|
|
107
71
|
end
|
|
108
72
|
else
|
|
109
73
|
@model_class.all(:conditions => conditions, :joins => joins)
|
|
@@ -112,6 +76,10 @@ module CanCan
|
|
|
112
76
|
|
|
113
77
|
private
|
|
114
78
|
|
|
79
|
+
def mergeable_conditions?
|
|
80
|
+
@rules.find {|rule| rule.unmergeable? }.blank?
|
|
81
|
+
end
|
|
82
|
+
|
|
115
83
|
def override_scope
|
|
116
84
|
conditions = @rules.map(&:conditions).compact
|
|
117
85
|
if defined?(ActiveRecord::Relation) && conditions.any? { |c| c.kind_of?(ActiveRecord::Relation) }
|
data/lib/cancan/version.rb
CHANGED
|
@@ -125,8 +125,11 @@ describe CanCan::ControllerResource do
|
|
|
125
125
|
end
|
|
126
126
|
|
|
127
127
|
context "with a strong parameters method" do
|
|
128
|
+
before :each do
|
|
129
|
+
params.merge!(:controller => "model", :model => { :name => 'test'})
|
|
130
|
+
end
|
|
131
|
+
|
|
128
132
|
it "accepts and uses the specified symbol for santitizing input" do
|
|
129
|
-
params.merge!(:controller => "model")
|
|
130
133
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
|
131
134
|
allow(controller).to receive(:model_params).and_return(:model => 'params')
|
|
132
135
|
allow(controller).to receive(:create_params).and_return(:create => 'params')
|
|
@@ -136,19 +139,16 @@ describe CanCan::ControllerResource do
|
|
|
136
139
|
end
|
|
137
140
|
|
|
138
141
|
it "accepts the specified string for sanitizing input" do
|
|
139
|
-
params.merge!(:controller => "model")
|
|
140
142
|
resource = CanCan::ControllerResource.new(controller, {:param_method => "{:custom => 'params'}"})
|
|
141
143
|
expect(resource.send("resource_params")).to eq(:custom => 'params')
|
|
142
144
|
end
|
|
143
145
|
|
|
144
146
|
it "accepts the specified proc for sanitizing input" do
|
|
145
|
-
params.merge!(:controller => "model")
|
|
146
147
|
resource = CanCan::ControllerResource.new(controller, {:param_method => Proc.new { |c| {:custom => 'params'}}})
|
|
147
148
|
expect(resource.send("resource_params")).to eq(:custom => 'params')
|
|
148
149
|
end
|
|
149
150
|
|
|
150
151
|
it "prefers to use the create_params method for santitizing input" do
|
|
151
|
-
params.merge!(:controller => "model")
|
|
152
152
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
|
153
153
|
allow(controller).to receive(:model_params).and_return(:model => 'params')
|
|
154
154
|
allow(controller).to receive(:create_params).and_return(:create => 'params')
|
|
@@ -158,7 +158,6 @@ describe CanCan::ControllerResource do
|
|
|
158
158
|
end
|
|
159
159
|
|
|
160
160
|
it "prefers to use the <model_name>_params method for santitizing input if create is not found" do
|
|
161
|
-
params.merge!(:controller => "model")
|
|
162
161
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
|
163
162
|
allow(controller).to receive(:model_params).and_return(:model => 'params')
|
|
164
163
|
allow(controller).to receive(:custom_params).and_return(:custom => 'params')
|
|
@@ -167,7 +166,6 @@ describe CanCan::ControllerResource do
|
|
|
167
166
|
end
|
|
168
167
|
|
|
169
168
|
it "prefers to use the resource_params method for santitizing input if create or model is not found" do
|
|
170
|
-
params.merge!(:controller => "model")
|
|
171
169
|
allow(controller).to receive(:resource_params).and_return(:resource => 'params')
|
|
172
170
|
allow(controller).to receive(:custom_params).and_return(:custom => 'params')
|
|
173
171
|
resource = CanCan::ControllerResource.new(controller)
|
|
@@ -508,28 +506,41 @@ describe CanCan::ControllerResource do
|
|
|
508
506
|
end
|
|
509
507
|
end
|
|
510
508
|
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
end
|
|
509
|
+
it "calls the santitizer when the parameter hash matches our object" do
|
|
510
|
+
params.merge!(:action => 'create', :model => { :name => 'test' })
|
|
511
|
+
allow(controller).to receive(:create_params).and_return({})
|
|
515
512
|
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
allow(resource).to receive(:param_actions) { [:create] }
|
|
513
|
+
resource = CanCan::ControllerResource.new(controller)
|
|
514
|
+
resource.load_resource
|
|
515
|
+
expect(controller.instance_variable_get(:@model).name).to eq nil
|
|
516
|
+
end
|
|
521
517
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
518
|
+
it "santitizes correctly when the instance name is overriden" do
|
|
519
|
+
params.merge!(:action => 'create', :custom_name => {:name => "foobar"})
|
|
520
|
+
allow(controller).to receive(:create_params).and_return({})
|
|
525
521
|
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
522
|
+
resource = CanCan::ControllerResource.new(controller, :instance_name => :custom_name)
|
|
523
|
+
resource.load_resource
|
|
524
|
+
expect(controller.instance_variable_get(:@custom_name).name).to eq nil
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
it "calls the santitize method on non-save actions when required" do
|
|
528
|
+
params.merge!(:action => 'new', :model => { :name => 'test' })
|
|
529
|
+
|
|
530
|
+
allow(controller).to receive(:resource_params).and_return({})
|
|
531
|
+
resource = CanCan::ControllerResource.new(controller)
|
|
532
|
+
resource.load_resource
|
|
533
|
+
expect(controller.instance_variable_get(:@model).name).to eq nil
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
it "doesn't sanitize parameters on non-save actions when not required" do
|
|
537
|
+
params.merge!(:action => 'new', :not_our_model => { :name => 'test' })
|
|
538
|
+
allow(controller).to receive(:resource_params).and_raise
|
|
539
|
+
|
|
540
|
+
resource = CanCan::ControllerResource.new(controller)
|
|
541
|
+
expect {
|
|
542
|
+
resource.load_resource
|
|
543
|
+
}.to_not raise_error
|
|
533
544
|
end
|
|
534
545
|
|
|
535
546
|
it "is a parent resource when name is provided which doesn't match controller" do
|
|
@@ -35,6 +35,12 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
|
35
35
|
t.timestamps
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
+
create_table(:legacy_mentions) do |t|
|
|
39
|
+
t.integer :user_id
|
|
40
|
+
t.integer :article_id
|
|
41
|
+
t.timestamps
|
|
42
|
+
end
|
|
43
|
+
|
|
38
44
|
create_table(:users) do |t|
|
|
39
45
|
t.timestamps
|
|
40
46
|
end
|
|
@@ -50,9 +56,17 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
|
50
56
|
class Article < ActiveRecord::Base
|
|
51
57
|
belongs_to :category
|
|
52
58
|
has_many :comments
|
|
59
|
+
has_many :mentions
|
|
60
|
+
has_many :mentioned_users, :through => :mentions, :source => :user
|
|
53
61
|
belongs_to :user
|
|
54
62
|
end
|
|
55
63
|
|
|
64
|
+
class Mention < ActiveRecord::Base
|
|
65
|
+
self.table_name = 'legacy_mentions'
|
|
66
|
+
belongs_to :user
|
|
67
|
+
belongs_to :article
|
|
68
|
+
end
|
|
69
|
+
|
|
56
70
|
class Comment < ActiveRecord::Base
|
|
57
71
|
belongs_to :article
|
|
58
72
|
end
|
|
@@ -67,14 +81,22 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
|
67
81
|
end
|
|
68
82
|
|
|
69
83
|
it "is for only active record classes" do
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
if ActiveRecord.respond_to?(:version) &&
|
|
85
|
+
ActiveRecord.version > Gem::Version.new("4")
|
|
86
|
+
expect(CanCan::ModelAdapters::ActiveRecord4Adapter).to_not be_for_class(Object)
|
|
87
|
+
expect(CanCan::ModelAdapters::ActiveRecord4Adapter).to be_for_class(Article)
|
|
88
|
+
expect(CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)).to eq(CanCan::ModelAdapters::ActiveRecord4Adapter)
|
|
89
|
+
else
|
|
90
|
+
expect(CanCan::ModelAdapters::ActiveRecord3Adapter).to_not be_for_class(Object)
|
|
91
|
+
expect(CanCan::ModelAdapters::ActiveRecord3Adapter).to be_for_class(Article)
|
|
92
|
+
expect(CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)).to eq(CanCan::ModelAdapters::ActiveRecord3Adapter)
|
|
93
|
+
end
|
|
73
94
|
end
|
|
74
95
|
|
|
75
96
|
it "finds record" do
|
|
76
97
|
article = Article.create!
|
|
77
|
-
|
|
98
|
+
adapter = CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)
|
|
99
|
+
expect(adapter.find(Article, article.id)).to eq(article)
|
|
78
100
|
end
|
|
79
101
|
|
|
80
102
|
it "does not fetch any records when no abilities are defined" do
|
|
@@ -105,6 +127,16 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
|
105
127
|
expect(Article.accessible_by(@ability)).to eq([article1, article2, article3])
|
|
106
128
|
end
|
|
107
129
|
|
|
130
|
+
it "fetches any articles which we are cited in" do
|
|
131
|
+
user = User.create!
|
|
132
|
+
cited = Article.create!
|
|
133
|
+
not_cited = Article.create!
|
|
134
|
+
cited.mentioned_users << user
|
|
135
|
+
@ability.can :read, Article, { :mentioned_users => { :id => user.id } }
|
|
136
|
+
@ability.can :read, Article, { :mentions => { :user_id => user.id } }
|
|
137
|
+
expect(Article.accessible_by(@ability)).to eq([cited])
|
|
138
|
+
end
|
|
139
|
+
|
|
108
140
|
it "fetches only the articles that are published and not secret" do
|
|
109
141
|
@ability.can :read, Article, :published => true
|
|
110
142
|
@ability.cannot :read, Article, :secret => true
|
|
@@ -337,7 +369,7 @@ if defined? CanCan::ModelAdapters::ActiveRecordAdapter
|
|
|
337
369
|
end
|
|
338
370
|
|
|
339
371
|
it "matches any MetaWhere condition" do
|
|
340
|
-
adapter = CanCan::ModelAdapters::
|
|
372
|
+
adapter = CanCan::ModelAdapters::AbstractAdapter.adapter_class(Article)
|
|
341
373
|
article1 = Article.new(:priority => 1, :name => "Hello World")
|
|
342
374
|
expect(adapter.matches_condition?(article1, :priority.eq, 1)).to be(true)
|
|
343
375
|
expect(adapter.matches_condition?(article1, :priority.eq, 2)).to be(false)
|
data/spec/spec_helper.rb
CHANGED
|
@@ -7,7 +7,9 @@ require 'matchers'
|
|
|
7
7
|
require 'cancan/matchers'
|
|
8
8
|
|
|
9
9
|
# I8n setting to fix deprecation.
|
|
10
|
-
|
|
10
|
+
if defined?(I18n) && I18n.respond_to?('enforce_available_locales=')
|
|
11
|
+
I18n.enforce_available_locales = false
|
|
12
|
+
end
|
|
11
13
|
|
|
12
14
|
# Add support to load paths
|
|
13
15
|
$:.unshift File.expand_path('../support', __FILE__)
|
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: 1.
|
|
4
|
+
version: 1.9.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Bryan Rite
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2014-
|
|
12
|
+
date: 2014-07-20 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -88,6 +88,8 @@ files:
|
|
|
88
88
|
- gemfiles/activerecord_3.0.gemfile
|
|
89
89
|
- gemfiles/activerecord_3.1.gemfile
|
|
90
90
|
- gemfiles/activerecord_3.2.gemfile
|
|
91
|
+
- gemfiles/activerecord_4.0.gemfile
|
|
92
|
+
- gemfiles/activerecord_4.1.gemfile
|
|
91
93
|
- gemfiles/datamapper_1.x.gemfile
|
|
92
94
|
- gemfiles/mongoid_2.x.gemfile
|
|
93
95
|
- gemfiles/sequel_3.x.gemfile
|
|
@@ -100,6 +102,8 @@ files:
|
|
|
100
102
|
- lib/cancan/inherited_resource.rb
|
|
101
103
|
- lib/cancan/matchers.rb
|
|
102
104
|
- lib/cancan/model_adapters/abstract_adapter.rb
|
|
105
|
+
- lib/cancan/model_adapters/active_record_3_adapter.rb
|
|
106
|
+
- lib/cancan/model_adapters/active_record_4_adapter.rb
|
|
103
107
|
- lib/cancan/model_adapters/active_record_adapter.rb
|
|
104
108
|
- lib/cancan/model_adapters/data_mapper_adapter.rb
|
|
105
109
|
- lib/cancan/model_adapters/default_adapter.rb
|
|
@@ -158,6 +162,8 @@ test_files:
|
|
|
158
162
|
- gemfiles/activerecord_3.0.gemfile
|
|
159
163
|
- gemfiles/activerecord_3.1.gemfile
|
|
160
164
|
- gemfiles/activerecord_3.2.gemfile
|
|
165
|
+
- gemfiles/activerecord_4.0.gemfile
|
|
166
|
+
- gemfiles/activerecord_4.1.gemfile
|
|
161
167
|
- gemfiles/datamapper_1.x.gemfile
|
|
162
168
|
- gemfiles/mongoid_2.x.gemfile
|
|
163
169
|
- gemfiles/sequel_3.x.gemfile
|