Compare commits

..

6 Commits

Author SHA1 Message Date
Clemens Schwaighofer
20c2c665d4 Set the AJAX PAGE global setting via an option intead of using the global variable
Also update the ACL list read updates. We shift this to on demand reads and not before it is needed. This avoids DB access if there is no need for this data
2025-05-15 18:58:36 +09:00
Clemens Schwaighofer
074d5bed4c class test login logging update 2025-05-15 15:37:06 +09:00
Clemens Schwaighofer
93cb7e0cab DB IO Adjustments for cursor set check and table exists check 2025-04-22 11:04:22 +09:00
Clemens Schwaighofer
7fbce6529b Merge branch 'development' of github-omc:TBWA-EGPlus-Japan/Client-Projects.php-core-libraries into development 2025-04-22 10:53:19 +09:00
Clemens Schwaighofer
6e086fe7b3 Add array helper for modifying key of a key value array 2025-04-22 10:52:13 +09:00
Clemens Schwaighofer
0ec19d5b75 Add array helper for modifying key of a key value array 2025-04-22 10:36:54 +09:00
7 changed files with 213 additions and 15 deletions

View File

@@ -1286,6 +1286,118 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
)
);
}
/**
* provider for arrayModifyKey
*
* @return array<string,array<mixed>>
*/
public function providerArrayModifyKey(): array
{
return [
'prefix and suffix add' => [
'array' => [
'a' => 'foo',
'b' => 'bar',
'c' => 'foobar',
],
'prefix' => 'Prefix: ',
'suffix' => '.suffix',
'expected' => [
'Prefix: a.suffix' => 'foo',
'Prefix: b.suffix' => 'bar',
'Prefix: c.suffix' => 'foobar',
],
],
'prefix add only' => [
'array' => [
'a' => 'foo',
'b' => 'bar',
'c' => 'foobar',
],
'prefix' => 'Prefix: ',
'suffix' => '',
'expected' => [
'Prefix: a' => 'foo',
'Prefix: b' => 'bar',
'Prefix: c' => 'foobar',
],
],
'suffix add only' => [
'array' => [
'a' => 'foo',
'b' => 'bar',
'c' => 'foobar',
],
'prefix' => '',
'suffix' => '.suffix',
'expected' => [
'a.suffix' => 'foo',
'b.suffix' => 'bar',
'c.suffix' => 'foobar',
],
],
'empty array' => [
'array' => [],
'prefix' => '',
'suffix' => '.suffix',
'expected' => [],
],
'no suffix or prefix' => [
'array' => [
'a' => 'foo',
'b' => 'bar',
'c' => 'foobar',
],
'prefix' => '',
'suffix' => '',
'expected' => [
'a' => 'foo',
'b' => 'bar',
'c' => 'foobar',
],
],
'integer index mixed' => [
'array' => [
'a' => 'foo',
'b' => 'bar',
3 => 'foobar',
],
'prefix' => '',
'suffix' => '.suffix',
'expected' => [
'a.suffix' => 'foo',
'b.suffix' => 'bar',
'3.suffix' => 'foobar',
],
]
];
}
/**
* Undocumented function
*
* @covers ::arrayModifyKey
* @dataProvider providerArrayModifyKey
* @testdox arrayModifyKey check that key is correctly modified with $key_mod_prefix and $key_mod_suffix [$_dataName]
*
* @param array<mixed> $in_array
* @param string $key_mod_prefix
* @param string $key_mod_suffix
* @param array<mixed> $expected
* @return void
*/
public function testArrayModifyKey(
array $in_array,
string $key_mod_prefix,
string $key_mod_suffix,
array $expected
): void {
$this->assertEquals(
\CoreLibs\Combined\ArrayHandler::arrayModifyKey($in_array, $key_mod_prefix, $key_mod_suffix),
$expected
);
}
}
// __END__

View File

@@ -263,6 +263,8 @@ $out = array_intersect_key(
);
print "array intersect key: " . DgS::printAr($keys) . ": " . DgS::printAr($out) . "<br>";
print "array + suffix: " . DgS::printAr(ArrayHandler::arrayModifyKey($array, key_mod_suffix:'_attached')) . "<br>";
print "</body></html>";
// __END__

View File

@@ -31,6 +31,7 @@ $log = new CoreLibs\Logging\Logging([
'log_per_date' => true,
]);
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
$log->setLogFileId('classTest-login-override');
$login = new CoreLibs\ACL\Login(
$db,
$log,
@@ -45,6 +46,7 @@ $login = new CoreLibs\ACL\Login(
'locale_path' => BASE . INCLUDES . LOCALE,
]
);
$log->setLogFileId($LOG_FILE_ID);
ob_end_flush();
$login->loginMainCall();
@@ -158,5 +160,6 @@ if (is_string($edit_access_cuid)) {
print "EA ID: " . $edit_access_id . "<br>";
print "EA CUID: " . $log->prAr($edit_access_cuid) . "<br>";
print "REV EA CUID: " . $log->prAr($edit_access_id_rev) . "<br>";
$log->info('This is a test');
print "</body></html>";

View File

@@ -197,8 +197,10 @@ class Login
// login html, if we are on an ajax page
/** @var string|null */
private ?string $login_html = '';
/** @var bool */
/** @var bool flag set on run */
private bool $login_is_ajax_page = false;
/** @var bool flag set on load */
private bool $login_is_ajax_page_option = false;
// logging
/** @var array<string> list of allowed types for edit log write */
@@ -268,8 +270,6 @@ class Login
}
// init error array
$this->loginInitErrorMessages();
// acess right list
$this->loginLoadAccessRightList();
// log allowed write flags
$this->loginSetEditLogWriteTypeAvailable();
@@ -342,6 +342,7 @@ class Login
* locale_path <string>: absolue path to the locale folder
* site_locale <string>: what locale to load
* site_domain <string>: what domain (locale file name) to use
* ajax_page <bool>: if we are loading from an AJAX page (eg backend)
*
* @param array<string,mixed> $options Options array from class load
* @return bool True on ok, False on failure
@@ -361,6 +362,15 @@ class Login
$options['debug'] = false;
}
// AUTO LOGIN
if (
!isset($options['ajax_page']) ||
!is_bool($options['ajax_page'])
) {
$options['ajax_page'] = false;
}
$this->login_is_ajax_page_option = $options['ajax_page'];
// AUTO LOGIN
if (
!isset($options['auto_login']) ||
@@ -691,6 +701,34 @@ class Login
]);
}
/**
* get the default ACL list type
* if not set loads it from DB
*
* @return array<string,int>
*/
private function loginGetAccessRightListType(): array
{
if (empty($this->default_acl_list_type)) {
$this->loginLoadAccessRightList();
}
return $this->default_acl_list_type;
}
/**
* get the default ACL list
* if not set loads from DB
*
* @return array<string|int, mixed>
*/
private function loginGetAccessRightList(): array
{
if (empty($this->default_acl_list)) {
$this->loginLoadAccessRightList();
}
return $this->default_acl_list;
}
/**
* Improves the application's security over HTTP(S) by setting specific headers
*
@@ -1540,6 +1578,10 @@ class Login
$this->acl['unit'] = [];
$this->acl['unit_legacy'] = [];
$this->acl['unit_detail'] = [];
// integrate the type acl list, but only for the keyword -> level
$this->acl['min'] = $this->loginGetAccessRightListType();
// set the full acl list too (lookup level number and get level data)
$this->acl['acl_list'] = $this->loginGetAccessRightList();
// PER ACCOUNT (UNIT/edit access)->
foreach ($_SESSION['LOGIN_UNIT'] as $ea_cuid => $unit) {
@@ -1561,7 +1603,7 @@ class Login
'name' => $unit['name'],
'uid' => $unit['uid'],
'cuuid' => $unit['cuuid'],
'level' => $this->default_acl_list[$this->acl['unit'][$ea_cuid]]['name'] ?? -1,
'level' => $this->acl['acl_list'][$this->acl['unit'][$ea_cuid]]['name'] ?? -1,
'level_number' => $this->acl['unit'][$ea_cuid],
'default' => $unit['default'],
'data' => $unit['data'],
@@ -1582,10 +1624,6 @@ class Login
}
// set the default edit access
$this->acl['default_edit_access'] = $_SESSION['LOGIN_UNIT_DEFAULT_EACUID'];
// integrate the type acl list, but only for the keyword -> level
$this->acl['min'] = $this->default_acl_list_type;
// set the full acl list too (lookup level number and get level data)
$this->acl['acl_list'] = $this->default_acl_list;
// debug
// $this->debug('ACL', $this->print_ar($this->acl));
}
@@ -2519,7 +2557,12 @@ HTML;
// or need to pass it back
// to the continue AJAX class for output back to the user
$this->login_is_ajax_page = false;
if ($ajax_page === true || !empty($GLOBALS['AJAX_PAGE'])) {
if (
$ajax_page === true ||
$this->login_is_ajax_page_option == true ||
// this is deprecated
!empty($GLOBALS['AJAX_PAGE'])
) {
$this->login_is_ajax_page = true;
}
@@ -3147,6 +3190,8 @@ HTML;
*/
public function loginGetAclList(?int $level = null): array
{
// make sure it is loaded
$this->loginGetAccessRightList();
// if no level given, return full list
if (empty($level)) {
return $this->default_acl_list;
@@ -3169,6 +3214,9 @@ HTML;
*/
public function loginGetAclListFromType(string $type): int|bool
{
// make sure it is loaded
$this->loginGetAccessRightListType();
// if not et return false
if (!isset($this->default_acl_list_type[$type])) {
return false;
}

View File

@@ -551,6 +551,36 @@ class ArrayHandler
ARRAY_FILTER_USE_KEY
);
}
/**
* Modifieds the key of an array with a prefix and/or suffix and returns it with the original value
* does not change order in array
*
* @param array<string|int,mixed> $in_array
* @param string $key_mod_prefix [default=''] key prefix string
* @param string $key_mod_suffix [default=''] key suffix string
* @return array<string|int,mixed>
*/
public static function arrayModifyKey(
array $in_array,
string $key_mod_prefix = '',
string $key_mod_suffix = ''
): array {
// skip if array is empty or neither prefix or suffix are set
if (
$in_array == [] ||
($key_mod_prefix == '' && $key_mod_suffix == '')
) {
return $in_array;
}
return array_combine(
array_map(
fn($key) => $key_mod_prefix . $key . $key_mod_suffix,
array_keys($in_array)
),
array_values($in_array)
);
}
}
// __END__

View File

@@ -39,9 +39,9 @@ class ArrayIO extends \CoreLibs\DB\IO
{
// main calss variables
/** @var array<mixed> */
private array $table_array; // the array from the table to work on
private array $table_array = []; // the array from the table to work on
/** @var string */
private string $table_name; // the table_name
private string $table_name = ''; // the table_name
/** @var string */
private string $pk_name = ''; // the primary key from this table
/** @var int|string|null */
@@ -127,9 +127,9 @@ class ArrayIO extends \CoreLibs\DB\IO
public function getTableArray(bool $reset = false): array
{
if (!$reset) {
return $this->table_array ?? [];
return $this->table_array;
}
$table_array = $this->table_array ?? [];
$table_array = $this->table_array;
reset($table_array);
return $table_array;
}
@@ -194,7 +194,7 @@ class ArrayIO extends \CoreLibs\DB\IO
*/
public function getTableName(): string
{
return $this->table_name ?? '';
return $this->table_name;
}
/**

View File

@@ -2544,7 +2544,10 @@ class IO
} // only go if NO cursor exists
// if cursor exists ...
if ($this->cursor_ext[$query_hash]['cursor']) {
if (
$this->cursor_ext[$query_hash]['cursor'] instanceof \PgSql\Result ||
$this->cursor_ext[$query_hash]['cursor'] == 1
) {
if ($first_call === true) {
$this->cursor_ext[$query_hash]['log'][] = 'First call';
// count the rows returned (if select)