arrthorizer 0.1.0.pre2 → 0.1.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.
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