openstackid/app/libs/openid/extensions/implementations/OpenIdAXExtension.php

176 lines
7.7 KiB
PHP

<?php
/**
* Created by JetBrains PhpStorm.
* User: smarcet
* Date: 10/16/13
* Time: 2:41 PM
* To change this template use File | Settings | File Templates.
*/
namespace openid\extensions\implementations;
use openid\extensions\OpenIdExtension;
use openid\OpenIdProtocol;
use openid\requests\contexts\RequestContext;
use openid\requests\OpenIdRequest;
use openid\responses\contexts\ResponseContext;
use openid\responses\OpenIdResponse;
use openid\services\Registry;
use openid\OpenIdMessage;
use openid\exceptions\InvalidOpenIdMessageException;
use openid\requests\contexts\PartialView;
class OpenIdAXRequest extends OpenIdRequest
{
private $attributes;
public function __construct(OpenIdMessage $message)
{
parent::__construct($message);
$this->attributes = array();
}
/**
* @return bool
* @throws InvalidOpenIdMessageException
*/
public function IsValid()
{
//check identifier
if (
isset($this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdProtocol::OpenIDProtocol_NS . "_" . OpenIdAXExtension::Prefix])
&& $this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdProtocol::OpenIDProtocol_NS . "_" . OpenIdAXExtension::Prefix] == OpenIdAXExtension::NamespaceUrl
) {
//check required fields
if (!isset($this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdAXExtension::Prefix . "_" . OpenIdAXExtension::Mode])
|| $this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdAXExtension::Prefix . "_" . OpenIdAXExtension::Mode] != OpenIdAXExtension::FetchRequest
)
throw new InvalidOpenIdMessageException("AX: not set or invalid mode mode");
if (!isset($this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdAXExtension::Prefix . "_" . OpenIdAXExtension::RequiredAttributes]))
throw new InvalidOpenIdMessageException("AX: not set required attributes!");
$attributes = $this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdAXExtension::Prefix . "_" . OpenIdAXExtension::RequiredAttributes];
$attributes = explode(",", $attributes);
foreach ($attributes as $attr) {
$attr = trim($attr);
if (!isset(OpenIdAXExtension::$available_properties[$attr]))
//throw new InvalidOpenIdMessageException(sprintf("AX: invalid attribute requested %s", $attr));
continue;
if (!isset($this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdAXExtension::Prefix . "_" . OpenIdAXExtension::Type . "_" . $attr]))
throw new InvalidOpenIdMessageException(sprintf("AX: invalid ns for attribute %s", $attr));
$ns = $this->message[OpenIdProtocol::OpenIdPrefix . "_" . OpenIdAXExtension::Prefix . "_" . OpenIdAXExtension::Type . "_" . $attr];
if ($ns != OpenIdAXExtension::$available_properties[$attr])
throw new InvalidOpenIdMessageException(sprintf("AX: invalid ns for attribute %s", $attr));
array_push($this->attributes, $attr);
}
return true;
}
return false;
}
public function getRequiredAttributes()
{
return $this->attributes;
}
}
class OpenIdAXExtension extends OpenIdExtension
{
public static $available_properties;
const Prefix = "ax";
const NamespaceUrl = "http://openid.net/srv/ax/1.0";
const RequiredAttributes = "required";
const Mode = "mode";
const Country = "country";
const Email = "email";
const FirstMame = "firstname";
const Language = "language";
const LastName = "lastname";
const Type = "type";
const Value = "value";
const FetchResponse = "fetch_response";
const FetchRequest = "fetch_request";
public function __construct($name, $namespace, $description)
{
parent::__construct($name, $namespace, $description);
self::$available_properties[OpenIdAXExtension::Country] = "http://axschema.org/contact/country/home";
self::$available_properties[OpenIdAXExtension::Email] = "http://axschema.org/contact/email";
self::$available_properties[OpenIdAXExtension::FirstMame] = "http://axschema.org/namePerson/first";
self::$available_properties[OpenIdAXExtension::LastName] = "http://axschema.org/namePerson/last";
self::$available_properties[OpenIdAXExtension::Language] = "http://axschema.org/pref/language";
}
public function parseRequest(OpenIdRequest $request, RequestContext $context)
{
$ax_request = new OpenIdAXRequest($request->getMessage());
if (!$ax_request->IsValid()) return;
$attributes = $ax_request->getRequiredAttributes();
$data = array();
foreach($attributes as $attr){
array_push($data,$attr);
}
$partial_view = new PartialView("extensions.ax",array("attributes"=>$data));
$context->addPartialView($partial_view);
}
public function prepareResponse(OpenIdRequest $request, OpenIdResponse $response, ResponseContext $context)
{
$ax_request = new OpenIdAXRequest($request->getMessage());
if (!$ax_request->IsValid()) return;
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . OpenIdProtocol::OpenIDProtocol_NS . "." . self::Prefix, self::NamespaceUrl);
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Mode, self::FetchResponse);
$context->addSignParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Mode);
$attributes = $ax_request->getRequiredAttributes();
$auth_service = Registry::getInstance()->get("openid\\services\\IAuthService");
$user = $auth_service->getCurrentUser();
foreach ($attributes as $attr) {
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Type . "." . $attr, self::$available_properties[$attr]);
$context->addSignParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Type . "." . $attr);
$context->addSignParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Value . "." . $attr);
if ($attr == "email") {
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Value . "." . $attr, $user->getEmail());
}
if ($attr == "country") {
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Value . "." . $attr, $user->getCountry());
}
if ($attr == "firstname") {
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Value . "." . $attr, $user->getFirstName());
}
if ($attr == "lastname") {
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Value . "." . $attr, $user->getLastName());
}
if ($attr == "language") {
$response->addParam(OpenIdProtocol::OpenIdPrefix . "." . self::Prefix . "." . self::Value . "." . $attr, $user->getLanguage());
}
}
}
public function verifyRequest(OpenIdRequest $request,ResponseContext $context){
$ax_request = new OpenIdAXRequest($request->getMessage());
if (!$ax_request->IsValid()) return;
}
public function getTrustedData(OpenIdRequest $request){
$data = array();
$ax_request = new OpenIdAXRequest($request->getMessage());
if ($ax_request->IsValid()){
$attributes = $ax_request->getRequiredAttributes();
foreach($attributes as $attr){
array_push($data,$attr);
}
}
return $data;
}
}