'', * 'SubCode' => '', * 'Message' => '', * ) * * Only the 'Code' field is required. The others will be set to NULL if they * aren't present. * * @package simpleSAMLphp * @version $Id$ */ abstract class SAML2_StatusResponse extends SAML2_Message { /** * The ID of the request this is a response to, or NULL if this is an unsolicited response. * * @var string|NULL */ private $inResponseTo; /** * The status code of the response. * * @var array */ private $status; /** * Constructor for SAML 2 response messages. * * @param string $tagName The tag name of the root element. * @param DOMElement|NULL $xml The input message. */ protected function __construct($tagName, DOMElement $xml = NULL) { parent::__construct($tagName, $xml); $this->status = array( 'Code' => SAML2_Const::STATUS_SUCCESS, 'SubCode' => NULL, 'Message' => NULL, ); if ($xml === NULL) { return; } if ($xml->hasAttribute('InResponseTo')) { $this->inResponseTo = $xml->getAttribute('InResponseTo'); } $status = SAML2_Utils::xpQuery($xml, './saml_protocol:Status'); if (empty($status)) { throw new Exception('Missing status code on response.'); } $status = $status[0]; $statusCode = SAML2_Utils::xpQuery($status, './saml_protocol:StatusCode'); if (empty($statusCode)) { throw new Exception('Missing status code in status element.'); } $statusCode = $statusCode[0]; $this->status['Code'] = $statusCode->getAttribute('Value'); $subCode = SAML2_Utils::xpQuery($statusCode, './saml_protocol:StatusCode'); if (!empty($subCode)) { $this->status['SubCode'] = $subCode[0]->getAttribute('Value'); } $message = SAML2_Utils::xpQuery($status, './saml_protocol:StatusMessage'); if (!empty($message)) { $this->status['Message'] = trim($message[0]->textContent); } } /** * Determine whether this is a successful response. * * @return boolean TRUE if the status code is success, FALSE if not. */ public function isSuccess() { assert('array_key_exists("Code", $this->status)'); if ($this->status['Code'] === SAML2_Const::STATUS_SUCCESS) { return TRUE; } return FALSE; } /** * Retrieve the ID of the request this is a response to. * * @return string|NULL The ID of the request. */ public function getInResponseTo() { return $this->inResponseTo; } /** * Set the ID of the request this is a response to. * * @param string|NULL $inResponseTo The ID of the request. */ public function setInResponseTo($inResponseTo) { assert('is_string($inResponseTo) || is_null($inResponseTo)'); $this->inResponseTo = $inResponseTo; } /** * Retrieve the status code. * * @return array The status code. */ public function getStatus() { return $this->status; } /** * Set the status code. * * @param array $status The status code. */ public function setStatus(array $status) { assert('array_key_exists("Code", $status)'); $this->status = $status; if (!array_key_exists('SubCode', $status)) { $this->status['SubCode'] = NULL; } if (!array_key_exists('Message', $status)) { $this->status['Message'] = NULL; } } /** * Convert status response message to an XML element. * * @return DOMElement This status response. */ public function toUnsignedXML() { $root = parent::toUnsignedXML(); if ($this->inResponseTo !== NULL) { $root->setAttribute('InResponseTo', $this->inResponseTo); } $status = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'Status'); $root->appendChild($status); $statusCode = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'StatusCode'); $statusCode->setAttribute('Value', $this->status['Code']); $status->appendChild($statusCode); if (!is_null($this->status['SubCode'])) { $subStatusCode = $this->document->createElementNS(SAML2_Const::NS_SAMLP, 'StatusCode'); $subStatusCode->setAttribute('Value', $this->status['SubCode']); $statusCode->appendChild($subStatusCode); } if (!is_null($this->status['Message'])) { SAML2_Utils::addString($status, SAML2_Const::NS_SAMLP, 'StatusMessage', $this->status['Message']); } return $root; } } ?>