Passed
Pull Request — master (#226)
by Jaime Pérez
02:37
created

LogoutResponse::fromXML()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 37
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 25
nc 2
nop 1
dl 0
loc 37
rs 9.52
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SAML2\XML\samlp;
6
7
use DOMElement;
8
use SAML2\XML\ds\Signature;
9
use SAML2\XML\saml\Issuer;
10
use SAML2\Utils;
11
use Webmozart\Assert\Assert;
12
13
/**
14
 * Class for SAML 2 LogoutResponse messages.
15
 *
16
 * @package SimpleSAMLphp
17
 */
18
class LogoutResponse extends AbstractStatusResponse
19
{
20
    /**
21
     * Convert XML into an LogoutResponse
22
     *
23
     * @param \DOMElement $xml
24
     * @return self
25
     * @throws \Exception
26
     */
27
    public static function fromXML(DOMElement $xml): object
28
    {
29
        Assert::same($xml->localName, 'LogoutResponse');
30
        Assert::same($xml->namespaceURI, LogoutResponse::NS);
31
        Assert::same('2.0', self::getAttribute($xml, 'Version'));
32
33
        $issueInstant = Utils::xsDateTimeToTimestamp(self::getAttribute($xml, 'IssueInstant'));
34
35
        $issuer = Issuer::getChildrenOfClass($xml);
36
        Assert::countBetween($issuer, 0, 1);
37
38
        $status = Status::getChildrenOfClass($xml);
39
        Assert::count($status, 1);
40
41
        $extensions = Extensions::getChildrenOfClass($xml);
42
        Assert::maxCount($extensions, 1, 'Only one saml:Extensions element is allowed.');
43
44
        $signature = Signature::getChildrenOfClass($xml);
45
        Assert::maxCount($signature, 1, 'Only one ds:Signature element is allowed.');
46
47
        $response = new self(
48
            array_pop($status),
49
            array_pop($issuer),
50
            self::getAttribute($xml, 'ID'),
51
            $issueInstant,
52
            self::getAttribute($xml, 'InResponseTo', null),
53
            self::getAttribute($xml, 'Destination', null),
54
            self::getAttribute($xml, 'Consent', null),
55
            empty($extensions) ? null : array_pop($extensions)
56
        );
57
58
        if (!empty($signature)) {
59
            $response->setSignature($signature[0]);
60
            $response->messageContainedSignatureUponConstruction = true;
61
        }
62
63
        return $response;
64
    }
65
}
66