Skip to content
Snippets Groups Projects
Verified Commit 409a41c8 authored by Dominik Frantisek Bucik's avatar Dominik Frantisek Bucik
Browse files

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

parent cce10f0b
No related branches found
No related tags found
1 merge request!88feat: 🎸 AuthProc filter ApiStatistics to write via API
Pipeline #275409 passed
......@@ -21,6 +21,7 @@
"ext-filter": "*",
"ext-json": "*",
"ext-PDO": "*",
"ext-curl": "*",
"simplesamlphp/simplesamlphp": "^1.19.2"
},
"suggest": {
......
......@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "07339668d056596b07150da71952359f",
"content-hash": "62a4708962123e4125638eec26fad0f3",
"packages": [
{
"name": "gettext/gettext",
......@@ -2608,16 +2608,16 @@
},
{
"name": "symfony/console",
"version": "v5.4.23",
"version": "v5.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "90f21e27d0d88ce38720556dd164d4a1e4c3934c"
"reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/90f21e27d0d88ce38720556dd164d4a1e4c3934c",
"reference": "90f21e27d0d88ce38720556dd164d4a1e4c3934c",
"url": "https://api.github.com/repos/symfony/console/zipball/560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8",
"reference": "560fc3ed7a43e6d30ea94a07d77f9a60b8ed0fb8",
"shasum": ""
},
"require": {
......@@ -2687,7 +2687,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v5.4.23"
"source": "https://github.com/symfony/console/tree/v5.4.24"
},
"funding": [
{
......@@ -2703,20 +2703,20 @@
"type": "tidelift"
}
],
"time": "2023-04-24T18:47:29+00:00"
"time": "2023-05-26T05:13:16+00:00"
},
{
"name": "symfony/dependency-injection",
"version": "v5.4.23",
"version": "v5.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
"reference": "bb7b7988c898c94f5338e16403c52b5a3cae1d93"
"reference": "4645e032d0963fb614969398ca28e47605b1a7da"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/bb7b7988c898c94f5338e16403c52b5a3cae1d93",
"reference": "bb7b7988c898c94f5338e16403c52b5a3cae1d93",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/4645e032d0963fb614969398ca28e47605b1a7da",
"reference": "4645e032d0963fb614969398ca28e47605b1a7da",
"shasum": ""
},
"require": {
......@@ -2776,7 +2776,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/dependency-injection/tree/v5.4.23"
"source": "https://github.com/symfony/dependency-injection/tree/v5.4.24"
},
"funding": [
{
......@@ -2792,7 +2792,7 @@
"type": "tidelift"
}
],
"time": "2023-04-21T15:04:16+00:00"
"time": "2023-05-05T14:42:55+00:00"
},
{
"name": "symfony/deprecation-contracts",
......@@ -2863,16 +2863,16 @@
},
{
"name": "symfony/error-handler",
"version": "v5.4.23",
"version": "v5.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
"reference": "218206b4772d9f412d7d277980c020d06e9d8a4e"
"reference": "c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/218206b4772d9f412d7d277980c020d06e9d8a4e",
"reference": "218206b4772d9f412d7d277980c020d06e9d8a4e",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946",
"reference": "c1b9be3b8a6f60f720bec28c4ffb6fb5b00a8946",
"shasum": ""
},
"require": {
......@@ -2914,7 +2914,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/error-handler/tree/v5.4.23"
"source": "https://github.com/symfony/error-handler/tree/v5.4.24"
},
"funding": [
{
......@@ -2930,7 +2930,7 @@
"type": "tidelift"
}
],
"time": "2023-04-17T10:03:27+00:00"
"time": "2023-05-02T16:13:31+00:00"
},
{
"name": "symfony/event-dispatcher",
......@@ -3225,16 +3225,16 @@
},
{
"name": "symfony/framework-bundle",
"version": "v5.4.22",
"version": "v5.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/framework-bundle.git",
"reference": "6cb4f6aed4bd7fbf7b2ee74c231184a07f3d00c1"
"reference": "c06a56a47817d29318aaace1c655cbde16c998e8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6cb4f6aed4bd7fbf7b2ee74c231184a07f3d00c1",
"reference": "6cb4f6aed4bd7fbf7b2ee74c231184a07f3d00c1",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c06a56a47817d29318aaace1c655cbde16c998e8",
"reference": "c06a56a47817d29318aaace1c655cbde16c998e8",
"shasum": ""
},
"require": {
......@@ -3248,7 +3248,7 @@
"symfony/event-dispatcher": "^5.1|^6.0",
"symfony/filesystem": "^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/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.16",
......@@ -3261,7 +3261,6 @@
"doctrine/persistence": "<1.3",
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"phpunit/phpunit": "<5.4.3",
"symfony/asset": "<5.3",
"symfony/console": "<5.2.5",
"symfony/dom-crawler": "<4.4",
......@@ -3356,7 +3355,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/framework-bundle/tree/v5.4.22"
"source": "https://github.com/symfony/framework-bundle/tree/v5.4.24"
},
"funding": [
{
......@@ -3372,20 +3371,20 @@
"type": "tidelift"
}
],
"time": "2023-03-31T08:25:44+00:00"
"time": "2023-05-25T13:05:00+00:00"
},
{
"name": "symfony/http-foundation",
"version": "v5.4.23",
"version": "v5.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "af9fbb378f5f956c8f29d4886644c84c193780ac"
"reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/af9fbb378f5f956c8f29d4886644c84c193780ac",
"reference": "af9fbb378f5f956c8f29d4886644c84c193780ac",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/3c59f97f6249ce552a44f01b93bfcbd786a954f5",
"reference": "3c59f97f6249ce552a44f01b93bfcbd786a954f5",
"shasum": ""
},
"require": {
......@@ -3432,7 +3431,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v5.4.23"
"source": "https://github.com/symfony/http-foundation/tree/v5.4.24"
},
"funding": [
{
......@@ -3448,20 +3447,20 @@
"type": "tidelift"
}
],
"time": "2023-04-18T06:30:11+00:00"
"time": "2023-05-19T07:21:23+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v5.4.23",
"version": "v5.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "48ea17a7c65ef1ede0c3b2dbc35adace99071810"
"reference": "f38b722e1557eb3f487d351b48f5a1279b50e9d1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/48ea17a7c65ef1ede0c3b2dbc35adace99071810",
"reference": "48ea17a7c65ef1ede0c3b2dbc35adace99071810",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/f38b722e1557eb3f487d351b48f5a1279b50e9d1",
"reference": "f38b722e1557eb3f487d351b48f5a1279b50e9d1",
"shasum": ""
},
"require": {
......@@ -3544,7 +3543,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v5.4.23"
"source": "https://github.com/symfony/http-kernel/tree/v5.4.24"
},
"funding": [
{
......@@ -3560,7 +3559,7 @@
"type": "tidelift"
}
],
"time": "2023-04-28T13:29:52+00:00"
"time": "2023-05-27T08:06:30+00:00"
},
{
"name": "symfony/polyfill-ctype",
......@@ -4470,16 +4469,16 @@
},
{
"name": "symfony/var-dumper",
"version": "v5.4.23",
"version": "v5.4.24",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
"reference": "9a8a5b6d6508928174ded2109e29328a55342a42"
"reference": "8e12706bf9c68a2da633f23bfdc15b4dce5970b3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/9a8a5b6d6508928174ded2109e29328a55342a42",
"reference": "9a8a5b6d6508928174ded2109e29328a55342a42",
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/8e12706bf9c68a2da633f23bfdc15b4dce5970b3",
"reference": "8e12706bf9c68a2da633f23bfdc15b4dce5970b3",
"shasum": ""
},
"require": {
......@@ -4488,7 +4487,6 @@
"symfony/polyfill-php80": "^1.16"
},
"conflict": {
"phpunit/phpunit": "<5.4.3",
"symfony/console": "<4.4"
},
"require-dev": {
......@@ -4539,7 +4537,7 @@
"dump"
],
"support": {
"source": "https://github.com/symfony/var-dumper/tree/v5.4.23"
"source": "https://github.com/symfony/var-dumper/tree/v5.4.24"
},
"funding": [
{
......@@ -4555,7 +4553,7 @@
"type": "tidelift"
}
],
"time": "2023-04-18T09:26:27+00:00"
"time": "2023-05-25T13:05:00+00:00"
},
{
"name": "symfony/var-exporter",
......@@ -4963,7 +4961,8 @@
"ext-ctype": "*",
"ext-filter": "*",
"ext-json": "*",
"ext-pdo": "*"
"ext-pdo": "*",
"ext-curl": "*"
},
"platform-dev": [],
"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.
Finish editing this message first!
Please register or to comment