warden 1.2.0 → 1.2.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/History.rdoc +5 -0
- data/lib/warden/hooks.rb +28 -0
- data/lib/warden/proxy.rb +33 -11
- data/lib/warden/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/warden/hooks_spec.rb +28 -0
- data/spec/warden/proxy_spec.rb +44 -4
- data/spec/warden/test/helpers_spec.rb +0 -2
- data/warden.gemspec +0 -1
- metadata +52 -30
data/History.rdoc
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== Version 1.2.1 / 2012-06-16
|
2
|
+
* Minor caching and speed improvements
|
3
|
+
* Add support to #lock in the proxy
|
4
|
+
* Add support to after_failed_fetch callback
|
5
|
+
|
1
6
|
== Version 1.2.0 / 2012-05-08
|
2
7
|
* Deprecate warden_cookies since it was never functional
|
3
8
|
* Add support to serialize_from_session and serialize_into_session per scope
|
data/lib/warden/hooks.rb
CHANGED
@@ -117,6 +117,34 @@ module Warden
|
|
117
117
|
@_before_failure ||= []
|
118
118
|
end
|
119
119
|
|
120
|
+
# A callback that runs if no user could be fetched, meaning there is now no user logged in.
|
121
|
+
#
|
122
|
+
# Parameters:
|
123
|
+
# <options> Some options which specify when the callback should be executed
|
124
|
+
# scope - Executes the callback only if it maches the scope(s) given
|
125
|
+
# <block> A block to contain logic for the callback
|
126
|
+
# Block Parameters: |user, auth, scope|
|
127
|
+
# user - The authenticated user for the current scope
|
128
|
+
# auth - The warden proxy object
|
129
|
+
# opts - any options passed into the authenticate call including :scope
|
130
|
+
#
|
131
|
+
# Example:
|
132
|
+
# Warden::Manager.after_failed_fetch do |user, auth, opts|
|
133
|
+
# I18n.locale = :en
|
134
|
+
# end
|
135
|
+
#
|
136
|
+
# :api: public
|
137
|
+
def after_failed_fetch(options = {}, method = :push, &block)
|
138
|
+
raise BlockNotGiven unless block_given?
|
139
|
+
_after_failed_fetch.send(method, [block, options])
|
140
|
+
end
|
141
|
+
|
142
|
+
# Provides access to the callback array for after_failed_fetch
|
143
|
+
# :api: private
|
144
|
+
def _after_failed_fetch
|
145
|
+
@_after_failed_fetch ||= []
|
146
|
+
end
|
147
|
+
|
120
148
|
# A callback that runs just prior to the logout of each scope.
|
121
149
|
#
|
122
150
|
# Parameters:
|
data/lib/warden/proxy.rb
CHANGED
@@ -25,7 +25,7 @@ module Warden
|
|
25
25
|
def_delegators :config, :default_strategies
|
26
26
|
|
27
27
|
def initialize(env, manager) #:nodoc:
|
28
|
-
@env, @users, @winning_strategies = env, {}, {}
|
28
|
+
@env, @users, @winning_strategies, @locked = env, {}, {}, false
|
29
29
|
@manager, @config = manager, manager.config.dup
|
30
30
|
@strategies = Hash.new { |h,k| h[k] = {} }
|
31
31
|
manager._run_callbacks(:on_request, self)
|
@@ -45,9 +45,13 @@ module Warden
|
|
45
45
|
@session_serializer ||= Warden::SessionSerializer.new(@env)
|
46
46
|
end
|
47
47
|
|
48
|
-
# Clear the cache of performed strategies so far.
|
49
|
-
#
|
50
|
-
#
|
48
|
+
# Clear the cache of performed strategies so far. Warden runs each
|
49
|
+
# strategy just once during the request lifecycle. You can clear the
|
50
|
+
# strategies cache if you want to allow a strategy to be run more than
|
51
|
+
# once.
|
52
|
+
#
|
53
|
+
# This method has the same API as authenticate, allowing you to clear
|
54
|
+
# specific strategies for given scope:
|
51
55
|
#
|
52
56
|
# Parameters:
|
53
57
|
# args - a list of symbols (labels) that name the strategies to attempt
|
@@ -73,6 +77,16 @@ module Warden
|
|
73
77
|
end
|
74
78
|
end
|
75
79
|
|
80
|
+
# Locks the proxy so new users cannot authenticate during the
|
81
|
+
# request lifecycle. This is useful when the request cannot
|
82
|
+
# be verified (for example, using a CSRF verification token).
|
83
|
+
# Notice that already authenticated users are kept as so.
|
84
|
+
#
|
85
|
+
# :api: public
|
86
|
+
def lock!
|
87
|
+
@locked = true
|
88
|
+
end
|
89
|
+
|
76
90
|
# Run the authentiation strategies for the given strategies.
|
77
91
|
# If there is already a user logged in for a given scope, the strategies are not run
|
78
92
|
# This does not halt the flow of control and is a passive attempt to authenticate only
|
@@ -93,8 +107,8 @@ module Warden
|
|
93
107
|
|
94
108
|
# Same API as authenticated, but returns a boolean instead of a user.
|
95
109
|
# The difference between this method (authenticate?) and authenticated?
|
96
|
-
# is that the former will run strategies if the user has not yet been
|
97
|
-
# and the second relies on already performed ones.
|
110
|
+
# is that the former will run strategies if the user has not yet been
|
111
|
+
# authenticated, and the second relies on already performed ones.
|
98
112
|
# :api: public
|
99
113
|
def authenticate?(*args)
|
100
114
|
result = !!authenticate(*args)
|
@@ -192,10 +206,15 @@ module Warden
|
|
192
206
|
opts = argument.is_a?(Hash) ? argument : { :scope => argument }
|
193
207
|
scope = (opts[:scope] ||= @config.default_scope)
|
194
208
|
|
195
|
-
@users
|
196
|
-
|
197
|
-
|
198
|
-
|
209
|
+
if @users.has_key?(scope)
|
210
|
+
@users[scope]
|
211
|
+
else
|
212
|
+
unless user = session_serializer.fetch(scope)
|
213
|
+
run_callbacks = opts.fetch(:run_callbacks, true)
|
214
|
+
manager._run_callbacks(:after_failed_fetch, user, self, :scope => scope) if run_callbacks
|
215
|
+
end
|
216
|
+
|
217
|
+
@users[scope] = user ? set_user(user, opts.merge(:event => :fetch)) : nil
|
199
218
|
end
|
200
219
|
end
|
201
220
|
|
@@ -296,7 +315,7 @@ module Warden
|
|
296
315
|
|
297
316
|
# Look for an existing user in the session for this scope.
|
298
317
|
# If there was no user in the session. See if we can get one from the request.
|
299
|
-
return user, opts if user = user(scope)
|
318
|
+
return user, opts if user = user(opts.merge(:scope => scope))
|
300
319
|
_run_strategies_for(scope, args)
|
301
320
|
|
302
321
|
if winning_strategy && winning_strategy.user
|
@@ -319,6 +338,9 @@ module Warden
|
|
319
338
|
self.winning_strategy = @winning_strategies[scope]
|
320
339
|
return if winning_strategy && winning_strategy.halted?
|
321
340
|
|
341
|
+
# Do not run any strategy if locked
|
342
|
+
return if @locked
|
343
|
+
|
322
344
|
if args.empty?
|
323
345
|
defaults = @config[:default_strategies]
|
324
346
|
strategies = defaults[scope] || defaults[:_all]
|
data/lib/warden/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/warden/hooks_spec.rb
CHANGED
@@ -177,7 +177,35 @@ describe "standard authentication hooks" do
|
|
177
177
|
env['warden.spec.order'].should == [1,2,3]
|
178
178
|
end
|
179
179
|
end
|
180
|
+
end
|
181
|
+
|
182
|
+
|
183
|
+
describe "after_failed_fetch" do
|
184
|
+
before(:each) do
|
185
|
+
RAM = Warden::Manager unless defined?(RAM)
|
186
|
+
RAM._after_failed_fetch.clear
|
187
|
+
end
|
180
188
|
|
189
|
+
after(:each) do
|
190
|
+
RAM._after_failed_fetch.clear
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should not be called when user is fetched" do
|
194
|
+
RAM.after_failed_fetch{|u,a,o| fail }
|
195
|
+
env = env_with_params
|
196
|
+
setup_rack(lambda { |e| valid_response }).call(env)
|
197
|
+
env['rack.session']['warden.user.default.key'] = "Foo"
|
198
|
+
env['warden'].user.should == "Foo"
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should be called if fetched user is nil" do
|
202
|
+
calls = 0
|
203
|
+
RAM.after_failed_fetch{|u,a,o| calls += 1 }
|
204
|
+
env = env_with_params
|
205
|
+
setup_rack(lambda { |e| valid_response }).call(env)
|
206
|
+
env['warden'].user.should be_nil
|
207
|
+
calls.should == 1
|
208
|
+
end
|
181
209
|
end
|
182
210
|
|
183
211
|
describe "before_failure" do
|
data/spec/warden/proxy_spec.rb
CHANGED
@@ -377,7 +377,7 @@ describe Warden::Proxy do
|
|
377
377
|
|
378
378
|
it "should run the callbacks when :run_callbacks is true" do
|
379
379
|
app = lambda do |env|
|
380
|
-
env['warden'].manager.should_receive(:_run_callbacks)
|
380
|
+
env['warden'].manager.should_receive(:_run_callbacks).at_least(:once)
|
381
381
|
env['warden'].authenticate(:pass)
|
382
382
|
valid_response
|
383
383
|
end
|
@@ -386,7 +386,7 @@ describe Warden::Proxy do
|
|
386
386
|
|
387
387
|
it "should run the callbacks by default" do
|
388
388
|
app = lambda do |env|
|
389
|
-
env['warden'].manager.should_receive(:_run_callbacks)
|
389
|
+
env['warden'].manager.should_receive(:_run_callbacks).at_least(:once)
|
390
390
|
env['warden'].authenticate(:pass)
|
391
391
|
valid_response
|
392
392
|
end
|
@@ -394,6 +394,26 @@ describe Warden::Proxy do
|
|
394
394
|
end
|
395
395
|
end
|
396
396
|
|
397
|
+
describe "lock" do
|
398
|
+
it "should not run any strategy" do
|
399
|
+
app = lambda do |env|
|
400
|
+
env['warden'].lock!
|
401
|
+
env['warden'].authenticate(:pass)
|
402
|
+
env['warden'].user.should be_nil
|
403
|
+
valid_response
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
it "should keep already authenticated users" do
|
408
|
+
app = lambda do |env|
|
409
|
+
env['warden'].authenticate(:pass)
|
410
|
+
env['warden'].lock!
|
411
|
+
env['warden'].user.should be
|
412
|
+
valid_response
|
413
|
+
end
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
397
417
|
describe "get user" do
|
398
418
|
before(:each) do
|
399
419
|
@env['rack.session'] ||= {}
|
@@ -417,6 +437,16 @@ describe Warden::Proxy do
|
|
417
437
|
setup_rack(app).call(@env)
|
418
438
|
end
|
419
439
|
|
440
|
+
it "should cache unfound user" do
|
441
|
+
Warden::SessionSerializer.any_instance.should_receive(:fetch).once
|
442
|
+
app = lambda do |env|
|
443
|
+
env['warden'].user.should be_nil
|
444
|
+
env['warden'].user.should be_nil
|
445
|
+
valid_response
|
446
|
+
end
|
447
|
+
setup_rack(app).call(@env)
|
448
|
+
end
|
449
|
+
|
420
450
|
describe "previously logged in" do
|
421
451
|
before(:each) do
|
422
452
|
@env['rack.session']['warden.user.default.key'] = "A Previous User"
|
@@ -431,6 +461,16 @@ describe Warden::Proxy do
|
|
431
461
|
setup_rack(app).call(@env)
|
432
462
|
end
|
433
463
|
|
464
|
+
it "should cache found user" do
|
465
|
+
Warden::SessionSerializer.any_instance.should_receive(:fetch).once.and_return "A Previous User"
|
466
|
+
app = lambda do |env|
|
467
|
+
env['warden'].user.should == "A Previous User"
|
468
|
+
env['warden'].user.should == "A Previous User"
|
469
|
+
valid_response
|
470
|
+
end
|
471
|
+
setup_rack(app).call(@env)
|
472
|
+
end
|
473
|
+
|
434
474
|
it "should not run strategies when the user exists in the session" do
|
435
475
|
app = lambda do |env|
|
436
476
|
env['warden'].authenticate!(:pass)
|
@@ -452,7 +492,7 @@ describe Warden::Proxy do
|
|
452
492
|
|
453
493
|
it "should call run_callbacks when we pass a :run_callback => true" do
|
454
494
|
app = lambda do |env|
|
455
|
-
env['warden'].manager.should_receive(:_run_callbacks)
|
495
|
+
env['warden'].manager.should_receive(:_run_callbacks).at_least(:once)
|
456
496
|
env['warden'].user(:run_callbacks => true)
|
457
497
|
valid_response
|
458
498
|
end
|
@@ -461,7 +501,7 @@ describe Warden::Proxy do
|
|
461
501
|
|
462
502
|
it "should call run_callbacks by default" do
|
463
503
|
app = lambda do |env|
|
464
|
-
env['warden'].manager.should_receive(:_run_callbacks)
|
504
|
+
env['warden'].manager.should_receive(:_run_callbacks).at_least(:once)
|
465
505
|
env['warden'].user
|
466
506
|
valid_response
|
467
507
|
end
|
data/warden.gemspec
CHANGED
metadata
CHANGED
@@ -1,35 +1,48 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: warden
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 2
|
9
|
+
- 1
|
10
|
+
version: 1.2.1
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Daniel Neighman
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2012-06-16 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
15
22
|
name: rack
|
16
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
25
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 15
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
version: "1.0"
|
22
34
|
type: :runtime
|
23
|
-
|
24
|
-
version_requirements: *2156244180
|
35
|
+
version_requirements: *id001
|
25
36
|
description:
|
26
37
|
email: has.sox@gmail.com
|
27
38
|
executables: []
|
39
|
+
|
28
40
|
extensions: []
|
29
|
-
|
41
|
+
|
42
|
+
extra_rdoc_files:
|
30
43
|
- LICENSE
|
31
44
|
- README.textile
|
32
|
-
files:
|
45
|
+
files:
|
33
46
|
- Gemfile
|
34
47
|
- History.rdoc
|
35
48
|
- lib/warden/config.rb
|
@@ -69,30 +82,39 @@ files:
|
|
69
82
|
- spec/warden/test/helpers_spec.rb
|
70
83
|
- spec/warden/test/test_mode_spec.rb
|
71
84
|
- warden.gemspec
|
85
|
+
has_rdoc: true
|
72
86
|
homepage: http://github.com/hassox/warden
|
73
87
|
licenses: []
|
88
|
+
|
74
89
|
post_install_message:
|
75
|
-
rdoc_options:
|
90
|
+
rdoc_options:
|
76
91
|
- --charset=UTF-8
|
77
|
-
require_paths:
|
92
|
+
require_paths:
|
78
93
|
- lib
|
79
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
95
|
none: false
|
81
|
-
requirements:
|
82
|
-
- -
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
104
|
none: false
|
87
|
-
requirements:
|
88
|
-
- -
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
hash: 3
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
version: "0"
|
91
112
|
requirements: []
|
113
|
+
|
92
114
|
rubyforge_project: warden
|
93
|
-
rubygems_version: 1.
|
115
|
+
rubygems_version: 1.5.3
|
94
116
|
signing_key:
|
95
117
|
specification_version: 3
|
96
118
|
summary: Rack middleware that provides authentication for rack applications
|
97
119
|
test_files: []
|
98
|
-
|
120
|
+
|