Compare commits

...

36 Commits

Author SHA1 Message Date
Clemens Schwaighofer
58e61b8902 autoloader test info update 2021-10-28 10:39:08 +09:00
Clemens Schwaighofer
edfbe476c4 Composer.json add lib/ folder, fix Smart extended class
Smarty extended class is now included in checks and is fixed.

Add the lib/ folder to the composer.json autoloader block so we can use
the composer autoloader and not the one from CoreLibs

Added an autoloader load test backend file
2021-10-28 10:11:56 +09:00
Clemens Schwaighofer
0907325a38 Delete pChart class from standard libs 2021-10-28 10:09:54 +09:00
Clemens Schwaighofer
60b6fae33a Composer php unit install and composer.json update 2021-10-27 17:56:46 +09:00
Clemens Schwaighofer
0b7dba5e2f PHPstan composer autoloader boostrap 2021-10-27 17:46:29 +09:00
Clemens Schwaighofer
c1212d8116 Add basic Test run class 2021-10-27 13:25:59 +09:00
Clemens Schwaighofer
5230cbf5d3 Update DB IO classes with better RETURNING data handle
Dropped old insert_id and insert_id_ext and only kepy insert_id_arr.
Added insert_id_pk_name to get the inserted pk name.
Insert RETURNING also works on non set pk name with RETURNING set

Moved the get insert (RETURNING) into method so it can be called from
both dbExec and dbExecute flow.

Error code 31 is only thrown if no returning is set and insert flow
cannot find a primary key for this table

Update all old insert_id calls from other classes
2021-10-27 12:18:28 +09:00
Clemens Schwaighofer
a6b42f243f Update CoreLibs with phpstan level 8, add qqFileUploader implementation base, add base Test class for testing 2021-10-26 16:35:26 +09:00
Clemens Schwaighofer
736f822363 PHPstan check for level 5
Fix various issues for phpstan level 5

Start initial settings for level 6 (needs type declarations for all
vars)
2021-10-22 11:14:00 +09:00
Clemens Schwaighofer
ffd1a86dcc Force DB IO db_port to INT because it must be INT 2021-10-11 11:16:23 +09:00
Clemens Schwaighofer
b3d783bf63 Add .env reading flow in config.php
Will check if there is a read_env_file.php and then run it to load .env
file in /configs folder

This file can hold secrets that are not to be checked into git

Updated edit.js file to be eslint compatible
2021-10-11 09:40:01 +09:00
Clemens Schwaighofer
e0cc766cc7 Fix Flash constant calls 2021-08-30 11:28:06 +09:00
Clemens Schwaighofer
f151509bfe Update CoreLibs with remove of flash folder and add data folder 2021-08-30 11:25:19 +09:00
Clemens Schwaighofer
e252a76c4c Fix for test datetime, indet on test db, remove debug in test lang 2021-08-13 18:11:37 +09:00
Clemens Schwaighofer
7005e07f4c Composer core updates, Fix for Form/Generate 2021-08-12 16:49:36 +09:00
Clemens Schwaighofer
a86ae3efc3 DB IO updates for settings return, Smarty Extended update
Update core template main body with better position for overlib init,
pagename div id add, remove px from any size call (width)

DB IO adds return for config settings, fix db async check to always
return boolean only, add had error variable return method

Some minor fixes in Smarty Extended for some legacy admin page variables
needed.

Update Error reporting to be self containing with defines
2021-07-26 16:09:51 +09:00
Clemens Schwaighofer
8577345799 class check email fix getEmailRegexCheck
This should only return the part email checks from position 1 to n, but
it returned all of them. Fixed with slice call
2021-07-20 06:18:14 +09:00
Clemens Schwaighofer
4779e4ccbe Bug fixes for PSR-12 update 2021-07-14 16:36:13 +09:00
Clemens Schwaighofer
c1240c0614 config master & other warning ignore 2021-07-14 14:11:36 +09:00
Clemens Schwaighofer
6722468bdb Update from PSR-2 to PSR-12
- Tabs are indent
- Warning at 120, Error at 240 char length
2021-07-14 10:02:27 +09:00
Clemens Schwaighofer
11daac6d23 Debug tests update, IO class fixes, support class fixes
Added more tests to debug, form, system class tests

IO: max calls check return variable name was wrong
Logging: changed from preg to str replace for HTMLPRE tag clean up
Debug: empty string debug, returns filled string with dummy text if
string is empty()
System: return base name as is array

Updated Array IO check for loading control array not only from file, but
from direct variable if set or from an array filled with control array
2021-07-12 06:25:10 +09:00
Clemens Schwaighofer
678aa7460e CoreLibs Array keyword remove and switch over to [] 2021-06-30 15:07:22 +09:00
Clemens Schwaighofer
76e0c0ac06 Update and add class test pages, minor updates for CoreLibs
Some code clean up in smarty class (check if $cms object is actually
set)
Logger/Support Debug clean up for some minor logic with debug prefixes
DB IO update debug prefix for log line so we can have a HTML formatted
prefix for echo output
2021-06-28 18:07:40 +09:00
Clemens Schwaighofer
3512fa73ee Remove all execute flaggs from javascript files 2021-06-28 09:48:14 +09:00
Clemens Schwaighofer
0a80b28553 Add PHPCS ignore for errors in class debug test file 2021-06-17 09:20:19 +09:00
Clemens Schwaighofer
2c5fcd973f Debugger Test updates for logger attching to classes 2021-06-17 06:16:11 +09:00
Clemens Schwaighofer
4515a5fdd1 Change all internal debug printAr calls
Use the correct log->prAr call for debug array prints
2021-06-16 14:53:58 +09:00
Clemens Schwaighofer
f04487d553 Logging class update with dedicated print arrray wrapper
add a prAr that is a new wrapper around print_r, but it does not use
<pre> for layout formatting but {##HTMLPRE##} which will be removed for log
file write or replace with <pre> if printed to the web page
2021-06-16 14:42:52 +09:00
Clemens Schwaighofer
d068aaeed7 Update Debug\Logger for some simpler code
All strings are written to an array and not string append.
Group debug write/debug echo better to make it more simple.
Fixed bug with echo output in logging

Also set debug to be deprecated for phan testing
2021-06-16 10:11:44 +09:00
Clemens Schwaighofer
b628331a9b Fix Login class logging per class setting, fix per class getter
Add a new helper function to get current class that called the debug function.
Fix bug were log_per was not set correctly
Change all get_class calls in debug to the new helper function
2021-06-15 18:06:21 +09:00
Clemens Schwaighofer
3035287b5c Code clean up for Basic Class clean up
Fix all other class code for calling former Basic class methods.
Also try to replace all remaining array() calls to [] type

Some docblock updates when missing or wrong set
2021-06-14 17:03:45 +09:00
Clemens Schwaighofer
cb17b553b0 Update all core libs classes with new Basic class layout 2021-06-14 13:27:18 +09:00
Clemens Schwaighofer
448b54f5c1 Disable logging in Class Basic and redirect all to Debug\Logging 2021-06-11 20:47:42 +09:00
Clemens Schwaighofer
e80915cd5c Further split out Class.Basic
- Email/File/Hash class update
- add random key, running time
- get system calls
- Debug classes for logging, running time, etc
2021-06-08 18:11:09 +09:00
Clemens Schwaighofer
4ae1c2bde0 Basic Class update
Start moving all basic class methods into dedicated classes.
Most of them are static and can be direct called.
No need to group them into one big class that is hard to maintain and
check.

Work is ongoing
2021-06-04 21:22:30 +09:00
Clemens Schwaighofer
ee6e0581da Fix humand readable byte to number javascript method call 2021-05-20 20:43:52 +09:00
1506 changed files with 147571 additions and 19306 deletions

View File

@@ -1,7 +1,5 @@
<?php <?php
use Phan\Config;
/** /**
* This configuration will be read and overlaid on top of the * This configuration will be read and overlaid on top of the
* default configuration. Command line arguments will be applied * default configuration. Command line arguments will be applied
@@ -24,6 +22,9 @@ use Phan\Config;
* of the phan executable or a path passed in via the CLI * of the phan executable or a path passed in via the CLI
* '-d' flag. * '-d' flag.
*/ */
use Phan\Config;
return [ return [
// If true, missing properties will be created when // If true, missing properties will be created when
// they are first seen. If false, we'll report an // they are first seen. If false, we'll report an

View File

@@ -147,4 +147,4 @@ BEGIN
RETURN NULL; RETURN NULL;
END END
$$ $$
LANGUAGE 'plpgsql' LANGUAGE 'plpgsql';

View File

@@ -27,3 +27,9 @@ msgstr "Month"
msgid "INPUT TEST" msgid "INPUT TEST"
msgstr "OUTPUT TEST EN" msgstr "OUTPUT TEST EN"
msgid "I should be translated"
msgstr "I should be translated: I WAS TRANSLATED"
msgid "Are we translated?"
msgstr "Are we translated? Yes, we are!"

View File

@@ -0,0 +1 @@
phan --progress-bar -C --analyze-twice

View File

@@ -0,0 +1 @@
phpstan

View File

@@ -1,5 +1,13 @@
# PHP Core Library # PHP Core Library
## Code Standard
* Uses PSR-12
* tab indent instead of 4 spaces indent
* Warning at 120 character length, error at 240 character length
## General information
Base PHP class files to setup any project Base PHP class files to setup any project
* login * login
* database wrapper * database wrapper
@@ -25,3 +33,13 @@ last tested PHP 5.6 and PHP 7.0
### namespace ### namespace
The new namespace branch. This is the development area for the master branch The new namespace branch. This is the development area for the master branch
## Static checks
With phpstan
`phpstan`
With phan
`phan --progress-bar -C --analyze-twice`
pslam is setup but not configured

View File

@@ -1,6 +1,12 @@
<?php <?php // phpcs:ignore PSR1.Files.SideEffects
// Boostrap file for PHPstand // Boostrap file for PHPstand
// sets the _SERVER['HTTP_HOST'] var so we can have DB detection // sets the _SERVER['HTTP_HOST'] var so we can have DB detection
$_SERVER['HTTP_HOST'] = 'soba.tokyo.tequila.jp'; $_SERVER['HTTP_HOST'] = 'soba.tokyo.tequila.jp';
// so www/includes/edit_base.php works
require_once('www/lib/Smarty/SmartyBC.class.php');
// for whatever reason it does not load that from the confing.master.php
// for includes/admin_header.php
define('BASE_NAME', '');
// __END__ // __END__

View File

@@ -2,37 +2,34 @@
parameters: parameters:
tmpDir: /tmp/phpstan-corelibs tmpDir: /tmp/phpstan-corelibs
level: 1 level: max
paths: paths:
- %currentWorkingDirectory%/www - %currentWorkingDirectory%/www
bootstrapFiles: bootstrapFiles:
- %currentWorkingDirectory%/phpstan-bootstrap.php - %currentWorkingDirectory%/phpstan-bootstrap.php
# - %currentWorkingDirectory%/www/lib/autoloader.php
- %currentWorkingDirectory%/www/vendor/autoload.php
scanDirectories: scanDirectories:
- www/lib/Smarty - www/lib/Smarty
scanFiles: scanFiles:
- www/configs/config.php - www/configs/config.php
- www/configs/config.master.php - www/configs/config.master.php
- www/lib/autoloader.php # if composer.json autoloader defined, this is not needed
# - www/lib/autoloader.php
- www/vendor/autoload.php - www/vendor/autoload.php
- www/lib/Smarty/Autoloader.php - www/lib/Smarty/Autoloader.php
- www/lib/CoreLibs/Template/SmartyExtend.php
excludes_analyse: excludes_analyse:
# no check admin # do not check old qq file uploader tests
- www/admin/qq_file_upload_front.php - www/admin/qq_file_upload_*.php
- www/admin/qq_file_upload_ajax.php # ignore all test files
- www/admin/class_test*php
- www/admin/error_test.php
# admin synlink files # admin synlink files
- www/admin/edit_access.php - www/admin/edit_*.php
- www/admin/edit_groups.php
- www/admin/edit_languages.php
- www/admin/edit_menu_group.php
- www/admin/edit_order.php
- www/admin/edit_pages.php
- www/admin/edit_schemes.php
- www/admin/edit_users.php
- www/admin/edit_visible_group.php
# ignore admin header stuff # ignore admin header stuff
- www/includes/admin_header.php # ignore the admin include stuff # - www/includes/admin_header.php # ignore the admin include stuff
- www/includes/admin_footer.php # ignore the admin include stuff - www/includes/admin_footer.php # ignore the admin include stuff
# deprecated files
- www/includes/admin_set_paths.php # ignore the admin include stuff - www/includes/admin_set_paths.php # ignore the admin include stuff
- www/includes/admin_smarty.php # ignore the admin include stuff - www/includes/admin_smarty.php # ignore the admin include stuff
# folders with data no check needed # folders with data no check needed
@@ -41,16 +38,16 @@ parameters:
- www/log - www/log
- www/media - www/media
- www/tmp - www/tmp
- www/lib/pChart # external libs are not checked
- www/lib/pChart2.1.4 - www/lib/pChart*
- www/lib/Smarty - www/lib/Smarty*
- www/lib/smarty-3.1.30
# ignore composer # ignore composer
- www/vendor - www/vendor
# ignore the smartyextend
- www/lib/CoreLibs/Template/SmartyExtend.php
# ignore errores with # ignore errores with
# ignoreErrors: ignoreErrors:
# -
# message: '#Reflection error: [a-zA-Z0-9\\_]+ not found.#'
# path: www/includes/edit_base.php
#- 'error regex' #- 'error regex'
#- #-
# message: 'error regex' # message: 'error regex'

View File

@@ -0,0 +1,54 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', true);
// sample config
require 'config.php';
// override ECHO ALL FALSE
$ECHO_ALL = true;
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-admin';
ob_end_flush();
$basic = new CoreLibs\Basic();
$backend = new CoreLibs\Admin\Backend(DB_CONFIG);
print "<html><head><title>TEST CLASS: ADMIN BACKEND</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// set acl, from eg login acl
print "SETACL[]: " . $backend->setACL([]) . "<br>";
print "ADBEDITLOG: " . $backend->adbEditLog('CLASSTEST-ADMIN', 'Some info stirng') . "<br>";
print "ADBTOPMENU(0): " . \CoreLibs\Debug\Support::printAr($backend->adbTopMenu()) . "<br>";
print "ADBMSG: " . $backend->adbMsg('info', 'Message: %1$d', [1]) . "<br>";
print "Messaes: " . \CoreLibs\Debug\Support::printAr($this->messages) . "<br>";
print "ADBPRINTDATETIME:<br>" . $backend->adbPrintDateTime(2021, 6, 21, 6, 38, '_test') . "<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,203 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-array';
ob_end_flush();
use CoreLibs\Combined\ArrayHandler;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
// $_array = new CoreLibs\Combined\ArrayHandler();
// $array_class = 'CoreLibs\Combination\ArrayHandler';
print "<html><head><title>TEST CLASS: ARRAY HANDLER</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// recursive array search
$test_array = [
'foo' => 'bar',
'input' => [
'element_a' => [
'type' => 'text'
],
'element_b' => [
'type' => 'email'
],
'element_c' => [
'type' => 'email'
],
],
];
echo "SOURCE ARRAY: " . DgS::printAr($test_array) . "<br>";
// frist return
echo "ARRAYSEARCHRECURSIVE(email, [array], type): "
. DgS::printAr(ArrayHandler::arraySearchRecursive('email', $test_array, 'type')) . "<br>";
echo "ARRAYSEARCHRECURSIVE(email, [array]['input'], type): "
. DgS::printAr(ArrayHandler::arraySearchRecursive('email', $test_array['input'], 'type')) . "<br>";
// all return
echo "ARRAYSEARCHRECURSIVEALL(email, [array], type): "
. Dgs::printAr((array)ArrayHandler::arraySearchRecursiveAll('email', $test_array, 'type')) . "<br>";
// simple search
echo "ARRAYSEARCHSIMPLE([array], type, email): "
. (string)ArrayHandler::arraySearchSimple($test_array, 'type', 'email') . "<br>";
$array_1 = [
'foo' => 'bar'
];
$array_2 = [
1, 2, 3
];
$array_3 = [
'alpha' => [
'beta' => 4
]
];
// recusrice merge
print "ARRAYMERGERECURSIVE: " . DgS::printAr(ArrayHandler::arrayMergeRecursive($array_1, $array_2, $array_3)) . "<br>";
// array difference
$array_left = [
'same' => 'data',
'left' => 'Has L'
];
$array_right = [
'same' => 'data',
'right' => 'has R'
];
print "ARRAYDIFF: " . DgS::printAr(ArrayHandler::arrayDiff($array_left, $array_right)) . "<br>";
// in array check
print "INARRAYANY([1,3], [array]): " . DgS::printAr(ArrayHandler::inArrayAny([1, 3], $array_2)) . "<br>";
// flatten array
print "FLATTENARRAY: " . DgS::printAr(ArrayHandler::flattenArray($test_array)) . "<br>";
print "FLATTENARRAYKEY: " . DgS::printAr(ArrayHandler::flattenArrayKey($test_array)) . "<br>";
// flatten for key set
print "ARRAYFLATFORKEY: " . DgS::printAr(ArrayHandler::arrayFlatForKey($test_array, 'type')) . "<br>";
// DEPRECATED
// print "ARRAYMERGERECURSIVE: ".DgS::printAr($basic->arrayMergeRecursive($array_1, $array_2, $array_3))."<br>";
/**
* attach key/value to an array so it becomes nested
*
* @param string $pre Attach to new (empty for new root node)
* @param string $cur New node
* @param array $node Previous created array
* @return array Updated array
*/
function rec(string $pre, string $cur, array $node = [])
{
if (!is_array($node)) {
$node = [];
}
print "<div style='color: green;'>#### PRE: " . $pre . ", CUR: " . $cur . ", N-c: "
. count($node) . " [" . join('|', array_keys($node)) . "]</div>";
if (!$pre) {
print "** <span style='color: red;'>NEW</span><br>";
$node[$cur] = [];
} else {
if (array_key_exists($pre, $node)) {
print "+ <span style='color: orange;'>KEY FOUND:</span> " . $pre . ", add: " . $cur . "<br>";
$node[$pre][$cur] = [];
} else {
print "- NOT FOUND: loop<br>";
foreach ($node as $_pre => $_cur) {
print "> TRY: " . $_pre . " => " . count($_cur) . " [" . join('|', array_keys($_cur)) . "]<br>";
if (count($_cur) > 0) {
$node[$_pre] = rec($pre, $cur, $_cur);
}
}
}
}
return $node;
}
/**
* flatten array down to own level
*
* @param array $array
* @param array $return
* @return array
*/
function flattenArrayKey(array $array, array $return = [])
{
foreach ($array as $key => $sub) {
$return[] = $key;
if (count($sub) > 0) {
$return = flattenArrayKey($sub, $return);
}
}
return $return;
}
// $test = [
// 'A' => [
// 'B' => [],
// 'C' => [
// 'D' => [],
// 'E' => [
// 'F' => []
// ]
// ]
// ],
// '1' => [],
// '2' => [],
// '3' => [
// 'G' => []
// ]
// ];
// build a tested array for flatten
$test = [];
// core
$test = rec('', 'A', $test);
$test = rec('', '1', $test);
$test = rec('', '2', $test);
$test = rec('', '3', $test);
$test = rec('3', 'G', $test);
$test = rec('A', 'B', $test);
$test = rec('A', 'C', $test);
$test = rec('C', 'D', $test);
$test = rec('C', 'E', $test);
$test = rec('E', 'F', $test);
// new
$test = rec('C', 'U', $test);
$test = rec('F', 'U', $test);
$test = rec('', 'Al', $test);
$test = rec('B', 'B1', $test);
print "ORIGINAL: " . \CoreLibs\Debug\Support::printAr($test) . "<br>";
print "FLATTEN: " . \CoreLibs\Debug\Support::printAr(flattenArrayKey($test)) . "<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,45 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-autoloader';
ob_end_flush();
# Test if composer autoloader works here
use CoreLibs\Convert\Byte;
print "<html><head><title>TEST CLASS: AUTOLOADER</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$bytes = 10242424;
$_bytes = Byte::humanReadableByteFormat($bytes);
print "BYTES: " . $_bytes . "<br>";
print "</body></html>";
// __END__

View File

@@ -0,0 +1,98 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-byte';
ob_end_flush();
use CoreLibs\Convert\Byte;
$basic = new CoreLibs\Basic();
$byte_class = 'CoreLibs\Convert\Byte';
print "<html><head><title>TEST CLASS: BYTE CONVERT</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// class
$byte = 254779258;
$string = '242.98 MB';
// static
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte) . "<br>";
print "S::BYTE FROM: $string: " . $byte_class::stringByteFormat($string) . "<br>";
// *** BYTES TEST ***
$bytes = array(
-123123123,
999999, // KB-1
999999999, // MB-1
254779258, // MB-n
999999999999999, // TB-1
588795544887632, // TB-n
999999999999999999, // PB-1
9223372036854775807, // MAX INT
999999999999999999999, // EB-1
);
print "<b>BYTE FORMAT TESTS</b><br>";
foreach ($bytes as $byte) {
print '<div style="display: flex; border-bottom: 1px dashed gray;">';
//
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
print "(" . number_format($byte) . "/" . $byte . ") bytes :";
$_bytes = Byte::humanReadableByteFormat($byte);
print '</div><div style="width: 10%;">' . $_bytes;
print '</div><div style="width: 10%;">';
print Byte::stringByteFormat($_bytes);
print "</div>";
//
print "</div>";
//
print '<div style="display: flex; border-bottom: 1px dotted red;">';
//
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
print "bytes [si]:";
$_bytes = Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI);
print '</div><div style="width: 10%;">' . $_bytes;
print '</div><div style="width: 10%;">';
print Byte::stringByteFormat($_bytes);
print "</div>";
//
print "</div>";
}
// DEPRECATED
/* $byte = 254779258;
$string = '242.98 MB';
print "BYTE TO: $byte: ".$basic->humanReadableByteFormat($byte)."<br>";
print "BYTE FROM: $string: ".$basic->stringByteFormat($string)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,73 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-colors';
ob_end_flush();
use CoreLibs\Convert\Colors;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
$color_class = 'CoreLibs\Convert\Colors';
print "<html><head><title>TEST CLASS: COLORS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// define a list of from to color sets for conversion test
// A(out of bounds)
print "C::S/COLOR invalid rgb->hex (gray 125): -1, -1, -1: " . CoreLibs\Convert\Colors::rgb2hex(-1, -1, -1) . "<br>";
print "\$C::S/COLOR invalid rgb->hex (gary 125): -1, -1, -1: " . $color_class::rgb2hex(-1, -1, -1) . "<br>";
// B(valid)
$rgb = [10, 20, 30];
$hex = '#0a141e';
$hsb = [210, 67, 12];
$hsl = [210, 50, 7.8];
print "S::COLOR rgb->hex: $rgb[0], $rgb[1], $rgb[2]: " . Colors::rgb2hex($rgb[0], $rgb[1], $rgb[2]) . "<br>";
print "S::COLOR hex->rgb: $hex: " . DgS::printAr(Colors::hex2rgb($hex)) . "<br>";
print "C::S/COLOR rgb->hext: $hex: " . DgS::printAr(CoreLibs\Convert\Colors::hex2rgb($hex)) . "<br>";
// C(to hsb/hsl)
print "S::COLOR rgb->hsb: $rgb[0], $rgb[1], $rgb[2]: "
. DgS::printAr(Colors::rgb2hsb($rgb[0], $rgb[1], $rgb[2])) . "<br>";
print "S::COLOR rgb->hsl: $rgb[0], $rgb[1], $rgb[2]: "
. DgS::printAr(Colors::rgb2hsl($rgb[0], $rgb[1], $rgb[2])) . "<br>";
// D(from hsb/hsl) Note that param 2 + 3 is always 0-100 divided
print "S::COLOR hsb->rgb: $hsb[0], $hsb[1], $hsb[2]: "
. DgS::printAr(Colors::hsb2rgb($hsb[0], $hsb[1], $hsb[2])) . "<br>";
print "S::COLOR hsl->rgb: $hsl[0], $hsl[1], $hsl[2]: "
. DgS::printAr(Colors::hsl2rgb($hsl[0], $hsl[1], $hsl[2])) . "<br>";
// TODO: run compare check input must match output
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,159 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-datetime';
ob_end_flush();
use CoreLibs\Combined\DateTime;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
$datetime_class = 'CoreLibs\Combined\DateTime';
print "<html><head><title>TEST CLASS: DATE/TIME</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// class
$timestamp = 1622788315.123456;
// static
print "S::DATESTRINGFORMAT(sm:0): $timestamp: " . $datetime_class::dateStringFormat($timestamp) . "<br>";
// time string thest
$timestamp = 5887998.33445;
$time_string = DateTime::timeStringFormat($timestamp);
print "PLANE TIME STRING: " . $timestamp . "<br>";
print "TIME STRING TEST: " . $time_string . "<br>";
print "REVERSE TIME STRING: " . DateTime::stringToTime($time_string) . "<br>";
if (round($timestamp, 4) == DateTime::stringToTime($time_string)) {
print "REVERSE TIME STRING MATCH<br>";
} else {
print "REVERSE TRIME STRING DO NOT MATCH<br>";
}
print "ZERO TIME STRING: " . DateTime::timeStringFormat(0, true) . "<br>";
print "ZERO TIME STRING: " . DateTime::timeStringFormat(0.0, true) . "<br>";
print "ZERO TIME STRING: " . DateTime::timeStringFormat(1.005, true) . "<br>";
$timestamps = [
1622788315.123456,
-1622788315.456789
];
foreach ($timestamps as $timestamp) {
print "DATESTRINGFORMAT(sm:0): $timestamp: " . DateTime::dateStringFormat($timestamp) . "<br>";
print "DATESTRINGFORMAT(sm:1): $timestamp: " . DateTime::dateStringFormat($timestamp, true) . "<br>";
}
$intervals = [
788315.123456,
-123.456
];
foreach ($intervals as $interval) {
print "TIMESTRINGFORMAT(sm:0): $interval: " . DateTime::timeStringFormat($interval, false) . "<br>";
$reverse_interval = DateTime::timeStringFormat($interval);
print "TIMESTRINGFORMAT(sm:1): $interval: " . $reverse_interval . "<br>";
print "STRINGTOTIME: $reverse_interval: " . DateTime::stringToTime($reverse_interval) . "<br>";
}
$check_dates = [
'2021-05-01',
'2021-05-40'
];
foreach ($check_dates as $check_date) {
print "CHECKDATE: $check_date: " . (string)DateTime::checkDate($check_date) . "<br>";
}
$check_datetimes = [
'2021-05-01',
'2021-05-40',
'2021-05-01 12:13:14',
'2021-05-40 12:13:14',
'2021-05-01 25:13:14',
];
foreach ($check_datetimes as $check_datetime) {
print "CHECKDATETIME: $check_datetime: " . (string)DateTime::checkDateTime($check_datetime) . "<br>";
}
$compare_dates = [
[ '2021-05-01', '2021-05-02', ],
[ '2021-05-02', '2021-05-01', ],
[ '2021-05-02', '2021-05-02', ],
[ '2017/1/5', '2017-01-05', ],
];
// compareDate
foreach ($compare_dates as $compare_date) {
print "COMPAREDATE: $compare_date[0] = $compare_date[1]: "
. (string)DateTime::compareDate($compare_date[0], $compare_date[1]) . "<br>";
}
$compare_datetimes = [
[ '2021-05-01', '2021-05-02', ],
[ '2021-05-02', '2021-05-01', ],
[ '2021-05-02', '2021-05-02', ],
[ '2021-05-01 10:00:00', '2021-05-01 11:00:00', ],
[ '2021-05-01 11:00:00', '2021-05-01 10:00:00', ],
[ '2021-05-01 10:00:00', '2021-05-01 10:00:00', ],
];
foreach ($compare_datetimes as $compare_datetime) {
print "COMPAREDATE: $compare_datetime[0] = $compare_datetime[1]: "
. (string)DateTime::compareDateTime($compare_datetime[0], $compare_datetime[1]) . "<br>";
}
$compare_dates = [
[ '2021-05-01', '2021-05-10', ],
[ '2021-05-10', '2021-05-01', ],
[ '2021-05-02', '2021-05-01', ],
[ '2021-05-02', '2021-05-02', ],
];
foreach ($compare_dates as $compare_date) {
print "CALCDAYSINTERVAL: $compare_date[0] = $compare_date[1]: "
. DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1])) . "<br>";
print "CALCDAYSINTERVAL(named): $compare_date[0] = $compare_date[1]: "
. DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1], true)) . "<br>";
}
// DEPRECATED
/* $timestamp = 1622788315.123456;
print "C->DATESTRINGFORMAT(sm:0): $timestamp: ".$basic->dateStringFormat($timestamp)."<br>";
$interval = 788315.123456;
$reverse_interval = $basic->timeStringFormat($interval);
print "TIMESTRINGFORMAT(sm:1): $interval: ".$reverse_interval."<br>";
print "STRINGTOTIME: $reverse_interval: ".$basic->stringToTime($reverse_interval)."<br>";
$check_date = '2021-05-01';
print "CHECKDATE: $check_date: ".(string)$basic->checkDate($check_date)."<br>";
$check_datetime = '2021-05-01 12:13:14';
print "CHECKDATETIME: $check_datetime: ".(string)$basic->checkDateTime($check_datetime)."<br>";
$compare_date = ['2021-05-01', '2021-05-02'];
print "COMPAREDATE: $compare_date[0] = $compare_date[1]: "
. (string)$basic->compareDate($compare_date[0], $compare_date[1])."<br>";
$compare_datetime = ['2021-05-01 10:00:00', '2021-05-01 11:00:00'];
print "COMPAREDATE: $compare_datetime[0] = $compare_datetime[1]: "
. (string)$basic->compareDateTime($compare_datetime[0], $compare_datetime[1])."<br>";
$compare_date = ['2021-05-01', '2021-05-10'];
print "CALCDAYSINTERVAL(named): $compare_date[0] = $compare_date[1]: "
. DgS::printAr($basic->calcDaysInterval($compare_date[0], $compare_date[1], true))."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

323
www/admin/class_test.db.php Normal file
View File

@@ -0,0 +1,323 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', true);
// sample config
require 'config.php';
// override ECHO ALL FALSE
$ECHO_ALL = true;
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-db';
ob_end_flush();
use CoreLibs\Debug\Support as DgS;
$db = $basic = new CoreLibs\Admin\Backend(DB_CONFIG);
// NEXT STEP
// $basic = new CoreLibs\Basic();
// change __construct
// add object $logger
// add $this->log = $logger;
// $db = new CoreLibs\DB\IO(DB_CONFIG, $basic->log);
print "<html><head><title>TEST CLASS: DB</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print "DBINFO: " . $db->dbInfo() . "<br>";
echo "DB_CONFIG_SET constant: <pre>" . print_r(DB_CONFIG, true) . "</pre><br>";
// DB client encoding
print "DB Client encoding: " . $db->dbGetEncoding() . "<br>";
while (is_array($res = $db->dbReturn("SELECT * FROM max_test", 0, true))) {
print "TIME: " . $res['time'] . "<br>";
}
print "CACHED DATA: <pre>" . print_r($db->cursor_ext, true) . "</pre><br>";
while (is_array($res = $db->dbReturn("SELECT * FROM max_test"))) {
print "[CACHED] TIME: " . $res['time'] . "<br>";
}
// alternate check for valid data
// while (($res = $db->dbReturn("SELECT * FROM max_test")) !== false) {
// print "[CACHED] TIME: " . $res['time'] . "<br>";
// }
print "<pre>";
// truncate test_foo table before testing
print "<b>TRUNCATE test_foo</b><br>";
$query = "TRUNCATE test_foo";
$db->dbExec($query);
print "<b>TRUNCATE test_foobar</b><br>";
$query = "TRUNCATE test_foobar";
$db->dbExec($query);
$status = $db->dbExec("INSERT INTO test_foo (test) VALUES ('FOO TEST " . time() . "') RETURNING test");
print "DIRECT INSERT STATUS: $status | "
. "PRIMARY KEY: " . $db->dbGetInsertPK() . " | "
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
. "RETURNING EXT[test]: " . print_r($db->dbGetReturningExt('test'), true) . " | "
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
// should throw deprecated error
// $db->getReturningExt();
print "DIRECT INSERT PREVIOUS INSERTED: "
. print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo "
. "WHERE test_foo_id = " . $db->dbGetInsertPK()), true) . "<br>";
// PREPARED INSERT
$db->dbPrepare("ins_test_foo", "INSERT INTO test_foo (test) VALUES ($1) RETURNING test");
$status = $db->dbExecute("ins_test_foo", array('BAR TEST ' . time()));
print "PREPARE INSERT[ins_test_foo] STATUS: $status | "
. "PRIMARY KEY: " . $db->dbGetInsertPK() . " | "
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
. "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true) . "<br>";
print "PREPARE INSERT PREVIOUS INSERTED: "
. print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo "
. "WHERE test_foo_id = " . $db->dbGetInsertPK()), true) . "<br>";
// returning test with multiple entries
// $status = $db->db_exec(
// "INSERT INTO test_foo (test) VALUES "
// . "('BAR 1 " . time() . "'), "
// . "('BAR 2 " . time() . "'), "
// . "('BAR 3 " . time() . "') "
// . "RETURNING test_foo_id"
// );
$status = $db->dbExec(
"INSERT INTO test_foo (test) VALUES "
. "('BAR 1 " . time() . "'), "
. "('BAR 2 " . time() . "'), "
. "('BAR 3 " . time() . "') "
. "RETURNING test_foo_id, test"
);
print "DIRECT MULTIPLE INSERT WITH RETURN STATUS: $status | "
. "PRIMARY KEYS: " . print_r($db->dbGetInsertPK(), true) . " | "
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
. "RETURNING EXT[test]: " . print_r($db->dbGetReturningExt('test'), true) . " | "
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
// no returning, but not needed ;
$status = $db->dbExec("INSERT INTO test_foo (test) VALUES ('FOO; TEST " . time() . "');");
print "DIRECT INSERT NO RETURN STATUS: $status | "
. "PRIMARY KEY: " . $db->dbGetInsertPK() . " | "
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
// UPDATE WITH RETURNING
$status = $db->dbExec("UPDATE test_foo SET test = 'SOMETHING DIFFERENT' WHERE test_foo_id = 3688452 RETURNING test");
print "UPDATE WITH RETURN STATUS: $status | "
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
// INSERT WITH NO RETURNING
$status = $db->dbExec("INSERT INTO test_foobar (type, integer) VALUES ('WITH DATA', 123)");
print "INSERT WITH NO PRIMARY KEY NO RETURNING STATUS: $status | "
. "PRIMARY KEY: " . $db->dbGetInsertPK() . " | "
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
$status = $db->dbExec("INSERT INTO test_foobar (type, integer) VALUES ('WITH DATA', 123) RETURNING type, integer");
print "INSERT WITH NO PRIMARY KEY WITH RETURNING STATUS: $status | "
. "PRIMARY KEY: " . $db->dbGetInsertPK() . " | "
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
print "</pre>";
// READ PREPARE
if (
$db->dbPrepare(
'sel_test_foo',
"SELECT test_foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time "
. "FROM test_foo ORDER BY test_foo_id DESC LIMIT 5"
) === false
) {
print "Error in sel_test_foo prepare<br>";
} else {
$max_rows = 6;
// do not run this in dbFetchArray directly as
// dbFetchArray(dbExecute(...))
// this will end in an endless loop
$cursor = $db->dbExecute('sel_test_foo', []);
$i = 1;
while (($res = $db->dbFetchArray($cursor, true)) !== false) {
print "DB PREP EXEC FETCH ARR: " . $i . ": <pre>" . print_r($res, true) . "</pre><br>";
$i++;
}
}
# db write class test
$table = 'test_foo';
print "TABLE META DATA: " . DgS::printAr($db->dbShowTableMetaData($table)) . "<br>";
// insert first, then use primary key to update
$primary_key = ''; # unset
$db_write_table = ['test', 'string_a', 'number_a', 'some_bool'];
$object_fields_not_touch = [];
$object_fields_not_update = [];
$data = [
'test' => 'dbWriteDataExt: BOOL TEST SOMETHING ' . time(), 'string_a' => 'SOME TEXT', 'number_a' => 5
];
$primary_key = $db->dbWriteDataExt(
$db_write_table,
$primary_key,
$table,
$object_fields_not_touch,
$object_fields_not_update,
$data
);
print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key<br>";
$data = [
'test' => 'dbWriteDataExt: BOOL TEST ON ' . time(), 'string_a' => '', 'number_a' => 0, 'some_bool' => 1
];
$primary_key = $db->dbWriteDataExt(
$db_write_table,
$primary_key,
$table,
$object_fields_not_touch,
$object_fields_not_update,
$data
);
print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key<br>";
$data = [
'test' => 'dbWriteDataExt: BOOL TEST OFF ' . time(), 'string_a' => null, 'number_a' => null, 'some_bool' => 0
];
$primary_key = $db->dbWriteDataExt(
$db_write_table,
$primary_key,
$table,
$object_fields_not_touch,
$object_fields_not_update,
$data
);
print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key<br>";
$data = [
'test' => 'dbWriteDataExt: BOOL TEST UNSET ' . time()
];
$primary_key = $db->dbWriteDataExt(
$db_write_table,
$primary_key,
$table,
$object_fields_not_touch,
$object_fields_not_update,
$data
);
print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got primary key $primary_key<br>";
// return Array Test
$query = "SELECT type, sdate, integer FROM foobar";
$data = $db->dbReturnArray($query, true);
print "Full foobar list: <br><pre>" . print_r($data, true) . "</pre><br>";
# async test queries
/*
$db->dbExecAsync("SELECT test FROM test_foo, (SELECT pg_sleep(10)) as sub WHERE test_foo_id IN (27, 50, 67, 44, 10)");
echo "WAITING FOR ASYNC: ";
$chars = array('|', '/', '-', '\\');
while (($ret = $db->dbCheckAsync()) === true)
{
if ((list($_, $char) = each($chars)) === FALSE)
{
reset($chars);
list($_, $char) = each($chars);
}
print $char;
sleep(1);
flush();
}
print "<br>END STATUS: " . $ret . "<br>";
// while ($res = $db->dbFetchArray($ret))
while ($res = $db->dbFetchArray())
{
echo "RES: " . $res['test'] . "<br>";
}
# test async insert
$db->dbExecAsync("INSERT INTO test_foo (Test) VALUES ('ASYNC TEST " . time() . "')");
echo "WAITING FOR ASYNC INSERT: ";
while (($ret = $db->dbCheckAsync()) === true)
{
print " . ";
sleep(1);
flush();
}
print "<br>END STATUS: " . $ret . " | PK: " . $db->insert_id . "<br>";
print "ASYNC PREVIOUS INSERTED: "
. print_r(
$db->dbReturnRow("SELECT test_foo_id, test FROM test_foo WHERE test_foo_id = "
. $db->insert_id),
true
) . "<br>";
*/
$to_db_version = '9.1.9';
print "VERSION DB: " . $db->dbVersion() . "<br>";
print "DB Version smaller $to_db_version: " . $db->dbCompareVersion('<' . $to_db_version) . "<br>";
print "DB Version smaller than $to_db_version: " . $db->dbCompareVersion('<=' . $to_db_version) . "<br>";
print "DB Version equal $to_db_version: " . $db->dbCompareVersion('=' . $to_db_version) . "<br>";
print "DB Version bigger than $to_db_version: " . $db->dbCompareVersion('>=' . $to_db_version) . "<br>";
print "DB Version bigger $to_db_version: " . $db->dbCompareVersion('>' . $to_db_version) . "<br>";
/*
$q = "Select * from test_foo";
$test_foo = $db->dbExecAsync($q);
print "[ERR] Query: " . $q . "<br>";
print "[ERR] RESOURCE: $test_foo<br>";
while (($ret = $db->dbCheckAsync()) === true)
{
print "[ERR]: $ret<br>";
sleep(5);
}
*/
// search path check
$q = "SHOW search_path";
$cursor = $db->dbExec($q);
$data = $db->dbFetchArray($cursor)['search_path'];
print "RETURN DATA FOR search_path: " . $data . "<br>";
// print "RETURN DATA FOR search_path: " . DgS::printAr($data) . "<br>";
// insert something into test.schema_test and see if we get the PK back
$status = $db->dbExec(
"INSERT INTO test.schema_test (contents, id) VALUES "
. "('TIME: " . time() . "', " . rand(1, 10) . ")"
);
print "OTHER SCHEMA INSERT STATUS: "
. $status . " | PK NAME: " . $db->dbGetInsertPKName() . ", PRIMARY KEY: " . $db->dbGetInsertPK() . "<br>";
print "<b>NULL TEST DB READ</b><br>";
$q = "SELECT uid, null_varchar, null_int FROM test_null_data WHERE uid = 'A'";
$res = $db->dbReturnRow($q);
var_dump($res);
print "RES: " . DgS::printAr($res) . "<br>";
print "ISSET: " . isset($res['null_varchar']) . "<br>";
print "EMPTY: " . empty($res['null_varchar']) . "<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,164 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
// all the settings are overruled by config
$DEBUG_ALL_OVERRIDE = true; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = false;
$ECHO_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-debug';
ob_end_flush();
// override ECHO ALL FALSE
$ECHO_ALL = true;
use CoreLibs\Debug\Support as DebugSupport;
use CoreLibs\Debug\FileWriter;
$basic = new CoreLibs\Basic();
$debug = new CoreLibs\Debug\Logging();
$debug_support_class = 'CoreLibs\Debug\Support';
$debug_logging_class = 'CoreLibs\Debug\Logging';
print "<html><head><title>TEST CLASS: DEBUG</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
function test()
{
return DebugSupport::getCallerMethod(1);
}
print "S::GETCALLERMETHOD: " . DebugSupport::getCallerMethod(0) . "<br>";
print "S::GETCALLERMETHOD: " . test() . "<br>";
print "S::PRINTAR: " . DebugSupport::printAr(['Foo', 'Bar']) . "<br>";
print "V-S::PRINTAR: " . $debug_support_class::printAr(['Foo', 'Bar']) . "<br>";
print "S::DEBUSTRING(s): " . DebugSupport::debugString('SET') . "<br>";
print "S::DEBUSTRING(''): " . DebugSupport::debugString('') . "<br>";
print "S::DEBUSTRING(,s): " . DebugSupport::debugString(null, '{-}') . "<br>";
// debug
print "C->DEBUG: " . $debug->debug('CLASS-TEST-DEBUG', 'Class Test Debug') . "<br>";
print "C->DEBUG(html): " . $debug->debug('CLASS-TEST-DEBUG', 'HTML TAG<br><b>BOLD</b>') . "<br>";
print "C->DEBUG(html,strip): " . $debug->debug('CLASS-TEST-DEBUG', 'HTML TAG<br><b>BOLD</b>', true) . "<br>";
print "C->PRINTERRORMSG: <br>" . $debug->printErrorMsg() . "<br>";
echo "<b>CLASS DEBUG CALL</b><br>";
// @codingStandardsIgnoreLine
class TestL
{
public $log;
public function __construct()
{
$this->log = new CoreLibs\Debug\Logging();
}
public function test(string $ts = null)
{
print "* GETCALLERCLASS(INSIDE CLASS): " . \CoreLibs\Debug\Support::getCallerClass() . "<br>";
$this->log->debug('TESTL', 'Logging in class testL' . ($ts !== null ? ': ' . $ts : ''));
$this->log->debug('TESTL', 'Some other message');
return true;
}
}
// @codingStandardsIgnoreLine
class TestR extends TestL
{
public $foo;
public function __construct()
{
parent::__construct();
}
public function subTest()
{
print "** GETCALLERCLASS(INSIDE EXTND CLASS): " . \CoreLibs\Debug\Support::getCallerClass() . "<br>";
$this->log->debug('TESTR', 'Logging in class testR (extends testL)');
$this->test('TESTR INSIDE');
$this->log->debug('TESTR', 'Array: '
. $this->log->prAr(['a', 'b']) . ', Other: ' . $this->log->prAr(['a', 'b']));
return true;
}
}
$tl = new TestL();
print "CLASS: LOG ECHO: " . (string)$tl->log->getLogLevelAll('echo') . "<br>";
print "CLASS: DEBUG: " . $tl->test() . "<br>";
print "CLASS: PRINTERRORMSG: <br>" . $tl->log->printErrorMsg() . "<br>";
$tr = new TestR();
print "CLASS: LOG ECHO: " . (string)$tr->log->getLogLevelAll('echo') . "<br>";
print "CLASS EXTEND: DEBUG/tl: " . $tr->test('TESTR OUTSIDE') . "<br>";
print "CLASS EXTEND: DEBUG/tr: " . $tr->subTest() . "<br>";
print "CLASS EXTEND: PRINTERRORMSG: <br>" . $tr->log->printErrorMsg() . "<br>";
// test attaching a logger from outside
// @codingStandardsIgnoreLine
class AttachOutside
{
public $log;
public function __construct(object $logger_class)
{
$this->log = $logger_class;
}
public function test()
{
$this->log->debug('ATTACHOUTSIDE', 'A test');
return get_class($this);
}
}
$ao = new AttachOutside($basic->log);
print "AO-CLASS: DEBUG: " . $ao->test() . "<br>";
// @codingStandardsIgnoreLine
class AttachFull
{
public $main;
public function __construct(object $class)
{
$this->main = $class;
}
public function test()
{
// should trigger deprecated
return $this->main->rgb2hex(2, 3, 4);
}
}
$af = new AttachFull($basic);
// should trigger deprecated
print "DEPREACTEDTEST: " . $af->test() . "<br>";
print "GETCALLERCLASS(NON CLASS): " . \CoreLibs\Debug\Support::getCallerClass() . "<br>";
// fdebug
print "S::FSETFILENAME: " . FileWriter::fsetFilename('class_test_debug_file.log') . "<br>";
print "S::FDEBUG: " . FileWriter::fdebug('CLASS TEST DEBUG FILE: ' . date('Y-m-d H:i:s')) . "<br>";
// error message
// future DEPRECATED
// $basic->debug('BASIC CLASS', 'Debug test');
$basic->log->debug('BASIC CLASS', 'Debug test');
print "BASIC PRINTERRORMSG:<br>" . $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,67 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-email';
ob_end_flush();
use CoreLibs\Check\Email;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: HTML/ELEMENTS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// regex get
print "S::GETEMAILREGEX(0): " . Email::getEmailRegex(0) . "<br>";
print "S::GETEMAILREGEX(2): " . Email::getEmailRegex(2) . "<br>";
print "S::GETEMAILREGEX(7): " . Email::getEmailRegex(7) . "<br>";
print "S::GETEMAILREGEX(8 invalid): " . Email::getEmailRegex(8) . "<br>";
print "S::GETEMAILREGEXCHECK: " . DgS::printAr(Email::getEmailRegexCheck()) . "<br>";
$email = [
'foo@bar.org',
'foo@i.softbank.ne.jp'
];
foreach ($email as $s_email) {
print "S::EMAIL: $s_email: " . Email::getEmailType($s_email) . "<br>";
print "S::EMAIL SHORT: $s_email: " . Email::getEmailType($s_email, true) . "<br>";
}
// DEPRECATED
/* foreach ($email as $s_email) {
print "D/S-EMAIL: $s_email: ".$basic->getEmailType($s_email)."<br>";
print "D/S-EMAIL SHORT: $s_email: ".$basic->getEmailType($s_email, true)."<br>";
} */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,100 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-encoding';
ob_end_flush();
use CoreLibs\Language\Encoding;
$basic = new CoreLibs\Basic();
$_encoding = new CoreLibs\Language\Encoding();
$encoding_class = 'CoreLibs\Language\Encoding';
print "<html><head><title>TEST CLASS: ENCODING</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// print "Valid encoding: ".$basic->printAr(mb_list_encodings())."<br>";
$mime_encodes = [
['Simple string UTF8', 'UTF-8'],
['Simple string ISO-2022-JP-MS', 'ISO-2022-JP-MS'],
['日本語ながい', 'UTF-8'],
['日本語ながい', 'ISO-2022-JP-MS'],
['日本語ながい日本語ながい日本語ながい日本語ながい日本語ながい日本語ながい日本語ながい', 'ISO-2022-JP-MS'],
];
foreach ($mime_encodes as $mime_encode) {
print "__MBMIMEENCODE: $mime_encode[0]: " . Encoding::__mbMimeEncode($mime_encode[0], $mime_encode[1]) . "<br>";
}
$enc_strings = [
'Normal Text',
'日本語',
// unworkable
''
];
// class
$_encoding->setErrorChar('∴');
foreach ($enc_strings as $_string) {
$string = $_encoding->checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "ENC CHECK: $_string: " . ($string === false ? '-OK-' : $string) . "<br>";
print "CONV ENCODING: $_string: " . $_encoding->convertEncoding($_string, 'ISO-2022-JP') . "<br>";
print "CONV ENCODING (s): $_string: " . $_encoding->convertEncoding($_string, 'ISO-2022-JP', 'UTF-8') . "<br>";
print "CONV ENCODING (s,a-false): $_string: "
. $_encoding->convertEncoding($_string, 'ISO-2022-JP', 'UTF-8', false) . "<br>";
}
print "ERROR CHAR: " . $_encoding->getErrorChar() . "<br>";
// static
$encoding_class::setErrorChar('∴');
foreach ($enc_strings as $_string) {
$string = $encoding_class::checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "S::ENC CHECK: $_string: " . ($string === false ? '-OK-' : $string) . "<br>";
print "S::CONV ENCODING: $_string: " . $encoding_class::convertEncoding($_string, 'ISO-2022-JP') . "<br>";
print "S::CONV ENCODING (s): $_string: "
. $encoding_class::convertEncoding($_string, 'ISO-2022-JP', 'UTF-8') . "<br>";
print "S::CONV ENCODING (s,a-false): $_string: "
. $encoding_class::convertEncoding($_string, 'ISO-2022-JP', 'UTF-8', false) . "<br>";
}
print "S::ERROR CHAR: " . $encoding_class::getErrorChar() . "<br>";
// static use
$_string = $enc_strings[1];
$string = Encoding::checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "S::ENC CHECK: $_string: " . ($string === false ? '-OK-' : $string) . "<br>";
// DEPRECATED
/* $string = $basic->checkConvertEncoding($_string, 'UTF-8', 'ISO-2022-JP-MS');
print "ENC CHECK: $_string: ".($string === false ? '-OK-' : $string)."<br>";
print "CONV ENCODING: $_string: ".$basic->convertEncoding($_string, 'ISO-2022-JP')."<br>";
print "D/__MBMIMEENCODE: ".$basic->__mbMimeEncode('Some Text', 'UTF-8')."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,50 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-datetime';
ob_end_flush();
use CoreLibs\Check\File;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: FILE</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$file = '/some/path/to/some/file.txt';
print "GETFILENAMEENDING: $file: " . File::getFilenameEnding($file) . "<br>";
$file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php';
print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,65 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-hash';
ob_end_flush();
use CoreLibs\Create\Hash;
$basic = new CoreLibs\Basic();
$hash_class = 'CoreLibs\Create\Hash';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: HASH</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$to_crc = 'Some text block';
// static
print "S::__CRC32B: $to_crc: " . $hash_class::__crc32b($to_crc) . "<br>";
print "S::__SHA1SHORT(off): $to_crc: " . $hash_class::__sha1short($to_crc) . "<br>";
print "S::__SHA1SHORT(on): $to_crc: " . $hash_class::__sha1short($to_crc, true) . "<br>";
print "S::__hash(d): $to_crc: " . $hash_class::__hash($to_crc) . "<br>";
foreach (['adler32', 'fnv132', 'fnv1a32', 'joaat'] as $__hash_c) {
print "S::__hash($__hash_c): $to_crc: " . $hash_class::__hash($to_crc, $__hash_c) . "<br>";
}
// static use
print "U-S::__CRC32B: $to_crc: " . Hash::__crc32b($to_crc) . "<br>";
// DEPRECATED
/* print "D/__CRC32B: $to_crc: ".$basic->__crc32b($to_crc)."<br>";
print "D/__SHA1SHORT(off): $to_crc: ".$basic->__sha1short($to_crc)."<br>";
print "D/__hash(d): $to_crc: ".$basic->__hash($to_crc)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,116 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-html';
ob_end_flush();
use CoreLibs\Convert\Html;
use CoreLibs\Output\Form\Elements;
$basic = new CoreLibs\Basic();
$_html = new CoreLibs\Convert\Html();
$_elements = new CoreLibs\Output\Form\Elements();
$html_class = 'CoreLibs\Convert\Html';
$elements_class = 'CoreLibs\Output\Form\Elements';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: HTML/ELEMENTS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$string = "Something < = > Other <br> Next line";
print "HTMLENT: " . Html::htmlent($string) . ": " . $_html->htmlent($string) . "<br>";
print "REMOVELB: " . Html::htmlent($string) . ": " . $_html->removeLB($string) . "<br>";
$date_str = [2021, 5, 1, 11, 10];
print "PRINTDATETIME: "
. $_elements->printDateTime($date_str[0], $date_str[1], $date_str[2], $date_str[3], $date_str[4]) . "<br>";
// STATIC
$string = "Something < = > Other <br> Next line";
print "S::HTMLENT: " . Html::htmlent($string) . ": " . $html_class::htmlent($string) . "<br>";
print "S::REMOVELB: " . Html::htmlent($string) . ": " . $html_class::removeLB($string) . "<br>";
$date_str = [2021, 5, 1, 11, 10];
print "S::PRINTDATETIME: "
. $elements_class::printDateTime($date_str[0], $date_str[1], $date_str[2], $date_str[3], $date_str[4]) . "<br>";
// STATIC use
echo "U-S::HTML ENT INT: " . Html::htmlent(5) . "<br>";
echo "U-S::HTML ENT STRING: " . Html::htmlent('5<<>') . "<br>";
echo "U-S::HTML ENT NULL: " . Html::htmlent(null) . "<br>";
// check convert
$checked_list = [
['foo', 'foo'],
['foo', 'bar'],
['foo', ['foo', 'bar']],
['foo', ['bar']],
];
foreach ($checked_list as $check) {
print "CHECKED(0): $check[0]: " . Html::checked($check[1], $check[0]) . "<br>";
print "CHECKED(1): $check[0]: " . Html::checked($check[1], $check[0], 1) . "<br>";
}
// magic link creation test
$magic_links = [
'mailto:user@bubu.at',
'user@bubu.at',
'user@bubu.at|Send me email|',
'http://www.somelink.com/?with=1234',
'http://www.somelink.com/?with=1234|Some Title|',
'http://www.somelink.com/?with=1234 <br>Some Title',
];
foreach ($magic_links as $magic_link) {
print "MAGICLINK: " . Html::htmlent($magic_link) . ": " . Html::htmlent(Elements::magicLinks($magic_link)) . "<br>";
}
// DEPREACTED
/* $string = "Deprecated Something < = > Other <br> Deprecated Next line";
print "D/HTMLENT: $string: ".$basic->htmlent($string)."<br>";
print "D/REMOVELB: $string: ".$basic->removeLB($string)."<br>";
$date_str = [2021, 5, 1, 11, 10];
print "D/PRINTDATETIME: "
. $basic->printDateTime($date_str[0], $date_str[1], $date_str[2], $date_str[3], $date_str[4])."<br>";
$magic_link = 'http://www.somelink.com/?with=1234|Some Title|';
print "D/MAGICLINK: ".Html::htmlent($basic->magicLinks($magic_link))."<Br>";
*/
$text = 'I am some text
with some
line breaks
in there. Theis
is sucky';
print "LB remove: " . \CoreLibs\Convert\Html::removeLB($text) . "<br>";
print "LB remove: " . \CoreLibs\Convert\Html::removeLB($text, '##BR##') . "<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,119 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-image';
ob_end_flush();
use CoreLibs\Output\Image;
$basic = new CoreLibs\Basic();
$_image = new CoreLibs\Output\Image();
$image_class = 'CoreLibs\Output\Image';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: IMAGE</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// thumb sizes
$thumb_width = 250;
$thumb_height = 300;
// class
$image = BASE . LAYOUT . CONTENT_PATH . IMAGES . 'no_picture_square.jpg';
// rotate image first
$_image->correctImageOrientation($image);
// thumbnail tests
echo "<div>CLASS->CREATETHUMBNAILSIMPLE: "
. basename($image) . ": WIDTH: $thumb_width<br><img src="
. $_image->createThumbnailSimple($image, $thumb_width) . "></div>";
// static
$image = BASE . LAYOUT . CONTENT_PATH . IMAGES . 'no_picture.jpg';
// rotate image first
$image_class::correctImageOrientation($image);
// thumbnail tests
echo "<div>S::CREATETHUMBNAILSIMPLE: "
. basename($image) . ": WIDTH: $thumb_width<br><img src="
. $image_class::createThumbnailSimple($image, $thumb_width) . "></div>";
echo "U-STATIC VARIOUS:<br>";
// image thumbnail
$images = array(
// height bigger
// 'no_picture.jpg',
// 'no_picture.png',
// width bigger
// 'no_picture_width_bigger.jpg',
// 'no_picture_width_bigger.png',
// square
// 'no_picture_square.jpg',
// 'no_picture_square.png',
// other sample images
// '5c501af48da6c.jpg',
// Apple HEIC files
// 'img_2145.heic',
// Photoshop
'photoshop_test.psd',
);
// return mime type ala mimetype
$finfo = new finfo(FILEINFO_MIME_TYPE);
foreach ($images as $image) {
$image = BASE . LAYOUT . CONTENT_PATH . IMAGES . $image;
list ($height, $width, $img_type) = getimagesize($image);
echo "<div><b>IMAGE INFO</b>: " . $height . "x" . $width . ", TYPE: "
. $img_type . " [" . $finfo->file($image) . "]</div>";
// rotate image first
Image::correctImageOrientation($image);
// thumbnail tests
echo "<div>" . basename($image) . ": WIDTH: $thumb_width<br><img src="
. Image::createThumbnailSimple($image, $thumb_width) . "></div>";
echo "<div>" . basename($image) . ": HEIGHT: $thumb_height<br><img src="
. Image::createThumbnailSimple($image, 0, $thumb_height) . "></div>";
echo "<div>" . basename($image) . ": WIDTH/HEIGHT: $thumb_width x $thumb_height<br><img src="
. Image::createThumbnailSimple($image, $thumb_width, $thumb_height) . "></div>";
// test with dummy
echo "<div>" . basename($image) . ": WIDTH/HEIGHT: $thumb_width x $thumb_height (+DUMMY)<br><img src="
. Image::createThumbnailSimple($image, $thumb_width, $thumb_height, null, true, false) . "></div>";
echo "<hr>";
}
// DEPRECATED
// static
/* $image = BASE.LAYOUT.CONTENT_PATH.IMAGES.'no_picture.jpg';
// rotate image first
$basic->correctImageOrientation($image);
// thumbnail tests
echo "<div>S::CREATETHUMBNAILSIMPLE: ".basename($image).": WIDTH: $thumb_width<br><img src="
. $basic->createThumbnailSimple($image, $thumb_width)."></div>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,76 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-json';
ob_end_flush();
use CoreLibs\Check\Jason;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
$json_class = 'CoreLibs\Check\Jason';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: JSON</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$json = '{"foo": "bar"}';
$output = Jason::jsonConvertToArray($json);
print "S::JSON: $json: " . DgS::printAr($output) . "<br>";
print "S::JSON ERROR: " . Jason::jsonGetLastError() . ": " . Jason::jsonGetLastError(true) . "<br>";
$json = '["f: {b"""ar}]';
$output = Jason::jsonConvertToArray($json);
print "S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
print "S::E-JSON ERROR: " . Jason::jsonGetLastError() . ": " . Jason::jsonGetLastError(true) . "<br>";
// direct
$json = '{"direct": "static function call"}';
$output = $json_class::jsonConvertToArray($json);
print "J/S::JSON: $json: " . DgS::printAr($output) . "<br>";
print "J/S::JSON ERROR: " . $json_class::jsonGetLastError() . ": " . $json_class::jsonGetLastError(true) . "<br>";
$json = '["f: {b"""ar}]';
$output = $json_class::jsonConvertToArray($json);
print "J/S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
print "J/S::E-JSON ERROR: " . $json_class::jsonGetLastError() . ": " . $json_class::jsonGetLastError(true) . "<br>";
// DEPRECATE TEST
/* $json = '["f: {b"""ar}]';
$output = $basic->jsonConvertToArray($json);
print "E-JSON: $json: ".DgS::printAr($output)."<br>";
print "E-JSON ERROR: ".$basic->jsonGetLastError().": ".$basic->jsonGetLastError(true)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,57 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// init language
$lang = 'en_utf8';
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-lang';
$l = new CoreLibs\Language\L10n($lang);
ob_end_flush();
print "<html><head><title>TEST CLASS: LANG</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$string = 'INPUT TEST';
echo "LANGUAGE SET: " . $l->__getLang() . "<br>";
echo "LANGUAGE FILE: " . $l->__getMoFile() . "<br>";
echo "INPUT TEST: " . $string . " => " . $l->__($string) . "<br>";
// switch to other language
$lang = 'ja_utf8';
$l->l10nReloadMOfile($lang);
echo "LANGUAGE SET: " . $l->__getLang() . "<br>";
echo "LANGUAGE FILE: " . $l->__getMoFile() . "<br>";
echo "INPUT TEST: " . $string . " => " . $l->__($string) . "<br>";
// TODO: run compare check input must match output
print "</body></html>";
// __END__

View File

@@ -0,0 +1,60 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-math';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_math = new CoreLibs\Convert\Math();
$math_class = 'CoreLibs\Convert\Math';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: MATH</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print "FCEIL: " . $_math->fceil(5.1234567890, 5) . "<br>";
print "FLOORP: " . $_math->floorp(5123456, -3) . "<br>";
print "INITNUMERIC: " . $_math->initNumeric('123') . "<br>";
print "S-FCEIL: " . $math_class::fceil(5.1234567890, 5) . "<br>";
print "S-FLOORP: " . $math_class::floorp(5123456, -3) . "<br>";
print "S-INITNUMERIC: " . $math_class::initNumeric('123') . "<br>";
// DEPRECATED
/* print "FCEIL: ".$basic->fceil(5.1234567890, 5)."<br>";
print "FLOORP: ".$basic->floorp(5123456, -3)."<br>";
print "INITNUMERIC: ".$basic->initNumeric('123')."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,68 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-mime';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_mime = new CoreLibs\Convert\MimeAppName();
print "<html><head><title>TEST CLASS: MIME</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$mime = 'application/illustrator';
print "MIME $mime: " . $_mime->mimeGetAppName($mime) . "<br>";
$mime = 'fake/mime';
$_mime->mimeSetAppName($mime, 'This is a fake mime');
print "MIME $mime: " . $_mime->mimeGetAppName($mime) . "<br>";
// mime test
$mime = 'application/vnd.ms-excel';
print "App for mime $mime: " . $_mime->mimeGetAppName($mime) . "<br>";
$_mime->mimeSetAppName($mime, 'Microsoft (better) Excel');
print "App for mime changed $mime: " . $_mime->mimeGetAppName($mime) . "<br>";
// static call test
$mime = 'application/x-indesign';
print "S::App for mime $mime: " . \CoreLibs\Convert\MimeAppName::mimeGetAppName($mime) . "<br>";
$mime = 'application/vnd.ms-excel';
print "S::App for mime $mime: " . \CoreLibs\Convert\MimeAppName::mimeGetAppName($mime) . "<br>";
// DEPRECATED
/* $mime = 'application/illustrator';
print "MIME $mime: ".$basic->mimeGetAppName($mime)."<br>";
$mime = 'fake/mime';
$basic->mimeSetAppName($mime, 'This is a fake mime');
print "MIME $mime: ".$basic->mimeGetAppName($mime)."<br>"; */
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,77 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', true);
// sample config
require 'config.php';
// override ECHO ALL FALSE
$ECHO_ALL = true;
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-form';
ob_end_flush();
// define an array for page use
$table_arrays = [];
$table_arrays[\CoreLibs\Get\System::getPageName(1)] = [
// form fields mtaching up with db fields
'table_array' => [
],
// laod query
'load_query' => '',
// database table to load from
'table_name' => '',
// for load dro pdown, format output
'show_fields' => [
[
'name' => 'name'
],
[
'name' => 'enabled',
'binary' => ['Yes', 'No'],
'before_value' => 'Enabled: '
],
],
// a multi reference entry
'element_list' => [
]
];
$basic = new CoreLibs\Basic();
$form = new CoreLibs\Output\Form\Generate(DB_CONFIG);
// $db = new CoreLibs\DB\IO(DB_CONFIG, $basic->log);
print "<html><head><title>TEST CLASS: FORM GENERATE</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print "MOBILE PHONE: " . $form->mobile_phone . "<br>";
// sets table array to include
print "MY PAGE NAME: " . $form->my_page_name . "<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,70 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-pass';
ob_end_flush();
use CoreLibs\Check\Password as PwdChk;
$basic = new CoreLibs\Basic();
$_password = new CoreLibs\Check\Password();
$password_class = 'CoreLibs\Check\Password';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: PASSWORD</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$password = 'something1234';
$enc_password = $_password->passwordSet($password);
print "PASSWORD: $password: " . $enc_password . "<br>";
print "PASSWORD VERIFY: " . (string)$_password->passwordVerify($password, $enc_password) . "<br>";
print "PASSWORD REHASH: " . (string)$_password->passwordRehashCheck($enc_password) . "<br>";
// static verify
$password = 'othername7890';
$enc_password = $password_class::passwordSet($password);
print "PASSWORD: $password: " . $enc_password . "<br>";
print "S-PASSWORD VERIFY: " . (string)$password_class::passwordVerify($password, $enc_password) . "<br>";
print "PASSWORD REHASH: " . (string)$password_class::passwordRehashCheck($enc_password) . "<br>";
// direct static
print "S::PASSWORD VERFIY: " . (string)PwdChk::passwordVerify($password, $enc_password) . "<br>";
// DEPRECATED
/* $password = 'deprecated4567';
$enc_password = $basic->passwordSet($password);
print "PASSWORD: $password: ".$enc_password."<br>";
print "PASSWORD VERIFY: ".(string)$basic->passwordVerify($password, $enc_password)."<br>";
print "PASSWORD REHASH: ".(string)$basic->passwordRehashCheck($enc_password)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -1,12 +1,15 @@
<?php declare(strict_types=1); <?php // phpcs:ignore warning
/** /**
* @phan-file-suppress PhanTypeSuspiciousStringExpression * @phan-file-suppress PhanTypeSuspiciousStringExpression
*/ */
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations declare(strict_types=1);
$DEBUG_ALL = 1;
$PRINT_ALL = 1; $DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DB_DEBUG = 1; $DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) { if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR); error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
@@ -31,22 +34,41 @@ $basic = new CoreLibs\Admin\Backend(DB_CONFIG);
$basic->dbInfo(true); $basic->dbInfo(true);
ob_end_flush(); ob_end_flush();
echo "DB_CONFIG_SET constant: <pre>".print_r(DB_CONFIG, true)."</pre><br>"; print "<html><head><title>TEST CLASS</title><head>";
print "<body>";
$basic->hrRunningTime(); print '<div><a href="class_test.db.php">Class Test: DB</a></div>';
$basic->runningTime(); print '<div><a href="class_test.colors.php">Class Test: Colors</a></div>';
echo "RANDOM KEY [50]: ".$basic->randomKeyGen(50)."<br>"; print '<div><a href="class_test.mime.php">Class Test: MIME</a></div>';
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>"; print '<div><a href="class_test.json.php">Class Test: Json</a></div>';
echo "TIMED [def]: ".$basic->runningTime()."<br>"; print '<div><a href="class_test.token.php">Class Test: Form Token</a></div>';
echo "TIMED [string]: ".$basic->runningtime_string."<br>"; print '<div><a href="class_test.password.php">Class Test: Password</a></div>';
$basic->hrRunningTime(); print '<div><a href="class_test.math.php">Class Test: Math</a></div>';
echo "RANDOM KEY [default]: ".$basic->randomKeyGen()."<br>"; print '<div><a href="class_test.html.php">Class Test: HTML/ELEMENTS</a></div>';
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>"; print '<div><a href="class_test.email.php">Class Test: EMAIL</a></div>';
print '<div><a href="class_test.uids.php">Class Test: UIDS</a></div>';
// color print '<div><a href="class_test.phpv.php">Class Test: PHP VERSION</a></div>';
print "COLOR: -1, -1, -1: ".$basic->rgb2hex(-1, -1, -1)."<br>"; print '<div><a href="class_test.hash.php">Class Test: HASH</a></div>';
print "COLOR: 10, 20, 30: ".$basic->rgb2hex(10, 20, 30)."<br>"; print '<div><a href="class_test.encoding.php">Class Test: ENCODING</a></div>';
print '<div><a href="class_test.image.php">Class Test: IMAGE</a></div>';
print '<div><a href="class_test.byte.php">Class Test: BYTE CONVERT</a></div>';
print '<div><a href="class_test.datetime.php">Class Test: DATE/TIME</a></div>';
print '<div><a href="class_test.array.php">Class Test: ARRAY HANDLER</a></div>';
print '<div><a href="class_test.file.php">Class Test: FILE</a></div>';
print '<div><a href="class_test.randomkey.php">Class Test: RANDOM KEY</a></div>';
print '<div><a href="class_test.system.php">Class Test: SYSTEM</a></div>';
print '<div><a href="class_test.runningtime.php">Class Test: RUNNING TIME</a></div>';
print '<div><a href="class_test.debug.php">Class Test: DEBUG</a></div>';
print '<div><a href="class_test.form.php">Class Test: FORM</a></div>';
print '<div><a href="class_test.backend.php">Class Test: BACKEND ADMIN CLASS</a></div>';
print '<div><a href="class_test.lang.php">Class Test: LANG/L10n</a></div>';
print '<div><a href="class_test.smarty.php">Class Test: SMARTY</a></div>';
print '<div><a href="class_test.autoloader.php">Class Test: AUTOLOADER</a></div>';
print "<hr>";
// print all _ENV vars set
print "<div>READ _ENV ARRAY:</div>";
print "<pre>" . print_r(array_map('htmlentities', $_ENV), true) . "</pre>";
// set + check edit access id // set + check edit access id
$edit_access_id = 3; $edit_access_id = 3;
if (is_object($login) && isset($login->acl['unit'])) { if (is_object($login) && isset($login->acl['unit'])) {
@@ -61,340 +83,64 @@ if (is_object($login) && isset($login->acl['unit'])) {
print "Something went wrong with the login<br>"; print "Something went wrong with the login<br>";
} }
// $basic->debug('SESSION', $basic->print_ar($_SESSION)); // $basic->log->debug('SESSION', \CoreLibs\Debug\Support::printAr($_SESSION));
print "<html><head><title>TEST CLASS</title><head>";
print "<body>";
print '<form method="post" name="loginlogout">'; print '<form method="post" name="loginlogout">';
print '<a href="javascript:document.loginlogout.login_logout.value=\'Logou\';document.loginlogout.submit();">Logout</a>'; print '<a href="javascript:document.loginlogout.login_logout.value=\'Logou\';'
. 'document.loginlogout.submit();">Logout</a>';
print '<input type="hidden" name="login_logout" value="">'; print '<input type="hidden" name="login_logout" value="">';
print '</form>'; print '</form>';
// print the debug core vars // print the debug core vars
print "DEBUG OUT: ".$basic->debug_output."<br>"; foreach (['on', 'off'] as $flag) {
print "ECHO OUT: ".$basic->echo_output."<br>"; foreach (['debug', 'echo', 'print'] as $type) {
print "PRINT OUT: ".$basic->print_output."<br>"; $prefix = $flag == 'off' ? 'NOT ' : '';
print "NOT DEBUG OUT: ".$basic->debug_output_not."<br>"; print $prefix . strtoupper($type) . ' OUT: '
print "NOT ECHO OUT: ".$basic->echo_output_not."<br>"; . \CoreLibs\Debug\Support::printAr($basic->log->getLogLevel($type, $flag)) . '<br>';
print "NOT PRINT OUT: ".$basic->print_output_not."<br>"; }
print "DEBUG OUT ALL: ".$basic->debug_output_all."<br>"; }
print "ECHO OUT ALL: ".$basic->echo_output_all."<br>"; foreach (['debug', 'echo', 'print'] as $type) {
print "PRINT OUT ALL: ".$basic->print_output_all."<br>"; print strtoupper($type) . ' OUT ALL: ' . $basic->log->getLogLevelAll($type) . '<br>';
}
print "CALLER BACKTRACE: ".$basic->getCallerMethod()."<br>"; $basic->log->debug('SOME MARK', 'Some error output');
$basic->debug('SOME MARK', 'Some error output');
// INTERNAL SET
print "EDIT ACCESS ID: " . $basic->edit_access_id . "<br>"; print "EDIT ACCESS ID: " . $basic->edit_access_id . "<br>";
if (is_object($login)) { if (is_object($login)) {
// print "ACL: <br>".$basic->print_ar($login->acl)."<br>"; // print "ACL: <br>".$basic->print_ar($login->acl)."<br>";
$basic->debug('ACL', "ACL: ".$basic->printAr($login->acl)); $basic->log->debug('ACL', "ACL: " . \CoreLibs\Debug\Support::printAr($login->acl));
// print "DEFAULT ACL: <br>".$basic->print_ar($login->default_acl_list)."<br>"; // print "DEFAULT ACL: <br>".$basic->print_ar($login->default_acl_list)."<br>";
// print "DEFAULT ACL: <br>".$basic->print_ar($login->default_acl_list)."<br>"; // print "DEFAULT ACL: <br>".$basic->print_ar($login->default_acl_list)."<br>";
// $result = array_flip(array_filter(array_flip($login->default_acl_list), function ($key) { if (is_numeric($key)) return $key; })); // $result = array_flip(
// array_filter(
// array_flip($login->default_acl_list),
// function ($key) {
// if (is_numeric($key)) {
// return $key;
// }
// }
// )
// );
// print "DEFAULT ACL: <br>".$basic->print_ar($result)."<br>"; // print "DEFAULT ACL: <br>".$basic->print_ar($result)."<br>";
// DEPRICATED CALL // DEPRICATED CALL
// $basic->adbSetACL($login->acl); // $basic->adbSetACL($login->acl);
} }
// DB client encoding print "THIS HOST: " . HOST_NAME . ", with PROTOCOL: " . HOST_PROTOCOL . " is running SSL: " . HOST_SSL . "<br>";
print "DB Client encoding: ".$basic->dbGetEncoding()."<br>"; print "DIR: " . DIR . "<br>";
print "BASE: " . BASE . "<br>";
print "ROOT: " . ROOT . "<br>";
print "HOST: " . HOST_NAME . " => DB HOST: " . DB_CONFIG_NAME . " => " . print_r(DB_CONFIG, true) . "<br>";
while ($res = $basic->dbReturn("SELECT * FROM max_test", 0, true)) { $ds = defined('DS') ? DS : DIRECTORY_SEPARATOR;
print "TIME: ".$res['time']."<br>"; $du = DS ?? DIRECTORY_SEPARATOR;
} print "DS is: " . $ds . "<br>";
print "CACHED DATA: <pre>".print_r($basic->cursor_ext, true)."</pre><br>"; print "SERVER HOST: " . $_SERVER['HTTP_HOST'] . "<br>";
while ($res = $basic->dbReturn("SELECT * FROM max_test")) {
print "[CACHED] TIME: ".$res['time']."<br>";
}
print "<pre>";
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO TEST ".time()."') RETURNING test");
print "DIRECT INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// should throw deprecated error
// $basic->getReturningExt();
print "DIRECT INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
$basic->dbPrepare("ins_foo", "INSERT INTO foo (test) VALUES ($1)");
$status = $basic->dbExecute("ins_foo", array('BAR TEST '.time()));
print "PREPARE INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING RETURN: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "PREPARE INSERT PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->dbGetInsertPK()), true)."<br>";
// returning test with multiple entries
// $status = $basic->db_exec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id");
$status = $basic->dbExec("INSERT INTO foo (test) values ('BAR 1 ".time()."'), ('BAR 2 ".time()."'), ('BAR 3 ".time()."') RETURNING foo_id, test");
print "DIRECT MULTIPLE INSERT STATUS: $status | "
."PRIMARY KEYS: ".print_r($basic->dbGetInsertPK(), true)." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// no returning, but not needed ;
$status = $basic->dbExec("INSERT INTO foo (test) VALUES ('FOO; TEST ".time()."');");
print "DIRECT INSERT STATUS: $status | "
."PRIMARY KEY: ".$basic->dbGetInsertPK()." | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
// UPDATE WITH RETURNING
$status = $basic->dbExec("UPDATE foo SET test = 'SOMETHING DIFFERENT' WHERE foo_id = 3688452 RETURNING test");
print "UPDATE STATUS: $status | "
."RETURNING EXT: ".print_r($basic->dbGetReturningExt(), true)." | "
."RETURNING ARRAY: ".print_r($basic->dbGetReturningArray(), true)."<br>";
print "</pre>";
// REEAD PREPARE
if ($basic->dbPrepare('sel_foo', "SELECT foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time FROM foo ORDER BY foo_id DESC LIMIT 5") === false) {
print "Error in sel_foo prepare<br>";
} else {
$max_rows = 6;
// do not run this in dbFetchArray directly as
// dbFetchArray(dbExecute(...))
// this will end in an endless loop
$cursor = $basic->dbExecute('sel_foo', []);
$i = 1;
while (($res = $basic->dbFetchArray($cursor, true)) !== false) {
print "DB PREP EXEC FETCH ARR: ".$i.": <pre>".print_r($res, true)."</pre><br>";
$i ++;
}
}
# db write class test
$table = 'foo';
print "TABLE META DATA: ".$basic->printAr($basic->dbShowTableMetaData($table))."<br>";
$primary_key = ''; # unset
$db_write_table = array('test', 'string_a', 'number_a', 'some_bool');
// $db_write_table = array('test');
$object_fields_not_touch = array();
$object_fields_not_update = array();
$data = array('test' => 'BOOL TEST SOMETHING '.time(), 'string_a' => 'SOME TEXT', 'number_a' => 5);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST ON '.time(), 'string_a' => '', 'number_a' => 0, 'some_bool' => 1);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST OFF '.time(), 'string_a' => null, 'number_a' => null, 'some_bool' => 0);
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
$data = array('test' => 'BOOL TEST UNSET '.time());
$primary_key = $basic->dbWriteDataExt($db_write_table, $primary_key, $table, $object_fields_not_touch, $object_fields_not_update, $data);
print "Wrote to DB tabel $table and got primary key $primary_key<br>";
// return Array Test
$query = "SELECT type, sdate, integer FROM foobar";
$data = $basic->dbReturnArray($query, true);
print "Full foobar list: <br><pre>".print_r($data, true)."</pre><br>";
# async test queries
/* $basic->dbExecAsync("SELECT test FROM foo, (SELECT pg_sleep(10)) as sub WHERE foo_id IN (27, 50, 67, 44, 10)");
echo "WAITING FOR ASYNC: ";
$chars = array('|', '/', '-', '\\');
while (($ret = $basic->dbCheckAsync()) === true)
{
if ((list($_, $char) = each($chars)) === FALSE)
{
reset($chars);
list($_, $char) = each($chars);
}
print $char;
sleep(1);
flush();
}
print "<br>END STATUS: ".$ret."<br>";
// while ($res = $basic->dbFetchArray($ret))
while ($res = $basic->dbFetchArray())
{
echo "RES: ".$res['test']."<br>";
}
# test async insert
$basic->dbExecAsync("INSERT INTO foo (Test) VALUES ('ASYNC TEST ".time()."')");
echo "WAITING FOR ASYNC INSERT: ";
while (($ret = $basic->dbCheckAsync()) === true)
{
print ".";
sleep(1);
flush();
}
print "<br>END STATUS: ".$ret." | PK: ".$basic->insert_id."<br>";
print "ASYNC PREVIOUS INSERTED: ".print_r($basic->dbReturnRow("SELECT foo_id, test FROM foo WHERE foo_id = ".$basic->insert_id), true)."<br>"; */
$to_db_version = '9.1.9';
print "VERSION DB: ".$basic->dbVersion()."<br>";
print "DB Version smaller $to_db_version: ".$basic->dbCompareVersion('<'.$to_db_version)."<br>";
print "DB Version smaller than $to_db_version: ".$basic->dbCompareVersion('<='.$to_db_version)."<br>";
print "DB Version equal $to_db_version: ".$basic->dbCompareVersion('='.$to_db_version)."<br>";
print "DB Version bigger than $to_db_version: ".$basic->dbCompareVersion('>='.$to_db_version)."<br>";
print "DB Version bigger $to_db_version: ".$basic->dbCompareVersion('>'.$to_db_version)."<br>";
/* $q = "SELECT FOO FRO BAR";
// $q = "Select * from foo";
$foo = $basic->dbExecAsync($q);
print "[ERR] Query: ".$q."<br>";
print "[ERR] RESOURCE: $foo<br>";
while (($ret = $basic->dbCheckAsync()) === true)
{
print "[ERR]: $ret<br>";
sleep(5);
} */
// search path check
$q = "SHOW search_path";
$cursor = $basic->dbExec($q);
$data = $basic->dbFetchArray($cursor)['search_path'];
print "RETURN DATA FOR search_path: ".$data."<br>";
// print "RETURN DATA FOR search_path: ".$basic->printAr($data)."<br>";
// insert something into test.schema_test and see if we get the PK back
$status = $basic->dbExec("INSERT INTO test.schema_test (contents, id) VALUES ('TIME: ".time()."', ".rand(1, 10).")");
print "OTHER SCHEMA INSERT STATUS: ".$status." | PK NAME: ".$basic->pk_name.", PRIMARY KEY: ".$basic->insert_id."<br>";
print "<b>NULL TEST DB READ</b><br>";
$q = "SELECT uid, null_varchar, null_int FROM test_null_data WHERE uid = 'A'";
$res = $basic->dbReturnRow($q);
var_dump($res);
print "RES: ".$basic->printAr($res)."<br>";
print "ISSET: ".isset($res['null_varchar'])."<br>";
print "EMPTY: ".empty($res['null_varchar'])."<br>";
// data read test
// time string thest
$timestamp = 5887998.33445;
$time_string = $basic->timeStringFormat($timestamp);
print "PLANE TIME STRING: ".$timestamp."<br>";
print "TIME STRING TEST: ".$time_string."<br>";
print "REVERSE TIME STRING: ".$basic->stringToTime($time_string)."<br>";
if (round($timestamp, 4) == $basic->stringToTime($time_string)) {
print "REVERSE TIME STRING MATCH<br>";
} else {
print "REVERSE TRIME STRING DO NOT MATCH<br>";
}
print "ZERO TIME STRING: ".$basic->timeStringFormat(0, true)."<br>";
print "ZERO TIME STRING: ".$basic->timeStringFormat(0.0, true)."<br>";
print "ZERO TIME STRING: ".$basic->timeStringFormat(1.005, true)."<br>";
echo "HTML ENT INT: ".$basic->htmlent(5)."<br>";
echo "HTML ENT STRING: ".$basic->htmlent('5<<>')."<br>";
echo "HTML ENT NULL: ".$basic->htmlent(null)."<br>";
// magic links test
print $basic->magicLinks('user@bubu.at').'<br>';
print $basic->magicLinks('http://test.com/foo/bar.php?foo=1').'<br>';
// compare date
$date_1 = '2017/1/5';
$date_2 = '2017-01-05';
print "COMPARE DATE: ".$basic->compareDate($date_1, $date_2)."<br>";
// recursive array search
$test_array = array(
'foo' => 'bar',
'input' => array(
'element_a' => array(
'type' => 'text'
),
'element_b' => array(
'type' => 'email'
),
'element_c' => array(
'type' => 'email'
)
)
);
echo "SOURCE ARRAY: ".$basic->printAr($test_array)."<br>";
echo "FOUND ELEMENTS [base]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array, 'type'))."<br>";
echo "FOUND ELEMENTS [input]: ".$basic->printAr($basic->arraySearchRecursive('email', $test_array['input'], 'type'))."<br>";
// *** BYTES TEST ***
$bytes = array(
-123123123,
999999, // KB-1
999999999, // MB-1
254779258, // MB-n
999999999999999, // TB-1
588795544887632, // TB-n
999999999999999999, // PB-1
9223372036854775807, // MAX INT
999999999999999999999, // EB-1
);
print "<b>BYTE FORMAT TESTS</b><br>";
foreach ($bytes as $byte) {
print '<div style="display: flex; border-bottom: 1px dashed gray;">';
//
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
print "(".number_format($byte)."/".$byte.") bytes :";
print '</div><div style="width: 40%;">';
print $basic->humanReadableByteFormat($byte);
print "</div>";
//
print "</div>";
//
print '<div style="display: flex; border-bottom: 1px dotted red;">';
//
print '<div style="width: 35%; text-align: right; padding-right: 2px;">';
print "bytes [si]:";
print '</div><div style="width: 40%;">';
// print $basic->byteStringFormat($byte, true, false, true);
print $basic->humanReadableByteFormat($byte, $basic::BYTE_FORMAT_SI);
print "</div>";
//
print "</div>";
}
// *** IMAGE TESTS ***
echo "<hr>";
// image thumbnail
$images = array(
// height bigger
// 'no_picture.jpg',
// 'no_picture.png',
// width bigger
// 'no_picture_width_bigger.jpg',
// 'no_picture_width_bigger.png',
// square
// 'no_picture_square.jpg',
// 'no_picture_square.png',
// other sample images
// '5c501af48da6c.jpg',
// Apple HEIC files
// 'img_2145.heic',
// Photoshop
'photoshop_test.psd',
);
$thumb_width = 250;
$thumb_height = 300;
// return mime type ala mimetype
$finfo = new finfo(FILEINFO_MIME_TYPE);
foreach ($images as $image) {
$image = BASE.LAYOUT.CONTENT_PATH.IMAGES.$image;
list ($height, $width, $img_type) = getimagesize($image);
echo "<div>IMAGE INFO: ".$height."x".$width.", TYPE: ".$img_type." [".$finfo->file($image)."]</div>";
// rotate image first
$basic->correctImageOrientation($image);
// thumbnail tests
echo "<div>".basename($image).": WIDTH: $thumb_width<br><img src=".$basic->createThumbnailSimple($image, $thumb_width)."></div>";
echo "<div>".basename($image).": HEIGHT: $thumb_height<br><img src=".$basic->createThumbnailSimple($image, 0, $thumb_height)."></div>";
echo "<div>".basename($image).": WIDTH/HEIGHT: $thumb_width x $thumb_height<br><img src=".$basic->createThumbnailSimple($image, $thumb_width, $thumb_height)."></div>";
// test with dummy
echo "<div>".basename($image).": WIDTH/HEIGHT: $thumb_width x $thumb_height (+DUMMY)<br><img src=".$basic->createThumbnailSimple($image, $thumb_width, $thumb_height, null, true, false)."></div>";
echo "<hr>";
}
// mime test
$mime = 'application/vnd.ms-excel';
print "App for mime: ".$basic->mimeGetAppName($mime)."<br>";
$basic->mimeSetAppName($mime, 'Microsoft Excel');
print "App for mime changed: ".$basic->mimeGetAppName($mime)."<br>";
// print error messages // print error messages
// print $login->printErrorMsg(); // print $login->log->printErrorMsg();
print $basic->printErrorMsg(); print $basic->log->printErrorMsg();
print "</body></html>"; print "</body></html>";

View File

@@ -0,0 +1,70 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-phpv';
ob_end_flush();
use CoreLibs\Check\PhpVersion;
$basic = new CoreLibs\Basic();
$_phpv = new CoreLibs\Check\PhpVersion();
$phpv_class = 'CoreLibs\Check\PhpVersion';
// define a list of from to color sets for conversion test
print "<html><head><title>TEST CLASS: PHP VERSION</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$min_version_s = '7';
$min_version_ss = '7.1';
$min_version = '7.1.0';
$max_version = '7.3.1';
// class
print "MIN: $min_version: " . (string)$_phpv->checkPHPVersion($min_version) . "<br>";
print "MIN/MAX: $min_version/$max_version: " . (string)$_phpv->checkPHPVersion($min_version, $max_version) . "<br>";
print "MIN/S: $min_version_s: " . (string)$_phpv->checkPHPVersion($min_version_s) . "<br>";
print "MIN/SS: $min_version_ss: " . (string)$_phpv->checkPHPVersion($min_version_ss) . "<br>";
// static
print "S::MIN: $min_version: " . (string)$phpv_class::checkPHPVersion($min_version) . "<br>";
print "S::MIN/MAX: $min_version/$max_version: "
. (string)$phpv_class::checkPHPVersion($min_version, $max_version) . "<br>";
print "S::MIN/S: $min_version_s: " . (string)$phpv_class::checkPHPVersion($min_version_s) . "<br>";
print "S::MIN/SS: $min_version_ss: " . (string)$phpv_class::checkPHPVersion($min_version_ss) . "<br>";
// use stats
print "U-S::MIN: $min_version: " . (string)PhpVersion::checkPHPVersion($min_version) . "<br>";
// DEPRECATED
// print "MIN: $min_version: ".(string)$basic->checkPHPVersion($min_version)."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,58 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-randomkey';
ob_end_flush();
use CoreLibs\Create\RandomKey;
$basic = new CoreLibs\Basic();
$array_class = 'CoreLibs\Create\RandomKey';
print "<html><head><title>TEST CLASS: RANDOM KEY</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$key_length = 10;
$key_length_b = 5;
print "S::RANDOMKEYGEN(auto): " . RandomKey::randomKeyGen() . "<br>";
print "S::SETRANDOMKEYLENGTH($key_length): " . RandomKey::setRandomKeyLength($key_length) . "<br>";
print "S::RANDOMKEYGEN($key_length): " . RandomKey::randomKeyGen() . "<br>";
print "S::RANDOMKEYGEN($key_length_b): " . RandomKey::randomKeyGen($key_length_b) . "<br>";
print "S::RANDOMKEYGEN($key_length): " . RandomKey::randomKeyGen() . "<br>";
$_array = new CoreLibs\Create\RandomKey();
print "C->RANDOMKEYGEN(auto): " . $_array->randomKeyGen() . "<br>";
// DEPRECATED
// print "D\RANDOMKEYGEN(auto): ".$basic->randomKeyGen()."<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,66 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-runningtime';
ob_end_flush();
use CoreLibs\Debug\RunningTime;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: RUNNING IMTE</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
RunningTime::hrRunningTime();
RunningTime::runningTime();
echo "RANDOM KEY [50]: " . \CoreLibs\Create\RandomKey::randomKeyGen(50) . "<br>";
echo "TIMED [hr]: " . RunningTime::hrRunningTime() . "<br>";
echo "TIMED [def]: " . RunningTime::runningTime() . "<br>";
echo "TIMED [string]: " . RunningTime::runningTimeString() . "<br>";
RunningTime::hrRunningTime();
echo "RANDOM KEY [default]: " . \CoreLibs\Create\RandomKey::randomKeyGen() . "<br>";
echo "TIMED [hr]: " . RunningTime::hrRunningTime() . "<br>";
// DEPRECATED
/* $basic->hrRunningTime();
$basic->runningTime();
echo "RANDOM KEY [50]: ".$basic->randomKeyGen(50)."<br>";
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>";
echo "TIMED [def]: ".$basic->runningTime()."<br>";
echo "TIMED [string]: ".$basic->runningtime_string."<br>";
$basic->hrRunningTime();
echo "RANDOM KEY [default]: ".$basic->randomKeyGen()."<br>";
echo "TIMED [hr]: ".$basic->hrRunningTime()."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,97 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', true);
// set language
$lang = 'en_utf8';
// sample config
require 'config.php';
// override ECHO ALL FALSE
$ECHO_ALL = true;
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-smarty';
ob_end_flush();
$basic = new CoreLibs\Basic();
$smarty = new CoreLibs\Template\SmartyExtend();
// for testing with or without CMS
// $cms = new CoreLibs\Admin\Backend(DB_CONFIG);
$l = new CoreLibs\Language\L10n($lang);
print "<html><head><title>TEST CLASS: SMARTY</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$smarty->DATA['JS_DEBUG'] = DEBUG;
$smarty->MASTER_TEMPLATE_NAME = 'main_body.tpl';
$smarty->TEMPLATE_NAME = 'smarty_test.tpl';
$smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css';
$smarty->USE_PROTOTYPE = false;
$smarty->USE_JQUERY = true;
$smarty->JS_DATEPICKR = false;
if ($smarty->USE_PROTOTYPE) {
$smarty->ADMIN_JAVASCRIPT = 'edit.pt.js';
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js';
} elseif ($smarty->USE_JQUERY) {
$smarty->ADMIN_JAVASCRIPT = 'edit.jq.js';
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js';
}
$smarty->PAGE_WIDTH = '100%';
// require BASE.INCLUDES.'admin_set_paths.php';
$smarty->setSmartyPaths();
// smarty test
$smarty->DATA['SMARTY_TEST'] = 'Test Data';
$smarty->DATA['TRANSLATE_TEST'] = $l->__('Are we translated?');
$smarty->DATA['TRANSLATE_TEST_SMARTY'] = $smarty->l10n->__('Are we translated?');
// drop down test with optgroups
$options = [
'' => '選択してください',
'4/25(木)' => [
'4/25(木) 11:00-11:50' => '4/25(木) 11:00-11:50',
'4/25(木) 12:20-13:00' => '4/25(木) 12:20-13:00'
],
'4/26(金)' => [
'4/26(金) 11:00-11:50' => '4/26(金) 11:00-11:50',
'4/26(金) 12:20-13:00' => '4/26(金) 12:20-13:00'
],
'4/27(土)' => [
'4/27(土) 11:00-11:50' => '4/27(土) 11:00-11:50',
'4/27(土) 12:20-13:00' => '4/27(土) 12:20-13:00'
],
];
$smarty->DATA['drop_down_test'] = $options;
$smarty->DATA['drop_down_test_selected'] = '';
$smarty->DATA['loop_start'] = 2;
// require BASE.INCLUDES.'admin_smarty.php';
$smarty->setSmartyVarsAdmin();
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,54 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-system';
ob_end_flush();
use CoreLibs\Get\System;
use CoreLibs\Debug\Support as DgS;
$basic = new CoreLibs\Basic();
print "<html><head><title>TEST CLASS: SYSTEM</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print "GETHOSTNAME: " . DgS::printAr(System::getHostName()) . "<br>";
print "GETPAGENAME(0): " . System::getPageName() . "<br>";
print "GETPAGENAME(1): " . System::getPageName(1) . "<br>";
print "GETPAGENAME(2): " . System::getPageName(2) . "<br>";
print "GETPAGENAMEARRAY: " . \CoreLibs\Debug\Support::printAr(System::getPageNameArray()) . "<br>";
// seting errro codes file upload
print "FILEUPLOADERRORMESSAGE(): " . System::fileUploadErrorMessage(-1) . "<br>";
print "FILEUPLOADERRORMESSAGE(UPLOAD_ERR_CANT_WRITE): "
. System::fileUploadErrorMessage(UPLOAD_ERR_CANT_WRITE) . "<br>";
// error message
print $basic->log->printErrorMsg();
print "</body></html>";

View File

@@ -0,0 +1,61 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-token';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_token = new CoreLibs\Output\Form\Token();
$token_class = 'CoreLibs\Output\Form\Token';
print "<html><head><title>TEST CLASS: FORM TOKEN</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
$token = 'test_form_token';
$token_id = $_token->setFormToken($token);
print "TOKEN: $token: (ID) " . $token_id . " => (S) " . $_SESSION[$token] . "<br>";
print "VALIDATE: $token: " . (string)$_token->validateFormToken($token_id, $token) . "<br>";
$token = 'test_form_token_static';
$token_id = $token_class::setFormToken($token);
print "S-TOKEN: $token: (ID) " . $token_id . " => (S) " . $_SESSION[$token] . "<br>";
print "S-VALIDATE: $token: " . (string)$token_class::validateFormToken($token_id, $token) . "<br>";
// DEPRECATED
/* $token = 'test_form_token_deprecated';
$token_id = $basic->setFormToken($token);
print "TOKEN: $token: (ID) ".$token_id." => (S) ".$_SESSION[$token]."<br>";
print "VALIDATE: $token: ".(string)$basic->validateFormToken($token_id, $token)."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -0,0 +1,59 @@
<?php // phpcs:ignore warning
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
if ($DEBUG_ALL) {
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
}
ob_start();
// basic class test file
define('USE_DATABASE', false);
// sample config
require 'config.php';
// set session name
if (!defined('SET_SESSION_NAME')) {
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
}
// define log file id
$LOG_FILE_ID = 'classTest-uids';
ob_end_flush();
$basic = new CoreLibs\Basic();
$_uids = new CoreLibs\Create\Uids();
$uids_class = 'CoreLibs\Create\Uids';
print "<html><head><title>TEST CLASS: UIDS</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
// class
print "UUIDV4: " . $_uids->uuidv4() . "<br>";
print "UNIQID (d): " . $_uids->uniqId() . "<br>";
print "UNIQID (md5): " . $_uids->uniqId('md5') . "<br>";
print "UNIQID (sha256): " . $_uids->uniqId('sha256') . "<br>";
// statc
print "S::UUIDV4: " . $uids_class::uuidv4() . "<br>";
print "S::UNIQID (d): " . $uids_class::uniqId() . "<br>";
print "S::UNIQID (md5): " . $uids_class::uniqId('md5') . "<br>";
print "S::UNIQID (sha256): " . $uids_class::uniqId('sha256') . "<br>";
// DEPRECATED
/* print "D/UUIDV4: ".$basic->uuidv4()."<br>";
print "/DUNIQID (d): ".$basic->uniqId()."<br>"; */
// error message
print $basic->log->printErrorMsg();
print "</body></html>";
// __END__

View File

@@ -1,4 +1,6 @@
<?php declare(strict_types=1); <?php
declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations $DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1; $DEBUG_ALL = 1;
@@ -17,3 +19,5 @@ require(BASE.LIB."Error.Handling.php");
if ($var) { if ($var) {
echo "OUT<br>"; echo "OUT<br>";
} }
// this wll throw an error and also write
// asdfa(09);

View File

@@ -1,29 +0,0 @@
<?php declare(strict_types=1);
// debug for L10n issues in php 7.3
// namespace test
ob_start();
// init language
$lang = 'en_utf8';
// admin class tests
require 'config.php';
$l = new CoreLibs\Language\L10n($lang);
ob_end_flush();
$string = 'INPUT TEST';
echo "LANGUAGE SET: ".$l->__getLang()."<br>";
echo "LANGUAGE FILE: ".$l->__getMoFile()."<br>";
echo "INPUT TEST: ".$string." => ".$l->__($string)."<br>";
// switch to other language
$lang = 'ja_utf8';
$l->l10nReloadMOfile($lang);
echo "LANGUAGE SET: ".$l->__getLang()."<br>";
echo "LANGUAGE FILE: ".$l->__getMoFile()."<br>";
echo "INPUT TEST: ".$string." => ".$l->__($string)."<br>";
// __END__

View File

@@ -1,42 +0,0 @@
<?php declare(strict_types=1);
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
// namespace test
ob_start();
// admin class tests
require 'config.php';
$SET_SESSION_NAME = EDIT_SESSION_NAME;
echo "DIR: ".DIR."<br>ROOT: ".ROOT."<br>BASE: ".BASE."<br>";
$base = new CoreLibs\Admin\Backend(DB_CONFIG);
ob_end_flush();
if ($base->getConnectionStatus()) {
die("Cannot connect to database");
}
print "Start time: ".$base->runningTime()."<br>";
print "HumanReadableByteFormat: ".$base->HumanReadableByteFormat(1234567.12)."<br>";
print "humanReadableByteFormat: ".$base->humanReadableByteFormat(1234567.12)."<br>";
// print "get_page_name [DEPRECATED]: ".$base->get_page_name()."<br>";
print "getPageName: ".$base->getPageName()."<br>";
print "DB Info: ".$base->dbInfo(true)."<br>";
print "End Time: ".$base->runningTime()."<br>";
print "Start Time: ".$base->runningTime()."<br>";
print "Lang: ".$base->l->__getLang().", MO File: ".$base->l->__getMoFile()."<br>";
print "Translate test: Year -> ".$base->l->__('Year')."<br>";
print "End Time: ".$base->runningTime()."<br>";
// end error print
print $base->printErrorMsg();
# __END__

View File

@@ -1,34 +0,0 @@
<?php declare(strict_types=1);
namespace Foo;
class FooBar
{
public $foo = '';
public function __construct()
{
$this->foo = 'BAR';
}
public function otherBarBar($wrong)
{
echo "B: $wrong<br>";
}
public function barBar($wrong)
{
echo "B: $wrong<br>";
}
}
$foo = $bar ?? 'EMPTY';
echo "BAR: ".$foo."<br>";
// define('DS', DIRECTORY_SEPARATOR);
$ds = defined('DS') ? DS : DIRECTORY_SEPARATOR;
$du = DS ?? DIRECTORY_SEPARATOR;
echo "DS is: ".$ds."<br>";
echo "SERVER HOST: ".$_SERVER['HTTP_HOST']."<br>";
// __END__

View File

@@ -1,4 +1,6 @@
<?php declare(strict_types=1); <?php
declare(strict_types=1);
require 'config.php'; require 'config.php';
require BASE . INCLUDES . 'admin_header.php'; require BASE . INCLUDES . 'admin_header.php';

View File

@@ -21,11 +21,13 @@ $uploader = new FileUpload\qqFileUploader($allowedExtensions, $sizeLimit);
$_action = $_POST['action'] ? $_POST['action'] : $_GET['action']; $_action = $_POST['action'] ? $_POST['action'] : $_GET['action'];
$_task_uid = $_POST['task_uid'] ? $_POST['task_uid'] : $_GET['task_uid']; $_task_uid = $_POST['task_uid'] ? $_POST['task_uid'] : $_GET['task_uid'];
$get_post['start'] = microtime(true); $get_post['start'] = microtime(true);
$base->debug('AJAX UPLOAD', 'Action: '.$_action.', Task UID: '.$_task_uid.' => '.$base->dateStringFormat($get_post['start'])); $base->debug('AJAX UPLOAD', 'Action: ' . $_action . ', Task UID: '
. $_task_uid . ' => ' . $base->dateStringFormat($get_post['start']));
$upload_path = ROOT . MEDIA . UPLOADS; $upload_path = ROOT . MEDIA . UPLOADS;
$get_post['result'] = $uploader->handleUpload($upload_path, false); $get_post['result'] = $uploader->handleUpload($upload_path, false);
$base->debug('AJAX UPLOAD', 'Memory peak: '.$base->ByteStringFormat(memory_get_usage()).' | '.$base->ByteStringFormat(memory_get_peak_usage())); $base->debug('AJAX UPLOAD', 'Memory peak: ' . $base->ByteStringFormat(memory_get_usage())
. ' | ' . $base->ByteStringFormat(memory_get_peak_usage()));
// set file name // set file name
$get_post['filename'] = $uploader->uploadFileName; $get_post['filename'] = $uploader->uploadFileName;

View File

@@ -1,59 +0,0 @@
<?php declare(strict_types=1);
$ENABLE_ERROR_HANDLING = 0;
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
$LOG_PER_RUN = 1;
define('USE_DATABASE', true);
define('USE_HEADER', true);
require 'config.php';
require BASE.INCLUDES.'admin_header.php';
if (is_object($smarty)) {
$smarty->MASTER_TEMPLATE_NAME = 'main_body.tpl';
$smarty->TEMPLATE_NAME = 'smarty_test.tpl';
$smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css';
$smarty->USE_PROTOTYPE = false;
$smarty->USE_JQUERY = true;
$smarty->JS_DATEPICKR = false;
if ($smarty->USE_PROTOTYPE) {
$smarty->ADMIN_JAVASCRIPT = 'edit.pt.js';
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js';
} elseif ($smarty->USE_JQUERY) {
$smarty->ADMIN_JAVASCRIPT = 'edit.jq.js';
$smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js';
}
$smarty->PAGE_WIDTH = '100%';
// require BASE.INCLUDES.'admin_set_paths.php';
$smarty->setSmartyPaths();
// smarty test
$smarty->DATA['SMARTY_TEST'] = 'Test Data';
$smarty->DATA['TRANSLATE_TEST'] = $cms->l->__('Are we translated?');
}
// drop down test with optgroups
$options = array (
'' => '選択してください',
'4/25(木)' => array (
'4/25(木) 11:00-11:50' => '4/25(木) 11:00-11:50',
'4/25(木) 12:20-13:00' => '4/25(木) 12:20-13:00'
),
'4/26(金)' => array (
'4/26(金) 11:00-11:50' => '4/26(金) 11:00-11:50',
'4/26(金) 12:20-13:00' => '4/26(金) 12:20-13:00'
),
'4/27(土)' => array (
'4/27(土) 11:00-11:50' => '4/27(土) 11:00-11:50',
'4/27(土) 12:20-13:00' => '4/27(土) 12:20-13:00'
)
);
if (is_object($smarty)) {
$smarty->DATA['drop_down_test'] = $options;
$smarty->DATA['loop_start'] = 2;
// require BASE.INCLUDES.'admin_smarty.php';
$smarty->setSmartyVarsAdmin();
}
require BASE.INCLUDES.'admin_footer.php';

View File

@@ -1,111 +0,0 @@
<?php
/**
* @phan-file-suppress PhanTypeSuspiciousStringExpression
*/
namespace CoreLibs;
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
$DEBUG_ALL = 1;
$PRINT_ALL = 1;
$DB_DEBUG = 1;
// admin class tests
require 'config.php';
$SET_SESSION_NAME = EDIT_SESSION_NAME;
$base = new Basic();
print "THIS HOST: ".HOST_NAME.", with PROTOCOL: ".HOST_PROTOCOL." is running SSL: ".HOST_SSL."<br>";
print "DIR: ".DIR."<br>";
print "BASE: ".BASE."<br>";
print "ROOT: ".ROOT."<br>";
print "HOST: ".HOST_NAME." => DB HOST: ".DB_CONFIG_NAME." => ".print_r(DB_CONFIG, true)."<br>";
$text = 'I am some text
with some
line breaks
in there. Theis
is sucky';
print "LB remove: ".$base->removeLB($text)."<br>";
print "LB remove: ".$base->removeLB($text, '##BR##')."<br>";
// $test = array (
// 'A' => array (
// 'B' => array (),
// 'C' => array (
// 'D' => array (),
// 'E' => array (
// 'F' => array ()
// )
// )
// ),
// '1' => array (),
// '2' => array (),
// '3' => array (
// 'G' => array ()
// )
// );
// $base->debug('ARRAY', $base->printAr($test));
function rec($pre, $cur, $node = array ())
{
if (!is_array($node)) {
$node = array ();
}
print "<div style='color: green;'>#### PRE: ".$pre.", CUR: ".$cur.", N-c: ".count($node)." [".join('|', array_keys($node))."]</div>";
if (!$pre) {
print "** <span style='color: red;'>NEW</span><br>";
$node[$cur] = array ();
} else {
if (array_key_exists($pre, $node)) {
print "+ <span style='color: orange;'>KEY FOUND:</span> ".$pre.", add: ".$cur."<br>";
$node[$pre][$cur] = array ();
} else {
print "- NOT FOUND: loop<br>";
foreach ($node as $_pre => $_cur) {
print "> TRY: ".$_pre." => ".count($_cur)." [".join('|', array_keys($_cur))."]<br>";
if (count($_cur) > 0) {
$node[$_pre] = rec($pre, $cur, $_cur);
}
}
}
}
return $node;
}
function flattenArrayKey(array $array, array $return = array ())
{
foreach ($array as $key => $sub) {
$return[] = $key;
if (count($sub) > 0) {
$return = flattenArrayKey($sub, $return);
}
}
return $return;
}
$test = array ();
// core
$test = rec('', 'A', $test);
$test = rec('', '1', $test);
$test = rec('', '2', $test);
$test = rec('', '3', $test);
$test = rec('3', 'G', $test);
$test = rec('A', 'B', $test);
$test = rec('A', 'C', $test);
$test = rec('C', 'D', $test);
$test = rec('C', 'E', $test);
$test = rec('E', 'F', $test);
// new
$test = rec('C', 'U', $test);
$test = rec('F', 'U', $test);
$test = rec('', 'Al', $test);
$test = rec('B', 'B1', $test);
$base->debug('REC', $base->printAr($test));
print "FLATTEN: ".$base->printAr(flattenArrayKey($test))."<br>";
print $base->printErrorMsg();
// __END__

View File

@@ -1,5 +1,5 @@
{ {
"name": "gullevek/www", "name": "gullevek/corelibs",
"description": "CoreLibs", "description": "CoreLibs",
"type": "library", "type": "library",
"authors": [ "authors": [
@@ -8,5 +8,12 @@
"email": "clemens.schwaighofer@egplusww.com" "email": "clemens.schwaighofer@egplusww.com"
} }
], ],
"require": {} "autoload": {
"classmap": [
"lib/"
]
},
"require-dev": {
"phpunit/phpunit": "^9"
}
} }

2112
www/composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

8
www/configs/.env.example Normal file
View File

@@ -0,0 +1,8 @@
# Master configs
BASE_NAME=
G_TITLE=
# DB configs
DB_NAME_TEST=
DB_USER_TEST=
DB_PASS_TEST=
DB_HOST_TEST=

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11 * CREATED: 2018/10/11
@@ -7,19 +8,21 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
// please be VERY carefull only to change the right side // please be VERY carefull only to change the right side
$DB_CONFIG = [ $DB_CONFIG = [
'test' => [ 'test' => [
'db_name' => 'gullevek', 'db_name' => $_ENV['DB_NAME_TEST'] ?? '',
'db_user' => 'gullevek', 'db_user' => $_ENV['DB_USER_TEST'] ?? '',
'db_pass' => 'gullevek', 'db_pass' => $_ENV['DB_PASS_TEST'] ?? '',
'db_host' => 'db.tokyo.tequila.jp', 'db_host' => $_ENV['DB_HOST_TEST'] ?? '',
'db_port' => 5432, 'db_port' => 5432,
'db_schema' => 'public', 'db_schema' => 'public',
'db_type' => 'pgsql', 'db_type' => 'pgsql',
'db_encoding' => '', 'db_encoding' => '',
'db_ssl' => 'disable' // allow, disable, require, prefer 'db_ssl' => 'allow' // allow, disable, require, prefer
] ],
]; ];
// __END__ // __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11 * CREATED: 2018/10/11
@@ -11,6 +12,8 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
// other master config to attach // other master config to attach
// $__LOCAL_CONFIG = [ // $__LOCAL_CONFIG = [
// 'db_host' => '', // 'db_host' => '',

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php // phpcs:ignore PSR1.Files.SideEffects
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2003/06/10 * CREATED: 2003/06/10
@@ -7,6 +8,8 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
/************* PATHS *********************/ /************* PATHS *********************/
// directory seperator // directory seperator
define('DS', DIRECTORY_SEPARATOR); define('DS', DIRECTORY_SEPARATOR);
@@ -38,8 +41,6 @@ define('IMAGES', 'images'.DS);
define('ICONS', 'icons' . DS); define('ICONS', 'icons' . DS);
// media (accessable from outside) // media (accessable from outside)
define('MEDIA', 'media' . DS); define('MEDIA', 'media' . DS);
// flash-root (below media or data)
define('FLASH', 'flash'.DS);
// uploads (anything to keep or data) // uploads (anything to keep or data)
define('UPLOADS', 'uploads' . DS); define('UPLOADS', 'uploads' . DS);
// files (binaries) (below media or data) // files (binaries) (below media or data)
@@ -83,7 +84,7 @@ define('DEFAULT_HASH', 'sha256');
// default acl level // default acl level
define('DEFAULT_ACL_LEVEL', 80); define('DEFAULT_ACL_LEVEL', 80);
// SSL host name // SSL host name
// define('SSL_HOST', 'ssl.host.name'); // define('SSL_HOST', $_ENV['SSL_HOST'] ?? '');
// error page strictness, Default is 3 // error page strictness, Default is 3
// 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all // 1: only show error page as the last mesure if really no mid & aid can be loaded and found at all
// 2: if template not found, do not search, show error template // 2: if template not found, do not search, show error template
@@ -114,12 +115,12 @@ define('PASSWORD_UPPER', '(?=.*[A-Z])');
define('PASSWORD_NUMBER', '(?=.*\d)'); define('PASSWORD_NUMBER', '(?=.*\d)');
define('PASSWORD_SPECIAL', "(?=.*[" . PASSWORD_SPECIAL_RANGE . "])"); define('PASSWORD_SPECIAL', "(?=.*[" . PASSWORD_SPECIAL_RANGE . "])");
// define full regex // define full regex
define('PASSWORD_REGEX', "/^". define('PASSWORD_REGEX', "/^"
(defined('PASSWORD_LOWER') ? PASSWORD_LOWER : ''). . (defined('PASSWORD_LOWER') ? PASSWORD_LOWER : '')
(defined('PASSWORD_UPPER') ? PASSWORD_UPPER : ''). . (defined('PASSWORD_UPPER') ? PASSWORD_UPPER : '')
(defined('PASSWORD_NUMBER') ? PASSWORD_NUMBER : ''). . (defined('PASSWORD_NUMBER') ? PASSWORD_NUMBER : '')
(defined('PASSWORD_SPECIAL') ? PASSWORD_SPECIAL : ''). . (defined('PASSWORD_SPECIAL') ? PASSWORD_SPECIAL : '')
"[A-Za-z\d".PASSWORD_SPECIAL_RANGE."]{".PASSWORD_MIN_LENGTH.",".PASSWORD_MAX_LENGTH."}$/"); . "[A-Za-z\d" . PASSWORD_SPECIAL_RANGE . "]{" . PASSWORD_MIN_LENGTH . "," . PASSWORD_MAX_LENGTH . "}$/");
/************* AJAX / ACCESS *************/ /************* AJAX / ACCESS *************/
// ajax request type // ajax request type
@@ -130,15 +131,16 @@ define('USE_SCRIPTACULOUS', false);
define('USE_JQUERY', true); define('USE_JQUERY', true);
/************* LAYOUT WIDTHS *************/ /************* LAYOUT WIDTHS *************/
define('PAGE_WIDTH', 800); define('PAGE_WIDTH', '100%');
define('CONTENT_WIDTH', 800); define('CONTENT_WIDTH', '100%');
// the default template name // the default template name
define('MASTER_TEMPLATE_NAME', 'main_body.tpl'); define('MASTER_TEMPLATE_NAME', 'main_body.tpl');
/************* OVERALL CONTROL NAMES *************/ /************* OVERALL CONTROL NAMES *************/
// BELOW has HAS to be changed // BELOW has HAS to be changed
// base name for all session and log names // base name for all session and log names
define('BASE_NAME', 'CoreLibs'); // only alphanumeric characters, strip all others
define('BASE_NAME', preg_replace('/[^A-Za-z0-9]/', '', $_ENV['BASE_NAME'] ?? ''));
/************* SESSION NAMES *************/ /************* SESSION NAMES *************/
// server name HASH // server name HASH
@@ -217,7 +219,8 @@ if (!isset($SITE_CONFIG[HOST_NAME]['location'])) {
// we have either no db selction for this host but have db config entries // we have either no db selction for this host but have db config entries
// or we have a db selection but no db config as array or empty // or we have a db selection but no db config as array or empty
// or we have a selection but no matching db config entry // or we have a selection but no matching db config entry
if ((!isset($SITE_CONFIG[HOST_NAME]['db_host']) && count($DB_CONFIG)) || if (
(!isset($SITE_CONFIG[HOST_NAME]['db_host']) && count($DB_CONFIG)) ||
(isset($SITE_CONFIG[HOST_NAME]['db_host']) && (isset($SITE_CONFIG[HOST_NAME]['db_host']) &&
// missing DB CONFIG // missing DB CONFIG
((is_array($DB_CONFIG) && !count($DB_CONFIG)) || ((is_array($DB_CONFIG) && !count($DB_CONFIG)) ||
@@ -230,8 +233,10 @@ if ((!isset($SITE_CONFIG[HOST_NAME]['db_host']) && count($DB_CONFIG)) ||
exit; exit;
} }
// set SSL on // set SSL on
if ((array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || if (
$_SERVER['SERVER_PORT'] == 443) { (array_key_exists('HTTPS', $_SERVER) && !empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ||
$_SERVER['SERVER_PORT'] == 443
) {
define('HOST_SSL', true); define('HOST_SSL', true);
define('HOST_PROTOCOL', 'https://'); define('HOST_PROTOCOL', 'https://');
} else { } else {
@@ -244,8 +249,10 @@ define('DB_CONFIG', isset($DB_CONFIG[DB_CONFIG_NAME]) ? $DB_CONFIG[DB_CONFIG_NAM
// define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']); // define('DB_CONFIG_TARGET', SITE_CONFIG[$HOST_NAME]['db_host_target']);
// define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']); // define('DB_CONFIG_OTHER', SITE_CONFIG[$HOST_NAME]['db_host_other']);
// override for login and global schemas // override for login and global schemas
// define('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA); // where the edit* tables are // where the edit* tables are
// define('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA); // where global tables are that are used by all schemas (eg queue tables for online, etc) // define('LOGIN_DB_SCHEMA', PUBLIC_SCHEMA);
// where global tables are that are used by all schemas (eg queue tables for online, etc)
// define('GLOBAL_DB_SCHEMA', PUBLIC_SCHEMA);
// debug settings, site lang, etc // debug settings, site lang, etc
define('TARGET', $SITE_CONFIG[HOST_NAME]['location']); define('TARGET', $SITE_CONFIG[HOST_NAME]['location']);
define('DEBUG', $SITE_CONFIG[HOST_NAME]['debug_flag']); define('DEBUG', $SITE_CONFIG[HOST_NAME]['debug_flag']);
@@ -260,7 +267,7 @@ define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled']);
define('SHOW_ALL_ERRORS', true); define('SHOW_ALL_ERRORS', true);
/************* GENERAL PAGE TITLE ********/ /************* GENERAL PAGE TITLE ********/
define('G_TITLE', '<OVERALL FALLBACK PAGE TITLE>'); define('G_TITLE', $_ENV['G_TITLE'] ?? '');
/************ STYLE SHEETS / JS **********/ /************ STYLE SHEETS / JS **********/
define('ADMIN_STYLESHEET', 'edit.css'); define('ADMIN_STYLESHEET', 'edit.css');
@@ -294,7 +301,15 @@ if (defined('DEBUG') && DEBUG == false) {
} }
/************* AUTO LOADER *******************/ /************* AUTO LOADER *******************/
// read auto loader // read auto loader for lib only
require BASE.LIB.'autoloader.php'; // require BASE . LIB . 'autoloader.php';
// composer auto loader, IF composer.json file includes classmap for lib/:
// "autoload": {
// "classmap": [
// "lib/"
// ]
// },
// NOTE BASE: __DIR__ . DIRECTORY_SEPARATOR . '..' DIRECTORY_SEPARATOR;
require BASE . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
// __END__ // __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php // phpcs:ignore PSR1.Files.SideEffects
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2019/10/28 * CREATED: 2019/10/28
@@ -7,14 +8,16 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
// DEFINE('SOME_ID', <SOME VALUE>); declare(strict_types=1);
// define('SOME_ID', <SOME VALUE>);
/************* CONVERT *******************/ /************* CONVERT *******************/
// this only needed if the external thumbnail create is used // this only needed if the external thumbnail create is used
$paths = [ $paths = [
'/bin', '/bin',
'/usr/bin', '/usr/bin',
'/usr/local/bin' '/usr/local/bin',
]; ];
// find convert // find convert
foreach ($paths as $path) { foreach ($paths as $path) {

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11 * CREATED: 2018/10/11
@@ -8,6 +9,8 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
// File and Folder paths // File and Folder paths
// ID is TARGET (first array element) // ID is TARGET (first array element)
/*$PATHS = [ /*$PATHS = [
@@ -15,7 +18,7 @@
'csv_path' => '', 'csv_path' => '',
'perl_bin' => '', 'perl_bin' => '',
'other_url' => '', 'other_url' => '',
] ],
];*/ ];*/
// __END__ // __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php // phpcs:ignore warning
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2018/10/11 * CREATED: 2018/10/11
@@ -7,12 +8,21 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
define('CONFIG_PATH', 'configs' . DIRECTORY_SEPARATOR); define('CONFIG_PATH', 'configs' . DIRECTORY_SEPARATOR);
// config path prefix search, start with 0, got down each level __DIR__ has, if nothing found -> bail // config path prefix search, start with 0, got down each level __DIR__ has, if nothing found -> bail
$CONFIG_PATH_PREFIX = ''; $CONFIG_PATH_PREFIX = '';
for ($dir_pos = 0, $dir_max = count(explode(DIRECTORY_SEPARATOR, __DIR__)); $dir_pos <= $dir_max; $dir_pos++) { for ($dir_pos = 0, $dir_max = count(explode(DIRECTORY_SEPARATOR, __DIR__)); $dir_pos <= $dir_max; $dir_pos++) {
$CONFIG_PATH_PREFIX .= '..' . DIRECTORY_SEPARATOR; $CONFIG_PATH_PREFIX .= '..' . DIRECTORY_SEPARATOR;
if (file_exists($CONFIG_PATH_PREFIX . CONFIG_PATH . 'config.master.php')) { if (file_exists($CONFIG_PATH_PREFIX . CONFIG_PATH . 'config.master.php')) {
// check if there is an read env file, load it
if (file_exists($CONFIG_PATH_PREFIX . CONFIG_PATH . 'read_env_file.php')) {
require $CONFIG_PATH_PREFIX . CONFIG_PATH . 'read_env_file.php';
// load env variables first
readEnvFile($CONFIG_PATH_PREFIX . CONFIG_PATH);
}
// then load master config file that loads all other config files
require $CONFIG_PATH_PREFIX . CONFIG_PATH . 'config.master.php'; require $CONFIG_PATH_PREFIX . CONFIG_PATH . 'config.master.php';
break; break;
} }
@@ -23,7 +33,7 @@ if (!defined('DS')) {
} }
// find trigger name "admin/" or "frontend/" in the getcwd() folder // find trigger name "admin/" or "frontend/" in the getcwd() folder
foreach (['admin', 'frontend'] as $folder) { foreach (['admin', 'frontend'] as $folder) {
if (strstr(getcwd(), DS.$folder)) { if (strstr(getcwd() ?: '', DS . $folder)) {
define('CONTENT_PATH', $folder . DS); define('CONTENT_PATH', $folder . DS);
break; break;
} }

View File

@@ -0,0 +1,84 @@
<?php
/**
* parses .env file
*
* Rules for .env file
* variable is any alphanumeric string followed by = on the same line
* content starts with the first non space part
* strings can be contained in "
* strings MUST be contained in " if they are multiline
* if string starts with " it will match until another " is found
* anything AFTER " is ignored
* if there are two variables with the same name only the first is used
* variables are case sensitive
*
* @param string $path Folder to file, default is __DIR__
* @param string $env_file What file to load, default is .env
* @return int -1 other error
* 0 for success full load
* 1 for file loadable, but no data inside
* 2 for file not readable
* 3 for file not found
*/
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
{
// default -1;
$status = -1;
$env_file_target = $path . DIRECTORY_SEPARATOR . $env_file;
// this is not a file -> abort
if (!is_file($env_file_target)) {
$status = 3;
return $status;
}
// cannot open file -> abort
if (($fp = fopen($env_file_target, 'r')) === false) {
$status = 2;
return $status;
}
// set to readable but not yet any data loaded
$status = 1;
$block = false;
$var = '';
while ($line = fgets($fp)) {
// main match for variable = value part
if (preg_match("/^\s*([\w_.]+)\s*=\s*((\"?).*)/", $line, $matches)) {
$var = $matches[1];
$value = $matches[2];
$quotes = $matches[3];
// wirte only if env is not set yet, and write only the first time
if (empty($_ENV[$var])) {
if (!empty($quotes)) {
// match greedy for first to last so we move any " if there are
if (preg_match('/^"(.*[^\\\])"/U', $value, $matches)) {
$value = $matches[1];
} else {
// this is a multi line
$block = true;
// first " in string remove
// add removed new line back because this is a multi line
$value = ltrim($value, '"') . PHP_EOL;
}
}
// if block is set, we strip line of slashes
$_ENV[$var] = $block === true ? stripslashes($value) : $value;
// set successful load
$status = 0;
}
} elseif ($block === true) {
// read line until there is a unescaped "
// this also strips everything after the last "
if (preg_match("/(.*[^\\\])\"/", $line, $matches)) {
$block = false;
// strip ending " and EVERYTHING that follows after that
$line = $matches[1];
}
// strip line of slashes
$_ENV[$var] .= stripslashes($line);
}
}
fclose($fp);
return $status;
}
// __END__

View File

@@ -1,3 +1,7 @@
<?php declare(strict_types=1); <?php
declare(strict_types=1);
require 'config.php'; require 'config.php';
// __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2005/07/19 * CREATED: 2005/07/19
@@ -7,7 +8,9 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
$day_short = array( declare(strict_types=1);
$day_short = [
1 => 'Mon', 1 => 'Mon',
2 => 'Tue', 2 => 'Tue',
3 => 'Wed', 3 => 'Wed',
@@ -15,9 +18,9 @@ $day_short = array(
5 => 'Fri', 5 => 'Fri',
6 => 'Sat', 6 => 'Sat',
7 => 'Sun' 7 => 'Sun'
); ];
$day_long = array( $day_long = [
1 => 'Monday', 1 => 'Monday',
2 => 'Tuesday', 2 => 'Tuesday',
3 => 'Wednesday', 3 => 'Wednesday',
@@ -25,10 +28,10 @@ $day_long = array(
5 => 'Friday', 5 => 'Friday',
6 => 'Saturday', 6 => 'Saturday',
7 => 'Sunday' 7 => 'Sunday'
); ];
// months // months
$month_long = array( $month_long = [
1 => 'January', 1 => 'January',
2 => 'February', 2 => 'February',
3 => 'March', 3 => 'March',
@@ -41,9 +44,9 @@ $month_long = array(
10 => 'October', 10 => 'October',
11 => 'November', 11 => 'November',
12 => 'December' 12 => 'December'
); ];
$month_short = array( $month_short = [
1 => 'Jan', 1 => 'Jan',
2 => 'Feb', 2 => 'Feb',
3 => 'Mar', 3 => 'Mar',
@@ -56,6 +59,6 @@ $month_short = array(
10 => 'Oct', 10 => 'Oct',
11 => 'Nov', 11 => 'Nov',
12 => 'Dec' 12 => 'Dec'
); ];
// __END__ // __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2008/08/14 * CREATED: 2008/08/14
@@ -7,8 +8,11 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
// print debug messages // print debug messages
echo $login->printErrorMsg(); echo $login->log->printErrorMsg();
echo $cms->printErrorMsg(); echo $cms->log->printErrorMsg();
$cms->log->debug('DEBUGEND', '==================================== [END]');
// __END__ // __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2008/08/01 * CREATED: 2008/08/01
@@ -7,13 +8,13 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
//------------------------------ variable init start //------------------------------ variable init start
// for dev test we set full error reporting; writes everything, except E_ERROR into logs/php_error-<day>.log // for dev test we set full error reporting; writes everything, except E_ERROR into logs/php_error-<day>.log
if ($DEBUG_ALL && $ENABLE_ERROR_HANDLING) { if (!empty($DEBUG_ALL) && !empty($ENABLE_ERROR_HANDLING)) {
include BASE . LIBS . "Error.Handling.php"; include BASE . LIBS . "Error.Handling.php";
} }
// predefine vars
$messages = array();
//------------------------------ variable init end //------------------------------ variable init end
//------------------------------ library include start //------------------------------ library include start
@@ -79,13 +80,11 @@ if (!$login->login) {
// automatic hide for DEBUG messages on live server // automatic hide for DEBUG messages on live server
// can be overridden when setting DEBUG_ALL_OVERRIDE on top of the script (for emergency debugging of one page only) // can be overridden when setting DEBUG_ALL_OVERRIDE on top of the script (for emergency debugging of one page only)
if ((TARGET == 'live' || TARGET == 'remote') && !$DEBUG_ALL_OVERRIDE) { if ((TARGET == 'live' || TARGET == 'remote') && !empty($DEBUG_ALL_OVERRIDE)) {
$login->debug_output_all = false; foreach (['debug', 'echo', 'print'] as $target) {
$login->echo_output_all = false; $login->log->setLogLevelAll($target, false);
$login->print_output_all = false; $cms->log->setLogLevelAll($target, false);
$cms->debug_output_all = false; }
$cms->echo_output_all = false;
$cms->print_output_all = false;
} }
$smarty->DATA['JS_DEBUG'] = DEBUG; $smarty->DATA['JS_DEBUG'] = DEBUG;

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2007/09/03 * CREATED: 2007/09/03
@@ -7,6 +8,8 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
/****** /******
NOTE THAT THIS INCLUDE IS OBSOLETE NOTE THAT THIS INCLUDE IS OBSOLETE
USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2005/07/12 * CREATED: 2005/07/12
@@ -7,11 +8,16 @@
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
/****** /******
NOTE THAT THIS INCLUDE IS OBSOLETE NOTE THAT THIS INCLUDE IS OBSOLETE
USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF USE THE BELOW FUNCTION CALL IN THE SCRIPT ITSELF
*******/ *******/
trigger_error('admin_smarty.php is deprecated. Use SmartyExtended->setSmartyVarsAdmin(); or setSmartyVarsFrontend();', E_USER_DEPRECATED); trigger_error(
'admin_smarty.php is deprecated. Use SmartyExtended->setSmartyVarsAdmin(); or setSmartyVarsFrontend();',
E_USER_DEPRECATED
);
$smarty->setSmartyVarsAdmin(); $smarty->setSmartyVarsAdmin();
// __END__ // __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/******************************************************************** /********************************************************************
* AUTHOR: Clemens "Gullevek" Schwaighofer (www.gullevek.org) * AUTHOR: Clemens "Gullevek" Schwaighofer (www.gullevek.org)
* CREATED: 2003/06/10 * CREATED: 2003/06/10
@@ -12,14 +13,19 @@
* - edit_visible_group.php * - edit_visible_group.php
* HISTORY: * HISTORY:
* 2005/06/30 (cs) remove color settings, they are in CSS File now * 2005/06/30 (cs) remove color settings, they are in CSS File now
* 2005/06/22 (cs) moved load of config array into form class, set lang and lang is must set var for form class; removed the page name setting, moved it into the form class, remove all HTML from main page * 2005/06/22 (cs) moved load of config array into form class, set lang
* and lang is must set var for form class; removed the
* page name setting, moved it into the form class,
* emove all HTML from main page
* 2004/09/30 (cs) changed layout to fit default layout & changed LIBS, etc * 2004/09/30 (cs) changed layout to fit default layout & changed LIBS, etc
* 2003-06-10: creation of this page * 2003-06-10: creation of this page
*********************************************************************/ *********************************************************************/
$DEBUG_ALL = 1; declare(strict_types=1);
$PRINT_ALL = 1;
$DB_DEBUG = 1; $DEBUG_ALL = true;
$PRINT_ALL = true;
$DB_DEBUG = true;
// TODO: only extract _POST data that is needed // TODO: only extract _POST data that is needed
extract($_POST, EXTR_SKIP); extract($_POST, EXTR_SKIP);
@@ -30,10 +36,10 @@ require 'config.php';
$SET_SESSION_NAME = EDIT_SESSION_NAME; $SET_SESSION_NAME = EDIT_SESSION_NAME;
// overrride debug flags // overrride debug flags
if (!DEBUG) { if (!DEBUG) {
$DEBUG_ALL = 0; $DEBUG_ALL = false;
$PRINT_ALL = 0; $PRINT_ALL = false;
$DB_DEBUG = 0; $DB_DEBUG = false;
$ECHO_ALL = 0; $ECHO_ALL = false;
} }
// should be utf8 // should be utf8
@@ -50,24 +56,24 @@ if ($form->mobile_phone) {
// smarty template engine (extended Translation version) // smarty template engine (extended Translation version)
$smarty = new CoreLibs\Template\SmartyExtend(); $smarty = new CoreLibs\Template\SmartyExtend();
// $form->debug('POST', $form->printAr($_POST)); // $form->log->debug('POST', $form->log->prAr($_POST));
if (TARGET == 'live' || TARGET == 'remote') { if (TARGET == 'live' || TARGET == 'remote') {
// login // login
$login->debug_output_all = DEBUG ? 1 : 0; $login->log->setLogLevelAll('debug', DEBUG ? true : false);
$login->echo_output_all = 0; $login->log->setLogLevelAll('echo', false);
$login->print_output_all = DEBUG ? 1 : 0; $login->log->setLogLevelAll('print', DEBUG ? true : false);
// form // form
$form->debug_output_all = DEBUG ? 1 : 0; $form->log->setLogLevelAll('debug', DEBUG ? true : false);
$form->echo_output_all = 0; $form->log->setLogLevelAll('echo', false);
$form->print_output_all = DEBUG ? 1 : 0; $form->log->setLogLevelAll('print', DEBUG ? true : false);
} }
// space for setting special debug flags // space for setting special debug flags
$login->debug_output_all = 1; $login->log->setLogLevelAll('debug', true);
// set smarty arrays // set smarty arrays
$HEADER = array(); $HEADER = [];
$DATA = array(); $DATA = [];
$DEBUG_DATA = array(); $DEBUG_DATA = [];
// set the template dir // set the template dir
// WARNING: this has a special check for the mailing tool layout (old layout) // WARNING: this has a special check for the mailing tool layout (old layout)
if (defined('LAYOUT')) { if (defined('LAYOUT')) {
@@ -94,13 +100,13 @@ if ($form->my_page_name == 'edit_order') {
// order name is _always_ order_number for the edit interface // order name is _always_ order_number for the edit interface
// follwing arrays do exist here: // follwing arrays do exist here:
// $position ... has the positions of the array(0..max), cause in a <select> // $position ... has the positions of the [0..max], cause in a <select>
// I can't put an number into the array field, in this array, // I can't put an number into the array field, in this array,
// there are the POSITION stored, that should CHANGE there order (up/down) // there are the POSITION stored, that should CHANGE there order (up/down)
// $row_data_id ... has ALL ids from the sorting part // $row_data_id ... has ALL ids from the sorting part
// $row_data_order ... has ALL order positions from the soirting part // $row_data_order ... has ALL order positions from the soirting part
if (!isset($position)) { if (!isset($position)) {
$position = array(); $position = [];
} }
$row_data_id = $_POST['row_data_id'] ?? []; $row_data_id = $_POST['row_data_id'] ?? [];
$original_id = $row_data_id; $original_id = $row_data_id;
@@ -115,15 +121,20 @@ if ($form->my_page_name == 'edit_order') {
// this gets temp, id before that, gets actual (moves one "down") // this gets temp, id before that, gets actual (moves one "down")
// this gets the old before (moves one "up") // this gets the old before (moves one "up")
// is done for every element in row // is done for every element in row
// echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>"; // echo "A: ".$row_data_id[$position[$i]]
// ." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]
// ." (".$row_data_order[$position[$i]-1].")<br>";
$temp_id = $row_data_id[$position[$i]] ?? null; $temp_id = $row_data_id[$position[$i]] ?? null;
$row_data_id[$position[$i]] = $row_data_id[$position[$i] - 1] ?? null; $row_data_id[$position[$i]] = $row_data_id[$position[$i] - 1] ?? null;
$row_data_id[$position[$i] - 1] = $temp_id; $row_data_id[$position[$i] - 1] = $temp_id;
// echo "A: ".$row_data_id[$position[$i]]." (".$row_data_order[$position[$i]].") -- ".$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>"; // echo "A: ".$row_data_id[$position[$i]]
// ." (".$row_data_order[$position[$i]].") -- "
// .$row_data_id[$position[$i]-1]." (".$row_data_order[$position[$i]-1].")<br>";
} // for } // for
} // if up } // if up
// the last position id from position array is not to be the count-1 of row_data_id array, or it is the last element // the last position id from position array is not to be the count - 1 of
// row_data_id array, or it is the last element
if (isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1))) { if (isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1))) {
for ($i = count($position) - 1; $i >= 0; $i--) { for ($i = count($position) - 1; $i >= 0; $i--) {
// same as up, just up in other way, starts from bottom (last element) and moves "up" // same as up, just up in other way, starts from bottom (last element) and moves "up"
@@ -136,12 +147,15 @@ if ($form->my_page_name == 'edit_order') {
} // if down } // if down
// write data ... (which has to be abstrackt ...) // write data ... (which has to be abstrackt ...)
if ((isset($up) && $position[0] > 0) || if (
(isset($up) && $position[0] > 0) ||
(isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1))) (isset($down) && ($position[count($position) - 1] != (count($row_data_id) - 1)))
) { ) {
for ($i = 0; $i < count($row_data_id); $i++) { for ($i = 0; $i < count($row_data_id); $i++) {
if (isset($row_data_order[$i]) && isset($row_data_id[$i])) { if (isset($row_data_order[$i]) && isset($row_data_id[$i])) {
$q = "UPDATE ".$table_name." SET order_number = ".$row_data_order[$i]." WHERE ".$table_name."_id = ".$row_data_id[$i]; $q = "UPDATE " . $table_name
. " SET order_number = " . $row_data_order[$i]
. " WHERE " . $table_name . "_id = " . $row_data_id[$i];
$q = $form->dbExec($q); $q = $form->dbExec($q);
} }
} // for all article ids ... } // for all article ids ...
@@ -156,29 +170,33 @@ if ($form->my_page_name == 'edit_order') {
$q .= "ORDER BY order_number"; $q .= "ORDER BY order_number";
// init arrays // init arrays
$row_data = array(); $row_data = [];
$options_id = array(); $options_id = [];
$options_name = array(); $options_name = [];
$options_selected = array(); $options_selected = [];
// DB read data for menu // DB read data for menu
while ($res = $form->dbReturn($q)) { while (is_array($res = $form->dbReturn($q))) {
$row_data[] = array( $row_data[] = [
"id" => $res[$table_name . "_id"], "id" => $res[$table_name . "_id"],
"name" => $res["name"], "name" => $res["name"],
"order" => $res["order_number"] "order" => $res["order_number"]
); ];
} // while read data ... } // while read data ...
// html title // html title
$HEADER['HTML_TITLE'] = $form->l->__('Edit Order'); $HEADER['HTML_TITLE'] = $form->l->__('Edit Order');
$messages = array(); $messages = [];
// error msg // error msg
if (isset($error)) { if (isset($error)) {
if (!isset($msg)) { if (!isset($msg)) {
$msg = array(); $msg = [];
} }
$messages[] = array('msg' => $msg, 'class' => 'error', 'width' => '100%'); $messages[] = [
'msg' => $msg,
'class' => 'error',
'width' => '100%'
];
} }
$DATA['form_error_msg'] = $messages; $DATA['form_error_msg'] = $messages;
@@ -189,7 +207,8 @@ if ($form->my_page_name == 'edit_order') {
// list of points to order // list of points to order
for ($j = 0; $j < count($position); $j++) { for ($j = 0; $j < count($position); $j++) {
// if matches, put into select array // if matches, put into select array
if (isset($original_id[$position[$j]]) && isset($row_data[$i]['id']) && if (
isset($original_id[$position[$j]]) && isset($row_data[$i]['id']) &&
$original_id[$position[$j]] == $row_data[$i]['id'] $original_id[$position[$j]] == $row_data[$i]['id']
) { ) {
$options_selected[] = $i; $options_selected[] = $i;
@@ -201,8 +220,8 @@ if ($form->my_page_name == 'edit_order') {
$DATA['options_selected'] = $options_selected; $DATA['options_selected'] = $options_selected;
// hidden list for the data (id, order number) // hidden list for the data (id, order number)
$row_data_id = array(); $row_data_id = [];
$row_data_order = array(); $row_data_order = [];
for ($i = 0; $i < count($row_data); $i++) { for ($i = 0; $i < count($row_data); $i++) {
$row_data_id[] = $row_data[$i]['id']; $row_data_id[] = $row_data[$i]['id'];
$row_data_order[] = $row_data[$i]['order']; $row_data_order[] = $row_data[$i]['order'];
@@ -230,7 +249,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['table_width'] = $table_width; $DATA['table_width'] = $table_width;
$messages = array(); $messages = [];
// write out error / status messages // write out error / status messages
$messages[] = $form->formPrintMsg(); $messages[] = $form->formPrintMsg();
$DATA['form_error_msg'] = $messages; $DATA['form_error_msg'] = $messages;
@@ -248,13 +267,13 @@ if ($form->my_page_name == 'edit_order') {
$DATA['GROUP_LEVEL'] = $_SESSION['GROUP_ACL_LEVEL']; $DATA['GROUP_LEVEL'] = $_SESSION['GROUP_ACL_LEVEL'];
$PAGES = $_SESSION['PAGES']; $PAGES = $_SESSION['PAGES'];
//$form->debug('menu', $form->printAr($PAGES)); //$form->log->debug('menu', $form->log->prAr($PAGES));
// build nav from $PAGES ... // build nav from $PAGES ...
if (!isset($PAGES) || !is_array($PAGES)) { if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array(); $PAGES = [];
} }
$menuarray = array(); $menuarray = [];
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) { foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) {
if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) { if ($PAGE_DATA['menu'] && $PAGE_DATA['online']) {
$menuarray[] = $PAGE_DATA; $menuarray[] = $PAGE_DATA;
@@ -273,7 +292,7 @@ if ($form->my_page_name == 'edit_order') {
} }
$position = 0; $position = 0;
$menu_data = array(); $menu_data = [];
// for ($i = 1; $i <= count($menuarray); $i ++) { // for ($i = 1; $i <= count($menuarray); $i ++) {
foreach ($menuarray as $i => $data) { foreach ($menuarray as $i => $data) {
// do that for new array // do that for new array
@@ -284,11 +303,11 @@ if ($form->my_page_name == 'edit_order') {
(isset($data['hostname']) && $data['hostname'] ? (isset($data['hostname']) && $data['hostname'] ?
$data['hostname'] : $data['hostname'] :
'' ''
). )
// filename // filename
($data['filename'] ?? ''). . ($data['filename'] ?? '')
// query string // query string
(isset($data['query_string']) && $data['query_string'] ? . (isset($data['query_string']) && $data['query_string'] ?
$data['query_string'] : $data['query_string'] :
'' ''
); );
@@ -298,8 +317,9 @@ if ($form->my_page_name == 'edit_order') {
$menu_data[$i]['splitfactor_in'] = 0; $menu_data[$i]['splitfactor_in'] = 0;
} }
// on matching, we also need to check if we are in the same folder // on matching, we also need to check if we are in the same folder
if (isset($data['filename']) && if (
$data['filename'] == $form->getPageName() && isset($data['filename']) &&
$data['filename'] == \CoreLibs\Get\System::getPageName() &&
(!isset($data['hostname']) || ( (!isset($data['hostname']) || (
isset($data['hostname']) && isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false) (!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
@@ -328,7 +348,7 @@ if ($form->my_page_name == 'edit_order') {
$menu_data[$i]['splitfactor_out'] = 0; $menu_data[$i]['splitfactor_out'] = 0;
} }
} // for } // for
// $form->debug('MENU ARRAY', $form->printAr($menu_data)); // $form->log->debug('MENU ARRAY', $form->log->prAr($menu_data));
$DATA['menu_data'] = $menu_data; $DATA['menu_data'] = $menu_data;
$DATA['page_name'] = $menuarray[$position]['page_name'] ?? '-Undefined [' . $position . '] -'; $DATA['page_name'] = $menuarray[$position]['page_name'] ?? '-Undefined [' . $position . '] -';
$L_TITLE = $DATA['page_name']; $L_TITLE = $DATA['page_name'];
@@ -344,7 +364,7 @@ if ($form->my_page_name == 'edit_order') {
$DATA['form_my_page_name'] = $form->my_page_name; $DATA['form_my_page_name'] = $form->my_page_name;
$DATA['filename_exist'] = 0; $DATA['filename_exist'] = 0;
$DATA['drop_down_input'] = 0; $DATA['drop_down_input'] = 0;
$elements = array(); $elements = [];
// depending on the "getPageName()" I show different stuff // depending on the "getPageName()" I show different stuff
switch ($form->my_page_name) { switch ($form->my_page_name) {
case 'edit_users': case 'edit_users':
@@ -382,9 +402,9 @@ if ($form->my_page_name == 'edit_order') {
$q = "DELETE FROM temp_files"; $q = "DELETE FROM temp_files";
$form->dbExec($q); $form->dbExec($q);
// gets all files in the current dir and dirs given ending with .php // gets all files in the current dir and dirs given ending with .php
$folders = array('../admin/', '../frontend/'); $folders = ['../admin/', '../frontend/'];
$files = array('*.php'); $files = ['*.php'];
$search_glob = array(); $search_glob = [];
foreach ($folders as $folder) { foreach ($folders as $folder) {
// make sure this folder actually exists // make sure this folder actually exists
if (is_dir(ROOT . $folder)) { if (is_dir(ROOT . $folder)) {
@@ -406,7 +426,8 @@ if ($form->my_page_name == 'edit_order') {
if ($t_q) { if ($t_q) {
$t_q .= ', '; $t_q .= ', ';
} }
$t_q .= "('".$form->dbEscapeString($matches[1])."', '".$form->dbEscapeString($matches[2])."')"; $t_q .= "('" . $form->dbEscapeString($matches[1]) . "', '"
. $form->dbEscapeString($matches[2]) . "')";
} }
} }
$form->dbExec($q . $t_q, 'NULL'); $form->dbExec($q . $t_q, 'NULL');
@@ -470,7 +491,7 @@ if ($form->my_page_name == 'edit_order') {
print '[No valid page definition given]'; print '[No valid page definition given]';
break; break;
} }
// $form->debug('edit', "Elements: <pre>".$form->printAr($elements)); // $form->log->debug('edit', "Elements: <pre>".$form->log->prAr($elements));
$DATA['elements'] = $elements; $DATA['elements'] = $elements;
$DATA['hidden'] = $form->formCreateHiddenFields(); $DATA['hidden'] = $form->formCreateHiddenFields();
$DATA['save_delete'] = $form->formCreateSaveDelete(); $DATA['save_delete'] = $form->formCreateSaveDelete();
@@ -498,7 +519,7 @@ if (is_dir(BASE.CACHE)) {
$smarty->display($EDIT_TEMPLATE, 'editAdmin_' . $smarty->lang, 'editAdmin_' . $smarty->lang); $smarty->display($EDIT_TEMPLATE, 'editAdmin_' . $smarty->lang, 'editAdmin_' . $smarty->lang);
// debug output // debug output
echo $login->printErrorMsg(); echo $login->log->printErrorMsg();
echo $form->printErrorMsg(); echo $form->log->printErrorMsg();
// __END__ // __END__

Binary file not shown.

View File

@@ -1,26 +1,28 @@
<?php declare(strict_types=1); <?php
$edit_access = array( declare(strict_types=1);
'table_array' => array(
'edit_access_id' => array( $edit_access = [
'value' => isset($GLOBALS['edit_access_id']) ? $GLOBALS['edit_access_id'] : '', 'table_array' => [
'edit_access_id' => [
'value' => $GLOBALS['edit_access_id'] ?? '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ],
'name' => array( 'name' => [
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Access Group Name', 'output_name' => 'Access Group Name',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumericspace|unique' 'error_check' => 'alphanumericspace|unique'
), ],
'description' => array( 'description' => [
'value' => isset($GLOBALS['description']) ? $GLOBALS['description'] : '', 'value' => $GLOBALS['description'] ?? '',
'output_name' => 'Description', 'output_name' => 'Description',
'type' => 'textarea' 'type' => 'textarea'
), ],
'color' => array( 'color' => [
'value' => isset($GLOBALS['color']) ? $GLOBALS['color'] : '', 'value' => $GLOBALS['color'] ?? '',
'output_name' => 'Color', 'output_name' => 'Color',
'mandatory' => 0, 'mandatory' => 0,
'type' => 'text', 'type' => 'text',
@@ -29,80 +31,80 @@ $edit_access = array(
'error_check' => 'custom', 'error_check' => 'custom',
'error_regex' => "/[\dA-Fa-f]{6}/", 'error_regex' => "/[\dA-Fa-f]{6}/",
'error_example' => 'F6A544' 'error_example' => 'F6A544'
), ],
'enabled' => array( 'enabled' => [
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : 0, 'value' => $GLOBALS['enabled'] ?? 0,
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'type' => 'binary', 'type' => 'binary',
'int' => 1, // OR 'bool' => 1 'int' => 1, // OR 'bool' => 1
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'protected' => array( 'protected' => [
'value' => isset($GLOBALS['protected']) ? $GLOBALS['protected'] : 0, 'value' => $GLOBALS['protected'] ?? 0,
'output_name' => 'Protected', 'output_name' => 'Protected',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'additional_acl' => array( 'additional_acl' => [
'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '', 'value' => $GLOBALS['additional_acl'] ?? '',
'output_name' => 'Additional ACL (as JSON)', 'output_name' => 'Additional ACL (as JSON)',
'type' => 'textarea', 'type' => 'textarea',
'error_check' => 'json', 'error_check' => 'json',
'rows' => 10, 'rows' => 10,
'cols' => 60 'cols' => 60
), ],
), ],
'table_name' => 'edit_access', 'table_name' => 'edit_access',
"load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name", "load_query" => "SELECT edit_access_id, name FROM edit_access ORDER BY name",
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'name' 'name' => 'name'
) ],
), ],
'element_list' => array( 'element_list' => [
'edit_access_data' => array( 'edit_access_data' => [
'output_name' => 'Edit Access Data', 'output_name' => 'Edit Access Data',
'delete_name' => 'remove_edit_access_data', 'delete_name' => 'remove_edit_access_data',
// 'type' => 'reference_data', # is not a sub table read and connect, but only a sub table with data // 'type' => 'reference_data', // is not a sub table read and connect, but only a sub table with data
'max_empty' => 5, # maxium visible if no data is set, if filled add this number to visible 'max_empty' => 5, // maxium visible if no data is set, if filled add this number to visible
'prefix' => 'ead', 'prefix' => 'ead',
'elements' => array( 'elements' => [
'name' => array( 'name' => [
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumeric|unique', 'error_check' => 'alphanumeric|unique',
'output_name' => 'Name', 'output_name' => 'Name',
'mandatory' => 1 'mandatory' => 1
), ],
'value' => array( 'value' => [
'type' => 'text', 'type' => 'text',
'output_name' => 'Value' 'output_name' => 'Value'
), ],
'enabled' => array( 'enabled' => [
'type' => 'checkbox', 'type' => 'checkbox',
'output_name' => 'Activate', 'output_name' => 'Activate',
'int' => 1, 'int' => 1,
'element_list' => array(1) 'element_list' => [1]
), ],
/*'edit_access_id' => array( /*'edit_access_id' => [
'int' => 1, 'int' => 1,
'type' => 'hidden', 'type' => 'hidden',
'fk_id' => 1 # reference main key from master table above 'fk_id' => 1 // reference main key from master table above
),*/ ],*/
'edit_access_data_id' => array( 'edit_access_data_id' => [
'type' => 'hidden', 'type' => 'hidden',
'int' => 1, 'int' => 1,
'pk_id' => 1 'pk_id' => 1
) ],
) ],
) ],
) ],
); ];
// __END__ // __END__

View File

@@ -1,109 +1,111 @@
<?php declare(strict_types=1); <?php
$edit_groups = array( declare(strict_types=1);
'table_array' => array(
'edit_group_id' => array( $edit_groups = [
'value' => isset($GLOBALS['edit_group_id']) ? $GLOBALS['edit_group_id'] : '', 'table_array' => [
'edit_group_id' => [
'value' => $GLOBALS['edit_group_id'] ?? '',
'pk' => 1, 'pk' => 1,
'type' => 'hidden' 'type' => 'hidden'
), ],
'enabled' => array( 'enabled' => [
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '', 'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'name' => array( 'name' => [
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Group Name', 'output_name' => 'Group Name',
'type' => 'text', 'type' => 'text',
'mandatory' => 1 'mandatory' => 1
), ],
'edit_access_right_id' => array( 'edit_access_right_id' => [
'value' => isset($GLOBALS['edit_access_right_id']) ? $GLOBALS['edit_access_right_id'] : '', 'value' => $GLOBALS['edit_access_right_id'] ?? '',
'output_name' => 'Group Level', 'output_name' => 'Group Level',
'mandatory' => 1, 'mandatory' => 1,
'int' => 1, 'int' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level" 'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
), ],
'edit_scheme_id' => array( 'edit_scheme_id' => [
'value' => isset($GLOBALS['edit_scheme_id']) ? $GLOBALS['edit_scheme_id'] : '', 'value' => $GLOBALS['edit_scheme_id'] ?? '',
'output_name' => 'Group Scheme', 'output_name' => 'Group Scheme',
'int_null' => 1, 'int_null' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name" 'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
), ],
'additional_acl' => array( 'additional_acl' => [
'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '', 'value' => $GLOBALS['additional_acl'] ?? '',
'output_name' => 'Additional ACL (as JSON)', 'output_name' => 'Additional ACL (as JSON)',
'type' => 'textarea', 'type' => 'textarea',
'error_check' => 'json', 'error_check' => 'json',
'rows' => 10, 'rows' => 10,
'cols' => 60 'cols' => 60
), ],
), ],
'load_query' => "SELECT edit_group_id, name, enabled FROM edit_group ORDER BY name", 'load_query' => "SELECT edit_group_id, name, enabled FROM edit_group ORDER BY name",
'table_name' => 'edit_group', 'table_name' => 'edit_group',
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'name' 'name' => 'name'
), ],
array( [
'name' => 'enabled', 'name' => 'enabled',
'binary' => array('Yes', 'No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Enabled: ' 'before_value' => 'Enabled: '
) ],
), ],
'element_list' => array( 'element_list' => [
'edit_page_access' => array( 'edit_page_access' => [
'output_name' => 'Pages', 'output_name' => 'Pages',
'mandatory' => 1, 'mandatory' => 1,
'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set 'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set
'enable_name' => 'enable_page_access', 'enable_name' => 'enable_page_access',
'prefix' => 'epa', 'prefix' => 'epa',
'read_data' => array( 'read_data' => [
'table_name' => 'edit_page', 'table_name' => 'edit_page',
'pk_id' => 'edit_page_id', 'pk_id' => 'edit_page_id',
'name' => 'name', 'name' => 'name',
'order' => 'order_number' 'order' => 'order_number'
), ],
'elements' => array( 'elements' => [
'edit_page_access_id' => array( 'edit_page_access_id' => [
'type' => 'hidden', 'type' => 'hidden',
'int' => 1, 'int' => 1,
'pk_id' => 1 'pk_id' => 1
), ],
'enabled' => array( 'enabled' => [
'type' => 'checkbox', 'type' => 'checkbox',
'output_name' => 'Activate', 'output_name' => 'Activate',
'int' => 1, 'int' => 1,
'element_list' => array(1) 'element_list' => [1],
), ],
'edit_access_right_id' => array( 'edit_access_right_id' => [
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'output_name' => 'Access Level', 'output_name' => 'Access Level',
'int' => 1, 'int' => 1,
'preset' => 1, // first of the select 'preset' => 1, // first of the select
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level" 'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
), ],
'edit_page_id' => array( 'edit_page_id' => [
'int' => 1, 'int' => 1,
'type' => 'hidden' 'type' => 'hidden'
) ],
/*, /*,
'edit_default' => array( 'edit_default' => [
'output_name' => 'Default', 'output_name' => 'Default',
'type' => 'radio', 'type' => 'radio',
'mandatory' => 1 'mandatory' => 1
)*/ ],*/
) ],
) // edit pages ggroup ], // edit pages ggroup
) ],
); ];
// __END__ // __END__

View File

@@ -1,75 +1,77 @@
<?php declare(strict_types=1); <?php
$edit_languages=array( declare(strict_types=1);
'table_array' => array(
'edit_language_id' => array( $edit_languages = [
'value' => isset($GLOBALS['edit_language_id']) ? $GLOBALS['edit_language_id'] : '', 'table_array' => [
'edit_language_id' => [
'value' => $GLOBALS['edit_language_id'] ?? '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ],
'short_name' => array( 'short_name' => [
'value' => isset($GLOBALS['short_name']) ? $GLOBALS['short_name'] : '', 'value' => $GLOBALS['short_name'] ?? '',
'output_name' => 'Language (short)', 'output_name' => 'Language (short)',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text', 'type' => 'text',
'size' => 2, 'size' => 2,
'length' => 2 'length' => 2
), ],
'long_name' => array( 'long_name' => [
'value' => isset($GLOBALS['long_name']) ? $GLOBALS['long_name'] : '', 'value' => $GLOBALS['long_name'] ?? '',
'output_name' => 'Language (long)', 'output_name' => 'Language (long)',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text', 'type' => 'text',
'size' => 40 'size' => 40
), ],
'iso_name' => array( 'iso_name' => [
'value' => isset($GLOBALS['iso_name']) ? $GLOBALS['iso_name'] : '', 'value' => $GLOBALS['iso_name'] ?? '',
'output_name' => 'ISO Code', 'output_name' => 'ISO Code',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text' 'type' => 'text'
), ],
'order_number' => array( 'order_number' => [
'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '', 'value' => $GLOBALS['order_number'] ?? '',
'int' => 1, 'int' => 1,
'order' => 1 'order' => 1
), ],
'enabled' => array( 'enabled' => [
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '', 'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'lang_default' => array( 'lang_default' => [
'value' => isset($GLOBALS['lang_default']) ? $GLOBALS['lang_default'] : '', 'value' => $GLOBALS['lang_default'] ?? '',
'output_name' => 'Default Language', 'output_name' => 'Default Language',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
) ],
), ],
'load_query' => "SELECT edit_language_id, long_name, iso_name, enabled FROM edit_language ORDER BY long_name", 'load_query' => "SELECT edit_language_id, long_name, iso_name, enabled FROM edit_language ORDER BY long_name",
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'long_name' 'name' => 'long_name'
), ],
array( [
'name' => 'iso_name', 'name' => 'iso_name',
'before_value' => 'ISO: ' 'before_value' => 'ISO: '
), ],
array( [
'name' => 'enabled', 'name' => 'enabled',
'before_value' => 'Enabled: ', 'before_value' => 'Enabled: ',
'binary' => array('Yes','No') 'binary' => ['Yes','No'],
) ],
), ],
'table_name' => 'edit_language' 'table_name' => 'edit_language'
); ];
// __END__ // __END__

View File

@@ -1,40 +1,42 @@
<?php declare(strict_types=1); <?php
$edit_menu_group = array( declare(strict_types=1);
'table_array' => array(
'edit_menu_group_id' => array( $edit_menu_group = [
'value' => isset($GLOBALS['edit_menu_group_id']) ? $GLOBALS['edit_menu_group_id'] : '', 'table_array' => [
'edit_menu_group_id' => [
'value' => $GLOBALS['edit_menu_group_id'] ?? '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ],
'name' => array( 'name' => [
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Group name', 'output_name' => 'Group name',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text' 'type' => 'text'
), ],
'flag' => array( 'flag' => [
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '', 'value' => $GLOBALS['flag'] ?? '',
'output_name' => 'Flag', 'output_name' => 'Flag',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumeric|unique' 'error_check' => 'alphanumeric|unique'
), ],
'order_number' => array( 'order_number' => [
'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '', 'value' => $GLOBALS['order_number'] ?? '',
'output_name' => 'Group order', 'output_name' => 'Group order',
'type' => 'order', 'type' => 'order',
'int' => 1, 'int' => 1,
'order' => 1 'order' => 1
) ],
), ],
'table_name' => 'edit_menu_group', 'table_name' => 'edit_menu_group',
'load_query' => "SELECT edit_menu_group_id, name FROM edit_menu_group ORDER BY name", 'load_query' => "SELECT edit_menu_group_id, name FROM edit_menu_group ORDER BY name",
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'name' 'name' => 'name'
) ],
) ],
); ];
// __END__ // __END__

View File

@@ -1,101 +1,103 @@
<?php declare(strict_types=1); <?php
$edit_pages = array( declare(strict_types=1);
'table_array' => array(
'edit_page_id' => array( $edit_pages = [
'value' => isset($GLOBALS['edit_page_id']) ? $GLOBALS['edit_page_id'] : '', 'table_array' => [
'edit_page_id' => [
'value' => $GLOBALS['edit_page_id'] ?? '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ],
'filename' => array( 'filename' => [
'value' => isset($GLOBALS['filename']) ? $GLOBALS['filename'] : '', 'value' => $GLOBALS['filename'] ?? '',
'output_name' => 'Add File ...', 'output_name' => 'Add File ...',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.folder || temp_files.filename AS name ". 'query' => "SELECT DISTINCT temp_files.filename AS id, temp_files.folder || temp_files.filename AS name "
"FROM temp_files ". . "FROM temp_files "
"LEFT JOIN edit_page ep ON temp_files.filename = ep.filename ". . "LEFT JOIN edit_page ep ON temp_files.filename = ep.filename "
"WHERE ep.filename IS NULL" . "WHERE ep.filename IS NULL"
), ],
'hostname' => array( 'hostname' => [
'value' => isset($GLOBALS['hostname']) ? $GLOBALS['hostname'] : '', 'value' => $GLOBALS['hostname'] ?? '',
'output_name' => 'Hostname or folder', 'output_name' => 'Hostname or folder',
'type' => 'text' 'type' => 'text'
), ],
'name' => array( 'name' => [
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Page name', 'output_name' => 'Page name',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text' 'type' => 'text'
), ],
'order_number' => array( 'order_number' => [
'value' => isset($GLOBALS['order_number']) ? $GLOBALS['order_number'] : '', 'value' => $GLOBALS['order_number'] ?? '',
'output_name' => 'Page order', 'output_name' => 'Page order',
'type' => 'order', 'type' => 'order',
'int' => 1, 'int' => 1,
'order' => 1 'order' => 1
), ],
/* 'flag' => array( /* 'flag' => [
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '', 'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '',
'output_name' => 'Page Flag', 'output_name' => 'Page Flag',
'type' => 'drop_down_array', 'type' => 'drop_down_array',
'query' => array( 'query' => [
'0' => '0', '0' => '0',
'1' => '1', '1' => '1',
'2' => '2', '2' => '2',
'3' => '3', '3' => '3',
'4' => '4', '4' => '4',
'5' => '5' '5' => '5'
) ],
),*/ ],*/
'online' => array( 'online' => [
'value' => isset($GLOBALS['online']) ? $GLOBALS['online'] : '', 'value' => $GLOBALS['online'] ?? '',
'output_name' => 'Online', 'output_name' => 'Online',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'menu' => array( 'menu' => [
'value' => isset($GLOBALS['menu']) ? $GLOBALS['menu'] : '', 'value' => $GLOBALS['menu'] ?? '',
'output_name' => 'Menu', 'output_name' => 'Menu',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'popup' => array( 'popup' => [
'value' => isset($GLOBALS['popup']) ? $GLOBALS['popup'] : '', 'value' => $GLOBALS['popup'] ?? '',
'output_name' => 'Popup', 'output_name' => 'Popup',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'popup_x' => array( 'popup_x' => [
'value' => isset($GLOBALS['popup_x']) ? $GLOBALS['popup_x'] : '', 'value' => $GLOBALS['popup_x'] ?? '',
'output_name' => 'Popup Width', 'output_name' => 'Popup Width',
'int_null' => 1, 'int_null' => 1,
'type' => 'text', 'type' => 'text',
'size' => 4, 'size' => 4,
'length' => 4 'length' => 4
), ],
'popup_y' => array( 'popup_y' => [
'value' => isset($GLOBALS['popup_y']) ? $GLOBALS['popup_y'] : '', 'value' => $GLOBALS['popup_y'] ?? '',
'output_name' => 'Popup Height', 'output_name' => 'Popup Height',
'int_null' => 1, 'int_null' => 1,
'type' => 'text', 'type' => 'text',
'size' => 4, 'size' => 4,
'length' => 4 'length' => 4
), ],
'content_alias_edit_page_id' => array( 'content_alias_edit_page_id' => [
'value' => isset($GLOBALS['content_alias_edit_page_id']) ? $GLOBALS['content_alias_edit_page_id'] : '', 'value' => $GLOBALS['content_alias_edit_page_id'] ?? '',
'output_name' => 'Content Alias Source', 'output_name' => 'Content Alias Source',
'int_null' => 1, 'int_null' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
@@ -110,132 +112,138 @@ $edit_pages = array(
// "FROM edit_page ". // "FROM edit_page ".
// (isset($GLOBALS['edit_page_id']) ? " WHERE edit_page_id <> ".$GLOBALS['edit_page_id'] : "")." ". // (isset($GLOBALS['edit_page_id']) ? " WHERE edit_page_id <> ".$GLOBALS['edit_page_id'] : "")." ".
// "ORDER BY order_number" // "ORDER BY order_number"
) ],
), ],
'load_query' => "SELECT edit_page_id, CASE WHEN hostname IS NOT NULL THEN hostname ELSE ''::VARCHAR END || filename AS filename, name, online, menu, popup FROM edit_page ORDER BY order_number", 'load_query' => "SELECT edit_page_id, "
. "CASE WHEN hostname IS NOT NULL THEN hostname ELSE ''::VARCHAR END || filename AS filename, "
. "name, online, menu, popup "
. "FROM edit_page "
. "ORDER BY order_number",
'table_name' => 'edit_page', 'table_name' => 'edit_page',
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'name' 'name' => 'name'
), ],
array( [
'name' => 'filename', 'name' => 'filename',
'before_value' => 'Filename: ' 'before_value' => 'Filename: '
), ],
array( [
'name' => 'online', 'name' => 'online',
'binary' => array('Yes','No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Online: ' 'before_value' => 'Online: '
), ],
array( [
'name' => 'menu', 'name' => 'menu',
'binary' => array('Yes','No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Menu: ' 'before_value' => 'Menu: '
), ],
array( [
'name' => 'popup', 'name' => 'popup',
'binary' => array('Yes','No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Popup: ' 'before_value' => 'Popup: '
) ],
), ],
'reference_arrays' => array( 'reference_arrays' => [
'edit_visible_group' => array( 'edit_visible_group' => [
'table_name' => 'edit_page_visible_group', 'table_name' => 'edit_page_visible_group',
'other_table_pk' => 'edit_visible_group_id', 'other_table_pk' => 'edit_visible_group_id',
'output_name' => 'Visible Groups (access)', 'output_name' => 'Visible Groups (access)',
'mandatory' => 1, 'mandatory' => 1,
'select_size' => 10, 'select_size' => 10,
'selected' => isset($GLOBALS['edit_visible_group_id']) ? $GLOBALS['edit_visible_group_id'] : '', 'selected' => $GLOBALS['edit_visible_group_id'] ?? '',
'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag FROM edit_visible_group ORDER BY name" 'query' => "SELECT edit_visible_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
), . "FROM edit_visible_group ORDER BY name"
'edit_menu_group' => array( ],
'edit_menu_group' => [
'table_name' => 'edit_page_menu_group', 'table_name' => 'edit_page_menu_group',
'other_table_pk' => 'edit_menu_group_id', 'other_table_pk' => 'edit_menu_group_id',
'output_name' => 'Menu Groups (grouping)', 'output_name' => 'Menu Groups (grouping)',
'mandatory' => 1, 'mandatory' => 1,
'select_size' => 10, 'select_size' => 10,
'selected' => isset($GLOBALS['edit_menu_group_id']) ? $GLOBALS['edit_menu_group_id'] : '', 'selected' => $GLOBALS['edit_menu_group_id'] ?? '',
'query' => "SELECT edit_menu_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag FROM edit_menu_group ORDER BY order_number" 'query' => "SELECT edit_menu_group_id, 'Name: ' || name || ', ' || 'Flag: ' || flag "
) . "FROM edit_menu_group ORDER BY order_number"
],
), ],
'element_list' => array( 'element_list' => [
'edit_query_string' => array( 'edit_query_string' => [
'output_name' => 'Query Strings', 'output_name' => 'Query Strings',
'delete_name' => 'remove_query_string', 'delete_name' => 'remove_query_string',
'prefix' => 'eqs', 'prefix' => 'eqs',
'elements' => array( 'elements' => [
'name' => array( 'name' => [
'output_name' => 'Name', 'output_name' => 'Name',
'type' => 'text', 'type' => 'text',
'error_check' => 'unique|alphanumeric', 'error_check' => 'unique|alphanumeric',
'mandatory' => 1 'mandatory' => 1
), ],
'value' => array( 'value' => [
'output_name' => 'Value', 'output_name' => 'Value',
'type' => 'text' 'type' => 'text'
), ],
'enabled' => array( 'enabled' => [
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'int' => 1, 'int' => 1,
'type' => 'checkbox', 'type' => 'checkbox',
'element_list' => array(1) 'element_list' => [1],
), ],
'dynamic' => array( 'dynamic' => [
'output_name' => 'Dynamic', 'output_name' => 'Dynamic',
'int' => 1, 'int' => 1,
'type' => 'checkbox', 'type' => 'checkbox',
'element_list' => array(1) 'element_list' => [1],
), ],
'edit_query_string_id' => array( 'edit_query_string_id' => [
'type' => 'hidden', 'type' => 'hidden',
'pk_id' => 1 'pk_id' => 1
) ],
) // elements ], // elements
), // query_string element list ], // query_string element list
'edit_page_content' => array( 'edit_page_content' => [
'output_name' => 'Page Content', 'output_name' => 'Page Content',
'delete_name' => 'remove_page_content', 'delete_name' => 'remove_page_content',
'prefix' => 'epc', 'prefix' => 'epc',
'elements' => array( 'elements' => [
'name' => array( 'name' => [
'output_name' => 'Content', 'output_name' => 'Content',
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumeric', 'error_check' => 'alphanumeric',
'mandatory' => 1 'mandatory' => 1
), ],
'uid' => array( 'uid' => [
'output_name' => 'UID', 'output_name' => 'UID',
'type' => 'text', 'type' => 'text',
'error_check' => 'unique|alphanumeric', 'error_check' => 'unique|alphanumeric',
'mandatory' => 1 'mandatory' => 1
), ],
'order_number' => array( 'order_number' => [
'output_name' => 'Order', 'output_name' => 'Order',
'type' => 'text', 'type' => 'text',
'error_check' => 'int', 'error_check' => 'int',
'mandatory' => 1 'mandatory' => 1
), ],
'online' => array( 'online' => [
'output_name' => 'Online', 'output_name' => 'Online',
'int' => 1, 'int' => 1,
'type' => 'checkbox', 'type' => 'checkbox',
'element_list' => array(1) 'element_list' => [1],
), ],
'edit_access_right_id' => array( 'edit_access_right_id' => [
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'output_name' => 'Access Level', 'output_name' => 'Access Level',
'int' => 1, 'int' => 1,
'preset' => 1, // first of the select 'preset' => 1, // first of the select
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level" 'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
), ],
'edit_page_content_id' => array( 'edit_page_content_id' => [
'type' => 'hidden', 'type' => 'hidden',
'pk_id' => 1 'pk_id' => 1
) ],
) ],
) ],
) // element list ], // element list
); ];
// __END__ // __END__

View File

@@ -1,20 +1,22 @@
<?php declare(strict_types=1); <?php
$edit_schemes = array( declare(strict_types=1);
'table_array' => array(
'edit_scheme_id' => array( $edit_schemes = [
'value' => isset($GLOBALS['edit_scheme_id']) ? $GLOBALS['edit_scheme_id'] : '', 'table_array' => [
'edit_scheme_id' => [
'value' => $GLOBALS['edit_scheme_id'] ?? '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ],
'name' => array( 'name' => [
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Scheme Name', 'output_name' => 'Scheme Name',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text' 'type' => 'text'
), ],
'header_color' => array( 'header_color' => [
'value' => isset($GLOBALS['header_color']) ? $GLOBALS['header_color'] : '', 'value' => $GLOBALS['header_color'] ?? '',
'output_name' => 'Header Color', 'output_name' => 'Header Color',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text', 'type' => 'text',
@@ -23,35 +25,35 @@ $edit_schemes = array(
'error_check' => 'custom', 'error_check' => 'custom',
'error_regex' => '/[\dA-Fa-f]{6}/', 'error_regex' => '/[\dA-Fa-f]{6}/',
'error_example' => 'F6A544' 'error_example' => 'F6A544'
), ],
'enabled' => array( 'enabled' => [
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '', 'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'template' => array( 'template' => [
'value' => isset($GLOBALS['template']) ? $GLOBALS['template'] : '', 'value' => $GLOBALS['template'] ?? '',
'output_name' => 'Template', 'output_name' => 'Template',
'type' => 'text' 'type' => 'text'
) ],
), ],
'table_name' => 'edit_scheme', 'table_name' => 'edit_scheme',
'load_query' => "SELECT edit_scheme_id, name, enabled FROM edit_scheme ORDER BY name", 'load_query' => "SELECT edit_scheme_id, name, enabled FROM edit_scheme ORDER BY name",
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'name' 'name' => 'name'
), ],
array( [
'name' => 'enabled', 'name' => 'enabled',
'binary' => array('Yes', 'No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Enabled: ' 'before_value' => 'Enabled: '
) ],
) ],
); // main array ]; // main array
// __END__ // __END__

View File

@@ -1,270 +1,274 @@
<?php declare(strict_types=1); <?php
$edit_users = array( declare(strict_types=1);
'table_array' => array(
'edit_user_id' => array( $edit_users = [
'value' => isset($GLOBALS['edit_user_id']) ? $GLOBALS['edit_user_id'] : '', 'table_array' => [
'edit_user_id' => [
'value' => $GLOBALS['edit_user_id'] ?? '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1, 'pk' => 1,
'int' => 1 'int' => 1
), ],
'username' => array( 'username' => [
'value' => isset($GLOBALS['username']) ? $GLOBALS['username'] : '', 'value' => $GLOBALS['username'] ?? '',
'output_name' => 'Username', 'output_name' => 'Username',
'mandatory' => 1, 'mandatory' => 1,
'error_check' => 'unique|alphanumericextended', 'error_check' => 'unique|alphanumericextended',
'type' => 'text' 'type' => 'text'
), ],
'password' => array( 'password' => [
'value' => isset($GLOBALS['password']) ? $GLOBALS['password'] : '', 'value' => $GLOBALS['password'] ?? '',
'HIDDEN_value' => isset($GLOBALS['HIDDEN_password']) ? $GLOBALS['HIDDEN_password'] : '', 'HIDDEN_value' => $GLOBALS['HIDDEN_password'] ?? '',
'CONFIRM_value' => isset($GLOBALS['CONFIRM_password']) ? $GLOBALS['CONFIRM_password'] : '', 'CONFIRM_value' => $GLOBALS['CONFIRM_password'] ?? '',
'output_name' => 'Password', 'output_name' => 'Password',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'password', // later has to be password for encryption in database 'type' => 'password', // later has to be password for encryption in database
'update' => array( // connected field updates, and update data 'update' => [ // connected field updates, and update data
'password_change_date' => array( // db row to update 'password_change_date' => [ // db row to update
'type' => 'date', // type of field (int/text/date/etc) 'type' => 'date', // type of field (int/text/date/etc)
'value' => 'NOW()' // value [todo: complex reference 'value' => 'NOW()' // value [todo: complex reference
) ],
) ],
), ],
// password date when first insert and password is set, needs special field with connection to password // password date when first insert and password is set, needs special field with connection to password
// password reset force interval, if set, user needs to reset password after X time period // password reset force interval, if set, user needs to reset password after X time period
'password_change_interval' => array( 'password_change_interval' => [
'value' => isset($GLOBALS['password_change_interval']) ? $GLOBALS['password_change_interval'] : '', 'value' => $GLOBALS['password_change_interval'] ?? '',
'output_name' => 'Password change interval', 'output_name' => 'Password change interval',
'error_check' => 'intervalshort', // can be any date length format. n Y/M/D [not H/M/S], only one set, no combination // can be any date length format. n Y/M/D [not H/M/S], only one set, no combination
'error_check' => 'intervalshort',
'type' => 'text', 'type' => 'text',
'interval' => 1, // interval needs NULL write for empty 'interval' => 1, // interval needs NULL write for empty
'size' => 5, // make it 5 chars long 'size' => 5, // make it 5 chars long
'length' => 5 'length' => 5
), ],
'enabled' => array( 'enabled' => [
'value' => isset($GLOBALS['enabled']) ? $GLOBALS['enabled'] : '', 'value' => $GLOBALS['enabled'] ?? '',
'output_name' => 'Enabled', 'output_name' => 'Enabled',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'strict' => array( 'strict' => [
'value' => isset($GLOBALS['strict']) ? $GLOBALS['strict'] : '', 'value' => $GLOBALS['strict'] ?? '',
'output_name' => 'Strict (Lock after errors)', 'output_name' => 'Strict (Lock after errors)',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'locked' => array( 'locked' => [
'value' => isset($GLOBALS['locked']) ? $GLOBALS['locked'] : '', 'value' => $GLOBALS['locked'] ?? '',
'output_name' => 'Locked (auto set if strict with errors)', 'output_name' => 'Locked (auto set if strict with errors)',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'admin' => array( 'admin' => [
'value' => isset($GLOBALS['admin']) ? $GLOBALS['admin'] : '', 'value' => $GLOBALS['admin'] ?? '',
'output_name' => 'Admin', 'output_name' => 'Admin',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'debug' => array( 'debug' => [
'value' => isset($GLOBALS['debug']) ? $GLOBALS['debug'] : '', 'value' => $GLOBALS['debug'] ?? '',
'output_name' => 'Debug', 'output_name' => 'Debug',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'db_debug' => array( 'db_debug' => [
'value' => isset($GLOBALS['db_debug']) ? $GLOBALS['db_debug'] : '', 'value' => $GLOBALS['db_debug'] ?? '',
'output_name' => 'DB Debug', 'output_name' => 'DB Debug',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'email' => array( 'email' => [
'value' => isset($GLOBALS['email']) ? $GLOBALS['email'] : '', 'value' => $GLOBALS['email'] ?? '',
'output_name' => 'E-Mail', 'output_name' => 'E-Mail',
'type' => 'text', 'type' => 'text',
'error_check' => 'email' 'error_check' => 'email'
), ],
'last_name' => array( 'last_name' => [
'value' => isset($GLOBALS['last_name']) ? $GLOBALS['last_name'] : '', 'value' => $GLOBALS['last_name'] ?? '',
'output_name' => 'Last Name', 'output_name' => 'Last Name',
'type' => 'text' 'type' => 'text'
), ],
'first_name' => array( 'first_name' => [
'value' => isset($GLOBALS['first_name']) ? $GLOBALS['first_name'] : '', 'value' => $GLOBALS['first_name'] ?? '',
'output_name' => 'First Name', 'output_name' => 'First Name',
'type' => 'text' 'type' => 'text'
), ],
'edit_language_id' => array( 'edit_language_id' => [
'value' => isset($GLOBALS['edit_language_id']) ? $GLOBALS['edit_language_id'] : '', 'value' => $GLOBALS['edit_language_id'] ?? '',
'output_name' => 'Language', 'output_name' => 'Language',
'mandatory' => 1, 'mandatory' => 1,
'int' => 1, 'int' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT edit_language_id, long_name FROM edit_language WHERE enabled = 1 ORDER BY order_number" 'query' => "SELECT edit_language_id, long_name FROM edit_language WHERE enabled = 1 ORDER BY order_number"
), ],
'edit_scheme_id' => array( 'edit_scheme_id' => [
'value' => isset($GLOBALS['edit_scheme_id']) ? $GLOBALS['edit_scheme_id'] : '', 'value' => $GLOBALS['edit_scheme_id'] ?? '',
'output_name' => 'Scheme', 'output_name' => 'Scheme',
'int_null' => 1, 'int_null' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name" 'query' => "SELECT edit_scheme_id, name FROM edit_scheme WHERE enabled = 1 ORDER BY name"
), ],
'edit_group_id' => array( 'edit_group_id' => [
'value' => isset($GLOBALS['edit_group_id']) ? $GLOBALS['edit_group_id'] : '', 'value' => $GLOBALS['edit_group_id'] ?? '',
'output_name' => 'Group', 'output_name' => 'Group',
'int' => 1, 'int' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT edit_group_id, name FROM edit_group WHERE enabled = 1 ORDER BY name", 'query' => "SELECT edit_group_id, name FROM edit_group WHERE enabled = 1 ORDER BY name",
'mandatory' => 1 'mandatory' => 1
), ],
'edit_access_right_id' => array( 'edit_access_right_id' => [
'value' => isset($GLOBALS['edit_access_right_id']) ? $GLOBALS['edit_access_right_id'] : '', 'value' => $GLOBALS['edit_access_right_id'] ?? '',
'output_name' => 'User Level', 'output_name' => 'User Level',
'mandatory' => 1, 'mandatory' => 1,
'int' => 1, 'int' => 1,
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level" 'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
), ],
'login_error_count' => array( 'login_error_count' => [
'output_name' => 'Login error count', 'output_name' => 'Login error count',
'value' => isset($GLOBALS['login_error_count']) ? $GLOBALS['login_error_count'] : '', 'value' => $GLOBALS['login_error_count'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '0' 'empty' => '0'
), ],
'login_error_date_last' => array( 'login_error_date_last' => [
'output_name' => 'Last login error', 'output_name' => 'Last login error',
'value' => isset($GLOBALS['login_error_date_liast']) ? $GLOBALS['login_error_date_liast'] : '', 'value' => $GLOBALS['login_error_date_liast'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '-' 'empty' => '-'
), ],
'login_error_date_first' => array( 'login_error_date_first' => [
'output_name' => 'First login error', 'output_name' => 'First login error',
'value' => isset($GLOBALS['login_error_date_first']) ? $GLOBALS['login_error_date_first'] : '', 'value' => $GLOBALS['login_error_date_first'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '-' 'empty' => '-'
), ],
'protected' => array( 'protected' => [
'value' => isset($GLOBALS['protected']) ? $GLOBALS['protected'] : '', 'value' => $GLOBALS['protected'] ?? '',
'output_name' => 'Protected', 'output_name' => 'Protected',
'type' => 'binary', 'type' => 'binary',
'int' => 1, 'int' => 1,
'element_list' => array( 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
) ],
), ],
'additional_acl' => array( 'additional_acl' => [
'value' => isset($GLOBALS['additional_acl']) ? $GLOBALS['additional_acl'] : '', 'value' => $GLOBALS['additional_acl'] ?? '',
'output_name' => 'Additional ACL (as JSON)', 'output_name' => 'Additional ACL (as JSON)',
'type' => 'textarea', 'type' => 'textarea',
'error_check' => 'json', 'error_check' => 'json',
'rows' => 10, 'rows' => 10,
'cols' => 60 'cols' => 60
), ],
), ],
'load_query' => "SELECT edit_user_id, username, enabled, debug, db_debug, strict, locked, login_error_count FROM edit_user ORDER BY username", 'load_query' => "SELECT edit_user_id, username, enabled, debug, db_debug, strict, locked, login_error_count "
. "FROM edit_user ORDER BY username",
'table_name' => 'edit_user', 'table_name' => 'edit_user',
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'username' 'name' => 'username'
), ],
array( [
'name' => 'enabled', 'name' => 'enabled',
'binary' => array('Yes', 'No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Enabled: ' 'before_value' => 'Enabled: '
), ],
array( [
'name' => 'debug', 'name' => 'debug',
'binary' => array('Yes', 'No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Debug: ' 'before_value' => 'Debug: '
), ],
array( [
'name' => 'db_debug', 'name' => 'db_debug',
'binary' => array('Yes', 'No'), 'binary' => ['Yes', 'No'],
'before_value' => 'DB Debug: ' 'before_value' => 'DB Debug: '
), ],
array( [
'name' => 'strict', 'name' => 'strict',
'binary' => array('Yes', 'No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Strict: ' 'before_value' => 'Strict: '
), ],
array( [
'name' => 'locked', 'name' => 'locked',
'binary' => array('Yes', 'No'), 'binary' => ['Yes', 'No'],
'before_value' => 'Locked: ' 'before_value' => 'Locked: '
), ],
array( [
'name' => 'login_error_count', 'name' => 'login_error_count',
'before_value' => 'Errors: ' 'before_value' => 'Errors: '
) ],
), ],
'element_list' => array( 'element_list' => [
'edit_access_user' => array( 'edit_access_user' => [
'output_name' => 'Accounts', 'output_name' => 'Accounts',
'mandatory' => 1, 'mandatory' => 1,
'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set 'delete' => 0, // set then reference entries are deleted, else the 'enable' flag is only set
'prefix' => 'ecu', 'prefix' => 'ecu',
'read_data' => array( 'read_data' => [
'table_name' => 'edit_access', 'table_name' => 'edit_access',
'pk_id' => 'edit_access_id', 'pk_id' => 'edit_access_id',
'name' => 'name', 'name' => 'name',
'order' => 'name' 'order' => 'name'
), ],
'elements' => array( 'elements' => [
'edit_access_user_id' => array( 'edit_access_user_id' => [
'output_name' => 'Activate', 'output_name' => 'Activate',
'type' => 'hidden', 'type' => 'hidden',
'int' => 1, 'int' => 1,
'pk_id' => 1 'pk_id' => 1
), ],
'enabled' => array( 'enabled' => [
'type' => 'checkbox', 'type' => 'checkbox',
'output_name' => 'Activate', 'output_name' => 'Activate',
'int' => 1, 'int' => 1,
'element_list' => array(1) 'element_list' => [1],
), ],
'edit_access_right_id' => array( 'edit_access_right_id' => [
'type' => 'drop_down_db', 'type' => 'drop_down_db',
'output_name' => 'Access Level', 'output_name' => 'Access Level',
'preset' => 1, // first of the select 'preset' => 1, // first of the select
'int' => 1, 'int' => 1,
'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level" 'query' => "SELECT edit_access_right_id, name FROM edit_access_right ORDER BY level"
), ],
'edit_default' => array( 'edit_default' => [
'type' => 'radio_group', 'type' => 'radio_group',
'output_name' => 'Default', 'output_name' => 'Default',
'int' => 1, 'int' => 1,
'element_list' => 'radio_group' 'element_list' => 'radio_group'
), ],
'edit_access_id' => array( 'edit_access_id' => [
'type' => 'hidden', 'type' => 'hidden',
'int' => 1 'int' => 1
) ],
) ],
) // edit pages ggroup ], // edit pages ggroup
) ],
); ];
// __END__ // __END__

View File

@@ -1,33 +1,35 @@
<?php declare(strict_types=1); <?php
$edit_visible_group = array( declare(strict_types=1);
'table_array' => array(
'edit_visible_group_id' => array( $edit_visible_group = [
'value' => isset($GLOBALS['edit_visible_group_id']) ? $GLOBALS['edit_visible_group_id'] : '', 'table_array' => [
'edit_visible_group_id' => [
'value' => $GLOBALS['edit_visible_group_id'] ?? '',
'type' => 'hidden', 'type' => 'hidden',
'pk' => 1 'pk' => 1
), ],
'name' => array( 'name' => [
'value' => isset($GLOBALS['name']) ? $GLOBALS['name'] : '', 'value' => $GLOBALS['name'] ?? '',
'output_name' => 'Group name', 'output_name' => 'Group name',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text' 'type' => 'text'
), ],
'flag' => array( 'flag' => [
'value' => isset($GLOBALS['flag']) ? $GLOBALS['flag'] : '', 'value' => $GLOBALS['flag'] ?? '',
'output_name' => 'Flag', 'output_name' => 'Flag',
'mandatory' => 1, 'mandatory' => 1,
'type' => 'text', 'type' => 'text',
'error_check' => 'alphanumeric|unique' 'error_check' => 'alphanumeric|unique'
) ],
), ],
'table_name' => 'edit_visible_group', 'table_name' => 'edit_visible_group',
'load_query' => "SELECT edit_visible_group_id, name FROM edit_visible_group ORDER BY name", 'load_query' => "SELECT edit_visible_group_id, name FROM edit_visible_group ORDER BY name",
'show_fields' => array( 'show_fields' => [
array( [
'name' => 'name' 'name' => 'name'
) ],
) ],
); ];
// __END__ // __END__

View File

@@ -100,10 +100,10 @@
</script> </script>
<!-- /TinyMCE --> <!-- /TinyMCE -->
{/if} {/if}
{popup_init src="`$js`/overlib/overlib.js"}
</head> </head>
<body> <body>
<div style="margin: 2px; width: {$table_width}px; margin-bottom: 10px;"> {popup_init src="`$js`/overlib/overlib.js"}
<div style="margin: 2px; width: {$table_width}; margin-bottom: 10px;">
<div style="position: relative; height: 20px;" class="menu"> <div style="position: relative; height: 20px;" class="menu">
<div style="position: absolute; width: 200px;">{t 1=$USER_NAME|upper}Hello %1{/t}</div> <div style="position: absolute; width: 200px;">{t 1=$USER_NAME|upper}Hello %1{/t}</div>
<div style="position: absolute; text-align: right; right: 0px; width: 120px;"> <div style="position: absolute; text-align: right; right: 0px; width: 120px;">
@@ -127,13 +127,13 @@
{/if} {/if}
{/foreach} {/foreach}
</div> </div>
<div class="pagename"> <div id="pagename" class="pagename">
{$page_name} {$page_name}
</div> </div>
</div> </div>
{* error/warning *} {* error/warning *}
{if $messages} {if $messages}
<div style="margin: 2px; width: {$table_width}px;"> <div style="margin: 2px; width: {$table_width};">
{foreach from=$messages item=item key=key} {foreach from=$messages item=item key=key}
<div class="{$item.class}">{$item.msg}</div> <div class="{$item.class}">{$item.msg}</div>
{/foreach} {/foreach}
@@ -143,7 +143,7 @@
{* debug info *} {* debug info *}
{if $DEBUG} {if $DEBUG}
<div style="width:{$table_width}px;" class="debug_message"> <div style="width:{$table_width};" class="debug_message">
{$Id}<br> {$Id}<br>
<b>{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</b><br> <b>{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</b><br>
{$debug_error_msg} {$debug_error_msg}

View File

@@ -2,7 +2,10 @@
{$SMARTY_TEST} {$SMARTY_TEST}
</div> </div>
<div> <div>
TRANSLATION CLASS: {$TRANSLATE_TEST} TRANSLATION CLASS (OUT): {$TRANSLATE_TEST}
</div>
<div>
TRANSLATION CLASS (SMARTY): {$TRANSLATE_TEST_SMARTY}
</div> </div>
<div> <div>
<select id="drop_down_test" name="drop_down_test"> <select id="drop_down_test" name="drop_down_test">

View File

View File

@@ -3,6 +3,8 @@
/* jshint esversion: 6 */ /* jshint esversion: 6 */
/* global i18n */
// debug set // debug set
/*var FRONTEND_DEBUG = false; /*var FRONTEND_DEBUG = false;
var DEBUG = true; var DEBUG = true;
@@ -22,7 +24,8 @@ var GL_OB_BASE = 30;
* @param {String} winName window name * @param {String} winName window name
* @param {Object} features popup features * @param {Object} features popup features
*/ */
function pop(theURL, winName, features) { function pop(theURL, winName, features) // eslint-disable-line no-unused-vars
{
winName = window.open(theURL, winName, features); winName = window.open(theURL, winName, features);
winName.focus(); winName.focus();
} }
@@ -31,7 +34,8 @@ function pop(theURL, winName, features) {
* automatically resize a text area based on the amount of lines in it * automatically resize a text area based on the amount of lines in it
* @param {[string} ta_id element id * @param {[string} ta_id element id
*/ */
function expandTA(ta_id) { function expandTA(ta_id) // eslint-disable-line no-unused-vars
{
var ta; var ta;
// if a string comes, its a get by id, else use it as an element pass on // if a string comes, its a get by id, else use it as an element pass on
if (!ta_id.length) { if (!ta_id.length) {
@@ -40,7 +44,7 @@ function expandTA(ta_id) {
ta = document.getElementById(ta_id); ta = document.getElementById(ta_id);
} }
var maxChars = ta.cols; var maxChars = ta.cols;
var theRows = ta.value.split("\n"); var theRows = ta.value.split('\n');
var numNewRows = 0; var numNewRows = 0;
for ( var i = 0; i < theRows.length; i++ ) { for ( var i = 0; i < theRows.length; i++ ) {
@@ -124,7 +128,7 @@ function setCenter(id, left, top)
* @param {Number} [duration=500] animation time, default 500ms * @param {Number} [duration=500] animation time, default 500ms
* @param {String} [base='body,html'] base element for offset scroll * @param {String} [base='body,html'] base element for offset scroll
*/ */
function goToPos(element, offset = 0, duration = 500, base = 'body,html') function goToPos(element, offset = 0, duration = 500, base = 'body,html') // eslint-disable-line no-unused-vars
{ {
try { try {
if ($('#' + element).length) { if ($('#' + element).length) {
@@ -190,7 +194,7 @@ if (Number.prototype.round) {
* @param {Number} x number to be formated * @param {Number} x number to be formated
* @return {String} formatted with , in thousands * @return {String} formatted with , in thousands
*/ */
function numberWithCommas(x) function numberWithCommas(x) // eslint-disable-line no-unused-vars
{ {
var parts = x.toString().split('.'); var parts = x.toString().split('.');
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ','); parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
@@ -202,7 +206,7 @@ function numberWithCommas(x)
* @param {String} string any string * @param {String} string any string
* @return {String} string with <br> * @return {String} string with <br>
*/ */
function convertLBtoBR(string) function convertLBtoBR(string) // eslint-disable-line no-unused-vars
{ {
return string.replace(/(?:\r\n|\r|\n)/g, '<br>'); return string.replace(/(?:\r\n|\r|\n)/g, '<br>');
} }
@@ -214,14 +218,14 @@ function convertLBtoBR(string)
*/ */
if (!String.prototype.escapeHTML) { if (!String.prototype.escapeHTML) {
String.prototype.escapeHTML = function() { String.prototype.escapeHTML = function() {
return this.replace(/[&<>"'\/]/g, function (s) { return this.replace(/[&<>"'/]/g, function (s) {
var entityMap = { var entityMap = {
"&": "&amp;", '&': '&amp;',
"<": "&lt;", '<': '&lt;',
">": "&gt;", '>': '&gt;',
'"': '&quot;', '"': '&quot;',
"'": '&#39;', '\'': '&#39;',
"/": '&#x2F;' '/': '&#x2F;'
}; };
return entityMap[s]; return entityMap[s];
@@ -238,12 +242,12 @@ if (!String.prototype.unescapeHTML) {
String.prototype.unescapeHTML = function() { String.prototype.unescapeHTML = function() {
return this.replace(/&[#\w]+;/g, function (s) { return this.replace(/&[#\w]+;/g, function (s) {
var entityMap = { var entityMap = {
"&amp;": "&", '&amp;': '&',
"&lt;": "<", '&lt;': '<',
"&gt;": ">", '&gt;': '>',
'&quot;': '"', '&quot;': '"',
'&#39;': "'", '&#39;': '\'',
'&#x2F;': "/" '&#x2F;': '/'
}; };
return entityMap[s]; return entityMap[s];
@@ -255,7 +259,7 @@ if (!String.prototype.unescapeHTML) {
* returns current timestamp (unix timestamp) * returns current timestamp (unix timestamp)
* @return {Number} timestamp (in milliseconds) * @return {Number} timestamp (in milliseconds)
*/ */
function getTimestamp() function getTimestamp() // eslint-disable-line no-unused-vars
{ {
var date = new Date(); var date = new Date();
return date.getTime(); return date.getTime();
@@ -278,7 +282,7 @@ function dec2hex(dec)
* @param {Number} len length of unique id string * @param {Number} len length of unique id string
* @return {String} random string in length of len * @return {String} random string in length of len
*/ */
function generateId(len) function generateId(len) // eslint-disable-line no-unused-vars
{ {
var arr = new Uint8Array((len || 40) / 2); var arr = new Uint8Array((len || 40) / 2);
(window.crypto || window.msCrypto).getRandomValues(arr); (window.crypto || window.msCrypto).getRandomValues(arr);
@@ -291,7 +295,7 @@ function generateId(len)
* after many runs it will create duplicates * after many runs it will create duplicates
* @return {String} not true random string * @return {String} not true random string
*/ */
function randomIdF() function randomIdF() // eslint-disable-line no-unused-vars
{ {
return Math.random().toString(36).substring(2); return Math.random().toString(36).substring(2);
} }
@@ -301,7 +305,7 @@ function randomIdF()
* @param {string} name Name of function to check if exists * @param {string} name Name of function to check if exists
* @return {Boolean} true/false * @return {Boolean} true/false
*/ */
function isFunction(name) function isFunction(name) // eslint-disable-line no-unused-vars
{ {
if (typeof window[name] !== 'undefined' && if (typeof window[name] !== 'undefined' &&
typeof window[name] === 'function') { typeof window[name] === 'function') {
@@ -320,7 +324,7 @@ function isFunction(name)
* hidden next are all the arguments * hidden next are all the arguments
* @return {mixed} Return values from functon * @return {mixed} Return values from functon
*/ */
function executeFunctionByName(functionName, context /*, args */) function executeFunctionByName(functionName, context /*, args */) // eslint-disable-line no-unused-vars
{ {
var args = Array.prototype.slice.call(arguments, 2); var args = Array.prototype.slice.call(arguments, 2);
var namespaces = functionName.split('.'); var namespaces = functionName.split('.');
@@ -362,7 +366,7 @@ function getObjectCount(object)
*/ */
function keyInObject(key, object) function keyInObject(key, object)
{ {
return (Object.prototype.hasOwnProperty.call(object, key)) ? true : false; return Object.prototype.hasOwnProperty.call(object, key) ? true : false;
} }
/** /**
@@ -371,7 +375,7 @@ function keyInObject(key, object)
* @param {Mixed} value any value (String, Number, etc) * @param {Mixed} value any value (String, Number, etc)
* @return {String} the key found for the first matching value * @return {String} the key found for the first matching value
*/ */
function getKeyByValue(object, value) function getKeyByValue(object, value) // eslint-disable-line no-unused-vars
{ {
return Object.keys(object).find(key => object[key] === value); return Object.keys(object).find(key => object[key] === value);
// return Object.keys(object).find(function (key) { // return Object.keys(object).find(function (key) {
@@ -385,9 +389,9 @@ function getKeyByValue(object, value)
* @param {Mixed} value any value (String, Number, etc) * @param {Mixed} value any value (String, Number, etc)
* @return {Boolean} true on value found, false on not found * @return {Boolean} true on value found, false on not found
*/ */
function valueInObject(object, value) function valueInObject(object, value) // eslint-disable-line no-unused-vars
{ {
return (Object.keys(object).find(key => object[key] === value)) ? true : false; return Object.keys(object).find(key => object[key] === value) ? true : false;
// return Object.keys(object).find(function (key) { // return Object.keys(object).find(function (key) {
// return object[key] === value; // return object[key] === value;
// }) ? true : false; // }) ? true : false;
@@ -403,7 +407,7 @@ function valueInObject(object, value)
function deepCopyFunction(inObject) function deepCopyFunction(inObject)
{ {
var outObject, value, key; var outObject, value, key;
if (typeof inObject !== "object" || inObject === null) { if (typeof inObject !== 'object' || inObject === null) {
return inObject; // Return the value if inObject is not an object return inObject; // Return the value if inObject is not an object
} }
// Create an array or object to hold the values // Create an array or object to hold the values
@@ -434,14 +438,15 @@ function exists(id)
* @param {Number} bytes bytes in int * @param {Number} bytes bytes in int
* @return {String} string in GB/MB/KB * @return {String} string in GB/MB/KB
*/ */
function formatBytes(bytes) function formatBytes(bytes) // eslint-disable-line no-unused-vars
{ {
var i = -1; var i = -1;
do { do {
bytes = bytes / 1024; bytes = bytes / 1024;
i++; i++;
} while (bytes > 99); } while (bytes > 99);
return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; return parseFloat(Math.round(bytes * Math.pow(10, 2)) / Math.pow(10, 2)) +
['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];
} }
/** /**
@@ -449,7 +454,7 @@ function formatBytes(bytes)
* @param {Number} bytes bytes in int * @param {Number} bytes bytes in int
* @return {String} string in GB/MB/KB * @return {String} string in GB/MB/KB
*/ */
function formatBytesLong(bytes) function formatBytesLong(bytes) // eslint-disable-line no-unused-vars
{ {
var i = Math.floor(Math.log(bytes) / Math.log(1024)); var i = Math.floor(Math.log(bytes) / Math.log(1024));
var sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; var sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
@@ -458,13 +463,13 @@ function formatBytesLong(bytes)
/** /**
* Convert a string with B/K/M/etc into a byte number * Convert a string with B/K/M/etc into a byte number
* @param {String} bytes Any string with B/K/M/etc * @param {String|Number} bytes Any string with B/K/M/etc
* @return {Number} A byte number, or original string as is * @return {String|Number} A byte number, or original string as is
*/ */
function stringByteFormat(bytes) function stringByteFormat(bytes) // eslint-disable-line no-unused-vars
{ {
// early abort if this is a number already // if anything not string return
if (!isNaN(bytes)) { if (!(typeof bytes === 'string' || bytes instanceof String)) {
return bytes; return bytes;
} }
// for pow exponent list // for pow exponent list
@@ -536,7 +541,7 @@ function errorCatch(err)
* default empty. for console.log * default empty. for console.log
* @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block * @param {Boolean} [overlay=true] override the auto hide/show over the overlay div block
*/ */
function actionIndicator(loc, overlay = true) function actionIndicator(loc, overlay = true) // eslint-disable-line no-unused-vars
{ {
if ($('#indicator').is(':visible')) { if ($('#indicator').is(':visible')) {
actionIndicatorHide(loc, overlay); actionIndicatorHide(loc, overlay);
@@ -613,7 +618,7 @@ function overlayBoxHide()
/** /**
* position the overlay block box and shows it * position the overlay block box and shows it
*/ */
function setOverlayBox() function setOverlayBox() // eslint-disable-line no-unused-vars
{ {
if (!$('#overlayBox').is(':visible')) { if (!$('#overlayBox').is(':visible')) {
$('#overlayBox').show(); $('#overlayBox').show();
@@ -623,7 +628,7 @@ function setOverlayBox()
/** /**
* opposite of set, always hides overlay box * opposite of set, always hides overlay box
*/ */
function hideOverlayBox() function hideOverlayBox() // eslint-disable-line no-unused-vars
{ {
if ($('#overlayBox').is(':visible')) { if ($('#overlayBox').is(':visible')) {
$('#overlayBox').hide(); $('#overlayBox').hide();
@@ -633,7 +638,7 @@ function hideOverlayBox()
/** /**
* the abort call, clears the action box and hides it and the overlay box * the abort call, clears the action box and hides it and the overlay box
*/ */
function ClearCall() function ClearCall() // eslint-disable-line no-unused-vars
{ {
$('#actionBox').html(''); $('#actionBox').html('');
$('#actionBox').hide(); $('#actionBox').hide();
@@ -654,7 +659,7 @@ function ClearCall()
* - indicator is page centered * - indicator is page centered
* @param {String} loc ID string, only used for console log * @param {String} loc ID string, only used for console log
*/ */
function showActionIndicator(loc) function showActionIndicator(loc) // eslint-disable-line no-unused-vars
{ {
// console.log('Indicator: SHOW [%s]', loc); // console.log('Indicator: SHOW [%s]', loc);
// check if indicator element exists // check if indicator element exists
@@ -692,7 +697,7 @@ function showActionIndicator(loc)
* is set to this value * is set to this value
* @param {String} loc ID string, only used for console log * @param {String} loc ID string, only used for console log
*/ */
function hideActionIndicator(loc) function hideActionIndicator(loc) // eslint-disable-line no-unused-vars
{ {
// console.log('Indicator: HIDE [%s]', loc); // console.log('Indicator: HIDE [%s]', loc);
// check if indicator is visible // check if indicator is visible
@@ -732,7 +737,7 @@ function checkOverlayExists()
* if visible, add +1 to the GL_OB_S variable and * if visible, add +1 to the GL_OB_S variable and
* up zIndex by this value * up zIndex by this value
*/ */
function showOverlayBoxLayers(el_id) function showOverlayBoxLayers(el_id) // eslint-disable-line no-unused-vars
{ {
// console.log('SHOW overlaybox: %s', GL_OB_S); // console.log('SHOW overlaybox: %s', GL_OB_S);
// if overlay box is not visible show and set zIndex to 0 // if overlay box is not visible show and set zIndex to 0
@@ -789,7 +794,7 @@ function hideOverlayBoxLayers(el_id)
/** /**
* only for single action box * only for single action box
*/ */
function clearCallActionBox() function clearCallActionBox() // eslint-disable-line no-unused-vars
{ {
$('#actionBox').html(''); $('#actionBox').html('');
$('#actionBox').hide(); $('#actionBox').hide();
@@ -872,7 +877,7 @@ function aelx(base, ...attach)
* @param {Array} attach array of objects to attach * @param {Array} attach array of objects to attach
* @return {Object} "none", technically there is no return needed, global attach * @return {Object} "none", technically there is no return needed, global attach
*/ */
function aelxar(base, attach) function aelxar(base, attach) // eslint-disable-line no-unused-vars
{ {
for (var i = 0; i < attach.length; i ++) { for (var i = 0; i < attach.length; i ++) {
// base.sub.push(Object.assign({}, attach[i])); // base.sub.push(Object.assign({}, attach[i]));
@@ -886,7 +891,7 @@ function aelxar(base, attach)
* @param {Object} base cel created element * @param {Object} base cel created element
* @return {Object} returns reset base element * @return {Object} returns reset base element
*/ */
function rel(base) function rel(base) // eslint-disable-line no-unused-vars
{ {
base.sub = []; base.sub = [];
return base; return base;
@@ -930,7 +935,7 @@ function acssel(_element, css)
* @param {String} acss style to add (name) * @param {String} acss style to add (name)
* @return {Object} returns full element * @return {Object} returns full element
*/ */
function scssel(_element, rcss, acss) function scssel(_element, rcss, acss) // eslint-disable-line no-unused-vars
{ {
rcssel(_element, rcss); rcssel(_element, rcss);
acssel(_element, acss); acssel(_element, acss);
@@ -1008,7 +1013,7 @@ function phfo(tree)
* @param {Array} list Array of cel created objects * @param {Array} list Array of cel created objects
* @return {String} HTML String * @return {String} HTML String
*/ */
function phfa(list) function phfa(list) // eslint-disable-line no-unused-vars
{ {
var content = []; var content = [];
for (var i = 0; i < list.length; i ++) { for (var i = 0; i < list.length; i ++) {
@@ -1034,7 +1039,7 @@ function phfa(list)
* 'values' all others are ignored * 'values' all others are ignored
* @return {String} html with build options block * @return {String} html with build options block
*/ */
function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '') function html_options(name, data, selected = '', options_only = false, return_string = false, sort = '') // eslint-disable-line no-unused-vars
{ {
// wrapper to new call // wrapper to new call
return html_options_block(name, data, selected, false, options_only, return_string, sort); return html_options_block(name, data, selected, false, options_only, return_string, sort);
@@ -1067,6 +1072,7 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
var element_option; var element_option;
var data_list = []; // for sorted output var data_list = []; // for sorted output
var value; var value;
var options = {};
// var option; // var option;
if (multiple > 0) { if (multiple > 0) {
select_options.multiple = ''; select_options.multiple = '';
@@ -1139,7 +1145,7 @@ function html_options_block(name, data, selected = '', multiple = 0, options_onl
* @param {String} [sort=''] if empty as is, else allowed 'keys', 'values' * @param {String} [sort=''] if empty as is, else allowed 'keys', 'values'
* all others are ignored * all others are ignored
*/ */
function html_options_refill(name, data, sort = '') function html_options_refill(name, data, sort = '') // eslint-disable-line no-unused-vars
{ {
var element_option; var element_option;
var option_selected; var option_selected;
@@ -1186,21 +1192,26 @@ function html_options_refill(name, data, sort = '')
* or empty for none * or empty for none
* @return {Object|String} parameter entry list * @return {Object|String} parameter entry list
*/ */
function parseQueryString(query = '', return_key = '') { function parseQueryString(query = '', return_key = '') // eslint-disable-line no-unused-vars
{
if (!query) { if (!query) {
query = window.location.search.substring(1); query = window.location.search.substring(1);
} }
var vars = query.split("&"); var vars = query.split('&');
var query_string = {}; var query_string = {};
for (var i = 0; i < vars.length; i++) { for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("="); var pair = vars[i].split('=');
var key = decodeURIComponent(pair[0]); var key = decodeURIComponent(pair[0]);
var value = decodeURIComponent(pair[1]); var value = decodeURIComponent(pair[1]);
// skip over run if there is nothing
if (!key || value === 'undefined') {
continue;
}
// If first entry with this name // If first entry with this name
if (typeof query_string[key] === "undefined") { if (typeof query_string[key] === 'undefined') {
query_string[key] = decodeURIComponent(value); query_string[key] = decodeURIComponent(value);
// If second entry with this name // If second entry with this name
} else if (typeof query_string[key] === "string") { } else if (typeof query_string[key] === 'string') {
var arr = [query_string[key], decodeURIComponent(value)]; var arr = [query_string[key], decodeURIComponent(value)];
query_string[key] = arr; query_string[key] = arr;
// If third or later entry with this name // If third or later entry with this name
@@ -1220,26 +1231,59 @@ function parseQueryString(query = '', return_key = '') {
} }
/** /**
* searchs the current url for a parameter * searches query parameters for entry and returns data either as string or array
* @param {String} key uid key to get data for * if no search is given the whole parameters are returned as an object
* @return {String} value for the key or '' for not found * if a parameter is set several times it will be returned as an array
* if search parameter set and nothing found and empty string is returned
* if no parametes exist and no serach is set and empty object is returned
* @param {String} [search=''] if set searches for this entry, if empty
* all parameters are returned
* @param {String} [query=''] different query string to parse, if not
* set (default) the current window href is used
* @param {Bool} [single=false] if set to true then only the first found
* will be returned
* @return {Object|Array|String} if search is empty, object, if search is set
* and only one entry, then string, else array
* unless single is true
*/ */
function getQueryStringParam(key) function getQueryStringParam(search = '', query = '', single = false) // eslint-disable-line no-unused-vars
{ {
var url = new URL(window.location.href); if (!query) {
var param = url.searchParams.get(key); query = window.location.href;
if (param) {
return param;
} else {
return '';
} }
const url = new URL(query);
let param = '';
if (search) {
let _params = url.searchParams.getAll(search);
if (_params.length == 1 || single === true) {
param = _params[0];
} else if (_params.length > 1) {
param = _params;
}
} else {
// will be object, so declare it one
param = {};
// loop over paramenters
for (const [key] of url.searchParams.entries()) {
// check if not yet set
if (typeof param[key] === 'undefined') {
// get the parameters multiple
let _params = url.searchParams.getAll(key);
// if 1 set as string, else attach array as is
param[key] = _params.length < 2 || single === true ?
_params[0] :
_params;
}
}
}
return param;
} }
// *** MASTER logout call // *** MASTER logout call
/** /**
* submits basic data for form logout * submits basic data for form logout
*/ */
function loginLogout() function loginLogout() // eslint-disable-line no-unused-vars
{ {
const form = document.createElement('form'); const form = document.createElement('form');
form.method = 'post'; form.method = 'post';
@@ -1259,7 +1303,7 @@ function loginLogout()
* if not set mainHeader is assumed * if not set mainHeader is assumed
* this is the target div for the "loginRow" * this is the target div for the "loginRow"
*/ */
function createLoginRow(login_string, header_id = 'mainHeader') function createLoginRow(login_string, header_id = 'mainHeader') // eslint-disable-line no-unused-vars
{ {
// if header does not exist, we do nothing // if header does not exist, we do nothing
if (exists(header_id)) { if (exists(header_id)) {
@@ -1293,7 +1337,8 @@ function createLoginRow(login_string, header_id = 'mainHeader')
* if not set mainHeader is assumed * if not set mainHeader is assumed
* this is the target div for the "menuRow" * this is the target div for the "menuRow"
*/ */
function createNavMenu(nav_menu, header_id = 'mainHeader') { function createNavMenu(nav_menu, header_id = 'mainHeader') // eslint-disable-line no-unused-vars
{
// must be an object // must be an object
if (isObject(nav_menu) && getObjectCount(nav_menu) > 1) { if (isObject(nav_menu) && getObjectCount(nav_menu) > 1) {
// do we have more than one entry, if not, do not show (single page) // do we have more than one entry, if not, do not show (single page)

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

0
www/layout/admin/javascript/jquery.test.js Executable file → Normal file
View File

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/********************************************************************* /*********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2000/06/01 * CREATED: 2000/06/01
@@ -32,16 +33,22 @@
* *
* HISTORY: * HISTORY:
* 2010/12/21 (cs) merge back password change interface * 2010/12/21 (cs) merge back password change interface
* 2010/12/17 (cs) change that password can be blowfish encrypted, auto detects if other encryption is used (md5, std des) and tries to use them * 2010/12/17 (cs) change that password can be blowfish encrypted,
* auto detects if other encryption is used (md5, std des)
* and tries to use them
* 2007/05/29 (cs) BUG with assign query and visible sub arrays to pages * 2007/05/29 (cs) BUG with assign query and visible sub arrays to pages
* 2005/09/21 (cs) if error -> unset the session vars * 2005/09/21 (cs) if error -> unset the session vars
* 2005/07/04 (cs) add a function to write into the edit log file * 2005/07/04 (cs) add a function to write into the edit log file
* 2005/07/01 (cs) start adepting login class to new edit interface layout * 2005/07/01 (cs) start adepting login class to new edit interface layout
* 2005/03/31 (cs) fixed the class call with all debug vars * 2005/03/31 (cs) fixed the class call with all debug vars
* 2004/11/17 (cs) unused var cleanup * 2004/11/17 (cs) unused var cleanup
* 2004/11/16 (cs) rewrite login so it uses a template and not just plain html. prepare it, so it will be able to use external stuff later (some interface has to be designed for that * 2004/11/16 (cs) rewrite login so it uses a template and not just plain html.
* 2004/11/16 (cs) removed the mobile html part from login * 2004/09/30 (cs) layout fix * prepare it, so it will be able to use external stuff later
* 2003-11-11: if user has debug 1 unset memlimit, because there can be serious problems with the query logging * (some interface has to be designed for that
* 2004/11/16 (cs) removed the mobile html part from login
* 2004/09/30 (cs) layout fix
* 2003-11-11: if user has debug 1 unset memlimit, because there can be serious
* problems with the query logging
* 2003-06-12: added flag to PAGES array * 2003-06-12: added flag to PAGES array
* changed the get vars from GLOBALS to _POST * changed the get vars from GLOBALS to _POST
* changed the session registration. no more GLOBAL vars are registered * changed the session registration. no more GLOBAL vars are registered
@@ -57,72 +64,110 @@
* 2000-06-01: created basic idea and functions * 2000-06-01: created basic idea and functions
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
namespace CoreLibs\ACL; namespace CoreLibs\ACL;
use CoreLibs\Check\Password;
class Login extends \CoreLibs\DB\IO class Login extends \CoreLibs\DB\IO
{ {
/** @var string */
private $euid; // the user id var private $euid; // the user id var
private $permission_okay = false; // is set to one if login okay, or EUID is set and user is okay to access this page // is set to one if login okay, or EUID is set and user is okay to access this page
/** @var bool */
private $permission_okay = false;
/** @var string */
public $login; // pressed login public $login; // pressed login
/** @var string */
private $action; // master action command private $action; // master action command
/** @var string */
private $username; // login name private $username; // login name
/** @var string */
private $password; // login password private $password; // login password
/** @var string */
private $logout; // logout button private $logout; // logout button
private $login_error = 0; // login error code, can be matched to the array login_error_msg, which holds the string // login error code, can be matched to the array login_error_msg, which holds the string
/** @var int */
private $login_error = 0;
/** @var bool */
private $password_change = false; // if this is set to true, the user can change passwords private $password_change = false; // if this is set to true, the user can change passwords
/** @var bool */
private $password_change_ok = false; // password change was successful private $password_change_ok = false; // password change was successful
private $password_forgot = false; // can we reset password and mail to user with new password set screen // can we reset password and mail to user with new password set screen
/** @var bool */
private $password_forgot = false;
/** @var bool */
private $password_forgot_ok = false; // password forgot mail send ok private $password_forgot_ok = false; // password forgot mail send ok
/** @var string */
private $change_password; private $change_password;
/** @var string */
private $pw_username; private $pw_username;
/** @var string */
private $pw_old_password; private $pw_old_password;
/** @var string */
private $pw_new_password; private $pw_new_password;
/** @var string */
private $pw_new_password_confirm; private $pw_new_password_confirm;
private $pw_change_deny_users = array(); // array of users for which the password change is forbidden /** @var array<string> */
private $pw_change_deny_users = []; // array of users for which the password change is forbidden
/** @var string */
private $logout_target; private $logout_target;
/** @var int */
private $max_login_error_count = -1; private $max_login_error_count = -1;
private $lock_deny_users = array(); /** @var array<string> */
private $lock_deny_users = [];
// if we have password change we need to define some rules // if we have password change we need to define some rules
/** @var int */
private $password_min_length = PASSWORD_MIN_LENGTH; private $password_min_length = PASSWORD_MIN_LENGTH;
// max length is fixed as 255 (for input type max), if set highter, it will be set back to 255 // max length is fixed as 255 (for input type max), if set highter, it will be set back to 255
/** @var int */
private $password_max_length = PASSWORD_MAX_LENGTH; private $password_max_length = PASSWORD_MAX_LENGTH;
// can have several regexes, if nothing set, all is ok // can have several regexes, if nothing set, all is ok
private $password_valid_chars = array( /** @var array<string> */
private $password_valid_chars = [
// '^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$', // '^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$',
// '^(?.*(\pL)u)(?=.*(\pN)u)(?=.*([^\pL\pN])u).{8,}', // '^(?.*(\pL)u)(?=.*(\pN)u)(?=.*([^\pL\pN])u).{8,}',
); ];
// all possible login error conditions // all possible login error conditions
private $login_error_msg = array(); /** @var array<mixed> */
private $login_error_msg = [];
// this is an array holding all strings & templates passed from the outside (translation) // this is an array holding all strings & templates passed from the outside (translation)
private $login_template = array( /** @var array<mixed> */
'strings' => array(), private $login_template = [
'strings' => [],
'password_change' => '', 'password_change' => '',
'template' => '' 'template' => ''
); ];
// acl vars // acl vars
public $acl = array(); /** @var array<mixed> */
public $default_acl_list = array(); public $acl = [];
/** @var array<mixed> */
public $default_acl_list = [];
// login html, if we are on an ajax page // login html, if we are on an ajax page
/** @var string|null */
private $login_html = ''; private $login_html = '';
/** @var bool */
private $login_is_ajax_page = false; private $login_is_ajax_page = false;
// language // language
/** @var \CoreLibs\Language\L10n */
public $l; public $l;
/** /**
* constructor, does ALL, opens db, works through connection checks, closes itself * constructor, does ALL, opens db, works through connection checks, closes itself
* @param array $db_config db config array * @param array<mixed> $db_config db config array
*/ */
public function __construct(array $db_config) public function __construct(array $db_config)
{ {
// log login data for this class only
$this->log_per_class = 1;
// create db connection and init base class // create db connection and init base class
parent::__construct($db_config); parent::__construct($db_config);
// log login data for this class only
$this->log->setLogPer('class', true);
// set db special errors
if ($this->db_init_error === true) { if ($this->db_init_error === true) {
echo 'Could not connect to DB<br>'; echo 'Could not connect to DB<br>';
// if I can't connect to the DB to auth exit hard. No access allowed // if I can't connect to the DB to auth exit hard. No access allowed
@@ -159,8 +204,10 @@ class Login extends \CoreLibs\DB\IO
$this->l = new \CoreLibs\Language\L10n($lang); $this->l = new \CoreLibs\Language\L10n($lang);
// if we have a search path we need to set it, to use the correct DB to login // if we have a search path we need to set it, to use the correct DB to login
// check what schema to use. if there is a login schema use this, else check if there is a schema set in the config, or fall back to DB_SCHEMA if this exists, if this also does not exists use public schema // check what schema to use. if there is a login schema use this, else check
if (defined('LOGIN_DB_SCHEMA') && LOGIN_DB_SCHEMA) { // if there is a schema set in the config, or fall back to DB_SCHEMA
// if this exists, if this also does not exists use public schema
if (defined('LOGIN_DB_SCHEMA') && !empty(LOGIN_DB_SCHEMA)) {
$SCHEMA = LOGIN_DB_SCHEMA; $SCHEMA = LOGIN_DB_SCHEMA;
} elseif (isset($db_config['db_schema']) && $db_config['db_schema']) { } elseif (isset($db_config['db_schema']) && $db_config['db_schema']) {
$SCHEMA = $db_config['db_schema']; $SCHEMA = $db_config['db_schema'];
@@ -173,7 +220,8 @@ class Login extends \CoreLibs\DB\IO
if ($this->dbGetSchema() && $this->dbGetSchema() != $SCHEMA) { if ($this->dbGetSchema() && $this->dbGetSchema() != $SCHEMA) {
$this->dbExec("SET search_path TO " . $SCHEMA); $this->dbExec("SET search_path TO " . $SCHEMA);
} }
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0; // if there is none, there is none, saves me POST/GET check // if there is none, there is none, saves me POST/GET check
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0;
// get login vars, are so, can't be changed // get login vars, are so, can't be changed
// prepare // prepare
// pass on vars to Object vars // pass on vars to Object vars
@@ -190,7 +238,7 @@ class Login extends \CoreLibs\DB\IO
// logout target (from config) // logout target (from config)
$this->logout_target = LOGOUT_TARGET; $this->logout_target = LOGOUT_TARGET;
// disallow user list for password change // disallow user list for password change
$this->pw_change_deny_users = array('admin'); $this->pw_change_deny_users = ['admin'];
// set flag if password change is okay // set flag if password change is okay
if (defined('PASSWORD_CHANGE')) { if (defined('PASSWORD_CHANGE')) {
$this->password_change = PASSWORD_CHANGE; $this->password_change = PASSWORD_CHANGE;
@@ -202,18 +250,18 @@ class Login extends \CoreLibs\DB\IO
// max login counts before error reporting // max login counts before error reporting
$this->max_login_error_count = 10; $this->max_login_error_count = 10;
// users that never get locked, even if they are set strict // users that never get locked, even if they are set strict
$this->lock_deny_users = array('admin'); $this->lock_deny_users = ['admin'];
// init default ACL list array // init default ACL list array
$_SESSION['DEFAULT_ACL_LIST'] = array(); $_SESSION['DEFAULT_ACL_LIST'] = [];
// read the current edit_access_right list into an array // 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"; $q = "SELECT level, type, name FROM edit_access_right WHERE level >= 0 ORDER BY level";
while ($res = $this->dbReturn($q)) { while (is_array($res = $this->dbReturn($q))) {
// level to description format (numeric) // level to description format (numeric)
$this->default_acl_list[$res['level']] = array( $this->default_acl_list[$res['level']] = [
'type' => $res['type'], 'type' => $res['type'],
'name' => $res['name'] 'name' => $res['name']
); ];
} }
// write that into the session // write that into the session
$_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list; $_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list;
@@ -246,12 +294,13 @@ class Login extends \CoreLibs\DB\IO
// do something with possible debug data? // do something with possible debug data?
if (TARGET == 'live' || TARGET == 'remote') { if (TARGET == 'live' || TARGET == 'remote') {
// login // login
$this->debug_output_all = DEBUG ? 1 : 0; $this->log->setLogLevelAll('debug', DEBUG ? true : false);
$this->echo_output_all = 0; $this->log->setLogLevelAll('echo', false);
$this->print_output_all = DEBUG ? 1 : 0; $this->log->setLogLevelAll('print', DEBUG ? true : false);
} }
$status_msg = $this->printErrorMsg(); $status_msg = $this->log->printErrorMsg();
if ($this->echo_output_all) { // if ($this->echo_output_all) {
if ($this->log->getLogLevelAll('echo')) {
echo $status_msg; echo $status_msg;
} }
// exit so we don't process anything further, at all // exit so we don't process anything further, at all
@@ -259,8 +308,8 @@ class Login extends \CoreLibs\DB\IO
} else { } else {
// if we are on an ajax page reset any POST/GET array data to avoid // if we are on an ajax page reset any POST/GET array data to avoid
// any accidentical processing going on // any accidentical processing going on
$_POST = array(); $_POST = [];
$_GET = array(); $_GET = [];
// set the action to login so we can trigger special login html return // set the action to login so we can trigger special login html return
$_POST['action'] = 'login'; $_POST['action'] = 'login';
$_POST['login_html'] = $this->login_html; $_POST['login_html'] = $this->login_html;
@@ -299,32 +348,25 @@ class Login extends \CoreLibs\DB\IO
if (!$password) { if (!$password) {
$password = $this->password; $password = $this->password;
} }
if ((preg_match("/^\\$2(a|y)\\$/", $hash) && CRYPT_BLOWFISH != 1) || // first, errors on missing encryption
if (
(preg_match("/^\\$2(a|y)\\$/", $hash) && CRYPT_BLOWFISH != 1) ||
(preg_match("/^\\$1\\$/", $hash) && CRYPT_MD5 != 1) || (preg_match("/^\\$1\\$/", $hash) && CRYPT_MD5 != 1) ||
(preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash) && CRYPT_STD_DES != 1) (preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash) && CRYPT_STD_DES != 1)
) { ) {
// this means password cannot be decrypted because of missing crypt methods // this means password cannot be decrypted because of missing crypt methods
$this->login_error = 9999; $this->login_error = 9999;
$password_ok = false; $password_ok = false;
} elseif ((preg_match("/^\\$2(a)\\$/", $hash) || } elseif (
// old password have $07$ so we check this preg_match("/^\\$2y\\$/", $hash) &&
(preg_match("/^\\$2(y)\\$/", $hash) && preg_match("/\\$07\\$/", $hash)) || !Password::passwordVerify($password, $hash)
preg_match("/^\\$1\\$/", $hash) ||
preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash)) &&
/** @phan-suppress-next-line PhanDeprecatedFunction */
!$this->verifyCryptString($password, $hash)
) {
// check passwword as crypted, $2a$ or $2y$ is blowfish start, $1$ is MD5 start, $\w{12} is standard DES
// this is only for OLD $07$ password
$this->login_error = 1011;
$password_ok = false;
} elseif (preg_match("/^\\$2y\\$/", $hash) &&
!$this->passwordVerify($password, $hash)
) { ) {
// this is the new password hash methid, is only $2y$ // this is the new password hash methid, is only $2y$
// all others are not valid anymore
$this->login_error = 1013; $this->login_error = 1013;
$password_ok = false; $password_ok = false;
} elseif (!preg_match("/^\\$2(a|y)\\$/", $hash) && } elseif (
!preg_match("/^\\$2(a|y)\\$/", $hash) &&
!preg_match("/^\\$1\\$/", $hash) && !preg_match("/^\\$1\\$/", $hash) &&
!preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash) && !preg_match("/^\\$[0-9A-Za-z.]{12}$/", $hash) &&
$hash != $password $hash != $password
@@ -351,30 +393,40 @@ class Login extends \CoreLibs\DB\IO
$this->login_error = 102; $this->login_error = 102;
} else { } else {
// we have to get the themes in here too // we have to get the themes in here too
$q = "SELECT eu.edit_user_id, username, password, eu.edit_group_id, eg.name AS edit_group_name, admin, "; $q = "SELECT eu.edit_user_id, username, password, eu.edit_group_id, "
$q .= "eu.login_error_count, eu.login_error_date_last, eu.login_error_date_first, eu.strict, eu.locked, "; . "eg.name AS edit_group_name, admin, "
$q .= "debug, db_debug, "; . "eu.login_error_count, eu.login_error_date_last, "
$q .= "eareu.level AS user_level, eareu.type AS user_type, "; . "eu.login_error_date_first, eu.strict, eu.locked, "
$q .= "eareg.level AS group_level, eareg.type AS group_type, "; . "debug, db_debug, "
$q .= "eu.enabled, el.short_name AS lang_short, el.iso_name AS lang_iso, first.header_color AS first_header_color, "; . "eareu.level AS user_level, eareu.type AS user_type, "
$q .= "second.header_color AS second_header_color, second.template "; . "eareg.level AS group_level, eareg.type AS group_type, "
$q .= "FROM edit_user eu "; . "eu.enabled, el.short_name AS lang_short, el.iso_name AS lang_iso, "
$q .= "LEFT JOIN edit_scheme second ON (second.edit_scheme_id = eu.edit_scheme_id AND second.enabled = 1), "; . "first.header_color AS first_header_color, "
$q .= "edit_language el, edit_group eg, "; . "second.header_color AS second_header_color, second.template "
$q .= "edit_access_right eareu, "; . "FROM edit_user eu "
$q .= "edit_access_right eareg, "; . "LEFT JOIN edit_scheme second ON "
$q .= "edit_scheme first "; . "(second.edit_scheme_id = eu.edit_scheme_id AND second.enabled = 1), "
$q .= "WHERE first.edit_scheme_id = eg.edit_scheme_id AND eu.edit_group_id = eg.edit_group_id AND eu.edit_language_id = el.edit_language_id AND "; . "edit_language el, edit_group eg, "
$q .= "eu.edit_access_right_id = eareu.edit_access_right_id AND "; . "edit_access_right eareu, "
$q .= "eg.edit_access_right_id = eareg.edit_access_right_id AND "; . "edit_access_right eareg, "
. "edit_scheme first "
. "WHERE first.edit_scheme_id = eg.edit_scheme_id "
. "AND eu.edit_group_id = eg.edit_group_id "
. "AND eu.edit_language_id = el.edit_language_id AND "
. "eu.edit_access_right_id = eareu.edit_access_right_id AND "
. "eg.edit_access_right_id = eareg.edit_access_right_id AND "
// password match is done in script, against old plain or new blowfish encypted // password match is done in script, against old plain or new blowfish encypted
$q .= "(LOWER(username) = '".$this->dbEscapeString(strtolower($this->username))."') "; . "(LOWER(username) = '" . $this->dbEscapeString(strtolower($this->username)) . "') ";
$res = $this->dbReturn($q); $res = $this->dbReturn($q);
if (!is_array($res)) {
$this->login_error = 1009;
$this->permission_okay = false;
} elseif (!$this->cursor_ext[md5($q)]['num_rows']) {
// username is wrong, but we throw for wrong username and wrong password the same error // username is wrong, but we throw for wrong username and wrong password the same error
if (!$this->cursor_ext[md5($q)]['num_rows']) {
$this->login_error = 1010; $this->login_error = 1010;
} else { } else {
// if login errors is half of max errors and the last login error was less than 10s ago, forbid any new login try // if login errors is half of max errors and the last login error
// was less than 10s ago, forbid any new login try
// check flow // check flow
// - user is enabled // - user is enabled
@@ -393,10 +445,14 @@ class Login extends \CoreLibs\DB\IO
// none to be set, set in login password check // none to be set, set in login password check
} else { } else {
// check if the current password is an invalid hash and do a rehash and set password // check if the current password is an invalid hash and do a rehash and set password
// $this->debug('LOGIN', 'Hash: '.$res['password'].' -> VERIFY: '.($this->passwordVerify($this->password, $res['password']) ? 'OK' : 'FAIL').' => HASH: '.($this->passwordRehashCheck($res['password']) ? 'NEW NEEDED' : 'OK')); // $this->debug('LOGIN', 'Hash: '.$res['password'].' -> VERIFY: '
if ($this->passwordRehashCheck($res['password'])) { // .($Password::passwordVerify($this->password, $res['password']) ? 'OK' : 'FAIL')
// .' => HASH: '.(Password::passwordRehashCheck($res['password']) ? 'NEW NEEDED' : 'OK'));
if (Password::passwordRehashCheck($res['password'])) {
// update password hash to new one now // update password hash to new one now
$q = "UPDATE edit_user SET password = '".$this->dbEscapeString($this->passwordSet($this->password))."' WHERE edit_user_id = ".$res['edit_user_id']; $q = "UPDATE edit_user "
. "SET password = '" . $this->dbEscapeString(Password::passwordSet($this->password))
. "' WHERE edit_user_id = " . $res['edit_user_id'];
$this->dbExec($q); $this->dbExec($q);
} }
// normal user processing // normal user processing
@@ -404,7 +460,7 @@ class Login extends \CoreLibs\DB\IO
$_SESSION['EUID'] = $this->euid = $res['edit_user_id']; $_SESSION['EUID'] = $this->euid = $res['edit_user_id'];
// check if user is okay // check if user is okay
$this->loginCheckPermissions(); $this->loginCheckPermissions();
if (!$this->login_error) { if ($this->login_error == 0) {
// now set all session vars and read page permissions // now set all session vars and read page permissions
$GLOBALS['DEBUG_ALL'] = $_SESSION['DEBUG_ALL'] = $res['debug']; $GLOBALS['DEBUG_ALL'] = $_SESSION['DEBUG_ALL'] = $res['debug'];
$GLOBALS['DB_DEBUG'] = $_SESSION['DB_DEBUG'] = $res['db_debug']; $GLOBALS['DB_DEBUG'] = $_SESSION['DB_DEBUG'] = $res['db_debug'];
@@ -417,39 +473,48 @@ class Login extends \CoreLibs\DB\IO
$_SESSION['GROUP_ACL_TYPE'] = $res['group_type']; $_SESSION['GROUP_ACL_TYPE'] = $res['group_type'];
// deprecated TEMPLATE setting // deprecated TEMPLATE setting
$_SESSION['TEMPLATE'] = $res['template'] ? $res['template'] : ''; $_SESSION['TEMPLATE'] = $res['template'] ? $res['template'] : '';
$_SESSION['HEADER_COLOR'] = $res['second_header_color'] ? $res['second_header_color'] : $res['first_header_color']; $_SESSION['HEADER_COLOR'] = $res['second_header_color'] ?
$res['second_header_color'] :
$res['first_header_color'];
$_SESSION['LANG'] = $res['lang_short']; $_SESSION['LANG'] = $res['lang_short'];
$_SESSION['DEFAULT_CHARSET'] = $res['lang_iso']; $_SESSION['DEFAULT_CHARSET'] = $res['lang_iso'];
$_SESSION['DEFAULT_LANG'] = $res['lang_short'].'_'.strtolower(str_replace('-', '', $res['lang_iso'])); $_SESSION['DEFAULT_LANG'] = $res['lang_short'] . '_'
. strtolower(str_replace('-', '', $res['lang_iso']));
// reset any login error count for this user // reset any login error count for this user
if ($res['login_error_count'] > 0) { if ($res['login_error_count'] > 0) {
$q = "UPDATE edit_user "; $q = "UPDATE edit_user "
$q .= "SET login_error_count = 0, login_error_date_last = NULL, login_error_date_first = NULL "; . "SET login_error_count = 0, login_error_date_last = NULL, "
$q .= "WHERE edit_user_id = ".$res['edit_user_id']; . "login_error_date_first = NULL "
. "WHERE edit_user_id = " . $res['edit_user_id'];
$this->dbExec($q); $this->dbExec($q);
} }
$edit_page_ids = array(); $edit_page_ids = [];
$pages = array(); $pages = [];
$pages_acl = array(); $pages_acl = [];
// set pages access // set pages access
$q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, "; $q = "SELECT ep.edit_page_id, ep.cuid, epca.cuid AS content_alias_uid, "
$q .= "ep.hostname, ep.filename, ep.name AS edit_page_name, "; . "ep.hostname, ep.filename, ep.name AS edit_page_name, "
$q .= "ep.order_number AS edit_page_order, ep.menu, "; . "ep.order_number AS edit_page_order, ep.menu, "
$q .= "ep.popup, ep.popup_x, ep.popup_y, ep.online, ear.level, ear.type "; . "ep.popup, ep.popup_x, ep.popup_y, ep.online, ear.level, ear.type "
$q .= "FROM edit_page ep "; . "FROM edit_page ep "
$q .= "LEFT JOIN edit_page epca ON (epca.edit_page_id = ep.content_alias_edit_page_id)"; . "LEFT JOIN edit_page epca ON (epca.edit_page_id = ep.content_alias_edit_page_id)"
$q .= ", edit_page_access epa, edit_access_right ear "; . ", edit_page_access epa, edit_access_right ear "
$q .= "WHERE ep.edit_page_id = epa.edit_page_id AND ear.edit_access_right_id = epa.edit_access_right_id "; . "WHERE ep.edit_page_id = epa.edit_page_id "
$q .= "AND epa.enabled = 1 AND epa.edit_group_id = ".$res["edit_group_id"]." "; . "AND ear.edit_access_right_id = epa.edit_access_right_id "
$q .= "ORDER BY ep.order_number"; . "AND epa.enabled = 1 AND epa.edit_group_id = " . $res["edit_group_id"] . " "
. "ORDER BY ep.order_number";
while ($res = $this->dbReturn($q)) { while ($res = $this->dbReturn($q)) {
if (!is_array($res)) {
break;
}
// page id array for sub data readout // page id array for sub data readout
$edit_page_ids[$res['edit_page_id']] = $res['cuid']; $edit_page_ids[$res['edit_page_id']] = $res['cuid'];
// create the array for pages // create the array for pages
$pages[$res['cuid']] = array( $pages[$res['cuid']] = [
'edit_page_id' => $res['edit_page_id'], 'edit_page_id' => $res['edit_page_id'],
'cuid' => $res['cuid'], 'cuid' => $res['cuid'],
'content_alias_uid' => $res['content_alias_uid'], // for reference of content data on a differen page // for reference of content data on a differen page
'content_alias_uid' => $res['content_alias_uid'],
'hostname' => $res['hostname'], 'hostname' => $res['hostname'],
'filename' => $res['filename'], 'filename' => $res['filename'],
'page_name' => $res['edit_page_name'], 'page_name' => $res['edit_page_name'],
@@ -461,42 +526,42 @@ class Login extends \CoreLibs\DB\IO
'online' => $res['online'], 'online' => $res['online'],
'acl_level' => $res['level'], 'acl_level' => $res['level'],
'acl_type' => $res['type'], 'acl_type' => $res['type'],
'query' => array(), 'query' => [],
'visible' => array() 'visible' => []
); ];
// make reference filename -> level // make reference filename -> level
$pages_acl[$res['filename']] = $res['level']; $pages_acl[$res['filename']] = $res['level'];
} // for each page } // for each page
// get the visible groups for all pages and write them to the pages // get the visible groups for all pages and write them to the pages
$_edit_page_id = 0; $q = "SELECT epvg.edit_page_id, name, flag "
$q = "SELECT epvg.edit_page_id, name, flag "; . "FROM edit_visible_group evp, edit_page_visible_group epvg "
$q .= "FROM edit_visible_group evp, edit_page_visible_group epvg "; . "WHERE evp.edit_visible_group_id = epvg.edit_visible_group_id "
$q .= "WHERE evp.edit_visible_group_id = epvg.edit_visible_group_id AND epvg.edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") "; . "AND epvg.edit_page_id IN (" . join(', ', array_keys($edit_page_ids)) . ") "
$q .= "ORDER BY epvg.edit_page_id"; . "ORDER BY epvg.edit_page_id";
while ($res = $this->dbReturn($q)) { while (is_array($res = $this->dbReturn($q))) {
$pages[$edit_page_ids[$res['edit_page_id']]]['visible'][$res['name']] = $res['flag']; $pages[$edit_page_ids[$res['edit_page_id']]]['visible'][$res['name']] = $res['flag'];
} }
// get the same for the query strings // get the same for the query strings
$_edit_page_id = 0; $q = "SELECT eqs.edit_page_id, name, value, dynamic FROM edit_query_string eqs "
$q = "SELECT eqs.edit_page_id, name, value, dynamic FROM edit_query_string eqs "; . "WHERE enabled = 1 AND edit_page_id "
$q .= "WHERE enabled = 1 AND edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") "; . "IN (" . join(', ', array_keys($edit_page_ids)) . ") "
$q .= "ORDER BY eqs.edit_page_id"; . "ORDER BY eqs.edit_page_id";
while ($res = $this->dbReturn($q)) { while (is_array($res = $this->dbReturn($q))) {
$pages[$edit_page_ids[$res['edit_page_id']]]['query'][] = array( $pages[$edit_page_ids[$res['edit_page_id']]]['query'][] = [
'name' => $res['name'], 'name' => $res['name'],
'value' => $res['value'], 'value' => $res['value'],
'dynamic' => $res['dynamic'] 'dynamic' => $res['dynamic']
); ];
} }
// get the page content and add them to the page // get the page content and add them to the page
$_edit_page_id = 0; $q = "SELECT epc.edit_page_id, epc.name, epc.uid, epc.order_number, "
$q = "SELECT epc.edit_page_id, epc.name, epc.uid, epc.order_number, epc.online, ear.level, ear.type "; . "epc.online, ear.level, ear.type "
$q .= "FROM edit_page_content epc, edit_access_right ear "; . "FROM edit_page_content epc, edit_access_right ear "
$q .= "WHERE epc.edit_access_right_id = ear.edit_access_right_id AND "; . "WHERE epc.edit_access_right_id = ear.edit_access_right_id AND "
$q .= "epc.edit_page_id IN (".join(', ', array_keys($edit_page_ids)).") "; . "epc.edit_page_id IN (" . join(', ', array_keys($edit_page_ids)) . ") "
$q .= "ORDER BY epc.order_number"; . "ORDER BY epc.order_number";
while ($res = $this->dbReturn($q)) { while (is_array($res = $this->dbReturn($q))) {
$pages[$edit_page_ids[$res['edit_page_id']]]['content'][$res['uid']] = array( $pages[$edit_page_ids[$res['edit_page_id']]]['content'][$res['uid']] = [
'name' => $res['name'], 'name' => $res['name'],
'uid' => $res['uid'], 'uid' => $res['uid'],
'online' => $res['online'], 'online' => $res['online'],
@@ -504,29 +569,32 @@ class Login extends \CoreLibs\DB\IO
// access name and level // access name and level
'acl_type' => $res['type'], 'acl_type' => $res['type'],
'acl_level' => $res['level'] 'acl_level' => $res['level']
); ];
} }
// write back the pages data to the output array // write back the pages data to the output array
$_SESSION['PAGES'] = $pages; $_SESSION['PAGES'] = $pages;
$_SESSION['PAGES_ACL_LEVEL'] = $pages_acl; $_SESSION['PAGES_ACL_LEVEL'] = $pages_acl;
// load the edit_access user rights // load the edit_access user rights
$q = "SELECT ea.edit_access_id, level, type, ea.name, ea.color, ea.uid, edit_default "; $q = "SELECT ea.edit_access_id, level, type, ea.name, ea.color, ea.uid, edit_default "
$q .= "FROM edit_access_user eau, edit_access_right ear, edit_access ea "; . "FROM edit_access_user eau, edit_access_right ear, edit_access ea "
$q .= "WHERE eau.edit_access_id = ea.edit_access_id AND eau.edit_access_right_id = ear.edit_access_right_id "; . "WHERE eau.edit_access_id = ea.edit_access_id "
$q .= "AND eau.enabled = 1 AND edit_user_id = ".$this->euid." "; . "AND eau.edit_access_right_id = ear.edit_access_right_id "
$q .= "ORDER BY ea.name"; . "AND eau.enabled = 1 AND edit_user_id = " . $this->euid . " "
$unit_access = array(); . "ORDER BY ea.name";
$eauid = array(); $unit_access = [];
$unit_acl = array(); $eauid = [];
while ($res = $this->dbReturn($q)) { $unit_acl = [];
while (is_array($res = $this->dbReturn($q))) {
// read edit access data fields and drop them into the unit access array // read edit access data fields and drop them into the unit access array
$q_sub ="SELECT name, value FROM edit_access_data WHERE enabled = 1 AND edit_access_id = ".$res['edit_access_id']; $q_sub = "SELECT name, value "
$ea_data = array(); . "FROM edit_access_data "
while ($res_sub = $this->dbReturn($q_sub)) { . "WHERE enabled = 1 AND edit_access_id = " . $res['edit_access_id'];
$ea_data = [];
while (is_array($res_sub = $this->dbReturn($q_sub))) {
$ea_data[$res_sub['name']] = $res_sub['value']; $ea_data[$res_sub['name']] = $res_sub['value'];
} }
// build master unit array // build master unit array
$unit_access[$res['edit_access_id']] = array( $unit_access[$res['edit_access_id']] = [
'id' => $res['edit_access_id'], 'id' => $res['edit_access_id'],
'acl_level' => $res['level'], 'acl_level' => $res['level'],
'acl_type' => $res['type'], 'acl_type' => $res['type'],
@@ -535,7 +603,7 @@ class Login extends \CoreLibs\DB\IO
'color' => $res['color'], 'color' => $res['color'],
'default' => $res['edit_default'], 'default' => $res['edit_default'],
'data' => $ea_data 'data' => $ea_data
); ];
// set the default unit // set the default unit
if ($res['edit_default']) { if ($res['edit_default']) {
$_SESSION['UNIT_DEFAULT'] = $res['edit_access_id']; $_SESSION['UNIT_DEFAULT'] = $res['edit_access_id'];
@@ -549,18 +617,20 @@ class Login extends \CoreLibs\DB\IO
$_SESSION['EAID'] = $eauid; $_SESSION['EAID'] = $eauid;
} // user has permission to THIS page } // user has permission to THIS page
} // user was not enabled or other login error } // user was not enabled or other login error
if ($this->login_error) { if ($this->login_error && is_array($res)) {
$login_error_date_first = ''; $login_error_date_first = '';
if ($res['login_error_count'] == 0) { if ($res['login_error_count'] == 0) {
$login_error_date_first = ", login_error_date_first = NOW()"; $login_error_date_first = ", login_error_date_first = NOW()";
} }
// update login error count for this user // update login error count for this user
$q = "UPDATE edit_user "; $q = "UPDATE edit_user "
$q .= "SET login_error_count = login_error_count + 1, login_error_date_last = NOW() ".$login_error_date_first." "; . "SET login_error_count = login_error_count + 1, "
$q .= "WHERE edit_user_id = ".$res['edit_user_id']; . "login_error_date_last = NOW() " . $login_error_date_first . " "
. "WHERE edit_user_id = " . $res['edit_user_id'];
$this->dbExec($q); $this->dbExec($q);
// totally lock the user if error max is reached // totally lock the user if error max is reached
if ($this->max_login_error_count != -1 && if (
$this->max_login_error_count != -1 &&
$res['login_error_count'] + 1 > $this->max_login_error_count $res['login_error_count'] + 1 > $this->max_login_error_count
) { ) {
// do some alert reporting in case this error is too big // do some alert reporting in case this error is too big
@@ -588,14 +658,28 @@ class Login extends \CoreLibs\DB\IO
public function loginCheckPermissions(): bool public function loginCheckPermissions(): bool
{ {
if ($this->euid && $this->login_error != 103) { if ($this->euid && $this->login_error != 103) {
$q = "SELECT filename "; $q = "SELECT filename "
$q .= "FROM edit_page ep, edit_page_access epa, edit_group eg, edit_user eu "; . "FROM edit_page ep, edit_page_access epa, edit_group eg, edit_user eu "
$q .= "WHERE ep.edit_page_id = epa.edit_page_id AND eg.edit_group_id = epa.edit_group_id AND eg.edit_group_id = eu.edit_group_id "; . "WHERE ep.edit_page_id = epa.edit_page_id "
$q .= "AND eu.edit_user_id = ".$this->euid." AND filename = '".$this->page_name."' AND eg.enabled = 1 AND epa.enabled = 1"; . "AND eg.edit_group_id = epa.edit_group_id "
. "AND eg.edit_group_id = eu.edit_group_id "
. "AND eu.edit_user_id = " . $this->euid . " "
. "AND filename = '" . $this->page_name . "' "
. "AND eg.enabled = 1 AND epa.enabled = 1";
$res = $this->dbReturnRow($q); $res = $this->dbReturnRow($q);
if (!is_array($res)) {
$this->login_error = 109;
$this->permission_okay = false;
return $this->permission_okay;
}
// unset mem limit if debug is set to 1 // unset mem limit if debug is set to 1
// if (($GLOBALS["DEBUG_ALL"] || $GLOBALS["DB_DEBUG"] || $_SESSION["DEBUG_ALL"] || $_SESSION["DB_DEBUG"]) && ini_get('memory_limit') != -1) // if (
// ini_set('memory_limit', -1); // ($GLOBALS["DEBUG_ALL"] || $GLOBALS["DB_DEBUG"] ||
// $_SESSION["DEBUG_ALL"] || $_SESSION["DB_DEBUG"]) &&
// ini_get('memory_limit') != -1
// ) {
// ini_set('memory_limit', '-1');
// }
if (isset($res['filename']) && $res['filename'] == $this->page_name) { if (isset($res['filename']) && $res['filename'] == $this->page_name) {
$this->permission_okay = true; $this->permission_okay = true;
} else { } else {
@@ -636,24 +720,6 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// METHOD: loginSetAcl
// WAS : login_set_acl
// PARAMS: none
// RETURN: none
// DESC : sets all the basic ACLs
// init set the basic acl the user has, based on the following rules
// * init set from config DEFAULT ACL
// * if page ACL is set, it overrides the default ACL
// * if group ACL is set, it overrides the page ACL
// * if user ACL is set, it overrides the group ACL
// set the page ACL
// * default ACL set
// * set group ACL if not default overrides default ACL
// * set page ACL if not default overrides group ACL
// set edit access ACL and set default edit access group
// * if an account ACL is set, set this parallel, account ACL overrides user ACL if it applies
// * if edit access ACL level is set, use this, else use page
// set all base ACL levels as a list keyword -> ACL number
/** /**
* sets all the basic ACLs * sets all the basic ACLs
* init set the basic acl the user has, based on the following rules * init set the basic acl the user has, based on the following rules
@@ -712,7 +778,10 @@ class Login extends \CoreLibs\DB\IO
if ($_SESSION['GROUP_ACL_LEVEL'] != -1) { if ($_SESSION['GROUP_ACL_LEVEL'] != -1) {
$this->acl['page'] = $_SESSION['GROUP_ACL_LEVEL']; $this->acl['page'] = $_SESSION['GROUP_ACL_LEVEL'];
} }
if (isset($_SESSION['PAGES_ACL_LEVEL'][$this->page_name]) && $_SESSION['PAGES_ACL_LEVEL'][$this->page_name] != -1) { if (
isset($_SESSION['PAGES_ACL_LEVEL'][$this->page_name]) &&
$_SESSION['PAGES_ACL_LEVEL'][$this->page_name] != -1
) {
$this->acl['page'] = $_SESSION['PAGES_ACL_LEVEL'][$this->page_name]; $this->acl['page'] = $_SESSION['PAGES_ACL_LEVEL'][$this->page_name];
} }
@@ -729,13 +798,13 @@ class Login extends \CoreLibs\DB\IO
} }
} }
// detail name/level set // detail name/level set
$this->acl['unit_detail'][$ea_id] = array( $this->acl['unit_detail'][$ea_id] = [
'name' => $unit['name'], 'name' => $unit['name'],
'uid' => $unit['uid'], 'uid' => $unit['uid'],
'level' => $this->default_acl_list[$this->acl['unit'][$ea_id]]['name'], 'level' => $this->default_acl_list[$this->acl['unit'][$ea_id]]['name'],
'default' => $unit['default'], 'default' => $unit['default'],
'data' => $unit['data'] 'data' => $unit['data']
); ];
// set default // set default
if ($unit['default']) { if ($unit['default']) {
$this->acl['unit_id'] = $unit['id']; $this->acl['unit_id'] = $unit['id'];
@@ -765,10 +834,14 @@ class Login extends \CoreLibs\DB\IO
/** /**
* checks if this edit access id is valid * checks if this edit access id is valid
* @param int|null $edit_access_id access id pk to check * @param int|null $edit_access_id access id pk to check
* @return bool true/false: if the edit access is not in the valid list: false * @return bool true/false: if the edit access is not
* in the valid list: false
*/ */
public function loginCheckEditAccess($edit_access_id): bool public function loginCheckEditAccess($edit_access_id): bool
{ {
if ($edit_access_id === null) {
return false;
}
if (array_key_exists($edit_access_id, $this->acl['unit'])) { if (array_key_exists($edit_access_id, $this->acl['unit'])) {
return true; return true;
} else { } else {
@@ -845,7 +918,10 @@ class Login extends \CoreLibs\DB\IO
} }
// check user exist, if not -> error // check user exist, if not -> error
if (!$this->login_error) { if (!$this->login_error) {
$q = "SELECT edit_user_id FROM edit_user WHERE enabled = 1 AND username = '".$this->dbEscapeString($this->pw_username)."'"; $q = "SELECT edit_user_id "
. "FROM edit_user "
. "WHERE enabled = 1 "
. "AND username = '" . $this->dbEscapeString($this->pw_username) . "'";
list ($edit_user_id) = $this->dbReturnRow($q); list ($edit_user_id) = $this->dbReturnRow($q);
if (!$edit_user_id) { if (!$edit_user_id) {
// username wrong // username wrong
@@ -855,7 +931,10 @@ class Login extends \CoreLibs\DB\IO
} }
// check old passwords match -> error // check old passwords match -> error
if (!$this->login_error) { if (!$this->login_error) {
$q = "SELECT edit_user_id, password FROM edit_user WHERE enabled = 1 AND username = '".$this->dbEscapeString($this->pw_username)."'"; $q = "SELECT edit_user_id, password "
. "FROM edit_user "
. "WHERE enabled = 1 "
. "AND username = '" . $this->dbEscapeString($this->pw_username) . "'";
list ($edit_user_id, $old_password_hash) = $this->dbReturnRow($q); list ($edit_user_id, $old_password_hash) = $this->dbReturnRow($q);
if (!$edit_user_id || !$this->loginPasswordCheck($old_password_hash, $this->pw_old_password)) { if (!$edit_user_id || !$this->loginPasswordCheck($old_password_hash, $this->pw_old_password)) {
// old password wrong // old password wrong
@@ -887,7 +966,10 @@ class Login extends \CoreLibs\DB\IO
// no error change this users password // no error change this users password
if (!$this->login_error && $edit_user_id) { if (!$this->login_error && $edit_user_id) {
// update the user (edit_user_id) with the new password // update the user (edit_user_id) with the new password
$q = "UPDATE edit_user SET password = '".$this->dbEscapeString($this->passwordSet($this->pw_new_password))."' WHERE edit_user_id = ".$edit_user_id; $q = "UPDATE edit_user "
. "SET password = "
. "'" . $this->dbEscapeString(Password::passwordSet($this->pw_new_password)) . "' "
. "WHERE edit_user_id = " . $edit_user_id;
$this->dbExec($q); $this->dbExec($q);
$data = 'Password change for user "' . $this->pw_username . '"'; $data = 'Password change for user "' . $this->pw_username . '"';
$this->password_change_ok = true; $this->password_change_ok = true;
@@ -904,7 +986,7 @@ class Login extends \CoreLibs\DB\IO
/** /**
* prints out login html part if no permission (error) is set * prints out login html part if no permission (error) is set
* @return ?string html data for login page, or null for nothing * @return string|null html data for login page, or null for nothing
*/ */
private function loginPrintLogin() private function loginPrintLogin()
{ {
@@ -919,7 +1001,7 @@ class Login extends \CoreLibs\DB\IO
$LOGOUT_TARGET = ""; $LOGOUT_TARGET = "";
} }
$html_string = $this->login_template['template']; $html_string = (string)$this->login_template['template'];
// if password change is okay // if password change is okay
if ($this->password_change) { if ($this->password_change) {
@@ -928,36 +1010,69 @@ class Login extends \CoreLibs\DB\IO
// pre change the data in the PASSWORD_CHANGE_DIV first // pre change the data in the PASSWORD_CHANGE_DIV first
foreach ($this->login_template['strings'] as $string => $data) { foreach ($this->login_template['strings'] as $string => $data) {
if ($data) { if ($data) {
$html_string_password_change = str_replace('{'.$string.'}', $data, $html_string_password_change); $html_string_password_change = str_replace(
'{' . $string . '}',
$data,
$html_string_password_change
);
} }
} }
// print error messagae // print error messagae
if ($this->login_error) { if ($this->login_error) {
$html_string_password_change = str_replace('{ERROR_MSG}', $this->login_error_msg[$this->login_error].'<br>', $html_string_password_change); $html_string_password_change = str_replace(
'{ERROR_MSG}',
$this->login_error_msg[$this->login_error] . '<br>',
$html_string_password_change
);
} else { } else {
$html_string_password_change = str_replace('{ERROR_MSG}', '<br>', $html_string_password_change); $html_string_password_change = str_replace(
'{ERROR_MSG}',
'<br>',
$html_string_password_change
);
} }
// if pw change action, show the float again // if pw change action, show the float again
if ($this->change_password && !$this->password_change_ok) { if ($this->change_password && !$this->password_change_ok) {
$html_string_password_change = str_replace('{PASSWORD_CHANGE_SHOW}', '<script language="JavaScript">ShowHideDiv(\'pw_change_div\');</script>', $html_string_password_change); $html_string_password_change = str_replace(
'{PASSWORD_CHANGE_SHOW}',
'<script language="JavaScript">'
. 'ShowHideDiv(\'pw_change_div\');</script>',
$html_string_password_change
);
} else { } else {
$html_string_password_change = str_replace('{PASSWORD_CHANGE_SHOW}', '', $html_string_password_change); $html_string_password_change = str_replace(
'{PASSWORD_CHANGE_SHOW}',
'',
$html_string_password_change
);
} }
$this->login_template['strings']['PASSWORD_CHANGE_DIV'] = $html_string_password_change; $this->login_template['strings']['PASSWORD_CHANGE_DIV'] = $html_string_password_change;
} }
// put in the logout redirect string // put in the logout redirect string
if ($this->logout && $LOGOUT_TARGET) { if ($this->logout && $LOGOUT_TARGET) {
$html_string = str_replace('{LOGOUT_TARGET}', '<meta http-equiv="refresh" content="0; URL='.$LOGOUT_TARGET.'">', $html_string); $html_string = str_replace(
'{LOGOUT_TARGET}',
'<meta http-equiv="refresh" content="0; URL=' . $LOGOUT_TARGET . '">',
$html_string
);
} else { } else {
$html_string = str_replace('{LOGOUT_TARGET}', '', $html_string); $html_string = str_replace('{LOGOUT_TARGET}', '', $html_string);
} }
// print error messagae // print error messagae
if ($this->login_error) { if ($this->login_error) {
$html_string = str_replace('{ERROR_MSG}', $this->login_error_msg[$this->login_error].'<br>', $html_string); $html_string = str_replace(
'{ERROR_MSG}',
$this->login_error_msg[$this->login_error] . '<br>',
$html_string
);
} elseif ($this->password_change_ok && $this->password_change) { } elseif ($this->password_change_ok && $this->password_change) {
$html_string = str_replace('{ERROR_MSG}', $this->login_error_msg[300].'<br>', $html_string); $html_string = str_replace(
'{ERROR_MSG}',
$this->login_error_msg[300] . '<br>',
$html_string
);
} else { } else {
$html_string = str_replace('{ERROR_MSG}', '<br>', $html_string); $html_string = str_replace('{ERROR_MSG}', '<br>', $html_string);
} }
@@ -1013,7 +1128,7 @@ class Login extends \CoreLibs\DB\IO
*/ */
private function loginSetTemplates(): void private function loginSetTemplates(): void
{ {
$strings = array( $strings = [
'HTML_TITLE' => $this->l->__('LOGIN'), 'HTML_TITLE' => $this->l->__('LOGIN'),
'TITLE' => $this->l->__('LOGIN'), 'TITLE' => $this->l->__('LOGIN'),
'USERNAME' => $this->l->__('Username'), 'USERNAME' => $this->l->__('Username'),
@@ -1022,63 +1137,89 @@ class Login extends \CoreLibs\DB\IO
'ERROR_MSG' => '', 'ERROR_MSG' => '',
'LOGOUT_TARGET' => '', 'LOGOUT_TARGET' => '',
'PASSWORD_CHANGE_BUTTON_VALUE' => $this->l->__('Change Password') 'PASSWORD_CHANGE_BUTTON_VALUE' => $this->l->__('Change Password')
); ];
$error_msgs = array( $error_msgs = [
'100' => $this->l->__('Fatal Error: <b>[EUID] came in as GET/POST!</b>'), // actually obsolete // actually obsolete
'1010' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'), // user not found '100' => $this->l->__('Fatal Error: <b>[EUID] came in as GET/POST!</b>'),
'1011' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'), // blowfish password wrong // query errors
'1012' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'), // fallback md5 password wrong '1009' => $this->l->__('Fatal Error: <b>Login query reading failed<b>'),
'1013' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'), // new password_hash wrong // user not found
'1010' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'),
// blowfish password wrong
'1011' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'),
// fallback md5 password wrong
'1012' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'),
// new password_hash wrong
'1013' => $this->l->__('Fatal Error: <b>Login Failed - Wrong Username or Password</b>'),
'102' => $this->l->__('Fatal Error: <b>Login Failed - Please enter username and password</b>'), '102' => $this->l->__('Fatal Error: <b>Login Failed - Please enter username and password</b>'),
'103' => $this->l->__('Fatal Error: <b>You do not have the rights to access this Page</b>'), '103' => $this->l->__('Fatal Error: <b>You do not have the rights to access this Page</b>'),
'104' => $this->l->__('Fatal Error: <b>Login Failed - User not enabled</b>'), '104' => $this->l->__('Fatal Error: <b>Login Failed - User not enabled</b>'),
'105' => $this->l->__('Fatal Error: <b>Login Failed - User is locked</b>'), '105' => $this->l->__('Fatal Error: <b>Login Failed - User is locked</b>'),
'220' => $this->l->__('Fatal Error: <b>Password change - The user could not be found</b>'), // actually this is an illegal user, but I mask it '109' => $this->l->__('Fatal Error: <b>Check permission query reading failed</b>'),
// actually this is an illegal user, but I mask it
'220' => $this->l->__('Fatal Error: <b>Password change - The user could not be found</b>'),
'200' => $this->l->__('Fatal Error: <b>Password change - Please enter username and old password</b>'), '200' => $this->l->__('Fatal Error: <b>Password change - Please enter username and old password</b>'),
'201' => $this->l->__('Fatal Error: <b>Password change - The user could not be found</b>'), '201' => $this->l->__('Fatal Error: <b>Password change - The user could not be found</b>'),
'202' => $this->l->__('Fatal Error: <b>Password change - The old password is not correct</b>'), '202' => $this->l->__('Fatal Error: <b>Password change - The old password is not correct</b>'),
'203' => $this->l->__('Fatal Error: <b>Password change - Please fill out both new password fields</b>'), '203' => $this->l->__('Fatal Error: <b>Password change - Please fill out both new password fields</b>'),
'204' => $this->l->__('Fatal Error: <b>Password change - The new passwords do not match</b>'), '204' => $this->l->__('Fatal Error: <b>Password change - The new passwords do not match</b>'),
'205' => $this->l->__('Fatal Error: <b>Password change - The new password is not in a valid format</b>'), // we should also not here WHAT is valid // we should also not here WHAT is valid
'300' => $this->l->__('Success: <b>Password change successful</b>'), // for OK password change '205' => $this->l->__('Fatal Error: <b>Password change - The new password is not in a valid format</b>'),
'9999' => $this->l->__('Fatal Error: <b>necessary crypt engine could not be found</b>. Login is impossible') // this is bad bad error // for OK password change
); '300' => $this->l->__('Success: <b>Password change successful</b>'),
// this is bad bad error
'9999' => $this->l->__('Fatal Error: <b>necessary crypt engine could not be found</b>. '
. 'Login is impossible'),
];
// if password change is okay // if password change is okay
if ($this->password_change) { if ($this->password_change) {
$strings = array_merge($strings, array( $strings = array_merge($strings, [
'TITLE_PASSWORD_CHANGE' => 'Change Password for User', 'TITLE_PASSWORD_CHANGE' => 'Change Password for User',
'OLD_PASSWORD' => $this->l->__('Old Password'), 'OLD_PASSWORD' => $this->l->__('Old Password'),
'NEW_PASSWORD' => $this->l->__('New Password'), 'NEW_PASSWORD' => $this->l->__('New Password'),
'NEW_PASSWORD_CONFIRM' => $this->l->__('New Password confirm'), 'NEW_PASSWORD_CONFIRM' => $this->l->__('New Password confirm'),
'CLOSE' => $this->l->__('Close'), 'CLOSE' => $this->l->__('Close'),
'JS_SHOW_HIDE' => "function ShowHideDiv(id) { element = document.getElementById(id); if (element.className == 'visible' || !element.className) element.className = 'hidden'; else element.className = 'visible'; }", 'JS_SHOW_HIDE' => "function ShowHideDiv(id) { "
'PASSWORD_CHANGE_BUTTON' => '<input type="button" name="pw_change" value="'.$strings['PASSWORD_CHANGE_BUTTON_VALUE'].'" OnClick="ShowHideDiv(\'pw_change_div\');">' . "element = document.getElementById(id); "
)); . "if (element.className == 'visible' || !element.className) element.className = 'hidden'; "
. "else element.className = 'visible'; }",
'PASSWORD_CHANGE_BUTTON' => '<input type="button" name="pw_change" value="'
. $strings['PASSWORD_CHANGE_BUTTON_VALUE']
. '" OnClick="ShowHideDiv(\'pw_change_div\');">'
]);
// NOTE: for the HTML block I ignore line lengths
// phpcs:disable
$this->login_template['password_change'] = <<<EOM $this->login_template['password_change'] = <<<EOM
<div id="pw_change_div" class="hidden" style="position: absolute; top: 30px; left: 50px; width: 400px; height: 220px; background-color: white; border: 1px solid black; padding: 25px;"> <div id="pw_change_div" class="hidden" style="position: absolute; top: 30px; left: 50px; width: 400px; height: 220px; background-color: white; border: 1px solid black; padding: 25px;">
<table> <table>
<tr><td class="norm" align="center" colspan="2"><h3>{TITLE_PASSWORD_CHANGE}</h3></td></tr> <tr><td class="norm" align="center" colspan="2"><h3>{TITLE_PASSWORD_CHANGE}</h3></td></tr>
<tr><td class="norm" colspan="2">{ERROR_MSG}</td></tr> <tr><td class="norm" colspan="2">{ERROR_MSG}</td></tr>
<tr><td class="norm" align="right">{USERNAME}</td><td><input type="text" name="pw_username" value=""></td></tr> <tr><td class="norm" align="right">{USERNAME}</td><td><input type="text" name="pw_username" value=""></td></tr>
<tr><td class="norm" align="right">{OLD_PASSWORD}</td><td><input type="password" name="pw_old_password" value=""></td></tr> <tr><td class="norm" align="right">{OLD_PASSWORD}</td>
<tr><td class="norm" align="right">{NEW_PASSWORD}</td><td><input type="password" name="pw_new_password" value=""></td></tr> <td><input type="password" name="pw_old_password" value=""></td></tr>
<tr><td class="norm" align="right">{NEW_PASSWORD_CONFIRM}</td><td><input type="password" name="pw_new_password_confirm" value=""></td></tr> <tr><td class="norm" align="right">{NEW_PASSWORD}</td>
<tr><td></td><td><input type="submit" name="change_password" value="{PASSWORD_CHANGE_BUTTON_VALUE}"><input type="button" name="pw_change" value="{CLOSE}" OnClick="ShowHideDiv('pw_change_div');"></td></tr> <td><input type="password" name="pw_new_password" value=""></td></tr>
<tr><td class="norm" align="right">{NEW_PASSWORD_CONFIRM}</td>
<td><input type="password" name="pw_new_password_confirm" value=""></td></tr>
<tr><td></td>
<td><input type="submit" name="change_password" value="{PASSWORD_CHANGE_BUTTON_VALUE}">
<input type="button" name="pw_change" value="{CLOSE}" OnClick="ShowHideDiv('pw_change_div');"></td></tr>
</table> </table>
</div> </div>
{PASSWORD_CHANGE_SHOW} {PASSWORD_CHANGE_SHOW}
EOM; EOM;
// phpcs:enable
} }
if ($this->password_forgot) { if ($this->password_forgot) {
} }
if (!$this->password_change && !$this->password_forgot) { if (!$this->password_change && !$this->password_forgot) {
$strings = array_merge($strings, array( $strings = array_merge($strings, [
'JS_SHOW_HIDE' => '', 'JS_SHOW_HIDE' => '',
'PASSWORD_CHANGE_BUTTON' => '', 'PASSWORD_CHANGE_BUTTON' => '',
'PASSWORD_CHANGE_DIV' => '' 'PASSWORD_CHANGE_DIV' => ''
)); ]);
} }
// first check if all strings are set from outside, if not, set with default ones // first check if all strings are set from outside, if not, set with default ones
@@ -1179,24 +1320,34 @@ EOM;
} else { } else {
$this->action = ''; $this->action = '';
} }
$_data_binary = array( $_data_binary = [
'_SESSION' => $_SESSION, '_SESSION' => $_SESSION,
'_GET' => $_GET, '_GET' => $_GET,
'_POST' => $_POST, '_POST' => $_POST,
'_FILES' => $_FILES, '_FILES' => $_FILES,
'error' => $this->login_error 'error' => $this->login_error
); ];
$data_binary = $this->dbEscapeBytea(bzcompress(serialize($_data_binary))); $data_binary = $this->dbEscapeBytea((string)bzcompress(serialize($_data_binary)));
// SQL querie for log entry // SQL querie for log entry
$q = "INSERT INTO edit_log "; $q = "INSERT INTO edit_log "
$q .= "(username, password, euid, event_date, event, error, data, data_binary, page, "; . "(username, password, euid, event_date, event, error, data, data_binary, page, "
$q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, "; . "ip, user_agent, referer, script_name, query_string, server_name, http_host, "
$q .= "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, "
$q .= "VALUES ('".$this->dbEscapeString($username)."', 'PASSWORD', ".($this->euid ? $this->euid : 'NULL').", "; . "action, action_id, action_yes, action_flag, action_menu, action_loaded, "
$q .= "NOW(), '".$this->dbEscapeString($event)."', '".$this->dbEscapeString((string)$error)."', '".$this->dbEscapeString($data)."', '".$data_binary."', '".$this->page_name."', "; . "action_value, action_error) "
foreach (array( . "VALUES ('" . $this->dbEscapeString($username) . "', 'PASSWORD', "
'REMOTE_ADDR', 'HTTP_USER_AGENT', 'HTTP_REFERER', 'SCRIPT_FILENAME', 'QUERY_STRING', 'SERVER_NAME', 'HTTP_HOST', 'HTTP_ACCEPT', 'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_ENCODING' . ($this->euid ? $this->euid : 'NULL') . ", "
) as $server_code) { . "NOW(), '" . $this->dbEscapeString($event) . "', "
. "'" . $this->dbEscapeString((string)$error) . "', "
. "'" . $this->dbEscapeString($data) . "', '" . $data_binary . "', "
. "'" . $this->page_name . "', ";
foreach (
[
'REMOTE_ADDR', 'HTTP_USER_AGENT', 'HTTP_REFERER', 'SCRIPT_FILENAME',
'QUERY_STRING', 'SERVER_NAME', 'HTTP_HOST', 'HTTP_ACCEPT',
'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_ENCODING'
] as $server_code
) {
if (array_key_exists($server_code, $_SERVER)) { if (array_key_exists($server_code, $_SERVER)) {
$q .= "'" . $this->dbEscapeString($_SERVER[$server_code]) . "', "; $q .= "'" . $this->dbEscapeString($_SERVER[$server_code]) . "', ";
} else { } else {
@@ -1222,7 +1373,9 @@ EOM;
*/ */
public function loginCheckEditAccessId(?int $edit_access_id): ?int public function loginCheckEditAccessId(?int $edit_access_id): ?int
{ {
if (isset($_SESSION['UNIT']) && if (
$edit_access_id !== null &&
isset($_SESSION['UNIT']) &&
is_array($_SESSION['UNIT']) && is_array($_SESSION['UNIT']) &&
!array_key_exists($edit_access_id, $_SESSION['UNIT']) !array_key_exists($edit_access_id, $_SESSION['UNIT'])
) { ) {
@@ -1247,6 +1400,7 @@ EOM;
return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key]; return $_SESSION['UNIT'][$edit_access_id]['data'][$data_key];
} }
} }
} // close class // close class
}
// __END__ // __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/********************************************************************* /*********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2006/08/15 * CREATED: 2006/08/15
@@ -10,6 +11,10 @@
* - menu creation * - menu creation
* - array vars for smarty * - array vars for smarty
* *
* CHANGE PLAN:
* loads DB\IO + Logger and returns one group object
* also checks all missing CONFIG vars from Basic class
*
* PUBLIC VARIABLES * PUBLIC VARIABLES
* *
* PRIVATE VARIABLES * PRIVATE VARIABLES
@@ -22,53 +27,87 @@
* *
*********************************************************************/ *********************************************************************/
declare(strict_types=1);
namespace CoreLibs\Admin; namespace CoreLibs\Admin;
class Backend extends \CoreLibs\DB\IO class Backend extends \CoreLibs\DB\IO
{ {
// page name // page name
public $menu = array(); /** @var array<mixed> */
public $menu = [];
/** @var int|string */
public $menu_show_flag = 0; // top menu flag (mostly string) public $menu_show_flag = 0; // top menu flag (mostly string)
// action ids // action ids
public $action_list = array('action', 'action_id', 'action_sub_id', 'action_yes', 'action_flag', 'action_menu', 'action_value', 'action_error', 'action_loaded'); /** @var array<string> */
public $action_list = [
'action', 'action_id', 'action_sub_id', 'action_yes', 'action_flag',
'action_menu', 'action_value', 'action_error', 'action_loaded'
];
/** @var string */
public $action; public $action;
/** @var string|int */
public $action_id; public $action_id;
/** @var string|int */
public $action_sub_id; public $action_sub_id;
/** @var string|int|bool */
public $action_yes; public $action_yes;
/** @var string */
public $action_flag; public $action_flag;
/** @var string */
public $action_menu; public $action_menu;
/** @var string */
public $action_loaded; public $action_loaded;
/** @var string */
public $action_value; public $action_value;
/** @var string */
public $action_error; public $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
public $acl = array(); /** @var array<mixed> */
public $acl = [];
/** @var int */
public $default_acl; public $default_acl;
// queue key // queue key
/** @var string */
public $queue_key; public $queue_key;
// the current active edit access id // the current active edit access id
/** @var int */
public $edit_access_id; public $edit_access_id;
// error/warning/info messages // error/warning/info messages
public $messages = array(); /** @var array<mixed> */
public $messages = [];
/** @var int */
public $error = 0; public $error = 0;
/** @var int */
public $warning = 0; public $warning = 0;
/** @var int */
public $info = 0; public $info = 0;
// internal lang & encoding vars // internal lang & encoding vars
/** @var string */
public $lang_dir = ''; public $lang_dir = '';
/** @var string */
public $lang; public $lang;
/** @var string */
public $lang_short; public $lang_short;
/** @var string */
public $encoding; public $encoding;
// language // language
/** @var \CoreLibs\Language\L10n */
public $l; public $l;
// smarty publics [end processing in smarty class] // smarty publics [end processing in smarty class]
/** @var array<mixed> */
public $DATA; public $DATA;
/** @var array<mixed> */
public $HEADER; public $HEADER;
/** @var array<mixed> */
public $DEBUG_DATA; public $DEBUG_DATA;
/** @var array<mixed> */
public $CONTENT_DATA; public $CONTENT_DATA;
// CONSTRUCTOR / DECONSTRUCTOR |====================================> // CONSTRUCTOR / DECONSTRUCTOR |====================================>
/** /**
* main class constructor * main class constructor
* @param array $db_config db config array * @param array<mixed> $db_config db config array
*/ */
public function __construct(array $db_config) public function __construct(array $db_config)
{ {
@@ -88,7 +127,7 @@ class Backend extends \CoreLibs\DB\IO
// 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 = $this->randomKeyGen(3); $this->queue_key = \CoreLibs\Create\RandomKey::randomKeyGen(3);
} }
} }
@@ -141,7 +180,7 @@ class Backend extends \CoreLibs\DB\IO
/** /**
* set internal ACL from login ACL * set internal ACL from login ACL
* @param array $acl login acl array * @param array<mixed> $acl login acl array
*/ */
public function setACL(array $acl): void public function setACL(array $acl): void
{ {
@@ -151,15 +190,15 @@ class Backend extends \CoreLibs\DB\IO
/** /**
* writes all action vars plus other info into edit_log tabl * writes all action vars plus other info into edit_log tabl
* @param string $event any kind of event description, * @param string $event any kind of event description,
* @param string|array $data any kind of data related to that event * @param string|array<mixed> $data any kind of data related to that event
* @param string $write_type write type can bei STRING or BINARY * @param string $write_type write type can bei STRING or BINARY
* @return void has no return * @return void
*/ */
public function adbEditLog(string $event = '', $data = '', string $write_type = 'STRING'): void public function adbEditLog(string $event = '', $data = '', string $write_type = 'STRING'): void
{ {
$data_binary = ''; $data_binary = '';
if ($write_type == 'BINARY') { if ($write_type == 'BINARY') {
$data_binary = $this->dbEscapeBytea(bzcompress(serialize($data))); $data_binary = $this->dbEscapeBytea((string)bzcompress(serialize($data)));
$data = 'see bzip compressed data_binary field'; $data = 'see bzip compressed data_binary field';
} }
if ($write_type == 'STRING') { if ($write_type == 'STRING') {
@@ -168,49 +207,54 @@ class Backend extends \CoreLibs\DB\IO
} }
// check schema // check schema
if (defined('LOGIN_DB_SCHEMA') && LOGIN_DB_SCHEMA) { $SCHEMA = 'public';
if (defined('LOGIN_DB_SCHEMA') && !empty(LOGIN_DB_SCHEMA)) {
$SCHEMA = LOGIN_DB_SCHEMA; $SCHEMA = LOGIN_DB_SCHEMA;
} elseif ($this->dbGetSchema()) { } elseif ($this->dbGetSchema()) {
$SCHEMA = $this->dbGetSchema(); $SCHEMA = $this->dbGetSchema();
} elseif (defined('PUBLIC_SCHEMA')) { } elseif (defined('PUBLIC_SCHEMA')) {
$SCHEMA = PUBLIC_SCHEMA; $SCHEMA = PUBLIC_SCHEMA;
} else {
$SCHEMA = 'public';
} }
/** @phpstan-ignore-next-line for whatever reason $SCHEMA is seen as possible array */
$q = "INSERT INTO ".$SCHEMA.".edit_log "; $q = "INSERT INTO " . $SCHEMA . ".edit_log "
$q .= "(euid, event_date, event, data, data_binary, page, "; . "(euid, event_date, event, data, data_binary, page, "
$q .= "ip, user_agent, referer, script_name, query_string, server_name, http_host, http_accept, http_accept_charset, http_accept_encoding, session_id, "; . "ip, user_agent, referer, script_name, query_string, server_name, http_host, "
$q .= "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, "
$q .= "VALUES "; . "action, action_id, action_yes, action_flag, action_menu, action_loaded, action_value, action_error) "
$q .= "(".$this->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ? $_SESSION['EUID'] : 'NULL').", "; . "VALUES "
$q .= "NOW(), "; . "(" . $this->dbEscapeString(isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ?
$q .= "'".$this->dbEscapeString((string)$event)."', '".$data."', '".$data_binary."', '".$this->dbEscapeString((string)$this->page_name)."', "; $_SESSION['EUID'] :
$q .= "'".@$_SERVER["REMOTE_ADDR"]."', '".$this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT'])."', "; 'NULL')
$q .= "'".$this->dbEscapeString($_SERVER['HTTP_REFERER'] ?? '')."', "; . ", "
$q .= "'".$this->dbEscapeString($_SERVER['SCRIPT_FILENAME'] ?? '')."', "; . "NOW(), "
$q .= "'".$this->dbEscapeString($_SERVER['QUERY_STRING'] ?? '')."', "; . "'" . $this->dbEscapeString((string)$event) . "', '" . $data . "', "
$q .= "'".$this->dbEscapeString($_SERVER['SERVER_NAME'] ?? '')."', "; . "'" . $data_binary . "', '" . $this->dbEscapeString((string)$this->page_name) . "', "
$q .= "'".$this->dbEscapeString($_SERVER['HTTP_HOST'] ?? '')."', "; . "'" . @$_SERVER["REMOTE_ADDR"] . "', "
$q .= "'".$this->dbEscapeString($_SERVER['HTTP_ACCEPT'] ?? '')."', "; . "'" . $this->dbEscapeString(@$_SERVER['HTTP_USER_AGENT']) . "', "
$q .= "'".$this->dbEscapeString($_SERVER['HTTP_ACCEPT_CHARSET'] ?? '')."', "; . "'" . $this->dbEscapeString($_SERVER['HTTP_REFERER'] ?? '') . "', "
$q .= "'".$this->dbEscapeString($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '')."', "; . "'" . $this->dbEscapeString($_SERVER['SCRIPT_FILENAME'] ?? '') . "', "
$q .= "'".session_id()."', "; . "'" . $this->dbEscapeString($_SERVER['QUERY_STRING'] ?? '') . "', "
$q .= "'".$this->dbEscapeString($this->action)."', "; . "'" . $this->dbEscapeString($_SERVER['SERVER_NAME'] ?? '') . "', "
$q .= "'".$this->dbEscapeString($this->action_id)."', "; . "'" . $this->dbEscapeString($_SERVER['HTTP_HOST'] ?? '') . "', "
$q .= "'".$this->dbEscapeString($this->action_yes)."', "; . "'" . $this->dbEscapeString($_SERVER['HTTP_ACCEPT'] ?? '') . "', "
$q .= "'".$this->dbEscapeString($this->action_flag)."', "; . "'" . $this->dbEscapeString($_SERVER['HTTP_ACCEPT_CHARSET'] ?? '') . "', "
$q .= "'".$this->dbEscapeString($this->action_menu)."', "; . "'" . $this->dbEscapeString($_SERVER['HTTP_ACCEPT_ENCODING'] ?? '') . "', "
$q .= "'".$this->dbEscapeString($this->action_loaded)."', "; . "'" . session_id() . "', "
$q .= "'".$this->dbEscapeString($this->action_value)."', "; . "'" . $this->dbEscapeString($this->action) . "', "
$q .= "'".$this->dbEscapeString($this->action_error)."')"; . "'" . $this->dbEscapeString($this->action_id) . "', "
. "'" . $this->dbEscapeString($this->action_yes) . "', "
. "'" . $this->dbEscapeString($this->action_flag) . "', "
. "'" . $this->dbEscapeString($this->action_menu) . "', "
. "'" . $this->dbEscapeString($this->action_loaded) . "', "
. "'" . $this->dbEscapeString($this->action_value) . "', "
. "'" . $this->dbEscapeString($this->action_error) . "')";
$this->dbExec($q, 'NULL'); $this->dbExec($q, 'NULL');
} }
/** /**
* menu creater (from login menu session pages) * menu creater (from login menu session pages)
* @param int $flag visible flag trigger * @param int $flag visible flag trigger
* @return array menu array for output on page (smarty) * @return array<mixed> menu array for output on page (smarty)
*/ */
public function adbTopMenu(int $flag = 0): array public function adbTopMenu(int $flag = 0): array
{ {
@@ -221,17 +265,17 @@ class Backend extends \CoreLibs\DB\IO
// get the session pages array // get the session pages array
$PAGES = $_SESSION['PAGES'] ?? null; $PAGES = $_SESSION['PAGES'] ?? null;
if (!isset($PAGES) || !is_array($PAGES)) { if (!isset($PAGES) || !is_array($PAGES)) {
$PAGES = array(); $PAGES = [];
} }
$pages = array(); $pages = [];
foreach ($PAGES as $PAGE_CUID => $PAGE_DATA) { foreach ($PAGES as $PAGE_DATA) {
$pages[] = $PAGE_DATA; $pages[] = $PAGE_DATA;
} }
// $this->debug('pages', $this->print_ar($pages)); // $this->debug('pages', $this->print_ar($pages));
// if flag is 0, then we show all, else, we show only the matching flagges array points // if flag is 0, then we show all, else, we show only the matching flagges array points
// array is already sorted after correct order // array is already sorted after correct order
reset($pages); reset($pages);
foreach ($pages as $i => $data) { foreach ($pages as $data) {
// for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) { // for ($i = 0, $iMax = count($pages); $i < $iMax; $i ++) {
$show = 0; $show = 0;
// is it visible in the menu & is it online // is it visible in the menu & is it online
@@ -258,20 +302,23 @@ class Backend extends \CoreLibs\DB\IO
} }
$query_string = ''; $query_string = '';
if (isset($data['query']) && if (
isset($data['query']) &&
is_array($data['query']) && is_array($data['query']) &&
count($data['query']) count($data['query'])
) { ) {
// for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) { // for ($j = 0, $jMax = count($pages[$i]['query']); $j < $jMax; $j ++) {
foreach ($data['query'] as $j => $query) { foreach ($data['query'] as $j => $query) {
if (!empty($query['name']) && if (
!empty($query['name']) &&
!empty($query['value']) !empty($query['value'])
) { ) {
if (strlen($query_string)) { if (strlen($query_string)) {
$query_string .= '&'; $query_string .= '&';
} }
$query_string .= $query['name'] . '='; $query_string .= $query['name'] . '=';
if (isset($query['dynamic']) && if (
isset($query['dynamic']) &&
$query['dynamic'] $query['dynamic']
) { ) {
if (isset($_GET[$query['value']])) { if (isset($_GET[$query['value']])) {
@@ -296,8 +343,9 @@ class Backend extends \CoreLibs\DB\IO
$name = $data['page_name'] ?? ''; $name = $data['page_name'] ?? '';
// if page name matchs -> set selected flag // if page name matchs -> set selected flag
$selected = 0; $selected = 0;
if (isset($data['filename']) && if (
$this->getPageName() == $data['filename'] && isset($data['filename']) &&
\CoreLibs\Get\System::getPageName() == $data['filename'] &&
(!isset($data['hostname']) || ( (!isset($data['hostname']) || (
isset($data['hostname']) && isset($data['hostname']) &&
(!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false) (!$data['hostname'] || strstr($data['hostname'], CONTENT_PATH) !== false)
@@ -308,20 +356,21 @@ class Backend extends \CoreLibs\DB\IO
} }
// last check, is this menu point okay to show // last check, is this menu point okay to show
$enabled = 0; $enabled = 0;
if (isset($data['filename']) && if (
isset($data['filename']) &&
$this->adbShowMenuPoint($data['filename']) $this->adbShowMenuPoint($data['filename'])
) { ) {
$enabled = 1; $enabled = 1;
} }
// write in to view menu array // write in to view menu array
array_push($this->menu, array( array_push($this->menu, [
'name' => $this->l->__($name), 'name' => $this->l->__($name),
'url' => $url, 'url' => $url,
'selected' => $selected, 'selected' => $selected,
'enabled' => $enabled, 'enabled' => $enabled,
'popup' => $type == 'popup' ? 1 : 0, 'popup' => $type == 'popup' ? 1 : 0,
'type' => $type 'type' => $type
)); ]);
} // show page } // show page
} // online and in menu } // online and in menu
} // for each page } // for each page
@@ -329,11 +378,12 @@ class Backend extends \CoreLibs\DB\IO
} }
/** /**
* ONLY USED IN adbTopMenu
* checks if this filename is in the current situation (user id, etc) available * checks if this filename is in the current situation (user id, etc) available
* @param string|null $filename filename * @param string|null $filename filename
* @return bool true for visible/accessable menu point, false for not * @return bool true for visible/accessable menu point, false for not
*/ */
public function adbShowMenuPoint(?string $filename): bool private function adbShowMenuPoint(?string $filename): bool
{ {
$enabled = false; $enabled = false;
if ($filename === null) { if ($filename === null) {
@@ -351,15 +401,19 @@ class Backend extends \CoreLibs\DB\IO
/** /**
* @deprecated * @deprecated
* creates out of a normal db_return array an assoc array * creates out of a normal db_return array an assoc array
* @param array $db_array input array * @param array<mixed> $db_array input array
* @param string|int|bool $key key * @param string|int|bool $key key
* @param string|int|bool $value value * @param string|int|bool $value value
* @return array associative array * @return array<mixed> associative array
* @deprecated \CoreLibs\Combined\ArrayHandler::genAssocArray()
*/ */
public function adbAssocArray(array $db_array, $key, $value): array public function adbAssocArray(array $db_array, $key, $value): array
{ {
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED); trigger_error(
return $this->genAssocArray($db_array, $key, $value); 'Method ' . __METHOD__ . ' is deprecated: \CoreLibs\Combined\ArrayHandler::genAssocArray',
E_USER_DEPRECATED
);
return \CoreLibs\Combined\ArrayHandler::genAssocArray($db_array, $key, $value);
} }
/** /**
@@ -367,11 +421,15 @@ class Backend extends \CoreLibs\DB\IO
* converts bytes into formated string with KB, MB, etc * converts bytes into formated string with KB, MB, etc
* @param string|int|float $number string or int or number * @param string|int|float $number string or int or number
* @return string formatted string * @return string formatted string
* @deprecated \CoreLibs\Convert\Byte::humanReadableByteFormat()
*/ */
public function adbByteStringFormat($number): string public function adbByteStringFormat($number): string
{ {
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED); trigger_error(
return $this->humanReadableByteFormat($number); 'Method ' . __METHOD__ . ' is deprecated: \CoreLibs\Convert\Byte::humanReadableByteFormat()',
E_USER_DEPRECATED
);
return \CoreLibs\Convert\Byte::humanReadableByteFormat($number);
} }
/** /**
@@ -380,32 +438,44 @@ class Backend extends \CoreLibs\DB\IO
* @param string $pic source image file with or without path * @param string $pic source image file with or without path
* @param int $size_x maximum size width * @param int $size_x maximum size width
* @param int $size_y maximum size height * @param int $size_y maximum size height
* @param string $dummy empty, or file_type to show an icon instead of nothing if file is not found * @param string $dummy empty, or file_type to show an icon
* @param string $path if source start is not ROOT path, if empty ROOT is choosen * instead of nothing if file is not found
* @param string $path if source start is not ROOT path
* if empty ROOT is choosen
* @return string|bool thumbnail name, or false for error * @return string|bool thumbnail name, or false for error
* @deprecated \CoreLibs\Output\Image::createThumbnail()
*/ */
public function adbCreateThumbnail($pic, $size_x, $size_y, $dummy = '', $path = "", $cache = "") public function adbCreateThumbnail(
{ string $pic,
trigger_error('Method '.__METHOD__.' is deprecated', E_USER_DEPRECATED); int $size_x,
return $this->createThumbnail($pic, $size_x, $size_y, $dummy, $path, $cache); int $size_y,
string $dummy = '',
string $path = '',
string $cache = ''
) {
trigger_error(
'Method ' . __METHOD__ . ' is deprecated: \CoreLibs\Output\Image::createThumbnail()',
E_USER_DEPRECATED
);
return \CoreLibs\Output\Image::createThumbnail($pic, $size_x, $size_y, $dummy, $path, $cache);
} }
/** /**
* wrapper function to fill up the mssages array * wrapper function to fill up the mssages array
* @param string $level info/warning/error * @param string $level info/warning/error
* @param string $msg string, can be printf formated * @param string $msg string, can be printf formated
* @param array $vars optional data for a possible printf formated msg * @param array<mixed> $vars optional data for a possible printf formated msg
* @return void has no return * @return void has no return
*/ */
public function adbMsg(string $level, string $msg, array $vars = array()): void public function adbMsg(string $level, string $msg, array $vars = []): void
{ {
if (!preg_match("/^info|warning|error$/", $level)) { if (!preg_match("/^info|warning|error$/", $level)) {
$level = "info"; $level = "info";
} }
$this->messages[] = array( $this->messages[] = [
'msg' => vsprintf($this->l->__($msg), $vars), 'msg' => vsprintf($this->l->__($msg), $vars),
'class' => $level 'class' => $level
); ];
switch ($level) { switch ($level) {
case 'info': case 'info':
$this->info = 1; $this->info = 1;
@@ -441,7 +511,7 @@ class Backend extends \CoreLibs\DB\IO
string $associate = null, string $associate = null,
string $file = null string $file = null
): void { ): void {
if (defined('GLOBAL_DB_SCHEMA') && GLOBAL_DB_SCHEMA) { if (defined('GLOBAL_DB_SCHEMA') && !empty(GLOBAL_DB_SCHEMA)) {
$SCHEMA = GLOBAL_DB_SCHEMA; $SCHEMA = GLOBAL_DB_SCHEMA;
} elseif ($this->dbGetSchema()) { } elseif ($this->dbGetSchema()) {
$SCHEMA = $this->dbGetSchema(); $SCHEMA = $this->dbGetSchema();
@@ -450,14 +520,15 @@ class Backend extends \CoreLibs\DB\IO
} else { } else {
$SCHEMA = 'public'; $SCHEMA = 'public';
} }
$q = "INSERT INTO ".$SCHEMA.".live_queue ("; $q = "INSERT INTO " . $SCHEMA . ".live_queue ("
$q .= "queue_key, key_value, key_name, type, target, data, group_key, action, associate, file"; . "queue_key, key_value, key_name, type, target, data, group_key, action, associate, file"
$q .= ") VALUES ("; . ") VALUES ("
$q .= "'".$this->dbEscapeString($queue_key)."', '".$this->dbEscapeString($key_value)."', "; . "'" . $this->dbEscapeString($queue_key) . "', '" . $this->dbEscapeString($key_value) . "', "
$q .= "'".$this->dbEscapeString($key_name)."', '".$this->dbEscapeString($type)."', "; . "'" . $this->dbEscapeString($key_name) . "', '" . $this->dbEscapeString($type) . "', "
$q .= "'".$this->dbEscapeString($target)."', '".$this->dbEscapeString($data)."', "; . "'" . $this->dbEscapeString($target) . "', '" . $this->dbEscapeString($data) . "', "
$q .= "'".$this->queue_key."', '".$this->action."', '".$this->dbEscapeString((string)$associate)."', "; . "'" . $this->queue_key . "', '" . $this->action . "', "
$q .= "'".$this->dbEscapeString((string)$file)."')"; . "'" . $this->dbEscapeString((string)$associate) . "', "
. "'" . $this->dbEscapeString((string)$file) . "')";
$this->dbExec($q); $this->dbExec($q);
} }
@@ -487,13 +558,22 @@ class Backend extends \CoreLibs\DB\IO
bool $name_pos_back = false bool $name_pos_back = false
) { ) {
// get the build layout // get the build layout
$html_time = $this->printDateTime($year, $month, $day, $hour, $min, $suffix, $min_steps, $name_pos_back); $html_time = \CoreLibs\Output\Form\Elements::printDateTime(
$year,
$month,
$day,
$hour,
$min,
$suffix,
$min_steps,
$name_pos_back
);
// translate the strings inside // translate the strings inside
foreach (array('Year ', 'Month ', 'Day ', 'Hour ', 'Minute ') as $_time) { foreach (['Year ', 'Month ', 'Day ', 'Hour ', 'Minute '] as $_time) {
$html_time = str_replace($_time, $this->l->__(str_replace(' ', '', $_time)) . ' ', $html_time); $html_time = str_replace($_time, $this->l->__(str_replace(' ', '', $_time)) . ' ', $html_time);
} }
// replace week days in short // replace week days in short
foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $_date) { foreach (['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] as $_date) {
$html_time = str_replace('(' . $_date . ')', '(' . $this->l->__($_date) . ')', $html_time); $html_time = str_replace('(' . $_date . ')', '(' . $this->l->__($_date) . ')', $html_time);
} }
// return the datetime select string with strings translated // return the datetime select string with strings translated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,185 @@
<?php
declare(strict_types=1);
namespace CoreLibs\Check;
class Email
{
// this is for error check parts in where the email regex failed
/** @var array<int,string> */
private static $email_regex_check = [
0 => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$", // MASTER
1 => "@(.*)@(.*)", // double @
2 => "^[A-Za-z0-9!#$%&'*+-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+-\/=?^_`{|}~\.]{0,63}@", // wrong part before @
3 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$", // wrong part after @
4 => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.", // wrong domain name part
5 => "\.([a-zA-Z]{2,6}){1}$", // wrong top level part
6 => "@(.*)\.{2,}", // double .. in domain name part
7 => "@.*\.$" // ends with a dot, top level, domain missing
];
// the array with the mobile types that are valid
/** @var array<string,string> */
private static $mobile_email_type = [
'.*@docomo\.ne\.jp$' => 'keitai_docomo',
// correct are a[2-4], b2, c[1-9], e[2-9], h[2-4], t[1-9]
'.*@([a-z0-9]{2}\.)?ezweb\.ne\.jp$' => 'keitai_kddi_ezweb',
// ez[a-j] or nothing
'.*@(ez[a-j]{1}\.)?ido\.ne\.jp$' => 'keitai_kddi_ido',
// (sky group)
'.*@([a-z]{2}\.)?sky\.tu-ka\.ne\.jp$' => 'keitai_kddi_tu-ka',
// (sky group) [tkk,tkc only]
'.*@([a-z]{2}\.)?sky\.tk[kc]{1}\.ne\.jp$' => 'keitai_kddi_sky',
// dtg (sky group)
'.*@([a-z]{2}\.)?sky\.dtg\.ne\.jp$' => 'keitai_kddi_dtg',
// old vodafone [t,k,d,h,c,r,n,s,q]
'.*@[tkdhcrnsq]{1}\.vodafone\.ne\.jp$' => 'keitai_softbank_vodafone',
// very old j-phone (pre vodafone) [d,h,t,k,r,s,n,q,c]
'.*@jp-[dhtkrsnqc]{1}\.ne\.jp$' => 'keitai_softbank_j-phone',
// add i for iphone also as keitai, others similar to the vodafone group
'.*@([dhtcrknsq]{1}\.)?softbank\.ne\.jp$' => 'keitai_softbank',
// add iPhone also as keitai and not as pc
'.*@i{1}\.softbank(\.ne)?\.jp$' => 'smartphone_softbank_iphone',
'.*@disney\.ne\.jp$' => 'keitai_softbank_disney', // (kids)
'.*@willcom\.ne\.jp$' => 'keitai_willcom',
'.*@willcom\.com$' => 'keitai_willcom', // new for pdx.ne.jp address
'.*@wcm\.ne\.jp$' => 'keitai_willcom', // old willcom wcm.ne.jp
'.*@pdx\.ne\.jp$' => 'keitai_willcom_pdx', // old pdx address for willcom
'.*@bandai\.jp$' => 'keitai_willcom_bandai', // willcom paipo! (kids)
'.*@pipopa\.ne\.jp$' => 'keitai_willcom_pipopa', // willcom paipo! (kids)
// actually only di,dj,dk,wm -> all others are "wrong", but none also allowed?
'.*@([a-z0-9]{2,4}\.)?pdx\.ne\.jp$' => 'keitai_willcom_pdx',
// ymobile, ymobile1 techincally not willcom, but I group them there (softbank sub)
'.*@ymobile([1]{1})?\.ne\.jp$' => 'keitai_willcom_ymobile',
// y-mobile techincally not willcom, but I group them there (softbank sub)
'.*@y-mobile\.ne\.jp$' => 'keitai_willcom_ymobile',
'.*@emnet\.ne\.jp$' => 'keitai_willcom_emnet', // e-mobile, group will willcom
'.*@emobile\.ne\.jp$' => 'keitai_willcom_emnet', // e-mobile, group will willcom
'.*@emobile-s\.ne\.jp$' => 'keitai_willcom_emnet' # e-mobile, group will willcom
];
// short list for mobile email types
/** @var array<string,string> */
private static $mobile_email_type_short = [
'keitai_docomo' => 'docomo',
'keitai_kddi_ezweb' => 'kddi',
'keitai_kddi' => 'kddi',
'keitai_kddi_tu-ka' => 'kddi',
'keitai_kddi_sky' => 'kddi',
'keitai_softbank' => 'softbank',
'smartphone_softbank_iphone' => 'iphone',
'keitai_softbank_disney' => 'softbank',
'keitai_softbank_vodafone' => 'softbank',
'keitai_softbank_j-phone' => 'softbank',
'keitai_willcom' => 'willcom',
'keitai_willcom_pdx' => 'willcom',
'keitai_willcom_bandai' => 'willcom',
'keitai_willcom_pipopa' => 'willcom',
'keitai_willcom_ymobile' => 'willcom',
'keitai_willcom_emnet' => 'willcom',
'pc_html' => 'pc',
// old sets -> to be removed later
'docomo' => 'docomo',
'kddi_ezweb' => 'kddi',
'kddi' => 'kddi',
'kddi_tu-ka' => 'kddi',
'kddi_sky' => 'kddi',
'softbank' => 'softbank',
'keitai_softbank_iphone' => 'iphone',
'softbank_iphone' => 'iphone',
'softbank_disney' => 'softbank',
'softbank_vodafone' => 'softbank',
'softbank_j-phone' => 'softbank',
'willcom' => 'willcom',
'willcom_pdx' => 'willcom',
'willcom_bandai' => 'willcom',
'willcom_pipopa' => 'willcom',
'willcom_ymobile' => 'willcom',
'willcom_emnet' => 'willcom',
'pc' => 'pc'
];
/**
* Undocumented function
*
* @param int $type Which position in the regex list to get
* if not set or not valid get default pos 0
* @return string
*/
public static function getEmailRegex(int $type = 0): string
{
// make sure type is in valid range
if ($type < 0 || $type >= count(self::$email_regex_check)) {
$type = 0;
}
return self::$email_regex_check[$type];
}
/**
* get the full check array
* this will be deprected at some point
*
* @return array<mixed>
*/
public static function getEmailRegexCheck(): array
{
// return all but the first
return array_slice(
self::$email_regex_check,
1,
count(self::$email_regex_check) - 1,
true
);
}
/**
* guesses the email type (mostly for mobile) from the domain
* if second is set to true, it will return short naming scheme (only provider)
* @param string $email email string
* @param bool $short default false, if true,
* returns only short type (pc instead of pc_html)
* @return string|bool email type, eg "pc", "docomo", etc,
* false for invalid short type
*/
public static function getEmailType(string $email, bool $short = false)
{
// trip if there is no email address
if (!$email) {
return 'invalid';
}
// loop until we match a mobile type, return this first found type
foreach (self::$mobile_email_type as $email_regex => $email_type) {
if (preg_match("/$email_regex/", $email)) {
if ($short) {
return self::getShortEmailType($email_type);
} else {
return $email_type;
}
}
}
// if no previous return we assume this is a pc address
if ($short) {
return 'pc';
} else {
return 'pc_html';
}
}
/**
* gets the short email type from a long email type
* @param string $email_type email string
* @return string|bool short string or false for invalid
*/
public static function getShortEmailType(string $email_type)
{
// check if the short email type exists
if (isset(self::$mobile_email_type_short[$email_type])) {
return self::$mobile_email_type_short[$email_type];
} else {
// return false on not found
return false;
}
}
}
// __END__

View File

@@ -0,0 +1,54 @@
<?php
/*
* various file/file name functions
*/
declare(strict_types=1);
namespace CoreLibs\Check;
class File
{
/**
* quick return the extension of the given file name
* @param string $filename file name
* @return string extension of the file name
*/
public static function getFilenameEnding(string $filename): string
{
$page_temp = pathinfo($filename);
return $page_temp['extension'] ?? '';
}
/**
* get lines in a file
* @param string $file file for line count read
* @return int number of lines or -1 for non readable file
*/
public static function getLinesFromFile(string $file): int
{
if (
is_file($file) &&
file_exists($file) &&
is_readable($file)
) {
$f = fopen($file, 'rb');
if (!is_resource($f)) {
return 0;
}
$lines = 0;
while (!feof($f)) {
$lines += substr_count(fread($f, 8192) ?: '', "\n");
}
fclose($f);
} else {
// if file does not exist or is not readable, return -1
$lines = -1;
}
// return lines in file
return $lines;
}
}
// __END__

View File

@@ -0,0 +1,89 @@
<?php
/*
* Converts a json string to array and stores error for later checking
* can also return empty array on demand
* and self set json as is on error as array
*/
declare(strict_types=1);
namespace CoreLibs\Check;
class Jason
{
/** @var int */
private static $json_last_error;
/**
* converts a json string to an array
* or inits an empty array on null string
* or failed convert to array
* In ANY case it will ALWAYS return array.
* Does not throw errors
* @param string|null $json a json string, or null data
* @param bool $override if set to true, then on json error
* set original value as array
* @return array<mixed> returns an array from the json values
*/
public static function jsonConvertToArray(?string $json, bool $override = false): array
{
if ($json !== null) {
$_json = json_decode($json, true);
if (self::$json_last_error = json_last_error()) {
if ($override == true) {
// init return as array with original as element
$json = [$json];
} else {
$json = [];
}
} else {
$json = $_json;
}
} else {
$json = [];
}
// be sure that we return an array
return (array)$json;
}
/**
* [jsonGetLastError description]
* @param bool|boolean $return_string [default=false] if set to true
* it will return the message string and not
* the error number
* @return int|string Either error number (0 for no error)
* or error string ('' for no error)
*/
public static function jsonGetLastError(bool $return_string = false)
{
$json_error_string = '';
// valid errors as of php 8.0
switch (self::$json_last_error) {
case JSON_ERROR_NONE:
$json_error_string = '';
break;
case JSON_ERROR_DEPTH:
$json_error_string = 'Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
$json_error_string = 'Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
$json_error_string = 'Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
$json_error_string = 'Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
$json_error_string = 'Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
$json_error_string = 'Unknown error';
break;
}
return $return_string === true ? $json_error_string : self::$json_last_error;
}
}
// __END__

View File

@@ -0,0 +1,55 @@
<?php
/*
* core password set, check and rehash check wrapper functions
*/
declare(strict_types=1);
namespace CoreLibs\Check;
class Password
{
/**
* creates the password hash
* @param string $password password
* @return string hashed password
*/
public static function passwordSet(string $password): string
{
// always use the PHP default for the password
// password options ca be set in the password init, but should be kept as default
return password_hash($password, PASSWORD_DEFAULT);
}
/**
* checks if the entered password matches the hash
* @param string $password password
* @param string $hash password hash
* @return bool true or false
*/
public static function passwordVerify(string $password, string $hash): bool
{
if (password_verify($password, $hash)) {
return true;
} else {
return false;
}
}
/**
* checks if the password needs to be rehashed
* @param string $hash password hash
* @return bool true or false
*/
public static function passwordRehashCheck(string $hash): bool
{
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
return true;
} else {
return false;
}
}
}
// __END__

View File

@@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
namespace CoreLibs\Check;
class PhpVersion
{
/**
* checks if running PHP version matches given PHP version (min or max)
* @param string $min_version minimum version as string (x, x.y, x.y.x)
* @param string $max_version optional maximum version as string (x, x.y, x.y.x)
* @return bool true if ok, false if not matching version
*/
public static function checkPHPVersion(string $min_version, string $max_version = ''): bool
{
// exit with false if the min/max strings are wrong
if (!preg_match("/^\d{1}(\.\d{1})?(\.\d{1,2})?$/", $min_version)) {
return false;
}
// max is only chcked if it is set
if ($max_version && !preg_match("/^\d{1}(\.\d{1})?(\.\d{1,2})?$/", $max_version)) {
return false;
}
// split up the version strings to calc the compare number
$version = explode('.', $min_version);
$min_version = (int)$version[0] * 10000 + (int)($version[1] ?? 0) * 100 + (int)($version[2] ?? 0);
if ($max_version) {
$version = explode('.', $max_version);
$max_version = (int)$version[0] * 10000 + (int)($version[1] ?? 0) * 100 + (int)($version[2] ?? 0);
// drop out if min is bigger max, equal size is okay, that would be only THIS
if ($min_version > $max_version) {
return false;
}
}
// set the php version id
if (!defined('PHP_VERSION_ID')) {
$version = explode('.', phpversion() ?: '');
// creates something like 50107
define('PHP_VERSION_ID', (int)$version[0] * 10000 + (int)$version[1] * 100 + (int)$version[2]);
}
// check if matching for version
if (!$max_version && PHP_VERSION_ID >= $min_version) {
return true;
} elseif (PHP_VERSION_ID >= $min_version && PHP_VERSION_ID <= $max_version) {
return true;
}
// if no previous return, fail
return false;
}
}
// __END__

View File

@@ -0,0 +1,349 @@
<?php
/*
* html convert functions
*/
declare(strict_types=1);
namespace CoreLibs\Combined;
class ArrayHandler
{
/**
* searches key = value in an array / array
* only returns the first one found
* @param string|int $needle needle (search for)
* @param array<mixed> $haystack haystack (search in)
* @param string|null $key_lookin the key to look out for, default empty
* @return array<mixed> array with the elements where the needle can be
* found in the haystack array
*/
public static function arraySearchRecursive($needle, array $haystack, ?string $key_lookin = null): array
{
$path = [];
if (!is_array($haystack)) {
$haystack = [];
}
if (
$key_lookin != null &&
!empty($key_lookin) &&
array_key_exists($key_lookin, $haystack) &&
$needle === $haystack[$key_lookin]
) {
$path[] = $key_lookin;
} else {
foreach ($haystack as $key => $val) {
if (
is_scalar($val) &&
$val === $needle &&
empty($key_lookin)
) {
$path[] = $key;
break;
} elseif (
is_scalar($val) &&
!empty($key_lookin) &&
$key === $key_lookin &&
$val == $needle
) {
$path[] = $key;
break;
} elseif (
is_array($val) &&
$path = self::arraySearchRecursive(
$needle,
(array)$val,
// to avoid PhanTypeMismatchArgumentNullable
($key_lookin === null ? $key_lookin : (string)$key_lookin)
)
) {
array_unshift($path, $key);
break;
}
}
}
return $path;
}
/**
* recursive array search function, which returns all found not only the first one
* @param string|int $needle needle (search for)
* @param array<mixed> $haystack haystack (search in)
* @param string|int $key the key to look for in
* @param array<mixed>|null $path recursive call for previous path
* @return array<mixed>|null all array elements paths where the element was found
*/
public static function arraySearchRecursiveAll($needle, array $haystack, $key, ?array $path = null): ?array
{
// init if not set on null
if ($path === null) {
$path = [
'level' => 0,
'work' => []
];
} else {
// init sub sets if not set
if (!isset($path['level'])) {
$path['level'] = 0;
}
if (!isset($path['work'])) {
$path['work'] = [];
}
}
// should not be needed because it would trigger a php mehtod error
if (!is_array($haystack)) {
$haystack = [];
}
// go through the array,
foreach ($haystack as $_key => $_value) {
if (is_scalar($_value) && $_value == $needle && !$key) {
// only value matches
$path['work'][$path['level'] ?? 0] = $_key;
$path['found'][] = $path['work'];
} elseif (is_scalar($_value) && $_value == $needle && $_key == $key) {
// key and value matches
$path['work'][$path['level'] ?? 0] = $_key;
$path['found'][] = $path['work'];
} elseif (is_array($_value)) {
// add position to working
$path['work'][$path['level'] ?? 0] = $_key;
// we will up a level
$path['level'] += 1;
// call recursive
$path = self::arraySearchRecursiveAll($needle, $_value, $key, $path);
}
}
// be 100% sure the array elements are set
$path['level'] = $path['level'] ?? 0;
$path['work'] = $path['work'] ?? [];
// cut all that is >= level
array_splice($path['work'], $path['level']);
// step back a level
$path['level'] -= 1;
return $path;
}
/**
* array search simple. looks for key, value combination, if found, returns true
* @param array<mixed> $array search in as array
* @param string|int $key key (key to search in)
* @param string|int $value value (what to find)
* @return bool true on found, false on not found
*/
public static function arraySearchSimple(array $array, $key, $value): bool
{
if (!is_array($array)) {
$array = [];
}
foreach ($array as $_key => $_value) {
// if value is an array, we search
if (is_array($_value)) {
// call recursive, and return result if it is true, else continue
if (($result = self::arraySearchSimple($_value, $key, $value)) !== false) {
return $result;
}
} elseif ($_key == $key && $_value == $value) {
return true;
}
}
// no true returned, not found
return false;
}
/**
* correctly recursive merges as an array as array_merge_recursive just glues things together
* array first array to merge
* array second array to merge
* ... etc
* bool key flag: true: handle keys as string or int
* default false: all keys are string
* @return array<mixed>|bool merged array
*/
public static function arrayMergeRecursive()
{
// croak on not enough arguemnts (we need at least two)
if (func_num_args() < 2) {
trigger_error(__FUNCTION__ . ' needs two or more array arguments', E_USER_WARNING);
return false;
}
// default key is not string
$key_is_string = false;
$arrays = func_get_args();
// if last is not array, then assume it is trigger for key is always string
if (!is_array(end($arrays))) {
if (array_pop($arrays)) {
$key_is_string = true;
}
}
// check that arrays count is at least two, else we don't have enough to do anything
if (count($arrays) < 2) {
trigger_error(__FUNCTION__ . ' needs two or more array arguments', E_USER_WARNING);
return false;
}
$merged = [];
while ($arrays) {
$array = array_shift($arrays);
if (!is_array($array)) {
trigger_error(__FUNCTION__ . ' encountered a non array argument', E_USER_WARNING);
return false;
}
if (!$array) {
continue;
}
foreach ($array as $key => $value) {
// if string or if key is assumed to be string do key match else add new entry
if (is_string($key) || $key_is_string === false) {
if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) {
// $merged[$key] = call_user_func(__METHOD__, $merged[$key], $value, $key_is_string);
$merged[$key] = self::arrayMergeRecursive($merged[$key], $value, $key_is_string);
} else {
$merged[$key] = $value;
}
} else {
$merged[] = $value;
}
}
}
return $merged;
}
/**
* correct array_diff that does an actualy difference between two arrays.
* array_diff only checks elements from A that are not in B, but not the
* other way around.
* Note that like array_diff this only checks first level values not keys
* @param array<mixed> $a array to compare a
* @param array<mixed> $b array to compare b
* @return array<mixed> array with missing elements from a & b
*/
public static function arrayDiff(array $a, array $b): array
{
$intersect = array_intersect($a, $b);
return array_merge(array_diff($a, $intersect), array_diff($b, $intersect));
}
/**
* search for the needle array elements in haystack and return the ones found as an array,
* is there nothing found, it returns FALSE (boolean)
* @param array<mixed> $needle elements to search for
* @param array<mixed> $haystack array where the $needle elements should be searched int
* @return array<mixed>|bool either the found elements or false for nothing found or error
*/
public static function inArrayAny(array $needle, array $haystack)
{
if (!is_array($needle)) {
return false;
}
if (!is_array($haystack)) {
return false;
}
$found = [];
foreach ($needle as $element) {
if (in_array($element, $haystack)) {
$found[] = $element;
}
}
if (count($found) == 0) {
return false;
} else {
return $found;
}
}
/**
* creates out of a normal db_return array an assoc array
* @param array<mixed> $db_array return array from the database
* @param string|int|bool $key key set, false for not set
* @param string|int|bool $value value set, false for not set
* @param bool $set_only flag to return all (default), or set only
* @return array<mixed> associative array
*/
public static function genAssocArray(array $db_array, $key, $value, bool $set_only = false): array
{
$ret_array = [];
// do this to only run count once
for ($i = 0, $iMax = count($db_array); $i < $iMax; $i++) {
// if no key then we make an order reference
if (
$key !== false &&
$value !== false &&
(($set_only && $db_array[$i][$value]) || (!$set_only))
) {
$ret_array[$db_array[$i][$key]] = $db_array[$i][$value];
} elseif ($key === false && $value !== false) {
$ret_array[] = $db_array[$i][$value];
} elseif ($key !== false && $value === false) {
$ret_array[$db_array[$i][$key]] = $i;
}
}
return $ret_array;
}
/**
* converts multi dimensional array to a flat array
* does NOT preserve keys
* @param array<mixed> $array ulti dimensionial array
* @return array<mixed> flattened array
*/
public static function flattenArray(array $array): array
{
$return = [];
array_walk_recursive(
$array,
function ($value) use (&$return) {
$return[] = $value;
}
);
return $return;
}
/**
* will loop through an array recursivly and write the array keys back
* @param array<mixed> $array multidemnsional array to flatten
* @return array<mixed> flattened keys array
*/
public static function flattenArrayKey(array $array): array
{
$return = [];
array_walk_recursive(
$array,
function ($value, $key) use (&$return) {
$return[] = $key;
}
);
return $return;
}
/**
* searches for key -> value in an array tree and writes the value one level up
* this will remove this leaf will all other values
* @param array<mixed> $array nested array
* @param string|int $search key to find that has no sub leaf and will be pushed up
* @return array<mixed> modified, flattened array
*/
public static function arrayFlatForKey(array $array, $search): array
{
if (!is_array($array)) {
$array = [];
}
foreach ($array as $key => $value) {
// if it is not an array do just nothing
if (is_array($value)) {
// probe it has search key
if (isset($value[$search])) {
// set as current
$array[$key] = $value[$search];
} else {
// call up next node down
// $array[$key] = call_user_func(__METHOD__, $value, $search);
$array[$key] = self::arrayFlatForKey($value, $search);
}
}
}
return $array;
}
}
// __END__

View File

@@ -0,0 +1,316 @@
<?php
/*
* image thumbnail, rotate, etc
*/
declare(strict_types=1);
namespace CoreLibs\Combined;
class DateTime
{
/**
* a simple wrapper for the date format
* @param int|float $timestamp unix timestamp
* @param bool $show_micro show the micro time (default false)
* @return string formated date+time in Y-M-D h:m:s ms
*/
public static function dateStringFormat($timestamp, bool $show_micro = false): string
{
// split up the timestamp, assume . in timestamp
// array pad $ms if no microtime
list ($timestamp, $ms) = array_pad(explode('.', (string)round($timestamp, 4)), 2, null);
$string = date("Y-m-d H:i:s", (int)$timestamp);
if ($show_micro && $ms) {
$string .= ' ' . $ms . 'ms';
}
return $string;
}
/**
* formats a timestamp into interval, not into a date
* @param string|int|float $timestamp interval in seconds and optional float micro seconds
* @param bool $show_micro show micro seconds, default true
* @return string interval formatted string or string as is
*/
public static function timeStringFormat($timestamp, bool $show_micro = true): string
{
// check if the timestamp has any h/m/s/ms inside, if yes skip
if (!preg_match("/(h|m|s|ms)/", (string)$timestamp)) {
list($timestamp, $ms) = array_pad(explode('.', (string)round((float)$timestamp, 4)), 2, null);
// if negative remember
$negative = false;
if ((int)$timestamp < 0) {
$negative = true;
}
$timestamp = abs((float)$timestamp);
$timegroups = [86400, 3600, 60, 1];
$labels = ['d', 'h', 'm', 's'];
$time_string = '';
// if timestamp is zero, return zero string
if ($timestamp == 0) {
$time_string = '0s';
} else {
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
$output = floor((float)$timestamp / $timegroups[$i]);
$timestamp = (float)$timestamp % $timegroups[$i];
// output has days|hours|min|sec
if ($output || $time_string) {
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
}
}
}
// only add ms if we have an ms value
if ($ms !== null) {
// if we have ms and it has leading zeros, remove them, but only if it is nut just 0
$ms = preg_replace("/^0+(\d+)$/", '${1}', $ms);
if (!is_string($ms) || empty($ms)) {
$ms = '0';
}
// add ms if there
if ($show_micro) {
$time_string .= ' ' . $ms . 'ms';
} elseif (!$time_string) {
$time_string .= $ms . 'ms';
}
}
if ($negative) {
$time_string = '-' . $time_string;
}
} else {
$time_string = $timestamp;
}
return (string)$time_string;
}
/**
* does a reverse of the TimeStringFormat and converts the string from
* xd xh xm xs xms to a timestamp.microtime format
* @param string|int|float $timestring formatted interval
* @return string|int|float converted float interval, or string as is
*/
public static function stringToTime($timestring)
{
$timestamp = 0;
if (preg_match("/(d|h|m|s|ms)/", (string)$timestring)) {
$timestring = (string)$timestring;
// pos for preg match read + multiply factor
$timegroups = [2 => 86400, 4 => 3600, 6 => 60, 8 => 1];
$matches = [];
// if start with -, strip and set negative
$negative = false;
if (preg_match("/^-/", $timestring)) {
$negative = true;
$timestring = substr($timestring, 1);
}
// preg match: 0: full string
// 2, 4, 6, 8 are the to need values
preg_match("/^((\d+)d ?)?((\d+)h ?)?((\d+)m ?)?((\d+)s ?)?((\d+)ms)?$/", $timestring, $matches);
// multiply the returned matches and sum them up. the last one (ms) is added with .
foreach ($timegroups as $i => $time_multiply) {
if (isset($matches[$i]) && is_numeric($matches[$i])) {
$timestamp += (float)$matches[$i] * $time_multiply;
}
}
if (isset($matches[10]) && is_numeric($matches[10])) {
$timestamp .= '.' . $matches[10];
}
if ($negative) {
$timestamp *= -1;
}
return $timestamp;
} else {
return $timestring;
}
}
/**
* splits & checks date, wrap around for check_date function
* @param string $date a date string in the format YYYY-MM-DD
* @return bool true if valid date, false if date not valid
*/
public static function checkDate($date): bool
{
if (!$date) {
return false;
}
list ($year, $month, $day) = array_pad(
preg_split("/[\/-]/", $date) ?: [],
3,
null
);
if (!$year || !$month || !$day) {
return false;
}
if (!checkdate((int)$month, (int)$day, (int)$year)) {
return false;
}
return true;
}
/**
* splits & checks date, wrap around for check_date function
* @param string $datetime date (YYYY-MM-DD) + time (HH:MM:SS), SS can be dropped
* @return bool true if valid date, false if date not valid
*/
public static function checkDateTime(string $datetime): bool
{
if (!$datetime) {
return false;
}
list ($year, $month, $day, $hour, $min, $sec) = array_pad(
preg_split("/[\/\- :]/", $datetime) ?: [],
6,
null
);
if (!$year || !$month || !$day) {
return false;
}
if (!checkdate((int)$month, (int)$day, (int)$year)) {
return false;
}
if (!is_numeric($hour) || !is_numeric($min)) {
return false;
}
if (
($hour < 0 || $hour > 24) ||
($min < 0 || $min > 60) ||
(is_numeric($sec) && ($sec < 0 || $sec > 60))
) {
return false;
}
return true;
}
/**
* plits & checks date, wrap around for check_date function
* returns int in:
* -1 if the first date is smaller the last
* 0 if both are equal
* 1 if the first date is bigger than the last
* false (bool): error
* @param string $start_date start date string in YYYY-MM-DD
* @param string $end_date end date string in YYYY-MM-DD
* @return int|bool false on error, or int -1/0/1 as difference
*/
public static function compareDate($start_date, $end_date)
{
// pre check for empty or wrong
if ($start_date == '--' || $end_date == '--' || !$start_date || !$end_date) {
return false;
}
// splits the data up with / or -
list ($start_year, $start_month, $start_day) = array_pad(
preg_split('/[\/-]/', $start_date) ?: [],
3,
null
);
list ($end_year, $end_month, $end_day) = array_pad(
preg_split('/[\/-]/', $end_date) ?: [],
3,
null
);
// check that month & day are two digits and then combine
foreach (['start', 'end'] as $prefix) {
foreach (['month', 'day'] as $date_part) {
$_date = $prefix . '_' . $date_part;
if (isset($$_date) && $$_date < 10 && !preg_match("/^0/", $$_date)) {
$$_date = '0' . $$_date;
}
}
$_date = $prefix . '_date';
$$_date = '';
foreach (['year', 'month', 'day'] as $date_part) {
$_sub_date = $prefix . '_' . $date_part;
$$_date .= $$_sub_date;
}
}
// now do the compare
if ($start_date < $end_date) {
return -1;
} elseif ($start_date == $end_date) {
return 0;
} elseif ($start_date > $end_date) {
return 1;
} else {
return false;
}
}
/**
* compares the two dates + times. if seconds missing in one set, add :00, converts / to -
* returns int/bool in:
* -1 if the first date is smaller the last
* 0 if both are equal
* 1 if the first date is bigger than the last
* false if no valid date/times chould be found
* @param string $start_datetime start date/time in YYYY-MM-DD HH:mm:ss
* @param string $end_datetime end date/time in YYYY-MM-DD HH:mm:ss
* @return int|bool false for error or -1/0/1 as difference
*/
public static function compareDateTime($start_datetime, $end_datetime)
{
// pre check for empty or wrong
if ($start_datetime == '--' || $end_datetime == '--' || !$start_datetime || !$end_datetime) {
return false;
}
$start_timestamp = strtotime($start_datetime);
$end_timestamp = strtotime($end_datetime);
if ($start_timestamp < $end_timestamp) {
return -1;
} elseif ($start_timestamp == $end_timestamp) {
return 0;
} elseif ($start_timestamp > $end_timestamp) {
return 1;
} else {
return false;
}
}
/**
* calculates the days between two dates
* return: overall days, week days, weekend days as array 0...2 or named
* as overall, weekday and weekend
* @param string $start_date valid start date (y/m/d)
* @param string $end_date valid end date (y/m/d)
* @param bool $return_named return array type, false (default), true for named
* @return array<mixed> 0/overall, 1/weekday, 2/weekend
*/
public static function calcDaysInterval($start_date, $end_date, bool $return_named = false): array
{
// pos 0 all, pos 1 weekday, pos 2 weekend
$days = [];
$start = new \DateTime($start_date);
$end = new \DateTime($end_date);
// so we include the last day too, we need to add +1 second in the time
$end->setTime(0, 0, 1);
$days[0] = $end->diff($start)->days;
$days[1] = 0;
$days[2] = 0;
$period = new \DatePeriod($start, new \DateInterval('P1D'), $end);
foreach ($period as $dt) {
$curr = $dt->format('D');
if ($curr == 'Sat' || $curr == 'Sun') {
$days[2] ++;
} else {
$days[1] ++;
}
}
if ($return_named === true) {
return [
'overall' => $days[0],
'weekday' => $days[1],
'weekend' => $days[2]
];
} else {
return $days;
}
}
}
// __END__

View File

@@ -0,0 +1,149 @@
<?php
/*
* image thumbnail, rotate, etc
*/
declare(strict_types=1);
namespace CoreLibs\Convert;
class Byte
{
// define byteFormat
public const BYTE_FORMAT_NOSPACE = 1;
public const BYTE_FORMAT_ADJUST = 2;
public const BYTE_FORMAT_SI = 4;
/**
* This function replaces the old byteStringFormat
*
* Converts any number string to human readable byte format
* Maxium is Exobytes and above that the Exobytes suffix is used for all
* If more are needed only the correct short name for the suffix has to be
* added to the labels array
* On no number string it returns string as is
* Source Idea: SOURCE: https://programming.guide/worlds-most-copied-so-snippet.html
*
* The class itself hast the following defined
* BYTE_FORMAT_NOSPACE [1] turn off spaces between number and extension
* BYTE_FORMAT_ADJUST [2] use sprintf to always print two decimals
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
* To use the constant from outside use class::CONSTANT
* @param string|int|float $bytes bytes as string int or pure int
* @param int $flags bitwise flag with use space turned on
* @return string converted byte number (float) with suffix
*/
public static function humanReadableByteFormat($bytes, int $flags = 0): string
{
// if not numeric, return as is
if (is_numeric($bytes)) {
// flags bit wise check
// remove space between number and suffix
if ($flags & self::BYTE_FORMAT_NOSPACE) {
$space = false;
} else {
$space = true;
}
// use sprintf instead of round
if ($flags & self::BYTE_FORMAT_ADJUST) {
$adjust = true;
} else {
$adjust = false;
}
// use SI 1000 mod and not 1024 mod
if ($flags & self::BYTE_FORMAT_SI) {
$si = true;
} else {
$si = false;
}
// si or normal
$unit = $si ? 1000 : 1024;
// always positive
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs($bytes);
// smaller than unit is always B
if ($abs_bytes < $unit) {
return $bytes . 'B';
}
// labels in order of size [Y, Z]
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
// exp position calculation
$exp = floor(log($abs_bytes, $unit));
// avoid printing out anything larger than max labels
if ($exp >= count($labels)) {
$exp = count($labels) - 1;
}
// deviation calculation
$dev = pow($unit, $exp) * ($unit - 0.05);
// shift the exp +1 for on the border units
if (
$exp < 6 &&
$abs_bytes > ($dev - (((int)$dev & 0xfff) == 0xd00 ? 52 : 0))
) {
$exp++;
}
// label name, including leading space if flagged
$pre = ($space ? ' ' : '') . ($labels[$exp] ?? '>E') . ($si ? 'i' : '') . 'B';
$bytes_calc = $abs_bytes / pow($unit, $exp);
// if original is negative, reverse
if ($bytes < 0) {
$bytes_calc *= -1;
}
if ($adjust) {
return sprintf("%.2f%s", $bytes_calc, $pre);
} else {
return round($bytes_calc, 2) . $pre;
}
} else {
// if anything other return as string
return (string)$bytes;
}
}
/**
* calculates the bytes based on a string with nnG, nnGB, nnM, etc
* NOTE: large exabyte numbers will overflow
* flag allowed:
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
* @param string|int|float $number any string or number to convert
* @param int $flags bitwise flag with use space turned on
* @return string|int|float converted value or original value
*/
public static function stringByteFormat($number, int $flags = 0)
{
// use SI 1000 mod and not 1024 mod
if ($flags & self::BYTE_FORMAT_SI) {
$si = true;
} else {
$si = false;
}
// matches in regex
$matches = [];
// all valid units
$valid_units_ = 'bkmgtpezy';
// detects up to exo bytes
preg_match(
"/([\d.,]*)\s?(eib|pib|tib|gib|mib|kib|eb|pb|tb|gb|mb|kb|e|p|t|g|m|k|b)$/i",
strtolower((string)$number),
$matches
);
if (isset($matches[1]) && isset($matches[2])) {
// remove all non valid characters from the number
$number = preg_replace('/[^0-9\.]/', '', $matches[1]);
// final clean up and convert to float
$number = (float)trim($number);
// convert any mb/gb/etc to single m/b
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[2]);
if ($unit) {
$number = $number * pow($si ? 1000 : 1024, stripos($valid_units_, $unit[0]) ?: 0);
}
// convert to INT to avoid +E output
$number = (int)round($number);
}
// if not matching return as is
return $number;
}
}
// __END__

View File

@@ -0,0 +1,310 @@
<?php
/*
* Convert color spaces
* hex to rgb
* rgb to hex
* rgb to hsb
* hsb to rgb
* rgb to hsl
* hsl to rgb
*/
declare(strict_types=1);
namespace CoreLibs\Convert;
class Colors
{
/**
* converts a hex RGB color to the int numbers
* @param string $hexStr RGB hexstring
* @param bool $returnAsString flag to return as string
* @param string $seperator string seperator: default: ","
* @return string|array<string,float|int>|bool false on error or array with RGB
* or a string with the seperator
*/
public static function hex2rgb(string $hexStr, bool $returnAsString = false, string $seperator = ',')
{
$hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
if (!is_string($hexStr)) {
return false;
}
$rgbArray = [];
if (strlen($hexStr) == 6) {
// If a proper hex code, convert using bitwise operation. No overhead... faster
$colorVal = hexdec($hexStr);
$rgbArray['R'] = 0xFF & ($colorVal >> 0x10);
$rgbArray['G'] = 0xFF & ($colorVal >> 0x8);
$rgbArray['B'] = 0xFF & $colorVal;
} elseif (strlen($hexStr) == 3) {
// If shorthand notation, need some string manipulations
$rgbArray['R'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
$rgbArray['G'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
$rgbArray['B'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
} else {
// Invalid hex color code
return false;
}
// returns the rgb string or the associative array
return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray;
}
/**
* converts the rgb values from int data to the valid rgb html hex string
* optional can turn of leading #
* @param int $red red 0-255
* @param int $green green 0-255
* @param int $blue blue 0-255
* @param bool $hex_prefix default true, prefix with "#"
* @return string rgb in hex values with leading # if set
*/
public static function rgb2hex(int $red, int $green, int $blue, bool $hex_prefix = true): string
{
$hex_color = '';
if ($hex_prefix === true) {
$hex_color = '#';
}
foreach (['red', 'green', 'blue'] as $color) {
// if not valid, set to gray
if ($$color < 0 || $$color > 255) {
$$color = 125;
}
// pad left with 0
$hex_color .= str_pad(dechex($$color), 2, '0', STR_PAD_LEFT);
}
return $hex_color;
}
/**
* converts RGB to HSB/V values
* returns:
* array with hue (0-360), sat (0-100%), brightness/value (0-100%)
* @param int $red red 0-255
* @param int $green green 0-255
* @param int $blue blue 0-255
* @return array<int|float> Hue, Sat, Brightness/Value
*/
public static function rgb2hsb(int $red, int $green, int $blue): array
{
// check that rgb is from 0 to 255
foreach (['red', 'green', 'blue'] as $c) {
if ($$c < 0 || $$c > 255) {
$$c = 0;
}
$$c = $$c / 255;
}
$MAX = max($red, $green, $blue);
$MIN = min($red, $green, $blue);
$HUE = 0;
if ($MAX == $MIN) {
return [0, 0, round($MAX * 100)];
}
if ($red == $MAX) {
$HUE = ($green - $blue) / ($MAX - $MIN);
} elseif ($green == $MAX) {
$HUE = 2 + (($blue - $red) / ($MAX - $MIN));
} elseif ($blue == $MAX) {
$HUE = 4 + (($red - $green) / ($MAX - $MIN));
}
$HUE *= 60;
if ($HUE < 0) {
$HUE += 360;
}
return [
(int)round($HUE),
(int)round((($MAX - $MIN) / $MAX) * 100),
(int)round($MAX * 100)
];
}
/**
* converts HSB/V to RGB values RGB is full INT
* @param int $H hue 0-360
* @param int $S saturation 0-100 (int)
* @param int $V brightness/value 0-100 (int)
* @return array<int> 0 red/1 green/2 blue array as 0-255
*/
public static function hsb2rgb(int $H, int $S, int $V): array
{
// check that H is 0 to 359, 360 = 0
// and S and V are 0 to 1
if ($H < 0 || $H > 359) {
$H = 0;
}
if ($S < 0 || $S > 100) {
$S = 0;
}
if ($V < 0 || $V > 100) {
$V = 0;
}
// convert to internal 0-1 format
$S /= 100;
$V /= 100;
if ($S == 0) {
return [$V * 255, $V * 255, $V * 255];
}
$Hi = floor($H / 60);
$f = ($H / 60) - $Hi;
$p = $V * (1 - $S);
$q = $V * (1 - ($S * $f));
$t = $V * (1 - ($S * (1 - $f)));
switch ($Hi) {
case 0:
$red = $V;
$green = $t;
$blue = $p;
break;
case 1:
$red = $q;
$green = $V;
$blue = $p;
break;
case 2:
$red = $p;
$green = $V;
$blue = $t;
break;
case 3:
$red = $p;
$green = $q;
$blue = $V;
break;
case 4:
$red = $t;
$green = $p;
$blue = $V;
break;
case 5:
$red = $V;
$green = $p;
$blue = $q;
break;
default:
$red = 0;
$green = 0;
$blue = 0;
}
return [
(int)round($red * 255),
(int)round($green * 255),
(int)round($blue * 255)
];
}
/**
* converts a RGB (0-255) to HSL
* return:
* array with hue (0-360), saturation (0-100%) and luminance (0-100%)
* @param int $red red 0-255
* @param int $green green 0-255
* @param int $blue blue 0-255
* @return array<float> hue/sat/luminance
*/
public static function rgb2hsl(int $red, int $green, int $blue): array
{
// check that rgb is from 0 to 255
foreach (['red', 'green', 'blue'] as $c) {
if ($$c < 0 || $$c > 255) {
$$c = 0;
}
$$c = $$c / 255;
}
$min = min($red, $green, $blue);
$max = max($red, $green, $blue);
$chroma = $max - $min;
$sat = 0;
$hue = 0;
// luminance
$lum = ($max + $min) / 2;
// achromatic
if ($chroma == 0) {
// H, S, L
return [0.0, 0.0, round($lum * 100, 1)];
} else {
$sat = $chroma / (1 - abs(2 * $lum - 1));
if ($max == $red) {
$hue = fmod((($green - $blue) / $chroma), 6);
if ($hue < 0) {
$hue = (6 - fmod(abs($hue), 6));
}
} elseif ($max == $green) {
$hue = ($blue - $red) / $chroma + 2;
} elseif ($max == $blue) {
$hue = ($red - $green) / $chroma + 4;
}
$hue = $hue * 60;
// $sat = 1 - abs(2 * $lum - 1);
return [
round($hue, 1),
round($sat * 100, 1),
round($lum * 100, 1)
];
}
}
/**
* converts an HSL to RGB
* @param int $hue hue: 0-360 (degrees)
* @param float $sat saturation: 0-100
* @param float $lum luminance: 0-100
* @return array<int,float|int> red/blue/green 0-255 each
*/
public static function hsl2rgb(int $hue, float $sat, float $lum): array
{
if ($hue < 0 || $hue > 359) {
$hue = 0;
}
if ($sat < 0 || $sat > 100) {
$sat = 0;
}
if ($lum < 0 || $lum > 100) {
$lum = 0;
}
$hue = (1 / 360) * $hue; // calc to internal convert value for hue
// convert to internal 0-1 format
$sat /= 100;
$lum /= 100;
// if saturation is 0
if ($sat == 0) {
return [$lum * 255, $lum * 255, $lum * 255];
} else {
$m2 = $lum < 0.5 ? $lum * ($sat + 1) : ($lum + $sat) - ($lum * $sat);
$m1 = $lum * 2 - $m2;
$hueue = function ($base) use ($m1, $m2) {
// base = hue, hue > 360 (1) - 360 (1), else < 0 + 360 (1)
$base = $base < 0 ? $base + 1 : ($base > 1 ? $base - 1 : $base);
// 6: 60, 2: 180, 3: 240
// 2/3 = 240
// 1/3 = 120 (all from 360)
if ($base * 6 < 1) {
return $m1 + ($m2 - $m1) * $base * 6;
}
if ($base * 2 < 1) {
return $m2;
}
if ($base * 3 < 2) {
return $m1 + ($m2 - $m1) * ((2 / 3) - $base) * 6;
}
return $m1;
};
return [
(int)round(255 * $hueue($hue + (1 / 3))),
(int)round(255 * $hueue($hue)),
(int)round(255 * $hueue($hue - (1 / 3)))
];
}
}
}
// __END__

View File

@@ -0,0 +1,62 @@
<?php
/*
* html convert functions
*/
declare(strict_types=1);
namespace CoreLibs\Convert;
class Html
{
/**
* full wrapper for html entities
* @param mixed $string string to html encode
* @return mixed if string, encoded, else as is (eg null)
*/
public static function htmlent($string)
{
if (is_string($string)) {
return htmlentities($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
} else {
return $string;
}
}
/**
* strips out all line breaks or replaced with given string
* @param string $string string
* @param string $replace replace character, default ' '
* @return string cleaned string without any line breaks
*/
public static function removeLB(string $string, string $replace = ' '): string
{
return str_replace(["\r", "\n"], $replace, $string);
}
/**
* returns 'checked' or 'selected' if okay
* $needle is a var, $haystack an array or a string
* **** THE RETURN: VALUE WILL CHANGE TO A DEFAULT NULL IF NOT FOUND ****
* @param array<mixed>|string $haystack (search in) haystack can be an array or a string
* @param string $needle needle (search for)
* @param int $type type: 0: returns selected, 1, returns checked
* @return ?string returns checked or selected, else returns null
*/
public static function checked($haystack, $needle, int $type = 0): ?string
{
if (is_array($haystack)) {
if (in_array((string)$needle, $haystack)) {
return $type ? 'checked' : 'selected';
}
} else {
if ($haystack == $needle) {
return $type ? 'checked' : 'selected';
}
}
return null;
}
}
// __END__

View File

@@ -0,0 +1,53 @@
<?php
/*
* various math related function wrappers
*/
declare(strict_types=1);
namespace CoreLibs\Convert;
class Math
{
/**
* some float numbers will be rounded up even if they have no decimal entries
* this function fixes this by pre-rounding before calling ceil
* @param float $number number to round
* @param int|integer $precision intermediat round up decimals (default 10)
* @return float correct ceil number
*/
public static function fceil(float $number, int $precision = 10): float
{
return ceil(round($number, $precision));
}
/**
* round inside an a number, not the decimal part only
* eg 48767 with -2 -> 48700
* @param float $number number to round
* @param int $precision negative number for position in number (default -2)
* @return float rounded number
*/
public static function floorp(float $number, int $precision = -2): float
{
$mult = pow(10, $precision); // Can be cached in lookup table
return floor($number * $mult) / $mult;
}
/**
* inits input to 0, if value is not numeric
* @param string|int|float $number string or number to check
* @return float if not number, then returns 0, else original input
*/
public static function initNumeric($number): float
{
if (!is_numeric($number)) {
return 0;
} else {
return (float)$number;
}
}
}
// __END__

View File

@@ -0,0 +1,79 @@
<?php
/*
* Translates a mime id string into the actual application or file name
* for example 'text/plain' will output 'Text file'
*/
declare(strict_types=1);
namespace CoreLibs\Convert;
class MimeAppName
{
/** @var array<string,string> */
private static $mime_apps = [];
/**
* constructor: init mime list
*/
public function __construct()
{
self::$mime_apps = [
// zip
'application/zip' => 'Zip File',
// Powerpoint
'application/vnd.ms-powerpoint' => 'Microsoft Powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'Microsoft Powerpoint',
// PDF
'pplication/pdf' => 'PDF',
// JPEG
'image/jpeg' => 'JPEG',
// PNG
'image/png' => 'PNG',
// Indesign
'application/x-indesign' => 'Adobe InDesign',
// Photoshop
'image/vnd.adobe.photoshop' => 'Adobe Photoshop',
'application/photoshop' => 'Adobe Photoshop',
// Illustrator
'application/illustrator' => 'Adobe Illustrator',
// Word
'application/vnd.ms-word' => 'Microsoft Word',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'Microsoft Word',
// Excel
'application/vnd.ms-excel' => 'Microsoft Excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'Microsoft Excel',
// plain text
'text/plain' => 'Text file',
// html
'text/html' => 'HTML',
// mp4 (max 45MB each)
'video/mpeg' => 'MPEG Video'
];
}
/**
* Sets or updates a mime type
* @param string $mime MIME Name, no validiation
* @param string $app Applicaiton name
* @return void
*/
public static function mimeSetAppName(string $mime, string $app): void
{
self::$mime_apps[$mime] = $app;
}
/**
* get the application name from mime type
* if not set returns "Other file"
* @param string $mime MIME Name
* @return string Application name matching
*/
public static function mimeGetAppName(string $mime): string
{
return self::$mime_apps[$mime] ?? 'Other file';
}
}
// __END__

View File

@@ -0,0 +1,80 @@
<?php
/*
* hash wrapper functions for old problem fixes
*/
declare(strict_types=1);
namespace CoreLibs\Create;
class Hash
{
/**
* checks php version and if >=5.2.7 it will flip the string
* can return empty string if none of string sets work
* hash returns false
* preg_replace fails for older php version
* @param string $string string to crc
* @return string crc32b hash (old type)
*/
public static function __crc32b(string $string): string
{
// do normal hash crc32b
$string = hash('crc32b', $string);
// if bigger than 5.2.7, we need to "unfix" the fix
if (\CoreLibs\Check\PhpVersion::checkPHPVersion('5.2.7')) {
// flip it back to old (two char groups)
$string = preg_replace("/^([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})([a-z0-9]{2})$/", "$4$3$2$1", $string);
}
if (!is_string($string)) {
$string = '';
}
return $string;
}
/**
* replacement for __crc32b call
* @param string $string string to hash
* @param bool $use_sha use sha instead of crc32b (default false)
* @return string hash of the string
*/
public static function __sha1Short(string $string, bool $use_sha = false): string
{
if ($use_sha) {
// return only the first 9 characters
return substr(hash('sha1', $string), 0, 9);
} else {
return self::__crc32b($string);
}
}
/**
* replacemend for __crc32b call (alternate)
* defaults to adler 32
* allowed adler32, fnv132, fnv1a32, joaat
* all that create 8 char long hashes
* @param string $string string to hash
* @param string $hash_type hash type (default adler32)
* @return string hash of the string
*/
public static function __hash(string $string, string $hash_type = 'adler32'): string
{
if (!in_array($hash_type, ['adler32', 'fnv132', 'fnv1a32', 'joaat'])) {
$hash_type = 'adler32';
}
return hash($hash_type, $string);
}
/**
* create a unique id with the standard hash type defined in __hash
*
* @return string Unique ID with fixed length of 8 characters
*/
public static function __uniqId(): string
{
return self::__hash(uniqid((string)rand(), true));
}
}
// __END__

View File

@@ -0,0 +1,113 @@
<?php
/*
* html convert functions
*/
declare(strict_types=1);
namespace CoreLibs\Create;
class RandomKey
{
// key generation
/** @var array<mixed> */
private static $key_range = [];
/** @var int */
private static $one_key_length;
/** @var int */
private static $key_length = 4; // default key length
/** @var int */
private static $max_key_length = 256; // max allowed length
/**
* if launched as class, init random key data first
*/
public function __construct()
{
$this->initRandomKeyData();
}
/**
* sets the random key range with the default values
* @return void has no return
*/
private static function initRandomKeyData()
{
// random key generation
self::$key_range = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9'));
self::$one_key_length = count(self::$key_range);
}
/**
* validates they key length for random string generation
* @param int $key_length key length
* @return bool true for valid, false for invalid length
*/
private static function validateRandomKeyLenght(int $key_length): bool
{
if (
is_numeric($key_length) &&
$key_length > 0 &&
$key_length <= self::$max_key_length
) {
return true;
} else {
return false;
}
}
/**
* sets the key length and checks that they key given is valid
* if failed it will not change the default key length and return false
* @param int $key_length key length
* @return bool true/false for set status
*/
public static function setRandomKeyLength(int $key_length): bool
{
// only if valid int key with valid length
if (self::validateRandomKeyLenght($key_length) === true) {
self::$key_length = $key_length;
return true;
} else {
return false;
}
}
/**
* get the current set random key length
*
* @return int Current set key length
*/
public static function getRandomKeyLength(): int
{
return self::$key_length;
}
/**
* creates a random key based on the key_range with key_length
* if override key length is set, it will check on valid key and use this
* this will not set the class key length variable
* @param int $key_length key length override, -1 for use default
* @return string random key
*/
public static function randomKeyGen(int $key_length = -1): string
{
// init random key strings if not set
if (!is_numeric(self::$one_key_length)) {
self::initRandomKeyData();
}
$use_key_length = 0;
// only if valid int key with valid length
if (self::validateRandomKeyLenght($key_length) === true) {
$use_key_length = $key_length;
} else {
$use_key_length = self::$key_length;
}
$pieces = [];
for ($i = 1; $i <= $use_key_length; $i++) {
$pieces[] = self::$key_range[random_int(0, self::$one_key_length - 1)];
}
return join('', $pieces);
}
}

View File

@@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
namespace CoreLibs\Create;
class Uids
{
/**
* creates psuedo random uuid v4
* Code take from class here:
* https://www.php.net/manual/en/function.uniqid.php#94959
* @return string pseudo random uuid v4
*/
public static function uuidv4(): string
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
// 16 bits for "time_mid"
mt_rand(0, 0xffff),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
mt_rand(0, 0x0fff) | 0x4000,
// 16 bits, 8 bits for "clk_seq_hi_res",
// 8 bits for "clk_seq_low",
// two most significant bits holds zero and one for variant DCE1.1
mt_rand(0, 0x3fff) | 0x8000,
// 48 bits for "node"
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff)
);
}
/**
* TODO: make this a proper uniq ID creation
* add uuidv4 subcall to the uuid function too
* creates a uniq id
* @param string $type uniq id type, currently md5 or sha256 allowed
* if not set will use DEFAULT_HASH if set
* @return string uniq id
*/
public static function uniqId(string $type = ''): string
{
$uniq_id = '';
switch ($type) {
case 'md5':
$uniq_id = md5(uniqid((string)rand(), true));
break;
case 'sha256':
$uniq_id = hash('sha256', uniqid((string)rand(), true));
break;
default:
$hash = 'sha256';
if (defined(DEFAULT_HASH)) {
$hash = DEFAULT_HASH;
}
$uniq_id = hash($hash, uniqid((string)rand(), true));
break;
}
return $uniq_id;
}
}
// __END__

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/********************************************************************* /*********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2002/12/17 * CREATED: 2002/12/17
@@ -10,14 +11,6 @@
* table from the connected DB. * table from the connected DB.
* you don't have to write any SQL queries, worry over update/insert * you don't have to write any SQL queries, worry over update/insert
* *
* PUBLIC VARIABLES
*
* PRIVATE VARIABLES
*
* PUBLIC METHOD:S
*
* PRIVATE METHOD:S
*
* HISTORY: * HISTORY:
* 2019/9/11 (cs) error string 21->91, 22->92 for not overlapping with IO * 2019/9/11 (cs) error string 21->91, 22->92 for not overlapping with IO
* 2005/07/07 (cs) updated array class for postgres: set 0 & NULL if int field given, insert uses () values () syntax * 2005/07/07 (cs) updated array class for postgres: set 0 & NULL if int field given, insert uses () values () syntax
@@ -37,22 +30,28 @@
// as it actually has nothing to do with this one here ? (or at least // as it actually has nothing to do with this one here ? (or at least
// put into separete function in this class) // put into separete function in this class)
declare(strict_types=1);
namespace CoreLibs\DB\Extended; namespace CoreLibs\DB\Extended;
// subclass for one array handling // subclass for one array handling
class ArrayIO extends \CoreLibs\DB\IO class ArrayIO extends \CoreLibs\DB\IO
{ {
// main calss variables // main calss variables
/** @var array<mixed> */
public $table_array; // the array from the table to work on public $table_array; // the array from the table to work on
/** @var string */
public $table_name; // the table_name public $table_name; // the table_name
/** @var string */
public $pk_name; // the primary key from this table public $pk_name; // the primary key from this table
/** @var int|string|null */
public $pk_id; // the PK id public $pk_id; // the PK id
/** /**
* constructor for the array io class, set the * constructor for the array io class, set the
* primary key name automatically (from array) * primary key name automatically (from array)
* @param array $db_config db connection config * @param array<mixed> $db_config db connection config
* @param array $table_array table array config * @param array<mixed> $table_array table array config
* @param string $table_name table name string * @param string $table_name table name string
*/ */
public function __construct(array $db_config, array $table_array, string $table_name) public function __construct(array $db_config, array $table_array, string $table_name)
@@ -105,11 +104,6 @@ class ArrayIO extends \CoreLibs\DB\IO
return $text; return $text;
} }
// METHOD: convertEntities
// WAS : convert_entities
// PARAMS: string -> string to be changed
// RETURN: string -> altered string
// DESC : changeds all HTML entities into non HTML ones
/** /**
* changeds all HTML entities into non HTML ones * changeds all HTML entities into non HTML ones
* @param string $text encoded html string * @param string $text encoded html string
@@ -139,7 +133,7 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
// add output to internal error_msg // add output to internal error_msg
if ($write === true) { if ($write === true) {
$this->error_msg['db'] .= $string; $this->__dbDebug('dbArray', $string);
} }
return $string; return $string;
} }
@@ -184,11 +178,11 @@ class ArrayIO extends \CoreLibs\DB\IO
/** /**
* deletes one dataset * deletes one dataset
* @param array $table_array optional override for table array set * @param array<mixed> $table_array optional override for table array set
* set this as new table array too * set this as new table array too
* @return array returns the table array that was deleted * @return array<mixed> returns the table array that was deleted
*/ */
public function dbDelete($table_array = array()) public function dbDelete($table_array = [])
{ {
// is array and has values, override set and set new // is array and has values, override set and set new
if (is_array($table_array) && count($table_array)) { if (is_array($table_array) && count($table_array)) {
@@ -205,7 +199,8 @@ class ArrayIO extends \CoreLibs\DB\IO
$q_where = ''; $q_where = '';
foreach ($this->table_array as $column => $data_array) { foreach ($this->table_array as $column => $data_array) {
// suchen nach bildern und lschen ... // suchen nach bildern und lschen ...
if (!empty($this->table_array[$column]['file']) && if (
!empty($this->table_array[$column]['file']) &&
file_exists($this->table_array[$column]['url'] . $this->table_array[$column]['value']) file_exists($this->table_array[$column]['url'] . $this->table_array[$column]['value'])
) { ) {
if (file_exists($this->table_array[$column]['path'] . $this->table_array[$column]['value'])) { if (file_exists($this->table_array[$column]['path'] . $this->table_array[$column]['value'])) {
@@ -244,10 +239,10 @@ class ArrayIO extends \CoreLibs\DB\IO
/** /**
* reads one row into the array * reads one row into the array
* @param boolean $edit on true convert data, else as is * @param boolean $edit on true convert data, else as is
* @param array $table_array optional table array, overwrites internal set array * @param array<mixed> $table_array optional table array, overwrites internal set array
* @return array set table array with values * @return array<mixed> set table array with values
*/ */
public function dbRead($edit = false, $table_array = array()) public function dbRead($edit = false, $table_array = [])
{ {
// if array give, overrules internal array // if array give, overrules internal array
if (is_array($table_array) && count($table_array)) { if (is_array($table_array) && count($table_array)) {
@@ -285,16 +280,18 @@ class ArrayIO extends \CoreLibs\DB\IO
// if query was executed okay, else set error // if query was executed okay, else set error
if ($this->dbExec($q)) { if ($this->dbExec($q)) {
if ($res = $this->dbFetchArray()) { if (is_array($res = $this->dbFetchArray())) {
reset($this->table_array); reset($this->table_array);
foreach ($this->table_array as $column => $data_array) { foreach ($this->table_array as $column => $data_array) {
// wenn "edit" dann gib daten wie in DB zurück, ansonten aufbereiten fr ausgabe // wenn "edit" dann gib daten wie in DB zurück, ansonten aufbereiten fr ausgabe
// ?? sollte das nicht drauen ??? man weis ja net was da drin steht --> is noch zu berlegen // ?? sollte das nicht drauen ??? man weis ja net was da drin steht --> is noch zu berlegen
// echo 'EDIT: $edit | Spalte: $column | type: '.$this->table_array[$column]['type'].' | Res: '.$res[$column].'<br>'; // $this->log->debug('DB READ', 'EDIT: $edit | Spalte: $column | type: '
// .$this->table_array[$column]['type'].' | Res: '.$res[$column]);
if ($edit) { if ($edit) {
$this->table_array[$column]['value'] = $res[$column]; $this->table_array[$column]['value'] = $res[$column];
// if password, also write to hidden // if password, also write to hidden
if (isset($this->table_array[$column]['type']) && if (
isset($this->table_array[$column]['type']) &&
$this->table_array[$column]['type'] == 'password' $this->table_array[$column]['type'] == 'password'
) { ) {
$this->table_array[$column]['HIDDEN_value'] = $res[$column]; $this->table_array[$column]['HIDDEN_value'] = $res[$column];
@@ -317,10 +314,10 @@ class ArrayIO extends \CoreLibs\DB\IO
/** /**
* writes one set into DB or updates one set (if PK exists) * writes one set into DB or updates one set (if PK exists)
* @param boolean $addslashes old convert entities and set set escape * @param boolean $addslashes old convert entities and set set escape
* @param array $table_array optional table array, overwrites internal one * @param array<mixed> $table_array optional table array, overwrites internal one
* @return array table array or null * @return array<mixed> table array or null
*/ */
public function dbWrite($addslashes = false, $table_array = array()) public function dbWrite($addslashes = false, $table_array = [])
{ {
if (is_array($table_array) && count($table_array)) { if (is_array($table_array) && count($table_array)) {
$this->table_array = $table_array; $this->table_array = $table_array;
@@ -373,7 +370,7 @@ class ArrayIO extends \CoreLibs\DB\IO
//echo 'Dn: $file_name'; //echo 'Dn: $file_name';
copy($this->table_array[$column]['tmp'], $this->table_array[$column]['path'] . $file_name); copy($this->table_array[$column]['tmp'], $this->table_array[$column]['path'] . $file_name);
// automatisch thumbnail generieren, geht nur mit convert (ImageMagic!!!), aber nur bei bild .. // automatisch thumbnail generieren, geht nur mit convert (ImageMagic!!!), aber nur bei bild ..
if (strtolower($ext) == 'jpeg' || strtolower($ext) == 'jpg' || strtolower($ext) == 'gif' || strtolower($ext) == 'png') { if (in_array(strtolower($ext), ['jpeg', 'jpg', 'gif', 'png'])) {
$file_name_tn = $name . '_tn.' . $ext; $file_name_tn = $name . '_tn.' . $ext;
$input = $this->table_array[$column]['path'] . $file_name; $input = $this->table_array[$column]['path'] . $file_name;
$output = $this->table_array[$column]['path'] . $file_name_tn; $output = $this->table_array[$column]['path'] . $file_name_tn;
@@ -391,13 +388,15 @@ class ArrayIO extends \CoreLibs\DB\IO
/********************************* END FILE **************************************/ /********************************* END FILE **************************************/
// do not write 'pk' (primary key) or 'view' values // do not write 'pk' (primary key) or 'view' values
if (!isset($this->table_array[$column]['pk']) && if (
!isset($this->table_array[$column]['pk']) &&
isset($this->table_array[$column]['type']) && isset($this->table_array[$column]['type']) &&
$this->table_array[$column]['type'] != 'view' && $this->table_array[$column]['type'] != 'view' &&
strlen($column) > 0 strlen($column) > 0
) { ) {
// for password use hidden value if main is not set // for password use hidden value if main is not set
if (isset($this->table_array[$column]['type']) && if (
isset($this->table_array[$column]['type']) &&
$this->table_array[$column]['type'] == 'password' && $this->table_array[$column]['type'] == 'password' &&
empty($this->table_array[$column]['value']) empty($this->table_array[$column]['value'])
) { ) {
@@ -420,15 +419,18 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
// integer is different // integer is different
if (isset($this->table_array[$column]['int']) || isset($this->table_array[$column]['int_null'])) { if (isset($this->table_array[$column]['int']) || isset($this->table_array[$column]['int_null'])) {
$this->debug('write_check', '['.$column.']['.$this->table_array[$column]['value'].']['.$this->table_array[$column]['type'].'] '. $this->log->debug('WRITE CHECK', '[' . $column . '][' . $this->table_array[$column]['value'] . ']'
'VALUE SET: '.(string)isset($this->table_array[$column]['value']). . '[' . $this->table_array[$column]['type'] . '] '
' | INT NULL: '.(string)isset($this->table_array[$column]['int_null'])); . 'VALUE SET: ' . (string)isset($this->table_array[$column]['value'])
if (isset($this->table_array[$column]['value']) && . ' | INT NULL: ' . (string)isset($this->table_array[$column]['int_null']));
if (
isset($this->table_array[$column]['value']) &&
!$this->table_array[$column]['value'] && !$this->table_array[$column]['value'] &&
isset($this->table_array[$column]['int_null']) isset($this->table_array[$column]['int_null'])
) { ) {
$_value = 'NULL'; $_value = 'NULL';
} elseif (!isset($this->table_array[$column]['value']) || } elseif (
!isset($this->table_array[$column]['value']) ||
(isset($this->table_array[$column]['value']) && !$this->table_array[$column]['value']) (isset($this->table_array[$column]['value']) && !$this->table_array[$column]['value'])
) { ) {
$_value = 0; $_value = 0;
@@ -441,7 +443,8 @@ class ArrayIO extends \CoreLibs\DB\IO
$q_data .= "'" . $this->dbBoolean($this->table_array[$column]['value'], true) . "'"; $q_data .= "'" . $this->dbBoolean($this->table_array[$column]['value'], true) . "'";
} elseif (isset($this->table_array[$column]['interval'])) { } elseif (isset($this->table_array[$column]['interval'])) {
// for interval we check if no value, then we set null // for interval we check if no value, then we set null
if (!isset($this->table_array[$column]['value']) || if (
!isset($this->table_array[$column]['value']) ||
(isset($this->table_array[$column]['value']) && !$this->table_array[$column]['value']) (isset($this->table_array[$column]['value']) && !$this->table_array[$column]['value'])
) { ) {
$_value = 'NULL'; $_value = 'NULL';
@@ -455,9 +458,14 @@ class ArrayIO extends \CoreLibs\DB\IO
} else { } else {
// if the error check is json, we set field to null if NOT set // if the error check is json, we set field to null if NOT set
// else normal string write // else normal string write
if (isset($this->table_array[$column]['error_check']) && if (
isset($this->table_array[$column]['error_check']) &&
$this->table_array[$column]['error_check'] == 'json' && $this->table_array[$column]['error_check'] == 'json' &&
(!isset($this->table_array[$column]['value']) || (isset($this->table_array[$column]['value']) && !$this->table_array[$column]['value'])) (
!isset($this->table_array[$column]['value']) ||
(isset($this->table_array[$column]['value']) &&
!$this->table_array[$column]['value'])
)
) { ) {
$q_data .= 'NULL'; $q_data .= 'NULL';
} else { } else {
@@ -465,7 +473,9 @@ class ArrayIO extends \CoreLibs\DB\IO
$q_data .= "'"; $q_data .= "'";
// if add slashes do convert & add slashes else write AS is // if add slashes do convert & add slashes else write AS is
if ($addslashes) { if ($addslashes) {
$q_data .= $this->dbEscapeString($this->convertEntities($this->table_array[$column]['value'])); $q_data .= $this->dbEscapeString(
$this->convertEntities($this->table_array[$column]['value'])
);
} else { } else {
$q_data .= $this->dbEscapeString($this->table_array[$column]['value']); $q_data .= $this->dbEscapeString($this->table_array[$column]['value']);
} }
@@ -493,11 +503,12 @@ class ArrayIO extends \CoreLibs\DB\IO
if (!$this->table_array[$this->pk_name]['value']) { if (!$this->table_array[$this->pk_name]['value']) {
// max id, falls INSERT // max id, falls INSERT
$q = 'SELECT MAX(' . $this->pk_name . ') + 1 AS pk_id FROM ' . $this->table_name; $q = 'SELECT MAX(' . $this->pk_name . ') + 1 AS pk_id FROM ' . $this->table_name;
$res = $this->dbReturnRow($q); if (is_array($res = $this->dbReturnRow($q))) {
if (!isset($res['pk_id'])) { $pk_id = $res['pkd_id'];
$res['pk_id'] = 1; } else {
$pk_id = 1;
} }
$this->table_array[$this->pk_name]['value'] = $res['pk_id']; $this->table_array[$this->pk_name]['value'] = $pk_id;
} }
if (!$insert) { if (!$insert) {
@@ -527,12 +538,18 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
// set primary key // set primary key
if ($insert) { if ($insert) {
$this->table_array[$this->pk_name]['value'] = $this->insert_id; // FIXME: this has to be fixes by fixing DB::IO clas
$this->pk_id = $this->insert_id; $insert_id = $this->dbGetInsertPK();
if (is_array($insert_id)) {
$insert_id = 0;
}
$this->table_array[$this->pk_name]['value'] = $insert_id;
$this->pk_id = $insert_id;
} }
// return the table if needed // return the table if needed
return $this->table_array; return $this->table_array;
} }
} // end of class // end of class
}
// __END__ // __END__

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,5 @@
<?php declare(strict_types=1); <?php
/********************************************************************* /*********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2003/04/09 * CREATED: 2003/04/09
@@ -11,7 +12,9 @@
* HISTORY: * HISTORY:
* 2008/04/16 (cs) wrapper for pg escape string * 2008/04/16 (cs) wrapper for pg escape string
* 2007/01/11 (cs) add prepare/execute for postgres * 2007/01/11 (cs) add prepare/execute for postgres
* 2006/09/12 (cs) in case db_query retuns false, save the query and run the query through the send/get procedure to get correct error data from the db * 2006/09/12 (cs) in case db_query retuns false, save the query and
* run the query through the send/get procedure to get
* correct error data from the db
* 2006/06/26 (cs) added port for db connection * 2006/06/26 (cs) added port for db connection
* 2006/04/03 (cs) added meta data for table * 2006/04/03 (cs) added meta data for table
* 2005/07/25 (cs) removed the plural s remove, not needed and not 100% working * 2005/07/25 (cs) removed the plural s remove, not needed and not 100% working
@@ -41,11 +44,15 @@
* *
*/ */
declare(strict_types=1);
namespace CoreLibs\DB\SQL; namespace CoreLibs\DB\SQL;
class PgSQL class PgSQL
{ {
/** @var string */
private $last_error_query; private $last_error_query;
/** @var resource|bool */
private $dbh; private $dbh;
/** /**
@@ -76,6 +83,9 @@ class PgSQL
public function __dbQuery(string $query) public function __dbQuery(string $query)
{ {
$this->last_error_query = ''; $this->last_error_query = '';
if (!is_resource($this->dbh)) {
return false;
}
// read out the query status and save the query if needed // read out the query status and save the query if needed
$result = pg_query($this->dbh, $query); $result = pg_query($this->dbh, $query);
if (!$result) { if (!$result) {
@@ -91,7 +101,11 @@ class PgSQL
*/ */
public function __dbSendQuery(string $query): bool public function __dbSendQuery(string $query): bool
{ {
return pg_send_query($this->dbh, $query); if (!is_resource($this->dbh)) {
return false;
}
$result = pg_send_query($this->dbh, $query);
return $result ? true : false;
} }
/** /**
@@ -101,7 +115,13 @@ class PgSQL
public function __dbGetResult() public function __dbGetResult()
{ {
$this->last_error_query = ''; $this->last_error_query = '';
if (!is_resource($this->dbh)) {
return false;
}
$result = pg_get_result($this->dbh); $result = pg_get_result($this->dbh);
if (!is_resource($result)) {
return false;
}
if ($error = pg_result_error($result)) { if ($error = pg_result_error($result)) {
$this->last_error_query = $error; $this->last_error_query = $error;
} }
@@ -114,12 +134,13 @@ class PgSQL
*/ */
public function __dbClose(): void public function __dbClose(): void
{ {
if (is_resource($this->dbh)) { if (!is_resource($this->dbh)) {
return;
}
if (pg_connection_status($this->dbh) === PGSQL_CONNECTION_OK) { if (pg_connection_status($this->dbh) === PGSQL_CONNECTION_OK) {
pg_close($this->dbh); pg_close($this->dbh);
} }
} }
}
/** /**
* wrapper for pg_prepare * wrapper for pg_prepare
@@ -129,6 +150,9 @@ class PgSQL
*/ */
public function __dbPrepare(string $name, string $query) public function __dbPrepare(string $name, string $query)
{ {
if (!is_resource($this->dbh)) {
return false;
}
$result = pg_prepare($this->dbh, $name, $query); $result = pg_prepare($this->dbh, $name, $query);
if (!$result) { if (!$result) {
$this->last_error_query = $query; $this->last_error_query = $query;
@@ -139,11 +163,14 @@ class PgSQL
/** /**
* wrapper for pg_execute for running a prepared statement * wrapper for pg_execute for running a prepared statement
* @param string $name statement name * @param string $name statement name
* @param array $data data array * @param array<mixed> $data data array
* @return resource|bool returns status or false for error * @return resource|bool returns status or false for error
*/ */
public function __dbExecute(string $name, array $data) public function __dbExecute(string $name, array $data)
{ {
if (!is_resource($this->dbh)) {
return false;
}
$result = pg_execute($this->dbh, $name, $data); $result = pg_execute($this->dbh, $name, $data);
if (!$result) { if (!$result) {
$this->last_error_query = $name; $this->last_error_query = $name;
@@ -187,7 +214,7 @@ class PgSQL
* if through/true false, use __dbResultType(true) * if through/true false, use __dbResultType(true)
* @param resource $cursor cursor resource * @param resource $cursor cursor resource
* @param int $result_type result type as int number * @param int $result_type result type as int number
* @return array|bool array result data or false on end/error * @return array<mixed>|bool array result data or false on end/error
*/ */
public function __dbFetchArray($cursor, int $result_type = PGSQL_BOTH) public function __dbFetchArray($cursor, int $result_type = PGSQL_BOTH)
{ {
@@ -212,7 +239,7 @@ class PgSQL
/** /**
* wrapper for pg_fetch_all * wrapper for pg_fetch_all
* @param resource $cursor cursor resource * @param resource $cursor cursor resource
* @return array|bool data array or false for end/error * @return array<mixed>|bool data array or false for end/error
*/ */
public function __dbFetchAll($cursor) public function __dbFetchAll($cursor)
{ {
@@ -235,10 +262,10 @@ class PgSQL
* this only works if db schema is after "no plural names. and pk name is table name + _id * this only works if db schema is after "no plural names. and pk name is table name + _id
* detects schema prefix in table name * detects schema prefix in table name
* @param string $query query string * @param string $query query string
* @param string $pk_name primary key name, if '' then auto detect * @param string|null $pk_name primary key name, if '' then auto detect
* @return string|int primary key value * @return string|int|false primary key value
*/ */
public function __dbInsertId(string $query, string $pk_name) public function __dbInsertId(string $query, ?string $pk_name)
{ {
// only if an insert has been done // only if an insert has been done
if (preg_match("/^insert /i", $query)) { if (preg_match("/^insert /i", $query)) {
@@ -253,7 +280,7 @@ class PgSQL
$table = $_table; $table = $_table;
} }
// no PK name given at all // no PK name given at all
if (!$pk_name) { if (empty($pk_name)) {
// if name is plurar, make it singular // if name is plurar, make it singular
// if (preg_match("/.*s$/i", $table)) // if (preg_match("/.*s$/i", $table))
// $table = substr($table, 0, -1); // $table = substr($table, 0, -1);
@@ -264,11 +291,18 @@ class PgSQL
$q = "SELECT CURRVAL('$seq') AS insert_id"; $q = "SELECT CURRVAL('$seq') AS insert_id";
// I have to do manually or I overwrite the original insert internal vars ... // I have to do manually or I overwrite the original insert internal vars ...
if ($q = $this->__dbQuery($q)) { if ($q = $this->__dbQuery($q)) {
list($id) = $this->__dbFetchArray($q); // abort if this is not an resource
if (!is_resource($q)) {
return false;
}
list($id) = $this->__dbFetchArray($q) ?: [];
} else { } else {
$id = array(-1, $q); $id = [-1, $q];
} }
return $id; return $id;
} else {
//if not insert, return false
return false;
} }
} }
@@ -286,32 +320,44 @@ class PgSQL
if ($schema) { if ($schema) {
$q = "SHOW search_path"; $q = "SHOW search_path";
$cursor = $this->__dbQuery($q); $cursor = $this->__dbQuery($q);
$search_path = $this->__dbFetchArray($cursor)['search_path']; if (!is_resource($cursor)) {
return false;
}
$__db_fetch_array = $this->__dbFetchArray($cursor);
if (!is_array($__db_fetch_array)) {
return false;
}
$search_path = $__db_fetch_array['search_path'] ?? '';
if ($search_path != $schema) { if ($search_path != $schema) {
$table_prefix = $schema . '.'; $table_prefix = $schema . '.';
} }
} }
// read from table the PK name // read from table the PK name
// faster primary key get // faster primary key get
$q = "SELECT pg_attribute.attname AS column_name, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type "; $q = "SELECT pg_attribute.attname AS column_name, "
$q .= "FROM pg_index, pg_class, pg_attribute "; . "format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type "
. "FROM pg_index, pg_class, pg_attribute ";
if ($schema) { if ($schema) {
$q .= ", pg_namespace "; $q .= ", pg_namespace ";
} }
$q .= "WHERE "; $q .= "WHERE "
// regclass translates the OID to the name // regclass translates the OID to the name
$q .= "pg_class.oid = '".$table_prefix.$table."'::regclass AND "; . "pg_class.oid = '" . $table_prefix . $table . "'::regclass AND "
$q .= "indrelid = pg_class.oid AND "; . "indrelid = pg_class.oid AND ";
if ($schema) { if ($schema) {
$q .= "nspname = '".$schema."' AND "; $q .= "nspname = '" . $schema . "' AND "
$q .= "pg_class.relnamespace = pg_namespace.oid AND "; . "pg_class.relnamespace = pg_namespace.oid AND ";
} }
$q .= "pg_attribute.attrelid = pg_class.oid AND "; $q .= "pg_attribute.attrelid = pg_class.oid AND "
$q .= "pg_attribute.attnum = any(pg_index.indkey) "; . "pg_attribute.attnum = any(pg_index.indkey) "
$q .= "AND indisprimary"; . "AND indisprimary";
$cursor = $this->__dbQuery($q); $cursor = $this->__dbQuery($q);
if ($cursor) { if (is_resource($cursor)) {
return $this->__dbFetchArray($cursor)['column_name'] ?? false; $__db_fetch_array = $this->__dbFetchArray($cursor);
if (!is_array($__db_fetch_array)) {
return false;
}
return $__db_fetch_array['column_name'] ?? false;
} else { } else {
return false; return false;
} }
@@ -328,19 +374,25 @@ class PgSQL
* @param string $db_name databse name * @param string $db_name databse name
* @param integer $db_port port (int, 5432 is default) * @param integer $db_port port (int, 5432 is default)
* @param string $db_ssl SSL (allow is default) * @param string $db_ssl SSL (allow is default)
* @return ?resource db handler resource or null on error * @return resource|bool db handler resource or false on error
*/ */
public function __dbConnect(string $db_host, string $db_user, string $db_pass, string $db_name, int $db_port = 5432, string $db_ssl = 'allow') public function __dbConnect(
{ string $db_host,
string $db_user,
string $db_pass,
string $db_name,
int $db_port = 5432,
string $db_ssl = 'allow'
) {
// to avoid empty db_port // to avoid empty db_port
if (!$db_port) { if (!$db_port) {
$db_port = 5432; $db_port = 5432;
} }
$this->dbh = pg_connect("host=".$db_host." port=".$db_port." user=".$db_user." password=".$db_pass." dbname=".$db_name." sslmode=".$db_ssl); $this->dbh = pg_connect("host=" . $db_host . " port=" . $db_port . " user="
if (!$this->dbh) { . $db_user . " password=" . $db_pass . " dbname=" . $db_name . " sslmode=" . $db_ssl);
die("<!-- Can't connect [host=".$db_host." port=".$db_port." user=".$db_user." password=XXXX dbname=".$db_name." sslmode=".$db_ssl."] //-->"); // if (!$this->dbh) {
return null; // die("<!-- Can't connect to database //-->");
} // }
return $this->dbh; return $this->dbh;
} }
@@ -352,6 +404,9 @@ class PgSQL
*/ */
public function __dbPrintError($cursor = null): string public function __dbPrintError($cursor = null): string
{ {
if (!is_resource($this->dbh)) {
return '';
}
// run the query again for the error result here // run the query again for the error result here
if (!$cursor && $this->last_error_query) { if (!$cursor && $this->last_error_query) {
pg_send_query($this->dbh, $this->last_error_query); pg_send_query($this->dbh, $this->last_error_query);
@@ -369,10 +424,13 @@ class PgSQL
* wrapper for pg_meta_data * wrapper for pg_meta_data
* @param string $table table name * @param string $table table name
* @param bool $extended show extended info (default false) * @param bool $extended show extended info (default false)
* @return array|bool array data for the table info or false on error * @return array<mixed>|bool array data for the table info or false on error
*/ */
public function __dbMetaData(string $table, $extended = false) public function __dbMetaData(string $table, $extended = false)
{ {
if (!is_resource($this->dbh)) {
return false;
}
// needs to prefixed with @ or it throws a warning on not existing table // needs to prefixed with @ or it throws a warning on not existing table
return @pg_meta_data($this->dbh, $table, $extended); return @pg_meta_data($this->dbh, $table, $extended);
} }
@@ -384,6 +442,9 @@ class PgSQL
*/ */
public function __dbEscapeString($string): string public function __dbEscapeString($string): string
{ {
if (!is_resource($this->dbh)) {
return '';
}
return pg_escape_string($this->dbh, (string)$string); return pg_escape_string($this->dbh, (string)$string);
} }
@@ -396,6 +457,9 @@ class PgSQL
*/ */
public function __dbEscapeLiteral($string): string public function __dbEscapeLiteral($string): string
{ {
if (!is_resource($this->dbh)) {
return '';
}
return pg_escape_string($this->dbh, (string)$string); return pg_escape_string($this->dbh, (string)$string);
} }
@@ -406,6 +470,9 @@ class PgSQL
*/ */
public function __dbEscapeBytea($bytea): string public function __dbEscapeBytea($bytea): string
{ {
if (!is_resource($this->dbh)) {
return '';
}
return pg_escape_bytea($this->dbh, $bytea); return pg_escape_bytea($this->dbh, $bytea);
} }
@@ -415,6 +482,9 @@ class PgSQL
*/ */
public function __dbConnectionBusy(): bool public function __dbConnectionBusy(): bool
{ {
if (!is_resource($this->dbh)) {
return false;
}
return pg_connection_busy($this->dbh); return pg_connection_busy($this->dbh);
} }
@@ -426,6 +496,9 @@ class PgSQL
*/ */
public function __dbVersion(): string public function __dbVersion(): string
{ {
if (!is_resource($this->dbh)) {
return '';
}
// array has client, protocol, server // array has client, protocol, server
// we just need the server // we just need the server
$v = pg_version($this->dbh); $v = pg_version($this->dbh);
@@ -435,16 +508,17 @@ class PgSQL
/** /**
* postgresql array to php array * postgresql array to php array
* @param string $text array text from PostgreSQL * @param string $text array text from PostgreSQL
* @param array $output (internal) recursive pass on for nested arrays * @param array<mixed> $output (internal) recursive pass on for nested arrays
* @param bool|int $limit (internal) max limit to not overshoot the end, start with false * @param bool|int $limit (internal) max limit to not overshoot
* the end, start with false
* @param integer $offset (internal) shift offset for {} * @param integer $offset (internal) shift offset for {}
* @return array|int converted PHP array, interal recusrive int position * @return array<mixed>|int converted PHP array, interal recusrive int position
*/ */
public function __dbArrayParse($text, &$output, $limit = false, $offset = 1) public function __dbArrayParse($text, &$output, $limit = false, $offset = 1)
{ {
if (false === $limit) { if (false === $limit) {
$limit = strlen($text) - 1; $limit = strlen($text) - 1;
$output = array(); $output = [];
} }
if ('{}' != $text) { if ('{}' != $text) {
do { do {

Some files were not shown because too many files have changed in this diff Show More