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

Commit db1d8f7

Browse files
committed
serialize to objects that can be stored as json
1 parent 7d8692e commit db1d8f7

4 files changed

Lines changed: 56 additions & 8 deletions

File tree

lib/openid/consumer.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
require "openid/message"
88
require "openid/yadis/discovery"
99
require "openid/store/nonce"
10+
require "openid/serializer"
1011

1112
module OpenID
1213
# OpenID support for Relying Parties (aka Consumers).
@@ -297,11 +298,17 @@ def complete(query, current_url)
297298
protected
298299

299300
def session_get(name)
300-
@session[session_key(name)]
301+
value = @session[session_key(name)]
302+
303+
if value.is_a?(Array) # new serialized format
304+
Serializer.deserialize(*value)
305+
else # deprecated object format
306+
value
307+
end
301308
end
302309

303310
def session_set(name, val)
304-
@session[session_key(name)] = val
311+
@session[session_key(name)] = Serializer.serialize(val)
305312
end
306313

307314
def session_key(suffix)

lib/openid/consumer/discovery.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,20 @@ def initialize
5555
@display_identifier = nil
5656
end
5757

58+
def serialize
59+
instance_variables.map { |v| [v.to_s, instance_variable_get(v)] }
60+
end
61+
62+
def self.deserialize(data)
63+
instance = new
64+
data.each { |k,v| instance.instance_variable_set(k,v) }
65+
instance
66+
end
67+
5868
def display_identifier
5969
return @display_identifier if @display_identifier
6070

61-
return @claimed_id if @claimed_id.nil?
71+
return @claimed_id if @claimed_id.nil?
6272

6373
begin
6474
parsed_identifier = URI.parse(@claimed_id)
@@ -376,7 +386,7 @@ def self.discover_yadis(uri)
376386
#
377387
# @param uri: normalized identity URL
378388
# @type uri: str
379-
#
389+
#
380390
# @return: (claimed_id, services)
381391
# @rtype: (str, list(OpenIDServiceEndpoint))
382392
#

lib/openid/serializer.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
module OpenID
2+
class Serializer
3+
SERIALIZABLE = {
4+
"OpenID::OpenIDServiceEndpoint" => [OpenID::OpenIDServiceEndpoint, 0],
5+
"OpenID::Consumer::DiscoveredServices" => [OpenID::Consumer::DiscoveredServices, 3]
6+
}
7+
8+
def self.serialize(instance)
9+
klass = instance.class.name
10+
raise "unable to serialize #{klass}" unless SERIALIZABLE[klass]
11+
[klass, instance.instance_variables.map { |v| [v.to_s, instance.instance_variable_get(v)] }]
12+
end
13+
14+
def self.deserialize(klass, data)
15+
klass, arguments = SERIALIZABLE[klass] || raise("unable to deserialize #{klass}")
16+
instance = klass.new(*Array.new(arguments))
17+
data.each { |k,v| instance.instance_variable_set(k,v) }
18+
instance
19+
end
20+
end
21+
end

test/test_consumer.rb

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,24 @@ module OpenID
66
class Consumer
77
module TestConsumer
88
class TestLastEndpoint < Test::Unit::TestCase
9+
def all_instance_variables(object)
10+
object.instance_variables.map { |v| [v.to_s, object.instance_variable_get(v)] }
11+
end
12+
913
def test_set_get
14+
stored = OpenID::OpenIDServiceEndpoint.new
15+
stored.server_url = "test"
1016
session = {}
17+
1118
consumer = Consumer.new(session, nil)
12-
consumer.send(:last_requested_endpoint=, :endpoint)
19+
consumer.send(:last_requested_endpoint=, stored)
20+
1321
ep = consumer.send(:last_requested_endpoint)
14-
assert_equal(:endpoint, ep)
22+
assert_equal(all_instance_variables(stored), all_instance_variables(ep))
23+
1524
ep = consumer.send(:last_requested_endpoint)
16-
assert_equal(:endpoint, ep)
25+
assert_equal(all_instance_variables(stored), all_instance_variables(ep))
26+
1727
consumer.send(:cleanup_last_requested_endpoint)
1828
ep = consumer.send(:last_requested_endpoint)
1929
assert_equal(nil, ep)
@@ -110,7 +120,7 @@ def call_begin_without_discovery
110120
result = consumer.begin_without_discovery(@service, @anonymous)
111121
assert(result.instance_of?(CheckIDRequest))
112122
assert_equal(@anonymous, result.anonymous)
113-
assert_equal(@service, consumer.send(:last_requested_endpoint))
123+
assert_equal(@service.claimed_id, consumer.send(:last_requested_endpoint).claimed_id)
114124
assert_equal(result.instance_variable_get(:@assoc), @assoc)
115125
return result
116126
end

0 commit comments

Comments
 (0)