static function fromMessage($message, $server = null)
{
if ($message->isOpenID1()) {
$session_type = $message->getArg(Auth_OpenID_OPENID_NS, 'session_type');
if ($session_type == 'no-encryption') {
// oidutil.log('Received OpenID 1 request with a no-encryption '
// 'assocaition session type. Continuing anyway.')
} else {
if (!$session_type) {
$session_type = 'no-encryption';
}
}
} else {
$session_type = $message->getArg(Auth_OpenID_OPENID_NS, 'session_type');
if ($session_type === null) {
return new Auth_OpenID_ServerError($message, "session_type missing from request");
}
}
$session_class = Auth_OpenID::arrayGet(Auth_OpenID_AssociateRequest::getSessionClasses(), $session_type);
if ($session_class === null) {
return new Auth_OpenID_ServerError($message, "Unknown session type " . $session_type);
}
$session = call_user_func(array($session_class, 'fromMessage'), $message);
if (is_a($session, 'Auth_OpenID_ServerError')) {
return $session;
}
$assoc_type = $message->getArg(Auth_OpenID_OPENID_NS, 'assoc_type', 'HMAC-SHA1');
if (!in_array($assoc_type, $session->allowed_assoc_types)) {
$fmt = "Session type %s does not support association type %s";
return new Auth_OpenID_ServerError($message, sprintf($fmt, $session_type, $assoc_type));
}
$obj = new Auth_OpenID_AssociateRequest($session, $assoc_type);
$obj->message = $message;
$obj->namespace = $message->getOpenIDNamespace();
return $obj;
}