move paths_installed to shared folder CORE #55

This commit is contained in:
Fernando Ontiveros
2025-04-10 01:56:01 +00:00
parent 0e78dccf0f
commit 3a6a219b07
8 changed files with 775 additions and 657 deletions

View File

@@ -1,3 +1,7 @@
variables:
GIT_STRATEGY: fetch
GIT_FETCH_EXTRA_FLAGS: --prune --tags --depth 1000
stages:
- build

1119
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
# Use our base image
FROM gitlab.luranasoft.com:5050/luos/docker/base-image:1.0.12-php8.3
FROM gitlab.luranasoft.com:5050/luos/docker/base-image:1.0.30-php8.3
# Set the working directory
WORKDIR /code

View File

@@ -451,6 +451,7 @@ class WebApplication
define("PATH_TRUNK", $this->rootDir . PATH_SEP);
define("PATH_OUTTRUNK", realpath($this->rootDir . "/../") . PATH_SEP);
define("PATH_HOME", $this->rootDir . PATH_SEP . "workflow" . PATH_SEP);
define('PATH_DATA', isset($_SERVER['PATH_DATA']) ? $_SERVER['PATH_DATA'] : PATH_TRUNK . 'shared' . PATH_SEP );
define("PATH_HTML", PATH_HOME . "public_html" . PATH_SEP);
define("PATH_RBAC_HOME", PATH_TRUNK . "rbac" . PATH_SEP);
@@ -479,7 +480,7 @@ class WebApplication
define("PATH_UPLOAD", PATH_HTML . "files" . PATH_SEP);
define("PATH_WORKFLOW_MYSQL_DATA", PATH_CORE . "data" . PATH_SEP . "mysql" . PATH_SEP);
define("PATH_RBAC_MYSQL_DATA", PATH_RBAC_CORE . "data" . PATH_SEP . "mysql" . PATH_SEP);
define("FILE_PATHS_INSTALLED", PATH_CORE . "config" . PATH_SEP . "paths_installed.php");
define("FILE_PATHS_INSTALLED", PATH_DATA . "config" . PATH_SEP . "paths_installed.php");
define("PATH_WORKFLOW_MSSQL_DATA", PATH_CORE . "data" . PATH_SEP . "mssql" . PATH_SEP);
define("PATH_RBAC_MSSQL_DATA", PATH_RBAC_CORE . "data" . PATH_SEP . "mssql" . PATH_SEP);
define("PATH_CONTROLLERS", PATH_CORE . "controllers" . PATH_SEP);
@@ -493,7 +494,7 @@ class WebApplication
}
// include the server installed configuration
require_once PATH_CORE . "config" . PATH_SEP . "paths_installed.php";
require_once FILE_PATHS_INSTALLED;
// defining system constant when a valid server environment exists
define("PATH_LANGUAGECONT", PATH_DATA . "META-INF" . PATH_SEP);

View File

@@ -16,9 +16,62 @@ class Bootstrap
public static $includeClassPaths = array();
public static $includePaths = array();
protected $relativeIncludePaths = array();
public static $startingTime = 0;
//below here only approved methods
/**
* Function to initialize session settings
*/
public static function initializeSession($config) {
// Start the timer
self::$startingTime = microtime(true);
// Determine session lifetime
$sessionLifetime = isset($config['session.gc_maxlifetime'])
? $config['session.gc_maxlifetime']
: ini_get('session.gc_maxlifetime');
// Default to 1440 seconds (24 minutes) if lifetime is not set
if (is_null($sessionLifetime)) {
$sessionLifetime = 1440;
}
// Set the session garbage collection maximum lifetime
ini_set('session.gc_maxlifetime', $sessionLifetime);
// Configure cookie lifetime based on user agent and configuration
Bootstrap::configureCookieLifetime($sessionLifetime, $config);
// Set cookie security options if REMOTE_USER is not set
if (!array_key_exists('REMOTE_USER', $_SERVER) || empty($_SERVER['REMOTE_USER'])) {
ini_set('session.cookie_httponly', 1);
if (G::is_https()) {
ini_set('session.cookie_secure', 1);
}
}
// Start the session
session_start();
}
/*
* Function to configure cookie lifetime based on user agent
*/
public static function configureCookieLifetime($sessionLifetime, $config) {
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$isIE = preg_match("/msie/i", $userAgent);
$isSafari = preg_match("/safari/i", $userAgent) && !preg_match("/chrome/i", $userAgent);
// Set cookie lifetime based on browser and configuration
if (($isIE && $config['ie_cookie_lifetime'] != 1) ||
($isSafari && $config['safari_cookie_lifetime'] != 1)) {
return; // Do not set cookie lifetime if conditions are not met
}
ini_set('session.cookie_lifetime', $sessionLifetime);
}
/**
* @deprecated 3.2.2, We keep this function only for backwards compatibility because is used in the plugin manager
*/
@@ -247,6 +300,10 @@ class Bootstrap
$file = $filter->xssFilterHard($file);
$downloadFileName = $filter->xssFilterHard($downloadFileName);
//if (DEBUG_TIME_LOG) { // to do: remove comment
self::logTimeByPage();
//}
$browserCacheFilesUid = G::browserCacheFilesGetUid();
if ($browserCacheFilesUid != null) {
@@ -720,16 +777,16 @@ class Bootstrap
*/
public static function logTimeByPage()
{
if (!defined(PATH_DATA)) {
if (!defined('PATH_DATA')) {
return false;
}
$serverAddr = $_SERVER ['SERVER_ADDR'];
global $startingTime;
$endTime = microtime(true);
$time = $endTime - $startingTime;
$fpt = fopen(PATH_DATA . 'log/time.log', 'a');
fwrite($fpt, sprintf("%s.%03d %15s %s %5.3f %s\n", date('Y-m-d H:i:s'), $time, getenv('REMOTE_ADDR'), substr($serverAddr, - 4), $time, $_SERVER ['REQUEST_URI']));
$time = $endTime - self::$startingTime;
Bootstrap::verifyPath(PATH_DATA . 'logs', true);
$fpt = fopen(PATH_DATA . 'logs/time.log', 'a');
fwrite($fpt, sprintf("%s %7.6f %-15s %s\n", date('Y-m-d H:i:s'), $time, getenv('REMOTE_ADDR'), $_SERVER ['REQUEST_URI']));
fclose($fpt);
}

View File

@@ -822,16 +822,18 @@ class InstallerModule extends Controller
'USR_LASTNAME' => $adminUsername,
'USR_PASSWORD' => G::encryptHash($adminPassword)
]);
// Write the paths_installed.php file (contains all the information configured so far)
if (!file_exists(FILE_PATHS_INSTALLED)) {
$sh = G::encryptOld(filemtime(PATH_GULLIVER . '/class.g.php'));
$h = G::encrypt($db_host . $sh . $db_username . $sh . $db_password, $sh);
$dbText = "<?php\n";
$dbText .= sprintf(" define('PATH_DATA', '%s');\n", $pathShared);
$dbText .= sprintf(" define('PATH_C', '%s');\n", $pathShared . 'compiled/');
$dbText .= sprintf(" define('PATH_C', '%s');\n", PATH_DATA . 'compiled/');
$dbText .= sprintf(" define('HASH_INSTALLATION', '%s');\n", $h);
$dbText .= sprintf(" define('SYSTEM_HASH', '%s');\n", $sh);
$this->installLog(G::LoadTranslation('ID_CREATING', SYS_LANG, [FILE_PATHS_INSTALLED]));
Bootstrap::verifyPath(PATH_DATA . 'config', true);
file_put_contents(FILE_PATHS_INSTALLED, $dbText);
}

View File

@@ -442,6 +442,7 @@ Ext.onReady(function () {
fieldLabel: '<span id="pathSharedSpan"></span> ' + _('ID_WORFLOW_DATA_DIRECTORY'),
id: 'pathShared',
width: 430,
disabled: true,
value: path_shared,
enableKeyEvents: true,
allowBlank: false,

View File

@@ -10,116 +10,29 @@ use ProcessMaker\Validation\ValidationUploadedFiles;
/**
* bootstrap - ProcessMaker Bootstrap
* this file is used initialize main variables, redirect and dispatch all requests
* This file initializes main variables, redirects, and dispatches all requests.
*/
// Validating if exists 'HTTP_USER_AGENT' key in $_SERVER array
if (!isset($_SERVER['HTTP_USER_AGENT'])) {
$_SERVER['HTTP_USER_AGENT'] = '';
}
// Defining the PATH_SEP constant, he we are defining if the the path separator symbol will be '\\' or '/'
// Ensure 'HTTP_USER_AGENT' is set
$_SERVER['HTTP_USER_AGENT'] = htmlspecialchars(filter_input(INPUT_SERVER, 'HTTP_USER_AGENT') ?? '', ENT_QUOTES, 'UTF-8');
// Define path separator constant
define('PATH_SEP', '/');
// Defining the Home Directory
$realdocuroot = str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']);
$docuroot = explode(PATH_SEP, $realdocuroot);
// Define the Home Directory
$documentRoot = str_replace('\\', '/', $_SERVER['DOCUMENT_ROOT']);
$pathParts = explode(PATH_SEP, $documentRoot);
array_pop($pathParts); // Remove the last part (usually the project folder)
$pathHome = implode(PATH_SEP, $pathParts) . PATH_SEP;
array_pop($docuroot);
$pathhome = implode(PATH_SEP, $docuroot) . PATH_SEP;
// Define trunk paths
$pathTrunk = implode(PATH_SEP, array_slice($pathParts, 0, -1)) . PATH_SEP; // Remove last part again
$pathOutTrunk = implode(PATH_SEP, array_slice($pathParts, 0, -2)) . PATH_SEP; // Remove last two parts
// try to find automatically the trunk directory where are placed the RBAC and Gulliver directories
// in a normal installation you don't need to change it.
array_pop($docuroot);
$pathTrunk = implode(PATH_SEP, $docuroot) . PATH_SEP;
array_pop($docuroot);
$pathOutTrunk = implode(PATH_SEP, $docuroot) . PATH_SEP;
define('PATH_HOME', $pathhome);
define('PATH_HOME', $pathHome);
define('PATH_TRUNK', $pathTrunk);
define('PATH_OUTTRUNK', $pathOutTrunk);
//we are focusing in have this behaivour
//1. if the uri is an existing file return the file inmediately
//2. if the uri point to png, jpg, js, or css mapped in other place, return it inmediately
//3. process the uri,
//here we are putting approved CONSTANTS, I mean constants be sure we need,
define('PATH_HTML', PATH_HOME . 'public_html' . PATH_SEP);
//this is the first path, if the file exists...
$request = substr($_SERVER['REQUEST_URI'], 1, strlen($_SERVER['REQUEST_URI'])); //removes the first '/'
$fileWithoutParam = explode("?", $request); // split the URI by '?'
$request = $fileWithoutParam[0]; // get the first element of the split URI
$requestFile = PATH_HTML . $request; // temporary assemble a path for the file embedded in the URI
if (file_exists($requestFile)) {
if (!is_file($requestFile)) {
header("location: /errors/error404.php?url=" . urlencode($_SERVER['REQUEST_URI']));
die;
}
if ($request === "app.php" || $request === "sysGeneric.php") {
//HTTP/1.0 403 Forbidden
http_response_code(403);
}
$pos = strripos($request, ".") + 1;
$size = strlen($request);
if ($pos < $size) {
//if this file got an extension then assign the content
$ext_file = substr($request, $pos, $size);
if ($ext_file == "gif" || $ext_file == "png") {
$ext_file = 'image/' . $ext_file;
} elseif ($ext_file == "jpg" || $ext_file == "jpeg") {
$ext_file = 'image/jpeg';
} elseif ($ext_file == "swf") {
$ext_file = "application/x-shockwave-flash";
} elseif ($ext_file == "json" || $ext_file == "htc") {
$ext_file = "text/plain";
} elseif ($ext_file == "htm" || $ext_file == "html" || $ext_file == "txt") {
$ext_file = "text/html";
} elseif ($ext_file == "doc" || $ext_file == "pdf" || $ext_file == "pm" || $ext_file == "po") {
$ext_file = "application/octet-stream";
} elseif ($ext_file == "tar") {
$ext_file = "application/x-tar";
} elseif ($ext_file == "woff") {
$ext_file = "application/font-woff";
} elseif ($ext_file == "js") {
$ext_file = "text/javascript";
} elseif ($ext_file == "css") {
//may this line be innecesary, all the .css are been generated at run time
$ext_file = 'text/css';
} else {
$ext_file = "application/octet-stream";
}
header('Content-Type: ' . $ext_file);
}
header('Pragma: cache');
$mtime = filemtime($requestFile);
$gmt_mtime = gmdate("D, d M Y H:i:s", $mtime) . " GMT";
header('ETag: "' . Bootstrap::encryptOld($mtime . $requestFile) . '"');
header("Last-Modified: " . $gmt_mtime);
header('Cache-Control: public');
$userAgent = strtolower($_SERVER ['HTTP_USER_AGENT']);
if (preg_match("/msie/i", $userAgent)) {
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 60 * 10) . " GMT");
} else {
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 90 * 60 * 60 * 24) . " GMT");
if (isset($_SERVER ['HTTP_IF_MODIFIED_SINCE'])) {
if ($_SERVER ['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime) {
header('HTTP/1.1 304 Not Modified');
}
}
if (isset($_SERVER ['HTTP_IF_NONE_MATCH'])) {
if (str_replace('"', '',
stripslashes($_SERVER ['HTTP_IF_NONE_MATCH'])) == Bootstrap::encryptOld($mtime . $requestFile)) {
header("HTTP/1.1 304 Not Modified");
}
}
}
readfile($requestFile);
die;
}
define('PATH_DATA', isset($_SERVER['PATH_DATA']) ? $_SERVER['PATH_DATA'] : PATH_TRUNK . 'shared' . PATH_SEP );
// Defining RBAC Paths constants
define('PATH_RBAC_HOME', PATH_TRUNK . 'rbac' . PATH_SEP);
@@ -154,29 +67,34 @@ define('PATH_UPLOAD', PATH_HTML . 'files' . PATH_SEP);
define('PATH_WORKFLOW_MYSQL_DATA', PATH_CORE . 'data' . PATH_SEP . 'mysql' . PATH_SEP);
define('PATH_RBAC_MYSQL_DATA', PATH_RBAC_CORE . 'data' . PATH_SEP . 'mysql' . PATH_SEP);
define('FILE_PATHS_INSTALLED', PATH_CORE . 'config' . PATH_SEP . 'paths_installed.php');
define('FILE_PATHS_INSTALLED', PATH_DATA . 'config' . PATH_SEP . 'paths_installed.php');
define('PATH_WORKFLOW_MSSQL_DATA', PATH_CORE . 'data' . PATH_SEP . 'mssql' . PATH_SEP);
define('PATH_RBAC_MSSQL_DATA', PATH_RBAC_CORE . 'data' . PATH_SEP . 'mssql' . PATH_SEP);
define('PATH_CONTROLLERS', PATH_CORE . 'controllers' . PATH_SEP);
// include Gulliver Class
// Return error for local files that should be returned by nginx or apache2
$requestUri = ltrim($_SERVER['REQUEST_URI'], '/'); // Remove leading '/'
$requestFile = PATH_HTML . strtok($requestUri, '?'); // Get the file path without query parameters
if (file_exists($requestFile)) {
error_log("Requested file should not be accessed directly: /" . $requestUri);
print ("This should not happen. Review the rules in nginx or apache server: /" . $requestUri);
exit;
}
// include Gulliver Class and define necessary paths
if (file_exists(FILE_PATHS_INSTALLED)) {
// include the server installed configuration
require_once FILE_PATHS_INSTALLED;
// defining system constant when a valid server environment exists
// defining system constants
define('PATH_LANGUAGECONT', PATH_DATA . "META-INF" . PATH_SEP);
define('PATH_CUSTOM_SKINS', PATH_DATA . 'skins' . PATH_SEP);
define('PATH_TEMPORAL', PATH_C . 'dynEditor/');
define('PATH_DB', PATH_DATA . 'sites' . PATH_SEP);
// smarty constants
define('PATH_SMARTY_C', PATH_C . 'smarty' . PATH_SEP . 'c');
define('PATH_SMARTY_CACHE', PATH_C . 'smarty' . PATH_SEP . 'cache');
/* TO DO: put these line in other part of code*/
Bootstrap::verifyPath(PATH_SMARTY_C, true);
Bootstrap::verifyPath(PATH_SMARTY_CACHE, true);
}
@@ -191,24 +109,18 @@ set_include_path(
);
/**
* Global definitions, before it was the defines.php file
* Global definitions
*/
// URL Key
define("URL_KEY", 'c0l0s40pt1mu59r1m3');
// Other definitions
define('TIMEOUT_RESPONSE', 100); //web service timeout
define('APPLICATION_CODE', 'ProcessMaker'); //to login like workflow system
// Application settings
define('TIMEOUT_RESPONSE', 100); //web service timeout in seconds
define('APPLICATION_CODE', 'ProcessMaker'); //Application code for login
define('MAIN_POFILE', 'processmaker');
define('PO_SYSTEM_VERSION', 'PM 4.0.1');
$G_CONTENT = null;
$G_MESSAGE = "";
$G_MESSAGE_TYPE = "info";
$G_MENU_SELECTED = -1;
$G_MAIN_MENU = "default";
// Environment definitions
define('G_PRO_ENV', 'PRODUCTION');
define('G_DEV_ENV', 'DEVELOPMENT');
@@ -217,35 +129,18 @@ define('G_TEST_ENV', 'TEST');
// Number of files per folder at PATH_UPLOAD (cases documents)
define('APPLICATION_DOCUMENTS_PER_FOLDER', 1000);
// Global variables for application state (menus)
$G_CONTENT = null;
$G_MESSAGE = "";
$G_MESSAGE_TYPE = "info";
$G_MENU_SELECTED = -1;
$G_MAIN_MENU = "default";
G::defineConstants();
$config = Bootstrap::getSystemConfiguration();
// starting session
if (isset($config['session.gc_maxlifetime'])) {
$timelife = $config['session.gc_maxlifetime'];
} else {
$timelife = ini_get('session.gc_maxlifetime');
}
if (is_null($timelife)) {
$timelife = 1440;
}
ini_set('session.gc_maxlifetime', $timelife);
if ((preg_match("/msie/i", $_SERVER ['HTTP_USER_AGENT']) != 1 ||
$config['ie_cookie_lifetime'] == 1) &&
(!(preg_match("/safari/i", $_SERVER ['HTTP_USER_AGENT']) == 1 && preg_match("/chrome/i",
$_SERVER ['HTTP_USER_AGENT']) == 0) ||
$config['safari_cookie_lifetime'] == 1)) {
ini_set('session.cookie_lifetime', $timelife);
}
if (!(array_key_exists('REMOTE_USER', $_SERVER) && (string) ($_SERVER['REMOTE_USER']) != '')) {
ini_set('session.cookie_httponly', 1);
if (G::is_https()) {
ini_set('session.cookie_secure', 1);
}
}
session_start();
// Call the function to initialize the session
$config = Bootstrap::getSystemConfiguration(); //to do: review
Bootstrap::initializeSession($config);
//Set Time Zone
$_SESSION['__SYSTEM_UTC_TIME_ZONE__'] = (int)($config['system_utc_time_zone']) == 1;
@@ -286,8 +181,8 @@ $_SERVER['SERVER_ADDR'] = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR
//to do: make different environments. sys
//check if it is a installation instance
if (!defined('PATH_C')) {
//check if it is a installation instance
if (!defined('PATH_C')) { // to do: review
// is a intallation instance, so we need to define PATH_C and PATH_LANGUAGECONT constants temporarily
define('PATH_C', (rtrim(Bootstrap::sys_get_temp_dir(), PATH_SEP) . PATH_SEP));
define('PATH_LANGUAGECONT', PATH_HOME . 'engine/content/languages/');
@@ -304,10 +199,8 @@ $virtualURITable['/(sys\w{0,})/(\w{0,}.js)'] = 'jsMethod';
$virtualURITable['/js/(*)'] = PATH_GULLIVER_HOME . 'js/';
$virtualURITable['/jscore/(*)'] = PATH_CORE . 'js/';
if (defined('PATH_C')) {
$virtualURITable['/jsform/(*.js)'] = PATH_C . 'xmlform/';
$virtualURITable['/extjs/(*)'] = PATH_C . 'ExtJs/';
}
$virtualURITable['/jsform/(*.js)'] = PATH_C . 'xmlform/';
$virtualURITable['/extjs/(*)'] = PATH_C . 'ExtJs/';
$virtualURITable['/htmlarea/(*)'] = PATH_THIRDPARTY . 'htmlarea/';
//$virtualURITable['/sys[a-zA-Z][a-zA-Z0-9]{0,}()/'] = 'sysNamed';
@@ -353,7 +246,7 @@ if (Bootstrap::virtualURI($_SERVER['REQUEST_URI'], $virtualURITable, $realPath))
if (file_exists($pluginFilename)) {
Bootstrap::streamFile($pluginFilename, false, '', true);
}
die();
exit();
}
$requestUriArray = explode("/", $_SERVER['REQUEST_URI']);
@@ -378,7 +271,7 @@ if (Bootstrap::virtualURI($_SERVER['REQUEST_URI'], $virtualURITable, $realPath))
if (file_exists($fileToBeStreamed)) {
Bootstrap::streamFile($fileToBeStreamed);
}
die();
exit();
}
switch ($realPath) {
@@ -386,7 +279,7 @@ if (Bootstrap::virtualURI($_SERVER['REQUEST_URI'], $virtualURITable, $realPath))
Bootstrap::parseURI(getenv("REQUEST_URI"));
$filename = PATH_METHODS . SYS_COLLECTION . '/' . SYS_TARGET . '.js';
Bootstrap::streamFile($filename);
die();
exit();
break;
case 'errorFile':
ob_start();
@@ -394,14 +287,14 @@ if (Bootstrap::virtualURI($_SERVER['REQUEST_URI'], $virtualURITable, $realPath))
if (DEBUG_TIME_LOG) {
Bootstrap::logTimeByPage();
} //log this page
die();
exit();
break;
default:
//Process files loaded with tag head in HTML
$realPath = explode('?', $realPath);
$realPath[0] .= strpos(basename($realPath[0]), '.') === false ? '.php' : '';
Bootstrap::streamFile($realPath[0]);
die();
exit();
}
} //virtual URI parser
@@ -427,6 +320,7 @@ if (isset($arrayUpdating['action']) && $arrayUpdating['action']) {
die();
}
}
Bootstrap::logTimeByPage();
// verify if index.html exists
if (!file_exists(PATH_HTML . 'index.html')) { // if not, create it from template
@@ -436,23 +330,23 @@ if (!file_exists(PATH_HTML . 'index.html')) { // if not, create it from template
)));
}
define('SYS_URI', '/sys' . SYS_TEMP . '/' . SYS_LANG . '/' . SYS_SKIN . '/');
// defining the serverConf singleton
if (defined('PATH_DATA') && file_exists(PATH_DATA)) {
if (defined('PATH_DB') && file_exists(PATH_DB)) {
//Instance Server Configuration Singleton
$oServerConf = ServerConf::getSingleton();
}
// Create headPublisher singleton
$oHeadPublisher = headPublisher::getSingleton();
// Installer, redirect to install if we don't have a valid shared data folder
if (!defined('PATH_DATA') || !file_exists(PATH_DATA)) {
if (!defined('PATH_DB') || !file_exists(PATH_DB)) {
// new installer, extjs based
define( 'PATH_DATA', PATH_C );
//important to start laravel classes
app()->useStoragePath(realpath(PATH_DATA));
app()->make(Kernel::class)->bootstrap();
@@ -481,7 +375,7 @@ if (!defined('PATH_DATA') || !file_exists(PATH_DATA)) {
$_SESSION['phpFileNotFound'] = $_SERVER['REQUEST_URI'];
header("location: /errors/error404.php?url=" . urlencode($_SERVER['REQUEST_URI']));
}
die();
exit();
}
app()->useStoragePath(realpath(PATH_DATA));
@@ -850,7 +744,13 @@ if (!defined('EXECUTE_BY_CRON')) {
(!(preg_match("/safari/i", $_SERVER ['HTTP_USER_AGENT']) == 1 && preg_match("/chrome/i",
$_SERVER ['HTTP_USER_AGENT']) == 0) ||
$config['safari_cookie_lifetime'] == 1)) {
$cookieOptions = Bootstrap::buildCookieOptions(['expires' => time() + $timelife, 'httponly' => true]);
// Determine session lifetime
$sessionLifetime = isset($config['session.gc_maxlifetime']) ? $config['session.gc_maxlifetime'] : ini_get('session.gc_maxlifetime');
// Default to 1440 seconds (24 minutes) if lifetime is not set
if (is_null($sessionLifetime)) {
$sessionLifetime = 1440;
}
$cookieOptions = Bootstrap::buildCookieOptions(['expires' => time() + $sessionLifetime, 'httponly' => true]);
setcookie(session_name(), session_id(), $cookieOptions);
}
$RBAC->initRBAC();