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

Commit e3808ed

Browse files
author
Dominik Frantisek Bucik
committed
refactor: Refactored PR
1 parent 1c84441 commit e3808ed

File tree

6 files changed

+110
-44
lines changed

6 files changed

+110
-44
lines changed

config-templates/perun_attributes.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
'ldap' => 'dynamicRegistration',
2323
'type' => 'bool',
2424
],
25+
'perunFacilityAttr_entityID' => [
26+
'rpc' => 'urn:perun:facility:attribute-def:def:entityID',
27+
'ldap' => 'entityID',
28+
'type' => 'string',
29+
],
2530
'perunFacilityAttr_OIDCClientID' => [
2631
'rpc' => 'urn:perun:facility:attribute-def:def:OIDCClientID',
2732
'ldap' => 'OIDCClientID',
@@ -62,6 +67,11 @@
6267
'ldap' => 'capabilities',
6368
'type' => 'map',
6469
],
70+
'perunFacilityAttr_spname' => [
71+
'rpc' => 'urn:perun:facility:attribute-def:def:serviceName',
72+
'ldap' => 'serviceName',
73+
'type' => 'map',
74+
],
6575

6676
/*
6777
* USER ATTRIBUTES

lib/Adapter.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,18 @@ abstract public function getVoAttributesValues($vo, $attributes);
126126
abstract public function getFacilityAttribute($facility, $attrName);
127127

128128
/**
129-
* @param string $spEntityId
129+
* @param string $spEntityId Value of the entityID identifier
130130
* @return Facility facility
131131
*/
132-
abstract public function getFacilityByEntityId($spEntityId);
132+
abstract public function getFacilityByEntityId($spEntityId, $entityIdAttr);
133133

134134
/**
135-
* @param string $clientId
135+
* @param string $clientId Value of the client_id identifier
136+
* @param string $clientIdAttr Internal name of the client_id attribute, defaults to 'perunFacilityAttr_OIDCClientID'
137+
* this key has to be present in the attribute map configuration (see perun_attributes.php config template)
136138
* @return Facility facility
137139
*/
138-
abstract public function getFacilityByClientId($clientId);
140+
abstract public function getFacilityByClientId($clientId, $clientIdAttr);
139141

140142
/**
141143
* @param string $spEntityId entity id of the sp

lib/AdapterLdap.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -284,11 +284,15 @@ public function getFacilitiesByEntityId($spEntityId)
284284
return $this->fallbackAdapter->getFacilitiesByEntityId($spEntityId);
285285
}
286286

287-
public function getFacilityByEntityId($spEntityId)
287+
public function getFacilityByEntityId($spEntityId, $entityIdAttr = 'perunFacilityAttr_entityID')
288288
{
289+
$attrName = AttributeUtils::getLdapAttrName($entityIdAttr);
290+
if (empty($attributeName)) {
291+
throw new Exception("No attribute configuration in LDAP found for attribute ${entityIdAttr}");
292+
}
289293
$ldapResult = $this->connector->searchForEntity(
290294
$this->ldapBase,
291-
'(&(objectClass=perunFacility)(entityID=' . $spEntityId . '))',
295+
"(&(objectClass=perunFacility)(${attrName}=${spEntityId}))",
292296
[self::PERUN_FACILITY_ID, self::CN, self::DESCRIPTION]
293297
);
294298

@@ -307,11 +311,15 @@ public function getFacilityByEntityId($spEntityId)
307311
return $facility;
308312
}
309313

310-
public function getFacilityByClientId($clientId)
314+
public function getFacilityByClientId($clientId, $clientIdAttr = 'perunFacilityAttr_OIDCClientID')
311315
{
316+
$attrName = AttributeUtils::getLdapAttrName($clientIdAttr);
317+
if (empty($attributeName)) {
318+
throw new Exception("No attribute configuration in LDAP found for attribute ${clientIdAttr}");
319+
}
312320
$ldapResult = $this->connector->searchForEntity(
313321
$this->ldapBase,
314-
'(&(objectClass=perunFacility)(OIDCClientID=' . $clientId . '))',
322+
"(&(objectClass=perunFacility)(${attrName}=${clientId}))",
315323
[self::PERUN_FACILITY_ID, self::CN, self::DESCRIPTION]
316324
);
317325

lib/AdapterRpc.php

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,10 @@ public function getFacilityAdmins($facility)
323323

324324
public function getFacilityAttribute($facility, $attrName)
325325
{
326+
$attrNameRpc = AttributeUtils::getRpcAttrName($attrName);
326327
$perunAttr = $this->connector->get('attributesManager', 'getAttribute', [
327328
'facility' => $facility->getId(),
328-
'attributeName' => $attrName,
329+
'attributeName' => $attrNameRpc,
329330
]);
330331

331332
return $perunAttr['value'];
@@ -368,10 +369,14 @@ public function getUsersGroupsOnFacility($spEntityId, $userId)
368369
return $this->removeDuplicateEntities($groups);
369370
}
370371

371-
public function getFacilityByEntityId($spEntityId)
372+
public function getFacilityByEntityId($spEntityId, $entityIdAttr = 'perunFacilityAttr_entityID')
372373
{
374+
$attributeName = AttributeUtils::getRpcAttrName($entityIdAttr);
375+
if (empty($attributeName)) {
376+
throw new Exception("No attribute configuration in RPC found for attribute ${entityIdAttr}");
377+
}
373378
$perunAttr = $this->connector->get('facilitiesManager', 'getFacilitiesByAttribute', [
374-
'attributeName' => 'urn:perun:facility:attribute-def:def:entityID',
379+
'attributeName' => $attributeName,
375380
'attributeValue' => $spEntityId,
376381
]);
377382

@@ -390,10 +395,14 @@ public function getFacilityByEntityId($spEntityId)
390395
return new Facility($perunAttr[0]['id'], $perunAttr[0]['name'], $perunAttr[0]['description'], $spEntityId);
391396
}
392397

393-
public function getFacilityByClientId($clientId)
398+
public function getFacilityByClientId($clientId, $clientIdAttr = 'perunFacilityAttr_OIDCClientID')
394399
{
400+
$attributeName = AttributeUtils::getRpcAttrName($clientIdAttr);
401+
if (empty($attributeName)) {
402+
throw new Exception("No attribute configuration in RPC found for attribute ${clientIdAttr}");
403+
}
395404
$perunAttr = $this->connector->get('facilitiesManager', 'getFacilitiesByAttribute', [
396-
'attributeName' => 'urn:perun:facility:attribute-def:def:OIDCClientID',
405+
'attributeName' => $attributeName,
397406
'attributeValue' => $clientId,
398407
]);
399408

lib/Disco.php

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use SimpleSAML\Auth\State;
88
use SimpleSAML\Configuration;
99
use SimpleSAML\Error\Exception;
10-
use SimpleSAML\Locale\Translate;
1110
use SimpleSAML\Logger;
1211
use SimpleSAML\Module;
1312
use SimpleSAML\Module\discopower\PowerIdPDisco;
@@ -34,6 +33,10 @@ class Disco extends PowerIdPDisco
3433
# ROOT CONFIGURATION ENTRY
3534
public const WAYF = 'wayf_config';
3635

36+
public const INTERFACE = 'interface';
37+
38+
public const RPC = 'rpc';
39+
3740
# CONFIGURATION ENTRIES
3841
public const BOXED = 'boxed';
3942

@@ -43,7 +46,7 @@ class Disco extends PowerIdPDisco
4346

4447
public const DISABLE_WHITELISTING = 'disable_whitelisting';
4548

46-
public const DISPLAY_SP_NAME = 'display_sp_name';
49+
public const DISPLAY_SP = 'display_sp_name';
4750

4851
# CONFIGURATION ENTRIES IDP BLOCKS
4952
public const IDP_BLOCKS = 'idp_blocks_config';
@@ -128,13 +131,17 @@ class Disco extends PowerIdPDisco
128131

129132
# DISPLAY SERVICE NAME KEYS
130133

131-
public const CLIENT_ID_PREFIX = 'urn:cesnet:proxyidp:Client_id:';
134+
public const CLIENT_ID_PREFIX = 'urn:cesnet:proxyidp:client_id:';
132135

133-
public const INTERFACE = 'interface';
136+
public const SERVICE_NAME_ATTR = 'service_name_attr';
134137

135-
public const RPC = 'rpc';
138+
public const SERVICE_NAME_DEFAULT_ATTR_NAME = 'perunFacilityAttr_spname';
139+
140+
public const CLIENT_ID_ATTR = 'client_id_attr';
136141

137-
public const SERVICE_NAME_ATTR = 'urn:perun:facility:attribute-def:def:serviceName';
142+
public const ENTITY_ID_ATTR = 'entity_id_attr';
143+
144+
# VARIABLES
138145

139146
private $originalsp;
140147

@@ -185,11 +192,6 @@ public function __construct(array $metadataSets, $instance)
185192
State::saveState($state, self::SAML_SP_SSO);
186193
}
187194

188-
$this->displaySpName = $this->wayfConfiguration->getBoolean(self::DISPLAY_SP_NAME, false);
189-
if ($this->displaySpName) {
190-
$this->fillSpName($state);
191-
}
192-
193195
$e = explode('=', $returnURL)[0];
194196
$newReturnURL = $e . '=' . urlencode($id);
195197
$_GET[self::RETURN] = $newReturnURL;
@@ -267,6 +269,11 @@ public function handleRequest()
267269
}
268270

269271
$t = new DiscoTemplate($this->config);
272+
$this->displaySpName = $this->wayfConfiguration->getBoolean(self::DISPLAY_SP, false);
273+
if ($this->displaySpName) {
274+
$this->fillSpName($t);
275+
}
276+
270277
$t->data[self::ORIGINAL_SP] = $this->originalsp;
271278
$t->data[self::IDP_LIST] = $this->idplistStructured($idpList);
272279
$t->data[self::PREFERRED_IDP] = $preferredIdP;
@@ -277,7 +284,7 @@ public function handleRequest()
277284
$t->data[self::WARNING_ATTRIBUTES] = $warningAttributes;
278285
$t->data[self::WAYF] = $this->wayfConfiguration;
279286
$t->data[self::NAME] = $this->spName;
280-
$t->data[self::DISPLAY_SP_NAME] = $this->displaySpName;
287+
$t->data[self::DISPLAY_SP] = $this->displaySpName;
281288
$t->show();
282289
}
283290

@@ -886,31 +893,61 @@ private static function substrInArray($needle, array $haystack)
886893
return null;
887894
}
888895

889-
private function fillSpName($state)
896+
private function fillSpName($t)
890897
{
891-
$translate = new Translate(Configuration::getInstance());
892-
893898
$clientIdWithPrefix = self::substrInArray(self::CLIENT_ID_PREFIX, $this->originalAuthnContextClassRef);
894899

895-
if ($clientIdWithPrefix !== null) {
896-
$parts = explode(':', $clientIdWithPrefix);
897-
$clientId = end($parts);
898-
899-
$this->adapter = Adapter::getInstance($this->wayfConfiguration->getString(self::INTERFACE, self::RPC));
900+
$this->adapter = Adapter::getInstance($this->wayfConfiguration->getString(self::INTERFACE, self::RPC));
901+
try {
902+
if ($clientIdWithPrefix !== null) {
903+
$parts = explode(':', $clientIdWithPrefix);
904+
$clientId = end($parts);
900905

901-
$facility = $this->adapter->getFacilityByClientId($clientId);
906+
$clientIdAttr = $this->wayfConfiguration->getString(self::CLIENT_ID_ATTR, null);
907+
if ($clientIdAttr === null) {
908+
$facility = $this->adapter->getFacilityByClientId($clientId);
909+
} else {
910+
$facility = $this->adapter->getFacilityByClientId($clientId, $clientIdAttr);
911+
}
902912

903-
if ($facility !== null) {
904-
$spNameMap = $this->adapter->getFacilityAttribute($facility, self::SERVICE_NAME_ATTR);
905-
}
913+
if ($facility !== null) {
914+
$spNameAttrName = $this->wayfConfiguration->getString(
915+
self::SERVICE_NAME_ATTR,
916+
self::SERVICE_NAME_DEFAULT_ATTR_NAME
917+
);
918+
$spNameMap = $this->adapter->getFacilityAttribute($facility, $spNameAttrName);
919+
if (! empty($spNameMap)) {
920+
$this->spName = $t->getTranslation($spNameMap);
921+
}
922+
}
923+
} else {
924+
$entityId = $this->originalsp['entityid'];
925+
$entityIdAttr = $this->wayfConfiguration->getString(self::ENTITY_ID_ATTR, null);
926+
if ($entityIdAttr === null) {
927+
$facility = $this->adapter->getFacilityByEntityId($entityId);
928+
} else {
929+
$facility = $this->adapter->getFacilityByEntityId($entityId, $entityIdAttr);
930+
}
906931

907-
if (! empty($spNameMap)) {
908-
$this->spName = $translate->getPreferredTranslation($spNameMap);
909-
}
910-
} else {
911-
if (! empty($state[self::STATE_SP_METADATA][self::NAME])) {
912-
$this->spName = $translate->getPreferredTranslation($state[self::STATE_SP_METADATA][self::NAME]);
932+
if ($facility !== null) {
933+
$spNameAttr = $this->wayfConfiguration->getString(
934+
self::SERVICE_NAME_ATTR,
935+
self::SERVICE_NAME_DEFAULT_ATTR_NAME
936+
);
937+
$spNameMap = $this->adapter->getFacilityAttribute($facility, $spNameAttr);
938+
if (! empty($spNameMap)) {
939+
$this->spName = $t->getTranslation($spNameMap);
940+
}
941+
}
942+
if (empty($entityId)) {
943+
if (! empty($this->originalsp[self::NAME])) {
944+
$this->spName = $t->translate->getTranslation($this->originalsp[self::NAME]);
945+
}
946+
}
913947
}
948+
} catch (\Exception $e) {
949+
Logger::warning("Fill SP name - caught exception ${e}");
950+
//OK, we will just display the disco
914951
}
915952
}
916953
}

themes/perun/perun/disco-tpl.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
Module::getModuleUrl('perun/res/css/disco.css') . '" />';
3030

3131
$wayfConfig = $this->data[Disco::WAYF];
32-
$displaySpName = $this->data[Disco::DISPLAY_SP_NAME];
32+
$displaySpName = $this->data[Disco::DISPLAY_SP];
3333
$spName = $this->data[Disco::NAME];
3434

3535
$translateModule = $wayfConfig->getString(Disco::TRANSLATE_MODULE, 'disco');

0 commit comments

Comments
 (0)