Add Entra module for handling Microsoft integration

This commit introduces the Entra module, enabling configuration management and handling callbacks for Microsoft's authorization. It includes new classes, routes, and configuration variables to support integration, ensuring flexibility and logging support for related operations.
This commit is contained in:
Jepp9350
2025-05-21 14:20:50 +02:00
parent a45e2706c3
commit 458e2916a6
10 changed files with 297 additions and 1 deletions
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace classes;
require_once WD . '/modules/entra/entra_c.php';
use entra\entra_c;
class entra
{
/**
* Configuration of the Entra module
* @var entra_c
*/
public entra_c $config;
public function __construct()
{
$this->config = new entra_c();
}
}
+1 -1
View File
@@ -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": "46cab9f4906282144b772342d94992b3",
"content-hash": "485f3d1c6cc7e0e31386e28d172149d4",
"packages": [
{
"name": "aws/aws-crt-php",
+1
View File
@@ -66,6 +66,7 @@ require_once 'classes/pdf_generator.php';
require_once 'classes/fxratesapi.php';
require_once 'classes/gatewayapi.php';
require_once 'classes/xlvask.php';
require_once 'classes/entra.php';
/**
* Modules
@@ -0,0 +1,29 @@
<?php
namespace entra\config;
use Exception;
use traits\module_config_variable;
class entra_client_id_c
{
use module_config_variable;
/**
* @throws Exception
*/
public function __construct()
{
self::setupConfigVariable(
'Entra',
'entra_client_id',
'string',
false,
null,
'The client id for Entra',
'1',
false,
''
);
}
}
@@ -0,0 +1,29 @@
<?php
namespace entra\config;
use Exception;
use traits\module_config_variable;
class entra_client_secret_c
{
use module_config_variable;
/**
* @throws Exception
*/
public function __construct()
{
self::setupConfigVariable(
'Entra',
'entra_client_secret',
'string',
false,
null,
'The client secret for Entra',
'1',
true,
''
);
}
}
@@ -0,0 +1,29 @@
<?php
namespace entra\config;
use Exception;
use traits\module_config_variable;
class entra_enabled_c
{
use module_config_variable;
/**
* @throws Exception
*/
public function __construct()
{
self::setupConfigVariable(
'Entra',
'enabled',
'bool',
true,
null,
'Whether Entra is enabled',
'1',
false,
'false'
);
}
}
@@ -0,0 +1,29 @@
<?php
namespace entra\config;
use Exception;
use traits\module_config_variable;
class entra_tenant_id_c
{
use module_config_variable;
/**
* @throws Exception
*/
public function __construct()
{
self::setupConfigVariable(
'Entra',
'entra_tenant_id',
'string',
false,
null,
'The tenant id for Entra',
'1',
false,
''
);
}
}
@@ -0,0 +1,55 @@
<?php
namespace entra;
require_once WD . '/modules/entra/config/entra_enabled_c.php';
require_once WD . '/modules/entra/config/entra_client_id_c.php';
require_once WD . '/modules/entra/config/entra_client_secret_c.php';
require_once WD . '/modules/entra/config/entra_tenant_id_c.php';
use entra\config\entra_client_id_c;
use entra\config\entra_client_secret_c;
use entra\config\entra_enabled_c;
use entra\config\entra_tenant_id_c;
use traits\module_config_t;
class entra_c
{
use module_config_t;
/**
* The status of entra, whether it is enabled or not
* @var entra_enabled_c
*/
public entra_enabled_c $enabled;
/**
* The client id for entra
* @var entra_client_id_c
*/
public entra_client_id_c $client_id;
/**
* The secret key for entra
* @var entra_client_secret_c
*/
public entra_client_secret_c $client_secret;
/**
* The tenant id for entra
* @var entra_tenant_id_c
*/
public entra_tenant_id_c $tenant_id;
public function __construct()
{
$this->setupConfig('Entra');
$this->allowUpdate([
entra_enabled_c::class,
entra_client_id_c::class,
entra_client_secret_c::class,
entra_tenant_id_c::class,
]);
$this->enabled = new entra_enabled_c();
$this->client_id = new entra_client_id_c();
$this->client_secret = new entra_client_secret_c();
$this->tenant_id = new entra_tenant_id_c();
}
}
@@ -0,0 +1,64 @@
<?php
namespace routes;
use classes\authentication;
use objects\logs_o;
use traits\route_t;
class callbackMicrosoftRoute
{
use route_t;
public function run(): void
{
$this->post('/callback/microsoft/token', function () {
// Require the user to be logged in
global $response;
self::requirePermission('callback_microsoft_token');
$user = (new authentication())->get_user();
// Check if the request was successful
if (!$user) {
// Log the incident
(new logs_o())->add('user_callback', 'global', 0, 0, 'USER_CALLBACK_MICROSOFT_TOKEN', 'User not logged in');
$response->error('Invalid session', 400);
}
// Require the parameters:
// client_info
// code
// session_state
// state
self::requireParameters(['client_info', 'code', 'session_state', 'state']);
// Check if the parameters are valid
self::requireType((string)self::getParameter('client_info'), self::type_string());
self::requireType((string)self::getParameter('code'), self::type_string());
self::requireType((string)self::getParameter('session_state'), self::type_string());
self::requireType((string)self::getParameter('state'), self::type_string());
// Check if the parameters are valid
$client_info = (string)self::getParameter('client_info');
$code = (string)self::getParameter('code');
$session_state = (string)self::getParameter('session_state');
$state = (string)self::getParameter('state');
// Check if the parameters are valid
if (empty($client_info) || empty($code) || empty($session_state) || empty($state)) {
(new logs_o())->add('user_callback', 'global', 0, $user->id, 'USER_CALLBACK_MICROSOFT_TOKEN', 'Invalid parameters');
$response->error('Invalid parameters', 400);
}
// Log the incident
(new logs_o())->add('user_callback', 'global', 1, $user->id, 'USER_CALLBACK_MICROSOFT_TOKEN', 'Successfully received callback from Microsoft');
// Save the parameters to the database
$user->keys->setValue('microsoft_client_info', $client_info);
$user->keys->setValue('microsoft_code', $code);
$user->keys->setValue('microsoft_session_state', $session_state);
$user->keys->setValue('microsoft_state', $state);
// Return a success message
$response->success(['message' => 'Successfully received callback from Microsoft', 'client_info' => $client_info, 'code' => $code, 'session_state' => $session_state, 'state' => $state]);
},
[
'callback_microsoft_token' => 'Callback Microsoft token (Set the token)',
]
);
}
}
@@ -410,5 +410,44 @@ class moduleConfigRoute
'xlvask_config' => 'Update xlvask config'
]
);
/** Entra config > GET */
$this->get('/entra/config', function () {
global $response;
$this->requirePermission('entra_config');
$user = (new authentication())->get_user();
if ($user) {
(new logs_o())->add('entra_config', 'global', 1, $user->id, 'ENTRA_CONFIG', 'Successfully fetched entra config');
$response->success(
(new \classes\entra())->config->getConfigRequest()
);
} else {
(new logs_o())->add('entra_config', 'global', 1, 0, 'ENTRA_CONFIG', 'No user found, or invalid session');
$response->error('Invalid session', 400);
}
},
[
'entra_config' => 'Get entra config'
]
);
/** Entra config > POST */
$this->post('/entra/config', function () {
global $response;
$this->requirePermission('entra_config');
$user = (new authentication())->get_user();
if ($user) {
(new logs_o())->add('entra_config', 'global', 1, $user->id, 'ENTRA_CONFIG', 'Successfully updated entra config');
$response->success(
(new \classes\entra())->config->postConfigRequest()
);
} else {
(new logs_o())->add('entra_config', 'global', 1, 0, 'ENTRA_CONFIG', 'No user found, or invalid session');
$response->error('Invalid session', 400);
}
},
[
'entra_config' => 'Update entra config'
]
);
}
}