/** * 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); } }