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

LogoutResponse::fromXML()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 42
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 30
nc 2
nop 1
dl 0
loc 42
rs 9.44
c 0
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
32
        $id = self::getAttribute($xml, 'ID');
33
        $version = self::getAttribute($xml, 'Version');
34
        $issueInstant = Utils::xsDateTimeToTimestamp(self::getAttribute($xml, 'IssueInstant'));
35
        $inResponseTo = self::getAttribute($xml, 'InResponseTo', null);
36
        $destination = self::getAttribute($xml, 'Destination', null);
37
        $consent = self::getAttribute($xml, 'Consent', null);
38
39
        $issuer = Issuer::getChildrenOfClass($xml);
40
        Assert::countBetween($issuer, 0, 1);
41
42
        $status = Status::getChildrenOfClass($xml);
43
        Assert::count($status, 1);
44
45
        $extensions = Extensions::getChildrenOfClass($xml);
46
        Assert::maxCount($extensions, 1, 'Only one saml:Extensions element is allowed.');
47
48
        $signature = Signature::getChildrenOfClass($xml);
49
        Assert::maxCount($signature, 1, 'Only one ds:Signature element is allowed.');
50
51
        $response = new self(
52
            array_pop($status),
53
            empty($issuer) ? null : array_pop($issuer),
54
            $id,
55
            $version,
56
            $issueInstant,
57
            $inResponseTo,
58
            $destination,
59
            $consent,
60
            empty($extensions) ? null : array_pop($extensions)
61
        );
62
63
        if (!empty($signature)) {
64
            $response->setSignature($signature[0]);
65
            $response->messageContainedSignatureUponConstruction = true;
66
        }
67
68
        return $response;
69
    }
70
}
71