Skip to content
This repository was archived by the owner on Sep 19, 2022. It is now read-only.

Commit 1f8bd75

Browse files
author
Dominik Frantisek Bucik
committed
feat: 🎸 AuthProcFilter QualifyNameID
Adds configured qualifiers into NameID attribute
1 parent c763ad9 commit 1f8bd75

File tree

2 files changed

+129
-0
lines changed

2 files changed

+129
-0
lines changed

config-templates/processFilterConfigurations-example.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,3 +243,25 @@ Configuration options:
243243
'attribute_names' => ['aup', 'eppn', 'eduPersonTargetedID']
244244
],
245245
```
246+
247+
## QualifyNameID
248+
249+
Adds qualifiers into NameID based on the configuration
250+
251+
Configuration options:
252+
* `name_id_attribute`: Attribute (NameID) which should be qualified
253+
* `name_qualifier_attribute`: User attribute with value, which will be set as the NameQualifier part of the NameID. Leave empty to use static value configured via option `name_qualifier`.
254+
* `name_qualifier`: Static value which will be set as the NameQualifier part of the NameID.
255+
* `sp_name_qualifier_attribute`: User attribute with value, which will be set as the SPNameQualifier part of the NameID. Leave empty to use static value configured via option `sp_name_qualifier`.
256+
* `sp_name_qualifier`: Static value which will be set as the SPNameQualifier part of the NameID.
257+
258+
```php
259+
11 => [
260+
'class' => 'perun:QualifyNameID',
261+
'name_id_attribute' => 'eduPersonTargetedID',
262+
'name_qualifier_attribute' => 'SourceIdPEntityID',
263+
'name_qualifier' => 'https://login.cesnet.cz/idp/',
264+
'sp_name_qualifier_attribute' => 'ProxyEntityID',
265+
'sp_name_qualifier' => 'https://login.cesnet.cz/proxy/',
266+
],
267+
```

lib/Auth/Process/QualifyNameID.php

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SimpleSAML\Module\perun\Auth\Process;
6+
7+
use SAML2\XML\saml\NameID;
8+
use SimpleSAML\Auth\ProcessingFilter;
9+
use SimpleSAML\Configuration;
10+
use SimpleSAML\Error\Exception;
11+
use SimpleSAML\Logger;
12+
use SimpleSAML\Module\perun\PerunConstants;
13+
14+
/**
15+
* Adds qualifiers to the NameID object.
16+
*/
17+
class QualifyNameID extends ProcessingFilter
18+
{
19+
public const STAGE = 'perun:QualifyNameID';
20+
public const DEBUG_PREFIX = self::STAGE . ' - ';
21+
22+
public const NAME_ID_CLASS = 'SAML2\XML\saml\NameID';
23+
24+
public const NAME_ID_ATTRIBUTE = 'name_id_attribute';
25+
public const NAME_QUALIFIER = 'name_qualifier';
26+
public const NAME_QUALIFIER_ATTRIBUTE = 'name_qualifier_attribute';
27+
public const SP_NAME_QUALIFIER = 'sp_name_qualifier';
28+
public const SP_NAME_QUALIFIER_ATTRIBUTE = 'sp_name_qualifier_attribute';
29+
30+
private $targetedIdAttribute;
31+
private $nameQualifier;
32+
private $nameQualifierAttribute;
33+
private $spNameQualifier;
34+
private $spNameQualifierAttribute;
35+
private $filterConfig;
36+
37+
public function __construct($config, $reserved)
38+
{
39+
parent::__construct($config, $reserved);
40+
$filterConfig = Configuration::loadFromArray($config);
41+
42+
$this->targetedIdAttribute = $this->filterConfig->getString(self::NAME_ID_ATTRIBUTE, null);
43+
if (empty($this->targetedIdAttribute)) {
44+
throw new Exception(
45+
self::DEBUG_PREFIX . 'missing mandatory configuration for option \'' . self::NAME_ID_ATTRIBUTE . '\''
46+
);
47+
}
48+
49+
$this->nameQualifier = $this->filterConfig->getString(self::NAME_QUALIFIER, null);
50+
$this->nameQualifierAttribute = $this->filterConfig->getString(self::NAME_QUALIFIER_ATTRIBUTE, null);
51+
if (empty ($this->nameQualifier) && empty($this->nameQualifierAttribute)) {
52+
throw new Exception(
53+
self::DEBUG_PREFIX . 'missing mandatory configuration for option \''
54+
. self::NAME_QUALIFIER . '\' or \'' . self::NAME_QUALIFIER_ATTRIBUTE . '\', one must be configured.'
55+
);
56+
}
57+
58+
$this->spNameQualifier = $this->filterConfig->getString(self::SP_NAME_QUALIFIER, null);
59+
$this->spNameQualifierAttribute = $this->filterConfig->getString(self::SP_NAME_QUALIFIER_ATTRIBUTE, null);
60+
if (empty($this->spNameQualifier) && empty($this->spNameQualifierAttribute)) {
61+
throw new Exception(
62+
self::DEBUG_PREFIX . 'missing mandatory configuration for option \''
63+
. self::SP_NAME_QUALIFIER . '\' or \'' . self::SP_NAME_QUALIFIER_ATTRIBUTE . '\', one must be configured.'
64+
);
65+
}
66+
}
67+
68+
public function process(&$request)
69+
{
70+
assert(is_array($request));
71+
assert(!empty(PerunConstants::ATTRIBUTES));
72+
73+
if (!empty($request[PerunConstants::ATTRIBUTES][$this->targetedIdAttribute])) {
74+
$attributeValue = &$request[PerunConstants::ATTRIBUTES][$this->targetedIdAttribute][0];
75+
if (self::NAME_ID_CLASS === get_class($attributeValue)) {
76+
$nameQualifier = $request[PerunConstants::ATTRIBUTES][$this->nameQualifierAttribute][0] ?? $this->nameQualifier;
77+
if (empty($nameQualifier)) {
78+
throw new Exception(self::DEBUG_PREFIX . 'NameQualifier is not available');
79+
}
80+
$spNameQualifier = $request[PerunConstants::ATTRIBUTES][$this->spNameQualifierAttribute][0] ?? $this->spNameQualifier;
81+
if (empty($spNameQualifier)) {
82+
throw new Exception(self::DEBUG_PREFIX . 'SPNameQualifier is not available');
83+
}
84+
$this->qualify($attributeValue, $nameQualifier, $spNameQualifier);
85+
Logger::debug(
86+
self::DEBUG_PREFIX . 'Qualification done successfully for attribute \'' . $this->targetedIdAttribute
87+
. '\' (SPNameQualifier: ' . $spNameQualifier . ', NameQualifier: ' . $nameQualifier . ').'
88+
);
89+
} else {
90+
Logger::debug(
91+
self::DEBUG_PREFIX . 'Cannot qualify, class of the attribute \'' . $this->targetedIdAttribute
92+
. '\' (' . get_class($attributeValue) . ') is not equal to ' . self::NAME_ID_CLASS . '.'
93+
);
94+
}
95+
} else {
96+
Logger::debug(
97+
self::DEBUG_PREFIX . 'Attribute \'' . $this->targetedIdAttribute . '\' not available, cannot qualify.'
98+
);
99+
}
100+
}
101+
102+
private function qualify(NameID $attributeValue, string $nameQualifier, string $spNameQualifier)
103+
{
104+
$attributeValue->setNameQualifier($nameQualifier);
105+
$attributeValue->setSPNameQualifier($spNameQualifier);
106+
}
107+
}

0 commit comments

Comments
 (0)