Skip to content
This repository was archived by the owner on Jul 24, 2023. It is now read-only.

Commit 98aaa02

Browse files
committed
Merge pull request #79 from tsukasaoishi/json_session
Objects change to Hash object before storing into session.
2 parents 377e6a8 + daea30c commit 98aaa02

5 files changed

Lines changed: 94 additions & 8 deletions

File tree

lib/openid/consumer.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require "openid/consumer/checkid_request.rb"
33
require "openid/consumer/associationmanager.rb"
44
require "openid/consumer/responses.rb"
5+
require "openid/consumer/session"
56
require "openid/consumer/discovery_manager"
67
require "openid/consumer/discovery"
78
require "openid/message"
@@ -189,7 +190,8 @@ class Consumer
189190
#
190191
# store: an object that implements the interface in Store.
191192
def initialize(session, store)
192-
@session = session
193+
@origin_session = session
194+
@session = Session.new(session, OpenID::OpenIDServiceEndpoint)
193195
@store = store
194196
@session_key_prefix = 'OpenID::Consumer::'
195197
end
@@ -321,7 +323,7 @@ def cleanup_last_requested_endpoint
321323
end
322324

323325
def discovery_manager(openid_identifier)
324-
DiscoveryManager.new(@session, openid_identifier, @session_key_prefix)
326+
DiscoveryManager.new(@origin_session, openid_identifier, @session_key_prefix)
325327
end
326328

327329
def cleanup_session

lib/openid/consumer/discovery.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,24 @@ def get_local_id
136136
end
137137
end
138138

139+
def to_session_value
140+
Hash[*(instance_variables.map{|name| [name, instance_variable_get(name)] }.flatten(1))]
141+
end
142+
143+
def ==(other)
144+
to_session_value == other.to_session_value
145+
end
146+
147+
def self.from_session_value(value)
148+
return value unless value.is_a?(Hash)
149+
150+
self.new.tap do |endpoint|
151+
value.each do |name, val|
152+
endpoint.instance_variable_set(name, val)
153+
end
154+
end
155+
end
156+
139157
def self.from_basic_service_endpoint(endpoint)
140158
# Create a new instance of this class from the endpoint object
141159
# passed in.

lib/openid/consumer/discovery_manager.rb

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,33 @@ def started?
2828
def empty?
2929
@services.empty?
3030
end
31+
32+
def to_session_value
33+
services = @services.map{|s| s.respond_to?(:to_session_value) ? s.to_session_value : s }
34+
current_val = @current.respond_to?(:to_session_value) ? @current.to_session_value : @current
35+
36+
{
37+
'starting_url' => @starting_url,
38+
'yadis_url' => @yadis_url,
39+
'services' => services,
40+
'current' => current_val
41+
}
42+
end
43+
44+
def ==(other)
45+
to_session_value == other.to_session_value
46+
end
47+
48+
def self.from_session_value(value)
49+
return value unless value.is_a?(Hash)
50+
51+
services = value['services'].map{|s| OpenID::OpenIDServiceEndpoint.from_session_value(s) }
52+
current = OpenID::OpenIDServiceEndpoint.from_session_value(value['current'])
53+
54+
obj = self.new(value['starting_url'], value['yadis_url'], services)
55+
obj.instance_variable_set("@current", current)
56+
obj
57+
end
3158
end
3259

3360
# Manages calling discovery and tracking which endpoints have
@@ -36,7 +63,7 @@ class DiscoveryManager
3663
def initialize(session, url, session_key_suffix=nil)
3764
@url = url
3865

39-
@session = session
66+
@session = OpenID::Consumer::Session.new(session, DiscoveredServices)
4067
@session_key_suffix = session_key_suffix || 'auth'
4168
end
4269

lib/openid/consumer/session.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module OpenID
2+
class Consumer
3+
class Session
4+
def initialize(session, decode_klass = nil)
5+
@session = session
6+
@decode_klass = decode_klass
7+
end
8+
9+
def [](key)
10+
val = @session[key]
11+
@decode_klass ? @decode_klass.from_session_value(val) : val
12+
end
13+
14+
def []=(key, val)
15+
@session[key] = to_session_value(val)
16+
end
17+
18+
def keys
19+
@session.keys
20+
end
21+
22+
private
23+
24+
def to_session_value(val)
25+
case val
26+
when Array
27+
val.map{|ele| to_session_value(ele) }
28+
when Hash
29+
Hash[*(val.map{|k,v| [k, to_session_value(v)] }.flatten(1))]
30+
else
31+
val.respond_to?(:to_session_value) ? val.to_session_value : val
32+
end
33+
end
34+
end
35+
end
36+
end

test/test_discovery_manager.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,12 @@ def method_missing(m, *args)
6666

6767
class TestDiscoveryManager < Test::Unit::TestCase
6868
def setup
69-
@session = {}
69+
session = {}
70+
@session = OpenID::Consumer::Session.new(session, OpenID::Consumer::DiscoveredServices)
7071
@url = "http://unittest.com/"
7172
@key_suffix = "testing"
7273
@yadis_url = "http://unittest.com/xrds"
73-
@manager = PassthroughDiscoveryManager.new(@session, @url, @key_suffix)
74+
@manager = PassthroughDiscoveryManager.new(session, @url, @key_suffix)
7475
@key = @manager.session_key
7576
end
7677

@@ -100,7 +101,8 @@ def test_get_next_service
100101
# services in @disco.
101102
assert_equal(@manager.get_next_service, "two")
102103
assert_equal(@manager.get_next_service, "three")
103-
assert_equal(@session[@key], disco)
104+
disco = @session[@key]
105+
assert_equal(disco.current, "three")
104106

105107
# The manager is exhausted and should be deleted and a new one
106108
# should be created.
@@ -136,8 +138,8 @@ def test_cleanup
136138
assert_equal(@manager.cleanup, nil)
137139
assert_equal(@session[@key], nil)
138140

139-
@session[@key] = disco
140141
disco.next
142+
@session[@key] = disco
141143
assert_equal(@manager.cleanup, "one")
142144
assert_equal(@session[@key], nil)
143145

@@ -188,10 +190,11 @@ def test_create_manager
188190
returned_disco = @manager.create_manager(@yadis_url, services)
189191

190192
stored_disco = @session[@key]
193+
assert_equal(stored_disco, returned_disco)
194+
191195
assert(stored_disco.for_url?(@yadis_url))
192196
assert_equal(stored_disco.next, "created")
193197

194-
assert_equal(stored_disco, returned_disco)
195198

196199
# Calling create_manager with a preexisting manager should
197200
# result in StandardError.

0 commit comments

Comments
 (0)