rend-acl 0.0.1

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/rend-acl.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rend/acl/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rend-acl"
8
+ spec.version = Rend::Acl::Version::STRING
9
+ spec.authors = ["Daniel Doezema"]
10
+ spec.email = ["daniel.doezema@gmail.com"]
11
+ spec.description = "Zend Framework components ported to Ruby -- Core Gem."
12
+ spec.summary = "rend-acl-#{Rend::Acl::Version::STRING}"
13
+ spec.homepage = "https://github.com/veloper/rend-acl"
14
+ spec.license = "New-BSD"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.files += ["LICENSE.txt", "ZEND_FRAMEWORK_LICENSE.txt"]
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "rake"
24
+
25
+ dependency_gems = ['rend-core']
26
+
27
+ dependency_gems.each do |gem_name|
28
+ if Rend::Acl::Version::STRING =~ /[a-zA-Z]+/
29
+ spec.add_runtime_dependency "#{gem_name}", "= #{Rend::Acl::Version::STRING}"
30
+ else
31
+ spec.add_runtime_dependency "#{gem_name}", "~> #{Rend::Acl::Version::STRING.split('.')[0..1].concat(['0']).join('.')}"
32
+ end
33
+ end
34
+ end
data/test/test_acl.rb ADDED
@@ -0,0 +1,209 @@
1
+ require 'test/unit'
2
+ require 'rend/acl'
3
+
4
+ class AclTest < Test::Unit::TestCase
5
+
6
+ # See: http://framework.zend.com/manual/1.12/en/zend.acl.introduction.html#zend.acl.introduction.roles
7
+ def test_multiple_inheritance_among_roles
8
+ @acl = Rend::Acl.new
9
+ @acl.add_role!('guest').add_role!('member').add_role!('admin')
10
+
11
+ parents = %w[guest member admin]
12
+ @acl.add_role! 'Daniel Doezema', parents
13
+
14
+ @acl.add_resource!('gold')
15
+
16
+ @acl.deny!('guest', 'gold')
17
+ @acl.allow!('member', 'gold')
18
+
19
+ assert_equal true, @acl.allowed?('Daniel Doezema', 'gold')
20
+ end
21
+
22
+ # http://framework.zend.com/manual/1.12/en/zend.acl.introduction.html#zend.acl.introduction.role_registry
23
+ def test_registering_roles
24
+ @acl = Rend::Acl.new
25
+ guest_role = Rend::Acl::Role.new('guest')
26
+ @acl.add_role! guest_role
27
+ @acl.add_role! Rend::Acl::Role.new('staff'), guest_role
28
+ @acl.add_role! Rend::Acl::Role.new('editor'), 'staff'
29
+ @acl.add_role! Rend::Acl::Role.new('administrator')
30
+
31
+ # Guest may only view content
32
+ @acl.allow! guest_role, nil, 'view'
33
+
34
+ # Staff inherits view privilege from guest, but also needs additional
35
+ # privileges
36
+ @acl.allow! 'staff', nil, %w[edit submit revise]
37
+
38
+ # Editor inherits view, edit, submit, and revise privileges from
39
+ # staff, but also needs additional privileges
40
+ @acl.allow! 'editor', nil, %w[publish archive delete]
41
+
42
+ # Administrator inherits nothing, but is allowed all privileges
43
+ @acl.allow! 'administrator'
44
+
45
+
46
+ assert_equal true, @acl.allowed?('guest', nil, 'view')
47
+ assert_equal false, @acl.allowed?('staff', nil, 'publish')
48
+ assert_equal true, @acl.allowed?('staff', nil, 'revise')
49
+ assert_equal true, @acl.allowed?('editor', nil, 'view') # allowed because of inheritance from guest
50
+ assert_equal false, @acl.allowed?('editor', nil, 'update') # denied because no allow rule for 'update'
51
+ assert_equal true, @acl.allowed?('administrator', nil, 'view') # allowed because administrator is allowed all privileges
52
+ assert_equal true, @acl.allowed?('administrator') # allowed because administrator is allowed all privileges
53
+ assert_equal true, @acl.allowed?('administrator', nil, 'update') # allowed because administrator is allowed all privileges
54
+ end
55
+
56
+ # http://framework.zend.com/manual/1.12/en/zend.acl.introduction.html#zend.acl.introduction.role_registry
57
+ def test_precise_access_controls
58
+ @acl = Rend::Acl.new
59
+ guest_role = Rend::Acl::Role.new('guest')
60
+ @acl.add_role! guest_role
61
+ @acl.add_role! Rend::Acl::Role.new('staff'), guest_role
62
+ @acl.add_role! Rend::Acl::Role.new('editor'), 'staff'
63
+ @acl.add_role! Rend::Acl::Role.new('administrator')
64
+
65
+ # Guest may only view content
66
+ @acl.allow! guest_role, nil, 'view'
67
+
68
+ # Staff inherits view privilege from guest, but also needs additional
69
+ # privileges
70
+ @acl.allow! 'staff', nil, %w[edit submit revise]
71
+
72
+ # Editor inherits view, edit, submit, and revise privileges from
73
+ # staff, but also needs additional privileges
74
+ @acl.allow! 'editor', nil, %w[publish archive delete]
75
+
76
+ # Administrator inherits nothing, but is allowed all privileges
77
+ @acl.allow! 'administrator'
78
+
79
+ # The new marketing group inherits permissions from staff
80
+ @acl.add_role!(Rend::Acl::Role.new('marketing'), 'staff')
81
+
82
+ # === Create Resources for the rules ===
83
+
84
+ # newsletter
85
+ @acl.add_resource!(Rend::Acl::Resource.new('newsletter'))
86
+
87
+ # news
88
+ @acl.add_resource!(Rend::Acl::Resource.new('news'))
89
+
90
+ # latest news
91
+ @acl.add_resource!(Rend::Acl::Resource.new('latest'), 'news')
92
+
93
+ # announcement news
94
+ @acl.add_resource!(Rend::Acl::Resource.new('announcement'), 'news')
95
+
96
+ # === Setting up access ====
97
+
98
+ # Marketing must be able to publish and archive newsletters and the latest news
99
+ @acl.allow!('marketing', ['newsletter', 'latest'], ['publish', 'archive'])
100
+
101
+ # Staff (and marketing, by inheritance), are denied permission to revise the latest news
102
+ @acl.deny!('staff', 'latest', 'revise')
103
+
104
+ # Everyone (including administrators) are denied permission to archive news announcements
105
+ @acl.deny!(nil, 'announcement', 'archive')
106
+
107
+
108
+ # === Testing ===
109
+
110
+ assert_equal false, @acl.allowed?('staff' , 'newsletter' , 'publish') # denied
111
+ assert_equal true, @acl.allowed?('marketing' , 'newsletter' , 'publish') # allowed
112
+ assert_equal false, @acl.allowed?('staff' , 'latest' , 'publish') # denied
113
+ assert_equal true, @acl.allowed?('marketing' , 'latest' , 'publish') # allowed
114
+ assert_equal true, @acl.allowed?('marketing' , 'latest' , 'archive') # allowed
115
+ assert_equal false, @acl.allowed?('marketing' , 'latest' , 'revise') # denied
116
+ assert_equal false, @acl.allowed?('editor' , 'announcement' , 'archive') # denied
117
+ assert_equal false, @acl.allowed?('administrator' , 'announcement' , 'archive') # denied
118
+
119
+ # === Removing Access Controls ===
120
+ # To remove one or more access rules from the ACL, simply use the available removeAllow()
121
+ # or removeDeny() methods. As with allow() and deny(), you may provide a NULL value to indicate
122
+ # application to all roles, resources, and/or privileges:
123
+
124
+ # Remove the denial of revising latest news to staff (and marketing, by inheritance)
125
+ @acl.remove_deny!('staff', 'latest', 'revise')
126
+ assert_equal true, @acl.allowed?('marketing', 'latest', 'revise')
127
+
128
+ # Remove the allowance of publishing and archiving newsletters to marketing
129
+ @acl.remove_allow!('marketing', 'newsletter', ['publish', 'archive'])
130
+ assert_equal false, @acl.allowed?('marketing', 'newsletter', 'publish')
131
+ assert_equal false, @acl.allowed?('marketing', 'newsletter', 'archive')
132
+
133
+ # === Modifying Access Controls ===
134
+ # Privileges may be modified incrementally as indicated above, but a NIL
135
+ # value for the privileges overrides such incremental changes:
136
+
137
+ # Allow marketing all permissions upon the latest news
138
+ @acl.allow!('marketing', 'latest')
139
+ assert_equal true, @acl.allowed?('marketing', 'latest', 'publish') # allowed
140
+ assert_equal true, @acl.allowed?('marketing', 'latest', 'archive') # allowed
141
+ assert_equal true, @acl.allowed?('marketing', 'latest', 'anything') # allowed
142
+ end
143
+
144
+ def test_storing_acl_data_for_persistence_with_marshal
145
+ @acl = Rend::Acl.new
146
+ guest_role = Rend::Acl::Role.new('guest')
147
+ @acl.add_role! guest_role
148
+ @acl.add_role! Rend::Acl::Role.new('staff'), guest_role
149
+ @acl.add_role! Rend::Acl::Role.new('editor'), 'staff'
150
+ @acl.add_role! Rend::Acl::Role.new('administrator')
151
+
152
+ # Guest may only view content
153
+ @acl.allow! guest_role, nil, 'view'
154
+
155
+ # Staff inherits view privilege from guest, but also needs additional
156
+ # privileges
157
+ @acl.allow! 'staff', nil, %w[edit submit revise]
158
+
159
+ # Editor inherits view, edit, submit, and revise privileges from
160
+ # staff, but also needs additional privileges
161
+ @acl.allow! 'editor', nil, %w[publish archive delete]
162
+
163
+ # Administrator inherits nothing, but is allowed all privileges
164
+ @acl.allow! 'administrator'
165
+
166
+ # The new marketing group inherits permissions from staff
167
+ @acl.add_role!(Rend::Acl::Role.new('marketing'), 'staff')
168
+
169
+ # === Create Resources for the rules ===
170
+
171
+ # newsletter
172
+ @acl.add_resource!(Rend::Acl::Resource.new('newsletter'))
173
+
174
+ # news
175
+ @acl.add_resource!(Rend::Acl::Resource.new('news'))
176
+
177
+ # latest news
178
+ @acl.add_resource!(Rend::Acl::Resource.new('latest'), 'news')
179
+
180
+ # announcement news
181
+ @acl.add_resource!(Rend::Acl::Resource.new('announcement'), 'news')
182
+
183
+ # === Setting up access ====
184
+
185
+ # Marketing must be able to publish and archive newsletters and the latest news
186
+ @acl.allow!('marketing', ['newsletter', 'latest'], ['publish', 'archive'])
187
+
188
+ # Staff (and marketing, by inheritance), are denied permission to revise the latest news
189
+ @acl.deny!('staff', 'latest', 'revise')
190
+
191
+ # Everyone (including administrators) are denied permission to archive news announcements
192
+ @acl.deny!(nil, 'announcement', 'archive')
193
+
194
+ encoded_acl = Marshal.dump(@acl)
195
+ decoded_acl = Marshal.load(encoded_acl)
196
+
197
+ # === Testing ===
198
+
199
+ assert_equal false, decoded_acl.allowed?('staff' , 'newsletter' , 'publish') # denied
200
+ assert_equal true, decoded_acl.allowed?('marketing' , 'newsletter' , 'publish') # allowed
201
+ assert_equal false, decoded_acl.allowed?('staff' , 'latest' , 'publish') # denied
202
+ assert_equal true, decoded_acl.allowed?('marketing' , 'latest' , 'publish') # allowed
203
+ assert_equal true, decoded_acl.allowed?('marketing' , 'latest' , 'archive') # allowed
204
+ assert_equal false, decoded_acl.allowed?('marketing' , 'latest' , 'revise') # denied
205
+ assert_equal false, decoded_acl.allowed?('editor' , 'announcement' , 'archive') # denied
206
+ assert_equal false, decoded_acl.allowed?('administrator' , 'announcement' , 'archive') # denied
207
+
208
+ end
209
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rend-acl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Daniel Doezema
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rend-core
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.0.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.0
62
+ description: Zend Framework components ported to Ruby -- Core Gem.
63
+ email:
64
+ - daniel.doezema@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - .gitignore
70
+ - Gemfile
71
+ - LICENSE.txt
72
+ - README.md
73
+ - Rakefile
74
+ - ZEND_FRAMEWORK_LICENSE.txt
75
+ - lib/rend/acl.rb
76
+ - lib/rend/acl/exception.rb
77
+ - lib/rend/acl/resource.rb
78
+ - lib/rend/acl/role.rb
79
+ - lib/rend/acl/role/registry.rb
80
+ - lib/rend/acl/role/registry/exception.rb
81
+ - lib/rend/acl/version.rb
82
+ - rend-acl.gemspec
83
+ - test/test_acl.rb
84
+ homepage: https://github.com/veloper/rend-acl
85
+ licenses:
86
+ - New-BSD
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ segments:
98
+ - 0
99
+ hash: 850208410793267425
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ segments:
107
+ - 0
108
+ hash: 850208410793267425
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 1.8.25
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: rend-acl-0.0.1
115
+ test_files:
116
+ - test/test_acl.rb