warden 1.1.1 → 1.2.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/History.rdoc +4 -0
- data/README.textile +3 -6
- data/lib/warden.rb +4 -2
- data/lib/warden/manager.rb +14 -5
- data/lib/warden/mixins/common.rb +1 -0
- data/lib/warden/proxy.rb +7 -1
- data/lib/warden/session_serializer.rb +7 -3
- data/lib/warden/test/warden_helpers.rb +14 -0
- data/lib/warden/version.rb +1 -1
- data/spec/warden/proxy_spec.rb +26 -1
- data/spec/warden/scoped_session_serializer.rb +123 -0
- data/spec/warden/test/helpers_spec.rb +5 -0
- data/spec/warden/test/test_mode_spec.rb +9 -0
- data/warden.gemspec +1 -1
- metadata +31 -54
- data/Gemfile.lock +0 -32
- data/TODO.textile +0 -2
data/History.rdoc
CHANGED
data/README.textile
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
Please see the "Warden Wiki":http://wiki.github.com/hassox/warden for overview documentation.
|
2
2
|
|
3
|
-
h2.
|
4
|
-
|
5
|
-
I'm going to try and keep a list of all the contributors to this project. If I've missed your name please just let me know and I'll update it.
|
3
|
+
h2. Maintainers
|
6
4
|
|
7
5
|
* Daniel Neighman (hassox)
|
8
|
-
* Mick Staugaard (staugaard)
|
9
6
|
* José Valim (josevalim)
|
10
|
-
|
11
|
-
|
7
|
+
|
8
|
+
"A list of all contributors is available on Github.":https://github.com/hassox/warden/contributors
|
data/lib/warden.rb
CHANGED
@@ -33,8 +33,10 @@ module Warden
|
|
33
33
|
unless Warden::Test::WardenHelpers === Warden
|
34
34
|
Warden.extend Warden::Test::WardenHelpers
|
35
35
|
Warden::Manager.on_request do |proxy|
|
36
|
-
|
37
|
-
blk.
|
36
|
+
unless proxy.asset_request?
|
37
|
+
while blk = Warden._on_next_request.shift
|
38
|
+
blk.call(proxy)
|
39
|
+
end
|
38
40
|
end
|
39
41
|
end
|
40
42
|
end
|
data/lib/warden/manager.rb
CHANGED
@@ -59,23 +59,32 @@ module Warden
|
|
59
59
|
# Generally however complex object should not be stored in the session.
|
60
60
|
# If possible store only a "key" of the user object that will allow you to reconstitute it.
|
61
61
|
#
|
62
|
+
# You can supply different methods of serialization for different scopes by passing a scope symbol
|
63
|
+
#
|
62
64
|
# Example:
|
63
65
|
# Warden::Manager.serialize_into_session{ |user| user.id }
|
66
|
+
# # With Scope:
|
67
|
+
# Warden::Manager.serialize_into_session(:admin) { |user| user.id }
|
64
68
|
#
|
65
69
|
# :api: public
|
66
|
-
def serialize_into_session(&block)
|
67
|
-
|
70
|
+
def serialize_into_session(scope = nil, &block)
|
71
|
+
method_name = scope.nil? ? :serialize : "#{scope}_serialize"
|
72
|
+
Warden::SessionSerializer.send :define_method, method_name, &block
|
68
73
|
end
|
69
74
|
|
70
75
|
# Reconstitues the user from the session.
|
71
76
|
# Use the results of user_session_key to reconstitue the user from the session on requests after the initial login
|
77
|
+
# You can supply different methods of de-serialization for different scopes by passing a scope symbol
|
72
78
|
#
|
73
79
|
# Example:
|
74
80
|
# Warden::Manager.serialize_from_session{ |id| User.get(id) }
|
81
|
+
# # With Scope:
|
82
|
+
# Warden::Manager.serialize_from_session(:admin) { |id| AdminUser.get(id) }
|
75
83
|
#
|
76
84
|
# :api: public
|
77
|
-
def serialize_from_session(&block)
|
78
|
-
|
85
|
+
def serialize_from_session(scope = nil, &block)
|
86
|
+
method_name = scope.nil? ? :deserialize : "#{scope}_deserialize"
|
87
|
+
Warden::SessionSerializer.send :define_method, method_name, &block
|
79
88
|
end
|
80
89
|
end
|
81
90
|
|
@@ -85,7 +94,7 @@ module Warden
|
|
85
94
|
config[:intercept_401] && !env['warden'].custom_failure?
|
86
95
|
end
|
87
96
|
|
88
|
-
# When a request is
|
97
|
+
# When a request is unauthenticated, here's where the processing occurs.
|
89
98
|
# It looks at the result of the proxy to see if it's been executed and what action to take.
|
90
99
|
# :api: private
|
91
100
|
def process_unauthenticated(env, options={})
|
data/lib/warden/mixins/common.rb
CHANGED
data/lib/warden/proxy.rb
CHANGED
@@ -268,12 +268,18 @@ module Warden
|
|
268
268
|
@custom_failure = true
|
269
269
|
end
|
270
270
|
|
271
|
-
# Check to see if the custom
|
271
|
+
# Check to see if the custom failure flag has been set
|
272
272
|
# :api: public
|
273
273
|
def custom_failure?
|
274
274
|
!!@custom_failure
|
275
275
|
end
|
276
276
|
|
277
|
+
# Check to see if this is an asset request
|
278
|
+
# :api: public
|
279
|
+
def asset_request?
|
280
|
+
::Warden::asset_paths.any? { |r| env['PATH_INFO'].to_s.match(r) }
|
281
|
+
end
|
282
|
+
|
277
283
|
def inspect(*args)
|
278
284
|
"Warden::Proxy:#{object_id} @config=#{@config.inspect}"
|
279
285
|
end
|
@@ -22,13 +22,17 @@ module Warden
|
|
22
22
|
|
23
23
|
def store(user, scope)
|
24
24
|
return unless user
|
25
|
-
|
25
|
+
method_name = "#{scope}_serialize"
|
26
|
+
specialized = respond_to?(method_name)
|
27
|
+
session[key_for(scope)] = specialized ? send(method_name, user) : serialize(user)
|
26
28
|
end
|
27
29
|
|
28
30
|
def fetch(scope)
|
29
31
|
key = session[key_for(scope)]
|
30
32
|
return nil unless key
|
31
|
-
|
33
|
+
|
34
|
+
method_name = "#{scope}_deserialize"
|
35
|
+
user = respond_to?(method_name) ? send(method_name, key) : deserialize(key)
|
32
36
|
delete(scope) unless user
|
33
37
|
user
|
34
38
|
end
|
@@ -41,4 +45,4 @@ module Warden
|
|
41
45
|
session.delete(key_for(scope))
|
42
46
|
end
|
43
47
|
end # SessionSerializer
|
44
|
-
end # Warden
|
48
|
+
end # Warden
|
@@ -4,6 +4,20 @@ module Warden
|
|
4
4
|
|
5
5
|
module Test
|
6
6
|
module WardenHelpers
|
7
|
+
# Returns list of regex objects that match paths expected to be an asset
|
8
|
+
# @see Warden::Proxy#asset_request?
|
9
|
+
# @api public
|
10
|
+
def asset_paths
|
11
|
+
@asset_paths ||= [/^\/assets\//]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Sets list of regex objects that match paths expected to be an asset
|
15
|
+
# @see Warden::Proxy#asset_request?
|
16
|
+
# @api public
|
17
|
+
def asset_paths=(*vals)
|
18
|
+
@asset_paths = vals
|
19
|
+
end
|
20
|
+
|
7
21
|
# Adds a block to be executed on the next request when the stack reaches warden.
|
8
22
|
# The warden proxy is yielded to the block
|
9
23
|
# @api public
|
data/lib/warden/version.rb
CHANGED
data/spec/warden/proxy_spec.rb
CHANGED
@@ -956,4 +956,29 @@ describe "dynamic default_strategies" do
|
|
956
956
|
session['warden.user.baz.key'].should == "User"
|
957
957
|
end
|
958
958
|
end
|
959
|
-
|
959
|
+
|
960
|
+
describe "#asset_request?" do
|
961
|
+
before(:each) do
|
962
|
+
@asset_regex = /^\/assets\//
|
963
|
+
::Warden.asset_paths = @asset_regex
|
964
|
+
end
|
965
|
+
|
966
|
+
it "should return true if PATH_INFO is in asset list" do
|
967
|
+
env = env_with_params('/assets/fun.gif')
|
968
|
+
setup_rack(success_app).call(env)
|
969
|
+
proxy = env["warden"]
|
970
|
+
|
971
|
+
proxy.env['PATH_INFO'].should match(@asset_regex)
|
972
|
+
proxy.should be_asset_request
|
973
|
+
end
|
974
|
+
|
975
|
+
it "should return false if PATH_INFO is not in asset list" do
|
976
|
+
env = env_with_params('/home')
|
977
|
+
setup_rack(success_app).call(env)
|
978
|
+
proxy = env["warden"]
|
979
|
+
|
980
|
+
proxy.env['PATH_INFO'].should_not match(@asset_regex)
|
981
|
+
proxy.should_not be_asset_request
|
982
|
+
end
|
983
|
+
end
|
984
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Warden::Manager do
|
5
|
+
before(:each) do
|
6
|
+
@env = env_with_params
|
7
|
+
@env['rack.session'] ||= {}
|
8
|
+
Warden::Manager.serialize_from_session { |k| k }
|
9
|
+
Warden::Manager.serialize_into_session { |u| u }
|
10
|
+
begin
|
11
|
+
Warden::SessionSerializer.send :remove_method, :admin_serialize
|
12
|
+
rescue
|
13
|
+
end
|
14
|
+
begin
|
15
|
+
Warden::SessionSerializer.send :remove_method, :admin_deserialize
|
16
|
+
rescue
|
17
|
+
end
|
18
|
+
end
|
19
|
+
after(:each) do
|
20
|
+
Warden::Manager.serialize_from_session { |k| k }
|
21
|
+
Warden::Manager.serialize_into_session { |u| u }
|
22
|
+
begin
|
23
|
+
Warden::SessionSerializer.send :remove_method, :admin_deserialize
|
24
|
+
Warden::SessionSerializer.send :remove_method, :admin_serialize
|
25
|
+
rescue
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def serializer_respond_to?(name)
|
30
|
+
Warden::SessionSerializer.new(@env).respond_to? name
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should respond to :serialize" do
|
34
|
+
serializer_respond_to?(:serialize).should == true
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should respond to :deserialize" do
|
38
|
+
serializer_respond_to?(:deserialize).should == true
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should respond to {scope}_deserialize if Manager.serialize_from_session is called with scope" do
|
42
|
+
Rack::Builder.new do
|
43
|
+
Warden::Manager.serialize_from_session ( :admin ) { |n| n }
|
44
|
+
end
|
45
|
+
serializer_respond_to?(:admin_deserialize).should == true
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should respond to {scope}_serialize if Manager.serialize_into_session is called with scope" do
|
49
|
+
Rack::Builder.new do
|
50
|
+
Warden::Manager.serialize_into_session(:admin) { |n| n }
|
51
|
+
end
|
52
|
+
serializer_respond_to?(:admin_serialize).should == true
|
53
|
+
end
|
54
|
+
|
55
|
+
def initialize_with_scope(scope, &block)
|
56
|
+
Rack::Builder.new do
|
57
|
+
Warden::Manager.serialize_into_session(scope, &block)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should execute serialize if no {scope}_serialize is present" do
|
62
|
+
serialized_object = nil
|
63
|
+
initialize_with_scope(nil) do |user|
|
64
|
+
serialized_object = user
|
65
|
+
user
|
66
|
+
end
|
67
|
+
serializer = Warden::SessionSerializer.new(@env)
|
68
|
+
serializer.store("user", :admin)
|
69
|
+
serialized_object.should == "user"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should not have a {scope}_serialize by default" do
|
73
|
+
serializer_respond_to?(:admin_serialize).should == false
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should execute {scope}_serialize when calling store with a scope" do
|
77
|
+
serialized_object = nil
|
78
|
+
initialize_with_scope(:admin) do |user|
|
79
|
+
serialized_object = user
|
80
|
+
user
|
81
|
+
end
|
82
|
+
|
83
|
+
serializer = Warden::SessionSerializer.new(@env)
|
84
|
+
serializer.store("user", :admin)
|
85
|
+
serialized_object.should == "user"
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
it "should execute {scope}_deserialize when calling store with a scope" do
|
90
|
+
serialized_object = nil
|
91
|
+
|
92
|
+
Rack::Builder.new do
|
93
|
+
Warden::Manager.serialize_from_session(:admin) do |key|
|
94
|
+
serialized_object = key
|
95
|
+
key
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
serializer = Warden::SessionSerializer.new(@env)
|
100
|
+
@env['rack.session'][serializer.key_for(:admin)] = "test"
|
101
|
+
serializer.fetch(:admin)
|
102
|
+
|
103
|
+
serialized_object.should == "test"
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should execute deserialize if {scope}_deserialize is not present" do
|
107
|
+
serialized_object = nil
|
108
|
+
|
109
|
+
Rack::Builder.new do
|
110
|
+
Warden::Manager.serialize_from_session do |key|
|
111
|
+
serialized_object = key
|
112
|
+
key
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
serializer = Warden::SessionSerializer.new(@env)
|
117
|
+
@env['rack.session'][serializer.key_for(:admin)] = "test"
|
118
|
+
serializer.fetch(:admin)
|
119
|
+
|
120
|
+
serialized_object.should == "test"
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
@@ -64,4 +64,13 @@ describe Warden::Test::WardenHelpers do
|
|
64
64
|
app.call(env_with_params)
|
65
65
|
$captures.should == []
|
66
66
|
end
|
67
|
+
|
68
|
+
context "asset requests" do
|
69
|
+
it "should not execute on_next_request blocks if this is an asset request" do
|
70
|
+
app = setup_rack(@app)
|
71
|
+
Warden.on_next_request{|w| $captures << :first }
|
72
|
+
app.call(env_with_params("/assets/fun.gif"))
|
73
|
+
$captures.should == []
|
74
|
+
end
|
75
|
+
end
|
67
76
|
end
|
data/warden.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
"LICENSE",
|
13
13
|
"README.textile"
|
14
14
|
]
|
15
|
-
s.files = Dir["**/*"] - Dir["*.gem"]
|
15
|
+
s.files = Dir["**/*"] - Dir["*.gem"] - ["Gemfile.lock"]
|
16
16
|
s.homepage = %q{http://github.com/hassox/warden}
|
17
17
|
s.rdoc_options = ["--charset=UTF-8"]
|
18
18
|
s.require_paths = ["lib"]
|
metadata
CHANGED
@@ -1,50 +1,36 @@
|
|
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
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 1
|
9
|
-
- 1
|
10
|
-
version: 1.1.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Daniel Neighman
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-07-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: rack
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2156244180 !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 0
|
33
|
-
version: "1.0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.0'
|
34
22
|
type: :runtime
|
35
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2156244180
|
36
25
|
description:
|
37
26
|
email: has.sox@gmail.com
|
38
27
|
executables: []
|
39
|
-
|
40
28
|
extensions: []
|
41
|
-
|
42
|
-
extra_rdoc_files:
|
29
|
+
extra_rdoc_files:
|
43
30
|
- LICENSE
|
44
31
|
- README.textile
|
45
|
-
files:
|
32
|
+
files:
|
46
33
|
- Gemfile
|
47
|
-
- Gemfile.lock
|
48
34
|
- History.rdoc
|
49
35
|
- lib/warden/config.rb
|
50
36
|
- lib/warden/errors.rb
|
@@ -76,46 +62,37 @@ files:
|
|
76
62
|
- spec/warden/hooks_spec.rb
|
77
63
|
- spec/warden/manager_spec.rb
|
78
64
|
- spec/warden/proxy_spec.rb
|
65
|
+
- spec/warden/scoped_session_serializer.rb
|
79
66
|
- spec/warden/session_serializer_spec.rb
|
80
67
|
- spec/warden/strategies/base_spec.rb
|
81
68
|
- spec/warden/strategies_spec.rb
|
82
69
|
- spec/warden/test/helpers_spec.rb
|
83
70
|
- spec/warden/test/test_mode_spec.rb
|
84
|
-
- TODO.textile
|
85
71
|
- warden.gemspec
|
86
|
-
has_rdoc: true
|
87
72
|
homepage: http://github.com/hassox/warden
|
88
73
|
licenses: []
|
89
|
-
|
90
74
|
post_install_message:
|
91
|
-
rdoc_options:
|
75
|
+
rdoc_options:
|
92
76
|
- --charset=UTF-8
|
93
|
-
require_paths:
|
77
|
+
require_paths:
|
94
78
|
- lib
|
95
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
80
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
|
102
|
-
- 0
|
103
|
-
version: "0"
|
104
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
86
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
segments:
|
111
|
-
- 0
|
112
|
-
version: "0"
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
113
91
|
requirements: []
|
114
|
-
|
115
92
|
rubyforge_project: warden
|
116
|
-
rubygems_version: 1.
|
93
|
+
rubygems_version: 1.8.15
|
117
94
|
signing_key:
|
118
95
|
specification_version: 3
|
119
96
|
summary: Rack middleware that provides authentication for rack applications
|
120
97
|
test_files: []
|
121
|
-
|
98
|
+
has_rdoc:
|
data/Gemfile.lock
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
warden (1.1.1)
|
5
|
-
rack (>= 1.0)
|
6
|
-
|
7
|
-
GEM
|
8
|
-
remote: http://rubygems.org/
|
9
|
-
specs:
|
10
|
-
diff-lcs (1.1.2)
|
11
|
-
rack (1.3.0)
|
12
|
-
rack-test (0.6.0)
|
13
|
-
rack (>= 1.0)
|
14
|
-
rake (0.8.7)
|
15
|
-
rspec (2.5.0)
|
16
|
-
rspec-core (~> 2.5.0)
|
17
|
-
rspec-expectations (~> 2.5.0)
|
18
|
-
rspec-mocks (~> 2.5.0)
|
19
|
-
rspec-core (2.5.1)
|
20
|
-
rspec-expectations (2.5.0)
|
21
|
-
diff-lcs (~> 1.1.2)
|
22
|
-
rspec-mocks (2.5.0)
|
23
|
-
|
24
|
-
PLATFORMS
|
25
|
-
ruby
|
26
|
-
|
27
|
-
DEPENDENCIES
|
28
|
-
rack (= 1.3)
|
29
|
-
rack-test
|
30
|
-
rake
|
31
|
-
rspec (~> 2)
|
32
|
-
warden!
|
data/TODO.textile
DELETED