sinatra-authorize 0.0.1 → 0.0.2

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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sinatra-authorize (0.0.0)
4
+ sinatra-authorize (0.0.1)
5
5
  sinatra (>= 1.2)
6
6
 
7
7
  GEM
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Ole Petter Bang <olepbang@gmail.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ 'Software'), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -68,7 +68,7 @@ routes:
68
68
  end
69
69
 
70
70
  # Only run for authorized user requests, because of override rule
71
- get '/content/:id' :allow => :user do
71
+ get '/content/:id', :allow => :user do
72
72
  end
73
73
 
74
74
  # Only run for authorized admin requests, because of override rule
@@ -84,25 +84,5 @@ is evaluated using the default `:allow` rule, whereas the `/content/:id` and
84
84
 
85
85
  ### License
86
86
 
87
- (The MIT License)
88
-
89
- Copyright (c) 2011 Ole Petter Bang &lt;olepbang@gmail.com&gt;
90
-
91
- Permission is hereby granted, free of charge, to any person obtaining
92
- a copy of this software and associated documentation files (the
93
- 'Software'), to deal in the Software without restriction, including
94
- without limitation the rights to use, copy, modify, merge, publish,
95
- distribute, sublicense, and/or sell copies of the Software, and to
96
- permit persons to whom the Software is furnished to do so, subject to
97
- the following conditions:
98
-
99
- The above copyright notice and this permission notice shall be
100
- included in all copies or substantial portions of the Software.
101
-
102
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
103
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
104
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
105
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
106
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
107
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
108
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
87
+ sinatra-authorize is licensed under the MIT license. See LICENCE for further
88
+ details.
@@ -0,0 +1,10 @@
1
+ ### 0.0.2
2
+
3
+ * Setting `authorize` block is mandatory.
4
+ * Rules are evaluated in order of precedence.
5
+ * Access is determined by first determinate evaluation result,
6
+ or by default rule verb.
7
+
8
+ ### 0.0.1
9
+
10
+ Initial version.
@@ -1,5 +1,5 @@
1
1
  module Sinatra
2
2
  module Authorize
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -2,29 +2,31 @@ require 'sinatra/base'
2
2
 
3
3
  module Sinatra
4
4
  module Authorize
5
- class Condition < Proc; end
5
+ class Condition < Proc
6
+ attr_reader :rule
7
+ def initialize(rule, &block)
8
+ @rule = rule
9
+ super(&block)
10
+ end
11
+ end
6
12
 
7
13
  def authorize(opts = {}, &block)
8
14
  opts = {opts => []} if opts.is_a?(Symbol)
9
15
 
10
16
  if opts[:deny]
11
17
  args = *(opts[:deny])
12
- set(:authorize_default, Proc.new {
13
- authorize_condition(:deny, args)
14
- })
18
+ set :authorize_default, Proc.new { authorize_condition(:deny, args) }
15
19
  else
16
20
  args = *(opts[:allow] || [])
17
- set(:authorize_default, Proc.new {
18
- authorize_condition(:allow, args)
19
- })
21
+ set :authorize_default, Proc.new { authorize_condition(:allow, args) }
20
22
  end
21
23
 
22
24
  if block_given?
23
- define_method(:authorize_do_block, block)
24
- authorize_do = instance_method(:authorize_do_block)
25
- remove_method(:authorize_do_block)
25
+ define_method(:authorize_block, block)
26
+ authorize_block = instance_method(:authorize_block)
27
+ remove_method(:authorize_block)
26
28
 
27
- set :authorize_do, Proc.new { authorize_do }
29
+ set :authorize_block, Proc.new { authorize_block }
28
30
  end
29
31
  end
30
32
 
@@ -37,15 +39,13 @@ module Sinatra
37
39
  end
38
40
 
39
41
  def authorize_condition(rule, args)
40
- Condition.new { settings.authorize_do.bind(self).call(rule, args) }
42
+ Condition.new rule do
43
+ settings.authorize_block.bind(self).call(rule, args)
44
+ end
41
45
  end
42
46
 
43
47
  class << self
44
48
  def registered(app)
45
- app.authorize do |rule, args|
46
- raise "No authorize block is specified."
47
- end
48
-
49
49
  app.class_eval do
50
50
  alias :old_process_route :process_route
51
51
 
@@ -63,10 +63,16 @@ module Sinatra
63
63
  end
64
64
 
65
65
  def authorize_route(conditions)
66
- conditions = conditions.dup
67
- conditions.unshift(settings.authorize_default)
68
- conditions = conditions.collect { |cond| instance_eval(&cond) }
69
- conditions.select { |allow| allow == true || allow == false }.last
66
+ unless settings.respond_to? :authorize_block
67
+ raise "No authorize block is defined."
68
+ end
69
+
70
+ [settings.authorize_default, *conditions].reverse.each do |cond|
71
+ value = instance_eval(&cond)
72
+ return value if value == true || value == false
73
+ end
74
+
75
+ settings.authorize_default.rule == :allow
70
76
  end
71
77
  end
72
78
  end
@@ -1,148 +1,90 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
2
 
3
- shared_examples_for "when no default authorization is set" do
4
- it 'should allow route with allow all rule' do
5
- app.get('/', :allow => :all) {}
6
- get '/'
7
- last_response.status.should == 200
8
- end
9
-
10
- it 'should allow route with deny none rule' do
11
- app.get('/', :deny => :none) {}
12
- get '/'
13
- last_response.status.should == 200
14
- end
15
-
16
- it 'should deny route with deny all rule' do
17
- app.get('/', :deny => :all) {}
18
- get '/'
19
- last_response.status.should == 403
20
- end
21
-
22
- it 'should deny route with allow none rule' do
23
- app.get('/', :allow => :none) {}
24
- get '/'
25
- last_response.status.should == 403
26
- end
3
+ def set_and_get(route = '/', rules = {})
4
+ app.get(route, rules) {}
5
+ get route
27
6
  end
28
7
 
29
8
  describe Sinatra::Authorize do
30
-
31
- before :all do
32
- app.authorize do |rule, args|
33
- allow_default = lambda do |args|
34
- if args == [] || args == [:all]
35
- true
36
- elsif args == [:none]
37
- false
38
- else
39
- raise "Unknown authorization rule argument: #{args}."
40
- end
41
- end
42
-
43
- if rule == :allow
44
- allow_default.call(args)
45
- elsif rule == :deny
46
- !allow_default.call(args)
47
- else
48
- raise "Unknown authorization rule: #{rule}."
49
- end
50
- end
51
- end
52
-
53
- before do
9
+ before :each do
54
10
  app.reset!
11
+ if app.respond_to? :authorize_default
12
+ class << app; undef_method(:authorize_default); end
13
+ end
14
+ if app.respond_to? :authorize_block
15
+ class << app; undef_method(:authorize_block); end
16
+ end
55
17
  end
56
18
 
57
- it 'should allow routes by default' do
58
- app.get('/') {}
59
- get '/'
60
- last_response.status.should == 200
61
- end
62
-
63
- it_behaves_like "when no default authorization is set"
64
-
65
- context "#authorize :allow" do
66
- before do
67
- app.authorize :allow
19
+ context 'defining route' do
20
+ it 'should be possible to set allow rule' do
21
+ app.get '/', :allow => :all do end
68
22
  end
69
23
 
70
- it 'should allow routes by default' do
71
- app.get('/') {}
72
- get '/'
73
- last_response.status.should == 200
24
+ it 'should be possible to set deny rule' do
25
+ app.get '/', :deny => :all do end
74
26
  end
27
+ end
75
28
 
76
- it_behaves_like "when no default authorization is set"
77
-
78
- context ' => :all' do
79
- before do
80
- app.authorize :allow => :all
81
- end
82
-
83
- it 'should allow routes by default' do
84
- app.get('/') {}
85
- get '/'
86
- last_response.status.should == 200
87
- end
88
-
89
- it_behaves_like "when no default authorization is set"
29
+ context 'defining authorize block' do
30
+ it 'should be possible to define' do
31
+ app.authorize do |rule, args| end
90
32
  end
91
33
 
92
- context ' => :none' do
93
- before do
94
- app.authorize :allow => :none
95
- end
96
-
97
- it 'should deny routes by default' do
98
- app.get('/') {}
99
- get '/'
100
- last_response.status.should == 403
101
- end
34
+ it 'should be possible to set default rule' do
35
+ app.authorize :allow => :all do |rule, args| end
36
+ end
102
37
 
103
- it_behaves_like "when no default authorization is set"
38
+ it 'should use default rule :allow => [] when no rule is set' do
39
+ app.authorize do |rule, args| end
40
+ block = mock('authorize_block')
41
+ block.should_receive(:call).with(:allow, [])
42
+ app.authorize_block.should_receive(:bind).and_return(block)
43
+ set_and_get
104
44
  end
105
45
  end
106
46
 
107
- context '#authorize :deny' do
108
- before do
109
- app.authorize :deny
47
+ context 'authorize block not defined' do
48
+ it 'should raise exception when default rule is set' do
49
+ app.authorize :allow => :all
50
+ expect { set_and_get }.to raise_error(
51
+ RuntimeError, 'No authorize block is defined.')
110
52
  end
111
53
 
112
- it 'should deny routes by default' do
113
- app.get('/') {}
114
- get '/'
115
- last_response.status.should == 403
54
+ it 'should raise exception when route rule is set' do
55
+ expect { set_and_get '/', :allow => :all }.to raise_error(
56
+ RuntimeError, 'No authorize block is defined.')
116
57
  end
58
+ end
117
59
 
118
- it_behaves_like "when no default authorization is set"
119
-
120
- context ' => :all' do
121
- before do
122
- app.authorize :deny => :all
123
- end
124
-
125
- it 'should deny routes by default' do
126
- app.get('/') {}
127
- get '/'
128
- last_response.status.should == 403
129
- end
130
-
131
- it_behaves_like "when no default authorization is set"
60
+ context 'no determinate rule evaluation for route' do
61
+ it 'should allow access when default rule is allow rule' do
62
+ app.authorize :allow => :all do |rule, args| nil end
63
+ set_and_get.status.should == 200
132
64
  end
133
65
 
134
- context ' => :none' do
135
- before do
136
- app.authorize :deny => :none
137
- end
66
+ it 'should deny access when default rule is deny rule' do
67
+ app.authorize :deny => :all do |rule, args| nil end
68
+ set_and_get.status.should == 403
69
+ end
70
+ end
138
71
 
139
- it 'should allow routes by default' do
140
- app.get('/') {}
141
- get '/'
142
- last_response.status.should == 200
143
- end
72
+ context 'multiple rules defined' do
73
+ it 'should evaluate rules in order of precedence' do
74
+ app.authorize :allow => :all do |rule, args| end
75
+ block = mock('authorize_block')
76
+ block.should_receive(:call).with(:deny, [:all]).ordered
77
+ block.should_receive(:call).with(:allow, [:all]).ordered
78
+ app.authorize_block.should_receive(:bind).twice.and_return(block)
79
+ set_and_get '/', :deny => :all
80
+ end
144
81
 
145
- it_behaves_like "when no default authorization is set"
82
+ it 'should use first determinate evaluation result' do
83
+ app.authorize :allow => :all do |rule, args| end
84
+ block = mock('authorize_block')
85
+ block.should_receive(:call).with(:deny, [:all]).and_return(false)
86
+ app.authorize_block.should_receive(:bind).and_return(block)
87
+ set_and_get '/', :deny => :all
146
88
  end
147
89
  end
148
90
  end
@@ -11,6 +11,10 @@ module SpecHelper
11
11
  def app
12
12
  @app ||= Sinatra::Application
13
13
  end
14
+
15
+ def reset!
16
+ @app = nil
17
+ end
14
18
  end
15
19
 
16
20
  RSpec.configure do |config|
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ole Petter Bang
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-04-16 00:00:00 +02:00
17
+ date: 2011-05-21 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -105,10 +105,12 @@ files:
105
105
  - .rspec
106
106
  - Gemfile
107
107
  - Gemfile.lock
108
+ - LICENSE
109
+ - README.md
108
110
  - Rakefile
111
+ - history.md
109
112
  - lib/sinatra-authorize/version.rb
110
113
  - lib/sinatra/authorize.rb
111
- - readme.md
112
114
  - sinatra-authorize.gemspec
113
115
  - spec/sinatra/authorize_spec.rb
114
116
  - spec/spec_helper.rb