1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
<?php
/**
* Class representing SAML 2 EntitiesDescriptor element.
*
* @package simpleSAMLphp
* @version $Id$
*/
class SAML2_XML_md_EntitiesDescriptor extends SAML2_SignedElementHelper {
/**
* The ID of this element.
*
* @var string|NULL
*/
public $ID;
/**
* How long this element is valid, as a unix timestamp.
*
* @var int|NULL
*/
public $validUntil;
/**
* The length of time this element can be cached, as string.
*
* @var string|NULL
*/
public $cacheDuration;
/**
* The name of this entity collection.
*
* @var string|NULL
*/
public $Name;
/**
* Extensions on this element.
*
* Array of extension elements.
*
* @var array
*/
public $Extensions = array();
/**
* Child EntityDescriptor and EntitiesDescriptor elements.
*
* @var array
*/
public $children = array();
/**
* Initialize an EntitiesDescriptor.
*
* @param DOMElement|NULL $xml The XML element we should load.
*/
public function __construct(DOMElement $xml = NULL) {
parent::__construct($xml);
if ($xml === NULL) {
return;
}
if ($xml->hasAttribute('ID')) {
$this->ID = $xml->getAttribute('ID');
}
if ($xml->hasAttribute('validUntil')) {
$this->validUntil = SimpleSAML_Utilities::parseSAML2Time($xml->getAttribute('validUntil'));
}
if ($xml->hasAttribute('cacheDuration')) {
$this->cacheDuration = $xml->getAttribute('cacheDuration');
}
if ($xml->hasAttribute('Name')) {
$this->Name = $xml->getAttribute('Name');
}
$this->Extensions = SAML2_XML_md_Extensions::getList($xml);
foreach (SAML2_Utils::xpQuery($xml, './saml_metadata:EntityDescriptor|./saml_metadata:EntitiesDescriptor') as $node) {
if ($node->localName === 'EntityDescriptor') {
$this->children[] = new SAML2_XML_md_EntityDescriptor($node);
} else {
$this->children[] = new SAML2_XML_md_EntitiesDescriptor($node);
}
}
}
/**
* Convert this EntitiesDescriptor to XML.
*
* @param DOMElement|NULL $parent The EntitiesDescriptor we should append this EntitiesDescriptor to.
*/
public function toXML(DOMElement $parent = NULL) {
assert('is_null($this->ID) || is_string($this->ID)');
assert('is_null($this->validUntil) || is_int($this->validUntil)');
assert('is_null($this->cacheDuration) || is_string($this->cacheDuration)');
assert('is_null($this->Name) || is_string($this->Name)');
assert('is_array($this->Extensions)');
assert('is_array($this->children)');
if ($parent === NULL) {
$doc = new DOMDocument();
$e = $doc->createElementNS(SAML2_Const::NS_MD, 'md:EntitiesDescriptor');
$doc->appendChild($e);
} else {
$e = $parent->ownerDocument->createElementNS(SAML2_Const::NS_MD, 'md:EntitiesDescriptor');
$parent->appendChild($e);
}
if (isset($this->ID)) {
$e->setAttribute('ID', $this->ID);
}
if (isset($this->validUntil)) {
$e->setAttribute('validUntil', gmdate('Y-m-d\TH:i:s\Z', $this->validUntil));
}
if (isset($this->cacheDuration)) {
$e->setAttribute('cacheDuration', $this->cacheDuration);
}
if (isset($this->Name)) {
$e->setAttribute('Name', $this->Name);
}
SAML2_XML_md_Extensions::addList($e, $this->Extensions);
foreach ($this->children as $node) {
$node->toXML($e);
}
$this->signElement($e, $e->firstChild);
return $e;
}
}
|