pebblebed 0.0.43 → 0.0.44

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -57,6 +57,7 @@ Other helper methods provided by this extension:
57
57
  require_identity # Halts with 403 if there is no current user
58
58
  require_god # Halts with 403 if the current user is not a god
59
59
  require_access_to_path(path) # Halts with 403 if the current user is not a member of a checkpoint access group with privileged access to that path
60
+ require_action_allowed(action, uid) # Halts with 403 if the current user is not allowed by checkpoint to perform this action for that uid
60
61
  require_parameters(parameters, *keys) # Halts with 409 if the at least one of the provided keys is not in the params-hash
61
62
 
62
63
  ### Testing Sinatra APIs
@@ -93,6 +93,15 @@ module Sinatra
93
93
  halt 403, "Access denied."
94
94
  end
95
95
 
96
+ def require_action_allowed(action, uid)
97
+ require_identity
98
+ uid = ::Pebblebed::Uid.new(uid) if uid.is_a?(String)
99
+ return if current_identity.god and uid.path.split(".")[0] == current_identity.realm
100
+ res = pebbles.checkpoint.get("/callbacks/allowed/#{action}/#{uid}")
101
+ return if res['allowed']
102
+ halt 403, ":#{action} denied for #{uid} : #{res['reason']}"
103
+ end
104
+
96
105
  def limit_offset_collection(collection, options)
97
106
  limit = (options[:limit] || 20).to_i
98
107
  offset = (options[:offset] || 0).to_i
@@ -1,3 +1,3 @@
1
1
  module Pebblebed
2
- VERSION = "0.0.43"
2
+ VERSION = "0.0.44"
3
3
  end
data/spec/sinatra_spec.rb CHANGED
@@ -34,6 +34,11 @@ class TestApp < Sinatra::Base
34
34
  "You are most powerful"
35
35
  end
36
36
 
37
+ post '/create/:uid' do |uid|
38
+ require_action_allowed(:create, uid)
39
+ "You are creative"
40
+ end
41
+
37
42
  get '/nonexistant' do
38
43
  raise Pebblebed::HttpNotFoundError, "Not found /nonexistant"
39
44
  end
@@ -154,6 +159,49 @@ describe Sinatra::Pebblebed do
154
159
  end
155
160
  end
156
161
 
162
+ describe "with checkpoint psm2 callbacks" do
163
+ let(:checkpoint) {
164
+ checkpoint = stub
165
+ checkpoint.stub!(:service_url => 'http://example.com')
166
+ checkpoint
167
+ }
168
+ context "as a guest" do
169
+ specify "not allowed" do
170
+ guest!
171
+ post '/create/post.foo:testrealm'
172
+ last_response.status.should == 403
173
+ end
174
+ end
175
+ context "as a god" do
176
+ specify "allowed without callbacks" do
177
+ god!(:session => random_session)
178
+ post '/create/post.foo:testrealm'
179
+ last_response.body.should == "You are creative"
180
+ end
181
+ end
182
+ context "as user without permissions" do
183
+ specify "is disallowed" do
184
+ user!
185
+ checkpoint.should_receive(:get).with("/identities/me").and_return(DeepStruct.wrap(:identity => {:realm => 'testrealm', :id => 1, :god => false}))
186
+ checkpoint.should_receive(:get).with("/callbacks/allowed/create/post.foo:testrealm").and_return(DeepStruct.wrap(:allowed => false, :reason => "You are not worthy!"))
187
+ Pebblebed::Connector.any_instance.stub(:checkpoint => checkpoint)
188
+ post '/create/post.foo:testrealm'
189
+ last_response.status.should == 403
190
+ last_response.body.should == ":create denied for post.foo:testrealm : You are not worthy!"
191
+ end
192
+ end
193
+ context "as user with permissions" do
194
+ specify "is allowed" do
195
+ user!
196
+ checkpoint.should_receive(:get).with("/identities/me").and_return(DeepStruct.wrap(:identity => {:realm => 'testrealm', :id => 1, :god => false}))
197
+ checkpoint.should_receive(:get).with("/callbacks/allowed/create/post.foo:testrealm").and_return(DeepStruct.wrap(:allowed => true))
198
+ Pebblebed::Connector.any_instance.stub(:checkpoint => checkpoint)
199
+ post '/create/post.foo:testrealm'
200
+ last_response.body.should == "You are creative"
201
+ end
202
+ end
203
+ end
204
+
157
205
  describe "error handling" do
158
206
  before(:each) { guest! }
159
207
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pebblebed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.43
4
+ version: 0.0.44
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -329,7 +329,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
329
329
  version: '0'
330
330
  segments:
331
331
  - 0
332
- hash: -4488871030272884545
332
+ hash: -110595815413794395
333
333
  required_rubygems_version: !ruby/object:Gem::Requirement
334
334
  none: false
335
335
  requirements:
@@ -338,7 +338,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
338
338
  version: '0'
339
339
  segments:
340
340
  - 0
341
- hash: -4488871030272884545
341
+ hash: -110595815413794395
342
342
  requirements: []
343
343
  rubyforge_project: pebblebed
344
344
  rubygems_version: 1.8.25