Skip to content
Snippets Groups Projects
Commit 777aee5b authored by Pavel Vyskočil's avatar Pavel Vyskočil
Browse files

chore: merge branch 'write_api' into 'main'

feat: :guitar: AuthProc filter ApiStatistics to write via API

See merge request perun-proxy-aai/simplesamlphp/simplesamlphp-module-proxystatistics!88
parents cce10f0b 409a41c8
Branches
Tags
1 merge request!88feat: 🎸 AuthProc filter ApiStatistics to write via API
Pipeline #275989 passed with warnings
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
"ext-filter": "*", "ext-filter": "*",
"ext-json": "*", "ext-json": "*",
"ext-PDO": "*", "ext-PDO": "*",
"ext-curl": "*",
"simplesamlphp/simplesamlphp": "^1.19.2" "simplesamlphp/simplesamlphp": "^1.19.2"
}, },
"suggest": { "suggest": {
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "07339668d056596b07150da71952359f", "content-hash": "62a4708962123e4125638eec26fad0f3",
"packages": [ "packages": [
{ {
"name": "gettext/gettext", "name": "gettext/gettext",
...@@ -2608,16 +2608,16 @@ ...@@ -2608,16 +2608,16 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v5.4.23", "version": "v5.4.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "90f21e27d0d88ce38720556dd164d4a1e4c3934c" "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/90f21e27d0d88ce38720556dd164d4a1e4c3934c", "url": "https://api.github.com/repos/symfony/console/zipball/560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8",
"reference": "90f21e27d0d88ce38720556dd164d4a1e4c3934c", "reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -2687,7 +2687,7 @@ ...@@ -2687,7 +2687,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v5.4.23" "source": "https://github.com/symfony/console/tree/v5.4.24"
}, },
"funding": [ "funding": [
{ {
...@@ -2703,20 +2703,20 @@ ...@@ -2703,20 +2703,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-24T18:47:29+00:00" "time": "2023-05-26T05:13:16+00:00"
}, },
{ {
"name": "symfony/dependency-injection", "name": "symfony/dependency-injection",
"version": "v5.4.23", "version": "v5.4.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dependency-injection.git", "url": "https://github.com/symfony/dependency-injection.git",
"reference": "bb7b7988c898c94f5338e16403c52b5a3cae1d93" "reference": "4645e032d0963fb614969398ca28e47605b1a7da"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/bb7b7988c898c94f5338e16403c52b5a3cae1d93", "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/4645e032d0963fb614969398ca28e47605b1a7da",
"reference": "bb7b7988c898c94f5338e16403c52b5a3cae1d93", "reference": "4645e032d0963fb614969398ca28e47605b1a7da",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -2776,7 +2776,7 @@ ...@@ -2776,7 +2776,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application", "description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/dependency-injection/tree/v5.4.23" "source": "https://github.com/symfony/dependency-injection/tree/v5.4.24"
}, },
"funding": [ "funding": [
{ {
...@@ -2792,7 +2792,7 @@ ...@@ -2792,7 +2792,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-21T15:04:16+00:00" "time": "2023-05-05T14:42:55+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
...@@ -2863,16 +2863,16 @@ ...@@ -2863,16 +2863,16 @@
}, },
{ {
"name": "symfony/error-handler", "name": "symfony/error-handler",
"version": "v5.4.23", "version": "v5.4.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/error-handler.git", "url": "https://github.com/symfony/error-handler.git",
"reference": "218206b4772d9f412d7d277980c020d06e9d8a4e" "reference": "c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/218206b4772d9f412d7d277980c020d06e9d8a4e", "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946",
"reference": "218206b4772d9f412d7d277980c020d06e9d8a4e", "reference": "c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -2914,7 +2914,7 @@ ...@@ -2914,7 +2914,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code", "description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/error-handler/tree/v5.4.23" "source": "https://github.com/symfony/error-handler/tree/v5.4.24"
}, },
"funding": [ "funding": [
{ {
...@@ -2930,7 +2930,7 @@ ...@@ -2930,7 +2930,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-17T10:03:27+00:00" "time": "2023-05-02T16:13:31+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
...@@ -3225,16 +3225,16 @@ ...@@ -3225,16 +3225,16 @@
}, },
{ {
"name": "symfony/framework-bundle", "name": "symfony/framework-bundle",
"version": "v5.4.22", "version": "v5.4.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/framework-bundle.git", "url": "https://github.com/symfony/framework-bundle.git",
"reference": "6cb4f6aed4bd7fbf7b2ee74c231184a07f3d00c1" "reference": "c06a56a47817d29318aaace1c655cbde16c998e8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6cb4f6aed4bd7fbf7b2ee74c231184a07f3d00c1", "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c06a56a47817d29318aaace1c655cbde16c998e8",
"reference": "6cb4f6aed4bd7fbf7b2ee74c231184a07f3d00c1", "reference": "c06a56a47817d29318aaace1c655cbde16c998e8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -3248,7 +3248,7 @@ ...@@ -3248,7 +3248,7 @@
"symfony/event-dispatcher": "^5.1|^6.0", "symfony/event-dispatcher": "^5.1|^6.0",
"symfony/filesystem": "^4.4|^5.0|^6.0", "symfony/filesystem": "^4.4|^5.0|^6.0",
"symfony/finder": "^4.4|^5.0|^6.0", "symfony/finder": "^4.4|^5.0|^6.0",
"symfony/http-foundation": "^5.3|^6.0", "symfony/http-foundation": "^5.4.24|^6.2.11",
"symfony/http-kernel": "^5.4|^6.0", "symfony/http-kernel": "^5.4|^6.0",
"symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.16", "symfony/polyfill-php80": "^1.16",
...@@ -3261,7 +3261,6 @@ ...@@ -3261,7 +3261,6 @@
"doctrine/persistence": "<1.3", "doctrine/persistence": "<1.3",
"phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0", "phpdocumentor/type-resolver": "<1.4.0",
"phpunit/phpunit": "<5.4.3",
"symfony/asset": "<5.3", "symfony/asset": "<5.3",
"symfony/console": "<5.2.5", "symfony/console": "<5.2.5",
"symfony/dom-crawler": "<4.4", "symfony/dom-crawler": "<4.4",
...@@ -3356,7 +3355,7 @@ ...@@ -3356,7 +3355,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/framework-bundle/tree/v5.4.22" "source": "https://github.com/symfony/framework-bundle/tree/v5.4.24"
}, },
"funding": [ "funding": [
{ {
...@@ -3372,20 +3371,20 @@ ...@@ -3372,20 +3371,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-03-31T08:25:44+00:00" "time": "2023-05-25T13:05:00+00:00"
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v5.4.23", "version": "v5.4.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "af9fbb378f5f956c8f29d4886644c84c193780ac" "reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/af9fbb378f5f956c8f29d4886644c84c193780ac", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3c59f97f6249ce552a44f01b93bfcbd786a954f5",
"reference": "af9fbb378f5f956c8f29d4886644c84c193780ac", "reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -3432,7 +3431,7 @@ ...@@ -3432,7 +3431,7 @@
"description": "Defines an object-oriented layer for the HTTP specification", "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-foundation/tree/v5.4.23" "source": "https://github.com/symfony/http-foundation/tree/v5.4.24"
}, },
"funding": [ "funding": [
{ {
...@@ -3448,20 +3447,20 @@ ...@@ -3448,20 +3447,20 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-18T06:30:11+00:00" "time": "2023-05-19T07:21:23+00:00"
}, },
{ {
"name": "symfony/http-kernel", "name": "symfony/http-kernel",
"version": "v5.4.23", "version": "v5.4.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-kernel.git", "url": "https://github.com/symfony/http-kernel.git",
"reference": "48ea17a7c65ef1ede0c3b2dbc35adace99071810" "reference": "f38b722e1557eb3f487d351b48f5a1279b50e9d1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/48ea17a7c65ef1ede0c3b2dbc35adace99071810", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f38b722e1557eb3f487d351b48f5a1279b50e9d1",
"reference": "48ea17a7c65ef1ede0c3b2dbc35adace99071810", "reference": "f38b722e1557eb3f487d351b48f5a1279b50e9d1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -3544,7 +3543,7 @@ ...@@ -3544,7 +3543,7 @@
"description": "Provides a structured process for converting a Request into a Response", "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/http-kernel/tree/v5.4.23" "source": "https://github.com/symfony/http-kernel/tree/v5.4.24"
}, },
"funding": [ "funding": [
{ {
...@@ -3560,7 +3559,7 @@ ...@@ -3560,7 +3559,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-28T13:29:52+00:00" "time": "2023-05-27T08:06:30+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
...@@ -4470,16 +4469,16 @@ ...@@ -4470,16 +4469,16 @@
}, },
{ {
"name": "symfony/var-dumper", "name": "symfony/var-dumper",
"version": "v5.4.23", "version": "v5.4.24",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/var-dumper.git", "url": "https://github.com/symfony/var-dumper.git",
"reference": "9a8a5b6d6508928174ded2109e29328a55342a42" "reference": "8e12706bf9c68a2da633f23bfdc15b4dce5970b3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/9a8a5b6d6508928174ded2109e29328a55342a42", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/8e12706bf9c68a2da633f23bfdc15b4dce5970b3",
"reference": "9a8a5b6d6508928174ded2109e29328a55342a42", "reference": "8e12706bf9c68a2da633f23bfdc15b4dce5970b3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
...@@ -4488,7 +4487,6 @@ ...@@ -4488,7 +4487,6 @@
"symfony/polyfill-php80": "^1.16" "symfony/polyfill-php80": "^1.16"
}, },
"conflict": { "conflict": {
"phpunit/phpunit": "<5.4.3",
"symfony/console": "<4.4" "symfony/console": "<4.4"
}, },
"require-dev": { "require-dev": {
...@@ -4539,7 +4537,7 @@ ...@@ -4539,7 +4537,7 @@
"dump" "dump"
], ],
"support": { "support": {
"source": "https://github.com/symfony/var-dumper/tree/v5.4.23" "source": "https://github.com/symfony/var-dumper/tree/v5.4.24"
}, },
"funding": [ "funding": [
{ {
...@@ -4555,7 +4553,7 @@ ...@@ -4555,7 +4553,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2023-04-18T09:26:27+00:00" "time": "2023-05-25T13:05:00+00:00"
}, },
{ {
"name": "symfony/var-exporter", "name": "symfony/var-exporter",
...@@ -4963,7 +4961,8 @@ ...@@ -4963,7 +4961,8 @@
"ext-ctype": "*", "ext-ctype": "*",
"ext-filter": "*", "ext-filter": "*",
"ext-json": "*", "ext-json": "*",
"ext-pdo": "*" "ext-pdo": "*",
"ext-curl": "*"
}, },
"platform-dev": [], "platform-dev": [],
"platform-overrides": { "platform-overrides": {
......
<?php
declare(strict_types=1);
namespace SimpleSAML\Module\proxystatistics\Auth\Process;
use SimpleSAML\Auth\ProcessingFilter;
use SimpleSAML\Configuration;
use SimpleSAML\Error\Exception;
use SimpleSAML\Logger;
class ApiStatistics extends ProcessingFilter
{
private const STAGE = 'proxystatistics:ApiStatistics';
private const DEBUG_PREFIX = self::STAGE . ' - ';
public const API_URL = 'apiUrl';
public const API_USERNAME = 'apiUsername';
public const API_PASSWORD = 'apiPassword';
public const USERNAME_ATTRIBUTE = 'usernameAttribute';
public const IDP_IDENTIFIER_ATTRIBUTE = 'idpIdentifierAttribute';
public const IDP_NAME_ATTRIBUTE = 'idpNameAttribute';
private const USER_ID = 'userId';
private const SERVICE_IDENTIFIER = 'serviceIdentifier';
private const SERVICE_NAME = 'serviceName';
private const IDP_IDENTIFIER = 'idpIdentifier';
private const IDP_NAME = 'idpName';
private $userIdAttribute;
private $idpIdAttribute;
private $idpNameAttribute;
private $apiUrl;
private $apiUsername;
private $apiPassword;
public function __construct($config, $reserved)
{
parent::__construct($config, $reserved);
$configuration = Configuration::loadFromArray($config);
$this->userIdAttribute = $configuration->getString(self::USERNAME_ATTRIBUTE);
$this->idpIdAttribute = $configuration->getString(self::IDP_IDENTIFIER_ATTRIBUTE);
$this->idpNameAttribute = $configuration->getString(self::IDP_NAME_ATTRIBUTE);
$this->apiUrl = $configuration->getString(self::API_URL);
$this->apiUsername = $configuration->getString(self::API_USERNAME);
$this->apiPassword = $configuration->getString(self::API_PASSWORD);
}
public function process(&$request)
{
$attributes = $request['Attributes'];
if (empty($attributes[$this->userIdAttribute][0])) {
Logger::warning(
self::DEBUG_PREFIX .
"Cannot write to stats - Missing user ID in attribute " .
$this->userIdAttribute
);
return;
} elseif (empty($attributes[$this->idpIdAttribute][0])) {
Logger::warning(
self::DEBUG_PREFIX .
"Cannot write to stats - Missing IdP ID in attribute " .
$this->idpIdAttribute
);
return;
} elseif (empty($attributes[$this->idpNameAttribute][0])) {
Logger::warning(
self::DEBUG_PREFIX .
"Cannot write to stats - Missing IdP name in attribute " .
$this->idpNameAttribute
);
}
$userId = $attributes[$this->userIdAttribute][0];
$idpId = $attributes[$this->idpIdAttribute][0];
$idpName = $attributes[$this->idpNameAttribute][0];
$spId = $request['Destination']['entityid'];
$spName = $request['Destination']['UIInfo']['DisplayName']['en'] ?? '';
if (empty($spName)) {
$spName = $request['Destination']['name']['en'] ?? '';
}
if (empty($spId)) {
Logger::warning(self::DEBUG_PREFIX . "Cannot write to stats - Missing SP ID");
return;
} elseif (empty($spName)) {
Logger::warning(self::DEBUG_PREFIX . "Cannot write to stats - Missing SP name");
return;
}
$body = json_encode([
self::USER_ID => $userId,
self::IDP_IDENTIFIER => $idpId,
self::IDP_NAME => $idpName,
self::SERVICE_IDENTIFIER => $spId,
self::SERVICE_NAME => $spName
]);
Logger::debug(self::DEBUG_PREFIX . "Calling stats API endpoint with data - " . $body);
$ch = curl_init($this->apiUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:application/json']);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_USERPWD, $this->apiUsername . ":" . $this->apiPassword);
$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpcode != 200) {
Logger::warning(
self::DEBUG_PREFIX
. 'Calling API endpoint to write stats returned non-200 response code: ' . $httpcode
);
Logger::debug(self::DEBUG_PREFIX . "Response: " . $response);
} else {
Logger::info(self::DEBUG_PREFIX . 'Successfully written to statistics via API');
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment