arrthorizer 0.1.0.pre2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- [![Build Status](https://travis-ci.org/ReneB/arrthorizer.png?branch=fyfbd_118)](https://travis-ci.org/ReneB/arrthorizer)
2
- (The build is currently supposed to fail, since the gem is not in a releasable state yet)
1
+ [![Code Climate](https://codeclimate.com/github/BUS-OGD/arrthorizer.png)](https://codeclimate.com/github/BUS-OGD/arrthorizer)
2
+ [![Build Status](https://travis-ci.org/BUS-OGD/arrthorizer.png)](https://travis-ci.org/BUS-OGD/arrthorizer)
3
3
 
4
4
  # Arrthorizer
5
5
 
@@ -7,6 +7,7 @@ module Arrthorizer
7
7
 
8
8
  autoload :Role, "arrthorizer/role"
9
9
  autoload :ContextRole, "arrthorizer/context_role"
10
+ autoload :Group, "arrthorizer/group"
10
11
 
11
12
  autoload :Permission, "arrthorizer/permission"
12
13
  autoload :Privilege, "arrthorizer/privilege"
@@ -23,6 +24,24 @@ module Arrthorizer
23
24
  end
24
25
 
25
26
  def self.configure(&block)
26
- self.tap(&block)
27
+ self.instance_eval(&block)
28
+ end
29
+
30
+ ##
31
+ # Inject a dependency for Arrthorizer's Groups feature.
32
+ # The provided object needs to be able to respond_to :is_member_of?
33
+ # The is_member_of? function is expected to return a boolean-like
34
+ # object which represents whether or not the user is a member of the
35
+ # provided Group
36
+ def self.check_group_membership_using(object)
37
+ if object.respond_to?(:is_member_of?)
38
+ @membership_service = object
39
+ else
40
+ raise "Arrthorizer cannot check role membership using #{object.inspect}"
41
+ end
42
+ end
43
+
44
+ def self.membership_service
45
+ @membership_service
27
46
  end
28
47
  end
@@ -0,0 +1,26 @@
1
+ ##
2
+ # This is the class of all Groups. A Group is a role that does not depend
3
+ # on context, but rather on membership - a user can be made a member
4
+ # of such a role. This might be related to that person's role in the
5
+ # organization, for example.
6
+ module Arrthorizer
7
+ class Group < Role
8
+ attr_reader :name
9
+
10
+ def initialize(name)
11
+ @name = name
12
+
13
+ Role.register(self)
14
+ end
15
+
16
+ def applies_to_user?(user, _)
17
+ is_member?(user)
18
+ end
19
+
20
+ private
21
+ def is_member?(user)
22
+ Arrthorizer.membership_service.is_member_of?(user, self)
23
+ end
24
+ end
25
+ end
26
+
@@ -13,9 +13,12 @@ module Arrthorizer
13
13
  self.defaults_block = block
14
14
  end
15
15
 
16
- def for_action(action, &block)
17
- add_action_block(action, &block)
16
+ def for_action(*actions, &block)
17
+ actions.each do |action|
18
+ add_action_block(action, &block)
19
+ end
18
20
  end
21
+ alias_method :for_actions, :for_action
19
22
 
20
23
  def block_for(action)
21
24
  action_blocks.fetch(action) { defaults_block }
@@ -2,7 +2,7 @@
2
2
  module Arrthorizer
3
3
  class Role
4
4
  # Template method: This method is implemented in the
5
- # ContextRole subclasses.
5
+ # ContextRole subclasses and Group.
6
6
  def applies_to_user?(user, context = {})
7
7
  raise NotImplementedError, "#{self.name} does not implement #applies_to_user?(user, context)"
8
8
  end
@@ -1,3 +1,3 @@
1
1
  module Arrthorizer
2
- VERSION = "0.1.0.pre2"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -11,9 +11,10 @@
11
11
  # Let's also assume that we have Roles for Forum::TopicStarter and Forum::Administrators.
12
12
  # ForumTopicStarters may be allowed to delete any topics they started and update them in
13
13
  # whatever way they deem relevant, but not change any topics they did not start themselves. This
14
- # means the role would be a ContextRole.
15
- # Let's also assume you have a LoggedInUser role which allows anyone to see any topic or start a
16
- # new one, as # long as they're logged in.
14
+ # means the role would be a ContextRole. The administrators can do anything they bloody well
15
+ # please with any topic at all (therefore, the role would be a Group). Let's also assume
16
+ # you have a LoggedInUser role which allows anyone to see any topic or start a new one, as
17
+ # long as they're logged in.
17
18
  #
18
19
  # We would define these privileges as follows:
19
20
  #
@@ -0,0 +1,11 @@
1
+ require "spec_helper"
2
+
3
+ describe Arrthorizer::Group do
4
+ describe :initialize do
5
+ it "registers the new instance with Role" do
6
+ role = Arrthorizer::Group.new("some new group")
7
+
8
+ Arrthorizer::Role.get(role).should == role
9
+ end
10
+ end
11
+ end
@@ -4,7 +4,7 @@ describe SomeController do
4
4
  let(:action) { Arrthorizer::Rails::ControllerAction.fetch("some#some_action") }
5
5
  let(:other_action) { Arrthorizer::Rails::ControllerAction.fetch("some#other_action") }
6
6
 
7
- describe :some_action do
7
+ describe :some_action, type: :controller do
8
8
  let!(:privilege) { action.privilege }
9
9
  let!(:current_user) { double("user") }
10
10
 
@@ -12,6 +12,57 @@ describe SomeController do
12
12
  controller.stub(:current_user) { current_user }
13
13
  end
14
14
 
15
+ describe "group roles" do
16
+ let!(:group) { Arrthorizer::Group.new("some group") }
17
+
18
+ context "when the role is linked to the privilege" do
19
+ before do
20
+ Arrthorizer::Permission.grant(privilege, to: group)
21
+ end
22
+
23
+ context "when I am a member of the required group" do
24
+ before do
25
+ add_user_to_group(current_user, group)
26
+ end
27
+
28
+ it "succeeds" do
29
+ get :some_action
30
+
31
+ response.should be_success
32
+ end
33
+ end
34
+
35
+ context "when I am not a member of the required group" do
36
+ before do
37
+ remove_user_from_group(current_user, group)
38
+ end
39
+
40
+ it "fails" do
41
+ get :some_action
42
+
43
+ response.should be_forbidden
44
+ end
45
+ end
46
+
47
+ context "when I am only a member of an unrelated group" do
48
+ let(:other_group) { Arrthorizer::Group.new("other group") }
49
+
50
+ before do
51
+ other_privilege = other_action.privilege
52
+ Arrthorizer::Permission.grant(other_privilege, to: other_group)
53
+ remove_user_from_group(current_user, group)
54
+ add_user_to_group(current_user, other_group)
55
+ end
56
+
57
+ it "fails" do
58
+ get :some_action
59
+
60
+ response.should be_forbidden
61
+ end
62
+ end
63
+ end
64
+ end
65
+
15
66
  describe "context roles" do
16
67
  let!(:context_role) do
17
68
  configure_context_role do |user, context|
@@ -76,4 +127,20 @@ describe SomeController do
76
127
  role.stub(:applies_to_user?, &block)
77
128
  end
78
129
  end
130
+
131
+ def add_user_to_group( user, group )
132
+ stub_membership_with(user, group) do
133
+ true
134
+ end
135
+ end
136
+
137
+ def remove_user_from_group( user, group )
138
+ stub_membership_with(user, group) do
139
+ false
140
+ end
141
+ end
142
+
143
+ def stub_membership_with(user, group, &block)
144
+ Arrthorizer.membership_service.stub(:is_member_of?).with(user, group, &block)
145
+ end
79
146
  end
@@ -0,0 +1 @@
1
+ AnotherGroup = Arrthorizer::Group.new('antother_group')
@@ -0,0 +1 @@
1
+ SomeGroup = Arrthorizer::Group.new('some_group')
@@ -15,7 +15,7 @@ if defined?(Bundler)
15
15
  # Bundler.require(:default, :assets, Rails.env)
16
16
  end
17
17
 
18
- module TestCbac
18
+ module TestArrthorizer
19
19
  class Application < Rails::Application
20
20
  # Settings in config/environments/* take precedence over those specified here.
21
21
  # Application configuration should go into files in config/initializers
@@ -2,4 +2,4 @@
2
2
  require File.expand_path('../application', __FILE__)
3
3
 
4
4
  # Initialize the rails application
5
- TestCbac::Application.initialize!
5
+ TestArrthorizer::Application.initialize!
@@ -0,0 +1,9 @@
1
+ class EmptyMembershipService
2
+ def is_member_of?(*args)
3
+ raise NotImplementedError
4
+ end
5
+ end
6
+
7
+ Arrthorizer.configure do
8
+ check_group_membership_using EmptyMembershipService.new
9
+ end
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  describe Arrthorizer::Permission do
4
4
  describe :grant do
5
5
  let(:privilege) { Arrthorizer::Privilege.new(name: "privilege") }
6
- let(:role) { UnnamespacedContextRole }
6
+ let(:role) { Arrthorizer::Group.new("role") }
7
7
 
8
8
  it "adds the role to the privilege set" do
9
9
  Arrthorizer::Permission.grant(privilege, to: role)
@@ -3,8 +3,8 @@ require "spec_helper"
3
3
  describe Arrthorizer::Privilege do
4
4
  subject(:privilege) { Arrthorizer::Privilege.new(name: "some privilege") }
5
5
 
6
- let(:role) { Namespaced::ContextRole }
7
- let(:other_role) { UnnamespacedContextRole }
6
+ let(:role) { SomeGroup }
7
+ let(:other_role) { AnotherGroup }
8
8
 
9
9
  describe :accessible_to? do
10
10
  context "when a Role was configured to have access to this privilege" do
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
 
3
3
  describe Arrthorizer::Privilege do
4
4
  describe :initialize do
5
- let(:role) { UnnamespacedContextRole }
5
+ let(:role) { SomeGroup }
6
6
  let(:roles) { [ role ] }
7
7
  let(:name) { "some name" }
8
8
 
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  describe Arrthorizer::Privilege do
4
4
  describe :make_accessible_to do
5
5
  let(:privilege) { Arrthorizer::Privilege.new(name: "privilege") }
6
- let(:role) { UnnamespacedContextRole }
6
+ let(:role) { SomeGroup }
7
7
 
8
8
  it "makes the privilege accessible to the role" do
9
9
  expect {
@@ -12,7 +12,7 @@ describe Arrthorizer::Privilege do
12
12
  end
13
13
 
14
14
  it "does not make it accessible to a different role" do
15
- unrelated_role = Namespaced::ContextRole
15
+ unrelated_role = Arrthorizer::Group.new("unrelated role")
16
16
 
17
17
  expect {
18
18
  privilege.make_accessible_to(role)
@@ -25,5 +25,21 @@ describe Arrthorizer::Role do
25
25
  end
26
26
  end
27
27
  end
28
+
29
+ context "fetching Groups" do
30
+ let(:expected_role) { SomeGroup } # provided by the internal Rails app
31
+
32
+ context "when a Group is provided" do
33
+ it_behaves_like "finding the right Role" do
34
+ let(:arg) { expected_role }
35
+ end
36
+ end
37
+
38
+ context "when a String representing a Group is provided" do
39
+ it_behaves_like "finding the right Role" do
40
+ let(:arg) { expected_role.to_key }
41
+ end
42
+ end
43
+ end
28
44
  end
29
45
  end
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arrthorizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre2
4
+ version: 0.1.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - René van den Berg
@@ -9,25 +10,28 @@ authors:
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2014-01-31 00:00:00.000000000 Z
13
+ date: 2014-02-20 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rails
16
17
  requirement: !ruby/object:Gem::Requirement
18
+ none: false
17
19
  requirements:
18
- - - '>='
20
+ - - ! '>='
19
21
  - !ruby/object:Gem::Version
20
22
  version: '0'
21
23
  type: :runtime
22
24
  prerelease: false
23
25
  version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
24
27
  requirements:
25
- - - '>='
28
+ - - ! '>='
26
29
  - !ruby/object:Gem::Version
27
30
  version: '0'
28
31
  - !ruby/object:Gem::Dependency
29
32
  name: combustion
30
33
  requirement: !ruby/object:Gem::Requirement
34
+ none: false
31
35
  requirements:
32
36
  - - ~>
33
37
  - !ruby/object:Gem::Version
@@ -35,6 +39,7 @@ dependencies:
35
39
  type: :development
36
40
  prerelease: false
37
41
  version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
38
43
  requirements:
39
44
  - - ~>
40
45
  - !ruby/object:Gem::Version
@@ -42,29 +47,33 @@ dependencies:
42
47
  - !ruby/object:Gem::Dependency
43
48
  name: sqlite3
44
49
  requirement: !ruby/object:Gem::Requirement
50
+ none: false
45
51
  requirements:
46
- - - '>='
52
+ - - ! '>='
47
53
  - !ruby/object:Gem::Version
48
54
  version: '0'
49
55
  type: :development
50
56
  prerelease: false
51
57
  version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
52
59
  requirements:
53
- - - '>='
60
+ - - ! '>='
54
61
  - !ruby/object:Gem::Version
55
62
  version: '0'
56
63
  - !ruby/object:Gem::Dependency
57
64
  name: rspec-rails
58
65
  requirement: !ruby/object:Gem::Requirement
66
+ none: false
59
67
  requirements:
60
- - - '>='
68
+ - - ! '>='
61
69
  - !ruby/object:Gem::Version
62
70
  version: '0'
63
71
  type: :development
64
72
  prerelease: false
65
73
  version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
66
75
  requirements:
67
- - - '>='
76
+ - - ! '>='
68
77
  - !ruby/object:Gem::Version
69
78
  version: '0'
70
79
  description: Contextual authorization for your Rails (3+) application
@@ -88,6 +97,7 @@ files:
88
97
  - lib/arrthorizer/context.rb
89
98
  - lib/arrthorizer/context_builder.rb
90
99
  - lib/arrthorizer/context_role.rb
100
+ - lib/arrthorizer/group.rb
91
101
  - lib/arrthorizer/permission.rb
92
102
  - lib/arrthorizer/privilege.rb
93
103
  - lib/arrthorizer/rails.rb
@@ -109,9 +119,10 @@ files:
109
119
  - spec/context_builder/build_spec.rb
110
120
  - spec/context_role/to_key_spec.rb
111
121
  - spec/context_spec.rb
112
- - spec/controllers/some_controller_spec.rb
122
+ - spec/integration/group/initialize_spec.rb
113
123
  - spec/integration/registry/missing_handler_spec.rb
114
124
  - spec/integration/role_spec.rb
125
+ - spec/integration/some_controller_spec.rb
115
126
  - spec/internal/app/assets/images/rails.png
116
127
  - spec/internal/app/assets/javascripts/application.js
117
128
  - spec/internal/app/assets/javascripts/test.js.coffee
@@ -123,7 +134,9 @@ files:
123
134
  - spec/internal/app/helpers/test_helper.rb
124
135
  - spec/internal/app/mailers/.gitkeep
125
136
  - spec/internal/app/models/.gitkeep
137
+ - spec/internal/app/roles/another_group.rb
126
138
  - spec/internal/app/roles/namespaced/context_role.rb
139
+ - spec/internal/app/roles/some_group.rb
127
140
  - spec/internal/app/roles/unnamespaced_context_role.rb
128
141
  - spec/internal/app/views/layouts/application.html.erb
129
142
  - spec/internal/app/views/some/some_action.html.erb
@@ -132,6 +145,7 @@ files:
132
145
  - spec/internal/config/boot.rb
133
146
  - spec/internal/config/database.yml
134
147
  - spec/internal/config/environment.rb
148
+ - spec/internal/config/initializers/arrthorizer.rb
135
149
  - spec/internal/config/routes.rb
136
150
  - spec/internal/db/schema.rb
137
151
  - spec/internal/log/.gitignore
@@ -156,26 +170,27 @@ files:
156
170
  - spec/support/reset.rb
157
171
  homepage: https://github.com/BUS-ogd/arrthorizer
158
172
  licenses: []
159
- metadata: {}
160
173
  post_install_message:
161
174
  rdoc_options: []
162
175
  require_paths:
163
176
  - lib
164
177
  required_ruby_version: !ruby/object:Gem::Requirement
178
+ none: false
165
179
  requirements:
166
- - - '>='
180
+ - - ! '>='
167
181
  - !ruby/object:Gem::Version
168
182
  version: '0'
169
183
  required_rubygems_version: !ruby/object:Gem::Requirement
184
+ none: false
170
185
  requirements:
171
- - - '>'
186
+ - - ! '>='
172
187
  - !ruby/object:Gem::Version
173
- version: 1.3.1
188
+ version: '0'
174
189
  requirements: []
175
190
  rubyforge_project:
176
- rubygems_version: 2.0.0
191
+ rubygems_version: 1.8.23
177
192
  signing_key:
178
- specification_version: 4
193
+ specification_version: 3
179
194
  summary: Contextual authorization for your Rails (3+) application
180
195
  test_files:
181
196
  - spec/arrthorizer_exception/inner_spec.rb
@@ -184,9 +199,10 @@ test_files:
184
199
  - spec/context_builder/build_spec.rb
185
200
  - spec/context_role/to_key_spec.rb
186
201
  - spec/context_spec.rb
187
- - spec/controllers/some_controller_spec.rb
202
+ - spec/integration/group/initialize_spec.rb
188
203
  - spec/integration/registry/missing_handler_spec.rb
189
204
  - spec/integration/role_spec.rb
205
+ - spec/integration/some_controller_spec.rb
190
206
  - spec/internal/app/assets/images/rails.png
191
207
  - spec/internal/app/assets/javascripts/application.js
192
208
  - spec/internal/app/assets/javascripts/test.js.coffee
@@ -198,7 +214,9 @@ test_files:
198
214
  - spec/internal/app/helpers/test_helper.rb
199
215
  - spec/internal/app/mailers/.gitkeep
200
216
  - spec/internal/app/models/.gitkeep
217
+ - spec/internal/app/roles/another_group.rb
201
218
  - spec/internal/app/roles/namespaced/context_role.rb
219
+ - spec/internal/app/roles/some_group.rb
202
220
  - spec/internal/app/roles/unnamespaced_context_role.rb
203
221
  - spec/internal/app/views/layouts/application.html.erb
204
222
  - spec/internal/app/views/some/some_action.html.erb
@@ -207,6 +225,7 @@ test_files:
207
225
  - spec/internal/config/boot.rb
208
226
  - spec/internal/config/database.yml
209
227
  - spec/internal/config/environment.rb
228
+ - spec/internal/config/initializers/arrthorizer.rb
210
229
  - spec/internal/config/routes.rb
211
230
  - spec/internal/db/schema.rb
212
231
  - spec/internal/log/.gitignore
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: b71c7c666f99142b09c0bf02f42eba2942090799
4
- data.tar.gz: 7ae245473bca34b41a2d99b5fdb01a240b8bb2fc
5
- SHA512:
6
- metadata.gz: b7c6ab52920724e0ee79ae75365385829c7d3f5f2124aec3380687cfca1fc0d308412d38c697b6d9264b05422834d2667b494ecce7dfd8087380a399ef40d992
7
- data.tar.gz: c2d9eacd2683e5b07b2231cf58ad2405b240e334811dc884ea811dc8ecf585cf6bf46afd269a7778a90ce36db7eba2f825ccdef4fd9bf63276503f328b639ca5