Skip to content

Commit

Permalink
Add securitypolicy classes
Browse files Browse the repository at this point in the history
  • Loading branch information
tvdijen committed Dec 29, 2023
1 parent 062bdf0 commit 243c288
Show file tree
Hide file tree
Showing 16 changed files with 804 additions and 8 deletions.
185 changes: 185 additions & 0 deletions src/XML/sp/AbstractIssuedTokenType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
<?php

declare(strict_types=1);

namespace SimpleSAML\WSSecurity\XML\sp;

use DOMElement;
use SimpleSAML\Assert\Assert;
use SimpleSAML\XML\Chunk;
use SimpleSAML\XML\Exception\InvalidDOMElementException;
use SimpleSAML\XML\Exception\MissingElementException;
use SimpleSAML\XML\Exception\SchemaViolationException;
use SimpleSAML\XML\Exception\TooManyElementsException;
use SimpleSAML\XML\ExtendableAttributesTrait;
use SimpleSAML\XML\ExtendableElementTrait;
use SimpleSAML\XML\XsNamespace as NS;
use ValueError;

use function array_pop;
use function is_string;
use function sprintf;

/**
* Class representing WS security policy IssuedTokenType.
*
* @package tvdijen/ws-security
*/
abstract class AbstractIssuedTokenType extends AbstractSpElement
{
use ExtendableAttributesTrait;
use ExtendableElementTrait;
use IncludeTokenTypeTrait;

/** The namespace-attribute for the xs:any element */
public const XS_ANY_ELT_NAMESPACE = NS::OTHER;

/** The namespace-attribute for the xs:anyAttribute element */
public const XS_ANY_ATTR_NAMESPACE = NS::ANY;


/**
* IssuedTokenType constructor.
*
* @param \SimpleSAML\WSSecurity\XML\sp\RequestSecurityTokenTemplate
* @param \SimpleSAML\WSSecurity\XML\sp\Issuer|\SimpleSAML\WSSecurity\XML\sp\IssuerName|null $issuer
* @param \SimpleSAML\WSSecurity\XML\sp\IncludeToken|null $includeToken
* @param list<\SimpleSAML\XML\ElementInterface> $elts
* @param list<\SimpleSAML\XML\Attribute> $namespacedAttributes
*/
final public function __construct(
protected RequestSecurityTokenTemplate $requestSecurityTokenTemplate,
protected Issuer|IssuerName|null $issuer,
?IncludeToken $includeToken = null,
array $elts = [],
array $namespacedAttributes = []
) {
$this->setIncludeToken($includeToken);
$this->setElements($elts);
$this->setAttributesNS($namespacedAttributes);
}


/**
* Collect the value of the Issuer property.
*
* @return \SimpleSAML\WSSecurity\XML\sp\Issuer|\SimpleSAML\WSSecurity\XML\sp\IssuerName
*/
public function getIssuer(): Issuer|IssuerName
{
return $this->issuer;
}


/**
* Collect the value of the RequestSecurityTokenTemplate property.
*
* @return \SimpleSAML\WSSecurity\XML\sp\RequestSecurityTokenTemplate
*/
public function getRequestSecurityTokenTemplate(): RequestSecurityTokenTemplate
{
return $this->requestSecurityTokenTemplate;
}


/**
* Initialize an IssuedTokenType.
*
* Note: this method cannot be used when extending this class, if the constructor has a different signature.
*
* @param \DOMElement $xml The XML element we should load.
* @return static
*
* @throws \SimpleSAML\XML\Exception\InvalidDOMElementException
* if the qualified name of the supplied element is wrong
*/
public static function fromXML(DOMElement $xml): static
{
$qualifiedName = static::getClassName(static::class);
Assert::eq(
$xml->localName,
$qualifiedName,
sprintf('Unexpected name for IssuedTokenType: %s. Expected: %s.', $xml->localName, $qualifiedName),
InvalidDOMElementException::class
);

$issuer = Issuer::getChildrenOfClass($xml);
$issuerName = IssuerName::getChildrenOfClass($xml);
$issuer = array_merge($issuer, $issuerName);

$requestSecurityTokenTemplate = RequestSecurityTokenTemplate::getChildrenOfClass($xml);
Assert::minCount($requestSecurityTokenTemplate, 1, MissingElementException::class);
Assert::maxCount($requestSecurityTokenTemplate, 1, TooManyElementsException::class);

try {
$includeToken = IncludeToken::from(self::getOptionalAttribute($xml, 'IncludeToken', null));
} catch (ValueError) {
self::getOptionalAttribute($xml, 'IncludeToken', null);
}

$elements = [];
foreach ($xml->childNodes as $element) {
if ($element->namespaceURI === static::NS) {
continue;
} elseif (!($element instanceof DOMElement)) {
continue;
}

$elements[] = new Chunk($element);
}

$namespacedAttributes = self::getAttributesNSFromXML($xml);
foreach ($namespacedAttributes as $i => $attr) {
if ($attr->getNamespaceURI() === null) {
if ($attr->getAttrName() === 'IncludeToken') {
unset($namespacedAttributes[$i]);
break;
}
}
}


return new static(
$requestSecurityTokenTemplate[0],
array_pop($issuer),
$includeToken,
$elements,
$namespacedAttributes,
);
}


/**
* Convert this element to XML.
*
* @param \DOMElement|null $parent The element we should append this element to.
* @return \DOMElement
*/
public function toXML(DOMElement $parent = null): DOMElement
{
$e = $this->instantiateParentElement($parent);

if ($this->getIncludeToken() !== null) {
$e->setAttribute(
'IncludeToken',
is_string($this->getIncludeToken()) ? $this->getIncludeToken() : $this->getIncludeToken()->value,
);
}

if ($this->getIssuer() !== null) {
$this->getIssuer()->toXML($e);
}

$this->getRequestSecurityTokenTemplate()->toXML($e);

foreach ($this->getElements() as $elt) {
$elt->toXML($e);
}

foreach ($this->getAttributesNS() as $attr) {
$attr->toXML($e);
}

return $e;
}
}
154 changes: 154 additions & 0 deletions src/XML/sp/AbstractRequestSecurityTokenTemplateType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
<?php

declare(strict_types=1);

namespace SimpleSAML\WSSecurity\XML\sp;

use DOMElement;
use SimpleSAML\Assert\Assert;
use SimpleSAML\XML\Chunk;
use SimpleSAML\XML\Exception\InvalidDOMElementException;
use SimpleSAML\XML\Exception\SchemaViolationException;
use SimpleSAML\XML\ExtendableAttributesTrait;
use SimpleSAML\XML\ExtendableElementTrait;
use SimpleSAML\XML\XsNamespace as NS;

use function sprintf;

/**
* Class representing WS security policy RequestSecurityTokenTemplateType.
*
* @package tvdijen/ws-security
*/
abstract class AbstractRequestSecurityTokenTemplateType extends AbstractSpElement
{
use ExtendableAttributesTrait;
use ExtendableElementTrait;

/** The namespace-attribute for the xs:any element */
public const XS_ANY_ELT_NAMESPACE = NS::OTHER;

/** The namespace-attribute for the xs:anyAttribute element */
public const XS_ANY_ATTR_NAMESPACE = NS::ANY;


/**
* AbstractRequestSecurityTokenTemplateType constructor.
*
* @param string|null $trustVersion
* @param list<\SimpleSAML\XML\ElementInterface> $elts
* @param list<\SimpleSAML\XML\Attribute> $namespacedAttributes
*/
final public function __construct(
protected ?string $trustVersion = null,
array $elts = [],
array $namespacedAttributes = []
) {
Assert::nullOrValidURI($trustVersion);

$this->setElements($elts);
$this->setAttributesNS($namespacedAttributes);
}


/**
* Collect the value of the trustVersion property.
*
* @return string|null
*/
public function getTrustVersion(): ?string
{
return $this->trustVersion;
}


/**
* Test if an object, at the state it's in, would produce an empty XML-element
*
* @return bool
*/
public function isEmptyElement(): bool
{
return empty($this->trustVersion) && empty($this->elements) && empty($this->namespacedAttributes);
}


/**
* Initialize an RequestSecurityTokenTemplateType.
*
* Note: this method cannot be used when extending this class, if the constructor has a different signature.
*
* @param \DOMElement $xml The XML element we should load.
* @return static
*
* @throws \SimpleSAML\XML\Exception\InvalidDOMElementException
* if the qualified name of the supplied element is wrong
*/
public static function fromXML(DOMElement $xml): static
{
$qualifiedName = static::getClassName(static::class);
Assert::eq(
$xml->localName,
$qualifiedName,
sprintf(
'Unexpected name for RequestSecurityTokenTemplateType: %s. Expected: %s.',
$xml->localName,
$qualifiedName,
),
InvalidDOMElementException::class
);

$elements = [];
foreach ($xml->childNodes as $element) {
if ($element->namespaceURI === static::NS) {
continue;
} elseif (!($element instanceof DOMElement)) {
continue;
}

$elements[] = new Chunk($element);
}

$namespacedAttributes = self::getAttributesNSFromXML($xml);
foreach ($namespacedAttributes as $i => $attr) {
if ($attr->getNamespaceURI() === null) {
if ($attr->getAttrName() === 'TrustVersion') {
unset($namespacedAttributes[$i]);
break;
}
}
}

return new static(
self::getOptionalAttribute($xml, 'TrustVersion', null),
$elements,
$namespacedAttributes,
);
}


/**
* Convert this element to XML.
*
* @param \DOMElement|null $parent The element we should append this element to.
* @return \DOMElement
*/
public function toXML(DOMElement $parent = null): DOMElement
{
$e = $this->instantiateParentElement($parent);

if ($this->getTrustVersion() !== null) {
$e->setAttribute('TrustVersion', $this->getTrustVersion());
}

foreach ($this->getElements() as $elt) {
$elt->toXML($e);
}

foreach ($this->getAttributesNS() as $attr) {
$attr->toXML($e);
}

return $e;
}
}
12 changes: 6 additions & 6 deletions src/XML/sp/IncludeTokenTypeTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,17 @@ trait IncludeTokenTypeTrait
/**
* The included token.
*
* @var \SimpleSAML\WSSecurity\XML\sp\IncludeToken|string
* @var \SimpleSAML\WSSecurity\XML\sp\IncludeToken|string|null
*/
protected IncludeToken|string $includeToken;
protected IncludeToken|string|null $includeToken;


/**
* Collect the value of the includeToken-property
*
* @return \SimpleSAML\WSSecurity\XML\sp\IncludeToken|string
* @return \SimpleSAML\WSSecurity\XML\sp\IncludeToken|string|null
*/
public function getIncludeToken(): IncludeToken|string
public function getIncludeToken(): IncludeToken|string|null
{
return $this->includeToken;
}
Expand All @@ -38,9 +38,9 @@ public function getIncludeToken(): IncludeToken|string
/**
* Set the value of the includeToken-property
*
* @param \SimpleSAML\WSSecurity\XML\sp\IncludeToken|string $includeToken
* @param \SimpleSAML\WSSecurity\XML\sp\IncludeToken|string|null $includeToken
*/
protected function setIncludeToken(IncludeToken|string $includeToken): void
protected function setIncludeToken(IncludeToken|string|null $includeToken): void
{
if (is_string($includeToken)) {
Assert::validURI($includeToken);
Expand Down
16 changes: 16 additions & 0 deletions src/XML/sp/IssuedToken.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace SimpleSAML\WSSecurity\XML\sp;

use SimpleSAML\Assert\Assert;

/**
* An IssuedToken element
*
* @package tvdijen/ws-security
*/
final class IssuedToken extends AbstractIssuedTokenType
{
}
Loading

0 comments on commit 243c288

Please sign in to comment.