Compare commits

...

8 Commits

Author SHA1 Message Date
Clemens Schwaighofer
29982f90bc Admin\Backend change non filled dat part comment
the not filled data or data_binary part is a JSON with "type" set to the
type that is used with a general message

To decode try to read both sides if data = JSON + "type" and "message" set
then data is in data_binary else data_binary holds the type on the left side
2024-10-16 16:45:13 +09:00
Clemens Schwaighofer
7cced63c4b Update the Admin\Backend edit log call with query params and different data compressors
All queries uses now Params

On load checks for valid write types for edit log write, eg if bzip and lzip compression
are avaiable

adbEditLog:
Also add JSON type encoding for data outside STRING/SERIAL and BINARY/BZIP (bzip compressed)
Add ZLIB as altnerative to BZIP
Add alert if invalid type was set
Auto fallback to JSON if other write types are not available

adbLiveQueue:
Also convert the live queue query to a params style call
2024-10-16 16:21:51 +09:00
Clemens Schwaighofer
06c2ea5e0d Admin\Backend: make sure we do not access unset ->action vars 2024-10-16 12:34:48 +09:00
Clemens Schwaighofer
2e9239ec23 Ingore node_modules/ folder 2024-10-16 12:18:51 +09:00
Clemens Schwaighofer
0c89840dba Admin\Backend move _POST action read to sub function and trigger not auto loading it
On default it still auto loads the _POST vars for backwards compatible, but add a load class
flag to ignore it "init_action_vars"

also add a get vor tha "acl" array adbGetAcl()
2024-10-16 12:15:19 +09:00
Clemens Schwaighofer
db144493f3 Message system: allow warning level to be logged
Like error messages, they are written to the log if debug is on or the
flag is explicit set
2024-09-24 15:10:53 +09:00
Clemens Schwaighofer
5cec54d508 Add "Success" to message logging levels, fixes for PHP 8.4, other preg_match fixes
The Logger/MessageLevel gets "success" as level 110 to something a bit
heigher than "ok" which is the general "OK" for anything ending without
an error. The "success" is currently only used in file uploads with the
java script ajax file uploader

Fix any "type $var = null" with correctly "?type $var = null" for PHP 8.4 (phphan)

Fix preg match no return catches for DB IO compare version and for language
look up.
2024-09-20 13:33:19 +09:00
Clemens Schwaighofer
8e60c992f1 Fixes phan/phpstan 2024-09-03 12:06:01 +09:00
25 changed files with 400 additions and 120 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
.libs .libs
node_modules/

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phive xmlns="https://phar.io/phive"> <phive xmlns="https://phar.io/phive">
<phar name="phpunit" version="^9.6" installed="9.6.19" location="./tools/phpunit" copy="false"/> <phar name="phpunit" version="^9.6" installed="9.6.21" location="./tools/phpunit" copy="false"/>
<phar name="phpcbf" version="^3.7.2" installed="3.10.0" location="./tools/phpcbf" copy="false"/> <phar name="phpcbf" version="^3.7.2" installed="3.10.3" location="./tools/phpcbf" copy="false"/>
<phar name="phpcs" version="^3.7.2" installed="3.10.0" location="./tools/phpcs" copy="false"/> <phar name="phpcs" version="^3.7.2" installed="3.10.3" location="./tools/phpcs" copy="false"/>
<phar name="phpstan" version="^1.10.37" installed="1.11.1" location="./tools/phpstan" copy="false"/> <phar name="phpstan" version="^1.10.37" installed="1.12.4" location="./tools/phpstan" copy="false"/>
<phar name="phan" version="^5.4.2" installed="5.4.3" location="./tools/phan" copy="false"/> <phar name="phan" version="^5.4.2" installed="5.4.3" location="./tools/phan" copy="false"/>
<phar name="psalm" version="^5.15.0" installed="5.24.0" location="./tools/psalm" copy="false"/> <phar name="psalm" version="^5.15.0" installed="5.24.0" location="./tools/psalm" copy="false"/>
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/> <phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>

View File

@@ -39,6 +39,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'OK', 'str' => 'OK',
'expected' => 'ok', 'expected' => 'ok',
], ],
'success' => [
'level' => 'success',
'str' => 'SUCCESS',
'expected' => 'success',
],
'info' => [ 'info' => [
'level' => 'info', 'level' => 'info',
'str' => 'INFO', 'str' => 'INFO',
@@ -225,6 +230,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ERROR MESSAGE', 'str' => 'ERROR MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<ERROR> ERROR MESSAGE', 'expected' => '<ERROR> ERROR MESSAGE',
], ],
'error, logged' => [ 'error, logged' => [
@@ -233,6 +239,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ERROR MESSAGE', 'str' => 'ERROR MESSAGE',
'message' => null, 'message' => null,
'log_error' => true, 'log_error' => true,
'log_warning' => null,
'expected' => '<ERROR> ERROR MESSAGE', 'expected' => '<ERROR> ERROR MESSAGE',
], ],
'error, logged, message' => [ 'error, logged, message' => [
@@ -241,14 +248,43 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ERROR MESSAGE', 'str' => 'ERROR MESSAGE',
'message' => 'OTHER ERROR MESSAGE', 'message' => 'OTHER ERROR MESSAGE',
'log_error' => true, 'log_error' => true,
'log_warning' => null,
'expected' => '<ERROR> OTHER ERROR MESSAGE', 'expected' => '<ERROR> OTHER ERROR MESSAGE',
], ],
'warn, not logged' => [
'id' => '300',
'level' => 'warn',
'str' => 'WARNING MESSAGE',
'message' => null,
'log_error' => null,
'log_warning' => null,
'expected' => '<WARNING> WARNING MESSAGE',
],
'warn, logged' => [
'id' => '300',
'level' => 'warn',
'str' => 'WARNING MESSAGE',
'message' => null,
'log_error' => null,
'log_warning' => true,
'expected' => '<WARNING> WARNING MESSAGE',
],
'warn, logged, message' => [
'id' => '300',
'level' => 'warn',
'str' => 'WARNING MESSAGE',
'message' => 'OTHER WARNING MESSAGE',
'log_error' => null,
'log_warning' => true,
'expected' => '<WARNING> OTHER WARNING MESSAGE',
],
'notice' => [ 'notice' => [
'id' => '100', 'id' => '100',
'level' => 'notice', 'level' => 'notice',
'str' => 'NOTICE MESSAGE', 'str' => 'NOTICE MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<NOTICE> NOTICE MESSAGE', 'expected' => '<NOTICE> NOTICE MESSAGE',
], ],
'notice, message' => [ 'notice, message' => [
@@ -257,6 +293,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'NOTICE MESSAGE', 'str' => 'NOTICE MESSAGE',
'message' => 'OTHER NOTICE MESSAGE', 'message' => 'OTHER NOTICE MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<NOTICE> OTHER NOTICE MESSAGE', 'expected' => '<NOTICE> OTHER NOTICE MESSAGE',
], ],
'crash' => [ 'crash' => [
@@ -265,6 +302,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'CRASH MESSAGE', 'str' => 'CRASH MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<ALERT> CRASH MESSAGE', 'expected' => '<ALERT> CRASH MESSAGE',
], ],
'crash, message' => [ 'crash, message' => [
@@ -273,6 +311,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'CRASH MESSAGE', 'str' => 'CRASH MESSAGE',
'message' => 'OTHER CRASH MESSAGE', 'message' => 'OTHER CRASH MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<ALERT> OTHER CRASH MESSAGE', 'expected' => '<ALERT> OTHER CRASH MESSAGE',
], ],
'abort' => [ 'abort' => [
@@ -281,6 +320,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ABORT MESSAGE', 'str' => 'ABORT MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<CRITICAL> ABORT MESSAGE', 'expected' => '<CRITICAL> ABORT MESSAGE',
], ],
'abort, message' => [ 'abort, message' => [
@@ -289,6 +329,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ABORT MESSAGE', 'str' => 'ABORT MESSAGE',
'message' => 'OTHER ABORT MESSAGE', 'message' => 'OTHER ABORT MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<CRITICAL> OTHER ABORT MESSAGE', 'expected' => '<CRITICAL> OTHER ABORT MESSAGE',
], ],
'unknown' => [ 'unknown' => [
@@ -297,6 +338,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'WRONG LEVEL MESSAGE', 'str' => 'WRONG LEVEL MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<EMERGENCY> WRONG LEVEL MESSAGE', 'expected' => '<EMERGENCY> WRONG LEVEL MESSAGE',
], ],
'unknown, message' => [ 'unknown, message' => [
@@ -305,6 +347,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'WRONG LEVEL MESSAGE', 'str' => 'WRONG LEVEL MESSAGE',
'message' => 'OTHER WRONG LEVEL MESSAGE', 'message' => 'OTHER WRONG LEVEL MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<EMERGENCY> OTHER WRONG LEVEL MESSAGE', 'expected' => '<EMERGENCY> OTHER WRONG LEVEL MESSAGE',
], ],
]; ];
@@ -321,6 +364,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
* @param string $str * @param string $str
* @param string|null $message * @param string|null $message
* @param bool|null $log_error * @param bool|null $log_error
* @param bool|null $log_warning
* @param string $expected * @param string $expected
* @return void * @return void
*/ */
@@ -330,6 +374,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
string $str, string $str,
?string $message, ?string $message,
?bool $log_error, ?bool $log_error,
?bool $log_warning,
string $expected string $expected
): void { ): void {
$log = new \CoreLibs\Logging\Logging([ $log = new \CoreLibs\Logging\Logging([
@@ -344,7 +389,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$level, $level,
$str, $str,
message: $message, message: $message,
log_error: $log_error log_error: $log_error,
log_warning: $log_warning
); );
$file_content = ''; $file_content = '';
if (is_file($log->getLogFolder() . $log->getLogFile())) { if (is_file($log->getLogFolder() . $log->getLogFile())) {
@@ -358,6 +404,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$expected, $expected,
$file_content $file_content
); );
} elseif ($level == 'warn' && ($log_warning === null || $log_warning === false)) {
$this->assertStringNotContainsString(
$expected,
$file_content
);
} else { } else {
$this->assertStringContainsString( $this->assertStringContainsString(
$expected, $expected,
@@ -377,6 +428,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
* @param string $str * @param string $str
* @param string|null $message * @param string|null $message
* @param bool|null $log_error * @param bool|null $log_error
* @param bool|null $log_warning
* @param string $expected * @param string $expected
* @return void * @return void
*/ */
@@ -386,6 +438,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
string $str, string $str,
?string $message, ?string $message,
?bool $log_error, ?bool $log_error,
?bool $log_warning,
string $expected string $expected
): void { ): void {
$log = new \CoreLibs\Logging\Logging([ $log = new \CoreLibs\Logging\Logging([
@@ -400,7 +453,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$level, $level,
$str, $str,
message: $message, message: $message,
log_error: $log_error log_error: $log_error,
log_warning: $log_warning
); );
$file_content = ''; $file_content = '';
if (is_file($log->getLogFolder() . $log->getLogFile())) { if (is_file($log->getLogFolder() . $log->getLogFile())) {
@@ -414,6 +468,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$expected, $expected,
$file_content $file_content
); );
} elseif ($level == 'warn' && $log_warning === false) {
$this->assertStringNotContainsString(
$expected,
$file_content
);
} else { } else {
$this->assertStringContainsString( $this->assertStringContainsString(
$expected, $expected,

View File

@@ -39,9 +39,9 @@ parameters:
- www/vendor - www/vendor
# ignore errores with # ignore errores with
ignoreErrors: ignoreErrors:
- # in the class_test tree we allow deprecated calls # - # in the class_test tree we allow deprecated calls
message: "#^Call to deprecated method #" # message: "#^Call to deprecated method #"
path: %currentWorkingDirectory%/www/admin/class_test.*.php # path: %currentWorkingDirectory%/www/admin/class_test.*.php
# - '#Expression in empty\(\) is always falsy.#' # - '#Expression in empty\(\) is always falsy.#'
# - # -
# message: '#Reflection error: [a-zA-Z0-9\\_]+ not found.#' # message: '#Reflection error: [a-zA-Z0-9\\_]+ not found.#'

View File

@@ -1 +1 @@
/home/clemens/.phive/phars/phpcbf-3.10.0.phar /home/clemens/.phive/phars/phpcbf-3.10.3.phar

View File

@@ -1 +1 @@
/home/clemens/.phive/phars/phpcs-3.10.0.phar /home/clemens/.phive/phars/phpcs-3.10.3.phar

View File

@@ -1 +1 @@
/home/clemens/.phive/phars/phpstan-1.11.1.phar /home/clemens/.phive/phars/phpstan-1.12.4.phar

View File

@@ -1 +1 @@
/home/clemens/.phive/phars/phpunit-9.6.19.phar /home/clemens/.phive/phars/phpunit-9.6.21.phar

View File

@@ -55,7 +55,25 @@ print '<div><h1>' . $PAGE_NAME . '</h1></div>';
print "SETACL[]: <br>"; print "SETACL[]: <br>";
$backend->setACL(['EMPTY' => 'EMPTY']); $backend->setACL(['EMPTY' => 'EMPTY']);
print "ADBEDITLOG: <br>"; print "ADBEDITLOG: <br>";
$backend->adbEditLog('CLASSTEST-ADMIN', 'Some info string'); $backend->adbEditLog('CLASSTEST-ADMIN-BINARY', 'Some info string', 'BINARY');
$backend->adbEditLog('CLASSTEST-ADMIN-ZLIB', 'Some info string', 'ZLIB');
$backend->adbEditLog('CLASSTEST-ADMIN-SERIAL', 'Some info string', 'SERIAL');
$backend->adbEditLog('CLASSTEST-ADMIN-INVALID', 'Some info string', 'INVALID');
// test with various
$backend->action = 'TEST ACTION';
$backend->action_id = 'TEST ACTION ID';
$backend->action_yes = 'TEST ACTION YES';
$backend->action_flag = 'TEST ACTION FLAG';
$backend->action_menu = 'TEST ACTION MENU';
$backend->action_loaded = 'TEST ACTION LOADED';
$backend->action_value = 'TEST ACTION VALUE';
$backend->action_type = 'TEST ACTION TYPE';
$backend->action_error = 'TEST ACTION ERROR';
$backend->adbEditLog('CLASSTEST-ADMIN-JSON', [
"_GET" => $_GET,
"_POST" => $_POST,
], 'JSON');
print "ADBTOPMENU(0): " . Support::printAr($backend->adbTopMenu(CONTENT_PATH)) . "<br>"; print "ADBTOPMENU(0): " . Support::printAr($backend->adbTopMenu(CONTENT_PATH)) . "<br>";
print "ADBMSG: <br>"; print "ADBMSG: <br>";
$backend->adbMsg('info', 'Message: %1$d', [1]); $backend->adbMsg('info', 'Message: %1$d', [1]);

View File

@@ -45,6 +45,8 @@ $em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug');
$em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style'); $em->setErrorMsg('123', 'error', 'msg this is bad, auto logged if debug', 'target-id', 'other-style');
$em->setErrorMsg('123', 'error', 'msg this is bad, logged always', log_error:true); $em->setErrorMsg('123', 'error', 'msg this is bad, logged always', log_error:true);
$em->setErrorMsg('123', 'error', 'msg this is bad, never logged', log_error:false); $em->setErrorMsg('123', 'error', 'msg this is bad, never logged', log_error:false);
$em->setErrorMsg('500', 'warning', 'This is perhaps not super good, logged_always', log_warning:true);
$em->setErrorMsg('500', 'warning', 'This is perhaps not super good, logged_never', log_warning:false);
$em->setErrorMsg('1000', 'info', 'This is good'); $em->setErrorMsg('1000', 'info', 'This is good');
$em->setErrorMsg('9999', 'abort', 'BAD: This is critical (abort)'); $em->setErrorMsg('9999', 'abort', 'BAD: This is critical (abort)');
$em->setErrorMsg('10-1000', 'wrong', 'Wrong level: This is emergency'); $em->setErrorMsg('10-1000', 'wrong', 'Wrong level: This is emergency');
@@ -59,6 +61,8 @@ print "ErrorsIds: <pre>" . $log->prAr($em->getErrorIds()) . "</pre>";
print "Errors: <pre>" . $log->prAr($em->getErrorMsg()) . "</pre>"; print "Errors: <pre>" . $log->prAr($em->getErrorMsg()) . "</pre>";
print "JumpTargets: <pre>" . $log->prAr($em->getJumpTarget()) . "</pre>"; print "JumpTargets: <pre>" . $log->prAr($em->getJumpTarget()) . "</pre>";
print "IS info > ok: " . ml::fromName('info')->isHigherThan(ml::ok) . "<br>";
print "</body></html>"; print "</body></html>";
$log->debug('[END]', '==========================================>'); $log->debug('[END]', '==========================================>');

View File

@@ -42,6 +42,7 @@ print '<div><h1>' . $PAGE_NAME . '</h1></div>';
$string = "Something < = > Other <br> Next line and Quotes '\""; $string = "Something < = > Other <br> Next line and Quotes '\"";
echo "String: <pre>$string</pre><br>"; echo "String: <pre>$string</pre><br>";
$log->debug('HTMLENT', Html::htmlent($string));
print "HTMLENT: " . Html::htmlent($string) . ": " . $_html->htmlent($string) . " (" . htmlentities($string) . ")<br>"; print "HTMLENT: " . Html::htmlent($string) . ": " . $_html->htmlent($string) . " (" . htmlentities($string) . ")<br>";
print "REMOVELB: " . Html::htmlent($string) . ": " . $_html->removeLB($string) . "<br>"; print "REMOVELB: " . Html::htmlent($string) . ": " . $_html->removeLB($string) . "<br>";
$date_str = [2021, 5, 1, 11, 10]; $date_str = [2021, 5, 1, 11, 10];

View File

@@ -178,7 +178,7 @@ $log->debug('SOME MARK', 'Some error output');
print "EDIT ACCESS ID: " . $backend->edit_access_id . "<br>"; print "EDIT ACCESS ID: " . $backend->edit_access_id . "<br>";
if (is_object($login)) { if (is_object($login)) {
// print "ACL: <br>".$backend->print_ar($login->loginGetAcl())."<br>"; // print "ACL: <br>".$backend->print_ar($login->loginGetAcl())."<br>";
$log->debug('ACL', "ACL: " . \CoreLibs\Debug\Support::dumpVar($login->loginGetAcl())); // $log->debug('ACL', "ACL: " . \CoreLibs\Debug\Support::dumpVar($login->loginGetAcl()));
// print "DEFAULT ACL: <br>".$backend->print_ar($login->default_acl_list)."<br>"; // print "DEFAULT ACL: <br>".$backend->print_ar($login->default_acl_list)."<br>";
// print "DEFAULT ACL: <br>".$backend->print_ar($login->default_acl_list)."<br>"; // print "DEFAULT ACL: <br>".$backend->print_ar($login->default_acl_list)."<br>";
// $result = array_flip( // $result = array_flip(

View File

@@ -931,7 +931,7 @@ function rel(base) // eslint-disable-line no-unused-vars
/** /**
* searches and removes style from css array * searches and removes style from css array
* @param {Object} _element element to work one * @param {Object} _element element to work one
* @param {String css style sheet to remove (name) * @param {String} css style sheet to remove (name)
* @return {Object} returns full element * @return {Object} returns full element
*/ */
function rcssel(_element, css) function rcssel(_element, css)

View File

@@ -31,6 +31,8 @@ declare(strict_types=1);
namespace CoreLibs\Admin; namespace CoreLibs\Admin;
use CoreLibs\Convert\Json;
class Backend class Backend
{ {
// page name // page name
@@ -42,7 +44,7 @@ class Backend
/** @var array<string> */ /** @var array<string> */
public array $action_list = [ public array $action_list = [
'action', 'action_id', 'action_sub_id', 'action_yes', 'action_flag', 'action', 'action_id', 'action_sub_id', 'action_yes', 'action_flag',
'action_menu', 'action_value', 'action_error', 'action_loaded' 'action_menu', 'action_value', 'action_type', 'action_error', 'action_loaded'
]; ];
/** @var string */ /** @var string */
public string $action; public string $action;
@@ -61,20 +63,31 @@ class Backend
/** @var string */ /** @var string */
public string $action_value; public string $action_value;
/** @var string */ /** @var string */
public string $action_type;
/** @var string */
public string $action_error; public string $action_error;
// ACL array variable if we want to set acl data from outisde // ACL array variable if we want to set acl data from outisde
/** @var array<mixed> */ /** @var array<mixed> */
public array $acl = []; public array $acl = [];
/** @var int */ /** @var int */
public int $default_acl; public int $default_acl;
// queue key // queue key
/** @var string */ /** @var string */
public string $queue_key; public string $queue_key;
/** @var array<string> list of allowed types for edit log write */
private const WRITE_TYPES = ['BINARY', 'BZIP2', 'LZIP', 'STRING', 'SERIAL', 'JSON'];
/** @var array<string> list of available write types for log */
private array $write_types_available = [];
// the current active edit access id // the current active edit access id
/** @var int|null */ /** @var int|null */
public int|null $edit_access_id; public int|null $edit_access_id;
/** @var string */ /** @var string */
public string $page_name; public string $page_name;
// error/warning/info messages // error/warning/info messages
/** @var array<mixed> */ /** @var array<mixed> */
public array $messages = []; public array $messages = [];
@@ -84,6 +97,7 @@ class Backend
public bool $warning = false; public bool $warning = false;
/** @var bool */ /** @var bool */
public bool $info = false; public bool $info = false;
// internal lang & encoding vars // internal lang & encoding vars
/** @var string */ /** @var string */
public string $lang_dir = ''; public string $lang_dir = '';
@@ -95,6 +109,7 @@ class Backend
public string $domain; public string $domain;
/** @var string */ /** @var string */
public string $encoding; public string $encoding;
/** @var \CoreLibs\Logging\Logging logger */ /** @var \CoreLibs\Logging\Logging logger */
public \CoreLibs\Logging\Logging $log; public \CoreLibs\Logging\Logging $log;
/** @var \CoreLibs\DB\IO database */ /** @var \CoreLibs\DB\IO database */
@@ -103,6 +118,7 @@ class Backend
public \CoreLibs\Language\L10n $l; public \CoreLibs\Language\L10n $l;
/** @var \CoreLibs\Create\Session session class */ /** @var \CoreLibs\Create\Session session class */
public \CoreLibs\Create\Session $session; public \CoreLibs\Create\Session $session;
// smarty publics [end processing in smarty class] // smarty publics [end processing in smarty class]
/** @var array<mixed> */ /** @var array<mixed> */
public array $DATA = []; public array $DATA = [];
@@ -117,18 +133,20 @@ class Backend
/** /**
* main class constructor * main class constructor
* *
* @param \CoreLibs\DB\IO $db Database connection class * @param \CoreLibs\DB\IO $db Database connection class
* @param \CoreLibs\Logging\Logging $log Logging class * @param \CoreLibs\Logging\Logging $log Logging class
* @param \CoreLibs\Create\Session $session Session interface class * @param \CoreLibs\Create\Session $session Session interface class
* @param \CoreLibs\Language\L10n $l10n l10n language class * @param \CoreLibs\Language\L10n $l10n l10n language class
* @param int|null $set_default_acl_level Default ACL level * @param int|null $set_default_acl_level [default=null] Default ACL level
* @param bool $init_action_vars [default=true] If the action vars should be set
*/ */
public function __construct( public function __construct(
\CoreLibs\DB\IO $db, \CoreLibs\DB\IO $db,
\CoreLibs\Logging\Logging $log, \CoreLibs\Logging\Logging $log,
\CoreLibs\Create\Session $session, \CoreLibs\Create\Session $session,
\CoreLibs\Language\L10n $l10n, \CoreLibs\Language\L10n $l10n,
?int $set_default_acl_level = null ?int $set_default_acl_level = null,
bool $init_action_vars = true
) { ) {
// attach db class // attach db class
$this->db = $db; $this->db = $db;
@@ -151,9 +169,9 @@ class Backend
// set the page name // set the page name
$this->page_name = \CoreLibs\Get\System::getPageName(); $this->page_name = \CoreLibs\Get\System::getPageName();
// set the action ids // NOTE: if any of the "action" vars are used somewhere, it is recommended to NOT set them here
foreach ($this->action_list as $_action) { if ($init_action_vars) {
$this->$_action = $_POST[$_action] ?? ''; $this->adbSetActionVars();
} }
if ($set_default_acl_level === null) { if ($set_default_acl_level === null) {
@@ -170,9 +188,12 @@ class Backend
} }
// queue key // queue key
if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action)) { if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action ?? '')) {
$this->queue_key = \CoreLibs\Create\RandomKey::randomKeyGen(3); $this->queue_key = \CoreLibs\Create\RandomKey::randomKeyGen(3);
} }
// check what edit log data write types are allowed
$this->adbSetEditLogWriteTypeAvailable();
} }
/** /**
@@ -183,7 +204,26 @@ class Backend
// NO OP // NO OP
} }
// PUBLIC METHODS |=================================================> // MARK: PRIVATE METHODS
/**
* set the write types that are allowed
*
* @return void
*/
private function adbSetEditLogWriteTypeAvailable()
{
// check what edit log data write types are allowed
$this->write_types_available = self::WRITE_TYPES;
if (!function_exists('bzcompress')) {
$this->write_types_available = array_diff($this->write_types_available, ['BINARY', 'BZIP']);
}
if (!function_exists('gzcompress')) {
$this->write_types_available = array_diff($this->write_types_available, ['LZIP']);
}
}
// MARK: PUBLIC METHODS |=================================================>
/** /**
* set internal ACL from login ACL * set internal ACL from login ACL
@@ -195,30 +235,95 @@ class Backend
$this->acl = $acl; $this->acl = $acl;
} }
/**
* Return current set ACL
*
* @return array<mixed>
*/
public function adbGetAcl(): array
{
return $this->acl;
}
/**
* Set _POST action vars if needed
*
* @return void
*/
public function adbSetActionVars()
{
// set the action ids
foreach ($this->action_list as $_action) {
$this->$_action = $_POST[$_action] ?? '';
}
}
/** /**
* writes all action vars plus other info into edit_log table * writes all action vars plus other info into edit_log table
* *
* @param string $event any kind of event description, * @param string $event [default=''] any kind of event description,
* @param string|array<mixed> $data any kind of data related to that event * @param string|array<mixed> $data [default=''] any kind of data related to that event
* @param string $write_type write type can bei STRING or BINARY * @param string $write_type [default=JSON] write type can be
* @param string|null $db_schema override target schema * JSON, STRING/SERIEAL, BINARY/BZIP or ZLIB
* @param string|null $db_schema [default=null] override target schema
* @return void * @return void
*/ */
public function adbEditLog( public function adbEditLog(
string $event = '', string $event = '',
string|array $data = '', string|array $data = '',
string $write_type = 'STRING', string $write_type = 'JSON',
?string $db_schema = null ?string $db_schema = null
): void { ): void {
$data_binary = ''; $data_binary = '';
$data_write = ''; $data_write = '';
if ($write_type == 'BINARY') { // check if write type is valid, if not fallback to JSON
$data_binary = $this->db->dbEscapeBytea((string)bzcompress(serialize($data))); if (!in_array($write_type, $this->write_types_available)) {
$data_write = 'see bzip compressed data_binary field'; $this->log->warning('Write type not in allowed array, fallback to JSON', context:[
"write_type" => $write_type,
"write_list" => $this->write_types_available,
]);
$write_type = 'JSON';
} }
if ($write_type == 'STRING') { switch ($write_type) {
$data_binary = ''; case 'BINARY':
$data_write = $this->db->dbEscapeString(serialize($data)); case 'BZIP':
$data_binary = $this->db->dbEscapeBytea((string)bzcompress(serialize($data)));
$data_write = Json::jsonConvertArrayTo([
'type' => 'BZIP',
'message' => 'see bzip compressed data_binary field'
]);
break;
case 'ZLIB':
$data_binary = $this->db->dbEscapeBytea((string)gzcompress(serialize($data)));
$data_write = Json::jsonConvertArrayTo([
'type' => 'ZLIB',
'message' => 'see zlib compressed data_binary field'
]);
break;
case 'STRING':
case 'SERIAL':
$data_binary = $this->db->dbEscapeBytea(Json::jsonConvertArrayTo([
'type' => 'SERIAL',
'message' => 'see serial string data field'
]));
$data_write = serialize($data);
break;
case 'JSON':
$data_binary = $this->db->dbEscapeBytea(Json::jsonConvertArrayTo([
'type' => 'JSON',
'message' => 'see json string data field'
]));
// must be converted to array
if (!is_array($data)) {
$data = ["data" => $data];
}
$data_write = Json::jsonConvertArrayTo($data);
break;
default:
$this->log->alert('Invalid type for data compression was set', context:[
"write_type" => $write_type
]);
break;
} }
/** @var string $DB_SCHEMA check schema */ /** @var string $DB_SCHEMA check schema */
@@ -228,44 +333,62 @@ class Backend
} elseif (!empty($this->db->dbGetSchema())) { } elseif (!empty($this->db->dbGetSchema())) {
$DB_SCHEMA = $this->db->dbGetSchema(); $DB_SCHEMA = $this->db->dbGetSchema();
} }
$q = "INSERT INTO " . $DB_SCHEMA . ".edit_log " $q = <<<SQL
. "(euid, event_date, event, data, data_binary, page, " INSERT INTO {DB_SCHEMA}.edit_log (
. "ip, user_agent, referer, script_name, query_string, server_name, http_host, " euid, event_date, event, data, data_binary, page,
. "http_accept, http_accept_charset, http_accept_encoding, session_id, " ip, user_agent, referer, script_name, query_string, server_name, http_host,
. "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) " http_accept, http_accept_charset, http_accept_encoding, session_id,
. "VALUES " action, action_id, action_yes, action_flag, action_menu, action_loaded,
. "(" . $this->db->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? action_value, action_type, action_error
$_SESSION['EUID'] : ) VALUES (
'NULL') $1, NOW(), $2, $3, $4, $5,
. ", " $6, $7, $8, $9, $10, $11, $12,
. "NOW(), " $13, $14, $15, $16,
. "'" . $this->db->dbEscapeString((string)$event) . "', " $17, $18, $19, $20, $21, $22,
. "'" . $data_write . "', " $23, $24, $25
. "'" . $data_binary . "', " )
. "'" . $this->db->dbEscapeString((string)$this->page_name) . "', " SQL;
. "'" . ($_SERVER["REMOTE_ADDR"] ?? '') . "', " $this->db->dbExecParams(
. "'" . $this->db->dbEscapeString($_SERVER['HTTP_USER_AGENT'] ?? '') . "', " str_replace(
. "'" . $this->db->dbEscapeString($_SERVER['HTTP_REFERER'] ?? '') . "', " ['{DB_SCHEMA}'],
. "'" . $this->db->dbEscapeString($_SERVER['SCRIPT_FILENAME'] ?? '') . "', " [$DB_SCHEMA],
. "'" . $this->db->dbEscapeString($_SERVER['QUERY_STRING'] ?? '') . "', " $q
. "'" . $this->db->dbEscapeString($_SERVER['SERVER_NAME'] ?? '') . "', " ),
. "'" . $this->db->dbEscapeString($_SERVER['HTTP_HOST'] ?? '') . "', " [
. "'" . $this->db->dbEscapeString($_SERVER['HTTP_ACCEPT'] ?? '') . "', " // row 1
. "'" . $this->db->dbEscapeString($_SERVER['HTTP_ACCEPT_CHARSET'] ?? '') . "', " isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ?
. "'" . $this->db->dbEscapeString($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '') . "', " $_SESSION['EUID'] : null,
. ($this->session->getSessionId() === false ? (string)$event,
"NULL" : $data_write,
"'" . $this->session->getSessionId() . "'") $data_binary,
. ", " (string)$this->page_name,
. "'" . $this->db->dbEscapeString($this->action) . "', " // row 2
. "'" . $this->db->dbEscapeString($this->action_id) . "', " $_SERVER["REMOTE_ADDR"] ?? '',
. "'" . $this->db->dbEscapeString($this->action_yes) . "', " $_SERVER['HTTP_USER_AGENT'] ?? '',
. "'" . $this->db->dbEscapeString($this->action_flag) . "', " $_SERVER['HTTP_REFERER'] ?? '',
. "'" . $this->db->dbEscapeString($this->action_menu) . "', " $_SERVER['SCRIPT_FILENAME'] ?? '',
. "'" . $this->db->dbEscapeString($this->action_loaded) . "', " $_SERVER['QUERY_STRING'] ?? '',
. "'" . $this->db->dbEscapeString($this->action_value) . "', " $_SERVER['SERVER_NAME'] ?? '',
. "'" . $this->db->dbEscapeString($this->action_error) . "')"; $_SERVER['HTTP_HOST'] ?? '',
$this->db->dbExec($q, 'NULL'); // row 3
$_SERVER['HTTP_ACCEPT'] ?? '',
$_SERVER['HTTP_ACCEPT_CHARSET'] ?? '',
$_SERVER['HTTP_ACCEPT_ENCODING'] ?? '',
$this->session->getSessionId() !== false ?
$this->session->getSessionId() : null,
// row 4
$this->action ?? '',
$this->action_id ?? '',
$this->action_yes ?? '',
$this->action_flag ?? '',
$this->action_menu ?? '',
$this->action_loaded ?? '',
$this->action_value ?? '',
$this->action_type ?? '',
$this->action_error ?? '',
],
'NULL'
);
} }
/** /**
@@ -504,9 +627,9 @@ class Backend
string $data, string $data,
string $key_name, string $key_name,
string $key_value, string $key_value,
string $associate = null, ?string $associate = null,
string $file = null, ?string $file = null,
string $db_schema = null, ?string $db_schema = null,
): void { ): void {
/** @var string $DB_SCHEMA check schema */ /** @var string $DB_SCHEMA check schema */
$DB_SCHEMA = 'public'; $DB_SCHEMA = 'public';
@@ -515,16 +638,30 @@ class Backend
} elseif (!empty($this->db->dbGetSchema())) { } elseif (!empty($this->db->dbGetSchema())) {
$DB_SCHEMA = $this->db->dbGetSchema(); $DB_SCHEMA = $this->db->dbGetSchema();
} }
$q = "INSERT INTO " . $DB_SCHEMA . ".live_queue (" $q = <<<SQL
. "queue_key, key_value, key_name, type, target, data, group_key, action, associate, file" INSERT INTO {DB_SCHEMA}.live_queue (
. ") VALUES (" queue_key, key_value, key_name, type,
. "'" . $this->db->dbEscapeString($queue_key) . "', '" . $this->db->dbEscapeString($key_value) . "', " target, data, group_key, action, associate, file
. "'" . $this->db->dbEscapeString($key_name) . "', '" . $this->db->dbEscapeString($type) . "', " ) VALUES (
. "'" . $this->db->dbEscapeString($target) . "', '" . $this->db->dbEscapeString($data) . "', " $1, $2, $3, $4,
. "'" . $this->queue_key . "', '" . $this->action . "', " $5, $6, $7, $8, $9, $10
. "'" . $this->db->dbEscapeString((string)$associate) . "', " )
. "'" . $this->db->dbEscapeString((string)$file) . "')"; SQL;
$this->db->dbExec($q); // $this->db->dbExec($q);
$this->db->dbExecParams(
str_replace(
['{DB_SCHEMA}'],
[$DB_SCHEMA],
$q
),
[
$queue_key, $key_value,
$key_name, $type,
$target, $data,
$this->queue_key, $this->action,
(string)$associate, (string)$file
]
);
} }
/** /**

View File

@@ -90,7 +90,7 @@ class Basic
* @deprecated DO NOT USE Class\Basic anymore. Use dedicated logger and sub classes * @deprecated DO NOT USE Class\Basic anymore. Use dedicated logger and sub classes
*/ */
public function __construct( public function __construct(
\CoreLibs\Logging\Logging $log = null, ?\CoreLibs\Logging\Logging $log = null,
?string $session_name = null ?string $session_name = null
) { ) {
trigger_error('Class \CoreLibs\Basic is deprected', E_USER_DEPRECATED); trigger_error('Class \CoreLibs\Basic is deprected', E_USER_DEPRECATED);

View File

@@ -52,7 +52,7 @@ class SetVarTypeMain
*/ */
protected static function makeStrMain( protected static function makeStrMain(
mixed $val, mixed $val,
string $default = null, ?string $default = null,
bool $to_null = false bool $to_null = false
): ?string { ): ?string {
// int/float/string/bool/null, everything else is ignored // int/float/string/bool/null, everything else is ignored
@@ -113,7 +113,7 @@ class SetVarTypeMain
*/ */
protected static function makeIntMain( protected static function makeIntMain(
mixed $val, mixed $val,
int $default = null, ?int $default = null,
bool $to_null = false bool $to_null = false
): ?int { ): ?int {
// if we can filter it to a valid int, we can convert it // if we can filter it to a valid int, we can convert it
@@ -167,7 +167,7 @@ class SetVarTypeMain
*/ */
protected static function makeFloatMain( protected static function makeFloatMain(
mixed $val, mixed $val,
float $default = null, ?float $default = null,
bool $to_null = false bool $to_null = false
): ?float { ): ?float {
if ( if (

View File

@@ -35,7 +35,7 @@ class SetVarTypeNull extends Extends\SetVarTypeMain
* @param string|null $default Default override value * @param string|null $default Default override value
* @return string|null Input value as string or default as string/null * @return string|null Input value as string or default as string/null
*/ */
public static function makeStr(mixed $val, string $default = null): ?string public static function makeStr(mixed $val, ?string $default = null): ?string
{ {
return SetVarTypeMain::makeStrMain($val, $default, true); return SetVarTypeMain::makeStrMain($val, $default, true);
} }
@@ -60,7 +60,7 @@ class SetVarTypeNull extends Extends\SetVarTypeMain
* @param int|null $default Default override value * @param int|null $default Default override value
* @return int|null Input value as int or default as int/null * @return int|null Input value as int or default as int/null
*/ */
public static function makeInt(mixed $val, int $default = null): ?int public static function makeInt(mixed $val, ?int $default = null): ?int
{ {
return SetVarTypeMain::makeIntMain($val, $default, true); return SetVarTypeMain::makeIntMain($val, $default, true);
} }
@@ -84,7 +84,7 @@ class SetVarTypeNull extends Extends\SetVarTypeMain
* @param float|null $default Default override value * @param float|null $default Default override value
* @return float|null Input value as float or default as float/null * @return float|null Input value as float or default as float/null
*/ */
public static function makeFloat(mixed $val, float $default = null): ?float public static function makeFloat(mixed $val, ?float $default = null): ?float
{ {
return SetVarTypeMain::makeFloatMain($val, $default, true); return SetVarTypeMain::makeFloatMain($val, $default, true);
} }

View File

@@ -1896,7 +1896,12 @@ class IO
$matches = []; $matches = [];
// compare has =, >, < prefix, and gets stripped // compare has =, >, < prefix, and gets stripped
// if the rest is not X.Y format then error // if the rest is not X.Y format then error
preg_match("/^([<>=]{1,})(\d{1,})\.(\d{1,})/", $compare, $matches); if (!preg_match("/^([<>=]{1,})(\d{1,})\.(\d{1,})/", $compare, $matches)) {
$this->log->error('Could not regex match compare version string', [
"compare" => $compare
]);
return false;
}
$compare = $matches[1]; $compare = $matches[1];
$to_master = $matches[2]; $to_master = $matches[2];
$to_minor = $matches[3]; $to_minor = $matches[3];
@@ -1908,11 +1913,18 @@ class IO
} }
// db_version can return X.Y.Z // db_version can return X.Y.Z
// we only compare the first two // we only compare the first two
preg_match( if (
"/^(\d{1,})\.(\d{1,})\.?(\d{1,})?/", !preg_match(
$this->dbVersion(), "/^(\d{1,})\.(\d{1,})\.?(\d{1,})?/",
$matches $this->dbVersion(),
); $matches
)
) {
$this->log->error('Could not regex match dbVersion string', [
"dbVersion" => $this->dbVersion()
]);
return false;
}
$master = $matches[1]; $master = $matches[1];
$minor = $matches[2]; $minor = $matches[2];
$version = $master . ($minor < 10 ? '0' : '') . $minor; $version = $master . ($minor < 10 ? '0' : '') . $minor;

View File

@@ -123,7 +123,7 @@ class System
* and retuns them in an array with index of io source * and retuns them in an array with index of io source
* if address source has addresses with "," will add "-array" with these as array block * if address source has addresses with "," will add "-array" with these as array block
* *
* @return array * @return array<string,string|array<string>>
*/ */
public static function getIpAddresses(): array public static function getIpAddresses(): array
{ {

View File

@@ -128,7 +128,7 @@ class GetLocale
$matches $matches
) )
) { ) {
$lang = ($matches['lang'] ?? 'en') $lang = $matches['lang']
// add country only if set // add country only if set
. (!empty($matches['country']) ? '_' . $matches['country'] : ''); . (!empty($matches['country']) ? '_' . $matches['country'] : '');
} else { } else {
@@ -235,7 +235,7 @@ class GetLocale
$matches $matches
) )
) { ) {
$lang = ($matches['lang'] ?? 'en') $lang = $matches['lang']
// add country only if set // add country only if set
. (!empty($matches['country']) ? '_' . $matches['country'] : ''); . (!empty($matches['country']) ? '_' . $matches['country'] : '');
} else { } else {

View File

@@ -24,16 +24,20 @@ class ErrorMessage
/** @var bool $log_error global flag to log error level message */ /** @var bool $log_error global flag to log error level message */
private bool $log_error = false; private bool $log_error = false;
/** @var bool $log_warning global flat to log warning level messages */
private bool $log_warning = false;
/** /**
* init ErrorMessage * init ErrorMessage
* *
* @param \CoreLibs\Logging\Logging $log * @param \CoreLibs\Logging\Logging $log
* @param null|bool $log_error [=null], defaults to false if log is not level debug * @param null|bool $log_error [=null], defaults to false if log is not level debug
* @param null|bool $log_warning [=null], defaults to false if log is not level debug
*/ */
public function __construct( public function __construct(
\CoreLibs\Logging\Logging $log, \CoreLibs\Logging\Logging $log,
?bool $log_error = null ?bool $log_error = null,
?bool $log_warning = null
) { ) {
$this->log = $log; $this->log = $log;
// if log default logging is debug then log_error is default set to true // if log default logging is debug then log_error is default set to true
@@ -43,6 +47,13 @@ class ErrorMessage
$log_error = $log_error ?? false; $log_error = $log_error ?? false;
} }
$this->log_error = $log_error; $this->log_error = $log_error;
// if log default logging is debug then log_warning is default set to true
if ($this->log->loggingLevelIsDebug() && $log_warning === null) {
$log_warning = true;
} else {
$log_warning = $log_warning ?? false;
}
$this->log_warning = $log_warning;
} }
/** /**
@@ -81,6 +92,8 @@ class ErrorMessage
* @param array<mixed> $context Additionl info for abort/crash messages * @param array<mixed> $context Additionl info for abort/crash messages
* @param bool|null $log_error [=null] log level 'error' to error, if null use global, * @param bool|null $log_error [=null] log level 'error' to error, if null use global,
* else set for this call only * else set for this call only
* @param bool|null $log_warning [=null] log level 'warning' to warning, if null use global,
* else set for this call only
*/ */
public function setErrorMsg( public function setErrorMsg(
string $error_id, string $error_id,
@@ -93,10 +106,14 @@ class ErrorMessage
?string $message = null, ?string $message = null,
array $context = [], array $context = [],
?bool $log_error = null, ?bool $log_error = null,
?bool $log_warning = null,
): void { ): void {
if ($log_error === null) { if ($log_error === null) {
$log_error = $this->log_error; $log_error = $this->log_error;
} }
if ($log_warning === null) {
$log_warning = $this->log_warning;
}
$original_level = $level; $original_level = $level;
$level = MessageLevel::fromName($level)->name; $level = MessageLevel::fromName($level)->name;
// if not string set, write message string if set, else level/error id // if not string set, write message string if set, else level/error id
@@ -121,6 +138,14 @@ class ErrorMessage
'level' => $original_level, 'level' => $original_level,
], $context)); ], $context));
break; break;
case 'warn':
if ($log_warning) {
$this->log->warning($message ?? $str, array_merge([
'id' => $error_id,
'level' => $original_level,
], $context));
}
break;
case 'error': case 'error':
if ($log_error) { if ($log_error) {
$this->log->error($message ?? $str, array_merge([ $this->log->error($message ?? $str, array_merge([
@@ -169,6 +194,8 @@ class ErrorMessage
* @param array<mixed> $context Additionl info for abort/crash messages * @param array<mixed> $context Additionl info for abort/crash messages
* @param bool|null $log_error [=null] log level 'error' to error, if null use global, * @param bool|null $log_error [=null] log level 'error' to error, if null use global,
* else set for this call only * else set for this call only
* @param bool|null $log_warning [=null] log level 'warning' to warning, if null use global,
* else set for this call only
*/ */
public function setMessage( public function setMessage(
string $level, string $level,
@@ -181,6 +208,7 @@ class ErrorMessage
?string $message = null, ?string $message = null,
array $context = [], array $context = [],
?bool $log_error = null, ?bool $log_error = null,
?bool $log_warning = null,
): void { ): void {
$this->setErrorMsg( $this->setErrorMsg(
$error_id ?? '', $error_id ?? '',
@@ -192,7 +220,8 @@ class ErrorMessage
$jump_target, $jump_target,
$message, $message,
$context, $context,
$log_error $log_error,
$log_warning
); );
} }
@@ -314,6 +343,27 @@ class ErrorMessage
{ {
return $this->log_error; return $this->log_error;
} }
/**
* Set the log warning flag
*
* @param bool $flag True to log level warning too, False for do not (Default)
* @return void
*/
public function setFlagLogWarning(bool $flag): void
{
$this->log_warning = $flag;
}
/**
* Get the current log error flag
*
* @return bool
*/
public function getFlagLogWarning(): bool
{
return $this->log_warning;
}
} }
// __END__ // __END__

View File

@@ -14,6 +14,7 @@ namespace CoreLibs\Logging\Logger;
enum MessageLevel: int enum MessageLevel: int
{ {
case ok = 100; case ok = 100;
case success = 150; // special for file uploads
case info = 200; case info = 200;
case notice = 250; case notice = 250;
case warn = 300; case warn = 300;
@@ -30,6 +31,7 @@ enum MessageLevel: int
{ {
return match (strtolower($name)) { return match (strtolower($name)) {
'ok' => self::ok, 'ok' => self::ok,
'success' => self::success,
'info' => self::info, 'info' => self::info,
'notice' => self::notice, 'notice' => self::notice,
'warn', 'warning' => self::warn, 'warn', 'warning' => self::warn,

View File

@@ -194,13 +194,13 @@ class Elements
"/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/", "/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) { function ($matches) {
return self::createEmail( return self::createEmail(
$matches[1] ?? '', $matches[1],
$matches[2] ?? '', $matches[2],
$matches[3] ?? '', $matches[3],
$matches[4] ?? '', $matches[4],
$matches[5] ?? '', $matches[5],
$matches[7] ?? '', $matches[7] ?? '',
$matches[9] ?? '' $matches[9] ?? '',
); );
}, },
$output $output

View File

@@ -236,10 +236,6 @@ class Block
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $tree * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $tree
* @param bool $add_nl [default=false] * @param bool $add_nl [default=false]
* @return string * @return string
*
* @param array $tree
* @param bool $add_nl
* @return string
*/ */
public static function phfo(array $tree, bool $add_nl = false): string public static function phfo(array $tree, bool $add_nl = false): string
{ {

View File

@@ -401,7 +401,7 @@ class Element
* @param bool $add_nl [default=false] Optional output string line breaks * @param bool $add_nl [default=false] Optional output string line breaks
* @return string HTML as string * @return string HTML as string
*/ */
public function buildHtml(Element $tree = null, bool $add_nl = false): string public function buildHtml(?Element $tree = null, bool $add_nl = false): string
{ {
// print "D01: " . microtime(true) . "<br>"; // print "D01: " . microtime(true) . "<br>";
if ($tree === null) { if ($tree === null) {
@@ -533,7 +533,7 @@ class Element
* @return string build html as string * @return string build html as string
* @deprecated Do not use, use Element->buildHtml() instead * @deprecated Do not use, use Element->buildHtml() instead
*/ */
public static function printHtmlFromObject(Element $tree = null, bool $add_nl = false): string public static function printHtmlFromObject(?Element $tree = null, bool $add_nl = false): string
{ {
// nothing ->bad // nothing ->bad
if ($tree === null) { if ($tree === null) {