cbac 0.6.5 → 0.6.7
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/Gemfile +2 -0
- data/Gemfile.lock +92 -0
- data/Manifest +5 -2
- data/cbac.gemspec +9 -5
- data/lib/cbac.rb +12 -9
- data/lib/cbac/cbac_pristine/pristine_permission.rb +1 -2
- data/lib/cbac/privilege.rb +9 -10
- data/lib/cbac/setup.rb +9 -9
- data/lib/cbac/version.rb +3 -0
- data/lib/generators/cbac/cbac_generator.rb +2 -8
- data/lib/generators/cbac/copy_files/migrate/create_cbac_from_scratch.rb +55 -32
- data/lib/generators/cbac/copy_files/views/permissions/index.html.erb +1 -1
- data/spec/cbac_authorization_check_spec.rb +70 -0
- data/spec/cbac_pristine_file_spec.rb +20 -27
- data/spec/cbac_pristine_permission_spec.rb +168 -132
- data/spec/cbac_pristine_role_spec.rb +1 -8
- data/spec/fixtures/controllers/dating/daughter_controller.rb +11 -0
- data/spec/spec_helper.rb +35 -10
- data/spec/support/schema.rb +30 -0
- data/test/test_cbac_privilege.rb +13 -9
- metadata +74 -9
- data/lib/generators/cbac/copy_files/migrate/create_cbac_upgrade_path.rb +0 -40
- data/test/test_cbac_authorize_context_roles.rb +0 -39
@@ -1,7 +1,7 @@
|
|
1
1
|
<div class="cbac">
|
2
2
|
|
3
3
|
<h2>Subset:</h2>
|
4
|
-
<form action="<%= request.
|
4
|
+
<form action="<%= request.url %>" method="get" name="subset_view_form">
|
5
5
|
<b>Privilege set</b> starts with: <input type="text" name="priv_substr" value="<%= params[:priv_substr] %>" /><br />
|
6
6
|
<b>Role</b> starts with: <input type="text" name="role_substr" value="<%= params[:role_substr] %>" /><br/>
|
7
7
|
<input type="submit" value="Submit" />
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'cbac'
|
3
|
+
|
4
|
+
require_relative './fixtures/controllers/dating/daughter_controller'
|
5
|
+
|
6
|
+
# create a fake controller with some actions
|
7
|
+
describe Cbac do
|
8
|
+
describe :authorization_check do
|
9
|
+
include Cbac
|
10
|
+
|
11
|
+
before :all do
|
12
|
+
@controller = Dating::DaughterController.new
|
13
|
+
|
14
|
+
# define a set of privileges
|
15
|
+
Cbac::PrivilegeSet.add :go_out_with_daughter, "Allows users to perform the actions nested in this privilege set"
|
16
|
+
# add some privileges to the given set
|
17
|
+
Privilege.resource :go_out_with_daughter, "dating/daughter_controller/take_to_dinner", :post
|
18
|
+
Privilege.resource :go_out_with_daughter, "dating/daughter_controller/bring_home", :post
|
19
|
+
|
20
|
+
# define a context role that can be evaluated when one of the privileges is invoked
|
21
|
+
ContextRole.add :suitable_boyfriend do |context|
|
22
|
+
context.send(:candidate).brought_flowers?
|
23
|
+
end
|
24
|
+
|
25
|
+
# allow any 'suitable_boyfriend' to invoke Privileges in the 'go_out_with_daughter' PrivilegeSet
|
26
|
+
Cbac::Permission.create(
|
27
|
+
:context_role => 'suitable_boyfriend',
|
28
|
+
:privilege_set_id => Cbac::PrivilegeSetRecord.where(
|
29
|
+
:name => 'go_out_with_daughter'
|
30
|
+
).first.id
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
context "when a user attempts to invoke the action" do
|
35
|
+
before :each do
|
36
|
+
@controller.request = ActionDispatch::TestRequest.new
|
37
|
+
@controller.request.request_method = 'POST'
|
38
|
+
|
39
|
+
@controller.params = {
|
40
|
+
:controller => "dating/daughter_controller",
|
41
|
+
:action => "take_to_dinner"
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
context "and the contextual requirements are fulfilled" do
|
46
|
+
before :each do
|
47
|
+
ideal_son_in_law = mock('user', :brought_flowers? => true)
|
48
|
+
@controller.stub(:candidate).and_return(ideal_son_in_law)
|
49
|
+
end
|
50
|
+
|
51
|
+
specify "the action is invoked" do
|
52
|
+
@controller.authorize.should == true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "and the contextual requirements are not fulfilled" do
|
57
|
+
before :each do
|
58
|
+
some_punk = mock('user', :brought_flowers? => false)
|
59
|
+
@controller.stub(:candidate).and_return(some_punk)
|
60
|
+
end
|
61
|
+
|
62
|
+
specify "the action is blocked" do
|
63
|
+
@controller.should_receive(:unauthorized)
|
64
|
+
|
65
|
+
@controller.authorize
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -1,18 +1,13 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'cbac/cbac_pristine/pristine'
|
4
|
-
require 'cbac/cbac_pristine/pristine_permission'
|
5
|
-
require 'cbac/cbac_pristine/pristine_role'
|
6
|
-
require 'cbac/cbac_pristine/pristine_file'
|
1
|
+
require 'spec_helper'
|
2
|
+
|
7
3
|
include Cbac::CbacPristine
|
8
4
|
|
9
5
|
describe "CbacPristineFile" do
|
10
6
|
before(:each) do
|
11
|
-
|
7
|
+
@pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
12
8
|
end
|
13
9
|
|
14
10
|
describe "indicate if a line looks like a pristine line" do
|
15
|
-
|
16
11
|
it "should indicate that a ruby style comment line is not a pristine line" do
|
17
12
|
comment_line = "#this is a comment line in Ruby"
|
18
13
|
|
@@ -68,7 +63,7 @@ describe "CbacPristineFile" do
|
|
68
63
|
privilege_set_name = "chat"
|
69
64
|
line = "0:+:PrivilegeSet(#{privilege_set_name})Admin()"
|
70
65
|
|
71
|
-
@pristine_file.parse_privilege_set_name(line, 0).should == privilege_set_name
|
66
|
+
@pristine_file.parse_privilege_set_name(line, 0).should == privilege_set_name
|
72
67
|
end
|
73
68
|
|
74
69
|
it "should fail if an invalid line is provided" do
|
@@ -142,7 +137,7 @@ describe "CbacPristineFile" do
|
|
142
137
|
|
143
138
|
|
144
139
|
it "should return a generic role if a generic pristine file is used" do
|
145
|
-
@pristine_file = GenericPristineFile.new("cbac.pristine")
|
140
|
+
@pristine_file = GenericPristineFile.new(:file_name =>"cbac.pristine")
|
146
141
|
line = "0:+:PrivilegeSet(chat)GenericRole(group_admins)"
|
147
142
|
|
148
143
|
@pristine_file.parse_role(line, 0).role_type.should == PristineRole.ROLE_TYPES[:generic]
|
@@ -150,7 +145,7 @@ describe "CbacPristineFile" do
|
|
150
145
|
|
151
146
|
it "should return an existing generic role if use_db is not specified" do
|
152
147
|
generic_role_name = 'group_admins'
|
153
|
-
@pristine_file = GenericPristineFile.new("cbac.pristine")
|
148
|
+
@pristine_file = GenericPristineFile.new(:file_name =>"cbac.pristine")
|
154
149
|
line = "0:+:PrivilegeSet(chat)GenericRole(#{generic_role_name})"
|
155
150
|
existing_role = PristineRole.create(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:generic], :name => generic_role_name)
|
156
151
|
|
@@ -159,7 +154,7 @@ describe "CbacPristineFile" do
|
|
159
154
|
|
160
155
|
it "should not use an existing role if use_db is set to false" do
|
161
156
|
generic_role_name = 'group_admins'
|
162
|
-
@pristine_file = GenericPristineFile.new("cbac.pristine")
|
157
|
+
@pristine_file = GenericPristineFile.new(:file_name =>"cbac.pristine")
|
163
158
|
line = "0:+:PrivilegeSet(chat)GenericRole(#{generic_role_name})"
|
164
159
|
existing_role = PristineRole.create(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:generic], :name => generic_role_name)
|
165
160
|
|
@@ -167,7 +162,7 @@ describe "CbacPristineFile" do
|
|
167
162
|
end
|
168
163
|
|
169
164
|
it "should fail if an Admin role is used in a generic pristine file" do
|
170
|
-
@pristine_file = GenericPristineFile.new("cbac.pristine")
|
165
|
+
@pristine_file = GenericPristineFile.new(:file_name =>"cbac.pristine")
|
171
166
|
line = "0:+:PrivilegeSet(chat)Admin()"
|
172
167
|
|
173
168
|
proc{
|
@@ -176,7 +171,7 @@ describe "CbacPristineFile" do
|
|
176
171
|
end
|
177
172
|
|
178
173
|
it "should fail if an context role is used in a generic pristine file" do
|
179
|
-
@pristine_file = GenericPristineFile.new("cbac.pristine")
|
174
|
+
@pristine_file = GenericPristineFile.new(:file_name =>"cbac.pristine")
|
180
175
|
line = "0:+:PrivilegeSet(chat)ContextRole(logged_in_user)"
|
181
176
|
|
182
177
|
proc{
|
@@ -185,7 +180,7 @@ describe "CbacPristineFile" do
|
|
185
180
|
end
|
186
181
|
|
187
182
|
it "should fail if an invalid line is provided in a generic pristine file" do
|
188
|
-
@pristine_file = GenericPristineFile.new("cbac.pristine")
|
183
|
+
@pristine_file = GenericPristineFile.new(:file_name =>"cbac.pristine")
|
189
184
|
line = "0:+:PrivilegeSet(toeteraars)"
|
190
185
|
|
191
186
|
proc{
|
@@ -195,14 +190,13 @@ describe "CbacPristineFile" do
|
|
195
190
|
end
|
196
191
|
|
197
192
|
describe "parsing a cbac_pristine file" do
|
198
|
-
|
199
193
|
it "should fail if a row number is used twice" do
|
200
194
|
pristine_file_lines = ["0:+:PrivilegeSet(chat)ContextRole(logged_in_user)"]
|
201
195
|
pristine_file_lines.push("0:+:PrivilegeSet(log_in)ContextRole(everybody)")
|
202
|
-
|
196
|
+
|
203
197
|
File.stub!(:open).and_return(pristine_file_lines)
|
204
198
|
|
205
|
-
pristine_file = PristineFile.new("cbac.pristine")
|
199
|
+
pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
206
200
|
|
207
201
|
proc{
|
208
202
|
pristine_file.parse
|
@@ -216,7 +210,7 @@ describe "CbacPristineFile" do
|
|
216
210
|
|
217
211
|
File.stub!(:open).and_return(pristine_file_lines)
|
218
212
|
|
219
|
-
pristine_file = PristineFile.new("cbac.pristine")
|
213
|
+
pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
220
214
|
pristine_file.parse
|
221
215
|
|
222
216
|
pristine_file.permissions.length.should == pristine_file_lines.length
|
@@ -229,7 +223,7 @@ describe "CbacPristineFile" do
|
|
229
223
|
|
230
224
|
File.stub!(:open).and_return(pristine_file_lines)
|
231
225
|
|
232
|
-
pristine_file = PristineFile.new("cbac.pristine")
|
226
|
+
pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
233
227
|
pristine_file.parse
|
234
228
|
|
235
229
|
pristine_file.permissions.length.should == 2
|
@@ -242,7 +236,7 @@ describe "CbacPristineFile" do
|
|
242
236
|
|
243
237
|
File.stub!(:open).and_return(pristine_file_lines)
|
244
238
|
|
245
|
-
pristine_file = PristineFile.new("cbac.pristine")
|
239
|
+
pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
246
240
|
pristine_file.parse
|
247
241
|
|
248
242
|
pristine_file.permissions.length.should == 3
|
@@ -256,7 +250,7 @@ describe "CbacPristineFile" do
|
|
256
250
|
|
257
251
|
File.stub!(:open).and_return(pristine_file_lines)
|
258
252
|
|
259
|
-
pristine_file = PristineFile.new("cbac.pristine")
|
253
|
+
pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
260
254
|
proc{
|
261
255
|
pristine_file.parse
|
262
256
|
}.should raise_error(SyntaxError)
|
@@ -266,7 +260,7 @@ describe "CbacPristineFile" do
|
|
266
260
|
pristine_file_lines = ["0:x:PrivilegeSet(chat)ContextRole(logged_in_user)"]
|
267
261
|
File.stub!(:open).and_return(pristine_file_lines)
|
268
262
|
|
269
|
-
pristine_file = PristineFile.new("cbac.pristine")
|
263
|
+
pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
270
264
|
proc{
|
271
265
|
pristine_file.parse
|
272
266
|
}.should raise_error(NotImplementedError)
|
@@ -276,7 +270,7 @@ describe "CbacPristineFile" do
|
|
276
270
|
pristine_file_lines = ["0:=>:PrivilegeSet(chat)ContextRole(logged_in_user)"]
|
277
271
|
File.stub!(:open).and_return(pristine_file_lines)
|
278
272
|
|
279
|
-
pristine_file = PristineFile.new("cbac.pristine")
|
273
|
+
pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
280
274
|
proc{
|
281
275
|
pristine_file.parse
|
282
276
|
}.should raise_error(NotImplementedError)
|
@@ -287,7 +281,7 @@ describe "CbacPristineFile" do
|
|
287
281
|
before(:each) do
|
288
282
|
@context_role = PristineRole.new(:role_id => 0, :role_type => PristineRole.ROLE_TYPES[:context], :name => "logged_in_user")
|
289
283
|
@admin_role = PristineRole.new(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:admin],:name => "administrator")
|
290
|
-
@pristine_file = PristineFile.new("cbac.pristine")
|
284
|
+
@pristine_file = PristineFile.new(:file_name =>"cbac.pristine")
|
291
285
|
end
|
292
286
|
|
293
287
|
it "should filter out the permissions which were revoked" do
|
@@ -324,7 +318,6 @@ describe "CbacPristineFile" do
|
|
324
318
|
proc {
|
325
319
|
@pristine_file.permission_set
|
326
320
|
}.should raise_error(ArgumentError)
|
327
|
-
|
328
321
|
end
|
329
322
|
end
|
330
|
-
end
|
323
|
+
end
|
@@ -1,75 +1,67 @@
|
|
1
|
-
|
2
|
-
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
3
|
-
require 'spec'
|
4
|
-
require '../lib/cbac/cbac_pristine/pristine'
|
5
|
-
require '../lib/cbac/cbac_pristine/pristine_role'
|
6
|
-
require '../lib/cbac/cbac_pristine/pristine_permission'
|
1
|
+
require 'spec_helper'
|
7
2
|
|
8
3
|
include Cbac::CbacPristine
|
9
4
|
|
10
5
|
describe "CbacPristinePermission" do
|
11
|
-
|
12
|
-
|
13
6
|
describe "convert pristine line to a yml fixture" do
|
14
7
|
before(:each) do
|
15
|
-
@context_role = PristineRole.new(:role_id => 0, :role_type => PristineRole.ROLE_TYPES[:context], :name => "logged_in_user")
|
16
8
|
@admin_role = PristineRole.new(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:admin], :name => "administrator")
|
9
|
+
@context_role = PristineRole.new(:role_id => 0, :role_type => PristineRole.ROLE_TYPES[:context], :name => "chat_starter")
|
17
10
|
end
|
18
11
|
|
19
|
-
|
20
12
|
it "should raise an error if the pristine line has no role" do
|
21
|
-
pristine_permission =
|
22
|
-
lambda{
|
13
|
+
pristine_permission = PristinePermission.new(:line_number => 1, :privilege_set_name => 'log_in', :pristine_role => nil)
|
14
|
+
lambda {
|
23
15
|
pristine_permission.to_yml_fixture
|
24
16
|
}.should raise_error(ArgumentError)
|
25
17
|
end
|
26
18
|
|
27
19
|
it "should raise an error if the pristine line has no privilege_set_name" do
|
28
|
-
pristine_permission =
|
29
|
-
lambda{
|
20
|
+
pristine_permission = PristinePermission.new(:line_number => 1, :privilege_set_name => "", :pristine_role => @context_role)
|
21
|
+
lambda {
|
30
22
|
pristine_permission.to_yml_fixture
|
31
23
|
}.should raise_error(ArgumentError)
|
32
24
|
end
|
33
25
|
|
34
26
|
it "should return a yml string starting with cbac_permission_ " do
|
35
|
-
pristine_permission =
|
27
|
+
pristine_permission = PristinePermission.new(:line_number => 1, :privilege_set_name => "chat", :pristine_role => @context_role)
|
36
28
|
|
37
29
|
pristine_permission.to_yml_fixture.should match(/\Acbac_permission_/)
|
38
30
|
end
|
39
31
|
|
40
32
|
it "should return a yml string containing the line number of the pristine line" do
|
41
33
|
line_number= 100
|
42
|
-
pristine_permission =
|
34
|
+
pristine_permission = PristinePermission.new(:line_number => line_number, :privilege_set_name => "chat", :pristine_role => @context_role)
|
43
35
|
|
44
36
|
pristine_permission.to_yml_fixture.should match(/id: #{line_number}/)
|
45
37
|
end
|
46
38
|
|
47
39
|
it "should return a yml string containing a generic role id of 0 if a context_role is used" do
|
48
|
-
pristine_permission =
|
40
|
+
pristine_permission = PristinePermission.new(:line_number => 150, :privilege_set_name => "chat", :pristine_role => @context_role)
|
49
41
|
|
50
42
|
pristine_permission.to_yml_fixture.should match(/generic_role_id: 0/)
|
51
43
|
end
|
52
44
|
|
53
45
|
it "should return a yml string containing the name of the context role if a context_role is used" do
|
54
|
-
pristine_permission =
|
46
|
+
pristine_permission = PristinePermission.new(:line_number => 150, :privilege_set_name => "chat", :pristine_role => @context_role)
|
55
47
|
|
56
48
|
pristine_permission.to_yml_fixture.should match(/context_role: #{@context_role.name}/)
|
57
49
|
end
|
58
50
|
|
59
51
|
it "should return a yml string containing the id of the generic role if a generic role is used" do
|
60
|
-
pristine_permission =
|
52
|
+
pristine_permission = PristinePermission.new(:line_number => 150, :privilege_set_name => "chat", :pristine_role => @admin_role)
|
61
53
|
|
62
54
|
pristine_permission.to_yml_fixture.should match(/generic_role_id: #{@admin_role.id.to_s}/)
|
63
55
|
end
|
64
56
|
|
65
57
|
it "should return a yml string containing ruby code to find the privilege set by name" do
|
66
|
-
pristine_permission =
|
58
|
+
pristine_permission = PristinePermission.new(:line_number => 150, :privilege_set_name => "chat", :pristine_role => @context_role)
|
67
59
|
|
68
60
|
pristine_permission.to_yml_fixture.should match(/privilege_set_id: \<%= Cbac::PrivilegeSetRecord.find\(:first, :conditions => \{:name => '#{pristine_permission.privilege_set_name}'\}\)\.id %>/)
|
69
61
|
end
|
70
62
|
|
71
63
|
it "should return a yml string containing created_at and updated_at" do
|
72
|
-
pristine_permission =
|
64
|
+
pristine_permission = PristinePermission.new(:line_number => 1, :privilege_set_name => "chat", :pristine_role => @context_role)
|
73
65
|
pristine_permission.to_yml_fixture.should match(/created_at:.+updated_at:/m)
|
74
66
|
end
|
75
67
|
end
|
@@ -85,8 +77,8 @@ describe "CbacPristinePermission" do
|
|
85
77
|
|
86
78
|
it "should return true if the pristine permission exists as generic cbac permission in the database" do
|
87
79
|
Cbac::Permission.create(:privilege_set_id => @privilege_set.id, :generic_role_id => @admin_role.id)
|
88
|
-
|
89
|
-
pristine_permission =
|
80
|
+
|
81
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_admin_role)
|
90
82
|
|
91
83
|
pristine_permission.cbac_permission_exists?.should be_true
|
92
84
|
end
|
@@ -94,19 +86,19 @@ describe "CbacPristinePermission" do
|
|
94
86
|
it "should return true if the pristine permission exists as context cbac permission in the database" do
|
95
87
|
Cbac::Permission.create(:privilege_set_id => @privilege_set.id, :generic_role_id => 0, :context_role => @pristine_context_role.name)
|
96
88
|
|
97
|
-
pristine_permission =
|
89
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_context_role)
|
98
90
|
|
99
91
|
pristine_permission.cbac_permission_exists?.should be_true
|
100
92
|
end
|
101
93
|
|
102
94
|
it "should return false if the pristine permission does not exist as context cbac permission in the database" do
|
103
|
-
pristine_permission =
|
95
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_context_role)
|
104
96
|
|
105
97
|
pristine_permission.cbac_permission_exists?.should be_false
|
106
98
|
end
|
107
99
|
|
108
100
|
it "should return false if the pristine permission does not exist as a generic cbac permission in the database" do
|
109
|
-
pristine_permission =
|
101
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_admin_role)
|
110
102
|
|
111
103
|
pristine_permission.cbac_permission_exists?.should be_false
|
112
104
|
end
|
@@ -115,7 +107,7 @@ describe "CbacPristinePermission" do
|
|
115
107
|
group_admin = Cbac::GenericRole.create(:name => "group_administrator")
|
116
108
|
Cbac::Permission.create(:privilege_set_id => @privilege_set.id, :generic_role_id => group_admin.id)
|
117
109
|
|
118
|
-
pristine_permission =
|
110
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_admin_role)
|
119
111
|
|
120
112
|
pristine_permission.cbac_permission_exists?.should be_false
|
121
113
|
end
|
@@ -123,7 +115,7 @@ describe "CbacPristinePermission" do
|
|
123
115
|
it "should return false if a similar pristine permission exist as a context cbac permission in the database, but for another context role" do
|
124
116
|
Cbac::Permission.create(:privilege_set_id => @privilege_set.id, :generic_role_id => 0, :context_role => "group_owner")
|
125
117
|
|
126
|
-
pristine_permission =
|
118
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_context_role)
|
127
119
|
|
128
120
|
pristine_permission.cbac_permission_exists?.should be_false
|
129
121
|
end
|
@@ -131,13 +123,12 @@ describe "CbacPristinePermission" do
|
|
131
123
|
|
132
124
|
describe "check if a known permission exists for this pristine permission" do
|
133
125
|
before(:each) do
|
134
|
-
|
135
126
|
@pristine_context_role = PristineRole.new(:role_id => 0, :role_type => PristineRole.ROLE_TYPES[:context], :name => "logged_in_user")
|
136
127
|
@pristine_admin_role = PristineRole.new(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:admin], :name => "administrator")
|
137
128
|
end
|
138
129
|
|
139
130
|
it "should return true if the pristine permission exists as a known permission in the database" do
|
140
|
-
pristine_permission =
|
131
|
+
pristine_permission = PristinePermission.new(:pristine_role => @pristine_admin_role, :line_number => 4, :privilege_set_name => "not relevant")
|
141
132
|
|
142
133
|
Cbac::KnownPermission.create(:permission_number => pristine_permission.line_number, :permission_type => Cbac::KnownPermission.PERMISSION_TYPES[:context])
|
143
134
|
|
@@ -145,125 +136,173 @@ describe "CbacPristinePermission" do
|
|
145
136
|
end
|
146
137
|
end
|
147
138
|
|
148
|
-
describe "
|
139
|
+
describe "registering the change" do
|
149
140
|
before(:each) do
|
150
141
|
@privilege_set = Cbac::PrivilegeSetRecord.create(:name => "login")
|
151
|
-
@admin_role = Cbac::GenericRole.create(:name => "administrator")
|
152
142
|
|
153
|
-
@
|
143
|
+
@admin_role = Cbac::GenericRole.create(:name => "administrator")
|
154
144
|
@pristine_admin_role = PristineRole.new(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:admin], :name => @admin_role.name)
|
155
|
-
end
|
156
|
-
|
157
145
|
|
158
|
-
|
159
|
-
pristine_permission =
|
160
|
-
pristine_permission.
|
146
|
+
@pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_admin_role)
|
147
|
+
@pristine_permission.operation = '+'
|
148
|
+
@pristine_permission.line_number = rand
|
161
149
|
|
162
|
-
|
163
|
-
|
164
|
-
}.should change(Cbac::Permission, :count).by(1)
|
165
|
-
end
|
166
|
-
|
167
|
-
it "should create a generic permission if operation + is used" do
|
168
|
-
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_admin_role)
|
169
|
-
pristine_permission.operation = '+'
|
170
|
-
|
171
|
-
proc {
|
172
|
-
pristine_permission.accept
|
173
|
-
}.should change(Cbac::Permission, :count).by(1)
|
174
|
-
end
|
175
|
-
|
176
|
-
it "should delete the pristine permission since it was accepted" do
|
177
|
-
pristine_permission = PristinePermission.create(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_admin_role, :operation => '+')
|
178
|
-
|
179
|
-
proc {
|
180
|
-
pristine_permission.accept
|
181
|
-
}.should change(PristinePermission, :count).by(-1)
|
182
|
-
end
|
183
|
-
|
184
|
-
it "should create a generic role if it doesn't exist in yet" do
|
185
|
-
cbac_privilege_set = Cbac::PrivilegeSetRecord.create(:name => "cbac_administration")
|
186
|
-
|
187
|
-
cbac_admin_role = PristineRole.new(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:generic], :name => "cbac_administrator")
|
188
|
-
pristine_permission = PristinePermission.new(:privilege_set_name => cbac_privilege_set.name, :pristine_role => cbac_admin_role)
|
189
|
-
pristine_permission.operation = '+'
|
190
|
-
|
191
|
-
proc {
|
192
|
-
pristine_permission.accept
|
193
|
-
}.should change(Cbac::GenericRole, :count).by(1)
|
194
|
-
end
|
195
|
-
|
196
|
-
it "should use an existing role if possible" do
|
197
|
-
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_admin_role)
|
198
|
-
pristine_permission.operation = '+'
|
199
|
-
|
200
|
-
pristine_permission.accept
|
201
|
-
# test smell: depends on a clean database
|
202
|
-
cbac_permission = Cbac::Permission.first
|
203
|
-
|
204
|
-
cbac_permission.generic_role.should == @admin_role
|
205
|
-
end
|
206
|
-
|
207
|
-
it "should remove an existing permission if operation - is used" do
|
208
|
-
Cbac::Permission.create(:privilege_set_id => @privilege_set.id, :generic_role_id => 0, :context_role => @pristine_context_role.name)
|
209
|
-
|
210
|
-
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_context_role)
|
211
|
-
pristine_permission.operation = '-'
|
212
|
-
|
213
|
-
proc {
|
214
|
-
pristine_permission.accept
|
215
|
-
}.should change(Cbac::Permission, :count).by(-1)
|
216
|
-
end
|
217
|
-
|
218
|
-
it "should raise an error if operation - is used and the permission does not exist" do
|
219
|
-
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_context_role)
|
220
|
-
pristine_permission.operation = '-'
|
221
|
-
|
222
|
-
proc {
|
223
|
-
pristine_permission.accept
|
224
|
-
}.should raise_error(ArgumentError)
|
150
|
+
@pristine_file = mock('pristine_file', :permissions => [ @pristine_permission ])
|
151
|
+
@pristine_permission.stub(:pristine_file).and_return @pristine_file
|
225
152
|
end
|
226
153
|
|
227
154
|
it "should create a known permission to record a change" do
|
228
|
-
pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name, :pristine_role => @pristine_context_role)
|
229
|
-
pristine_permission.operation = '+'
|
230
|
-
|
231
155
|
proc {
|
232
|
-
pristine_permission.accept
|
156
|
+
@pristine_permission.accept
|
233
157
|
}.should change(Cbac::KnownPermission, :count).by(1)
|
234
158
|
end
|
235
159
|
|
236
160
|
it "should create a known permission with specified permission identifier" do
|
237
|
-
pristine_permission
|
238
|
-
pristine_permission.operation = '+'
|
239
|
-
|
240
|
-
pristine_permission.accept
|
161
|
+
@pristine_permission.accept
|
241
162
|
|
242
163
|
known_permission = Cbac::KnownPermission.last
|
243
164
|
|
244
|
-
known_permission.permission_number.should == pristine_permission.line_number
|
165
|
+
known_permission.permission_number.should == @pristine_permission.line_number
|
245
166
|
end
|
246
167
|
|
247
168
|
it "should create a known permission with specified role type" do
|
248
|
-
pristine_permission
|
249
|
-
pristine_permission.operation = '+'
|
250
|
-
|
251
|
-
pristine_permission.accept
|
169
|
+
@pristine_permission.accept
|
252
170
|
|
253
171
|
known_permission = Cbac::KnownPermission.last
|
254
172
|
|
255
173
|
known_permission.permission_type.should == Cbac::KnownPermission.PERMISSION_TYPES[:context]
|
256
174
|
end
|
257
175
|
|
258
|
-
|
259
|
-
|
176
|
+
context "if the operation is '-'" do
|
177
|
+
before :each do
|
178
|
+
Cbac::Permission.create(:privilege_set_id => @privilege_set.id, :generic_role_id => @pristine_admin_role.role_id, :context_role => @pristine_admin_role.name)
|
260
179
|
|
261
|
-
|
262
|
-
|
180
|
+
@pristine_permission.operation = '-'
|
181
|
+
end
|
263
182
|
|
264
|
-
|
265
|
-
|
266
|
-
|
183
|
+
it "should still create a known permission" do
|
184
|
+
proc {
|
185
|
+
@pristine_permission.accept
|
186
|
+
}.should change(Cbac::KnownPermission, :count).by(1)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe "apply the permission" do
|
192
|
+
before(:each) do
|
193
|
+
@privilege_set = Cbac::PrivilegeSetRecord.create(:name => "login")
|
194
|
+
@admin_role = Cbac::GenericRole.create(:name => "administrator")
|
195
|
+
|
196
|
+
@pristine_context_role = PristineRole.new(:role_id => 0, :role_type => PristineRole.ROLE_TYPES[:context], :name => "logged_in_user")
|
197
|
+
@pristine_admin_role = PristineRole.new(:role_id => 1, :role_type => PristineRole.ROLE_TYPES[:admin], :name => @admin_role.name)
|
198
|
+
|
199
|
+
@pristine_permission = PristinePermission.new(:privilege_set_name => @privilege_set.name)
|
200
|
+
@pristine_permission.stub(:register_change)
|
201
|
+
end
|
202
|
+
|
203
|
+
context "if operation '+' is used" do
|
204
|
+
before :each do
|
205
|
+
@pristine_permission.operation = '+'
|
206
|
+
end
|
207
|
+
|
208
|
+
context "if the role is a context role" do
|
209
|
+
before :each do
|
210
|
+
@pristine_permission.pristine_role = @pristine_context_role
|
211
|
+
@pristine_permission.save!
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should delete the pristine permission since it was accepted" do
|
215
|
+
proc {
|
216
|
+
@pristine_permission.accept
|
217
|
+
}.should change(PristinePermission, :count).by(-1)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should register the change" do
|
221
|
+
@pristine_permission.should_receive(:register_change)
|
222
|
+
|
223
|
+
@pristine_permission.accept
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should add the context permission to the database" do
|
227
|
+
proc {
|
228
|
+
@pristine_permission.accept
|
229
|
+
}.should change(Cbac::Permission, :count).by(1)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
context "if the role is a generic role" do
|
234
|
+
before :each do
|
235
|
+
@pristine_permission.pristine_role = @pristine_admin_role
|
236
|
+
@pristine_permission.save!
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should delete the pristine permission since it was accepted" do
|
240
|
+
proc {
|
241
|
+
@pristine_permission.accept
|
242
|
+
}.should change(PristinePermission, :count).by(-1)
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should register the change" do
|
246
|
+
@pristine_permission.should_receive(:register_change)
|
247
|
+
|
248
|
+
@pristine_permission.accept
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should create a generic permission" do
|
252
|
+
proc {
|
253
|
+
@pristine_permission.accept
|
254
|
+
}.should change(Cbac::Permission, :count).by(1)
|
255
|
+
end
|
256
|
+
|
257
|
+
context "and the given role already exists" do
|
258
|
+
it "should use the existing role" do
|
259
|
+
@pristine_permission.pristine_role = @pristine_admin_role
|
260
|
+
|
261
|
+
@pristine_permission.accept
|
262
|
+
|
263
|
+
Cbac::Permission.last.generic_role.should == @admin_role
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
context "but no role with that name exists" do
|
268
|
+
before :each do
|
269
|
+
Cbac::GenericRole.delete_all
|
270
|
+
end
|
271
|
+
|
272
|
+
it "should create a generic role if it doesn't exist in yet" do
|
273
|
+
proc {
|
274
|
+
@pristine_permission.accept
|
275
|
+
}.should change(Cbac::GenericRole, :count).by(1)
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
context "if operation '-' is used" do
|
282
|
+
before :each do
|
283
|
+
@pristine_permission.operation = '-'
|
284
|
+
@pristine_permission.pristine_role = @pristine_context_role
|
285
|
+
end
|
286
|
+
|
287
|
+
it "should remove an existing permission" do
|
288
|
+
Cbac::Permission.create(:privilege_set_id => @privilege_set.id, :generic_role_id => 0, :context_role => @pristine_context_role.name)
|
289
|
+
|
290
|
+
proc {
|
291
|
+
@pristine_permission.accept
|
292
|
+
}.should change(Cbac::Permission, :count).by(-1)
|
293
|
+
end
|
294
|
+
|
295
|
+
context "if the permission specified does not exist" do
|
296
|
+
before :each do
|
297
|
+
Cbac::Permission.delete_all
|
298
|
+
end
|
299
|
+
|
300
|
+
it "should raise an error" do
|
301
|
+
proc {
|
302
|
+
@pristine_permission.accept
|
303
|
+
}.should raise_error(ArgumentError)
|
304
|
+
end
|
305
|
+
end
|
267
306
|
end
|
268
307
|
end
|
269
308
|
|
@@ -274,7 +313,7 @@ describe "CbacPristinePermission" do
|
|
274
313
|
end
|
275
314
|
|
276
315
|
it "should persist the pristine permission to the database" do
|
277
|
-
pristine_permission =
|
316
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => "login", :pristine_role => @pristine_context_role, :operation => '+')
|
278
317
|
|
279
318
|
proc {
|
280
319
|
pristine_permission.stage
|
@@ -283,7 +322,7 @@ describe "CbacPristinePermission" do
|
|
283
322
|
end
|
284
323
|
|
285
324
|
it "should persist the associated role if it doesn't exist yet" do
|
286
|
-
pristine_permission =
|
325
|
+
pristine_permission = PristinePermission.new(:privilege_set_name => "login", :pristine_role => @pristine_context_role, :operation => '+')
|
287
326
|
|
288
327
|
proc {
|
289
328
|
pristine_permission.stage
|
@@ -294,7 +333,7 @@ describe "CbacPristinePermission" do
|
|
294
333
|
privilege_set = Cbac::PrivilegeSetRecord.create(:name => "login")
|
295
334
|
Cbac::Permission.create(:privilege_set_id => privilege_set.id, :generic_role_id => 0, :context_role => @pristine_context_role.name)
|
296
335
|
|
297
|
-
pristine_permission =
|
336
|
+
pristine_permission = PristinePermission.new(:operation => '+', :privilege_set_name => privilege_set.name, :pristine_role => @pristine_context_role)
|
298
337
|
proc {
|
299
338
|
pristine_permission.stage
|
300
339
|
}.should_not change(Cbac::CbacPristine::PristinePermission, :count)
|
@@ -304,7 +343,7 @@ describe "CbacPristinePermission" do
|
|
304
343
|
privilege_set = Cbac::PrivilegeSetRecord.create(:name => "login")
|
305
344
|
Cbac::Permission.create(:privilege_set_id => privilege_set.id, :generic_role_id => 0, :context_role => @pristine_context_role.name)
|
306
345
|
|
307
|
-
pristine_permission =
|
346
|
+
pristine_permission = PristinePermission.new(:operation => '-', :privilege_set_name => privilege_set.name, :pristine_role => @pristine_context_role)
|
308
347
|
proc {
|
309
348
|
pristine_permission.stage
|
310
349
|
}.should change(Cbac::CbacPristine::PristinePermission, :count).by(1)
|
@@ -313,7 +352,7 @@ describe "CbacPristinePermission" do
|
|
313
352
|
it "should not create a new pristine permission if a staged add permission exists and this pristine permission wants to revoke" do
|
314
353
|
privilege_set_name = "chat"
|
315
354
|
PristinePermission.new(:operation => '+', :privilege_set_name => privilege_set_name, :pristine_role => @pristine_context_role)
|
316
|
-
pristine_revoke_permission =
|
355
|
+
pristine_revoke_permission = PristinePermission.new(:operation => '-', :privilege_set_name => privilege_set_name, :pristine_role => @pristine_context_role)
|
317
356
|
|
318
357
|
proc {
|
319
358
|
pristine_revoke_permission.stage
|
@@ -323,7 +362,7 @@ describe "CbacPristinePermission" do
|
|
323
362
|
it "should delete a staged add permission if the pristine permission wants to revoke the same permission" do
|
324
363
|
privilege_set_name = "chat"
|
325
364
|
PristinePermission.create(:operation => '+', :privilege_set_name => privilege_set_name, :pristine_role => @pristine_context_role)
|
326
|
-
pristine_revoke_permission =
|
365
|
+
pristine_revoke_permission = PristinePermission.new(:operation => '-', :privilege_set_name => privilege_set_name, :pristine_role => @pristine_context_role)
|
327
366
|
|
328
367
|
proc {
|
329
368
|
pristine_revoke_permission.stage
|
@@ -332,7 +371,7 @@ describe "CbacPristinePermission" do
|
|
332
371
|
|
333
372
|
it "should not create a new pristine permission if a cbac known permission exists" do
|
334
373
|
known_number = 1
|
335
|
-
pristine_permission =
|
374
|
+
pristine_permission = PristinePermission.new(:line_number => known_number, :privilege_set_name => "name not relevant", :pristine_role => @pristine_context_role)
|
336
375
|
Cbac::KnownPermission.create(:permission_number => known_number, :permission_type => Cbac::KnownPermission.PERMISSION_TYPES[:context])
|
337
376
|
|
338
377
|
proc {
|
@@ -344,15 +383,12 @@ describe "CbacPristinePermission" do
|
|
344
383
|
it "should raise an error if the same pristine permission is staged twice" do
|
345
384
|
privilege_set_name = "chat"
|
346
385
|
PristinePermission.create(:operation => '+', :privilege_set_name => privilege_set_name, :pristine_role => @pristine_context_role, :line_number => 2)
|
347
|
-
pristine_permission =
|
386
|
+
pristine_permission = PristinePermission.new(:operation => '+', :privilege_set_name => privilege_set_name, :pristine_role => @pristine_context_role, :line_number => 3)
|
348
387
|
|
349
388
|
proc {
|
350
389
|
pristine_permission.stage
|
351
390
|
}.should raise_error(ArgumentError)
|
352
391
|
end
|
353
|
-
|
354
|
-
|
355
392
|
end
|
356
|
-
|
357
393
|
end
|
358
394
|
|