Skip to content

Commit

Permalink
Add toArray/fromArray to md:Organization
Browse files Browse the repository at this point in the history
  • Loading branch information
tvdijen committed May 16, 2023
1 parent 10ad29c commit 95b17cd
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 0 deletions.
100 changes: 100 additions & 0 deletions src/SAML2/XML/md/Organization.php
Expand Up @@ -4,6 +4,7 @@

namespace SimpleSAML\SAML2\XML\md;

use DOMDocument;
use DOMElement;
use Exception;
use SimpleSAML\Assert\Assert;
Expand All @@ -14,6 +15,9 @@
use SimpleSAML\XML\ExtendableAttributesTrait;
use SimpleSAML\XML\Utils as XMLUtils;

use function array_key_exists;
use function array_merge;

/**
* Class representing SAML 2 Organization element.
*
Expand Down Expand Up @@ -161,4 +165,100 @@ public function toXML(DOMElement $parent = null): DOMElement

return $e;
}


/**
* Create a class from an array
*
* @param array $data
* @return self
*/
public static function fromArray(array $data): static
{
$orgNames = [];
if (array_key_exists('OrganizationName', $data)) {
Assert::count($data['OrganizationName'], 1);
$orgNames[] = OrganizationName::fromArray($data['OrganizationName']);
}

$orgDisplayNames = [];
if (array_key_exists('OrganizationDisplayName', $data)) {
Assert::count($data['OrganizationDisplayName'], 1);
$orgDisplayNames[] = OrganizationDisplayName::fromArray($data['OrganizationDisplayName']);
}

$orgURLs = [];
if (array_key_exists('OrganizationURL', $data)) {
Assert::count($data['OrganizationURL'], 1);
$orgURLs[] = OrganizationURL::fromArray($data['OrganizationURL']);
}

$Extensions = $data['Extensions'] ?? null;

// Anything after this should be (namespaced) attributes
unset(
$data['OrganizationName'],
$data['OrganizationDisplayName'],
$data['OrganizationURL'],
$data['Extensions'],
);

$attributes = [];
foreach ($data as $ns => $attribute) {
$name = array_key_first($attribute);
$value = $attribute[$name];

$doc = new DOMDocument('1.0', 'UTF-8');
$elt = $doc->createElement("placeholder");
$elt->setAttributeNS($ns, $name, $value);

$attributes[] = $elt->getAttributeNode($name);
}

return new static(
$orgNames,
$orgDisplayNames,
$orgURLs,
$Extensions,
$attributes,
);
}


/**
* Create an array from this class
*
* @return array
*/
public function toArray(): array
{
$data = [
'OrganizationName' => [],
'OrganizationDisplayName' => [],
'OrganizationURL' => [],
'Extensions' => $this->getExtensions(),
];

foreach ($this->getOrganizationName() as $orgName) {
$data['OrganizationName'] = array_merge($data['OrganizationName'], $orgName->toArray());
}

foreach ($this->getOrganizationDisplayName() as $orgDisplayName) {
$data['OrganizationDisplayName'] = array_merge(
$data['OrganizationDisplayName'],
$orgDisplayName->toArray(),
);
}

foreach ($this->getOrganizationURL() as $orgURL) {
$data['OrganizationURL'] = array_merge($data['OrganizationURL'], $orgURL->toArray());
}

/** @psalm-suppress PossiblyNullReference */
foreach ($this->getAttributesNS() as $a) {
$data[$a['namespaceURI']] = [$a['qualifiedName'] => $a['value']];
}

return $data;
}
}
10 changes: 10 additions & 0 deletions tests/SAML2/XML/md/OrganizationTest.php
Expand Up @@ -14,6 +14,7 @@
use SimpleSAML\XML\Chunk;
use SimpleSAML\XML\DOMDocumentFactory;
use SimpleSAML\XML\Exception\MissingElementException;
use SimpleSAML\XML\TestUtils\ArrayizableElementTestTrait;
use SimpleSAML\XML\TestUtils\SchemaValidationTestTrait;
use SimpleSAML\XML\TestUtils\SerializableElementTestTrait;

Expand All @@ -29,6 +30,7 @@
*/
final class OrganizationTest extends TestCase
{
use ArrayizableElementTestTrait;
use SchemaValidationTestTrait;
use SerializableElementTestTrait;

Expand All @@ -41,6 +43,14 @@ protected function setUp(): void

$this->testedClass = Organization::class;

$this->arrayRepresentation = [
'OrganizationName' => ['en' => 'SSP'],
'OrganizationDisplayName' => ['en' => 'SimpleSAMLphp'],
'OrganizationURL' => ['en' => 'https://simplesamlphp.org'],
'Extensions' => null,
'urn:test:something' => ['test:attr' => 'value'],
];

$this->xmlRepresentation = DOMDocumentFactory::fromFile(
dirname(__FILE__, 4) . '/resources/xml/md_Organization.xml',
);
Expand Down

0 comments on commit 95b17cd

Please sign in to comment.