diff --git a/config-templates/module_proxystatistics.php b/config-templates/module_proxystatistics.php index 54648c6ba1a13e0f21d7fa8af122ef4e4aa5cda7..7ba0c874490b3dc91528a9445a65fe608aa8ccce 100644 --- a/config-templates/module_proxystatistics.php +++ b/config-templates/module_proxystatistics.php @@ -62,6 +62,12 @@ $config = [ */ //'userIdAttribute' => 'uid', + /* + * Which attribute should be used for IdP Entity ID + * if left empty, it will be extracted from the request object. + */ + //'sourceIdpEntityIdAttribute' => 'sourceIdpEntityID', + /* * Database table names. Default is to keep the name (as in `tables.sql`) */ diff --git a/lib/Config.php b/lib/Config.php index 02876a177d7b159537628adc8f940c095a3d0722..b0c5568045bdabef9f7eb96398b14af2c02f7983 100644 --- a/lib/Config.php +++ b/lib/Config.php @@ -26,6 +26,8 @@ class Config private const USER_ID_ATTRIBUTE = 'userIdAttribute'; + private const SOURCE_IDP_ENTITY_ID_ATTRIBUTE = 'sourceIdpEntityIdAttribute'; + private const REQUIRE_AUTH_SOURCE = 'requireAuth.source'; private const KEEP_PER_USER = 'keepPerUser'; @@ -36,6 +38,8 @@ class Config private $mode; + private $sourceIdpEntityIdAttribute; + private static $instance; private function __construct() @@ -44,6 +48,7 @@ class Config $this->store = $this->config->getConfigItem(self::STORE, null); $this->tables = $this->config->getArray('tables', []); $this->mode = $this->config->getValueValidate(self::MODE, ['PROXY', 'IDP', 'SP', 'MULTI_IDP'], 'PROXY'); + $this->sourceIdpEntityIdAttribute = $this->config->getString(self::SOURCE_IDP_ENTITY_ID_ATTRIBUTE, ''); } private function __clone() @@ -79,6 +84,11 @@ class Config return $this->config->getString(self::USER_ID_ATTRIBUTE, 'uid'); } + public function getSourceIdpEntityIdAttribute() + { + return $this->sourceIdpEntityIdAttribute; + } + public function getSideInfo($side) { assert(in_array($side, [self::SIDES], true)); diff --git a/lib/DatabaseCommand.php b/lib/DatabaseCommand.php index 80085c40f28fa2d114c21ce9cfe3821ad6b9e295..3af3b34452a1a5e3a0797c8bae245e8c3a5fbeae 100644 --- a/lib/DatabaseCommand.php +++ b/lib/DatabaseCommand.php @@ -71,8 +71,7 @@ class DatabaseCommand } } - $idAttribute = $this->config->getIdAttribute(); - $userId = isset($request['Attributes'][$idAttribute]) ? $request['Attributes'][$idAttribute][0] : ''; + $userId = $this->getUserId($request); $ids = []; foreach (self::TABLE_SIDES as $side => $table) { @@ -273,23 +272,19 @@ class DatabaseCommand return $this->conn->write($query, $params); } - private function getEntities($request) + private function getEntities($request): array { $entities = [ Config::MODE_IDP => [], Config::MODE_SP => [], ]; if (Config::MODE_IDP !== $this->mode && Config::MODE_MULTI_IDP !== $this->mode) { - $entities[Config::MODE_IDP]['id'] = $request['saml:sp:IdP']; - $entities[Config::MODE_IDP]['name'] = $request['Attributes']['sourceIdPName'][0]; + $entities[Config::MODE_IDP]['id'] = $this->getIdpIdentifier($request); + $entities[Config::MODE_IDP]['name'] = $this->getIdpName($request); } if (Config::MODE_SP !== $this->mode) { - $entities[Config::MODE_SP]['id'] = $request['Destination']['entityid']; - if (isset($request['Destination']['UIInfo']['DisplayName']['en'])) { - $entities[Config::MODE_SP]['name'] = $request['Destination']['UIInfo']['DisplayName']['en']; - } else { - $entities[Config::MODE_SP]['name'] = $request['Destination']['name']['en'] ?? ''; - } + $entities[Config::MODE_SP]['id'] = $this->getSpIdentifier($request); + $entities[Config::MODE_SP]['name'] = $this->getSpName($request); } if (Config::MODE_PROXY !== $this->mode && Config::MODE_MULTI_IDP !== $this->mode) { @@ -372,4 +367,41 @@ class DatabaseCommand return $this->escape_cols($columns); } + + private function getIdpIdentifier($request) + { + $sourceIdpEntityIdAttribute = $this->config->getSourceIdpEntityIdAttribute(); + if (!empty($sourceIdpEntityIdAttribute) && !empty($request['Attributes'][$sourceIdpEntityIdAttribute][0])) { + return $request['Attributes'][$sourceIdpEntityIdAttribute][0]; + } + + return $request['saml:sp:IdP']; + } + + private function getUserId($request) + { + $idAttribute = $this->config->getIdAttribute(); + + return isset($request['Attributes'][$idAttribute]) ? $request['Attributes'][$idAttribute][0] : ''; + } + + private function getIdpName($request) + { + return $request['Attributes']['sourceIdPName'][0]; + } + + private function getSpIdentifier($request) + { + return $request['Destination']['entityid']; + } + + private function getSpName($request) + { + $displayName = $request['Destination']['UIInfo']['DisplayName']['en'] ?? ''; + if (empty($displayName)) { + $displayName = $request['Destination']['name']['en'] ?? ''; + } + + return$displayName; + } }