From 16addc4f4b533578ce30704ea0361844d49c997b Mon Sep 17 00:00:00 2001 From: Clemens Schwaighofer Date: Thu, 5 Dec 2024 14:06:44 +0900 Subject: [PATCH] CoreLibs version update --- www/admin/class_test.db.php | 4 +- www/admin/class_test.lang.php | 22 +- www/admin/class_test.php | 4 +- www/admin/class_test.session.php | 117 +++--- www/admin/class_test.session.read.php | 25 +- www/composer.lock | 2 +- www/vendor/composer/installed.json | 2 +- www/vendor/composer/installed.php | 2 +- .../publish/last.published | 2 +- .../corelibs-composer-all/src/ACL/Login.php | 148 ++++--- .../src/Admin/Backend.php | 16 +- .../src/Create/Session.php | 344 ++++++++++------ .../src/Output/Form/Token.php | 2 +- .../test/phpunit/ACL/CoreLibsACLLoginTest.php | 20 +- .../Create/CoreLibsCreateSessionTest.php | 372 ++++++++---------- 15 files changed, 580 insertions(+), 502 deletions(-) diff --git a/www/admin/class_test.db.php b/www/admin/class_test.db.php index 6212c768..1326a023 100644 --- a/www/admin/class_test.db.php +++ b/www/admin/class_test.db.php @@ -228,7 +228,7 @@ print "RETURN ROW PARAMS: " . print_r( $db->dbPrepare("ins_test_foo", "INSERT INTO test_foo (test) VALUES ($1) RETURNING test"); $status = $db->dbExecute("ins_test_foo", ['BAR TEST ' . time()]); print "PREPARE INSERT[ins_test_foo] STATUS: " . Support::printToString($status) . " |
" - . "QUERY: " . $db->dbGetPrepareCursorValue('ins_test_foo', 'query') . " |
" + . "QUERY: " . Support::printToString($db->dbGetPrepareCursorValue('ins_test_foo', 'query')) . " |
" . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true) . "
"; @@ -255,7 +255,7 @@ SQL; $db->dbPrepare("ins_test_foo_eom", $query); $status = $db->dbExecute("ins_test_foo_eom", ['EOM BAR TEST ' . time()]); print "EOM STRING PREPARE INSERT[ins_test_foo_eom] STATUS: " . Support::printToString($status) . " |
" - . "QUERY: " . $db->dbGetPrepareCursorValue('ins_test_foo_eom', 'query') . " |
" + . "QUERY: " . Support::printToString($db->dbGetPrepareCursorValue('ins_test_foo_eom', 'query')) . " |
" . "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | " . "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | " . "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true) . "
"; diff --git a/www/admin/class_test.lang.php b/www/admin/class_test.lang.php index 756a5992..43a217e3 100644 --- a/www/admin/class_test.lang.php +++ b/www/admin/class_test.lang.php @@ -16,6 +16,8 @@ define('USE_DATABASE', false); require 'config.php'; // define log file id $LOG_FILE_ID = 'classTest-lang'; +$SET_SESSION_NAME = EDIT_SESSION_NAME; +$session = new CoreLibs\Create\Session($SET_SESSION_NAME); ob_end_flush(); $PAGE_NAME = 'TEST CLASS: LANG'; @@ -70,10 +72,12 @@ print "[OVERRIDE]: " . Support::printAr($get_locale) . "
"; // DEFAULT_DOMAIN // DEFAULT_CHARSET (should be set from DEFAULT_LOCALE) // LOCALE_PATH -$_SESSION['DEFAULT_LOCALE'] = 'ja_JP.UTF-8'; -$_SESSION['DEFAULT_CHARSET'] = 'UTF-8'; -$_SESSION['DEFAULT_DOMAIN'] = 'admin'; -$_SESSION['LOCALE_PATH'] = BASE . INCLUDES . LOCALE; +$session->setMany([ + 'DEFAULT_LOCALE' => 'ja_JP.UTF-8', + 'DEFAULT_CHARSET' => 'UTF-8', + 'DEFAULT_DOMAIN' => 'admin', + 'LOCALE_PATH' => BASE . INCLUDES . LOCALE, +]); $get_locale = Language\GetLocale::setLocaleFromSession( SITE_LOCALE, SITE_DOMAIN, @@ -86,10 +90,12 @@ print "[SESSION SET]: " . Support::printAr($get_locale) . "
"; // DEFAULT_DOMAIN // DEFAULT_CHARSET (should be set from DEFAULT_LOCALE) // LOCALE_PATH -$_SESSION['DEFAULT_LOCALE'] = '00000#####'; -$_SESSION['DEFAULT_CHARSET'] = ''; -$_SESSION['DEFAULT_DOMAIN'] = 'admin'; -$_SESSION['LOCALE_PATH'] = BASE . INCLUDES . LOCALE; +$session->setMany([ + 'DEFAULT_LOCALE' => '00000#####', + 'DEFAULT_CHARSET' => '', + 'DEFAULT_DOMAIN' => 'admin', + 'LOCALE_PATH' => BASE . INCLUDES . LOCALE, +]); $get_locale = Language\GetLocale::setLocaleFromSession( SITE_LOCALE, SITE_DOMAIN, diff --git a/www/admin/class_test.php b/www/admin/class_test.php index 3b75efc8..8b88bfe6 100644 --- a/www/admin/class_test.php +++ b/www/admin/class_test.php @@ -205,8 +205,8 @@ print "HOST: " . HOST_NAME . " => DB HOST: " . DB_CONFIG_NAME . " => " . Support print "DS is: " . DIRECTORY_SEPARATOR . "
"; print "SERVER HOST: " . $_SERVER['HTTP_HOST'] . "
"; -print "ECUID: " . $_SESSION['ECUID'] . "
"; -print "ECUUID: " . $_SESSION['ECUUID'] . "
"; +print "ECUID: " . $session->get('ECUID') . "
"; +print "ECUUID: " . $session->get('ECUUID') . "
"; print ""; diff --git a/www/admin/class_test.session.php b/www/admin/class_test.session.php index b0a9ba46..ed9439ef 100644 --- a/www/admin/class_test.session.php +++ b/www/admin/class_test.session.php @@ -45,8 +45,8 @@ $log = new CoreLibs\Logging\Logging([ 'log_file_id' => $LOG_FILE_ID, 'log_per_date' => true, ]); +use CoreLibs\Debug\Support; use CoreLibs\Create\Session; -$session = new Session(); $PAGE_NAME = 'TEST CLASS: SESSION'; print ""; @@ -56,50 +56,30 @@ print '
Class Test Master
'; print '

' . $PAGE_NAME . '

'; $session_name = 'class-test-session'; +print "Valid session name static check for '" . $session_name . "': " + . Support::prBl(Session::checkValidSessionName($session_name)) . "
"; $var = 'foo'; $value = 'bar'; +$session = new Session($session_name); foreach (['123', '123-123', '123abc'] as $_session_name) { - print "[UNSET] Session Name valid for " . $_session_name . ": " + print "[UNSET] Session Name valid for '" . $_session_name . "': " . ($session->checkValidSessionName($_session_name) ? 'Valid' : 'Invalid') . "
"; } echo "Global session name: " . ($GLOBALS['SET_SESSION_NAME'] ?? '-') . "
"; -print "[UNSET] Current session id: " . $session->getSessionId() . "
"; -print "[UNSET] Current session name: " . $session->getSessionName() . "
"; -print "[UNSET] Current session active: " . ($session->checkActiveSession() ? 'Yes' : 'No') . "
"; -print "[UNSET] Current session status: " . getSessionStatusString($session->getSessionStatus()) . "
"; -if (isset($_SESSION)) { - print "[UNSET] _SESSION is: set
"; -} else { - print "[UNSET] _SESSION is: not set
"; -} -# -print "[UNSET] To set session name valid: " - . ($session->checkValidSessionName($session_name) ? 'Valid' : 'Invalid') . "
"; -try { - $session_id = $session->startSession($session_name); - print "[SET] Current session id: " . $session_id . "
"; -} catch (\Exception $e) { - print "[FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "
"; -} -// set again -try { - $session_id = $session->startSession($session_name); - print "[2 SET] Current session id: " . $session_id . "
"; -} catch (\Exception $e) { - print "[2 FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "
"; -} print "[SET] Current session id: " . $session->getSessionId() . "
"; print "[SET] Current session name: " . $session->getSessionName() . "
"; print "[SET] Current session active: " . ($session->checkActiveSession() ? 'Yes' : 'No') . "
"; +print "[SET] Current session auto write close: " . ($session->checkAutoWriteClose() ? 'Yes' : 'No') . "
"; print "[SET] Current session status: " . getSessionStatusString($session->getSessionStatus()) . "
"; if (isset($_SESSION)) { print "[SET] _SESSION is: set
"; } else { print "[SET] _SESSION is: not set
"; } +# if (!isset($_SESSION['counter'])) { $_SESSION['counter'] = 0; } @@ -111,62 +91,85 @@ print "[READ] Confirm " . $var . " is " . $value . ": " . (($_SESSION[$var] ?? '') == $value ? 'Matching' : 'Not matching') . "
"; // test set wrappers methods -$session->setS('setwrap', 'YES, method set _SESSION var'); -print "[READ WRAP] A setwrap: " . $session->getS('setwrap') . "
"; -print "[READ WRAP] Isset: " . ($session->issetS('setwrap') ? 'Yes' : 'No') . "
"; -$session->unsetS('setwrap'); -print "[READ WRAP] unset setwrap: " . $session->getS('setwrap') . "
"; -print "[READ WRAP] unset Isset: " . ($session->issetS('setwrap') ? 'Yes' : 'No') . "
"; -// test __get/__set -$session->setwrap = 'YES, magic set _SESSION var'; /** @phpstan-ignore-line GET/SETTER */ -print "[READ MAGIC] A setwrap: " . ($session->setwrap ?? '') . "
"; -print "[READ MAGIC] Isset: " . (isset($session->setwrap) ? 'Yes' : 'No') . "
"; -unset($session->setwrap); -print "[READ MAGIC] unset setwrap: " . ($session->setwrap ?? '') . "
"; -print "[READ MAGIC] unset Isset: " . (isset($session->setwrap) ? 'Yes' : 'No') . "
"; +$session->set('setwrap', 'YES, method set _SESSION var'); +print "[READ WRAP] A setwrap: " . $session->get('setwrap') . "
"; +print "[READ WRAP] Isset: " . ($session->isset('setwrap') ? 'Yes' : 'No') . "
"; +$session->unset('setwrap'); +print "[READ WRAP] unset setwrap: " . $session->get('setwrap') . "
"; +print "[READ WRAP] unset Isset: " . ($session->isset('setwrap') ? 'Yes' : 'No') . "
"; +$session->set('foo 3', 'brause'); +// set many +$session->setMany([ + 'foo 1' => 'bar', + 'foo 2' => 'kamel', +]); +print "[READ MANY]: " . Support::printAr($session->getMany(['foo 1', 'foo 2'])) . "
"; +try { + $session->setMany([ /** @phpstan-ignore-line deliberate error */ + 'ok' => 'ok', + 'a123' => 'bar', + 1 => 'bar', + ]); +} catch (\Exception $e) { + print "FAILED] Session manySet failed:
" . $e->getMessage() . "
" . $e . "

"; +} +try { + $session->set('123', 'illigal'); +} catch (\Exception $e) { + print "FAILED] Session set failed:
" . $e->getMessage() . "
" . $e . "

"; +} +print "
"; // differnt session name $session_name = 'class-test-session-ALT'; try { - $session_id = $session->startSession($session_name); - print "[3 SET] Current session id: " . $session_id . "
"; + $session_alt = new Session($session_name); + print "[3 SET] Current session id: " . $session_alt->getSessionId() . "
"; + print "[SET AGAIN] Current session id: " . $session_alt->getSessionId() . "
"; } catch (\Exception $e) { - print "[3 FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "
"; + print "[3 FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "

"; } -print "[SET AGAIN] Current session id: " . $session->getSessionId() . "
"; -print "[ALL SESSION]: " . \CoreLibs\Debug\Support::printAr($_SESSION) . "
"; + +print "[ALL SESSION]: " . Support::printAr($_SESSION) . "
"; // close session $session->writeClose(); // will never be written $_SESSION['will_never_be_written'] = 'empty'; +// auto open session if closed to write +$session->set('auto_write_session', 'Some value'); +// restart session +$session->restartSession(); +$_SESSION['this_will_be_written'] = 'not empty'; -// open again +// open again with same name $session_name = 'class-test-session'; try { - $session_id = $session->startSession($session_name); - print "[4 SET] Current session id: " . $session_id . "
"; + $session_alt = new Session($session_name, auto_write_close:true); + print "[4 SET] Current session id: " . $session_alt->getSessionId() . "
"; + print "[4 SET] Current session auto write close: " . ($session_alt->checkAutoWriteClose() ? 'Yes' : 'No') . "
"; + print "[START AGAIN] Current session id: " . $session_alt->getSessionId() . "
"; + $session_alt->set('alt_write_auto_close', 'set auto'); + // below is deprecated + // $session_alt->do_not_do_this = 'foo bar auto set'; } catch (\Exception $e) { - print "[4 FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "
"; + print "[4 FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "

"; } -print "[START AGAIN] Current session id: " . $session->getSessionId() . "
"; $_SESSION['will_be_written_again'] = 'Full'; +print "[ALL SESSION]: " . Support::printAr($_SESSION) . "
"; + // close session $session->writeClose(); // invalid $session_name = '123'; try { - $session_id = $session->startSession($session_name); - print "[5 SET] Current session id: " . $session_id . "
"; + $session_bad = new Session($session_name); + print "[5 SET] Current session id: " . $session_bad->getSessionId() . "
"; } catch (\Exception $e) { - print "[5 FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "
"; + print "[5 FAILED] Session start failed:
" . $e->getMessage() . "
" . $e . "

"; } -print "[BAD NAME] Current session id: " . $session->getSessionId() . "
"; -print "[BAD NAME] Current session name: " . $session->getSessionName() . "
"; -print "[BAD NAME] Current session active: " . ($session->checkActiveSession() ? 'Yes' : 'No') . "
"; -print "[BAD NAME] Current session status: " . getSessionStatusString($session->getSessionStatus()) . "
"; print ""; diff --git a/www/admin/class_test.session.read.php b/www/admin/class_test.session.read.php index 09b2330f..b2e6e8e3 100644 --- a/www/admin/class_test.session.read.php +++ b/www/admin/class_test.session.read.php @@ -46,7 +46,6 @@ $log = new CoreLibs\Logging\Logging([ 'log_per_date' => true, ]); use CoreLibs\Create\Session; -$session = new Session(); $PAGE_NAME = 'TEST CLASS: SESSION (READ)'; print ""; @@ -56,32 +55,22 @@ print '
Class Test Master
'; print '

' . $PAGE_NAME . '

'; $session_name = 'class-test-session'; +$session = new Session($session_name); // $session_name = ''; $var = 'foo'; $value = 'bar'; echo "Global session name: " . ($GLOBALS['SET_SESSION_NAME'] ?? '-') . "
"; -print "[UNSET] Current session id: " . $session->getSessionId() . "
"; -print "[UNSET] Current session name: " . $session->getSessionName() . "
"; -print "[UNSET] Current session active: " . ($session->checkActiveSession() ? 'Yes' : 'No') . "
"; -print "[UNSET] Current session status: " . getSessionStatusString($session->getSessionStatus()) . "
"; +print "[SET] Current session id: " . $session->getSessionId() . "
"; +print "[SET] Current session name: " . $session->getSessionName() . "
"; +print "[SET] Current session active: " . ($session->checkActiveSession() ? 'Yes' : 'No') . "
"; +print "[SET] Current session status: " . getSessionStatusString($session->getSessionStatus()) . "
"; print "[READ] " . $var . ": " . ($_SESSION[$var] ?? '{UNSET}') . "
"; -// start -try { - $session_id = $session->startSession($session_name); - print "[1] Current session id: " . $session_id . "
"; -} catch (\Exception $e) { - print "[1] Session start failed:
" . $e->getMessage() . "
" . $e . "
"; -} + // set again -try { - $session_id = $session->startSession($session_name); - print "[2] Current session id: " . $session_id . "
"; -} catch (\Exception $e) { - print "[2] Session start failed:
" . $e->getMessage() . "
" . $e . "
"; -} +print "[2] Restarted session: " . \CoreLibs\Debug\Support::prBl($session->restartSession()) . "
"; print "[SET] Current session id: " . $session->getSessionId() . "
"; print "[SET] Current session name: " . $session->getSessionName() . "
"; print "[SET] Current session active: " . ($session->checkActiveSession() ? 'Yes' : 'No') . "
"; diff --git a/www/composer.lock b/www/composer.lock index 33d63db4..44543116 100644 --- a/www/composer.lock +++ b/www/composer.lock @@ -12,7 +12,7 @@ "dist": { "type": "path", "url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All", - "reference": "c5bd16de74f40f40982269726d95cad9699a882d" + "reference": "157616582ff59dc689e7af0b94f60013bb678d90" }, "require": { "php": ">=8.2", diff --git a/www/vendor/composer/installed.json b/www/vendor/composer/installed.json index ace477cf..7da67e5d 100644 --- a/www/vendor/composer/installed.json +++ b/www/vendor/composer/installed.json @@ -7,7 +7,7 @@ "dist": { "type": "path", "url": "/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All", - "reference": "c5bd16de74f40f40982269726d95cad9699a882d" + "reference": "157616582ff59dc689e7af0b94f60013bb678d90" }, "require": { "php": ">=8.2", diff --git a/www/vendor/composer/installed.php b/www/vendor/composer/installed.php index 1d4103f7..ff2fd8ef 100644 --- a/www/vendor/composer/installed.php +++ b/www/vendor/composer/installed.php @@ -13,7 +13,7 @@ 'egrajp/corelibs-composer-all' => array( 'pretty_version' => 'dev-development', 'version' => 'dev-development', - 'reference' => 'c5bd16de74f40f40982269726d95cad9699a882d', + 'reference' => '157616582ff59dc689e7af0b94f60013bb678d90', 'type' => 'library', 'install_path' => __DIR__ . '/../egrajp/corelibs-composer-all', 'aliases' => array(), diff --git a/www/vendor/egrajp/corelibs-composer-all/publish/last.published b/www/vendor/egrajp/corelibs-composer-all/publish/last.published index 6fe70789..b8edb479 100644 --- a/www/vendor/egrajp/corelibs-composer-all/publish/last.published +++ b/www/vendor/egrajp/corelibs-composer-all/publish/last.published @@ -1 +1 @@ -9.21.1 +9.23.0 diff --git a/www/vendor/egrajp/corelibs-composer-all/src/ACL/Login.php b/www/vendor/egrajp/corelibs-composer-all/src/ACL/Login.php index 48a73282..691b03d6 100644 --- a/www/vendor/egrajp/corelibs-composer-all/src/ACL/Login.php +++ b/www/vendor/egrajp/corelibs-composer-all/src/ACL/Login.php @@ -372,9 +372,6 @@ class Login ], ]; - // init default ACL list array - $_SESSION['DEFAULT_ACL_LIST'] = []; - $_SESSION['DEFAULT_ACL_LIST_TYPE'] = []; // read the current edit_access_right list into an array $q = "SELECT level, type, name FROM edit_access_right " . "WHERE level >= 0 ORDER BY level"; @@ -387,8 +384,10 @@ class Login $this->default_acl_list_type[(string)$res['type']] = (int)$res['level']; } // write that into the session - $_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list; - $_SESSION['DEFAULT_ACL_LIST_TYPE'] = $this->default_acl_list_type; + $this->session->setMany([ + 'DEFAULT_ACL_LIST' => $this->default_acl_list, + 'DEFAULT_ACL_LIST_TYPE' => $this->default_acl_list_type, + ]); $this->loginSetEditLogWriteTypeAvailable(); @@ -580,7 +579,7 @@ class Login // set path $options['locale_path'] = BASE . INCLUDES . LOCALE; } - $_SESSION['LOCALE_PATH'] = $options['locale_path']; + $this->session->set('LOCALE_PATH', $options['locale_path']); // LANG: LOCALE if (empty($options['site_locale'])) { trigger_error( @@ -615,7 +614,7 @@ class Login $options['set_domain'] = str_replace(DIRECTORY_SEPARATOR, '', CONTENT_PATH); } } - $_SESSION['DEFAULT_DOMAIN'] = $options['site_domain']; + $this->session->set('DEFAULT_DOMAIN', $options['site_domain']); // LANG: ENCODING if (empty($options['site_encoding'])) { trigger_error( @@ -901,9 +900,14 @@ class Login } // normal user processing // set class var and session var - $_SESSION['EUID'] = $this->euid = (int)$res['edit_user_id']; - $_SESSION['ECUID'] = $this->ecuid = (string)$res['cuid']; - $_SESSION['ECUUID'] = $this->ecuuid = (string)$res['cuuid']; + $this->euid = (int)$res['edit_user_id']; + $this->ecuid = (string)$res['cuid']; + $this->ecuuid = (string)$res['cuuid']; + $this->session->setMany([ + 'EUID' => $this->euid, + 'ECUID' => $this->ecuid, + 'ECUUID' => $this->ecuuid, + ]); // check if user is okay $this->loginCheckPermissions(); if ($this->login_error == 0) { @@ -916,27 +920,39 @@ class Login . "WHERE edit_user_id = " . $this->euid; $this->db->dbExec($q); } - // now set all session vars and read page permissions - $_SESSION['DEBUG_ALL'] = $this->db->dbBoolean($res['debug']); - $_SESSION['DB_DEBUG'] = $this->db->dbBoolean($res['db_debug']); - // general info for user logged in - $_SESSION['USER_NAME'] = $res['username']; - $_SESSION['ADMIN'] = $res['admin']; - $_SESSION['GROUP_NAME'] = $res['edit_group_name']; - $_SESSION['USER_ACL_LEVEL'] = $res['user_level']; - $_SESSION['USER_ACL_TYPE'] = $res['user_type']; - $_SESSION['USER_ADDITIONAL_ACL'] = Json::jsonConvertToArray($res['user_additional_acl']); - $_SESSION['GROUP_ACL_LEVEL'] = $res['group_level']; - $_SESSION['GROUP_ACL_TYPE'] = $res['group_type']; - $_SESSION['GROUP_ADDITIONAL_ACL'] = Json::jsonConvertToArray($res['group_additional_acl']); - // deprecated TEMPLATE setting - $_SESSION['TEMPLATE'] = $res['template'] ? $res['template'] : ''; - $_SESSION['HEADER_COLOR'] = !empty($res['second_header_color']) ? - $res['second_header_color'] : - $res['first_header_color']; + $locale = $res['locale'] ?? 'en'; + $encoding = $res['encoding'] ?? 'UTF-8'; + $this->session->setMany([ + // now set all session vars and read page permissions + 'DEBUG_ALL' => $this->db->dbBoolean($res['debug']), + 'DB_DEBUG' => $this->db->dbBoolean($res['db_debug']), + // general info for user logged in + 'USER_NAME' => $res['username'], + 'ADMIN' => $res['admin'], + 'GROUP_NAME' => $res['edit_group_name'], + 'USER_ACL_LEVEL' => $res['user_level'], + 'USER_ACL_TYPE' => $res['user_type'], + 'USER_ADDITIONAL_ACL' => Json::jsonConvertToArray($res['user_additional_acl']), + 'GROUP_ACL_LEVEL' => $res['group_level'], + 'GROUP_ACL_TYPE' => $res['group_type'], + 'GROUP_ADDITIONAL_ACL' => Json::jsonConvertToArray($res['group_additional_acl']), + // deprecated TEMPLATE setting + 'TEMPLATE' => $res['template'] ? $res['template'] : '', + 'HEADER_COLOR' => !empty($res['second_header_color']) ? + $res['second_header_color'] : + $res['first_header_color'], + // LANGUAGE/LOCALE/ENCODING: + 'LANG' => $locale, + 'DEFAULT_CHARSET' => $encoding, + 'DEFAULT_LOCALE' => $locale . '.' . strtoupper($encoding), + 'DEFAULT_LANG' => $locale . '_' . strtolower(str_replace('-', '', $encoding)) + ]); // missing # before, this is for legacy data, will be deprecated - if (preg_match("/^[\dA-Fa-f]{6,8}$/", $_SESSION['HEADER_COLOR'])) { - $_SESSION['HEADER_COLOR'] = '#' . $_SESSION['HEADER_COLOR']; + if ( + !empty($this->session->get('HEADER_COLOR')) && + preg_match("/^[\dA-Fa-f]{6,8}$/", $this->session->get('HEADER_COLOR')) + ) { + $this->session->set('HEADER_COLOR', '#' . $this->session->get('HEADER_COLOR')); } // TODO: make sure that header color is valid: // # + 6 hex @@ -945,13 +961,6 @@ class Login // rgb: nnn.n for each // hsl: nnn.n for first, nnn.n% for 2nd, 3rd // Check\Colors::validateColor() - // LANGUAGE/LOCALE/ENCODING: - $_SESSION['LANG'] = $res['locale'] ?? 'en'; - $_SESSION['DEFAULT_CHARSET'] = $res['encoding'] ?? 'UTF-8'; - $_SESSION['DEFAULT_LOCALE'] = $_SESSION['LANG'] - . '.' . strtoupper($_SESSION['DEFAULT_CHARSET']); - $_SESSION['DEFAULT_LANG'] = $_SESSION['LANG'] . '_' - . strtolower(str_replace('-', '', $_SESSION['DEFAULT_CHARSET'])); // reset any login error count for this user if ($res['login_error_count'] > 0) { $q = "UPDATE edit_user " @@ -1041,8 +1050,10 @@ class Login ]; } // write back the pages data to the output array - $_SESSION['PAGES'] = $pages; - $_SESSION['PAGES_ACL_LEVEL'] = $pages_acl; + $this->session->setMany([ + 'PAGES' => $pages, + 'PAGES_ACL_LEVEL' => $pages_acl, + ]); // load the edit_access user rights $q = "SELECT ea.edit_access_id, level, type, ea.name, " . "ea.color, ea.uid, edit_default, ea.additional_acl " @@ -1054,6 +1065,7 @@ class Login $unit_access = []; $eauid = []; $unit_acl = []; + $unit_uid = []; while (is_array($res = $this->db->dbReturn($q))) { // read edit access data fields and drop them into the unit access array $q_sub = "SELECT name, value " @@ -1077,16 +1089,19 @@ class Login ]; // set the default unit if ($res['edit_default']) { - $_SESSION['UNIT_DEFAULT'] = (int)$res['edit_access_id']; + $this->session->set('UNIT_DEFAULT', (int)$res['edit_access_id']); } - $_SESSION['UNIT_UID'][$res['uid']] = (int)$res['edit_access_id']; + $unit_uid[$res['uid']] = (int)$res['edit_access_id']; // sub arrays for simple access array_push($eauid, $res['edit_access_id']); $unit_acl[$res['edit_access_id']] = $res['level']; } - $_SESSION['UNIT'] = $unit_access; - $_SESSION['UNIT_ACL_LEVEL'] = $unit_acl; - $_SESSION['EAID'] = $eauid; + $this->session->setMany([ + 'UNIT_UID' => $unit_uid, + 'UNIT' => $unit_access, + 'UNIT_ACL_LEVEL' => $unit_acl, + 'EAID' => $eauid, + ]); } // user has permission to THIS page } // user was not enabled or other login error if ($this->login_error && is_array($res)) { @@ -1182,7 +1197,7 @@ class Login $this->acl['base'] = (int)$_SESSION['USER_ACL_LEVEL']; } } - $_SESSION['BASE_ACL_LEVEL'] = $this->acl['base']; + $this->session->set('BASE_ACL_LEVEL', $this->acl['base']); // set the current page acl // start with base acl @@ -1889,13 +1904,13 @@ HTML; ), [ // row 1 - empty($username) ? $_SESSION['USER_NAME'] ?? '' : $username, - !empty($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? - $_SESSION['EUID'] : null, - !empty($_SESSION['ECUID']) && is_string($_SESSION['ECUID']) ? - $_SESSION['ECUID'] : null, - !empty($_SESSION['ECUUID']) && Uids::validateUuuidv4($_SESSION['ECUUID']) ? - $_SESSION['ECUUID'] : null, + empty($username) ? $this->session->get('USER_NAME') ?? '' : $username, + is_numeric($this->session->get('EUID')) ? + $this->session->get('EUID') : null, + is_string($this->session->get('ECUID')) ? + $this->session->get('ECUID') : null, + !empty($this->session->get('ECUUID')) && Uids::validateUuuidv4($this->session->get('ECUUID')) ? + $this->session->get('ECUUID') : null, (string)$event, (string)$error, $data_write, @@ -1913,7 +1928,7 @@ HTML; $_SERVER['HTTP_ACCEPT'] ?? null, $_SERVER['HTTP_ACCEPT_CHARSET'] ?? null, $_SERVER['HTTP_ACCEPT_ENCODING'] ?? null, - $this->session->getSessionId() !== false ? + $this->session->getSessionId() !== '' ? $this->session->getSessionId() : null, // row 4 $action_set['action'] ?? null, @@ -2022,10 +2037,10 @@ HTML; } } // if there is none, there is none, saves me POST/GET check - $this->euid = array_key_exists('EUID', $_SESSION) ? (int)$_SESSION['EUID'] : 0; + $this->euid = (int)($this->session->get('EUID') ?? 0); // TODO: allow load from cuid - // $this->ecuid = array_key_exists('ECUID', $_SESSION) ? (string)$_SESSION['ECUID'] : ''; - // $this->ecuuid = array_key_exists('ECUUID', $_SESSION) ? (string)$_SESSION['ECUUID'] : ''; + // $this->ecuid = (string)($this->session->get('ECUID') ?? ''); + // $this->ecuuid = (string)($this->session->get('ECUUID') ?? ''); // get login vars, are so, can't be changed // prepare // pass on vars to Object vars @@ -2368,8 +2383,12 @@ HTML; $this->login_error = 103; } // set ECUID - $_SESSION['ECUID'] = $this->ecuid = (string)$res['cuid']; - $_SESSION['ECUUID'] = $this->ecuuid = (string)$res['cuuid']; + $this->ecuid = (string)$res['cuid']; + $this->ecuuid = (string)$res['cuuid']; + $this->session->setMany([ + 'ECUID' => $this->ecuid, + 'ECUUID' => $this->ecuuid, + ]); // if called from public, so we can check if the permissions are ok return $this->permission_okay; } @@ -2515,13 +2534,12 @@ HTML; { if ( $edit_access_id !== null && - isset($_SESSION['UNIT']) && - is_array($_SESSION['UNIT']) && - !array_key_exists($edit_access_id, $_SESSION['UNIT']) + is_array($this->session->get('UNIT')) && + !array_key_exists($edit_access_id, $this->session->get('UNIT')) ) { $edit_access_id = null; - if (is_numeric($_SESSION['UNIT_DEFAULT'])) { - $edit_access_id = (int)$_SESSION['UNIT_DEFAULT']; + if (is_numeric($this->session->get('UNIT_DEFAULT'))) { + $edit_access_id = (int)$this->session->get('UNIT_DEFAULT'); } } return $edit_access_id; @@ -2652,7 +2670,7 @@ HTML; */ public function loginGetHeaderColor(): ?string { - return $_SESSION['HEADER_COLOR'] ?? null; + return $this->session->get('HEADER_COLOR'); } /** @@ -2663,7 +2681,7 @@ HTML; public function loginGetPages(): array { - return $_SESSION['PAGES'] ?? []; + return $this->session->get('PAGES'); } /** diff --git a/www/vendor/egrajp/corelibs-composer-all/src/Admin/Backend.php b/www/vendor/egrajp/corelibs-composer-all/src/Admin/Backend.php index 1c088cae..6f02cd25 100644 --- a/www/vendor/egrajp/corelibs-composer-all/src/Admin/Backend.php +++ b/www/vendor/egrajp/corelibs-composer-all/src/Admin/Backend.php @@ -380,12 +380,12 @@ class Backend [ // row 1 '', - !empty($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? - $_SESSION['EUID'] : null, - !empty($_SESSION['ECUID']) && is_string($_SESSION['ECUID']) ? - $_SESSION['ECUID'] : null, - !empty($_SESSION['ECUUID']) && Uids::validateUuuidv4($_SESSION['ECUID']) ? - $_SESSION['ECUID'] : null, + is_numeric($this->session->get('EUID')) ? + $this->session->get('EUID') : null, + is_string($this->session->get('ECUID')) ? + $this->session->get('ECUID') : null, + !empty($this->session->get('ECUUID')) && Uids::validateUuuidv4($this->session->get('ECUID')) ? + $this->session->get('ECUID') : null, (string)$event, '', $data_write, @@ -403,7 +403,7 @@ class Backend $_SERVER['HTTP_ACCEPT'] ?? '', $_SERVER['HTTP_ACCEPT_CHARSET'] ?? '', $_SERVER['HTTP_ACCEPT_ENCODING'] ?? '', - $this->session->getSessionId() !== false ? + $this->session->getSessionId() !== '' ? $this->session->getSessionId() : null, // row 4 $this->action ?? '', @@ -468,7 +468,7 @@ class Backend } // get the session pages array - $PAGES = $_SESSION['PAGES'] ?? null; + $PAGES = $this->session->get('PAGES'); if (!isset($PAGES) || !is_array($PAGES)) { $PAGES = []; } diff --git a/www/vendor/egrajp/corelibs-composer-all/src/Create/Session.php b/www/vendor/egrajp/corelibs-composer-all/src/Create/Session.php index ca3607e6..6873ee27 100644 --- a/www/vendor/egrajp/corelibs-composer-all/src/Create/Session.php +++ b/www/vendor/egrajp/corelibs-composer-all/src/Create/Session.php @@ -15,19 +15,27 @@ namespace CoreLibs\Create; class Session { + /** @var string current session name */ + private string $session_name = ''; + /** @var string current session id */ + private string $session_id = ''; + /** @var bool flag auto write close */ + private bool $auto_write_close = false; + /** * init a session, if array is empty or array does not have session_name set * then no auto init is run * * @param string $session_name if set and not empty, will start session */ - public function __construct(string $session_name = '') + public function __construct(string $session_name, bool $auto_write_close = false) { - if (!empty($session_name)) { - $this->startSession($session_name); - } + $this->initSession($session_name); + $this->auto_write_close = $auto_write_close; } + // MARK: private methods + /** * Start session * startSession should be called for complete check @@ -36,36 +44,32 @@ class Session * * @return void */ - protected function startSessionCall(): void + private function startSessionCall(): void { session_start(); } /** - * check if we are in CLI, we set this, so we can mock this - * Not this is just a wrapper for the static System::checkCLI call + * get current set session id or false if none started * - * @return bool True if we are in a CLI enviroment, or false for everything else + * @return string|false */ - public function checkCliStatus(): bool + public function getSessionIdCall(): string|false { - return \CoreLibs\Get\System::checkCLI(); + return session_id(); } /** - * Set session name call. If not valid session name, will return false + * automatically closes a session if the auto write close flag is set * - * @param string $session_name A valid string for session name - * @return bool True if session name is valid, - * False if not + * @return bool */ - public function setSessionName(string $session_name): bool + private function closeSessionCall(): bool { - if (!$this->checkValidSessionName($session_name)) { - return false; + if ($this->auto_write_close) { + return $this->writeClose(); } - session_name($session_name); - return true; + return false; } /** @@ -94,15 +98,34 @@ class Session } /** - * start session with given session name if set + * validate _SESSION key, must be valid variable + * + * @param int|float|string $key + * @return true + */ + private function checkValidSessionEntryKey(int|float|string $key): true + { + if (!is_string($key) || is_numeric($key)) { + throw new \UnexpectedValueException( + '[SESSION] Given key for _SESSION is not a valid value for a varaible: ' . $key, + 1 + ); + } + return true; + } + + // MARK: init session (on class start) + + /** + * stinitart session with given session name if set * aborts on command line or if sessions are not enabled * also aborts if session cannot be started * On sucess returns the session id * - * @param string|null $session_name - * @return string|bool + * @param string $session_name + * @return void */ - public function startSession(?string $session_name = null): string|bool + private function initSession(string $session_name): void { // we can't start sessions on command line if ($this->checkCliStatus()) { @@ -115,39 +138,85 @@ class Session // session_status // initial the session if there is no session running already if (!$this->checkActiveSession()) { - // if session name is emtpy, check if there is a global set - // this is a deprecated fallback - $session_name = $session_name ?? $GLOBALS['SET_SESSION_NAME'] ?? ''; - // DEPRECTED: constant SET_SESSION_NAME is no longer used - // if set, set special session name - if (!empty($session_name)) { - // invalid session name, abort - if (!$this->checkValidSessionName($session_name)) { - throw new \UnexpectedValueException('[SESSION] Invalid session name: ' . $session_name, 3); - } - $this->setSessionName($session_name); + // invalid session name, abort + if (!$this->checkValidSessionName($session_name)) { + throw new \UnexpectedValueException('[SESSION] Invalid session name: ' . $this->session_name, 3); } + // set session name + $this->session_name = $session_name; + session_name($this->session_name); // start session $this->startSessionCall(); + // if we faild to start the session + if (!$this->checkActiveSession()) { + throw new \RuntimeException('[SESSION] Failed to activate session', 5); + } + } elseif ($session_name != $this->getSessionName()) { + throw new \UnexpectedValueException( + '[SESSION] Another session exists with a different name: ' . $this->getSessionName(), + 4 + ); } - // if we still have no active session + // check session id + if (false === ($session_id = $this->getSessionIdCall())) { + throw new \UnexpectedValueException('[SESSION] getSessionId did not return a session id', 6); + } + // set session id + $this->session_id = $session_id; + // if flagged auto close, write close session + if ($this->auto_write_close) { + $this->writeClose(); + } + } + + // MARK: public set/get status + + /** + * start session, will only run after initSession + * + * @return bool True if started, False if alrady running + */ + public function restartSession(): bool + { if (!$this->checkActiveSession()) { - throw new \RuntimeException('[SESSION] Failed to activate session', 4); + if (empty($this->session_name)) { + throw new \RuntimeException('[SESSION] Cannot restart session without a session name', 1); + } + $this->startSessionCall(); + return true; } - if (false === ($session_id = $this->getSessionId())) { - throw new \UnexpectedValueException('[SESSION] getSessionId did not return a session id', 5); - } - return $session_id; + return false; } /** - * get current set session id or false if none started + * current set session id * - * @return string|bool + * @return string */ - public function getSessionId(): string|bool + public function getSessionId(): string { - return session_id(); + return $this->session_id; + } + + /** + * set the auto write close flag + * + * @param bool $flag + * @return void + */ + public function setAutoWriteClose(bool $flag): void + { + $this->auto_write_close = $flag; + } + + /** + * return the auto write close flag + * + * @return bool + */ + public function checkAutoWriteClose(): bool + { + return $this->auto_write_close; } /** @@ -175,6 +244,34 @@ class Session } } + /** + * check if we are in CLI, we set this, so we can mock this + * Not this is just a wrapper for the static System::checkCLI call + * + * @return bool True if we are in a CLI enviroment, or false for everything else + */ + public function checkCliStatus(): bool + { + return \CoreLibs\Get\System::checkCLI(); + } + + /** + * get session status + * PHP_SESSION_DISABLED if sessions are disabled. + * PHP_SESSION_NONE if sessions are enabled, but none exists. + * PHP_SESSION_ACTIVE if sessions are enabled, and one exists. + * + * https://www.php.net/manual/en/function.session-status.php + * + * @return int See possible return int values above + */ + public function getSessionStatus(): int + { + return session_status(); + } + + // MARK: write close session + /** * unlock the session file, so concurrent AJAX requests can be done * NOTE: after this has been called, no changes in _SESSION will be stored @@ -188,17 +285,24 @@ class Session return session_write_close(); } + // MARK: session close and clean up + /** * Proper destroy a session * - unset the _SESSION array * - unset cookie if cookie on and we have not strict mode + * - unset session_name and session_id internal vars * - destroy session * - * @return bool + * @return bool True on successful session destroy */ public function sessionDestroy(): bool { - $_SESSION = []; + // abort to false if not unsetable + if (!session_unset()) { + return false; + } + $this->clear(); if ( ini_get('session.use_cookies') && !ini_get('session.use_strict_mode') @@ -218,68 +322,92 @@ class Session $params['httponly'] ); } + // unset internal vars + $this->session_name = ''; + $this->session_id = ''; return session_destroy(); } - /** - * get session status - * PHP_SESSION_DISABLED if sessions are disabled. - * PHP_SESSION_NONE if sessions are enabled, but none exists. - * PHP_SESSION_ACTIVE if sessions are enabled, and one exists. - * - * https://www.php.net/manual/en/function.session-status.php - * - * @return int See possible return int values above - */ - public function getSessionStatus(): int - { - return session_status(); - } - - // _SESSION set/unset methods + // MARK: _SESSION set/unset methods /** * unset all _SESSION entries * * @return void */ - public function unsetAllS(): void + public function clear(): void { - foreach (array_keys($_SESSION ?? []) as $name) { - unset($_SESSION[$name]); + $this->restartSession(); + if (!session_unset()) { + throw new \RuntimeException('[SESSION] Cannot unset session vars', 1); } + if (!empty($_SESSION)) { + $_SESSION = []; + } + $this->closeSessionCall(); } /** * set _SESSION entry 'name' with any value * - * @param string|int $name array name in _SESSION - * @param mixed $value value to set (can be anything) + * @param string $name array name in _SESSION + * @param mixed $value value to set (can be anything) * @return void */ - public function setS(string|int $name, mixed $value): void + public function set(string $name, mixed $value): void { + $this->checkValidSessionEntryKey($name); + $this->restartSession(); $_SESSION[$name] = $value; + $this->closeSessionCall(); + } + + /** + * set many session entries in one set + * + * @param array $set key is the key in the _SESSION, value is any data to set + * @return void + */ + public function setMany(array $set): void + { + $this->restartSession(); + // skip any that are not valid + foreach ($set as $key => $value) { + $this->checkValidSessionEntryKey($key); + $_SESSION[$key] = $value; + } + $this->closeSessionCall(); } /** * get _SESSION 'name' entry or empty string if not set * - * @param string|int $name value key to get from _SESSION - * @return mixed value stored in _SESSION + * @param string $name value key to get from _SESSION + * @return mixed value stored in _SESSION, if not found set to null */ - public function getS(string|int $name): mixed + public function get(string $name): mixed { - return $_SESSION[$name] ?? ''; + return $_SESSION[$name] ?? null; + } + + /** + * get multiple session entries + * + * @param array $set + * @return array + */ + public function getMany(array $set): array + { + return array_intersect_key($_SESSION, array_flip($set)); } /** * Check if a name is set in the _SESSION array * - * @param string|int $name Name to check for - * @return bool True for set, False fornot set + * @param string $name Name to check for + * @return bool True for set, False fornot set */ - public function issetS(string|int $name): bool + public function isset(string $name): bool { return isset($_SESSION[$name]); } @@ -287,67 +415,35 @@ class Session /** * unset one _SESSION entry 'name' if exists * - * @param string|int $name _SESSION key name to remove + * @param string $name _SESSION key name to remove * @return void */ - public function unsetS(string|int $name): void + public function unset(string $name): void { - if (isset($_SESSION[$name])) { - unset($_SESSION[$name]); + if (!isset($_SESSION[$name])) { + return; } + $this->restartSession(); + unset($_SESSION[$name]); + $this->closeSessionCall(); } - // set/get below - // ->var = value; - /** - * Undocumented function + * reset many session entry * - * @param string|int $name - * @param mixed $value + * @param array $set list of session keys to reset * @return void */ - public function __set(string|int $name, mixed $value): void + public function unsetMany(array $set): void { - $_SESSION[$name] = $value; - } - - /** - * Undocumented function - * - * @param string|int $name - * @return mixed If name is not found, it will return null - */ - public function __get(string|int $name): mixed - { - if (isset($_SESSION[$name])) { - return $_SESSION[$name]; - } - return null; - } - - /** - * Undocumented function - * - * @param string|int $name - * @return bool - */ - public function __isset(string|int $name): bool - { - return isset($_SESSION[$name]); - } - - /** - * Undocumented function - * - * @param string|int $name - * @return void - */ - public function __unset(string|int $name): void - { - if (isset($_SESSION[$name])) { - unset($_SESSION[$name]); + $this->restartSession(); + foreach ($set as $key) { + if (!isset($_SESSION[$key])) { + continue; + } + unset($_SESSION[$key]); } + $this->closeSessionCall(); } } diff --git a/www/vendor/egrajp/corelibs-composer-all/src/Output/Form/Token.php b/www/vendor/egrajp/corelibs-composer-all/src/Output/Form/Token.php index 49becb30..e793e4ba 100644 --- a/www/vendor/egrajp/corelibs-composer-all/src/Output/Form/Token.php +++ b/www/vendor/egrajp/corelibs-composer-all/src/Output/Form/Token.php @@ -2,7 +2,7 @@ /* * sets a form token in the _SESSION variable - * session must be started for this to work + * session must be started and running for this to work */ declare(strict_types=1); diff --git a/www/vendor/egrajp/corelibs-composer-all/test/phpunit/ACL/CoreLibsACLLoginTest.php b/www/vendor/egrajp/corelibs-composer-all/test/phpunit/ACL/CoreLibsACLLoginTest.php index 675ce307..92d3d978 100644 --- a/www/vendor/egrajp/corelibs-composer-all/test/phpunit/ACL/CoreLibsACLLoginTest.php +++ b/www/vendor/egrajp/corelibs-composer-all/test/phpunit/ACL/CoreLibsACLLoginTest.php @@ -1089,9 +1089,9 @@ final class CoreLibsACLLoginTest extends TestCase /** @var \CoreLibs\Create\Session&MockObject */ $session_mock = $this->createPartialMock( \CoreLibs\Create\Session::class, - ['startSession', 'checkActiveSession', 'sessionDestroy'] + ['getSessionId', 'checkActiveSession', 'sessionDestroy'] ); - $session_mock->method('startSession')->willReturn('ACLLOGINTEST12'); + $session_mock->method('getSessionId')->willReturn('ACLLOGINTEST12'); $session_mock->method('checkActiveSession')->willReturn(true); $session_mock->method('sessionDestroy')->will( $this->returnCallback(function () { @@ -1792,9 +1792,9 @@ final class CoreLibsACLLoginTest extends TestCase /** @var \CoreLibs\Create\Session&MockObject */ $session_mock = $this->createPartialMock( \CoreLibs\Create\Session::class, - ['startSession', 'checkActiveSession', 'sessionDestroy'] + ['getSessionId', 'checkActiveSession', 'sessionDestroy'] ); - $session_mock->method('startSession')->willReturn('ACLLOGINTEST34'); + $session_mock->method('getSessionId')->willReturn('ACLLOGINTEST34'); $session_mock->method('checkActiveSession')->willReturn(true); $session_mock->method('sessionDestroy')->will( $this->returnCallback(function () { @@ -1906,9 +1906,9 @@ final class CoreLibsACLLoginTest extends TestCase /** @var \CoreLibs\Create\Session&MockObject */ $session_mock = $this->createPartialMock( \CoreLibs\Create\Session::class, - ['startSession', 'checkActiveSession', 'sessionDestroy'] + ['getSessionId', 'checkActiveSession', 'sessionDestroy'] ); - $session_mock->method('startSession')->willReturn('ACLLOGINTEST34'); + $session_mock->method('getSessionId')->willReturn('ACLLOGINTEST34'); $session_mock->method('checkActiveSession')->willReturn(true); $session_mock->method('sessionDestroy')->will( $this->returnCallback(function () { @@ -1994,9 +1994,9 @@ final class CoreLibsACLLoginTest extends TestCase /** @var \CoreLibs\Create\Session&MockObject */ $session_mock = $this->createPartialMock( \CoreLibs\Create\Session::class, - ['startSession', 'checkActiveSession', 'sessionDestroy'] + ['getSessionId', 'checkActiveSession', 'sessionDestroy'] ); - $session_mock->method('startSession')->willReturn('ACLLOGINTEST34'); + $session_mock->method('getSessionId')->willReturn('ACLLOGINTEST34'); $session_mock->method('checkActiveSession')->willReturn(true); $session_mock->method('sessionDestroy')->will( $this->returnCallback(function () { @@ -2090,9 +2090,9 @@ final class CoreLibsACLLoginTest extends TestCase /** @var \CoreLibs\Create\Session&MockObject */ $session_mock = $this->createPartialMock( \CoreLibs\Create\Session::class, - ['startSession', 'checkActiveSession', 'sessionDestroy'] + ['getSessionId', 'checkActiveSession', 'sessionDestroy'] ); - $session_mock->method('startSession')->willReturn('ACLLOGINTEST34'); + $session_mock->method('getSessionId')->willReturn('ACLLOGINTEST34'); $session_mock->method('checkActiveSession')->willReturn(true); $session_mock->method('sessionDestroy')->will( $this->returnCallback(function () { diff --git a/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Create/CoreLibsCreateSessionTest.php b/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Create/CoreLibsCreateSessionTest.php index f9c89109..2ac833fd 100644 --- a/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Create/CoreLibsCreateSessionTest.php +++ b/www/vendor/egrajp/corelibs-composer-all/test/phpunit/Create/CoreLibsCreateSessionTest.php @@ -22,7 +22,6 @@ final class CoreLibsCreateSessionTest extends TestCase public function sessionProvider(): array { // 0: session name as parameter or for GLOBAL value - // 1: type p: parameter, g: global, d: php.ini default // 2: mock data as array // checkCliStatus: true/false, // getSessionStatus: PHP_SESSION_DISABLED for abort, @@ -31,13 +30,10 @@ final class CoreLibsCreateSessionTest extends TestCase // checkActiveSession: true/false, [1st call, 2nd call] // getSessionId: string or false // 3: exepcted name (session)] - // 4: Exception thrown on error - // 5: exception code, null for none - // 6: expected error string + // 4: auto write close flag return [ 'session parameter' => [ 'sessionNameParameter', - 'p', [ 'checkCliStatus' => false, 'getSessionStatus' => PHP_SESSION_NONE, @@ -47,12 +43,9 @@ final class CoreLibsCreateSessionTest extends TestCase ], 'sessionNameParameter', null, - null, - '', ], 'session globals' => [ 'sessionNameGlobals', - 'g', [ 'checkCliStatus' => false, 'getSessionStatus' => PHP_SESSION_NONE, @@ -61,13 +54,10 @@ final class CoreLibsCreateSessionTest extends TestCase 'getSessionId' => '1234abcd4567' ], 'sessionNameGlobals', - null, - null, - '', + false, ], - 'session name default' => [ - '', - 'd', + 'auto write close' => [ + 'sessionNameAutoWriteClose', [ 'checkCliStatus' => false, 'getSessionStatus' => PHP_SESSION_NONE, @@ -75,109 +65,8 @@ final class CoreLibsCreateSessionTest extends TestCase 'checkActiveSession' => [false, true], 'getSessionId' => '1234abcd4567' ], - '', - null, - null, - '', - ], - // error checks - // 1: we are in cli - 'on cli error' => [ - '', - 'd', - [ - 'checkCliStatus' => true, - 'getSessionStatus' => PHP_SESSION_NONE, - 'setSessionName' => true, - 'checkActiveSession' => [false, true], - 'getSessionId' => '1234abcd4567' - ], - '', - 'RuntimeException', - 1, - '[SESSION] No sessions in php cli' - ], - // 2: session disabled - 'session disabled error' => [ - '', - 'd', - [ - 'checkCliStatus' => false, - 'getSessionStatus' => PHP_SESSION_DISABLED, - 'setSessionName' => true, - 'checkActiveSession' => [false, true], - 'getSessionId' => '1234abcd4567' - ], - '', - 'RuntimeException', - 2, - '[SESSION] Sessions are disabled' - ], - // 3: invalid session name: string - 'invalid name chars error' => [ - '1invalid$session#;', - 'p', - [ - 'checkCliStatus' => false, - 'getSessionStatus' => PHP_SESSION_NONE, - 'setSessionName' => false, - 'checkActiveSession' => [false, true], - 'getSessionId' => '1234abcd4567' - ], - '', - 'UnexpectedValueException', - 3, - '[SESSION] Invalid session name: 1invalid$session#;' - ], - // 3: invalid session name: only numbers - 'invalid name numbers only error' => [ - '123', - 'p', - [ - 'checkCliStatus' => false, - 'getSessionStatus' => PHP_SESSION_NONE, - 'setSessionName' => false, - 'checkActiveSession' => [false, true], - 'getSessionId' => '1234abcd4567' - ], - '', - 'UnexpectedValueException', - 3, - '[SESSION] Invalid session name: 123' - ], - // 3: invalid session name: invalid name short - // 3: invalid session name: too long (128) - // 4: failed to start session (2nd false on check active session) - 'invalid name numbers only error' => [ - '', - 'd', - [ - 'checkCliStatus' => false, - 'getSessionStatus' => PHP_SESSION_NONE, - 'setSessionName' => true, - 'checkActiveSession' => [false, false], - 'getSessionId' => '1234abcd4567' - ], - '', - 'RuntimeException', - 4, - '[SESSION] Failed to activate session' - ], - // 5: get session id return false - 'invalid name numbers only error' => [ - '', - 'd', - [ - 'checkCliStatus' => false, - 'getSessionStatus' => PHP_SESSION_NONE, - 'setSessionName' => true, - 'checkActiveSession' => [false, true], - 'getSessionId' => false - ], - '', - 'UnexpectedValueException', - 5, - '[SESSION] getSessionId did not return a session id' + 'sessionNameAutoWriteClose', + true, ], ]; } @@ -190,32 +79,23 @@ final class CoreLibsCreateSessionTest extends TestCase * @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName] * * @param string $input - * @param string $type * @param array $mock_data * @param string $expected - * @param string|null $exception - * @param string $expected_error * @return void */ public function testStartSession( string $input, - string $type, array $mock_data, string $expected, - ?string $exception, - ?int $exception_code, - string $expected_error + ?bool $auto_write_close, ): void { - // override expected - if ($type == 'd') { - $expected = ini_get('session.name'); - } /** @var \CoreLibs\Create\Session&MockObject $session_mock */ $session_mock = $this->createPartialMock( \CoreLibs\Create\Session::class, [ - 'checkCliStatus', 'getSessionStatus', 'checkActiveSession', - 'setSessionName', 'startSessionCall', 'getSessionId', + 'checkCliStatus', + 'getSessionStatus', 'checkActiveSession', + 'getSessionId', 'getSessionName' ] ); @@ -234,12 +114,8 @@ final class CoreLibsCreateSessionTest extends TestCase $mock_data['checkActiveSession'][0], $mock_data['checkActiveSession'][1], ); - // dummy set for session name - $session_mock->method('setSessionName')->with($input)->willReturn($mock_data['setSessionName']); // set session name & return bsed on request data $session_mock->method('getSessionName')->willReturn($expected); - // will not return anything - $session_mock->method('startSessionCall'); // in test case only return string // false: will return false $session_mock->method('getSessionId')->willReturn($mock_data['getSessionId']); @@ -247,25 +123,7 @@ final class CoreLibsCreateSessionTest extends TestCase // regex for session id $ression_id_regex = "/^\w+$/"; - if ($exception !== null) { - $this->expectException($exception); - $this->expectExceptionCode($exception_code); - } - - unset($GLOBALS['SET_SESSION_NAME']); - $session_id = ''; - switch ($type) { - case 'p': - $session_id = $session_mock->startSession($input); - break; - case 'g': - $GLOBALS['SET_SESSION_NAME'] = $input; - $session_id = $session_mock->startSession(); - break; - case 'd': - $session_id = $session_mock->startSession(); - break; - } + $session_id = $session_mock->getSessionId(); // asert checks if (!empty($session_id)) { $this->assertMatchesRegularExpression( @@ -284,6 +142,73 @@ final class CoreLibsCreateSessionTest extends TestCase } } + /** + * Undocumented function + * + * @return array + */ + public function providerSessionException(): array + { + return [ + 'not cli' => [ + 'TEST_EXCEPTION', + \RuntimeException::class, + 1, + '/^\[SESSION\] No sessions in php cli$/', + ], + /* 'session disabled ' => [ + 'TEST_EXCEPTION', + \RuntimeException::class, + 2, + '/^\[SESSION\] Sessions are disabled/' + ], + 'invalid session name' => [ + '--#as^-292p-', + \UnexpectedValueException::class, + 3, + '/^\[SESSION\] Invalid session name: /' + ], + 'failed to activate session' => [ + 'TEST_EXCEPTION', + \RuntimeException::class, + 4, + '/^\[SESSION\] Failed to activate session/' + ], + 'not a valid session id returned' => [ + \UnexpectedValueException::class, + 5, + '/^\[SESSION\] getSessionId did not return a session id/' + ], */ + ]; + } + + /** + * exception checks + * + * @covers ::initSession + * @dataProvider providerSessionException + * @testdox create session $session_name with exception $exception ($exception_code) [$_dataName] + * + * @param string $session_name + * @param string $exception + * @param int $exception_code + * @param string $expected_error + * @return void + */ + public function testSessionException( + string $session_name, + string $exception, + int $exception_code, + string $expected_error, + ): void { + // + // throws only on new Object creation + $this->expectException($exception); + $this->expectExceptionCode($exception_code); + $this->expectExceptionMessageMatches($expected_error); + new \CoreLibs\Create\Session($session_name); + } + /** * provider for session name check * @@ -347,109 +272,147 @@ final class CoreLibsCreateSessionTest extends TestCase * * @return array */ - public function sessionDataProvider(): array + public function providerSessionData(): array { return [ 'test' => [ 'foo', 'bar', 'bar', + null, ], 'int key test' => [ 123, 'bar', 'bar', + \UnexpectedValueException::class ], // more complex value tests 'array values' => [ 'array', [1, 2, 3], [1, 2, 3], + null, ] ]; } + // NOTE: with auto start session, we cannot test this in the command line + /** * method call test * - * @covers ::setS - * @covers ::getS - * @covers ::issetS - * @covers ::unsetS - * @dataProvider sessionDataProvider - * @testdox setS/getS/issetS/unsetS $name with $input is $expected [$_dataName] + * @covers ::set + * @covers ::get + * @covers ::isset + * @covers ::unset + * @dataProvider providerSessionData + * @testdox set/get/isset/unset $name with $input is $expected ($exception) [$_dataName] * * @param string|int $name * @param mixed $input * @param mixed $expected + * @param ?mixed $exception * @return void */ - public function testMethodSetGet($name, $input, $expected): void + public function testMethodSetGet($name, $input, $expected, $exception): void { - $session = new \CoreLibs\Create\Session(); - $session->setS($name, $input); + if (\CoreLibs\Get\System::checkCLI()) { + $this->markTestSkipped('Cannot run testMethodSetGet in CLI'); + } + $session = new \CoreLibs\Create\Session('TEST_METHOD'); + if ($expected !== null) { + $this->expectException($exception); + } + $session->set($name, $input); $this->assertEquals( $expected, - $session->getS($name), + $session->get($name), 'method set assert' ); // isset true $this->assertTrue( - $session->issetS($name), + $session->isset($name), 'method isset assert ok' ); - $session->unsetS($name); + $session->unset($name); $this->assertEquals( '', - $session->getS($name), + $session->get($name), 'method unset assert' ); - // iset false + // isset false $this->assertFalse( - $session->issetS($name), + $session->isset($name), 'method isset assert false' ); } /** - * magic call test + * Undocumented function * - * @covers ::__set - * @covers ::__get - * @covers ::__isset - * @covers ::__unset - * @dataProvider sessionDataProvider - * @testdox __set/__get/__iseet/__unset $name with $input is $expected [$_dataName] + * @return array + */ + public function providerSessionDataMany(): array + { + return [ + 'valid set' => [ + [ + 'foo 1' => 'bar 1', + 'foo 2' => 'bar 1', + ], + [ + 'foo 1' => 'bar 1', + 'foo 2' => 'bar 1', + ], + null, + ], + 'invalid entry' => [ + [ + 'foo 1' => 'bar 1', + 123 => 'bar 1', + ], + [ + 'foo 1' => 'bar 1', + ], + \UnexpectedValueException::class + ] + ]; + } + + /** + * Undocumented function * - * @param string|int $name - * @param mixed $input - * @param mixed $expected + * @covers ::setMany + * @covers ::getMany + * @dataProvider providerSessionDataMany + * @testdox setMany/getMany/unsetMany $set is $expected ($exception) [$_dataName] + * + * @param array $set + * @param array $expected + * @param ?mixed $exception * @return void */ - public function testMagicSetGet($name, $input, $expected): void + public function testMany($set, $expected, $exception): void { - $session = new \CoreLibs\Create\Session(); - $session->$name = $input; + if (\CoreLibs\Get\System::checkCLI()) { + $this->markTestSkipped('Cannot run testMethodSetGet in CLI'); + } + $session = new \CoreLibs\Create\Session('TEST_METHOD'); + if ($expected !== null) { + $this->expectException($exception); + } + $session->setMany($set); $this->assertEquals( $expected, - $session->$name, - 'magic set assert' + $session->getMany(array_keys($set)), + 'set many failed' ); - // isset true - $this->assertTrue( - isset($session->$name), - 'magic isset assert ok' - ); - unset($session->$name); + $session->unsetMany(array_keys($set)); $this->assertEquals( - '', - $session->$name, - 'magic unset assert' - ); - // isset true - $this->assertFalse( - isset($session->$name), - 'magic isset assert false' + [], + $session->getMany(array_keys($set)), + 'unset many failed' ); } @@ -463,27 +426,30 @@ final class CoreLibsCreateSessionTest extends TestCase */ public function testUnsetAll(): void { + if (\CoreLibs\Get\System::checkCLI()) { + $this->markTestSkipped('Cannot run testUnsetAll in CLI'); + } $test_values = [ 'foo' => 'abc', 'bar' => '123' ]; - $session = new \CoreLibs\Create\Session(); + $session = new \CoreLibs\Create\Session('TEST_UNSET'); foreach ($test_values as $name => $value) { - $session->setS($name, $value); + $session->set($name, $value); // confirm set $this->assertEquals( $value, - $session->getS($name), + $session->get($name), 'set assert: ' . $name ); } // unset all - $session->unsetAllS(); + $session->clear(); // check unset foreach (array_keys($test_values) as $name) { $this->assertEquals( '', - $session->getS($name), + $session->get($name), 'unsert assert: ' . $name ); }