480 lines
16 KiB
Ruby
480 lines
16 KiB
Ruby
require 'openid/extensions/sreg'
|
|
require 'openid/message'
|
|
require 'openid/server'
|
|
require 'test/unit'
|
|
|
|
module OpenID
|
|
module SReg
|
|
module SRegTest
|
|
SOME_DATA = {
|
|
'nickname'=>'linusaur',
|
|
'postcode'=>'12345',
|
|
'country'=>'US',
|
|
'gender'=>'M',
|
|
'fullname'=>'Leonhard Euler',
|
|
'email'=>'president@whitehouse.gov',
|
|
'dob'=>'0000-00-00',
|
|
'language'=>'en-us',
|
|
}
|
|
|
|
class SRegTest < Test::Unit::TestCase
|
|
|
|
def test_is11
|
|
assert_equal(NS_URI, NS_URI_1_1)
|
|
end
|
|
|
|
def test_check_field_name
|
|
DATA_FIELDS.keys.each{|field_name|
|
|
OpenID::check_sreg_field_name(field_name)
|
|
}
|
|
assert_raises(ArgumentError) { OpenID::check_sreg_field_name('invalid') }
|
|
assert_raises(ArgumentError) { OpenID::check_sreg_field_name(nil) }
|
|
end
|
|
|
|
def test_unsupported
|
|
endpoint = FakeEndpoint.new([])
|
|
assert(!OpenID::supports_sreg?(endpoint))
|
|
assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris)
|
|
end
|
|
|
|
def test_supported_1_1
|
|
endpoint = FakeEndpoint.new([NS_URI_1_1])
|
|
assert(OpenID::supports_sreg?(endpoint))
|
|
assert_equal([NS_URI_1_1], endpoint.checked_uris)
|
|
end
|
|
|
|
def test_supported_1_0
|
|
endpoint = FakeEndpoint.new([NS_URI_1_0])
|
|
assert(OpenID::supports_sreg?(endpoint))
|
|
assert_equal([NS_URI_1_1,NS_URI_1_0], endpoint.checked_uris)
|
|
end
|
|
|
|
end
|
|
|
|
class FakeEndpoint < Object
|
|
attr_accessor :checked_uris
|
|
def initialize(supported)
|
|
@supported = supported
|
|
@checked_uris = []
|
|
end
|
|
|
|
def uses_extension(namespace_uri)
|
|
@checked_uris << namespace_uri
|
|
return @supported.member?(namespace_uri)
|
|
end
|
|
end
|
|
|
|
class FakeMessage < Object
|
|
attr_accessor :namespaces
|
|
attr_accessor :openid1
|
|
def initialize
|
|
@openid1 = false
|
|
@namespaces = NamespaceMap.new
|
|
end
|
|
|
|
def is_openid1
|
|
return @openid1
|
|
end
|
|
|
|
end
|
|
|
|
class GetNSTest < Test::Unit::TestCase
|
|
def setup
|
|
@msg = FakeMessage.new
|
|
end
|
|
|
|
def test_openid2_empty
|
|
ns_uri = OpenID::get_sreg_ns(@msg)
|
|
assert_equal('sreg', @msg.namespaces.get_alias(ns_uri))
|
|
assert_equal(NS_URI, ns_uri)
|
|
end
|
|
|
|
def test_openid1_empty
|
|
@msg.openid1 = true
|
|
ns_uri = OpenID::get_sreg_ns(@msg)
|
|
assert_equal('sreg', @msg.namespaces.get_alias(ns_uri))
|
|
assert_equal(NS_URI, ns_uri)
|
|
end
|
|
|
|
def test_openid1defined_1_0
|
|
@msg.openid1 = true
|
|
@msg.namespaces.add(NS_URI_1_0)
|
|
ns_uri = OpenID::get_sreg_ns(@msg)
|
|
assert_equal(NS_URI_1_0, ns_uri)
|
|
end
|
|
|
|
def test_openid1_defined_1_0_override_alias
|
|
[true, false].each{|openid_version|
|
|
[NS_URI_1_0, NS_URI_1_1].each{|sreg_version|
|
|
['sreg', 'bogus'].each{|name|
|
|
setup
|
|
@msg.openid1 = openid_version
|
|
@msg.namespaces.add_alias(sreg_version, name)
|
|
ns_uri = OpenID::get_sreg_ns(@msg)
|
|
assert_equal(name, @msg.namespaces.get_alias(ns_uri))
|
|
assert_equal(sreg_version, ns_uri)
|
|
}
|
|
}
|
|
}
|
|
end
|
|
|
|
def test_openid1_defined_badly
|
|
@msg.openid1 = true
|
|
@msg.namespaces.add_alias('http://invalid/', 'sreg')
|
|
assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) }
|
|
end
|
|
|
|
def test_openid2_defined_badly
|
|
@msg.namespaces.add_alias('http://invalid/', 'sreg')
|
|
assert_raises(NamespaceError) { OpenID::get_sreg_ns(@msg) }
|
|
end
|
|
|
|
def test_openid2_defined_1_0
|
|
@msg.namespaces.add(NS_URI_1_0)
|
|
ns_uri = OpenID::get_sreg_ns(@msg)
|
|
assert_equal(NS_URI_1_0, ns_uri)
|
|
end
|
|
|
|
def test_openid1_sreg_ns_from_args
|
|
args = {
|
|
'sreg.optional'=> 'nickname',
|
|
'sreg.required'=> 'dob',
|
|
}
|
|
|
|
m = Message.from_openid_args(args)
|
|
|
|
assert_equal('nickname', m.get_arg(NS_URI_1_1, 'optional'))
|
|
assert_equal('dob', m.get_arg(NS_URI_1_1, 'required'))
|
|
end
|
|
|
|
end
|
|
|
|
class SRegRequestTest < Test::Unit::TestCase
|
|
def test_construct_empty
|
|
req = Request.new
|
|
assert_equal([], req.optional)
|
|
assert_equal([], req.required)
|
|
assert_equal(nil, req.policy_url)
|
|
assert_equal(NS_URI, req.ns_uri)
|
|
end
|
|
|
|
def test_construct_fields
|
|
req = Request.new(['nickname'],['gender'],'http://policy', 'http://sreg.ns_uri')
|
|
assert_equal(['gender'], req.optional)
|
|
assert_equal(['nickname'], req.required)
|
|
assert_equal('http://policy', req.policy_url)
|
|
assert_equal('http://sreg.ns_uri', req.ns_uri)
|
|
end
|
|
|
|
def test_construct_bad_fields
|
|
assert_raises(ArgumentError) {Request.new(['elvis'])}
|
|
end
|
|
|
|
def test_from_openid_request_message_copied
|
|
message = Message.from_openid_args({"sreg.required" => "nickname"})
|
|
openid_req = Server::OpenIDRequest.new
|
|
openid_req.message = message
|
|
sreg_req = Request.from_openid_request(openid_req)
|
|
# check that the message is copied by looking at sreg namespace
|
|
assert_equal(NS_URI_1_1, message.namespaces.get_namespace_uri('sreg'))
|
|
assert_equal(NS_URI, sreg_req.ns_uri)
|
|
assert_equal(['nickname'], sreg_req.required)
|
|
end
|
|
|
|
def test_from_openid_request_ns_1_0
|
|
message = Message.from_openid_args({'ns.sreg' => NS_URI_1_0,
|
|
"sreg.required" => "nickname"})
|
|
openid_req = Server::OpenIDRequest.new
|
|
openid_req.message = message
|
|
sreg_req = Request.from_openid_request(openid_req)
|
|
assert_equal(NS_URI_1_0, sreg_req.ns_uri)
|
|
assert_equal(['nickname'], sreg_req.required)
|
|
end
|
|
|
|
def test_from_openid_request_no_sreg
|
|
message = Message.new
|
|
openid_req = Server::OpenIDRequest.new
|
|
openid_req.message = message
|
|
sreg_req = Request.from_openid_request(openid_req)
|
|
assert(sreg_req.nil?)
|
|
end
|
|
|
|
def test_parse_extension_args_empty
|
|
req = Request.new
|
|
req.parse_extension_args({})
|
|
end
|
|
|
|
def test_parse_extension_args_extra_ignored
|
|
req = Request.new
|
|
req.parse_extension_args({'extra' => 'stuff'})
|
|
end
|
|
|
|
def test_parse_extension_args_non_strict
|
|
req = Request.new
|
|
req.parse_extension_args({'required' => 'stuff'})
|
|
assert_equal([], req.required)
|
|
end
|
|
|
|
def test_parse_extension_args_strict
|
|
req = Request.new
|
|
assert_raises(ArgumentError) {
|
|
req.parse_extension_args({'required' => 'stuff'}, true)
|
|
}
|
|
end
|
|
|
|
def test_parse_extension_args_policy
|
|
req = Request.new
|
|
req.parse_extension_args({'policy_url' => 'http://policy'}, true)
|
|
assert_equal('http://policy', req.policy_url)
|
|
end
|
|
|
|
def test_parse_extension_args_required_empty
|
|
req = Request.new
|
|
req.parse_extension_args({'required' => ''}, true)
|
|
assert_equal([], req.required)
|
|
end
|
|
|
|
def test_parse_extension_args_optional_empty
|
|
req = Request.new
|
|
req.parse_extension_args({'optional' => ''},true)
|
|
assert_equal([], req.optional)
|
|
end
|
|
|
|
def test_parse_extension_args_optional_single
|
|
req = Request.new
|
|
req.parse_extension_args({'optional' => 'nickname'},true)
|
|
assert_equal(['nickname'], req.optional)
|
|
end
|
|
|
|
def test_parse_extension_args_optional_list
|
|
req = Request.new
|
|
req.parse_extension_args({'optional' => 'nickname,email'},true)
|
|
assert_equal(['nickname','email'], req.optional)
|
|
end
|
|
|
|
def test_parse_extension_args_optional_list_bad_nonstrict
|
|
req = Request.new
|
|
req.parse_extension_args({'optional' => 'nickname,email,beer'})
|
|
assert_equal(['nickname','email'], req.optional)
|
|
end
|
|
|
|
def test_parse_extension_args_optional_list_bad_strict
|
|
req = Request.new
|
|
assert_raises(ArgumentError) {
|
|
req.parse_extension_args({'optional' => 'nickname,email,beer'}, true)
|
|
}
|
|
end
|
|
|
|
def test_parse_extension_args_both_nonstrict
|
|
req = Request.new
|
|
req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'})
|
|
assert_equal(['nickname'], req.required)
|
|
assert_equal([], req.optional)
|
|
end
|
|
|
|
def test_parse_extension_args_both_strict
|
|
req = Request.new
|
|
assert_raises(ArgumentError) {
|
|
req.parse_extension_args({'optional' => 'nickname', 'required' => 'nickname'},true)
|
|
}
|
|
end
|
|
|
|
def test_parse_extension_args_both_list
|
|
req = Request.new
|
|
req.parse_extension_args({'optional' => 'nickname,email', 'required' => 'country,postcode'},true)
|
|
assert_equal(['nickname','email'], req.optional)
|
|
assert_equal(['country','postcode'], req.required)
|
|
end
|
|
|
|
def test_all_requested_fields
|
|
req = Request.new
|
|
assert_equal([], req.all_requested_fields)
|
|
req.request_field('nickname')
|
|
assert_equal(['nickname'], req.all_requested_fields)
|
|
req.request_field('gender', true)
|
|
requested = req.all_requested_fields.sort
|
|
assert_equal(['gender', 'nickname'], requested)
|
|
end
|
|
|
|
def test_were_fields_requested
|
|
req = Request.new
|
|
assert(!req.were_fields_requested?)
|
|
req.request_field('nickname')
|
|
assert(req.were_fields_requested?)
|
|
end
|
|
|
|
def test_member
|
|
req = Request.new
|
|
DATA_FIELDS.keys.each {|f|
|
|
assert(!req.member?(f))
|
|
}
|
|
assert(!req.member?('something else'))
|
|
req.request_field('nickname')
|
|
DATA_FIELDS.keys.each {|f|
|
|
assert_equal(f == 'nickname',req.member?(f))
|
|
}
|
|
end
|
|
|
|
def test_request_field_bogus
|
|
req = Request.new
|
|
fields = DATA_FIELDS.keys
|
|
fields.each {|f| req.request_field(f) }
|
|
assert_equal(fields, req.optional)
|
|
assert_equal([], req.required)
|
|
|
|
# By default, adding the same fields over again has no effect
|
|
fields.each {|f| req.request_field(f) }
|
|
assert_equal(fields, req.optional)
|
|
assert_equal([], req.required)
|
|
|
|
# Requesting a field as required overrides requesting it as optional
|
|
expected = fields[1..-1]
|
|
overridden = fields[0]
|
|
req.request_field(overridden, true)
|
|
assert_equal(expected, req.optional)
|
|
assert_equal([overridden], req.required)
|
|
|
|
fields.each {|f| req.request_field(f, true) }
|
|
assert_equal(fields, req.required)
|
|
assert_equal([], req.optional)
|
|
end
|
|
|
|
def test_request_fields_type
|
|
req = Request.new
|
|
assert_raises(ArgumentError) { req.request_fields('nickname') }
|
|
end
|
|
|
|
def test_request_fields
|
|
req = Request.new
|
|
fields = DATA_FIELDS.keys
|
|
|
|
req.request_fields(fields)
|
|
assert_equal(fields, req.optional)
|
|
assert_equal([], req.required)
|
|
|
|
# By default, adding the same fields over again has no effect
|
|
req.request_fields(fields)
|
|
assert_equal(fields, req.optional)
|
|
assert_equal([], req.required)
|
|
|
|
# required overrides optional
|
|
expected = fields[1..-1]
|
|
overridden = fields[0]
|
|
req.request_fields([overridden], true)
|
|
assert_equal(expected, req.optional)
|
|
assert_equal([overridden], req.required)
|
|
|
|
req.request_fields(fields, true)
|
|
assert_equal(fields, req.required)
|
|
assert_equal([], req.optional)
|
|
|
|
# optional does not override required
|
|
req.request_fields(fields)
|
|
assert_equal(fields, req.required)
|
|
assert_equal([], req.optional)
|
|
end
|
|
|
|
def test_get_extension_args
|
|
req = Request.new
|
|
assert_equal({}, req.get_extension_args)
|
|
|
|
req.request_field('nickname')
|
|
assert_equal({'optional' => 'nickname'}, req.get_extension_args)
|
|
|
|
req.request_field('email')
|
|
assert_equal({'optional' => 'nickname,email'}, req.get_extension_args)
|
|
|
|
req.request_field('gender', true)
|
|
assert_equal({'optional' => 'nickname,email',
|
|
'required' => 'gender'}, req.get_extension_args)
|
|
|
|
req.request_field('dob', true)
|
|
assert_equal({'optional' => 'nickname,email',
|
|
'required' => 'gender,dob'}, req.get_extension_args)
|
|
|
|
req.policy_url = 'http://policy'
|
|
assert_equal({'optional' => 'nickname,email',
|
|
'required' => 'gender,dob',
|
|
'policy_url' => 'http://policy'},
|
|
req.get_extension_args)
|
|
|
|
end
|
|
end
|
|
|
|
class DummySuccessResponse
|
|
attr_accessor :message
|
|
def initialize(message, signed_stuff)
|
|
@message = message
|
|
@signed_stuff = signed_stuff
|
|
end
|
|
def get_signed_ns(ns_uri)
|
|
return @signed_stuff
|
|
end
|
|
end
|
|
|
|
|
|
class SRegResponseTest < Test::Unit::TestCase
|
|
def test_construct
|
|
resp = Response.new(SOME_DATA)
|
|
assert_equal(SOME_DATA, resp.get_extension_args)
|
|
assert_equal(NS_URI, resp.ns_uri)
|
|
resp2 = Response.new({}, "http://foo")
|
|
assert_equal({}, resp2.get_extension_args)
|
|
assert_equal('http://foo', resp2.ns_uri)
|
|
end
|
|
|
|
def test_from_success_response_signed
|
|
message = Message.from_openid_args({
|
|
'sreg.nickname'=>'The Mad Stork',
|
|
})
|
|
success_resp = DummySuccessResponse.new(message, {})
|
|
sreg_resp = Response.from_success_response(success_resp)
|
|
assert_equal({}, sreg_resp.get_extension_args)
|
|
end
|
|
|
|
def test_from_success_response_unsigned
|
|
message = Message.from_openid_args({
|
|
'ns.sreg' => NS_URI,
|
|
'sreg.nickname' => 'The Mad Stork',
|
|
})
|
|
success_resp = DummySuccessResponse.new(message, {})
|
|
sreg_resp = Response.from_success_response(success_resp, false)
|
|
assert_equal({'nickname' => 'The Mad Stork'},
|
|
sreg_resp.get_extension_args)
|
|
end
|
|
end
|
|
|
|
class SendFieldsTest < Test::Unit::TestCase
|
|
# class SendFieldsTest < Object
|
|
def test_send_fields
|
|
# create a request message with simple reg fields
|
|
sreg_req = Request.new(['nickname', 'email'], ['fullname'])
|
|
req_msg = Message.new
|
|
req_msg.update_args(NS_URI, sreg_req.get_extension_args)
|
|
req = Server::OpenIDRequest.new
|
|
req.message = req_msg
|
|
|
|
# -> checkid_* request
|
|
|
|
# create a response
|
|
resp_msg = Message.new
|
|
resp = Server::OpenIDResponse.new(req)
|
|
resp.fields = resp_msg
|
|
sreg_resp = Response.extract_response(sreg_req, SOME_DATA)
|
|
resp.add_extension(sreg_resp)
|
|
|
|
# <- id_res response
|
|
|
|
# extract sent fields
|
|
sreg_data_resp = resp_msg.get_args(NS_URI)
|
|
assert_equal({'nickname' => 'linusaur',
|
|
'email'=>'president@whitehouse.gov',
|
|
'fullname'=>'Leonhard Euler',
|
|
}, sreg_data_resp)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|