protector 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d35910dd47bbaec6c4fa77c49edb1643b7ab614
4
- data.tar.gz: 6d7e0b11f3c750004281dc432372d8e6e9b01cad
3
+ metadata.gz: 75c42dc51baa287fb4d302415f78e383687b88b0
4
+ data.tar.gz: e11a06fc1a46d40deeb04c36295e5efce4795bbf
5
5
  SHA512:
6
- metadata.gz: 41f684019bb41d363579165474abfc9b280bd9bbaad66bd034b4735fe1a1acb8404941dd9d3f269969e44945fa42b612bb393b508f3be2ed147b8a9878830e58
7
- data.tar.gz: 2cbf62c1a0da1f6ae6e15d97677cd5594641bcda24987460648625fdad83a163fdf5f0c6e7c35b2041bbdef65ea3ec040a49fd01f4cc4ddfc1b9e7acd56e24c9
6
+ metadata.gz: c5c613251c76af90245f55031a26711a193f84474e86d68f352b2afb1d9afb3fd9c77a92faaa396816f00dcf0a579a548fc242766920e600318dd73a1d0e87f0
7
+ data.tar.gz: 14f326b243705cdfd75bf132b42c04a8d9e06db85ee6ffa69d9e955251cabe936da2d99a4ecafdd7fe6beb99e01512a84b4e705e7b80e49f1dc242a0017633e8
data/Appraisals CHANGED
@@ -7,3 +7,11 @@ appraise "AR_4" do
7
7
  gem "activerecord", "4.0.0.rc1", require: "active_record"
8
8
  gem "activerecord-jdbcsqlite3-adapter", platform: :jruby, github: "jruby/activerecord-jdbc-adapter"
9
9
  end
10
+
11
+ appraise "Sequel" do
12
+ gem "sequel", "3.30.0"
13
+ end
14
+
15
+ # appraise "Mongoid" do
16
+ # gem "mongoid", ">= 3.1.4"
17
+ # end
data/Gemfile CHANGED
@@ -11,4 +11,8 @@ gem 'guard-rspec'
11
11
  gem 'appraisal'
12
12
 
13
13
  gem 'sqlite3', platform: :ruby
14
- gem 'jdbc-sqlite3', platform: :jruby
14
+ gem 'jdbc-sqlite3', platform: :jruby, require: 'jdbc/sqlite3'
15
+
16
+ gem 'coveralls', require: false
17
+
18
+ gem 'ruby-prof', platform: :ruby
data/README.md CHANGED
@@ -1,19 +1,22 @@
1
1
  # Protector
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/protector.png)](http://badge.fury.io/rb/protector)
3
4
  [![Build Status](https://travis-ci.org/inossidabile/protector.png?branch=master)](https://travis-ci.org/inossidabile/protector)
4
5
  [![Code Climate](https://codeclimate.com/github/inossidabile/protector.png)](https://codeclimate.com/github/inossidabile/protector)
6
+ <!-- [![Coverage Status](https://coveralls.io/repos/inossidabile/protector/badge.png?branch=master)](https://coveralls.io/r/inossidabile/protector?branch=master) -->
5
7
 
6
8
  Protector is a Ruby ORM extension for managing security restrictions on a field level. The gem favors white-listing over black-listing (everything is disallowed by default), convention over configuration and is duck-type compatible with most of existing code.
7
9
 
8
10
  Currently Protector supports the following ORM adapters:
9
11
 
10
12
  * [ActiveRecord](http://guides.rubyonrails.org/active_record_querying.html) (>= 3.2.9)
13
+ * [Sequel](http://sequel.rubyforge.org/) (>= 3.30.0)
11
14
 
12
15
  We are working hard to extend the list with:
13
16
 
14
- * [Sequel](http://sequel.rubyforge.org/)
15
- * [DataMapper](http://datamapper.org/)
16
17
  * [Mongoid](http://mongoid.org/en/mongoid/index.html)
18
+ * [ROM](https://github.com/rom-rb/rom)
19
+ * [DataMapper](http://datamapper.org/) (its undead so it might be skipped)
17
20
 
18
21
  ## Basics
19
22
 
@@ -115,7 +118,7 @@ Remember however that auto-restriction is only enabled for reading. Passing a mo
115
118
 
116
119
  ## Eager Loading
117
120
 
118
- To take a long story short: it works and you are very likely to never notice changes it introduces to the process.
121
+ To take a long story short: it works and you are very likely to never notice changes it introduces to the process. But it might behave unexpected (yet mathematically correct) in complex cases.
119
122
 
120
123
  Eager Loading has 2 possible strategies: JOINs and additional requests. Whenever you mark an association to preload and at the same time use this relation among `where` clause – ORMs prefer JOIN. Otherwise it goes with additional requests.
121
124
 
@@ -124,15 +127,21 @@ Foo.includes(:bars) # This will make 2 queries
124
127
  Foo.includes(:bars).where(bars: {absolute: true}) # This will make 1 big JOINfull query
125
128
  ```
126
129
 
127
- The problem here is that JOIN strategy is impossible for scoped restrictions. I.e. for the following code:
130
+ The problem here is that JOIN strategy makes restriction scopes overlap. With the following query:
128
131
 
129
132
  ```ruby
130
- Foo.restrict(current_user).includes(:bars).where(bars: {absolute: true})
133
+ Foo.restrict!(current_user).includes(:bars).where(bars: {absolute: true})
131
134
  ```
132
135
 
133
- we can appear in the situation where `foos` and `bars` relations are having different restrictions scopes. In this case JOIN would filter by an intersection of scopes which is wrong.
136
+ we can appear in the situation where `foos` and `bars` relations are having different restrictions scopes. In this case JOIN will filter by an intersection of scopes which is important to understand. You might not get all `Foo` entries you expect with such where clause since they might appear filtered out by the restriction scope of `Bar`.
134
137
 
135
- To solve the issue Protector forces additional requests strategy and intelligently adds proper JOINs to the general query to make your conditions work. That's why unlike unrestricted query from the first sample, the code from the second sample will result into 2 queries.
138
+ If you don't want `Bar` scope to affect `Foo` selection, you can modify the query as follows:
139
+
140
+ ```ruby
141
+ Foo.restrict!(current_user).preload(:bars).join(:bars).where(bars: {absolute: true})
142
+ ```
143
+
144
+ Such chain will force the usage of an additional request so the first query will not be scoped with `Bar` restriction.
136
145
 
137
146
  ## Ideology
138
147
 
@@ -10,7 +10,9 @@ gem "guard"
10
10
  gem "guard-rspec"
11
11
  gem "appraisal"
12
12
  gem "sqlite3", :platform=>:ruby
13
- gem "jdbc-sqlite3", :platform=>:jruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "coveralls", :require=>false
15
+ gem "ruby-prof", :platform=>:ruby
14
16
  gem "activerecord", "3.2.9", :require=>"active_record"
15
17
  gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby, :github=>"jruby/activerecord-jdbc-adapter"
16
18
 
@@ -1,12 +1,16 @@
1
1
  GIT
2
2
  remote: git://github.com/jruby/activerecord-jdbc-adapter.git
3
- revision: 180dd863d30d6048c914622e4e77f018cf77026a
3
+ revision: a77ac76d2adda35d01aa9d66cafa324b2953e5ea
4
4
  specs:
5
+ activerecord-jdbc-adapter (1.3.0.beta2)
6
+ activerecord-jdbcsqlite3-adapter (1.3.0.beta2)
7
+ activerecord-jdbc-adapter (~> 1.3.0.beta2)
8
+ jdbc-sqlite3 (~> 3.7.2)
5
9
 
6
10
  PATH
7
11
  remote: /Users/inossidabile/Repos/protector
8
12
  specs:
9
- protector (0.1.0)
13
+ protector (0.2.1)
10
14
  activesupport
11
15
  i18n
12
16
 
@@ -31,8 +35,16 @@ GEM
31
35
  builder (3.0.4)
32
36
  coderay (1.0.9)
33
37
  colored (1.2)
38
+ colorize (0.5.8)
39
+ coveralls (0.6.7)
40
+ colorize
41
+ multi_json (~> 1.3)
42
+ rest-client
43
+ simplecov (>= 0.7)
44
+ thor
34
45
  diff-lcs (1.2.4)
35
46
  ffi (1.8.1)
47
+ ffi (1.8.1-java)
36
48
  formatador (0.2.4)
37
49
  guard (1.8.0)
38
50
  formatador (>= 0.2.4)
@@ -44,23 +56,32 @@ GEM
44
56
  guard (>= 1.8)
45
57
  rspec (~> 2.13)
46
58
  i18n (0.6.4)
59
+ jdbc-sqlite3 (3.7.2)
47
60
  listen (1.1.3)
48
61
  rb-fsevent (>= 0.9.3)
49
62
  rb-inotify (>= 0.9)
50
63
  rb-kqueue (>= 0.2)
51
64
  lumberjack (1.0.3)
52
65
  method_source (0.8.1)
66
+ mime-types (1.23)
53
67
  multi_json (1.7.4)
54
68
  pry (0.9.12.2)
55
69
  coderay (~> 1.0.5)
56
70
  method_source (~> 0.8)
57
71
  slop (~> 3.4)
72
+ pry (0.9.12.2-java)
73
+ coderay (~> 1.0.5)
74
+ method_source (~> 0.8)
75
+ slop (~> 3.4)
76
+ spoon (~> 0.0)
58
77
  rake (10.0.4)
59
78
  rb-fsevent (0.9.3)
60
79
  rb-inotify (0.9.0)
61
80
  ffi (>= 0.5.0)
62
81
  rb-kqueue (0.2.0)
63
82
  ffi (>= 0.5.0)
83
+ rest-client (1.6.7)
84
+ mime-types (>= 1.16)
64
85
  rspec (2.13.0)
65
86
  rspec-core (~> 2.13.0)
66
87
  rspec-expectations (~> 2.13.0)
@@ -69,12 +90,20 @@ GEM
69
90
  rspec-expectations (2.13.0)
70
91
  diff-lcs (>= 1.1.3, < 2.0)
71
92
  rspec-mocks (2.13.1)
93
+ ruby-prof (0.13.0)
94
+ simplecov (0.7.1)
95
+ multi_json (~> 1.0)
96
+ simplecov-html (~> 0.7.1)
97
+ simplecov-html (0.7.1)
72
98
  slop (3.4.5)
99
+ spoon (0.0.4)
100
+ ffi
73
101
  sqlite3 (1.3.7)
74
102
  thor (0.18.1)
75
103
  tzinfo (0.3.37)
76
104
 
77
105
  PLATFORMS
106
+ java
78
107
  ruby
79
108
 
80
109
  DEPENDENCIES
@@ -82,6 +111,7 @@ DEPENDENCIES
82
111
  activerecord-jdbcsqlite3-adapter!
83
112
  appraisal
84
113
  colored
114
+ coveralls
85
115
  guard
86
116
  guard-rspec
87
117
  jdbc-sqlite3
@@ -89,4 +119,5 @@ DEPENDENCIES
89
119
  pry
90
120
  rake
91
121
  rspec
122
+ ruby-prof
92
123
  sqlite3
@@ -10,7 +10,9 @@ gem "guard"
10
10
  gem "guard-rspec"
11
11
  gem "appraisal"
12
12
  gem "sqlite3", :platform=>:ruby
13
- gem "jdbc-sqlite3", :platform=>:jruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "coveralls", :require=>false
15
+ gem "ruby-prof", :platform=>:ruby
14
16
  gem "activerecord", "4.0.0.rc1", :require=>"active_record"
15
17
  gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby, :github=>"jruby/activerecord-jdbc-adapter"
16
18
 
@@ -9,7 +9,7 @@ GIT
9
9
  PATH
10
10
  remote: /Users/inossidabile/Repos/protector
11
11
  specs:
12
- protector (0.1.0)
12
+ protector (0.2.1)
13
13
  activesupport
14
14
  i18n
15
15
 
@@ -41,6 +41,13 @@ GEM
41
41
  builder (3.1.4)
42
42
  coderay (1.0.9)
43
43
  colored (1.2)
44
+ colorize (0.5.8)
45
+ coveralls (0.6.7)
46
+ colorize
47
+ multi_json (~> 1.3)
48
+ rest-client
49
+ simplecov (>= 0.7)
50
+ thor
44
51
  diff-lcs (1.2.4)
45
52
  ffi (1.8.1)
46
53
  ffi (1.8.1-java)
@@ -62,6 +69,7 @@ GEM
62
69
  rb-kqueue (>= 0.2)
63
70
  lumberjack (1.0.3)
64
71
  method_source (0.8.1)
72
+ mime-types (1.23)
65
73
  minitest (4.7.4)
66
74
  multi_json (1.7.3)
67
75
  pry (0.9.12.2)
@@ -79,6 +87,8 @@ GEM
79
87
  ffi (>= 0.5.0)
80
88
  rb-kqueue (0.2.0)
81
89
  ffi (>= 0.5.0)
90
+ rest-client (1.6.7)
91
+ mime-types (>= 1.16)
82
92
  rspec (2.13.0)
83
93
  rspec-core (~> 2.13.0)
84
94
  rspec-expectations (~> 2.13.0)
@@ -87,6 +97,11 @@ GEM
87
97
  rspec-expectations (2.13.0)
88
98
  diff-lcs (>= 1.1.3, < 2.0)
89
99
  rspec-mocks (2.13.1)
100
+ ruby-prof (0.13.0)
101
+ simplecov (0.7.1)
102
+ multi_json (~> 1.0)
103
+ simplecov-html (~> 0.7.1)
104
+ simplecov-html (0.7.1)
90
105
  slop (3.4.5)
91
106
  spoon (0.0.4)
92
107
  ffi
@@ -105,6 +120,7 @@ DEPENDENCIES
105
120
  activerecord-jdbcsqlite3-adapter!
106
121
  appraisal
107
122
  colored
123
+ coveralls
108
124
  guard
109
125
  guard-rspec
110
126
  jdbc-sqlite3
@@ -112,4 +128,5 @@ DEPENDENCIES
112
128
  pry
113
129
  rake
114
130
  rspec
131
+ ruby-prof
115
132
  sqlite3
@@ -0,0 +1,17 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "guard"
10
+ gem "guard-rspec"
11
+ gem "appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby
14
+ gem "coveralls", :require=>false
15
+ gem "mongoid", ">= 3.1.4"
16
+
17
+ gemspec :path=>"../"
@@ -0,0 +1,112 @@
1
+ PATH
2
+ remote: /Users/inossidabile/Repos/protector
3
+ specs:
4
+ protector (0.1.1)
5
+ activesupport
6
+ i18n
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activemodel (3.2.13)
12
+ activesupport (= 3.2.13)
13
+ builder (~> 3.0.0)
14
+ activesupport (3.2.13)
15
+ i18n (= 0.6.1)
16
+ multi_json (~> 1.0)
17
+ appraisal (0.5.2)
18
+ bundler
19
+ rake
20
+ builder (3.0.4)
21
+ coderay (1.0.9)
22
+ colored (1.2)
23
+ colorize (0.5.8)
24
+ coveralls (0.6.7)
25
+ colorize
26
+ multi_json (~> 1.3)
27
+ rest-client
28
+ simplecov (>= 0.7)
29
+ thor
30
+ diff-lcs (1.2.4)
31
+ ffi (1.8.1)
32
+ ffi (1.8.1-java)
33
+ formatador (0.2.4)
34
+ guard (1.8.0)
35
+ formatador (>= 0.2.4)
36
+ listen (>= 1.0.0)
37
+ lumberjack (>= 1.0.2)
38
+ pry (>= 0.9.10)
39
+ thor (>= 0.14.6)
40
+ guard-rspec (3.0.1)
41
+ guard (>= 1.8)
42
+ rspec (~> 2.13)
43
+ i18n (0.6.1)
44
+ jdbc-sqlite3 (3.7.2.1)
45
+ listen (1.1.4)
46
+ rb-fsevent (>= 0.9.3)
47
+ rb-inotify (>= 0.9)
48
+ rb-kqueue (>= 0.2)
49
+ lumberjack (1.0.3)
50
+ method_source (0.8.1)
51
+ mime-types (1.23)
52
+ mongoid (3.1.4)
53
+ activemodel (~> 3.2)
54
+ moped (~> 1.4)
55
+ origin (~> 1.0)
56
+ tzinfo (~> 0.3.22)
57
+ moped (1.5.0)
58
+ multi_json (1.7.5)
59
+ origin (1.1.0)
60
+ pry (0.9.12.2)
61
+ coderay (~> 1.0.5)
62
+ method_source (~> 0.8)
63
+ slop (~> 3.4)
64
+ pry (0.9.12.2-java)
65
+ coderay (~> 1.0.5)
66
+ method_source (~> 0.8)
67
+ slop (~> 3.4)
68
+ spoon (~> 0.0)
69
+ rake (10.0.4)
70
+ rb-fsevent (0.9.3)
71
+ rb-inotify (0.9.0)
72
+ ffi (>= 0.5.0)
73
+ rb-kqueue (0.2.0)
74
+ ffi (>= 0.5.0)
75
+ rest-client (1.6.7)
76
+ mime-types (>= 1.16)
77
+ rspec (2.13.0)
78
+ rspec-core (~> 2.13.0)
79
+ rspec-expectations (~> 2.13.0)
80
+ rspec-mocks (~> 2.13.0)
81
+ rspec-core (2.13.1)
82
+ rspec-expectations (2.13.0)
83
+ diff-lcs (>= 1.1.3, < 2.0)
84
+ rspec-mocks (2.13.1)
85
+ simplecov (0.7.1)
86
+ multi_json (~> 1.0)
87
+ simplecov-html (~> 0.7.1)
88
+ simplecov-html (0.7.1)
89
+ slop (3.4.5)
90
+ spoon (0.0.4)
91
+ ffi
92
+ sqlite3 (1.3.7)
93
+ thor (0.18.1)
94
+ tzinfo (0.3.37)
95
+
96
+ PLATFORMS
97
+ java
98
+ ruby
99
+
100
+ DEPENDENCIES
101
+ appraisal
102
+ colored
103
+ coveralls
104
+ guard
105
+ guard-rspec
106
+ jdbc-sqlite3
107
+ mongoid (>= 3.1.4)
108
+ protector!
109
+ pry
110
+ rake
111
+ rspec
112
+ sqlite3
@@ -0,0 +1,18 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rake"
6
+ gem "colored"
7
+ gem "pry"
8
+ gem "rspec"
9
+ gem "guard"
10
+ gem "guard-rspec"
11
+ gem "appraisal"
12
+ gem "sqlite3", :platform=>:ruby
13
+ gem "jdbc-sqlite3", :platform=>:jruby, :require=>"jdbc/sqlite3"
14
+ gem "coveralls", :require=>false
15
+ gem "ruby-prof", :platform=>:ruby
16
+ gem "sequel", "3.30.0"
17
+
18
+ gemspec :path=>"../"
@@ -0,0 +1,103 @@
1
+ PATH
2
+ remote: /Users/inossidabile/Repos/protector
3
+ specs:
4
+ protector (0.2.1)
5
+ activesupport
6
+ i18n
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (3.2.12)
12
+ i18n (~> 0.6)
13
+ multi_json (~> 1.0)
14
+ appraisal (0.5.2)
15
+ bundler
16
+ rake
17
+ coderay (1.0.9)
18
+ colored (1.2)
19
+ colorize (0.5.8)
20
+ coveralls (0.6.7)
21
+ colorize
22
+ multi_json (~> 1.3)
23
+ rest-client
24
+ simplecov (>= 0.7)
25
+ thor
26
+ diff-lcs (1.2.4)
27
+ ffi (1.8.1)
28
+ ffi (1.8.1-java)
29
+ formatador (0.2.4)
30
+ guard (1.8.0)
31
+ formatador (>= 0.2.4)
32
+ listen (>= 1.0.0)
33
+ lumberjack (>= 1.0.2)
34
+ pry (>= 0.9.10)
35
+ thor (>= 0.14.6)
36
+ guard-rspec (3.0.1)
37
+ guard (>= 1.8)
38
+ rspec (~> 2.13)
39
+ i18n (0.6.4)
40
+ jdbc-sqlite3 (3.7.2.1)
41
+ listen (1.1.4)
42
+ rb-fsevent (>= 0.9.3)
43
+ rb-inotify (>= 0.9)
44
+ rb-kqueue (>= 0.2)
45
+ lumberjack (1.0.3)
46
+ method_source (0.8.1)
47
+ mime-types (1.23)
48
+ multi_json (1.7.5)
49
+ pry (0.9.12.2)
50
+ coderay (~> 1.0.5)
51
+ method_source (~> 0.8)
52
+ slop (~> 3.4)
53
+ pry (0.9.12.2-java)
54
+ coderay (~> 1.0.5)
55
+ method_source (~> 0.8)
56
+ slop (~> 3.4)
57
+ spoon (~> 0.0)
58
+ rake (10.0.4)
59
+ rb-fsevent (0.9.3)
60
+ rb-inotify (0.9.0)
61
+ ffi (>= 0.5.0)
62
+ rb-kqueue (0.2.0)
63
+ ffi (>= 0.5.0)
64
+ rest-client (1.6.7)
65
+ mime-types (>= 1.16)
66
+ rspec (2.13.0)
67
+ rspec-core (~> 2.13.0)
68
+ rspec-expectations (~> 2.13.0)
69
+ rspec-mocks (~> 2.13.0)
70
+ rspec-core (2.13.1)
71
+ rspec-expectations (2.13.0)
72
+ diff-lcs (>= 1.1.3, < 2.0)
73
+ rspec-mocks (2.13.1)
74
+ ruby-prof (0.13.0)
75
+ sequel (3.30.0)
76
+ simplecov (0.7.1)
77
+ multi_json (~> 1.0)
78
+ simplecov-html (~> 0.7.1)
79
+ simplecov-html (0.7.1)
80
+ slop (3.4.5)
81
+ spoon (0.0.4)
82
+ ffi
83
+ sqlite3 (1.3.7)
84
+ thor (0.18.1)
85
+
86
+ PLATFORMS
87
+ java
88
+ ruby
89
+
90
+ DEPENDENCIES
91
+ appraisal
92
+ colored
93
+ coveralls
94
+ guard
95
+ guard-rspec
96
+ jdbc-sqlite3
97
+ protector!
98
+ pry
99
+ rake
100
+ rspec
101
+ ruby-prof
102
+ sequel (= 3.30.0)
103
+ sqlite3
@@ -1,7 +1,7 @@
1
1
  module Protector
2
2
  module Adapters
3
3
  module ActiveRecord
4
- # Pathces `ActiveRecord::Base`
4
+ # Patches `ActiveRecord::Base`
5
5
  module Base
6
6
  extend ActiveSupport::Concern
7
7
 
@@ -9,18 +9,15 @@ module Protector
9
9
  include Protector::DSL::Base
10
10
  include Protector::DSL::Entry
11
11
 
12
- ObjectSpace.each_object(Class).each do |c|
13
- c.undefine_attribute_methods if c < self
12
+ ObjectSpace.each_object(Class).each do |klass|
13
+ klass.undefine_attribute_methods if klass < self
14
14
  end
15
15
 
16
- validate(on: :create) do
16
+ validate do
17
17
  return unless @protector_subject
18
- errors[:base] << I18n.t('protector.invalid') unless creatable?
19
- end
20
-
21
- validate(on: :update) do
22
- return unless @protector_subject
23
- errors[:base] << I18n.t('protector.invalid') unless updatable?
18
+ if (new_record? && !creatable?) || (!new_record? && !updatable?)
19
+ errors[:base] << I18n.t('protector.invalid')
20
+ end
24
21
  end
25
22
 
26
23
  before_destroy do
@@ -45,7 +42,12 @@ module Protector
45
42
  end
46
43
 
47
44
  def [](name)
48
- if !@protector_subject || name == self.class.primary_key || protector_meta.readable?(name)
45
+ if (
46
+ !@protector_subject ||
47
+ name == self.class.primary_key ||
48
+ (self.class.primary_key.is_a?(Array) && self.class.primary_key.include?(name)) ||
49
+ protector_meta.readable?(name)
50
+ )
49
51
  read_attribute(name)
50
52
  else
51
53
  nil
@@ -77,10 +79,6 @@ module Protector
77
79
 
78
80
  # Storage for {Protector::DSL::Meta::Box}
79
81
  def protector_meta
80
- unless @protector_subject
81
- raise "Unprotected entity detected: use `restrict` method to protect it."
82
- end
83
-
84
82
  @protector_meta ||= self.class.protector_meta.evaluate(
85
83
  self.class,
86
84
  @protector_subject,
@@ -98,13 +96,13 @@ module Protector
98
96
 
99
97
  # Checks if current model can be created in the context of current subject
100
98
  def creatable?
101
- fields = HashWithIndifferentAccess[changed.map{|x| [x, read_attribute(x)]}]
99
+ fields = HashWithIndifferentAccess[changed.map{|field| [field, read_attribute(field)]}]
102
100
  protector_meta.creatable?(fields)
103
101
  end
104
102
 
105
103
  # Checks if current model can be updated in the context of current subject
106
104
  def updatable?
107
- fields = HashWithIndifferentAccess[changed.map{|x| [x, read_attribute(x)]}]
105
+ fields = HashWithIndifferentAccess[changed.map{|field| [field, read_attribute(field)]}]
108
106
  protector_meta.updatable?(fields)
109
107
  end
110
108