def self.from_message(message, op_endpoint)
obj = self.allocate
obj.message = message
obj.namespace = message.get_openid_namespace()
obj.op_endpoint = op_endpoint
mode = message.get_arg(OPENID_NS, 'mode')
if mode == "checkid_immediate"
obj.immediate = true
obj.mode = "checkid_immediate"
else
obj.immediate = false
obj.mode = "checkid_setup"
end
obj.return_to = message.get_arg(OPENID_NS, 'return_to')
if obj.namespace == OPENID1_NS and !obj.return_to
msg = sprintf("Missing required field 'return_to' from %s",
message)
raise ProtocolError.new(message, msg)
end
obj.identity = message.get_arg(OPENID_NS, 'identity')
if obj.identity and message.is_openid2()
obj.claimed_id = message.get_arg(OPENID_NS, 'claimed_id')
if !obj.claimed_id
s = ("OpenID 2.0 message contained openid.identity but not " +
"claimed_id")
raise ProtocolError.new(message, s)
end
else
obj.claimed_id = nil
end
if !obj.identity and obj.namespace == OPENID1_NS
s = "OpenID 1 message did not contain openid.identity"
raise ProtocolError.new(message, s)
end
if obj.namespace == OPENID1_NS
obj.trust_root = message.get_arg(
OPENID_NS, 'trust_root', obj.return_to)
else
obj.trust_root = message.get_arg(
OPENID_NS, 'realm', obj.return_to)
if !obj.return_to and
!obj.trust_root
raise ProtocolError.new(message, "openid.realm required when " +
"openid.return_to absent")
end
end
obj.assoc_handle = message.get_arg(OPENID_NS, 'assoc_handle')
if obj.return_to and \
!TrustRoot::TrustRoot.parse(obj.return_to)
raise MalformedReturnURL.new(message, obj.return_to)
end
if !obj.trust_root_valid()
raise UntrustedReturnURL.new(message, obj.return_to, obj.trust_root)
end
return obj
end