platanus 0.0.30 → 0.0.31
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.
- data/lib/platanus/canned2.rb +74 -10
- data/lib/platanus/serializers/json_sym.rb +1 -1
- data/lib/platanus/version.rb +1 -1
- data/spec/canned2_spec.rb +9 -3
- metadata +2 -2
data/lib/platanus/canned2.rb
CHANGED
@@ -94,19 +94,78 @@ module Platanus
|
|
94
94
|
# TODO: example
|
95
95
|
class Profile
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
def is_avaliable()
|
98
|
+
return @shared.all? do |rule|
|
99
|
+
rule_ctx = RuleContext.new _ctx, _tests, @def_matcher, @def_resource
|
100
|
+
rule_ctx.instance_eval(&rule)
|
101
|
+
rule_ctx.passed?
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def is_forbidden()
|
106
|
+
# TODO: local forbids
|
107
|
+
end
|
108
|
+
|
109
|
+
def is_allowed()
|
110
|
+
end
|
111
|
+
|
112
|
+
def
|
113
|
+
|
114
|
+
def allowance_for(_ctx, _action, _tests)
|
115
|
+
|
116
|
+
# all shared rules must pass
|
117
|
+
return :not_applicable unless @shared.all? do |rule|
|
118
|
+
rule_ctx = RuleContext.new _ctx, _tests, @def_matcher, @def_resource
|
119
|
+
rule_ctx.instance_eval(&rule)
|
120
|
+
rule_ctx.passed?
|
121
|
+
end
|
122
|
+
|
123
|
+
# TODO: local forbids
|
124
|
+
|
125
|
+
# process base profile
|
126
|
+
unless @base.nil?
|
127
|
+
result = @base.process _ctx, _action, _tests
|
128
|
+
return result if result == :not_applicable or result == :forbidden
|
129
|
+
matches << resu
|
130
|
+
end
|
131
|
+
|
132
|
+
# process subprofiles
|
133
|
+
if @isolated.each do |profile|
|
134
|
+
result = profile.process _ctx, _action, _tests
|
135
|
+
return :forbidden if result == :forbidden
|
136
|
+
result = :allowed if result == :allowed
|
137
|
+
end
|
138
|
+
|
139
|
+
# see if any of the registered rules pass
|
140
|
+
return :allowed if @rules[_action].any? do |rule|
|
141
|
+
rule_ctx = RuleContext.new _ctx, _tests, @def_matcher, @def_resource
|
142
|
+
rule_ctx.instance_eval(&rule)
|
143
|
+
rule_ctx.passed?
|
144
|
+
end
|
145
|
+
|
146
|
+
return :not_allowed
|
147
|
+
end
|
100
148
|
|
101
149
|
# The initializer takes another profile as rules base.
|
102
|
-
def initialize(
|
150
|
+
def initialize(_def_matcher, _def_resource, _base=nil)
|
151
|
+
@base = _base
|
103
152
|
@rules = Hash.new { |h, k| h[k] = [] }
|
104
|
-
|
153
|
+
@isolated = []
|
154
|
+
@shared = []
|
155
|
+
|
105
156
|
raise Error.new 'Must provide a default test' if _def_matcher.nil?
|
106
157
|
@def_matcher = _def_matcher
|
107
158
|
@def_resource = _def_resource
|
108
159
|
end
|
109
160
|
|
161
|
+
def always(_upon=nil, &_block)
|
162
|
+
@shared << (_upon || _block)
|
163
|
+
end
|
164
|
+
|
165
|
+
def isolate(_options={}, &_block)
|
166
|
+
@isolated << Profile.new _options.fetch(, @def_matcher), _options.fetch(, @def_resource)
|
167
|
+
end
|
168
|
+
|
110
169
|
## Adds an "allowance" rule
|
111
170
|
def allow(_action, _upon=nil, &_block)
|
112
171
|
@rules[_action] << (_upon || _block)
|
@@ -117,11 +176,6 @@ module Platanus
|
|
117
176
|
# TODO
|
118
177
|
end
|
119
178
|
|
120
|
-
## Clear all rules related to an action
|
121
|
-
def clear(_action)
|
122
|
-
@rules[_action] = []
|
123
|
-
end
|
124
|
-
|
125
179
|
## SHORT HAND METHODS
|
126
180
|
|
127
181
|
def upon(_expr=nil, &_block)
|
@@ -195,6 +249,16 @@ module Platanus
|
|
195
249
|
@def_matcher = _def_matcher
|
196
250
|
end
|
197
251
|
|
252
|
+
## Test whether the current action matches a list of actions
|
253
|
+
def action_is(*_actions)
|
254
|
+
_actions.any? { |a| a.to_s == @ctx.action_name }
|
255
|
+
end
|
256
|
+
|
257
|
+
## Test whether the current action is no in list of actions
|
258
|
+
def action_is_not(*_actions)
|
259
|
+
!_actions.any? { |a| a.to_s == @ctx.action_name }
|
260
|
+
end
|
261
|
+
|
198
262
|
## Tests for a match between one of the request's parameters and a resource expression.
|
199
263
|
#
|
200
264
|
# **IMPORTANT** if no resource is provided the current controller instance is used instead.
|
data/lib/platanus/version.rb
CHANGED
data/spec/canned2_spec.rb
CHANGED
@@ -17,10 +17,12 @@ describe Platanus::Canned2 do
|
|
17
17
|
class DummyCtx
|
18
18
|
|
19
19
|
attr_reader :params
|
20
|
+
attr_reader :action_name
|
20
21
|
attr_reader :current_user
|
21
22
|
|
22
|
-
def initialize(_user, _params={})
|
23
|
+
def initialize(_user, _action_name=nil, _params={})
|
23
24
|
@current_user = _user
|
25
|
+
@action_name = _action_name
|
24
26
|
@params = _params
|
25
27
|
end
|
26
28
|
end
|
@@ -40,6 +42,7 @@ describe Platanus::Canned2 do
|
|
40
42
|
allow 'rute1#action3', upon { same(:char1, key: "current_user.char1") }
|
41
43
|
allow 'rute1#action4', upon(:current_user) { same(:param2, key: "char2") and checks(:test1) }
|
42
44
|
allow 'rute1#action5', upon(:current_user) { passes { current_user.char2 == params[:param2] } }
|
45
|
+
allow 'rute2', upon(:current_user) { same(:char1) and action_is_not(:create) }
|
43
46
|
|
44
47
|
# Complex routes
|
45
48
|
allow 'rute1#action5' do
|
@@ -49,8 +52,8 @@ describe Platanus::Canned2 do
|
|
49
52
|
end
|
50
53
|
end
|
51
54
|
|
52
|
-
let(:good_ctx) { DummyCtx.new(DummyUsr.new(10, "200"), char1: '10', param2: '200') }
|
53
|
-
let(:bad_ctx) { DummyCtx.new(DummyUsr.new(10, 30), char1: '10', param2: '200') }
|
55
|
+
let(:good_ctx) { DummyCtx.new(DummyUsr.new(10, "200"), 'create', char1: '10', param2: '200') }
|
56
|
+
let(:bad_ctx) { DummyCtx.new(DummyUsr.new(10, 30), 'create', char1: '10', param2: '200') }
|
54
57
|
|
55
58
|
describe "._run" do
|
56
59
|
context 'when using single context rules' do
|
@@ -73,6 +76,9 @@ describe Platanus::Canned2 do
|
|
73
76
|
it "does authorize on rute with context and inline test" do
|
74
77
|
Roles.can?(good_ctx, :user, 'rute1#action5').should be_true
|
75
78
|
end
|
79
|
+
it "does not authorize on rute with context, match and action_is_not" do
|
80
|
+
Roles.can?(good_ctx, :user, 'rute2').should be_false
|
81
|
+
end
|
76
82
|
end
|
77
83
|
|
78
84
|
context 'when using multiple context rules' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: platanus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.31
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-11-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|