Compare commits

...

27 Commits

Author SHA1 Message Date
Clemens Schwaighofer
9c7b3cea83 SQL Interface docstring fix 2022-12-14 13:53:54 +09:00
Clemens Schwaighofer
26af6a07f4 PHP unit tests updates for class changes 2022-12-09 16:53:10 +09:00
Clemens Schwaighofer
b7c6d4b478 DB\IO add unescape bytea data 2022-12-09 16:33:58 +09:00
Clemens Schwaighofer
9936fc04da Convert\Byte class fix string in abs call 2022-12-09 16:33:47 +09:00
Clemens Schwaighofer
1e0dfa2106 Update documentation for Convert\Byte Class
add more info in parameters flag
2022-12-09 13:43:15 +09:00
Clemens Schwaighofer
3af6f6a8f0 edit interface, hard set edit.css style sheet 2022-12-07 06:56:47 +09:00
Clemens Schwaighofer
1e793c0d16 Switch all SQL from tab to spaces 2022-12-06 09:27:08 +09:00
Clemens Schwaighofer
5be34453ce Fix in Smarty Template class and PAGE WIDTH set 2022-11-10 10:26:59 +09:00
Clemens Schwaighofer
7773b78e17 Fix in CoreLib Bytes for null to trim 2022-11-09 18:11:14 +09:00
Clemens Schwaighofer
2a3798c8c2 Create mo file update, basic edit css/javascript updates 2022-10-25 16:48:34 +09:00
Clemens Schwaighofer
bc8303fe5f Composer update 2022-10-25 16:48:12 +09:00
Clemens Schwaighofer
ba89b188d9 Mo create script update, phpstan fixes, document updates
create_mo:
set auto base folder bases on current location so we do not need do
adjust paths in script

phpstan fixes:
edit_base.php
CoreLibs/Basci.php
CoreLibs/DB/SQL/PgSQL.php

Update documentation in method headers
CoreLibs/Combined/DateTime.php
2022-10-12 09:48:22 +09:00
Clemens Schwaighofer
d15618cde4 Add JS_TRANSLATE file to smart template flow 2022-10-04 17:35:46 +09:00
Clemens Schwaighofer
0fd89727e9 Update Output\Form to allow ACL controlled edit/view entries
Fixed phpunit test runs with encoding test run and not resetting the
subsitute character back to default

Note: There are mime encoding failures for php 7.4 and 8.0 and one ACL
login failure test for php 7.4
2022-09-06 11:17:03 +09:00
Clemens Schwaighofer
a8e75d158b Update composer installed packages 2022-09-06 11:16:33 +09:00
Clemens Schwaighofer
4b3fbaa309 Updates based on latest phpstan run 2022-09-02 17:00:22 +09:00
Clemens Schwaighofer
1a6c65df0e Minor test updates, comment typo updates, DB_CONFIG_SET for default
$DB_CONFIG_SET is now default current selcted db config instead of
$DB_CONFIG so to not overwrite the array itself
2022-08-05 12:43:57 +09:00
Clemens Schwaighofer
24f553a17e Update comments for split element counter 2022-07-29 13:20:54 +09:00
Clemens Schwaighofer
9a3ea2f7db update strings class with split counter method 2022-07-29 13:19:45 +09:00
Clemens Schwaighofer
bcdb877d90 Phan/phpstan fixes 2022-07-29 11:06:53 +09:00
Clemens Schwaighofer
6d0e528c38 Combined\Datetime date/number to weekday conversion
Convert functions for date or weekday number to weekday name or date to
weekday number
2022-07-29 11:02:25 +09:00
Clemens Schwaighofer
7e6474195b String split format fix for non ascii characters
Currently just abort and return string as is
2022-07-29 10:38:32 +09:00
Clemens Schwaighofer
1795d3ba6c String convert class added
Currently with one method: splitFormatString

Converts a string to a string with separater characters based on a
format string
2022-07-29 07:00:02 +09:00
Clemens Schwaighofer
e1340acf55 Class header info string fix 2022-07-29 06:59:33 +09:00
Clemens Schwaighofer
b5ead3e266 Minor code block comment clean ups 2022-07-15 17:42:38 +09:00
Clemens Schwaighofer
f5daaca598 Fixes for Create\Email docstrings 2022-07-08 17:25:45 +09:00
Clemens Schwaighofer
6b4f310cd2 Email\Sending add dedicated kv folding flag
kv folding is now done via flag and only if an encoded is detected that
is japanese or UTF-8
2022-07-04 15:45:51 +09:00
457 changed files with 4725 additions and 26521 deletions

View File

@@ -1,13 +1,15 @@
#!/usr/bin/env bash #!/usr/bin/env bash
base_folder='/var/www/html/developers/clemens/core_data/php_libraries/trunk/www/'; BASE_FOLDER=$(dirname $(readlink -f $0))"/";
# Assume script is in 4dev/bin
base_folder="${BASE_FOLDER}../../www/";
# locale gettext po to mo translator master # locale gettext po to mo translator master
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
file=$(basename $file .po); file=$(basename $file .po);
echo "Translate language ${file}";
locale=$(echo "${file}" | cut -d "-" -f 1); locale=$(echo "${file}" | cut -d "-" -f 1);
domain=$(echo "${file}" | cut -d "-" -f 2); domain=$(echo "${file}" | cut -d "-" -f 2);
echo "- Translate language file '${file}' for locale '${locale}' and domain '${domain}':";
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/"; mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
fi; fi;

View File

@@ -3,26 +3,26 @@
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
$$ $$
DECLARE DECLARE
myrec RECORD; myrec RECORD;
v_uid VARCHAR; v_uid VARCHAR;
BEGIN BEGIN
-- skip if NEW.name is not set -- skip if NEW.name is not set
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
-- use NEW.name as base, remove all spaces -- use NEW.name as base, remove all spaces
-- name data is already unique, so we do not need to worry about this here -- name data is already unique, so we do not need to worry about this here
v_uid := REPLACE(NEW.name, ' ', ''); v_uid := REPLACE(NEW.name, ' ', '');
IF TG_OP = 'INSERT' THEN IF TG_OP = 'INSERT' THEN
-- always set -- always set
NEW.uid := v_uid; NEW.uid := v_uid;
ELSIF TG_OP = 'UPDATE' THEN ELSIF TG_OP = 'UPDATE' THEN
-- check if not set, then set -- check if not set, then set
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id; SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
IF FOUND THEN IF FOUND THEN
NEW.uid := v_uid; NEW.uid := v_uid;
END IF; END IF;
END IF; END IF;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -3,26 +3,26 @@
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
$$ $$
DECLARE DECLARE
myrec RECORD; myrec RECORD;
v_uid VARCHAR; v_uid VARCHAR;
BEGIN BEGIN
-- skip if NEW.name is not set -- skip if NEW.name is not set
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
-- use NEW.name as base, remove all spaces -- use NEW.name as base, remove all spaces
-- name data is already unique, so we do not need to worry about this here -- name data is already unique, so we do not need to worry about this here
v_uid := REPLACE(NEW.name, ' ', ''); v_uid := REPLACE(NEW.name, ' ', '');
IF TG_OP = 'INSERT' THEN IF TG_OP = 'INSERT' THEN
-- always set -- always set
NEW.uid := v_uid; NEW.uid := v_uid;
ELSIF TG_OP = 'UPDATE' THEN ELSIF TG_OP = 'UPDATE' THEN
-- check if not set, then set -- check if not set, then set
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id; SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
IF FOUND THEN IF FOUND THEN
NEW.uid := v_uid; NEW.uid := v_uid;
END IF; END IF;
END IF; END IF;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -9,142 +9,142 @@ CREATE OR REPLACE FUNCTION edit_log_insert_trigger ()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
DECLARE DECLARE
start_date DATE := '2010-01-01'; start_date DATE := '2010-01-01';
end_date DATE; end_date DATE;
timeformat TEXT := 'YYYY'; timeformat TEXT := 'YYYY';
selector TEXT := 'year'; selector TEXT := 'year';
base_table TEXT := 'edit_log'; base_table TEXT := 'edit_log';
_interval INTERVAL := '1 ' || selector; _interval INTERVAL := '1 ' || selector;
_interval_next INTERVAL := '2 ' || selector; _interval_next INTERVAL := '2 ' || selector;
table_name TEXT; table_name TEXT;
-- compare date column -- compare date column
compare_date DATE := NEW.event_date; compare_date DATE := NEW.event_date;
compare_date_name TEXT := 'event_date'; compare_date_name TEXT := 'event_date';
-- the create commands -- the create commands
command_create_table TEXT := 'CREATE TABLE IF NOT EXISTS {TABLE_NAME} (CHECK({COMPARE_DATE_NAME} >= {START_DATE} AND {COMPARE_DATE_NAME} < {END_DATE})) INHERITS ({BASE_NAME})'; command_create_table TEXT := 'CREATE TABLE IF NOT EXISTS {TABLE_NAME} (CHECK({COMPARE_DATE_NAME} >= {START_DATE} AND {COMPARE_DATE_NAME} < {END_DATE})) INHERITS ({BASE_NAME})';
command_create_primary_key TEXT := 'ALTER TABLE {TABLE_NAME} ADD PRIMARY KEY ({BASE_TABLE}_id)'; command_create_primary_key TEXT := 'ALTER TABLE {TABLE_NAME} ADD PRIMARY KEY ({BASE_TABLE}_id)';
command_create_foreign_key_1 TEXT := 'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT {TABLE_NAME}_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL'; command_create_foreign_key_1 TEXT := 'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT {TABLE_NAME}_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL';
command_create_trigger_1 TEXT = 'CREATE TRIGGER trg_{TABLE_NAME} BEFORE INSERT OR UPDATE ON {TABLE_NAME} FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()'; command_create_trigger_1 TEXT = 'CREATE TRIGGER trg_{TABLE_NAME} BEFORE INSERT OR UPDATE ON {TABLE_NAME} FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()';
BEGIN BEGIN
-- we are in valid start time area -- we are in valid start time area
IF (NEW.event_date >= start_date) THEN IF (NEW.event_date >= start_date) THEN
-- current table name -- current table name
table_name := base_table || '_' || to_char(NEW.event_date, timeformat); table_name := base_table || '_' || to_char(NEW.event_date, timeformat);
BEGIN BEGIN
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW; EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
-- if insert failed because of missing table, create new below -- if insert failed because of missing table, create new below
EXCEPTION EXCEPTION
WHEN undefined_table THEN WHEN undefined_table THEN
-- another block, so in case the creation fails here too -- another block, so in case the creation fails here too
BEGIN BEGIN
-- create new table here + all indexes -- create new table here + all indexes
start_date := date_trunc(selector, NEW.event_date); start_date := date_trunc(selector, NEW.event_date);
end_date := date_trunc(selector, NEW.event_date + _interval); end_date := date_trunc(selector, NEW.event_date + _interval);
-- creat table -- creat table
EXECUTE format(REPLACE( -- end date EXECUTE format(REPLACE( -- end date
REPLACE( -- start date REPLACE( -- start date
REPLACE( -- compare date name REPLACE( -- compare date name
REPLACE( -- base name (inherit) REPLACE( -- base name (inherit)
REPLACE( -- table name REPLACE( -- table name
command_create_table, command_create_table,
'{TABLE_NAME}', '{TABLE_NAME}',
table_name table_name
), ),
'{BASE_NAME}', '{BASE_NAME}',
base_table base_table
), ),
'{COMPARE_DATE_NAME}', '{COMPARE_DATE_NAME}',
compare_date_name compare_date_name
), ),
'{START_DATE}', '{START_DATE}',
quote_literal(start_date) quote_literal(start_date)
), ),
'{END_DATE}', '{END_DATE}',
quote_literal(end_date) quote_literal(end_date)
)); ));
-- create all indexes and triggers -- create all indexes and triggers
EXECUTE format(REPLACE( EXECUTE format(REPLACE(
REPLACE( REPLACE(
command_create_primary_key, command_create_primary_key,
'{TABLE_NAME}', '{TABLE_NAME}',
table_name table_name
), ),
'{BASE_TABLE}', '{BASE_TABLE}',
base_table base_table
)); ));
-- FK constraints -- FK constraints
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name)); EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
-- generic trigger -- generic trigger
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name)); EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
-- insert try again -- insert try again
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW; EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
EXCEPTION EXCEPTION
WHEN OTHERS THEN WHEN OTHERS THEN
-- if this faled, throw it into the overflow table (so we don't loose anything) -- if this faled, throw it into the overflow table (so we don't loose anything)
INSERT INTO edit_log_overflow VALUES (NEW.*); INSERT INTO edit_log_overflow VALUES (NEW.*);
END; END;
-- other errors, insert into overlow -- other errors, insert into overlow
WHEN OTHERS THEN WHEN OTHERS THEN
-- if this faled, throw it into the overflow table (so we don't loose anything) -- if this faled, throw it into the overflow table (so we don't loose anything)
INSERT INTO edit_log_overflow VALUES (NEW.*); INSERT INTO edit_log_overflow VALUES (NEW.*);
END; END;
-- main insert run done, check if we have to create next months table -- main insert run done, check if we have to create next months table
BEGIN BEGIN
-- check if next month table exists -- check if next month table exists
table_name := base_table || '_' || to_char((SELECT NEW.event_date + _interval)::DATE, timeformat); table_name := base_table || '_' || to_char((SELECT NEW.event_date + _interval)::DATE, timeformat);
-- RAISE NOTICE 'SEARCH NEXT: %', table_name; -- RAISE NOTICE 'SEARCH NEXT: %', table_name;
IF (SELECT to_regclass(table_name)) IS NULL THEN IF (SELECT to_regclass(table_name)) IS NULL THEN
-- move inner interval same -- move inner interval same
start_date := date_trunc(selector, NEW.event_date + _interval); start_date := date_trunc(selector, NEW.event_date + _interval);
end_date := date_trunc(selector, NEW.event_date + _interval_next); end_date := date_trunc(selector, NEW.event_date + _interval_next);
-- RAISE NOTICE 'CREATE NEXT: %', table_name; -- RAISE NOTICE 'CREATE NEXT: %', table_name;
-- create table -- create table
EXECUTE format(REPLACE( -- end date EXECUTE format(REPLACE( -- end date
REPLACE( -- start date REPLACE( -- start date
REPLACE( -- compare date name REPLACE( -- compare date name
REPLACE( -- base name (inherit) REPLACE( -- base name (inherit)
REPLACE( -- table name REPLACE( -- table name
command_create_table, command_create_table,
'{TABLE_NAME}', '{TABLE_NAME}',
table_name table_name
), ),
'{BASE_NAME}', '{BASE_NAME}',
base_table base_table
), ),
'{COMPARE_DATE_NAME}', '{COMPARE_DATE_NAME}',
compare_date_name compare_date_name
), ),
'{START_DATE}', '{START_DATE}',
quote_literal(start_date) quote_literal(start_date)
), ),
'{END_DATE}', '{END_DATE}',
quote_literal(end_date) quote_literal(end_date)
)); ));
-- create all indexes and triggers -- create all indexes and triggers
EXECUTE format(REPLACE( EXECUTE format(REPLACE(
REPLACE( REPLACE(
command_create_primary_key, command_create_primary_key,
'{TABLE_NAME}', '{TABLE_NAME}',
table_name table_name
), ),
'{BASE_TABLE}', '{BASE_TABLE}',
base_table base_table
)); ));
-- FK constraints -- FK constraints
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name)); EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
-- generic trigger -- generic trigger
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name)); EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
END IF; END IF;
EXCEPTION EXCEPTION
WHEN OTHERS THEN WHEN OTHERS THEN
RAISE NOTICE 'Failed to create next table: %', table_name; RAISE NOTICE 'Failed to create next table: %', table_name;
END; END;
ELSE ELSE
-- if outside valid date, insert into overflow -- if outside valid date, insert into overflow
INSERT INTO edit_log_overflow VALUES (NEW.*); INSERT INTO edit_log_overflow VALUES (NEW.*);
END IF; END IF;
RETURN NULL; RETURN NULL;
END END
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -5,22 +5,22 @@ CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
BEGIN BEGIN
-- if new is not null/empty -- if new is not null/empty
-- and old one is null or old one different new one -- and old one is null or old one different new one
-- set NOW() -- set NOW()
-- if new one is NULL -- if new one is NULL
-- set NULL -- set NULL
IF IF
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id) (OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
THEN THEN
NEW.login_user_id_set_date = NOW(); NEW.login_user_id_set_date = NOW();
NEW.login_user_id_last_revalidate = NOW(); NEW.login_user_id_last_revalidate = NOW();
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
NEW.login_user_id_set_date = NULL; NEW.login_user_id_set_date = NULL;
NEW.login_user_id_last_revalidate = NULL; NEW.login_user_id_last_revalidate = NULL;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -4,15 +4,15 @@ CREATE FUNCTION random_string(randomLength int)
RETURNS text AS RETURNS text AS
$$ $$
SELECT array_to_string( SELECT array_to_string(
ARRAY( ARRAY(
SELECT substring( SELECT substring(
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
trunc(random() * 62)::int + 1, trunc(random() * 62)::int + 1,
1 1
) )
FROM generate_series(1, randomLength) AS gs(x) FROM generate_series(1, randomLength) AS gs(x)
), ),
'' ''
) )
$$ $$
LANGUAGE SQL LANGUAGE SQL

View File

@@ -4,12 +4,12 @@ CREATE OR REPLACE FUNCTION set_date()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
BEGIN BEGIN
IF TG_OP = 'INSERT' THEN IF TG_OP = 'INSERT' THEN
NEW.date_created := 'now'; NEW.date_created := 'now';
ELSIF TG_OP = 'UPDATE' THEN ELSIF TG_OP = 'UPDATE' THEN
NEW.date_updated := 'now'; NEW.date_updated := 'now';
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -4,15 +4,15 @@ CREATE OR REPLACE FUNCTION set_edit_generic()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
DECLARE DECLARE
random_length INT = 12; -- that should be long enough random_length INT = 25; -- that should be long enough
BEGIN BEGIN
IF TG_OP = 'INSERT' THEN IF TG_OP = 'INSERT' THEN
NEW.date_created := 'now'; NEW.date_created := 'now';
NEW.cuid := random_string(random_length); NEW.cuid := random_string(random_length);
ELSIF TG_OP = 'UPDATE' THEN ELSIF TG_OP = 'UPDATE' THEN
NEW.date_updated := 'now'; NEW.date_updated := 'now';
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -5,17 +5,17 @@ CREATE OR REPLACE FUNCTION set_generic()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
DECLARE DECLARE
random_length INT = 32; -- long for massive data random_length INT = 32; -- long for massive data
BEGIN BEGIN
IF TG_OP = 'INSERT' THEN IF TG_OP = 'INSERT' THEN
NEW.date_created := 'now'; NEW.date_created := 'now';
IF NEW.uid IS NULL THEN IF NEW.uid IS NULL THEN
NEW.uid := random_string(random_length); NEW.uid := random_string(random_length);
END IF; END IF;
ELSIF TG_OP = 'UPDATE' THEN ELSIF TG_OP = 'UPDATE' THEN
NEW.date_updated := 'now'; NEW.date_updated := 'now';
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -4,12 +4,12 @@ CREATE OR REPLACE FUNCTION set_uid()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
DECLARE DECLARE
random_length INT = 32; -- that should be long enough random_length INT = 32; -- that should be long enough
BEGIN BEGIN
IF TG_OP = 'INSERT' THEN IF TG_OP = 'INSERT' THEN
NEW.uid := random_string(random_length); NEW.uid := random_string(random_length);
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -6,14 +6,14 @@
-- RETURNS TRIGGER AS -- RETURNS TRIGGER AS
-- $$ -- $$
-- BEGIN -- BEGIN
-- IF TG_OP = 'INSERT' THEN -- IF TG_OP = 'INSERT' THEN
-- NEW.date_created := clock_timestamp(); -- NEW.date_created := clock_timestamp();
-- NEW.user_created := current_user; -- NEW.user_created := current_user;
-- ELSIF TG_OP = 'UPDATE' THEN -- ELSIF TG_OP = 'UPDATE' THEN
-- NEW.date_updated := clock_timestamp(); -- NEW.date_updated := clock_timestamp();
-- NEW.user_updated := current_user; -- NEW.user_updated := current_user;
-- END IF; -- END IF;
-- RETURN NEW; -- RETURN NEW;
-- END; -- END;
-- $$ -- $$
-- LANGUAGE 'plpgsql'; -- LANGUAGE 'plpgsql';

View File

@@ -7,13 +7,13 @@
-- DROP TABLE edit_access; -- DROP TABLE edit_access;
CREATE TABLE edit_access ( CREATE TABLE edit_access (
edit_access_id SERIAL PRIMARY KEY, edit_access_id SERIAL PRIMARY KEY,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
protected SMALLINT DEFAULT 0, protected SMALLINT DEFAULT 0,
deleted SMALLINT DEFAULT 0, deleted SMALLINT DEFAULT 0,
uid VARCHAR, uid VARCHAR,
name VARCHAR UNIQUE, name VARCHAR UNIQUE,
description VARCHAR, description VARCHAR,
color VARCHAR, color VARCHAR,
additional_acl JSONB additional_acl JSONB
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,12 +7,12 @@
-- DROP TABLE edit_access_data; -- DROP TABLE edit_access_data;
CREATE TABLE edit_access_data ( CREATE TABLE edit_access_data (
edit_access_data_id SERIAL PRIMARY KEY, edit_access_data_id SERIAL PRIMARY KEY,
edit_access_id INT NOT NULL, edit_access_id INT NOT NULL,
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
name VARCHAR, name VARCHAR,
value VARCHAR value VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;
-- create a unique index for each attached data block for each edit access can -- create a unique index for each attached data block for each edit access can

View File

@@ -8,9 +8,9 @@
-- DROP TABLE edit_access_right; -- DROP TABLE edit_access_right;
CREATE TABLE edit_access_right ( CREATE TABLE edit_access_right (
edit_access_right_id SERIAL PRIMARY KEY, edit_access_right_id SERIAL PRIMARY KEY,
name VARCHAR, name VARCHAR,
level SMALLINT, level SMALLINT,
type VARCHAR, type VARCHAR,
UNIQUE (level,type) UNIQUE (level,type)
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,13 +7,13 @@
-- DROP TABLE edit_access_user; -- DROP TABLE edit_access_user;
CREATE TABLE edit_access_user ( CREATE TABLE edit_access_user (
edit_access_user_id SERIAL PRIMARY KEY, edit_access_user_id SERIAL PRIMARY KEY,
edit_access_id INT NOT NULL, edit_access_id INT NOT NULL,
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_user_id INT NOT NULL, edit_user_id INT NOT NULL,
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL, edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_default SMALLINT DEFAULT 0, edit_default SMALLINT DEFAULT 0,
enabled SMALLINT NOT NULL DEFAULT 0 enabled SMALLINT NOT NULL DEFAULT 0
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,7 +7,7 @@
-- DROP TABLE edit_generic; -- DROP TABLE edit_generic;
CREATE TABLE edit_generic ( CREATE TABLE edit_generic (
cuid VARCHAR, cuid VARCHAR,
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(), date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
date_updated TIMESTAMP WITHOUT TIME ZONE date_updated TIMESTAMP WITHOUT TIME ZONE
); );

View File

@@ -7,14 +7,14 @@
-- DROP TABLE edit_group; -- DROP TABLE edit_group;
CREATE TABLE edit_group ( CREATE TABLE edit_group (
edit_group_id SERIAL PRIMARY KEY, edit_group_id SERIAL PRIMARY KEY,
edit_scheme_id INT, edit_scheme_id INT,
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL, edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
deleted SMALLINT DEFAULT 0, deleted SMALLINT DEFAULT 0,
uid VARCHAR, uid VARCHAR,
name VARCHAR, name VARCHAR,
additional_acl JSONB additional_acl JSONB
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,11 +8,11 @@
-- DROP TABLE edit_language; -- DROP TABLE edit_language;
CREATE TABLE edit_language ( CREATE TABLE edit_language (
edit_language_id SERIAL PRIMARY KEY, edit_language_id SERIAL PRIMARY KEY,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
lang_default SMALLINT NOT NULL DEFAULT 0, lang_default SMALLINT NOT NULL DEFAULT 0,
long_name VARCHAR, long_name VARCHAR,
short_name VARCHAR, -- en_US, en or en_US@latin without encoding short_name VARCHAR, -- en_US, en or en_US@latin without encoding
iso_name VARCHAR, -- should actually be encoding iso_name VARCHAR, -- should actually be encoding
order_number INT order_number INT
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,35 +7,35 @@
-- DROP TABLE edit_log; -- DROP TABLE edit_log;
CREATE TABLE edit_log ( CREATE TABLE edit_log (
edit_log_id SERIAL PRIMARY KEY, edit_log_id SERIAL PRIMARY KEY,
euid INT, -- this is a foreign key, but I don't nedd to reference to it euid INT, -- this is a foreign key, but I don't nedd to reference to it
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL, FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
username VARCHAR, username VARCHAR,
password VARCHAR, password VARCHAR,
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP, event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
ip VARCHAR, ip VARCHAR,
error TEXT, error TEXT,
event TEXT, event TEXT,
data_binary BYTEA, data_binary BYTEA,
data TEXT, data TEXT,
page VARCHAR, page VARCHAR,
action VARCHAR, action VARCHAR,
action_id VARCHAR, action_id VARCHAR,
action_yes VARCHAR, action_yes VARCHAR,
action_flag VARCHAR, action_flag VARCHAR,
action_menu VARCHAR, action_menu VARCHAR,
action_loaded VARCHAR, action_loaded VARCHAR,
action_value VARCHAR, action_value VARCHAR,
action_type VARCHAR, action_type VARCHAR,
action_error VARCHAR, action_error VARCHAR,
user_agent VARCHAR, user_agent VARCHAR,
referer VARCHAR, referer VARCHAR,
script_name VARCHAR, script_name VARCHAR,
query_string VARCHAR, query_string VARCHAR,
server_name VARCHAR, server_name VARCHAR,
http_host VARCHAR, http_host VARCHAR,
http_accept VARCHAR, http_accept VARCHAR,
http_accept_charset VARCHAR, http_accept_charset VARCHAR,
http_accept_encoding VARCHAR, http_accept_encoding VARCHAR,
session_id VARCHAR session_id VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,10 +7,10 @@
-- DROP TABLE edit_menu_group; -- DROP TABLE edit_menu_group;
CREATE TABLE edit_menu_group ( CREATE TABLE edit_menu_group (
edit_menu_group_id SERIAL PRIMARY KEY, edit_menu_group_id SERIAL PRIMARY KEY,
name VARCHAR, name VARCHAR,
flag VARCHAR, flag VARCHAR,
order_number INT NOT NULL order_number INT NOT NULL
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,16 +7,16 @@
-- DROP TABLE edit_page; -- DROP TABLE edit_page;
CREATE TABLE edit_page ( CREATE TABLE edit_page (
edit_page_id SERIAL PRIMARY KEY, edit_page_id SERIAL PRIMARY KEY,
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
filename VARCHAR, filename VARCHAR,
name VARCHAR UNIQUE, name VARCHAR UNIQUE,
order_number INT NOT NULL, order_number INT NOT NULL,
online SMALLINT NOT NULL DEFAULT 0, online SMALLINT NOT NULL DEFAULT 0,
menu SMALLINT NOT NULL DEFAULT 0, menu SMALLINT NOT NULL DEFAULT 0,
popup SMALLINT NOT NULL DEFAULT 0, popup SMALLINT NOT NULL DEFAULT 0,
popup_x SMALLINT, popup_x SMALLINT,
popup_y SMALLINT, popup_y SMALLINT,
hostname VARCHAR hostname VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,14 +7,14 @@
-- DROP TABLE edit_page_access; -- DROP TABLE edit_page_access;
CREATE TABLE edit_page_access ( CREATE TABLE edit_page_access (
edit_page_access_id SERIAL PRIMARY KEY, edit_page_access_id SERIAL PRIMARY KEY,
edit_group_id INT NOT NULL, edit_group_id INT NOT NULL,
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL, edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
enabled SMALLINT NOT NULL DEFAULT 0 enabled SMALLINT NOT NULL DEFAULT 0
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,13 +8,13 @@
-- DROP TABLE edit_page_content; -- DROP TABLE edit_page_content;
CREATE TABLE edit_page_content ( CREATE TABLE edit_page_content (
edit_page_content_id SERIAL PRIMARY KEY, edit_page_content_id SERIAL PRIMARY KEY,
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL, edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
uid VARCHAR UNIQUE, uid VARCHAR UNIQUE,
name VARCHAR, name VARCHAR,
order_number INT NOT NULL, order_number INT NOT NULL,
online SMALLINT NOT NULL DEFAULT 0 online SMALLINT NOT NULL DEFAULT 0
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,8 +7,8 @@
-- DROP TABLE edit_page_menu_group; -- DROP TABLE edit_page_menu_group;
CREATE TABLE edit_page_menu_group ( CREATE TABLE edit_page_menu_group (
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_menu_group_id INT NOT NULL, edit_menu_group_id INT NOT NULL,
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
); );

View File

@@ -7,8 +7,8 @@
-- DROP TABLE edit_page_visible_group; -- DROP TABLE edit_page_visible_group;
CREATE TABLE edit_page_visible_group ( CREATE TABLE edit_page_visible_group (
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_visible_group_id INT NOT NULL, edit_visible_group_id INT NOT NULL,
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
); );

View File

@@ -7,11 +7,11 @@
-- DROP TABLE edit_query_string; -- DROP TABLE edit_query_string;
CREATE TABLE edit_query_string ( CREATE TABLE edit_query_string (
edit_query_string_id SERIAL PRIMARY KEY, edit_query_string_id SERIAL PRIMARY KEY,
edit_page_id INT NOT NULL, edit_page_id INT NOT NULL,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
name VARCHAR, name VARCHAR,
value VARCHAR, value VARCHAR,
dynamic SMALLINT NOT NULL DEFAULT 0 dynamic SMALLINT NOT NULL DEFAULT 0
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,10 +7,10 @@
-- DROP TABLE edit_scheme; -- DROP TABLE edit_scheme;
CREATE TABLE edit_scheme ( CREATE TABLE edit_scheme (
edit_scheme_id SERIAL PRIMARY KEY, edit_scheme_id SERIAL PRIMARY KEY,
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
name VARCHAR, name VARCHAR,
header_color VARCHAR, header_color VARCHAR,
css_file VARCHAR, css_file VARCHAR,
template VARCHAR template VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,6 +7,6 @@
-- DROP TABLE temp_files; -- DROP TABLE temp_files;
CREATE TABLE temp_files ( CREATE TABLE temp_files (
filename VARCHAR, filename VARCHAR,
folder VARCHAR folder VARCHAR
); );

View File

@@ -7,63 +7,63 @@
-- DROP TABLE edit_user; -- DROP TABLE edit_user;
CREATE TABLE edit_user ( CREATE TABLE edit_user (
edit_user_id SERIAL PRIMARY KEY, edit_user_id SERIAL PRIMARY KEY,
connect_edit_user_id INT, -- possible reference to other user connect_edit_user_id INT, -- possible reference to other user
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_language_id INT NOT NULL, edit_language_id INT NOT NULL,
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_group_id INT NOT NULL, edit_group_id INT NOT NULL,
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_scheme_id INT, edit_scheme_id INT,
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
edit_access_right_id INT NOT NULL, edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
-- username/password -- username/password
username VARCHAR UNIQUE, username VARCHAR UNIQUE,
password VARCHAR, password VARCHAR,
-- name block -- name block
first_name VARCHAR, first_name VARCHAR,
last_name VARCHAR, last_name VARCHAR,
first_name_furigana VARCHAR, first_name_furigana VARCHAR,
last_name_furigana VARCHAR, last_name_furigana VARCHAR,
-- email -- email
email VARCHAR, email VARCHAR,
-- eanbled/deleted flag -- eanbled/deleted flag
enabled SMALLINT NOT NULL DEFAULT 0, enabled SMALLINT NOT NULL DEFAULT 0,
deleted SMALLINT NOT NULL DEFAULT 0, deleted SMALLINT NOT NULL DEFAULT 0,
-- general flags -- general flags
strict SMALLINT DEFAULT 0, strict SMALLINT DEFAULT 0,
locked SMALLINT DEFAULT 0, locked SMALLINT DEFAULT 0,
protected SMALLINT NOT NULL DEFAULT 0, protected SMALLINT NOT NULL DEFAULT 0,
-- legacy, debug flags -- legacy, debug flags
debug SMALLINT NOT NULL DEFAULT 0, debug SMALLINT NOT NULL DEFAULT 0,
db_debug SMALLINT NOT NULL DEFAULT 0, db_debug SMALLINT NOT NULL DEFAULT 0,
-- is admin user -- is admin user
admin SMALLINT NOT NULL DEFAULT 0, admin SMALLINT NOT NULL DEFAULT 0,
-- last login log -- last login log
last_login TIMESTAMP WITHOUT TIME ZONE, last_login TIMESTAMP WITHOUT TIME ZONE,
-- login error -- login error
login_error_count INT DEFAULT 0, login_error_count INT DEFAULT 0,
login_error_date_last TIMESTAMP WITHOUT TIME ZONE, login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
login_error_date_first TIMESTAMP WITHOUT TIME ZONE, login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
-- time locked -- time locked
lock_until TIMESTAMP WITHOUT TIME ZONE, lock_until TIMESTAMP WITHOUT TIME ZONE,
lock_after TIMESTAMP WITHOUT TIME ZONE, lock_after TIMESTAMP WITHOUT TIME ZONE,
-- password change -- password change
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
password_reset_uid VARCHAR, -- the uid to access the password reset page password_reset_uid VARCHAR, -- the uid to access the password reset page
-- _GET login id for direct login -- _GET login id for direct login
login_user_id VARCHAR UNIQUE, -- the loginUserId, at least 32 chars login_user_id VARCHAR UNIQUE, -- the loginUserId, at least 32 chars
login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE, -- when above uid was set login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE, -- when above uid was set
login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE, -- when the last login was done with user name and password login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE, -- when the last login was done with user name and password
login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE, -- if set, from when the above uid is valid login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE, -- if set, from when the above uid is valid
login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE, -- if set, until when the above uid is valid login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE, -- if set, until when the above uid is valid
login_user_id_revalidate_after INTERVAL, -- user must login to revalidated loginUserId after set days, 0 for forever login_user_id_revalidate_after INTERVAL, -- user must login to revalidated loginUserId after set days, 0 for forever
login_user_id_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login login_user_id_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
-- additional ACL json block -- additional ACL json block
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages) additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;
-- create unique index -- create unique index

View File

@@ -7,7 +7,7 @@
-- DROP TABLE edit_visible_group; -- DROP TABLE edit_visible_group;
CREATE TABLE edit_visible_group ( CREATE TABLE edit_visible_group (
edit_visible_group_id SERIAL PRIMARY KEY, edit_visible_group_id SERIAL PRIMARY KEY,
name VARCHAR, name VARCHAR,
flag VARCHAR flag VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS; ) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -7,7 +7,7 @@
-- DROP TABLE generic; -- DROP TABLE generic;
CREATE TABLE generic ( CREATE TABLE generic (
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(), date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
date_updated TIMESTAMP WITHOUT TIME ZONE, date_updated TIMESTAMP WITHOUT TIME ZONE,
uid VARCHAR uid VARCHAR
); );

View File

@@ -1477,7 +1477,7 @@ final class CoreLibsACLLoginTest extends TestCase
); );
// - loginGetLoginHTML // - loginGetLoginHTML
$this->assertStringContainsString( $this->assertStringContainsString(
'<html>', '<html lang="',
$login_mock->loginGetLoginHTML(), $login_mock->loginGetLoginHTML(),
'Assert login html string exits' 'Assert login html string exits'
); );
@@ -1529,7 +1529,7 @@ final class CoreLibsACLLoginTest extends TestCase
// html login basic check only, content is the same as when // html login basic check only, content is the same as when
// read from loginGetLoginHTML() // read from loginGetLoginHTML()
$this->assertStringContainsString( $this->assertStringContainsString(
'<html>', '<html lang="',
$_POST['login_html'], $_POST['login_html'],
'Assert ajax _POST html string exits' 'Assert ajax _POST html string exits'
); );

View File

@@ -92,6 +92,7 @@ final class CoreLibsCheckEncodingTest extends TestCase
$error_char, $error_char,
$expected $expected
): void { ): void {
$current_subsitute_character = mb_substitute_character();
if ($error_char !== null) { if ($error_char !== null) {
\CoreLibs\Check\Encoding::setErrorChar($error_char); \CoreLibs\Check\Encoding::setErrorChar($error_char);
if (!in_array($error_char, ['none', 'long', 'entity'])) { if (!in_array($error_char, ['none', 'long', 'entity'])) {
@@ -111,6 +112,8 @@ final class CoreLibsCheckEncodingTest extends TestCase
$expected, $expected,
$return $return
); );
// reset after test
mb_substitute_character($current_subsitute_character);
} }
} }

View File

@@ -13,7 +13,6 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsCombinedDateTimeTest extends TestCase final class CoreLibsCombinedDateTimeTest extends TestCase
{ {
/** /**
* timestamps * timestamps
* *
@@ -618,13 +617,169 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
* @param array $expected * @param array $expected
* @return void * @return void
*/ */
public function testCalcDaysInterval(string $input_a, string $input_b, bool $flag, $expected): void public function testCalcDaysInterval(
{ string $input_a,
string $input_b,
bool $flag,
$expected
): void {
$this->assertEquals( $this->assertEquals(
$expected, $expected,
\CoreLibs\Combined\DateTime::calcDaysInterval($input_a, $input_b, $flag) \CoreLibs\Combined\DateTime::calcDaysInterval($input_a, $input_b, $flag)
); );
} }
/**
* Undocumented function
*
* @return array
*/
public function weekdayNumberProvider(): array
{
return [
'0 invalid' => [0, null, 'Inv',],
'0 invalid long' => [0, true, 'Invalid',],
'1 short' => [1, null, 'Mon',],
'1 long' => [1, true, 'Monday',],
'2 short' => [2, null, 'Tue',],
'2 long' => [2, true, 'Tuesday',],
'3 short' => [3, null, 'Wed',],
'3 long' => [3, true, 'Wednesday',],
'4 short' => [4, null, 'Thu',],
'4 long' => [4, true, 'Thursday',],
'5 short' => [5, null, 'Fri',],
'5 long' => [5, true, 'Friday',],
'6 short' => [6, null, 'Sat',],
'6 long' => [6, true, 'Saturday',],
'7 short' => [7, null, 'Sun',],
'7 long' => [7, true, 'Sunday',],
'8 invalid' => [8, null, 'Inv',],
'8 invalid long' => [8, true, 'Invalid',],
];
}
/**
* int weekday number to string weekday
*
* @covers ::setWeekdayNameFromIsoDow
* @dataProvider weekdayNumberProvider
* @testdox weekdayListProvider $input (short $flag) will be $expected [$_dataName]
*
* @param int $input
* @param bool|null $flag
* @param string $expected
* @return void
*/
public function testSetWeekdayNameFromIsoDow(
int $input,
?bool $flag,
string $expected
): void {
if ($flag === null) {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromIsoDow($input);
} else {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromIsoDow($input, $flag);
}
$this->assertEquals(
$expected,
$output
);
}
/**
* Undocumented function
*
* @return array
*/
public function weekdayDateProvider(): array
{
return [
'invalid date' => ['2022-02-31', -1],
'1: monday' => ['2022-07-25', 1],
'2: tuesday' => ['2022-07-26', 2],
'3: wednesday' => ['2022-07-27', 3],
'4: thursday' => ['2022-07-28', 4],
'5: friday' => ['2022-07-29', 5],
'6: saturday' => ['2022-07-30', 6],
'7: sunday' => ['2022-07-31', 7],
];
}
/**
* date to weekday number
*
* @covers ::setWeekdayNumberFromDate
* @dataProvider weekdayDateProvider
* @testdox setWeekdayNumberFromDate $input will be $expected [$_dataName]
*
* @param string $input
* @param int $expected
* @return void
*/
public function testSetWeekdayNumberFromDate(
string $input,
int $expected
): void {
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::setWeekdayNumberFromDate($input)
);
}
/**
* Undocumented function
*
* @return array
*/
public function weekdayDateNameProvider(): array
{
return [
'invalid date short' => ['2022-02-31', null, 'Inv'],
'invalid date long' => ['2022-02-31', true, 'Invalid'],
'Mon short' => ['2022-07-25', null, 'Mon'],
'Monday long' => ['2022-07-25', true, 'Monday'],
'Tue short' => ['2022-07-26', null, 'Tue'],
'Tuesday long' => ['2022-07-26', true, 'Tuesday'],
'Wed short' => ['2022-07-27', null, 'Wed'],
'Wednesday long' => ['2022-07-27', true, 'Wednesday'],
'Thu short' => ['2022-07-28', null, 'Thu'],
'Thursday long' => ['2022-07-28', true, 'Thursday'],
'Fri short' => ['2022-07-29', null, 'Fri'],
'Friday long' => ['2022-07-29', true, 'Friday'],
'Sat short' => ['2022-07-30', null, 'Sat'],
'Saturday long' => ['2022-07-30', true, 'Saturday'],
'Sun short' => ['2022-07-31', null, 'Sun'],
'Sunday long' => ['2022-07-31', true, 'Sunday'],
];
}
/**
* date to weekday name
*
* @covers ::setWeekdayNameFromDate
* @dataProvider weekdayDateNameProvider
* @testdox setWeekdayNameFromDate $input (short $flag) will be $expected [$_dataName]
*
* @param string $input
* @param bool|null $flag
* @param string $expected
* @return void
*/
public function testSetWeekdayNameFromDate(
string $input,
?bool $flag,
string $expected
): void {
if ($flag === null) {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromDate($input);
} else {
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromDate($input, $flag);
}
$this->assertEquals(
$expected,
$output
);
}
} }
// __END__ // __END__

View File

@@ -16,7 +16,6 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsConvertByteTest extends TestCase final class CoreLibsConvertByteTest extends TestCase
{ {
/** /**
* Undocumented function * Undocumented function
* *
@@ -24,7 +23,31 @@ final class CoreLibsConvertByteTest extends TestCase
*/ */
public function byteProvider(): array public function byteProvider(): array
{ {
/*
* 0: input string
* 1: default flags
* 2: BYTE_FORMAT_SI
* 3: BYTE_FORMAT_NOSPACE
* 4: BYTE_FORMAT_ADJUST
* 5: BYTE_FORMAT_SI | BYTE_FORMAT_NOSPACE
*/
return [ return [
'string number' => [
0 => '1024',
1 => '1 KB',
2 => '1.02 KiB',
3 => '1KB',
4 => '1.00 KB',
5 => '1.02KiB',
],
'invalud string number' => [
0 => '1024 MB',
1 => '1024 MB',
2 => '1024 MB',
3 => '1024 MB',
4 => '1024 MB',
5 => '1024 MB',
],
'negative number' => [ 'negative number' => [
0 => -123123123, 0 => -123123123,
1 => '-117.42 MB', 1 => '-117.42 MB',

View File

@@ -0,0 +1,261 @@
<?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Convert\Strings
* @coversDefaultClass \CoreLibs\Convert\Strings
* @testdox \CoreLibs\Convert\Strings method tests
*/
final class CoreLibsConvertStringsTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function splitFormatStringProvider(): array
{
// 0: input
// 1: format
// 2: split characters as string, null for default
// 3: expected
return [
'all empty string' => [
'',
'',
null,
''
],
'empty input string' => [
'',
'2-2',
null,
''
],
'empty format string string' => [
'1234',
'',
null,
'1234'
],
'string format match' => [
'1234',
'2-2',
null,
'12-34'
],
'string format trailing match' => [
'1234',
'2-2-',
null,
'12-34'
],
'string format leading match' => [
'1234',
'-2-2',
null,
'12-34'
],
'string format double inside match' => [
'1234',
'2--2',
null,
'12--34',
],
'string format short first' => [
'1',
'2-2',
null,
'1'
],
'string format match first' => [
'12',
'2-2',
null,
'12'
],
'string format short second' => [
'123',
'2-2',
null,
'12-3'
],
'string format too long' => [
'1234567',
'2-2',
null,
'12-34-567'
],
'string format invalid format string' => [
'1234',
'2_2',
null,
'1234'
],
'different split character' => [
'1234',
'2_2',
'_',
'12_34'
],
'mixed split characters' => [
'123456',
'2-2_2',
'-_',
'12-34_56'
],
'length mixed' => [
'ABCD12345568ABC13',
'2-4_5-2#4',
'-_#',
'AB-CD12_34556-8A#BC13'
],
'split with split chars in string' => [
'12-34',
'2-2',
null,
'12--3-4'
],
'mutltibyte string' => [
'あいうえ',
'2-2',
null,
'あいうえ'
],
'mutltibyte split string' => [
'1234',
'-',
null,
'1234'
],
];
}
/**
* split format string
*
* @covers ::splitFormatString
* @dataProvider splitFormatStringProvider
* @testdox splitFormatString $input with format $format and splitters $split_characters will be $expected [$_dataName]
*
* @param string $input
* @param string $format
* @param string|null $split_characters
* @param string $expected
* @return void
*/
public function testSplitFormatString(
string $input,
string $format,
?string $split_characters,
string $expected
): void {
if ($split_characters === null) {
$output = \CoreLibs\Convert\Strings::splitFormatString(
$input,
$format
);
} else {
$output = \CoreLibs\Convert\Strings::splitFormatString(
$input,
$format,
$split_characters
);
}
$this->assertEquals(
$expected,
$output
);
}
/**
* Undocumented function
*
* @return array
*/
public function countSplitPartsProvider(): array
{
return [
'0 elements' => [
'',
null,
0
],
'1 element' => [
'1',
null,
1,
],
'2 elements, trailing' => [
'1-2-',
null,
2
],
'2 elements, leading' => [
'-1-2',
null,
2
],
'2 elements, midde double' => [
'1--2',
null,
2
],
'4 elements' => [
'1-2-3-4',
null,
4
],
'3 elemenst, other splitter' => [
'2-3_3',
'-_',
3
],
'illegal splitter' => [
'あsdf',
null,
0
]
];
}
/**
* count split parts
*
* @covers ::countSplitParts
* @dataProvider countSplitPartsProvider
* @testdox countSplitParts $input with splitters $split_characters will be $expected [$_dataName]
*
* @param string $input
* @param string|null $split_characters
* @param int $expected
* @return void
*/
public function testCountSplitParts(
string $input,
?string $split_characters,
int $expected
): void {
if ($split_characters === null) {
$output = \CoreLibs\Convert\Strings::countSplitParts(
$input
);
} else {
$output = \CoreLibs\Convert\Strings::countSplitParts(
$input,
$split_characters
);
}
$this->assertEquals(
$expected,
$output
);
}
}
// __END__

View File

@@ -41,36 +41,56 @@ final class CoreLibsCreateEmailTest extends TestCase
// 0: email // 0: email
// 1: name // 1: name
// 2: encoding // 2: encoding
// 3: expected // 3: kv_folding
// 4: expected
return [ return [
'all empty' => [ 'all empty' => [
'', '',
null, null,
null, null,
null,
'' ''
], ],
'email only' => [ 'email only' => [
'test@test.com', 'test@test.com',
null, null,
null, null,
null,
'test@test.com' 'test@test.com'
], ],
'email and name' => [ 'email and name' => [
'test@test.com', 'test@test.com',
'Test Name', 'Test Name',
null, null,
null,
'"Test Name" <test@test.com>' '"Test Name" <test@test.com>'
], ],
'name in mime encoded, default UTF-8' => [ 'name in mime encoded, default UTF-8' => [
'test@test.com', 'test@test.com',
'日本語', '日本語',
null, null,
null,
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>' '"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
], ],
'name in mime encoded with half width Katakana, default UTF-8' => [
'test@test.com',
'日本語カタカナパ',
null,
null,
'"=?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=" <test@test.com>'
],
'name in mime encoded with half width Katakana, folding on, default UTF-8' => [
'test@test.com',
'日本語カタカナパ',
'UTF-8',
true,
'"=?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=" <test@test.com>'
],
'name in mime encoded, UTF-8 parameter' => [ 'name in mime encoded, UTF-8 parameter' => [
'test@test.com', 'test@test.com',
'日本語', '日本語',
'UTF-8', 'UTF-8',
null,
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>' '"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
], ],
// does internal UTF-8 to ISO-2022-JP convert // does internal UTF-8 to ISO-2022-JP convert
@@ -78,7 +98,25 @@ final class CoreLibsCreateEmailTest extends TestCase
'test@test.com', 'test@test.com',
'日本語', '日本語',
'ISO-2022-JP', 'ISO-2022-JP',
'"=?ISO-2022-JP?B?GyRCRnxLXA==?=" <test@test.com>' null,
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=" <test@test.com>'
],
'encoding with half width Katakana in ISO-2022-JP' => [
'test@test.com',
'日本語カタカナパ',
'ISO-2022-JP',
null,
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
],
'encoding with half width Katakana, folding on in ISO-2022-JP' => [
'test@test.com',
'日本語カタカナパ',
'ISO-2022-JP',
true,
// was ok php 8.1
// '"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
// below ok php 8.1.12, 2022/12/9
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
] ]
]; ];
} }
@@ -87,22 +125,30 @@ final class CoreLibsCreateEmailTest extends TestCase
* Undocumented function * Undocumented function
* *
* @dataProvider encodeEmailNameProvider * @dataProvider encodeEmailNameProvider
* @testdox encode email $email, name $name, encoding $encoding will be $expected [$_dataName] * @testdox encode email $email, name $name, encoding $encoding, folding $kv_folding will be $expected [$_dataName]
* *
* @param string $email
* @param string|null $name
* @param string|null $encoding
* @param bool|null $kv_folding
* @param string $expected
* @return void * @return void
*/ */
public function testEncodeEmailName( public function testEncodeEmailName(
string $email, string $email,
?string $name, ?string $name,
?string $encoding, ?string $encoding,
?bool $kv_folding,
string $expected string $expected
): void { ): void {
if ($name === null && $encoding === null) { if ($name === null && $encoding === null && $kv_folding === null) {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email); $encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
} elseif ($encoding === null) { } elseif ($encoding === null && $kv_folding === null) {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name); $encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
} else { } elseif ($kv_folding === null) {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding); $encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
} else {
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding, $kv_folding);
} }
$this->assertEquals( $this->assertEquals(
$expected, $expected,
@@ -119,6 +165,7 @@ final class CoreLibsCreateEmailTest extends TestCase
// 4: array for to email // 4: array for to email
// 5: replace content ([]/null) // 5: replace content ([]/null)
// 6: encoding (UTF-8/null) // 6: encoding (UTF-8/null)
// 7: kv_folding
// 8: return status // 8: return status
// 9: expected content // 9: expected content
return [ return [
@@ -130,6 +177,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'to_email' => [], 'to_email' => [],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => -1, 'expected_status' => -1,
'expected_content' => [], 'expected_content' => [],
], ],
@@ -141,9 +189,22 @@ final class CoreLibsCreateEmailTest extends TestCase
'to_email' => [], 'to_email' => [],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => -2, 'expected_status' => -2,
'expected_content' => [], 'expected_content' => [],
], ],
'bad encoding, fail -3' => [
'subject' => 'SUBJECT',
'body' => 'BODY',
'from_email' => 'test@test.com',
'from_name' => '',
'to_email' => ['to@test.com'],
'replace' => null,
'encoding' => 'IDONTEXISTENCODING',
'kv_folding' => null,
'expected_status' => -3,
'expected_content' => [],
],
'sending email 1' => [ 'sending email 1' => [
'subject' => 'SUBJECT', 'subject' => 'SUBJECT',
'body' => 'BODY', 'body' => 'BODY',
@@ -154,6 +215,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -176,6 +238,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -188,6 +251,52 @@ final class CoreLibsCreateEmailTest extends TestCase
] ]
], ],
], ],
'sending email 1, encoded, with half width katakanata' => [
'subject' => 'SUBJECT 日本語カタカナパ',
'body' => 'BODY 日本語',
'from_email' => 'test@test.com',
'from_name' => '',
'to_email' => [
'test@test.com'
],
'replace' => null,
'encoding' => 'UTF-8',
'kv_folding' => null,
'expected_status' => 2,
'expected_content' => [
[
'header' => [
'From' => 'test@test.com'
],
'to' => 'test@test.com',
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=',
'body' => 'BODY 日本語',
]
],
],
'sending email 1, encoded, with half width katakanata, folding on' => [
'subject' => 'SUBJECT 日本語カタカナパ',
'body' => 'BODY 日本語',
'from_email' => 'test@test.com',
'from_name' => '',
'to_email' => [
'test@test.com'
],
'replace' => null,
'encoding' => 'UTF-8',
'kv_folding' => true,
'expected_status' => 2,
'expected_content' => [
[
'header' => [
'From' => 'test@test.com'
],
'to' => 'test@test.com',
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=',
'body' => 'BODY 日本語',
]
],
],
'sending email 1, encoded subject ISO-2022-JP' => [ 'sending email 1, encoded subject ISO-2022-JP' => [
'subject' => 'SUBJECT 日本語', 'subject' => 'SUBJECT 日本語',
'body' => 'BODY 日本語', 'body' => 'BODY 日本語',
@@ -198,6 +307,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => 'ISO-2022-JP', 'encoding' => 'ISO-2022-JP',
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -222,6 +332,7 @@ final class CoreLibsCreateEmailTest extends TestCase
], ],
'replace' => null, 'replace' => null,
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -255,6 +366,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -280,6 +392,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -310,6 +423,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -340,6 +454,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -379,6 +494,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -434,6 +550,7 @@ final class CoreLibsCreateEmailTest extends TestCase
'VAR' => 'bar', 'VAR' => 'bar',
], ],
'encoding' => null, 'encoding' => null,
'kv_folding' => null,
'expected_status' => 2, 'expected_status' => 2,
'expected_content' => [ 'expected_content' => [
[ [
@@ -478,6 +595,7 @@ final class CoreLibsCreateEmailTest extends TestCase
* @param array $to_email * @param array $to_email
* @param array|null $replace * @param array|null $replace
* @param string|null $encoding * @param string|null $encoding
* @param bool|null $kv_folding
* @param int $expected_status * @param int $expected_status
* @param array $expected_content * @param array $expected_content
* @return void * @return void
@@ -490,6 +608,7 @@ final class CoreLibsCreateEmailTest extends TestCase
array $to_email, array $to_email,
?array $replace, ?array $replace,
?string $encoding, ?string $encoding,
?bool $kv_folding,
int $expected_status, int $expected_status,
array $expected_content array $expected_content
): void { ): void {
@@ -499,6 +618,9 @@ final class CoreLibsCreateEmailTest extends TestCase
if ($encoding === null) { if ($encoding === null) {
$encoding = 'UTF-8'; $encoding = 'UTF-8';
} }
if ($kv_folding === null) {
$kv_folding = false;
}
// force new set for each run // force new set for each run
self::$log->setLogUniqueId(true); self::$log->setLogUniqueId(true);
// set on of unique log id // set on of unique log id
@@ -512,6 +634,7 @@ final class CoreLibsCreateEmailTest extends TestCase
$to_email, $to_email,
$replace, $replace,
$encoding, $encoding,
$kv_folding,
true, true,
self::$log self::$log
); );

View File

@@ -181,7 +181,7 @@ final class CoreLibsCreateSessionTest extends TestCase
string $type, string $type,
array $mock_data, array $mock_data,
string $expected, string $expected,
string $expected_error, string $expected_error
): void { ): void {
// override expected // override expected
if ($type == 'd') { if ($type == 'd') {

View File

@@ -1189,7 +1189,13 @@ final class CoreLibsDBIOTest extends TestCase
$this->assertEquals( $this->assertEquals(
$expected, $expected,
$db->dbEscapeBytea($input) $db->dbEscapeBytea($input),
'Assert error to bytea'
);
$this->assertEquals(
$input,
$db->dbUnescapeBytea($expected),
'Assert error from bytes'
); );
$db->dbClose(); $db->dbClose();
@@ -2536,7 +2542,7 @@ final class CoreLibsDBIOTest extends TestCase
private function subAssertCursorExtTestDbReturnFunction( private function subAssertCursorExtTestDbReturnFunction(
\CoreLibs\DB\IO $db, \CoreLibs\DB\IO $db,
string $query, string $query,
array $cursor_ext_checks, array $cursor_ext_checks
): void { ): void {
// cursor check // cursor check
if ( if (

View File

@@ -1,5 +1,7 @@
-- 2022/6/17 update edit_user with login uid -- 2022/6/17 update edit_user with login uid
-- !!! COPY TABLE ARRAY FOLDER !!!
-- the login uid, at least 32 chars -- the login uid, at least 32 chars
ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE; ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE;
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL; -- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
@@ -24,22 +26,22 @@ CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
RETURNS TRIGGER AS RETURNS TRIGGER AS
$$ $$
BEGIN BEGIN
-- if new is not null/empty -- if new is not null/empty
-- and old one is null or old one different new one -- and old one is null or old one different new one
-- set NOW() -- set NOW()
-- if new one is NULL -- if new one is NULL
-- set NULL -- set NULL
IF IF
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id) (OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
THEN THEN
NEW.login_user_id_set_date = NOW(); NEW.login_user_id_set_date = NOW();
NEW.login_user_id_last_revalidate = NOW(); NEW.login_user_id_last_revalidate = NOW();
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
NEW.login_user_id_set_date = NULL; NEW.login_user_id_set_date = NULL;
NEW.login_user_id_last_revalidate = NULL; NEW.login_user_id_last_revalidate = NULL;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ $$
LANGUAGE 'plpgsql'; LANGUAGE 'plpgsql';

View File

@@ -0,0 +1,22 @@
# Files to be changed
Change: Update Generate\Form to use ACL for form creation (basic)
Date: 2022/9/6
## File List
```sh
includes/table_arrays/array_edit_pages.php
includes/table_arrays/array_edit_users.php
includes/templates/admin/edit_body.tpl
includes/templates/admin/edit_elements.tpl
includes/templates/admin/edit_load.tpl
includes/templates/admin/edit_new.tpl
includes/templates/admin/edit_save_delete.tpl
includes/edit_base.php
lib/CoreLibs/ACL/Login.php
lib/CoreLibs/DB/Extended/ArrayIO.php
lib/CoreLibs/Convert/MimeEncode.php
lib/CoreLibs/Create/Email.php
lib/CoreLibs/Output/Form/Generate.php
```

View File

@@ -1,72 +1,47 @@
parameters: parameters:
ignoreErrors: ignoreErrors:
- -
message: "#^Parameter \\#1 \\$connection of function pg_connection_busy expects PgSql\\\\Connection, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_escape_bytea expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 3
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
-
message: "#^Parameter \\#1 \\$connection of function pg_connection_status expects PgSql\\\\Connection, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$connection of function pg_get_result expects PgSql\\\\Connection, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_escape_identifier expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 2
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
-
message: "#^Parameter \\#1 \\$connection of function pg_meta_data expects PgSql\\\\Connection, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$connection of function pg_send_query expects PgSql\\\\Connection, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_escape_literal expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 2
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
-
message: "#^Parameter \\#1 \\$connection of function pg_socket expects PgSql\\\\Connection, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$connection of function pg_version expects PgSql\\\\Connection\\|null, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_escape_string expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 2
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
-
message: "#^Parameter \\#1 \\$result of function pg_affected_rows expects PgSql\\\\Result, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$result of function pg_fetch_all expects PgSql\\\\Result, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_execute expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$result of function pg_fetch_array expects PgSql\\\\Result, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_parameter_status expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$result of function pg_field_name expects PgSql\\\\Result, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_prepare expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$result of function pg_num_fields expects PgSql\\\\Result, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_query expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php
- -
message: "#^Parameter \\#1 \\$result of function pg_num_rows expects PgSql\\\\Result, object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$connection of function pg_query_params expects PgSql\\\\Connection\\|string, object\\|resource given\\.$#"
count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
-
message: "#^Parameter \\#1 \\$result of function pg_result_error expects PgSql\\\\Result, object\\|resource given\\.$#"
count: 1 count: 1
path: www/lib/CoreLibs/DB/SQL/PgSQL.php path: www/lib/CoreLibs/DB/SQL/PgSQL.php

View File

@@ -49,11 +49,11 @@ parameters:
- www/vendor - www/vendor
# ignore errores with # ignore errores with
ignoreErrors: ignoreErrors:
- # this error is ignore because of the PHP 8.0 to 8.1 change for pg_*, only for 8.0 or lower #- # this error is ignore because of the PHP 8.0 to 8.1 change for pg_*, only for 8.0 or lower
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects resource(\\|null)?, object\\|resource(\\|bool)? given\\.$#" # message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects resource(\\|null)?, object\\|resource(\\|bool)? given\\.$#"
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php # path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
- # this is for 8.1 or newer - # this is for 8.1 or newer
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects PgSql\\\\(Result|Connection(\\|null)?), object\\|resource given\\.$#" message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects PgSql\\\\(Result|Connection(\\|string)?(\\|null)?), object\\|resource given\\.$#"
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
# this is ignored for now # this is ignored for now
# - '#Expression in empty\(\) is always falsy.#' # - '#Expression in empty\(\) is always falsy.#'

View File

@@ -50,21 +50,22 @@ print '<div><h1>' . $PAGE_NAME . '</h1></div>';
$byte = 254779258; $byte = 254779258;
$string = '242.98 MB'; $string = '242.98 MB';
// static // static
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte) . "<br>"; print "S::BYTE TO (calls as var): $byte: " . $byte_class::humanReadableByteFormat($byte) . "<br>";
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte) . "<br>";
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>";
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>";
print "S::BYTE FROM: $string: " . $byte_class::stringByteFormat($string) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>";
print "S::BYTE FROM: $string: " . Byte::stringByteFormat($string) . "<br>";
// //
$byte = 314572800; $byte = 314572800;
$string = '300 MB'; $string = '300 MB';
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte) . "<br>";
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_SI) . "<br>";
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST) . "<br>";
print "S::BYTE TO: $byte: " print "S::BYTE TO: $byte: "
. $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST | Byte::BYTE_FORMAT_NOSPACE) . "<br>"; . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_ADJUST | Byte::BYTE_FORMAT_NOSPACE) . "<br>";
print "S::BYTE TO: $byte: " . $byte_class::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>"; print "S::BYTE TO: $byte: " . Byte::humanReadableByteFormat($byte, Byte::BYTE_FORMAT_NOSPACE) . "<br>";
print "S::BYTE FROM: $string: " . $byte_class::stringByteFormat($string) . "<br>"; print "S::BYTE FROM: $string: " . Byte::stringByteFormat($string) . "<br>";
// *** BYTES TEST *** // *** BYTES TEST ***
$bytes = [ $bytes = [

View File

@@ -70,10 +70,11 @@ $status = Email::sendEmail(
], ],
[], [],
'UTF-8', 'UTF-8',
false,
true, true,
$log $log
); );
print "SENDING: " . $status . "<br>"; print "SENDING A: " . $status . "<br>";
$status = Email::sendEmail( $status = Email::sendEmail(
'TEST {REPLACE}', 'TEST {REPLACE}',
'BODY {OTHER}', 'BODY {OTHER}',
@@ -97,10 +98,11 @@ $status = Email::sendEmail(
'OTHER' => '**other**' 'OTHER' => '**other**'
], ],
'UTF-8', 'UTF-8',
false,
true, true,
$log $log
); );
print "SENDING: " . $status . "<br>"; print "SENDING B: " . $status . "<br>";
$status = Email::sendEmail( $status = Email::sendEmail(
'TEST', 'TEST',
@@ -110,10 +112,29 @@ $status = Email::sendEmail(
['a@a.com', 'b@b.com'], ['a@a.com', 'b@b.com'],
[], [],
'UTF-8', 'UTF-8',
false,
true, true,
$log $log
); );
print "SENDING: " . $status . "<br>"; print "SENDING C: " . $status . "<br>";
// SUBJECT 日本語カタカナパ
$status = Email::sendEmail(
'TEST 日本語カタカナパカタカナバ',
'BODY 日本語カタカナパカタカナバ',
'test@test.com',
'Test Name 日本語カタカナパ',
[
['email' => 'a@a.com', 'name' => 'a 日本語カタカナパカタカナバ'],
['email' => 'b@b.com', 'name' => 'b 日本語プブガバケブプガバケ'],
],
[],
'UTF-8',
false,
true,
$log
);
print "SENDING D: " . $status . "<br>";
// error message // error message
print $log->printErrorMsg(); print $log->printErrorMsg();

View File

@@ -139,6 +139,22 @@ foreach ($compare_dates as $compare_date) {
. DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1], true)) . "<br>"; . DgS::printAr(DateTime::calcDaysInterval($compare_date[0], $compare_date[1], true)) . "<br>";
} }
// test date conversion
$dow = 2;
print "DOW[$dow]: " . DateTime::setWeekdayNameFromIsoDow($dow) . "<br>";
print "DOW[$dow],long: " . DateTime::setWeekdayNameFromIsoDow($dow, true) . "<br>";
$date = '2022-7-22';
print "DATE-dow[$date]: " . DateTime::setWeekdayNameFromDate($date) . "<br>";
print "DATE-dow[$date],long: " . DateTime::setWeekdayNameFromDate($date, true) . "<br>";
print "DOW-date[$date]: " . DateTime::setWeekdayNumberFromDate($date) . "<br>";
$dow = 11;
print "DOW[$dow];invalid: " . DateTime::setWeekdayNameFromIsoDow($dow) . "<br>";
print "DOW[$dow],long;invalid: " . DateTime::setWeekdayNameFromIsoDow($dow, true) . "<br>";
$date = '2022-70-242';
print "DATE-dow[$date];invalid: " . DateTime::setWeekdayNameFromDate($date) . "<br>";
print "DATE-dow[$date],long;invalid: " . DateTime::setWeekdayNameFromDate($date, true) . "<br>";
print "DOW-date[$date];invalid: " . DateTime::setWeekdayNumberFromDate($date) . "<br>";
// error message // error message
print $log->printErrorMsg(); print $log->printErrorMsg();

View File

@@ -209,13 +209,12 @@ print "INSERT WITH NO PRIMARY KEY WITH RETURNING STATUS: " . Support::printToStr
print "</pre>"; print "</pre>";
// READ PREPARE // READ PREPARE
if ( $q_prep = "SELECT test_foo_id, test, some_bool, string_a, number_a, "
$db->dbPrepare( . "number_a_numeric, some_time "
'sel_test_foo', . "FROM test_foo "
"SELECT test_foo_id, test, some_bool, string_a, number_a, number_a_numeric, some_time " . "WHERE test = $1 "
. "FROM test_foo ORDER BY test_foo_id DESC LIMIT 5" . "ORDER BY test_foo_id DESC LIMIT 5";
) === false if ($db->dbPrepare('sel_test_foo', $q_prep) === false) {
) {
print "Error in sel_test_foo prepare<br>"; print "Error in sel_test_foo prepare<br>";
} else { } else {
$max_rows = 6; $max_rows = 6;
@@ -229,6 +228,29 @@ if (
$i++; $i++;
} }
} }
// prepre a second time on normal connection
if ($db->dbPrepare('sel_test_foo', $q_prep) === false) {
print "Error prepareing<br>";
print "ERROR (dbPrepare on same query): "
. $db->dbGetLastError() . "/" . $db->dbGetLastWarning() . "/"
. "<pre>" . print_r($db->dbGetCombinedErrorHistory(), true) . "</pre><br>";
}
// NOTE: try to replacate connection still exists if script is run a second time
// open pg bouncer connection
$db_pgb = new CoreLibs\DB\IO($DB_CONFIG['test_pgbouncer'], $log);
print "[PGB] DBINFO: " . $db_pgb->dbInfo() . "<br>";
if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) {
print "[PGB] [1] Error in pgb_sel_test_foo prepare<br>";
} else {
print "[PGB] [1] pgb_sel_test_foo prepare OK<br>";
}
// second prepare
if ($db->dbPrepare('pgb_sel_test_foo', $q_prep) === false) {
print "[PGB] [2] Error in pgb_sel_test_foo prepare<br>";
} else {
print "[PGB] [2] pgb_sel_test_foo prepare OK<br>";
}
$db_pgb->dbClose();
# db write class test # db write class test
$table = 'test_foo'; $table = 'test_foo';

View File

@@ -70,6 +70,7 @@ print '<div><a href="class_test.hash.php">Class Test: HASH</a></div>';
print '<div><a href="class_test.encoding.php">Class Test: ENCODING (CHECK/CONVERT/MIME)</a></div>'; print '<div><a href="class_test.encoding.php">Class Test: ENCODING (CHECK/CONVERT/MIME)</a></div>';
print '<div><a href="class_test.image.php">Class Test: IMAGE</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.byte.php">Class Test: BYTE CONVERT</a></div>';
print '<div><a href="class_test.strings.php">Class Test: STRING CONVERT</a></div>';
print '<div><a href="class_test.datetime.php">Class Test: DATE/TIME</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.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.file.php">Class Test: FILE</a></div>';

View File

@@ -0,0 +1,86 @@
<?php // phpcs:ignore warning
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';
// define log file id
$LOG_FILE_ID = 'classTest-string';
ob_end_flush();
$log = new CoreLibs\Debug\Logging([
'log_folder' => BASE . LOG,
'file_id' => $LOG_FILE_ID,
// add file date
'print_file_date' => true,
// set debug and print flags
'debug_all' => $DEBUG_ALL ?? false,
'echo_all' => $ECHO_ALL ?? false,
'print_all' => $PRINT_ALL ?? false,
]);
$byte_class = 'CoreLibs\Convert\Strings';
$PAGE_NAME = 'TEST CLASS: STRINGS CONVERT';
print "<!DOCTYPE html>";
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
print "<body>";
print '<div><a href="class_test.php">Class Test Master</a></div>';
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
$split = '4-4-4';
$test_strings = [
'13',
'1234',
'12341',
'12341234',
'123412341',
'123412341234',
'1234123412341234512345',
];
foreach ($test_strings as $string) {
print "Convert: $string with $split to: "
. \CoreLibs\Convert\Strings::splitFormatString($string, $split)
. "<br>";
}
$split = '2_2';
$string = '1234';
print "Convert: $string with $split to: "
. \CoreLibs\Convert\Strings::splitFormatString($string, $split)
. "<br>";
$split = '2-2';
$string = 'あいうえ';
print "Convert: $string with $split to: "
. \CoreLibs\Convert\Strings::splitFormatString($string, $split)
. "<br>";
$test_splits = [
'',
'2',
'2-2',
'2-3-4',
];
foreach ($test_splits as $split) {
print "$split with count: " . \CoreLibs\Convert\Strings::countSplitParts($split) . "<br>";
}
// error message
print $log->printErrorMsg();
print "</body></html>";
// __END__

458
www/composer.lock generated
View File

@@ -138,16 +138,16 @@
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.13.2", "version": "v4.15.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077" "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077", "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -188,9 +188,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1"
}, },
"time": "2021-11-30T19:35:32+00:00" "time": "2022-09-04T07:30:47+00:00"
}, },
{ {
"name": "phar-io/manifest", "name": "phar-io/manifest",
@@ -303,252 +303,25 @@
}, },
"time": "2022-02-21T01:04:05+00:00" "time": "2022-02-21T01:04:05+00:00"
}, },
{
"name": "phpdocumentor/reflection-common",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-2.x": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jaap van Otterdijk",
"email": "opensource@ijaap.nl"
}
],
"description": "Common reflection classes used by phpdocumentor to reflect the code structure",
"homepage": "http://www.phpdoc.org",
"keywords": [
"FQSEN",
"phpDocumentor",
"phpdoc",
"reflection",
"static analysis"
],
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
"source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
},
"time": "2020-06-27T09:03:43+00:00"
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "5.3.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": ""
},
"require": {
"ext-filter": "*",
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.3",
"webmozart/assert": "^1.9.1"
},
"require-dev": {
"mockery/mockery": "~1.3.2",
"psalm/phar": "^4.8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
},
{
"name": "Jaap van Otterdijk",
"email": "account@ijaap.nl"
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
},
"time": "2021-10-19T17:43:47+00:00"
},
{
"name": "phpdocumentor/type-resolver",
"version": "1.6.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "77a32518733312af16a44300404e945338981de3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
"reference": "77a32518733312af16a44300404e945338981de3",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
"psalm/phar": "^4.8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-1.x": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
}
],
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
},
"time": "2022-03-15T21:29:03+00:00"
},
{
"name": "phpspec/prophecy",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.2",
"php": "^7.2 || ~8.0, <8.2",
"phpdocumentor/reflection-docblock": "^5.2",
"sebastian/comparator": "^3.0 || ^4.0",
"sebastian/recursion-context": "^3.0 || ^4.0"
},
"require-dev": {
"phpspec/phpspec": "^6.0 || ^7.0",
"phpunit/phpunit": "^8.0 || ^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Konstantin Kudryashov",
"email": "ever.zet@gmail.com",
"homepage": "http://everzet.com"
},
{
"name": "Marcello Duarte",
"email": "marcello.duarte@gmail.com"
}
],
"description": "Highly opinionated mocking framework for PHP 5.3+",
"homepage": "https://github.com/phpspec/prophecy",
"keywords": [
"Double",
"Dummy",
"fake",
"mock",
"spy",
"stub"
],
"support": {
"issues": "https://github.com/phpspec/prophecy/issues",
"source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
},
"time": "2021-12-08T12:19:24+00:00"
},
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.15", "version": "9.2.17",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8",
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"nikic/php-parser": "^4.13.0", "nikic/php-parser": "^4.14",
"php": ">=7.3", "php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3", "phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2", "phpunit/php-text-template": "^2.0.2",
@@ -597,7 +370,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17"
}, },
"funding": [ "funding": [
{ {
@@ -605,7 +378,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-03-07T09:28:20+00:00" "time": "2022-08-30T12:24:04+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@@ -850,16 +623,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.5.20", "version": "9.5.25",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -874,7 +647,6 @@
"phar-io/manifest": "^2.0.3", "phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2", "phar-io/version": "^3.0.2",
"php": ">=7.3", "php": ">=7.3",
"phpspec/prophecy": "^1.12.1",
"phpunit/php-code-coverage": "^9.2.13", "phpunit/php-code-coverage": "^9.2.13",
"phpunit/php-file-iterator": "^3.0.5", "phpunit/php-file-iterator": "^3.0.5",
"phpunit/php-invoker": "^3.1.1", "phpunit/php-invoker": "^3.1.1",
@@ -882,20 +654,16 @@
"phpunit/php-timer": "^5.0.2", "phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1", "sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6", "sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5", "sebastian/comparator": "^4.0.8",
"sebastian/diff": "^4.0.3", "sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3", "sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3", "sebastian/exporter": "^4.0.5",
"sebastian/global-state": "^5.0.1", "sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3", "sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3", "sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^3.0", "sebastian/type": "^3.2",
"sebastian/version": "^3.0.2" "sebastian/version": "^3.0.2"
}, },
"require-dev": {
"ext-pdo": "*",
"phpspec/prophecy-phpunit": "^2.0.1"
},
"suggest": { "suggest": {
"ext-soap": "*", "ext-soap": "*",
"ext-xdebug": "*" "ext-xdebug": "*"
@@ -937,7 +705,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25"
}, },
"funding": [ "funding": [
{ {
@@ -947,9 +715,13 @@
{ {
"url": "https://github.com/sebastianbergmann", "url": "https://github.com/sebastianbergmann",
"type": "github" "type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
"type": "tidelift"
} }
], ],
"time": "2022-04-01T12:37:26+00:00" "time": "2022-09-25T03:44:45+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@@ -1120,16 +892,16 @@
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "4.0.6", "version": "4.0.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382" "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382", "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1182,7 +954,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -1190,7 +962,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2020-10-26T15:49:45+00:00" "time": "2022-09-14T12:41:17+00:00"
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",
@@ -1380,16 +1152,16 @@
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
"version": "4.0.4", "version": "4.0.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git", "url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1445,7 +1217,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues", "issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
}, },
"funding": [ "funding": [
{ {
@@ -1453,7 +1225,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2021-11-11T14:18:36+00:00" "time": "2022-09-14T06:03:37+00:00"
}, },
{ {
"name": "sebastian/global-state", "name": "sebastian/global-state",
@@ -1808,16 +1580,16 @@
}, },
{ {
"name": "sebastian/type", "name": "sebastian/type",
"version": "3.0.0", "version": "3.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/type.git", "url": "https://github.com/sebastianbergmann/type.git",
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1829,7 +1601,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "3.0-dev" "dev-master": "3.2-dev"
} }
}, },
"autoload": { "autoload": {
@@ -1852,7 +1624,7 @@
"homepage": "https://github.com/sebastianbergmann/type", "homepage": "https://github.com/sebastianbergmann/type",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/type/issues", "issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/3.0.0" "source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -1860,7 +1632,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-03-15T09:54:48+00:00" "time": "2022-09-12T14:47:03+00:00"
}, },
{ {
"name": "sebastian/version", "name": "sebastian/version",
@@ -1915,88 +1687,6 @@
], ],
"time": "2020-09-28T06:39:44+00:00" "time": "2020-09-28T06:39:44+00:00"
}, },
{
"name": "symfony/polyfill-ctype",
"version": "v1.25.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "30885182c981ab175d4d034db0f6f469898070ab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
"reference": "30885182c981ab175d4d034db0f6f469898070ab",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
"ext-ctype": "*"
},
"suggest": {
"ext-ctype": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Gert de Pagter",
"email": "BackEndTea@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"ctype",
"polyfill",
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2021-10-20T20:35:02+00:00"
},
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",
"version": "1.2.1", "version": "1.2.1",
@@ -2046,64 +1736,6 @@
} }
], ],
"time": "2021-07-28T10:34:58+00:00" "time": "2021-07-28T10:34:58+00:00"
},
{
"name": "webmozart/assert",
"version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"phpstan/phpstan": "<0.12.20",
"vimeo/psalm": "<4.6.1 || 4.6.2"
},
"require-dev": {
"phpunit/phpunit": "^8.5.13"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.10-dev"
}
},
"autoload": {
"psr-4": {
"Webmozart\\Assert\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "Assertions to validate method input/output with nice error messages.",
"keywords": [
"assert",
"check",
"validate"
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/1.10.0"
},
"time": "2021-03-09T10:59:23+00:00"
} }
], ],
"aliases": [], "aliases": [],

View File

@@ -17,7 +17,20 @@ $DB_CONFIG = [
'db_user' => $_ENV['DB_USER.TEST'] ?? '', 'db_user' => $_ENV['DB_USER.TEST'] ?? '',
'db_pass' => $_ENV['DB_PASS.TEST'] ?? '', 'db_pass' => $_ENV['DB_PASS.TEST'] ?? '',
'db_host' => $_ENV['DB_HOST.TEST'] ?? '', 'db_host' => $_ENV['DB_HOST.TEST'] ?? '',
'db_port' => 5432, 'db_port' => $_ENV['DB_PORT.PG'] ?? 5432,
'db_schema' => 'public',
'db_type' => 'pgsql',
'db_encoding' => '',
'db_ssl' => 'allow', // allow, disable, require, prefer
'db_debug' => true, // turn on logging or not
],
// same as above, but uses pg bouncer
'test_pgbouncer' => [
'db_name' => $_ENV['DB_NAME.TEST'] ?? '',
'db_user' => $_ENV['DB_USER.TEST'] ?? '',
'db_pass' => $_ENV['DB_PASS.TEST'] ?? '',
'db_host' => $_ENV['DB_HOST.TEST'] ?? '',
'db_port' => $_ENV['DB_PORT.PG_BOUNCER'] ?? 5432,
'db_schema' => 'public', 'db_schema' => 'public',
'db_type' => 'pgsql', 'db_type' => 'pgsql',
'db_encoding' => '', 'db_encoding' => '',

View File

@@ -249,10 +249,10 @@ if ($is_secure) {
define('HOST_PROTOCOL', 'http://'); define('HOST_PROTOCOL', 'http://');
} }
// define the db config set name, the db config and the db schema // define the db config set name, the db config and the db schema
define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host']); define('DB_CONFIG_NAME', $SITE_CONFIG[HOST_NAME]['db_host'] ?? '');
define('DB_CONFIG', $DB_CONFIG[DB_CONFIG_NAME] ?? []); define('DB_CONFIG', $DB_CONFIG[DB_CONFIG_NAME] ?? []);
// because we can't change constant, but we want to for db debug flag // because we can't change constant, but we want to for db debug flag
$GLOBALS['DB_CONFIG'] = DB_CONFIG; $GLOBALS['DB_CONFIG_SET'] = DB_CONFIG;
// 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
@@ -268,9 +268,9 @@ define('SITE_ENCODING', $SITE_CONFIG[HOST_NAME]['site_encoding'] ?? DEFAULT_ENCO
define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled'] ?? false); define('LOGIN_ENABLED', $SITE_CONFIG[HOST_NAME]['login_enabled'] ?? false);
define('AUTH', $SITE_CONFIG[HOST_NAME]['auth'] ?? false); define('AUTH', $SITE_CONFIG[HOST_NAME]['auth'] ?? false);
// paths // paths
// define('CSV_PATH', $PATHS[TARGET]['csv_path']); // define('CSV_PATH', $PATHS[TARGET]['csv_path'] ?? '');
// define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin']); // define('EXPORT_SCRIPT', $PATHS[TARGET]['perl_bin'] ?? '');
// define('REDIRECT_URL', $PATHS[TARGET]['redirect_url']); // define('REDIRECT_URL', $PATHS[TARGET]['redirect_url'] ?? '');
// show all errors if debug_all & show_error_handling are enabled // show all errors if debug_all & show_error_handling are enabled
define('SHOW_ALL_ERRORS', true); define('SHOW_ALL_ERRORS', true);

View File

@@ -2,9 +2,9 @@
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2008/08/14 * CREATED:
* SHORT DESCRIPTION: * SHORT DESCRIPTION:
* URL redirect header *
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/

View File

@@ -2,8 +2,9 @@
/******************************************************************** /********************************************************************
* AUTHOR: Clemens Schwaighofer * AUTHOR: Clemens Schwaighofer
* CREATED: 2008/08/01 * CREATED:
* SHORT DESCRIPTION: * SHORT DESCRIPTION:
*
* HISTORY: * HISTORY:
*********************************************************************/ *********************************************************************/

View File

@@ -112,7 +112,7 @@ if (defined('LAYOUT')) {
} }
// set table width // set table width
$table_width = '100%'; $table_width = '100%';
$ADMIN_STYLESHEET = 'edit.css';
// define all needed smarty stuff for the general HTML/page building // define all needed smarty stuff for the general HTML/page building
$HEADER['CSS'] = CSS; $HEADER['CSS'] = CSS;
$HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING; $HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
@@ -457,6 +457,8 @@ if ($form->my_page_name == 'edit_order') {
$pathinfo = pathinfo($output_file); $pathinfo = pathinfo($output_file);
if (!empty($pathinfo['dirname'])) { if (!empty($pathinfo['dirname'])) {
$pathinfo['dirname'] .= DIRECTORY_SEPARATOR; $pathinfo['dirname'] .= DIRECTORY_SEPARATOR;
} else {
$pathinfo['dirname'] = '';
} }
if ($t_q) { if ($t_q) {
$t_q .= ', '; $t_q .= ', ';
@@ -552,6 +554,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);
$form->log->debug('DEBUGEND', '==================================== [Form END]');
// debug output // debug output
echo $login->log->printErrorMsg(); echo $login->log->printErrorMsg();
echo $form->log->printErrorMsg(); echo $form->log->printErrorMsg();

View File

@@ -66,8 +66,8 @@ $edit_pages = [
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => [ 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
], ],
'popup' => [ 'popup' => [
@@ -76,8 +76,8 @@ $edit_pages = [
'int' => 1, 'int' => 1,
'type' => 'binary', 'type' => 'binary',
'element_list' => [ 'element_list' => [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
], ],
'popup_x' => [ 'popup_x' => [
@@ -128,12 +128,12 @@ $edit_pages = [
'name' => 'filename', 'name' => 'filename',
'before_value' => 'Filename: ' 'before_value' => 'Filename: '
], ],
[ [
'name' => 'online', 'name' => 'online',
'binary' => ['Yes', 'No'], 'binary' => ['Yes', 'No'],
'before_value' => 'Online: ' 'before_value' => 'Online: '
], ],
[ [
'name' => 'menu', 'name' => 'menu',
'binary' => ['Yes', 'No'], 'binary' => ['Yes', 'No'],
'before_value' => 'Menu: ' 'before_value' => 'Menu: '

View File

@@ -15,7 +15,11 @@ $edit_users = [
'output_name' => 'Username', 'output_name' => 'Username',
'mandatory' => 1, 'mandatory' => 1,
'error_check' => 'unique|alphanumericextended', 'error_check' => 'unique|alphanumericextended',
'type' => 'text' 'type' => 'text',
// if not min_edit_acl only read
// if not min_show_acl not visible
'min_edit_acl' => '100',
'min_show_acl' => '-1',
], ],
'password' => [ 'password' => [
'value' => $GLOBALS['password'] ?? '', 'value' => $GLOBALS['password'] ?? '',
@@ -30,6 +34,8 @@ $edit_users = [
'value' => 'NOW()' // value [todo: complex reference 'value' => 'NOW()' // value [todo: complex reference
], ],
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
// 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
@@ -41,7 +47,9 @@ $edit_users = [
'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,
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'enabled' => [ 'enabled' => [
'value' => $GLOBALS['enabled'] ?? '', 'value' => $GLOBALS['enabled'] ?? '',
@@ -52,6 +60,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '-1',
], ],
'deleted' => [ 'deleted' => [
'value' => $GLOBALS['deleted'] ?? '', 'value' => $GLOBALS['deleted'] ?? '',
@@ -62,6 +72,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'strict' => [ 'strict' => [
'value' => $GLOBALS['strict'] ?? '', 'value' => $GLOBALS['strict'] ?? '',
@@ -72,6 +84,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'locked' => [ 'locked' => [
'value' => $GLOBALS['locked'] ?? '', 'value' => $GLOBALS['locked'] ?? '',
@@ -82,6 +96,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'admin' => [ 'admin' => [
'value' => $GLOBALS['admin'] ?? '', 'value' => $GLOBALS['admin'] ?? '',
@@ -92,6 +108,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'debug' => [ 'debug' => [
'value' => $GLOBALS['debug'] ?? '', 'value' => $GLOBALS['debug'] ?? '',
@@ -102,6 +120,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'db_debug' => [ 'db_debug' => [
'value' => $GLOBALS['db_debug'] ?? '', 'value' => $GLOBALS['db_debug'] ?? '',
@@ -112,22 +132,30 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'email' => [ 'email' => [
'value' => $GLOBALS['email'] ?? '', 'value' => $GLOBALS['email'] ?? '',
'output_name' => 'E-Mail', 'output_name' => 'E-Mail',
'type' => 'text', 'type' => 'text',
'error_check' => 'email' 'error_check' => 'email',
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'last_name' => [ 'last_name' => [
'value' => $GLOBALS['last_name'] ?? '', 'value' => $GLOBALS['last_name'] ?? '',
'output_name' => 'Last Name', 'output_name' => 'Last Name',
'type' => 'text' 'type' => 'text',
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'first_name' => [ 'first_name' => [
'value' => $GLOBALS['first_name'] ?? '', 'value' => $GLOBALS['first_name'] ?? '',
'output_name' => 'First Name', 'output_name' => 'First Name',
'type' => 'text' 'type' => 'text',
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'lock_until' => [ 'lock_until' => [
'value' => $GLOBALS['lock_until'] ?? '', 'value' => $GLOBALS['lock_until'] ?? '',
@@ -136,6 +164,8 @@ $edit_users = [
'error_check' => 'datetime', 'error_check' => 'datetime',
'sql_read' => 'YYYY-MM-DD HH24:MI', 'sql_read' => 'YYYY-MM-DD HH24:MI',
'datetime' => 1, 'datetime' => 1,
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'lock_after' => [ 'lock_after' => [
'value' => $GLOBALS['lock_after'] ?? '', 'value' => $GLOBALS['lock_after'] ?? '',
@@ -143,7 +173,8 @@ $edit_users = [
'type' => 'datetime', 'type' => 'datetime',
'error_check' => 'datetime', 'error_check' => 'datetime',
'sql_read' => 'YYYY-MM-DD HH24:MI', 'sql_read' => 'YYYY-MM-DD HH24:MI',
'datetime' => 1, 'datetime' => 1,'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'login_user_id' => [ 'login_user_id' => [
'value' => $GLOBALS['login_user_id'] ?? '', 'value' => $GLOBALS['login_user_id'] ?? '',
@@ -151,19 +182,22 @@ $edit_users = [
'type' => 'text', 'type' => 'text',
'error_check' => 'unique|custom', 'error_check' => 'unique|custom',
'error_regex' => "/^[A-Za-z0-9]+$/", 'error_regex' => "/^[A-Za-z0-9]+$/",
'emptynull' => 1, 'emptynull' => 1,'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'login_user_id_set_date' => [ 'login_user_id_set_date' => [
'output_name' => 'loginUserId set date', 'output_name' => 'loginUserId set date',
'value' => $GLOBALS['login_user_id_set_date'] ?? '', 'value' => $GLOBALS['login_user_id_set_date'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '-' 'empty' => '-',
'min_show_acl' => '100',
], ],
'login_user_id_last_revalidate' => [ 'login_user_id_last_revalidate' => [
'output_name' => 'loginUserId last revalidate date', 'output_name' => 'loginUserId last revalidate date',
'value' => $GLOBALS['login_user_id_last_revalidate'] ?? '', 'value' => $GLOBALS['login_user_id_last_revalidate'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '-' 'empty' => '-',
'min_show_acl' => '100',
], ],
'login_user_id_locked' => [ 'login_user_id_locked' => [
'value' => $GLOBALS['login_user_id_locked'] ?? '', 'value' => $GLOBALS['login_user_id_locked'] ?? '',
@@ -174,6 +208,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'login_user_id_revalidate_after' => [ 'login_user_id_revalidate_after' => [
'value' => $GLOBALS['login_user_id_revalidate_after'] ?? '', 'value' => $GLOBALS['login_user_id_revalidate_after'] ?? '',
@@ -182,7 +218,9 @@ $edit_users = [
'error_check' => 'intervalshort', 'error_check' => 'intervalshort',
'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,
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'login_user_id_valid_from' => [ 'login_user_id_valid_from' => [
'value' => $GLOBALS['login_user_id_valid_from'] ?? '', 'value' => $GLOBALS['login_user_id_valid_from'] ?? '',
@@ -191,6 +229,8 @@ $edit_users = [
'error_check' => 'datetime', 'error_check' => 'datetime',
'sql_read' => 'YYYY-MM-DD HH24:MI', 'sql_read' => 'YYYY-MM-DD HH24:MI',
'datetime' => 1, 'datetime' => 1,
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'login_user_id_valid_until' => [ 'login_user_id_valid_until' => [
'value' => $GLOBALS['login_user_id_valid_until'] ?? '', 'value' => $GLOBALS['login_user_id_valid_until'] ?? '',
@@ -199,6 +239,8 @@ $edit_users = [
'error_check' => 'datetime', 'error_check' => 'datetime',
'sql_read' => 'YYYY-MM-DD HH24:MI', 'sql_read' => 'YYYY-MM-DD HH24:MI',
'datetime' => 1, 'datetime' => 1,
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'edit_language_id' => [ 'edit_language_id' => [
'value' => $GLOBALS['edit_language_id'] ?? '', 'value' => $GLOBALS['edit_language_id'] ?? '',
@@ -206,14 +248,18 @@ $edit_users = [
'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",
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'edit_scheme_id' => [ 'edit_scheme_id' => [
'value' => $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",
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'edit_group_id' => [ 'edit_group_id' => [
'value' => $GLOBALS['edit_group_id'] ?? '', 'value' => $GLOBALS['edit_group_id'] ?? '',
@@ -221,7 +267,9 @@ $edit_users = [
'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,
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'edit_access_right_id' => [ 'edit_access_right_id' => [
'value' => $GLOBALS['edit_access_right_id'] ?? '', 'value' => $GLOBALS['edit_access_right_id'] ?? '',
@@ -229,25 +277,30 @@ $edit_users = [
'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",
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'login_error_count' => [ 'login_error_count' => [
'output_name' => 'Login error count', 'output_name' => 'Login error count',
'value' => $GLOBALS['login_error_count'] ?? '', 'value' => $GLOBALS['login_error_count'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '0' 'empty' => '0',
'min_show_acl' => '100',
], ],
'login_error_date_last' => [ 'login_error_date_last' => [
'output_name' => 'Last login error', 'output_name' => 'Last login error',
'value' => $GLOBALS['login_error_date_liast'] ?? '', 'value' => $GLOBALS['login_error_date_liast'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '-' 'empty' => '-',
'min_show_acl' => '100',
], ],
'login_error_date_first' => [ 'login_error_date_first' => [
'output_name' => 'First login error', 'output_name' => 'First login error',
'value' => $GLOBALS['login_error_date_first'] ?? '', 'value' => $GLOBALS['login_error_date_first'] ?? '',
'type' => 'view', 'type' => 'view',
'empty' => '-' 'empty' => '-',
'min_show_acl' => '100',
], ],
'protected' => [ 'protected' => [
'value' => $GLOBALS['protected'] ?? '', 'value' => $GLOBALS['protected'] ?? '',
@@ -258,6 +311,8 @@ $edit_users = [
'1' => 'Yes', '1' => 'Yes',
'0' => 'No' '0' => 'No'
], ],
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
'additional_acl' => [ 'additional_acl' => [
'value' => $GLOBALS['additional_acl'] ?? '', 'value' => $GLOBALS['additional_acl'] ?? '',
@@ -265,12 +320,27 @@ $edit_users = [
'type' => 'textarea', 'type' => 'textarea',
'error_check' => 'json', 'error_check' => 'json',
'rows' => 10, 'rows' => 10,
'cols' => 60 'cols' => 60,
'min_edit_acl' => '100',
'min_show_acl' => '100',
], ],
], ],
'load_query' => "SELECT edit_user_id, username, enabled, deleted, " 'load_query' => "SELECT edit_user_id, username, enabled, deleted, "
. "strict, locked, login_error_count " . "strict, locked, login_error_count "
. "FROM edit_user ORDER BY username", . "FROM edit_user "
// if base acl is not 90 only list enabled
// if not admin flag, do not list admin flagged
. (
!$GLOBALS['acl_admin'] ?
"WHERE admin = 0 "
. (
$GLOBALS['base_acl_level'] < 90 ?
"AND enabled = 1 " :
""
)
: ''
)
. "ORDER BY username",
'table_name' => 'edit_user', 'table_name' => 'edit_user',
'show_fields' => [ 'show_fields' => [
[ [
@@ -305,7 +375,12 @@ $edit_users = [
'edit_access_user' => [ '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 // set then reference entries are deleted, else the 'enable' flag is only set
'delete' => 0,
// acl
'min_edit_acl' => '40',
'min_show_acl' => '20',
// table read prefix
'prefix' => 'ecu', 'prefix' => 'ecu',
'read_data' => [ 'read_data' => [
'table_name' => 'edit_access', 'table_name' => 'edit_access',

View File

@@ -83,13 +83,8 @@ function pop(theURL, winName, features) {
<td width="{$table_width}" class="edit_bgcolor"> <td width="{$table_width}" class="edit_bgcolor">
<form method="post" name="edit_form" style="margin-block-end: 0em;"> <form method="post" name="edit_form" style="margin-block-end: 0em;">
<table width="100%" border="0" cellpadding="2" cellspacing="1"> <table width="100%" border="0" cellpadding="2" cellspacing="1">
<!-- LOAD START //-->
{include file="edit_load.tpl"} {include file="edit_load.tpl"}
<!-- LOAD END //-->
<!-- NEW START //-->
{include file="edit_new.tpl"} {include file="edit_new.tpl"}
{* $form_create_new*}
<!-- NEW END //-->
{if $form_yes} {if $form_yes}
{include file="edit_save_delete.tpl"} {include file="edit_save_delete.tpl"}
{if $form_my_page_name == "edit_pages" && $filename_exist} {if $form_my_page_name == "edit_pages" && $filename_exist}

View File

@@ -8,6 +8,7 @@
******************************************************************** ********************************************************************
*} *}
{foreach from=$elements item=element key=key name=loop} {foreach from=$elements item=element key=key name=loop}
{if $element.allow_edit}
<tr> <tr>
<td class="edit_fgcolor" class="normal" valign="top"> <td class="edit_fgcolor" class="normal" valign="top">
{$element.output_name} {$element.output_name}
@@ -129,4 +130,21 @@
{/if} {/if}
</td> </td>
</tr> </tr>
{elseif $element.allow_show}
<tr>
<td class="edit_fgcolor" class="normal" valign="top">
{$element.output_name}
</td>
<td class="{$element.color}" class="normal">
{if $element.type != 'view'}
{$element.show_value}
<input type="hidden" name="{$element.data.name}" value="{$element.show_value}">
{else}
{$element.data.value}
{/if}
</td>
</tr>
{* {else}
<!-- No {$key} --> *}
{/if}
{/foreach} {/foreach}

View File

@@ -7,7 +7,7 @@
* HISTORY: * HISTORY:
******************************************************************** ********************************************************************
*} *}
<!-- LOAD START //-->
<tr> <tr>
<td class="edit_fgcolor_alt" class="normal"> <td class="edit_fgcolor_alt" class="normal">
Load: Load:
@@ -20,3 +20,4 @@
<input type="submit" name="archive" value="{t}Load{/t}"> <input type="submit" name="archive" value="{t}Load{/t}">
</td> </td>
</tr> </tr>
<!-- LOAD END //-->

View File

@@ -7,7 +7,8 @@
* HISTORY: * HISTORY:
******************************************************************** ********************************************************************
*} *}
{if $new.seclevel_okay}
<!-- NEW START //-->
<tr> <tr>
<td class="edit_fgcolor_alt" class="normal"> <td class="edit_fgcolor_alt" class="normal">
{t}Create new media:{/t} {t}Create new media:{/t}
@@ -21,3 +22,5 @@
<input type="submit" name="new" value="{$new.new_name}"> <input type="submit" name="new" value="{$new.new_name}">
</td> </td>
</tr> </tr>
<!-- NEW END //-->
{/if}

View File

@@ -7,16 +7,18 @@
* HISTORY: * HISTORY:
******************************************************************** ********************************************************************
*} *}
<tr>
{if $save_delete.seclevel_okay} {if $save_delete.seclevel_okay}
<tr>
<!-- SAVE START //-->
<td class="edit_fgcolor_alt" class="normal"> <td class="edit_fgcolor_alt" class="normal">
<input type="submit" name="save" value="{$save_delete.save}"> <input type="submit" name="save" value="{$save_delete.save}">
{if $save_delete.old_school_hidden} {if $save_delete.old_school_hidden}
<input type="hidden" name="{$save_delete.pk_name}" value="{$save_delete.pk_value}"> <input type="hidden" name="{$save_delete.pk_name}" value="{$save_delete.pk_value}">
{/if} {/if}
</td> </td>
{/if} <!-- SAVE END //-->
{if $save_delete.show_delete} {if $save_delete.show_delete}
<!-- DELETE START //-->
<td class="edit_fgcolor_delete"> <td class="edit_fgcolor_delete">
{if !$save_delete.hide_delete_checkbox} {if !$save_delete.hide_delete_checkbox}
<input type="checkbox" name="really_delete" value="yes">&nbsp;{t}really{/t}&nbsp; <input type="checkbox" name="really_delete" value="yes">&nbsp;{t}really{/t}&nbsp;
@@ -24,9 +26,11 @@
<input type="hidden" name="really_delete" value="yes"> <input type="hidden" name="really_delete" value="yes">
{/if} {/if}
<input type="submit" name="delete" value="{t}Delete{/t}"> <input type="submit" name="delete" value="{t}Delete{/t}">
<!-- DELETE END //-->
{else} {else}
<td class="edit_fgcolor_alt" class="normal"> <td class="edit_fgcolor_alt" class="normal">
&nbsp; &nbsp;
{/if} {/if}
</td> </td>
</tr> </tr>
{/if}

View File

@@ -159,9 +159,9 @@ input[type="text"]:focus, textarea:focus, select:focus {
text-align: center; text-align: center;
} }
.warning { .warning, .warn {
border: 1px solid #df7700; border: 1px solid #ffa947;
color: #d57200; color: #ffa947;
margin: 5px; margin: 5px;
padding: 2px; padding: 2px;
text-align: center; text-align: center;
@@ -181,8 +181,8 @@ input[type="text"]:focus, textarea:focus, select:focus {
margin-top: 1px; margin-top: 1px;
} }
.div_warning { .div_warning, .div_warn {
border: 1px solid #df7700; border: 1px solid #ffa947;
} }
/* borders */ /* borders */

View File

@@ -14,9 +14,9 @@ if (!DEBUG) {
}); });
}*/ }*/
// open overlay boxes counter // open overlay boxes counter for z-index
var GL_OB_S = 30; var GL_OB_S = 100;
var GL_OB_BASE = 30; var GL_OB_BASE = 100;
/** /**
* opens a popup window with winName and given features (string) * opens a popup window with winName and given features (string)
@@ -974,7 +974,7 @@ function phfo(tree)
if (tree.id) { if (tree.id) {
line += ' id="' + tree.id + '"'; line += ' id="' + tree.id + '"';
// if anything input (input, textarea, select then add name too) // if anything input (input, textarea, select then add name too)
if (['input', 'textarea', 'select'].includes(tree.tag)) { if (['input', 'textarea', 'select', 'button'].includes(tree.tag)) {
line += ' name="' + (tree.name ? tree.name : tree.id) + '"'; line += ' name="' + (tree.name ? tree.name : tree.id) + '"';
} }
} }
@@ -1329,11 +1329,12 @@ function createLoginRow(login_string, header_id = 'mainHeader') // eslint-disabl
} }
// clear out just in case for first entry // clear out just in case for first entry
// fill with div name & login/logout button // fill with div name & login/logout button
$('#loginRow').html(phfo(cel('div', '', login_string))); $('#loginRow').html(phfo(cel('div', 'loginRow-name', login_string)));
$('#loginRow').append(phfo(cel('div', 'loginRow-info', '')));
$('#loginRow').append(phfo( $('#loginRow').append(phfo(
aelx( aelx(
// outer div // outer div
cel('div'), cel('div', 'loginRow-logout'),
// inner element // inner element
cel('input', 'logout', '', [], { cel('input', 'logout', '', [], {
value: __('Logout'), value: __('Logout'),
@@ -1386,6 +1387,8 @@ function createNavMenu(nav_menu, header_id = 'mainHeader') // eslint-disable-lin
} }
}); });
$('#menuRow').html(content.join('')); $('#menuRow').html(content.join(''));
} else {
$('#menuRow').hide();
} }
} }

View File

@@ -1131,6 +1131,9 @@ class Login
$html_string = (string)$this->login_template['template']; $html_string = (string)$this->login_template['template'];
$locales = $this->l->parseLocale($this->l->getLocale());
$this->login_template['strings']['LANGUAGE'] = $locales['lang'] ?? 'en';
// if password change is okay // if password change is okay
if ($this->password_change) { if ($this->password_change) {
$html_string_password_change = $this->login_template['password_change']; $html_string_password_change = $this->login_template['password_change'];
@@ -1287,6 +1290,7 @@ class Login
. $strings['PASSWORD_CHANGE_BUTTON_VALUE'] . $strings['PASSWORD_CHANGE_BUTTON_VALUE']
. '" OnClick="ShowHideDiv(\'pw_change_div\');">' . '" OnClick="ShowHideDiv(\'pw_change_div\');">'
]); ]);
// TODO: submit or JS to set target page as ajax call
// NOTE: for the HTML block I ignore line lengths // NOTE: for the HTML block I ignore line lengths
// phpcs:disable // phpcs:disable
$this->login_template['password_change'] = <<<EOM $this->login_template['password_change'] = <<<EOM
@@ -1329,9 +1333,11 @@ EOM;
} }
// now check templates // now check templates
// TODO: submit or JS to set target page as ajax call
if (!$this->login_template['template']) { if (!$this->login_template['template']) {
$this->login_template['template'] = <<<EOM $this->login_template['template'] = <<<EOM
<html> <!DOCTYPE html>
<html lang="{LANGUAGE}">
<head> <head>
<title>{HTML_TITLE}</title> <title>{HTML_TITLE}</title>
<style type="text/css"> <style type="text/css">
@@ -1485,7 +1491,6 @@ EOM;
} }
// initial the session if there is no session running already // initial the session if there is no session running already
// check if session exists and could be created // check if session exists and could be created
// TODO: move session creation and check to outside?
if ($this->session->checkActiveSession() === false) { if ($this->session->checkActiveSession() === false) {
$this->login_error = 2; $this->login_error = 2;
echo '<b>No active session found</b>'; echo '<b>No active session found</b>';
@@ -1615,7 +1620,7 @@ EOM;
// set the locale // set the locale
if ( if (
$this->session->checkActiveSession() === true && $this->session->checkActiveSession() === true &&
!empty($_SESSION['DEFAULT_LANG']) !empty($_SESSION['DEFAULT_LOCALE'])
) { ) {
$locale = $_SESSION['DEFAULT_LOCALE'] ?? ''; $locale = $_SESSION['DEFAULT_LOCALE'] ?? '';
} else { } else {

View File

@@ -66,7 +66,7 @@ class Basic
// logging interface, Debug\Logging class // logging interface, Debug\Logging class
/** @var \CoreLibs\Debug\Logging */ /** @var \CoreLibs\Debug\Logging */
public $log; public $log;
/** @var\CoreLibs\Create\Session */ /** @var \CoreLibs\Create\Session */
public $session; public $session;
// email valid checks // email valid checks

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* DEPRECATED: Use correct Json:: instead * DEPRECATED: Use correct Convert\Json:: instead
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* html convert functions * array search and transform functions
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* image thumbnail, rotate, etc * date convert and check functions
*/ */
declare(strict_types=1); declare(strict_types=1);
@@ -193,6 +193,54 @@ class DateTime
} }
} }
/**
* Returns long or short day of week name based on ISO day of week number
* 1: Monday
* ...
* 7: Sunday
*
* @param int $isodow 1: Monday, 7: Sunday
* @param bool $long Default false 'Mon', if true 'Monday'
* @return string Day of week string either short 'Mon' or long 'Monday'
*/
public static function setWeekdayNameFromIsoDow(int $isodow, bool $long = false): string
{
// if not valid, set to invalid
if ($isodow < 1 || $isodow > 7) {
return $long ? 'Invalid' : 'Inv';
}
return date($long ? 'l' : 'D', strtotime("Sunday +{$isodow} days") ?: null);
}
/**
* Get the day of week Name from date
*
* @param string $date Any valid date
* @param bool $long Default false 'Mon', if true 'Monday'
* @return string Day of week string either short 'Mon' or long 'Monday'
*/
public static function setWeekdayNameFromDate(string $date, bool $long = false): string
{
if (!self::checkDate($date)) {
return $long ? 'Invalid' : 'Inv';
}
return date($long ? 'l' : 'D', strtotime($date) ?: null);
}
/**
* Get the day of week Name from date
*
* @param string $date Any valid date
* @return int ISO Weekday number 1: Monday, 7: Sunday, -1 for invalid date
*/
public static function setWeekdayNumberFromDate(string $date): int
{
if (!self::checkDate($date)) {
return -1;
}
return (int)date('N', strtotime($date) ?: null);
}
/** /**
* splits & checks date, wrap around for check_date function * splits & checks date, wrap around for check_date function
* *
@@ -264,16 +312,17 @@ class DateTime
} }
/** /**
* plits & checks date, wrap around for check_date function * compares two dates, tries to convert them via strtotime to timestamps
* returns int in: * returns int/bool in:
* -1 if the first date is smaller the last * -1 if the first date is smaller the last
* 0 if both are equal * 0 if both are equal
* 1 if the first date is bigger than the last * 1 if the first date is bigger than the last
* false (bool): error * false if date validation/conversion failed
* *
* @param string $start_date start date string in YYYY-MM-DD * @param string $start_date start date string in YYYY-MM-DD
* @param string $end_date end 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 * @return int|bool false on error
* or int -1 (s<e)/0 (s=e)/1 (s>e) as difference
*/ */
public static function compareDate($start_date, $end_date) public static function compareDate($start_date, $end_date)
{ {
@@ -306,16 +355,17 @@ class DateTime
/** /**
* compares the two dates + times. if seconds missing in one set, * compares the two dates + times. if seconds missing in one set,
* add :00, converts / to - * adds :00, converts date + times via strtotime to timestamps
* returns int/bool in: * returns int/bool in:
* -1 if the first date is smaller the last * -1 if the first date is smaller the last
* 0 if both are equal * 0 if both are equal
* 1 if the first date is bigger than the last * 1 if the first date is bigger than the last
* false if no valid date/times chould be found * false if date/times validation/conversion failed
* *
* @param string $start_datetime start date/time in YYYY-MM-DD HH:mm:ss * @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 * @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 * @return int|bool false for error
* or -1 (s<e)/0 (s=e)/1 (s>e) as difference
*/ */
public static function compareDateTime($start_datetime, $end_datetime) public static function compareDateTime($start_datetime, $end_datetime)
{ {

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* image thumbnail, rotate, etc * byte conversion from and to human readable
*/ */
declare(strict_types=1); declare(strict_types=1);
@@ -26,13 +26,16 @@ class Byte
* Source Idea: SOURCE: https://programming.guide/worlds-most-copied-so-snippet.html * Source Idea: SOURCE: https://programming.guide/worlds-most-copied-so-snippet.html
* *
* The class itself hast the following defined * The class itself hast the following defined
* BYTE_FORMAT_NOSPACE [1] turn off spaces between number and extension * BYTE_FORMAT_NOSPACE [1] turn off spaces between number and suffix
* BYTE_FORMAT_ADJUST [2] use sprintf to always print two decimals * BYTE_FORMAT_ADJUST [2] use sprintf to always print two decimals
* BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024 * BYTE_FORMAT_SI [3] use si standard 1000 instead of bytes 1024
* To use the constant from outside use class::CONSTANT * To use the constant from outside use class::CONSTANT
* *
* @param string|int|float $bytes bytes as string int or pure int * @param string|int|float $bytes bytes as string int or pure int
* @param int $flags bitwise flag with use space turned on * @param int $flags bitwise flag with use space turned on
* BYTE_FORMAT_NOSPACE: no space between number and suffix
* BYTE_FORMAT_ADJUST: sprintf adjusted two 2 decimals
* BYTE_FORMAT_SI: use 1000 instead of 1024
* @return string converted byte number (float) with suffix * @return string converted byte number (float) with suffix
*/ */
public static function humanReadableByteFormat($bytes, int $flags = 0): string public static function humanReadableByteFormat($bytes, int $flags = 0): string
@@ -62,7 +65,7 @@ class Byte
// si or normal // si or normal
$unit = $si ? 1000 : 1024; $unit = $si ? 1000 : 1024;
// always positive // always positive
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs($bytes); $abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs((float)$bytes);
// smaller than unit is always B // smaller than unit is always B
if ($abs_bytes < $unit) { if ($abs_bytes < $unit) {
return $bytes . 'B'; return $bytes . 'B';
@@ -110,6 +113,7 @@ class Byte
* *
* @param string|int|float $number any string or number to convert * @param string|int|float $number any string or number to convert
* @param int $flags bitwise flag with use space turned on * @param int $flags bitwise flag with use space turned on
* BYTE_FORMAT_SI: use 1000 instead of 1024
* @return string|int|float converted value or original value * @return string|int|float converted value or original value
*/ */
public static function stringByteFormat($number, int $flags = 0) public static function stringByteFormat($number, int $flags = 0)
@@ -134,7 +138,7 @@ class Byte
// remove all non valid characters from the number // remove all non valid characters from the number
$number = preg_replace('/[^0-9\.]/', '', $matches[2]); $number = preg_replace('/[^0-9\.]/', '', $matches[2]);
// final clean up and convert to float // final clean up and convert to float
$number = (float)trim($number); $number = (float)trim((string)$number);
// convert any mb/gb/etc to single m/b // convert any mb/gb/etc to single m/b
$unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[3]); $unit = preg_replace('/[^bkmgtpezy]/i', '', $matches[3]);
if ($unit) { if ($unit) {

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* check if string is valid in target encoding * convert string frmo one encdoing to another with auto detect flags
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -26,6 +26,7 @@ class MimeEncode
string $encoding, string $encoding,
string $line_break = "\r\n" string $line_break = "\r\n"
): string { ): string {
$current_internal_encoding = mb_internal_encoding();
// set internal encoding, so the mimeheader encode works correctly // set internal encoding, so the mimeheader encode works correctly
mb_internal_encoding($encoding); mb_internal_encoding($encoding);
// if a subject, make a work around for the broken mb_mimencode // if a subject, make a work around for the broken mb_mimencode
@@ -60,6 +61,9 @@ class MimeEncode
} }
// strip out any spaces BEFORE a line break // strip out any spaces BEFORE a line break
$string = str_replace(" " . $line_break, $line_break, $_string); $string = str_replace(" " . $line_break, $line_break, $_string);
// before we end, reset internal encoding
mb_internal_encoding($current_internal_encoding);
// return mime encoded string
return $string; return $string;
} }
} }

View File

@@ -0,0 +1,123 @@
<?php
/*
* string convert and transform functions
*/
declare(strict_types=1);
namespace CoreLibs\Convert;
class Strings
{
/**
* return the number of elements in the split list
* 0 if nothing / invalid split
* 1 if no split character found
* n for the numbers in the split list
*
* @param string $split_format
* @param string $split_characters
* @return int
*/
public static function countSplitParts(
string $split_format,
string $split_characters = '-'
): int {
if (
empty($split_format) ||
// non valid characters inside, abort
!preg_match("/^[0-9" . $split_characters . "]/", $split_format) ||
preg_match('/[^\x20-\x7e]/', $split_characters)
) {
return 0;
}
$split_list = preg_split(
// allowed split characters
"/([" . $split_characters . "]{1})/",
$split_format
);
if (!is_array($split_list)) {
return 0;
}
return count(array_filter($split_list));
}
/**
* split format a string base on a split format string
* split format string is eg
* 4-4-4 that means 4 characters DASH 4 characters DASH 4 characters
* So a string in the format of
* ABCD1234EFGH will be ABCD-1234-EFGH
* Note a string LONGER then the maxium will be attached with the LAST
* split character. In above exmaple
* ABCD1234EFGHTOOLONG will be ABCD-1234-EFGH-TOOLONG
*
* @param string $value string value to split
* @param string $split_format split format
* @param string $split_characters list of charcters with which we split
* if not set uses dash ('-')
* @return string split formatted string or original value if not chnaged
*/
public static function splitFormatString(
string $value,
string $split_format,
string $split_characters = '-'
): string {
if (
// abort if split format is empty
empty($split_format) ||
// if not in the valid ASCII character range for any of the strings
preg_match('/[^\x20-\x7e]/', $value) ||
// preg_match('/[^\x20-\x7e]/', $split_format) ||
preg_match('/[^\x20-\x7e]/', $split_characters) ||
// only numbers and split characters in split_format
!preg_match("/[0-9" . $split_characters . "]/", $split_format)
) {
return $value;
}
// split format list
$split_list = preg_split(
// allowed split characters
"/([" . $split_characters . "]{1})/",
$split_format,
-1,
PREG_SPLIT_DELIM_CAPTURE
);
// if this is false, or only one array, abort split
if (!is_array($split_list) || count($split_list) == 1) {
return $value;
}
$out = '';
$pos = 0;
$last_split = '';
foreach ($split_list as $offset) {
if (is_numeric($offset)) {
$_part = substr($value, $pos, (int)$offset);
if (empty($_part)) {
break;
}
$out .= $_part;
$pos += (int)$offset;
} elseif ($pos) { // if first, do not add
$out .= $offset;
$last_split = $offset;
}
}
if (!empty($out) && $pos < strlen($value)) {
$out .= $last_split . substr($value, $pos);
}
// if last is not alphanumeric remove, remove
if (!strcspn(substr($out, -1, 1), $split_characters)) {
$out = substr($out, 0, -1);
}
// overwrite only if out is set
if (!empty($out)) {
return $out;
} else {
return $value;
}
}
}
// __END__

View File

@@ -13,6 +13,20 @@ namespace CoreLibs\Create;
*/ */
class Email class Email
{ {
/** @var array<string> allowed list for encodings that can do KV folding */
private static $encoding_kv_allowed = [
'UTF-8',
'EUC-JP',
'SJIS',
'SJIS-win',
'ISO-2022-JP',
'ISO-2022-JP-MS',
'JIS',
'JIS-ms',
];
/** @var string normaly this does not need to be changed */
private static $mb_convert_kana_mode = 'KV';
/** /**
* create mime encoded email part for to/from emails. * create mime encoded email part for to/from emails.
* If encoding is not UTF-8 it will convert the email name to target encoding * If encoding is not UTF-8 it will convert the email name to target encoding
@@ -22,48 +36,54 @@ class Email
* @param string $email E-Mail address * @param string $email E-Mail address
* @param string $email_name Name for the email address, in UTF-8, if not set, empty * @param string $email_name Name for the email address, in UTF-8, if not set, empty
* @param string $encoding Encoding, if not set UTF-8 * @param string $encoding Encoding, if not set UTF-8
* @param bool $kv_folding If set to true and a valid encoding, do KV folding
* @return string Correctly encoded and build email string * @return string Correctly encoded and build email string
*/ */
public static function encodeEmailName( public static function encodeEmailName(
string $email, string $email,
string $email_name = '', string $email_name = '',
string $encoding = 'UTF-8' string $encoding = 'UTF-8',
bool $kv_folding = false
): string { ): string {
if (!empty($email_name)) { if (empty($email_name)) {
// if encoding is not UTF-8 then we convert
if ($encoding != 'UTF-8') {
$email_name = mb_convert_encoding($email_name, $encoding, 'UTF-8');
}
$email_name =
mb_encode_mimeheader(
mb_convert_kana(
$email_name,
'KV',
$encoding
),
$encoding
);
return '"' . $email_name . '" '
. '<' . (string)$email . '>';
} else {
return $email; return $email;
} }
// if encoding is not UTF-8 then we convert
if ($encoding != 'UTF-8') {
$email_name = mb_convert_encoding($email_name, $encoding, 'UTF-8');
}
$email_name =
mb_encode_mimeheader(
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
mb_convert_kana(
$email_name,
self::$mb_convert_kana_mode,
$encoding
) :
$email_name,
$encoding
);
return '"' . $email_name . '" '
. '<' . (string)$email . '>';
} }
/** /**
* Subject/Body replace sub function * Subject/Body replace sub function
* *
* @param string $subject Subject string, in UTF-8 * @param string $subject Subject string, in UTF-8
* @param string $body Body string, in UTF-8 * @param string $body Body string, in UTF-8
* @param array<string,string> $replace Replace the array as key -> value, in UTF-8 * @param array<string,string> $replace Replace the array as key -> value, in UTF-8
* @param string $encoding Encoding for subject encode mime header * @param string $encoding Encoding for subject encode mime header
* @return array<string> Pos 0: Subject, Pos 1: Body * @param bool $kv_folding If set to true and a valid encoding,
* do KV folding
* @return array<string> Pos 0: Subject, Pos 1: Body
*/ */
private static function replaceContent( private static function replaceContent(
string $subject, string $subject,
string $body, string $body,
array $replace, array $replace,
string $encoding string $encoding,
bool $kv_folding
): array { ): array {
foreach (['subject', 'body'] as $element) { foreach (['subject', 'body'] as $element) {
$$element = str_replace( $$element = str_replace(
@@ -83,7 +103,17 @@ class Email
$body = mb_convert_encoding($body, $encoding, 'UTF-8'); $body = mb_convert_encoding($body, $encoding, 'UTF-8');
} }
// we need to encodde the subject // we need to encodde the subject
$subject = mb_encode_mimeheader($subject, $encoding); $subject = mb_encode_mimeheader(
in_array($encoding, self::$encoding_kv_allowed) && $kv_folding ?
// for any non UTF-8 encoding convert kana
mb_convert_kana(
$subject,
self::$mb_convert_kana_mode,
$encoding
) :
$subject,
$encoding
);
return [$subject, $body]; return [$subject, $body];
} }
@@ -104,6 +134,8 @@ class Email
* @param array<string,string> $replace_content Subject/Body replace as * @param array<string,string> $replace_content Subject/Body replace as
* search -> replace, in UTF-8 * search -> replace, in UTF-8
* @param string $encoding E-Mail encoding, default UTF-8 * @param string $encoding E-Mail encoding, default UTF-8
* @param bool $kv_folding If set to true and a valid encoding,
* do KV folding
* @param bool $test test flag, default off * @param bool $test test flag, default off
* @param \CoreLibs\Debug\Logging|null $log Logging class, * @param \CoreLibs\Debug\Logging|null $log Logging class,
* only used if test flag is true * only used if test flag is true
@@ -112,6 +144,7 @@ class Email
* 0 for send not ok * 0 for send not ok
* -1 for nothing set (emails, subject, body) * -1 for nothing set (emails, subject, body)
* -2 for empty to list * -2 for empty to list
* -3 encoding target not valid or not installed
*/ */
public static function sendEmail( public static function sendEmail(
string $subject, string $subject,
@@ -121,6 +154,7 @@ class Email
array $send_to_emails, array $send_to_emails,
array $replace_content = [], array $replace_content = [],
string $encoding = 'UTF-8', string $encoding = 'UTF-8',
bool $kv_folding = false,
bool $test = false, bool $test = false,
?\CoreLibs\Debug\Logging $log = null ?\CoreLibs\Debug\Logging $log = null
): int { ): int {
@@ -136,6 +170,12 @@ class Email
if (empty($subject) || empty($body) || empty($from_email)) { if (empty($subject) || empty($body) || empty($from_email)) {
return -1; return -1;
} }
if (
$encoding != 'UTF-8' &&
!in_array($encoding, mb_list_encodings())
) {
return -3;
}
// if not one valid to, abort // if not one valid to, abort
foreach ($send_to_emails as $to_email) { foreach ($send_to_emails as $to_email) {
// to_email can be string, then only to email // to_email can be string, then only to email
@@ -147,7 +187,8 @@ class Email
$_to_email = self::encodeEmailName( $_to_email = self::encodeEmailName(
$to_email['email'], $to_email['email'],
$to_email['name'] ?? '', $to_email['name'] ?? '',
$encoding $encoding,
$kv_folding
); );
$to_emails[] = $_to_email; $to_emails[] = $_to_email;
// if we have to replacement, this override replace content // if we have to replacement, this override replace content
@@ -183,7 +224,8 @@ class Email
$subject, $subject,
$body, $body,
$replace_content, $replace_content,
$encoding $encoding,
$kv_folding
); );
} }
@@ -205,7 +247,8 @@ class Email
$subject, $subject,
$body, $body,
$_replace, $_replace,
$encoding $encoding,
$kv_folding
); );
} }
} }
@@ -220,6 +263,7 @@ class Email
// build debug strings: convert to UTF-8 if not utf-8 // build debug strings: convert to UTF-8 if not utf-8
$log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', ' $log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', '
. 'ENCODING: ' . $encoding . ', ' . 'ENCODING: ' . $encoding . ', '
. 'KV FOLDING: ' . $log->prBl($kv_folding) . ', '
. 'TO: ' . $to_email . ', ' . 'TO: ' . $to_email . ', '
. 'SUBJECT: ' . $out_subject . ', ' . 'SUBJECT: ' . $out_subject . ', '
. 'BODY: ' . ($encoding == 'UTF-8' ? . 'BODY: ' . ($encoding == 'UTF-8' ?
@@ -227,6 +271,7 @@ class Email
mb_convert_encoding($out_body, 'UTF-8', $encoding))); mb_convert_encoding($out_body, 'UTF-8', $encoding)));
$log->debug('SEND EMAIL JSON', json_encode([ $log->debug('SEND EMAIL JSON', json_encode([
'encoding' => $encoding, 'encoding' => $encoding,
'kv_folding' => $kv_folding,
'header' => $headers, 'header' => $headers,
'to' => $to_email, 'to' => $to_email,
'subject' => $out_subject, 'subject' => $out_subject,

View File

@@ -1,7 +1,7 @@
<?php <?php
/* /*
* html convert functions * random key functions
*/ */
declare(strict_types=1); declare(strict_types=1);

View File

@@ -46,21 +46,28 @@ class ArrayIO extends \CoreLibs\DB\IO
public $pk_name = ''; // the primary key from this table public $pk_name = ''; // the primary key from this table
/** @var int|string|null */ /** @var int|string|null */
public $pk_id; // the PK id public $pk_id; // the PK id
// security values
/** @var int base acl for current page */
private $base_acl_level = 0;
/** /**
* 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<mixed> $db_config db connection config * @param array<mixed> $db_config db connection config
* @param array<mixed> $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
* @param \CoreLibs\Debug\Logging|null $log Logging class, default set if not set * @param \CoreLibs\Debug\Logging|null $log Logging class, default set if not set
* @param int $base_acl_level Set base acl level, if needed
* @param int $acl_admin Flag if this is an admin ACL access level
*/ */
public function __construct( public function __construct(
array $db_config, array $db_config,
array $table_array, array $table_array,
string $table_name, string $table_name,
\CoreLibs\Debug\Logging $log = null \CoreLibs\Debug\Logging $log = null,
int $base_acl_level = 0,
int $acl_admin = 0
) { ) {
// instance db_io class // instance db_io class
parent::__construct($db_config, $log ?? new \CoreLibs\Debug\Logging()); parent::__construct($db_config, $log ?? new \CoreLibs\Debug\Logging());
@@ -79,6 +86,7 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
} }
} // set pk_name IF table_array was given } // set pk_name IF table_array was given
$this->dbArrayIOSetAcl($base_acl_level, $acl_admin);
} }
/** /**
@@ -89,6 +97,33 @@ class ArrayIO extends \CoreLibs\DB\IO
parent::__destruct(); parent::__destruct();
} }
/**
* set the base acl level and admin acl flag
* This is needed for table array ACL checks
* if not set I assume 0 (non write/non read/non admin)
*
* @param int $base_acl_level ACL Level from 0 to 100, -1 is not allowed
* Will sett 0 if invalid
* @param int $acl_admin 0 for non admin, 1 for admin (base acl is 100)
* @return void
*/
public function dbArrayIOSetAcl(int $base_acl_level, int $acl_admin): void
{
// default not allowed, must be 0 at least
if ($base_acl_level < 0) {
$base_acl_level = 0;
}
// only 0 or 1 allowed
if (!in_array($acl_admin, [0, 1])) {
$acl_admin = 0;
}
// if the user is admin flagged, auto set to 100, if not already set to 100
if ($acl_admin == 1) {
$base_acl_level = 100;
}
$this->base_acl_level = $base_acl_level;
}
/** /**
* changes all previously alterd HTML code into visible one, * changes all previously alterd HTML code into visible one,
* works for <b>,<i>, and <a> (thought <a> can be / or should * works for <b>,<i>, and <a> (thought <a> can be / or should
@@ -191,9 +226,10 @@ class ArrayIO extends \CoreLibs\DB\IO
* *
* @param array<mixed> $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
* @param boolean $acl_limit [false], if set to true, well do ACL limit check
* @return array<mixed> returns the table array that was deleted * @return array<mixed> returns the table array that was deleted
*/ */
public function dbDelete($table_array = []) public function dbDelete($table_array = [], $acl_limit = false)
{ {
// 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)) {
@@ -202,6 +238,11 @@ class ArrayIO extends \CoreLibs\DB\IO
if (!$this->dbCheckPkSet()) { if (!$this->dbCheckPkSet()) {
return $this->table_array; return $this->table_array;
} }
if ($acl_limit === true && $this->base_acl_level < 100) {
$this->log->debug('DB DELETE ERROR', 'ACL Limit on, Delete, '
. 'but base ACL level of 100 not met: ' . $this->base_acl_level);
return $this->table_array;
}
// delete query // delete query
$q = 'DELETE FROM ' . $this->table_name . ' WHERE '; $q = 'DELETE FROM ' . $this->table_name . ' WHERE ';
$q .= $this->pk_name . ' = ' . $this->table_array[$this->pk_name]['value'] . ' '; $q .= $this->pk_name . ' = ' . $this->table_array[$this->pk_name]['value'] . ' ';
@@ -338,10 +379,14 @@ class ArrayIO extends \CoreLibs\DB\IO
* *
* @param boolean $addslashes old convert entities and set set escape * @param boolean $addslashes old convert entities and set set escape
* @param array<mixed> $table_array optional table array, overwrites internal one * @param array<mixed> $table_array optional table array, overwrites internal one
* @param boolean $acl_limit [false], if set to true, well do ACL limit check
* @return array<mixed> table array or null * @return array<mixed> table array or null
*/ */
public function dbWrite($addslashes = false, $table_array = []) public function dbWrite(
{ bool $addslashes = false,
array $table_array = [],
bool $acl_limit = false
): 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;
} }
@@ -355,6 +400,12 @@ class ArrayIO extends \CoreLibs\DB\IO
} else { } else {
$insert = 0; $insert = 0;
} }
// early abort for new write with not enough ACL level
if ($insert && $acl_limit === true && $this->base_acl_level < 100) {
$this->log->debug('DB WRITE ERROR', 'ACL Limit on, Insert, '
. 'but base ACL level of 100 not met: ' . $this->base_acl_level);
return $this->table_array;
}
reset($this->table_array); reset($this->table_array);
$q_data = ''; $q_data = '';
@@ -408,11 +459,25 @@ 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
// also do not write UPDATE for elements that are
// acl flagged, not if we have an ACL limiter, don't insert
// $this->log->debug('DB WRITE', 'C: ' . $column . ', '
// . 'ACL Level ' . $this->log->prBl($acl_limit) . ', '
// . 'TA ACL: ' . ($this->table_array[$column]['min_edit_acl'] ?? 100) . ', '
// . 'Base ACL: ' . $this->base_acl_level);
if ( if (
!isset($this->table_array[$column]['pk']) && !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 &&
// no acl limiter
($acl_limit === false ||
(
// acl limit is true, min edit must be at larger than set
$acl_limit === true &&
$this->base_acl_level >=
($this->table_array[$column]['min_edit_acl'] ?? 100)
))
) { ) {
// for password use hidden value if main is not set // for password use hidden value if main is not set
if ( if (
@@ -510,6 +575,11 @@ class ArrayIO extends \CoreLibs\DB\IO
} }
} // while ... } // while ...
if (empty($q_data)) {
$this->log->debug('DB WRITE ERROR', 'No data to write, possible through ACL');
return $this->table_array;
}
// NOW get PK, and FK settings (FK only for update query) // NOW get PK, and FK settings (FK only for update query)
// get it at the end, cause now we can be more sure of no double IDs, etc // get it at the end, cause now we can be more sure of no double IDs, etc
reset($this->table_array); reset($this->table_array);

View File

@@ -1488,12 +1488,17 @@ class IO
/** /**
* escape data for writing to bytea type column field * escape data for writing to bytea type column field
* @param string $bytea bytea to escape * @param string $data data to escape to bytea
* @return string escaped bytea * @return string escaped bytea
*/ */
public function dbEscapeBytea($bytea) public function dbEscapeBytea($data)
{ {
return $this->db_functions->__dbEscapeBytea($bytea); return $this->db_functions->__dbEscapeBytea($data);
}
public function dbUnescapeBytea($bytea)
{
return $this->db_functions->__dbUnescapeBytea($bytea);
} }
/** /**
@@ -2580,9 +2585,9 @@ class IO
// loop through the write array and each field to build the query // loop through the write array and each field to build the query
foreach ($write_array as $field) { foreach ($write_array as $field) {
if ( if (
(empty($primary_key['value']) || (
(!empty($primary_key['value']) && empty($primary_key['value']) ||
!in_array($field, $not_write_update_array)) !in_array($field, $not_write_update_array)
) && ) &&
!in_array($field, $not_write_array) !in_array($field, $not_write_array)
) { ) {
@@ -2963,7 +2968,7 @@ class IO
* Either as single array level for single insert * Either as single array level for single insert
* Or nested array for multiple insert values * Or nested array for multiple insert values
* *
* If key was set only returns tghose values directly or as array * If key was set only returns those values directly or as array
* *
* On multiple insert return the position for which to return can be set too * On multiple insert return the position for which to return can be set too
* *
@@ -2978,7 +2983,7 @@ class IO
// return as is if key is null // return as is if key is null
if ($key === null) { if ($key === null) {
if (count($this->insert_id_arr) == 1) { if (count($this->insert_id_arr) == 1) {
// return as nul if not found // return as null if not found
return $this->insert_id_arr[0] ?? null; return $this->insert_id_arr[0] ?? null;
} else { } else {
return $this->insert_id_arr; return $this->insert_id_arr;

View File

@@ -559,15 +559,26 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions
/** /**
* wrapper for pg_escape_byte * wrapper for pg_escape_byte
* *
* @param string $bytea bytea data stream * @param string $data data stream
* @return string escaped bytea string * @return string escaped bytea string
*/ */
public function __dbEscapeBytea(string $bytea): string public function __dbEscapeBytea(string $data): string
{ {
if ($this->dbh === false || is_bool($this->dbh)) { if ($this->dbh === false || is_bool($this->dbh)) {
return ''; return '';
} }
return pg_escape_bytea($this->dbh, $bytea); return pg_escape_bytea($this->dbh, $data);
}
/**
* unescape bytea data from postgesql
*
* @param string $bytea Bytea data stream
* @return string Unescaped bytea data
*/
public function __dbUnescapeBytea(string $bytea): string
{
return pg_unescape_bytea($bytea);
} }
/** /**
@@ -779,7 +790,6 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions
} }
// get result // get result
$db_schema = $this->__dbFetchArray($cursor, PGSQL_ASSOC); $db_schema = $this->__dbFetchArray($cursor, PGSQL_ASSOC);
/** @phpstan-ignore-next-line Cannot access offset string on array|bool */
return $db_schema[$show_string] ?? ''; return $db_schema[$show_string] ?? '';
} }
@@ -806,7 +816,6 @@ class PgSQL implements \CoreLibs\DB\SQL\SqlInterface\SqlFunctions
} }
// check if schema does not exists // check if schema does not exists
$row = $this->__dbFetchArray($cursor, PGSQL_ASSOC); $row = $this->__dbFetchArray($cursor, PGSQL_ASSOC);
/** @phpstan-ignore-next-line */
if (empty($row['exists']) || $row['exists'] == 'f') { if (empty($row['exists']) || $row['exists'] == 'f') {
return 2; return 2;
} }

View File

@@ -214,10 +214,18 @@ interface SqlFunctions
/** /**
* Undocumented function * Undocumented function
* *
* @param string $bytea * @param string $data
* @return string * @return string
*/ */
public function __dbEscapeBytea(string $bytea): string; public function __dbEscapeBytea(string $data): string;
/**
* Undocumented function
*
* @param string $bytea
* @return string
*/
public function __dbUnescapeBytea(string $bytea): string;
/** /**
* Undocumented function * Undocumented function

View File

@@ -173,7 +173,7 @@ class Logging
// can be overridden with basicSetLogFileId later // can be overridden with basicSetLogFileId later
if (!empty($this->options['file_id'])) { if (!empty($this->options['file_id'])) {
$this->setLogId($this->options['file_id'] ?? ''); $this->setLogId($this->options['file_id']);
} elseif (!empty($GLOBALS['LOG_FILE_ID'])) { } elseif (!empty($GLOBALS['LOG_FILE_ID'])) {
// legacy flow, should be removed and only set via options // legacy flow, should be removed and only set via options
$this->setLogId($GLOBALS['LOG_FILE_ID']); $this->setLogId($GLOBALS['LOG_FILE_ID']);

View File

@@ -270,9 +270,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public $save; public $save;
/** @var string */ /** @var string */
public $remove_button; public $remove_button;
// security publics // security values
/** @var int */ /** @var int base acl for current page */
public $base_acl_level; private $base_acl_level = 0;
/** @var int admin master flag (1/0) */
private $acl_admin = 0;
/** @var array<mixed> */ /** @var array<mixed> */
public $security_level; public $security_level;
// layout publics // layout publics
@@ -336,6 +338,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// load config array // load config array
// get table array definitions for current page name // get table array definitions for current page name
// security settings
$this->base_acl_level = (int)$_SESSION['BASE_ACL_LEVEL'];
$this->acl_admin = (int)$_SESSION['ADMIN'];
$GLOBALS['base_acl_level'] = $this->base_acl_level;
$GLOBALS['acl_admin'] = $this->acl_admin;
// first check if we have a in page override as $table_arrays[page name] // first check if we have a in page override as $table_arrays[page name]
if ( if (
/* isset($GLOBALS['table_arrays']) && /* isset($GLOBALS['table_arrays']) &&
@@ -348,7 +356,8 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// $config_array = $GLOBALS['table_arrays'][System::getPageName(1)]; // $config_array = $GLOBALS['table_arrays'][System::getPageName(1)];
$config_array = $table_arrays[System::getPageName(1)]; $config_array = $table_arrays[System::getPageName(1)];
} else { } else {
// WARNING: auto spl load does not work with this as it is an array and not a function/object // WARNING: auto spl load does not work with this as it is an array
// and not a function/object
// check if this is the old path or the new path // check if this is the old path or the new path
// check local folder in current path // check local folder in current path
// then check general global folder // then check general global folder
@@ -383,8 +392,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$db_config, $db_config,
$config_array['table_array'], $config_array['table_array'],
$config_array['table_name'], $config_array['table_name'],
$log ?? new \CoreLibs\Debug\Logging() $log ?? new \CoreLibs\Debug\Logging(),
// set the ACL
$this->base_acl_level,
$this->acl_admin
); );
// $this->log->debug('SESSION FORM', 'sessin: ' . $this->log->prAr($_SESSION));
// here should be a check if the config_array is correct ... // here should be a check if the config_array is correct ...
if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) { if (isset($config_array['show_fields']) && is_array($config_array['show_fields'])) {
$this->field_array = $config_array['show_fields']; $this->field_array = $config_array['show_fields'];
@@ -392,6 +405,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (isset($config_array['load_query']) && $config_array['load_query']) { if (isset($config_array['load_query']) && $config_array['load_query']) {
$this->load_query = $config_array['load_query']; $this->load_query = $config_array['load_query'];
} }
if (empty($this->load_query)) {
$this->log->debug('INIT ERROR', 'Missing Load Query for: ' . $this->my_page_name);
}
$this->archive_pk_name = 'a_' . $this->pk_name; $this->archive_pk_name = 'a_' . $this->pk_name;
$this->col_name = str_replace('_id', '', $this->pk_name); $this->col_name = str_replace('_id', '', $this->pk_name);
$this->int_pk_name = $this->pk_name; $this->int_pk_name = $this->pk_name;
@@ -416,8 +432,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->save = $_POST['save'] ?? ''; $this->save = $_POST['save'] ?? '';
$this->remove_button = $_POST['remove_button'] ?? ''; $this->remove_button = $_POST['remove_button'] ?? '';
// security settings
$this->base_acl_level = $_SESSION['BASE_ACL_LEVEL'] ?? 0;
// security levels for buttons/actions // security levels for buttons/actions
// if array does not exists create basic // if array does not exists create basic
if ( if (
@@ -428,9 +442,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
) )
) { ) {
$this->security_level = [ $this->security_level = [
'load' => 100, 'load' => 20,
'new' => 100, 'new' => 100,
'save' => 100, 'save' => 40,
'delete' => 100 'delete' => 100
]; ];
} else { } else {
@@ -438,9 +452,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->security_level = isset($config_array['security_level']) ? $this->security_level = isset($config_array['security_level']) ?
$config_array['security_level'] : $config_array['security_level'] :
[ [
'load' => 100, 'load' => 20,
'new' => 100, 'new' => 100,
'save' => 100, 'save' => 40,
'delete' => 100 'delete' => 100
]; ];
} }
@@ -489,8 +503,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
* @param string|null $key_value value to match to (optional) * @param string|null $key_value value to match to (optional)
* @return string|null returns key found or empty string * @return string|null returns key found or empty string
*/ */
public function formGetColNameFromKey(string $want_key, ?string $key_value = null): ?string public function formGetColNameFromKey(
{ string $want_key,
?string $key_value = null
): ?string {
if (!is_array($this->table_array)) { if (!is_array($this->table_array)) {
$this->table_array = []; $this->table_array = [];
} }
@@ -513,8 +529,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
* @param string|null $key_value if set searches for special right value * @param string|null $key_value if set searches for special right value
* @return array<mixed> found key fields * @return array<mixed> found key fields
*/ */
public function formGetColNameArrayFromKey(string $want_key, ?string $key_value = null): array public function formGetColNameArrayFromKey(
{ string $want_key,
?string $key_value = null
): array {
$key_array = []; $key_array = [];
if (!is_array($this->table_array)) { if (!is_array($this->table_array)) {
$this->table_array = []; $this->table_array = [];
@@ -648,8 +666,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
* @param array<mixed> $remove_name key names that should be removed * @param array<mixed> $remove_name key names that should be removed
* @return void has no return * @return void has no return
*/ */
public function formProcedureDeleteFromElementList(array $element_list, array $remove_name): void public function formProcedureDeleteFromElementList(
{ array $element_list,
array $remove_name
): void {
/** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */ /** @phan-suppress-next-line PhanTypeArraySuspiciousNullable */
$this->log->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: ' . $this->base_acl_level . ' >= ' $this->log->debug('REMOVE ELEMENT', 'Remove REF ELEMENT: ' . $this->base_acl_level . ' >= '
. $this->security_level['delete']); . $this->security_level['delete']);
@@ -752,55 +772,72 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$t_pk_name = ''; $t_pk_name = '';
$pk_names = []; $pk_names = [];
$pk_ids = []; $pk_ids = [];
$seclevel_okay = false;
// for error abort only
$return_array = [
't_pk_name' => $t_pk_name,
'pk_ids' => $pk_ids,
'pk_names' => $pk_names,
'pk_selected' => $pk_selected,
'seclevel_okay' => $seclevel_okay,
];
// when security level is okay ... // when security level is okay ...
if ( if (
isset($this->security_level['load']) && empty($this->security_level['load']) ||
$this->base_acl_level >= $this->security_level['load'] $this->base_acl_level < $this->security_level['load']
) { ) {
$t_pk_name = $this->archive_pk_name; return $return_array;
}
if (empty($this->load_query)) {
$this->log->debug('LOAD LIST ERROR', 'Missing load list query');
return $return_array;
}
// load list data $t_pk_name = $this->archive_pk_name;
$this->dbExec($this->load_query);
while (is_array($res = $this->dbFetchArray())) { // load list data
$pk_ids[] = $res[$this->int_pk_name]; $this->dbExec($this->load_query);
if ( while (is_array($res = $this->dbFetchArray())) {
isset($this->table_array[$this->int_pk_name]['value']) && $pk_ids[] = $res[$this->int_pk_name];
$res[$this->int_pk_name] == $this->table_array[$this->int_pk_name]['value'] if (
) { isset($this->table_array[$this->int_pk_name]['value']) &&
$pk_selected = $res[$this->int_pk_name]; $res[$this->int_pk_name] == $this->table_array[$this->int_pk_name]['value']
} ) {
$t_string = ''; $pk_selected = $res[$this->int_pk_name];
foreach ($this->field_array as $i => $field_array) {
if ($t_string) {
$t_string .= ', ';
}
if (isset($field_array['before_value'])) {
$t_string .= $field_array['before_value'];
}
// must have res element set
if (
isset($field_array['name']) &&
isset($res[$field_array['name']])
) {
if (isset($field_array['binary'])) {
if (isset($field_array['binary'][0])) {
$t_string .= $field_array['binary'][0];
} elseif (isset($field_array['binary'][1])) {
$t_string .= $field_array['binary'][1];
}
} else {
$t_string .= $res[$field_array['name']];
}
}
}
$pk_names[] = $t_string;
} }
} // show it at all $t_string = '';
foreach ($this->field_array as $i => $field_array) {
if ($t_string) {
$t_string .= ', ';
}
if (isset($field_array['before_value'])) {
$t_string .= $field_array['before_value'];
}
// must have res element set
if (
isset($field_array['name']) &&
isset($res[$field_array['name']])
) {
if (isset($field_array['binary'])) {
if (isset($field_array['binary'][0])) {
$t_string .= $field_array['binary'][0];
} elseif (isset($field_array['binary'][1])) {
$t_string .= $field_array['binary'][1];
}
} else {
$t_string .= $res[$field_array['name']];
}
}
}
$pk_names[] = $t_string;
}
$seclevel_okay = true;
return [ return [
't_pk_name' => $t_pk_name, 't_pk_name' => $t_pk_name,
'pk_ids' => $pk_ids, 'pk_ids' => $pk_ids,
'pk_names' => $pk_names, 'pk_names' => $pk_names,
'pk_selected' => $pk_selected 'pk_selected' => $pk_selected,
'seclevel_okay' => $seclevel_okay,
]; ];
} }
@@ -808,30 +845,38 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
* Create new entry element for HTML output * Create new entry element for HTML output
* *
* @param bool $hide_new_checkbox show or hide the new checkbox, default is false * @param bool $hide_new_checkbox show or hide the new checkbox, default is false
* @return array<string,string|int> return the new create array with name & checkbox show flag * @return array<string,string|bool> return the new create array with name & checkbox show flag
*/ */
public function formCreateNew($hide_new_checkbox = false): array public function formCreateNew(bool $hide_new_checkbox = false): array
{ {
$show_checkbox = 0; $show_checkbox = false;
$new_name = ''; $new_name = '';
$seclevel_okay = false;
// when security level is okay // when security level is okay
if ( if (
isset($this->security_level['new']) && empty($this->security_level['new']) ||
$this->base_acl_level >= $this->security_level['new'] $this->base_acl_level < $this->security_level['new']
) { ) {
if ($this->yes && !$hide_new_checkbox) { return [
$show_checkbox = 1; 'new_name' => $new_name,
} 'show_checkbox' => $show_checkbox,
// set type of new name 'seclevel_okay' => $seclevel_okay,
if ($this->yes) { ];
$new_name = $this->l->__('Clear all and create new'); }
} else { if ($this->yes && !$hide_new_checkbox) {
$new_name = $this->l->__('New'); $show_checkbox = false;
} }
} // security level okay // set type of new name
if ($this->yes) {
$new_name = $this->l->__('Clear all and create new');
} else {
$new_name = $this->l->__('New');
}
$seclevel_okay = true;
return [ return [
'new_name' => $new_name, 'new_name' => $new_name,
'show_checkbox' => $show_checkbox 'show_checkbox' => $show_checkbox,
'seclevel_okay' => $seclevel_okay,
]; ];
} }
@@ -842,42 +887,57 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
* @return array<string,mixed> return the hide/show delete framework * @return array<string,mixed> return the hide/show delete framework
* for html creation * for html creation
*/ */
public function formCreateSaveDelete($hide_delete = false, $hide_delete_checkbox = false): array public function formCreateSaveDelete(
{ bool $hide_delete = false,
$seclevel_okay = 0; bool $hide_delete_checkbox = false,
bool $old_school_hidden = false
): array {
$seclevel_okay = false;
$save = ''; $save = '';
$pk_name = ''; $pk_name = '';
$pk_value = ''; $pk_value = '';
$show_delete = 0; $show_delete = false;
$old_school_hidden = 0;
if ( if (
(isset($this->security_level['save']) && (empty($this->security_level['save']) ||
$this->base_acl_level >= $this->security_level['save']) || $this->base_acl_level < $this->security_level['save']) &&
(isset($this->security_level['delete']) && (empty($this->security_level['delete']) ||
$this->base_acl_level >= $this->security_level['delete']) $this->base_acl_level < $this->security_level['delete'])
) { ) {
if ($this->base_acl_level >= $this->security_level['save']) { return [
$seclevel_okay = 1; 'seclevel_okay' => $seclevel_okay,
if (empty($this->table_array[$this->int_pk_name]['value'])) { 'save' => $save,
$save = $this->l->__('Save'); 'pk_name' => $pk_name,
} else { 'pk_value' => $pk_value,
$save = $this->l->__('Update'); 'show_delete' => $show_delete,
} 'old_school_hidden' => $old_school_hidden,
// print the old_school hidden if requestet 'hide_delete_checkbox' => $hide_delete_checkbox
if ($old_school_hidden == 1) { /** @phpstan-ignore-line Unclear logic */ ];
$pk_name = $this->int_pk_name; }
$pk_value = $this->table_array[$this->int_pk_name]['value']; if (
} !empty($this->security_level['save']) &&
} // show save part $this->base_acl_level >= $this->security_level['save']
// show delete part only if pk is set && we want to see the delete ) {
if ( $seclevel_okay = true;
!empty($this->table_array[$this->int_pk_name]['value']) && if (empty($this->table_array[$this->int_pk_name]['value'])) {
!$hide_delete && $save = $this->l->__('Save');
$this->base_acl_level >= $this->security_level['delete'] } else {
) { $save = $this->l->__('Update');
$show_delete = 1;
} }
} // print save/delete row at all$ // print the old_school hidden if requestet
if ($old_school_hidden === true) {
$pk_name = $this->int_pk_name;
$pk_value = $this->table_array[$this->int_pk_name]['value'];
}
} // show save part
// show delete part only if pk is set && we want to see the delete
if (
!empty($this->table_array[$this->int_pk_name]['value']) &&
!$hide_delete &&
!empty($this->security_level['delete']) &&
$this->base_acl_level >= $this->security_level['delete']
) {
$show_delete = true;
}
return [ return [
'seclevel_okay' => $seclevel_okay, 'seclevel_okay' => $seclevel_okay,
'save' => $save, 'save' => $save,
@@ -921,11 +981,16 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} }
// create right side depending on 'definiton' in table_array // create right side depending on 'definiton' in table_array
$type = $this->table_array[$element_name]['type']; $type = $this->table_array[$element_name]['type'];
// set default min edit/read to 100 (admin)
$min_edit_acl = $this->table_array[$element_name]['min_edit_acl'] ?? 100;
$min_show_acl = $this->table_array[$element_name]['min_show_acl'] ?? 100;
$show_value = '-';
// view only output // view only output
if ($this->table_array[$element_name]['type'] == 'view') { if ($this->table_array[$element_name]['type'] == 'view') {
$data['value'] = empty($this->table_array[$element_name]['value']) ? $data['value'] = empty($this->table_array[$element_name]['value']) ?
$this->table_array[$element_name]['empty'] : $this->table_array[$element_name]['empty'] :
$this->table_array[$element_name]['value']; $this->table_array[$element_name]['value'];
$show_value = $data['value'];
} }
// binary true/false element // binary true/false element
if ($this->table_array[$element_name]['type'] == 'binary') { if ($this->table_array[$element_name]['type'] == 'binary') {
@@ -940,6 +1005,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
(!$i && !$this->table_array[$element_name]['value'])) (!$i && !$this->table_array[$element_name]['value']))
) { ) {
$data['checked'] = $this->table_array[$element_name]['value']; $data['checked'] = $this->table_array[$element_name]['value'];
$show_value = $this->table_array[$element_name]['element_list'][$i] ?? $data['checked'];
} }
if ($i) { if ($i) {
@@ -952,6 +1018,9 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['name'] = $element_name; $data['name'] = $element_name;
$data['value'][] = $this->table_array[$element_name]['element_list']; $data['value'][] = $this->table_array[$element_name]['element_list'];
$data['checked'] = $this->table_array[$element_name]['value']; $data['checked'] = $this->table_array[$element_name]['value'];
// array map element list + value
// foreach ($data['checked'] as $checked)
$show_value = join(', ', $data['checked']);
} }
// normal text element // normal text element
if ($this->table_array[$element_name]['type'] == 'text') { if ($this->table_array[$element_name]['type'] == 'text') {
@@ -959,6 +1028,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['value'] = $this->table_array[$element_name]['value'] ?? ''; $data['value'] = $this->table_array[$element_name]['value'] ?? '';
$data['size'] = $this->table_array[$element_name]['size'] ?? ''; $data['size'] = $this->table_array[$element_name]['size'] ?? '';
$data['length'] = $this->table_array[$element_name]['length'] ?? ''; $data['length'] = $this->table_array[$element_name]['length'] ?? '';
$show_value = $data['value'];
} }
// password element, does not write back the value // password element, does not write back the value
if ($this->table_array[$element_name]['type'] == 'password') { if ($this->table_array[$element_name]['type'] == 'password') {
@@ -971,11 +1041,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if ($this->table_array[$element_name]['type'] == 'date') { if ($this->table_array[$element_name]['type'] == 'date') {
$data['name'] = $element_name; $data['name'] = $element_name;
$data['value'] = $this->table_array[$element_name]['value'] ?? ''; $data['value'] = $this->table_array[$element_name]['value'] ?? '';
$show_value = $data['value'];
} }
// date time (no sec) (YYYY-MM-DD HH:mm) // date time (no sec) (YYYY-MM-DD HH:mm)
if ($this->table_array[$element_name]['type'] == 'datetime') { if ($this->table_array[$element_name]['type'] == 'datetime') {
$data['name'] = $element_name; $data['name'] = $element_name;
$data['value'] = $this->table_array[$element_name]['value'] ?? ''; $data['value'] = $this->table_array[$element_name]['value'] ?? '';
$show_value = $data['value'];
} }
// textarea // textarea
if ($this->table_array[$element_name]['type'] == 'textarea') { if ($this->table_array[$element_name]['type'] == 'textarea') {
@@ -983,6 +1055,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['value'] = $this->table_array[$element_name]['value'] ?? ''; $data['value'] = $this->table_array[$element_name]['value'] ?? '';
$data['rows'] = $this->table_array[$element_name]['rows'] ?? ''; $data['rows'] = $this->table_array[$element_name]['rows'] ?? '';
$data['cols'] = $this->table_array[$element_name]['cols'] ?? ''; $data['cols'] = $this->table_array[$element_name]['cols'] ?? '';
$show_value = $data['value'];
} }
// for drop_down_* // for drop_down_*
if (preg_match("/^drop_down_/", $this->table_array[$element_name]['type'])) { if (preg_match("/^drop_down_/", $this->table_array[$element_name]['type'])) {
@@ -1047,6 +1120,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$this->table_array[$element_name]['value'] == $res[0] $this->table_array[$element_name]['value'] == $res[0]
) { ) {
$data['selected'] = $this->table_array[$element_name]['value']; $data['selected'] = $this->table_array[$element_name]['value'];
$show_value = $res[1];
} }
} }
// for _input put additional field next to drop down // for _input put additional field next to drop down
@@ -1079,6 +1153,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['output'][] = $value; $data['output'][] = $value;
if ($this->table_array[$element_name]['value'] == $key) { if ($this->table_array[$element_name]['value'] == $key) {
$data['selected'] = $this->table_array[$element_name]['value']; $data['selected'] = $this->table_array[$element_name]['value'];
$show_value = $value;
} }
} }
} }
@@ -1093,6 +1168,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$data['output'][] = $value; $data['output'][] = $value;
if ($this->table_array[$element_name]['value'] == $key) { if ($this->table_array[$element_name]['value'] == $key) {
$data['checked'] = $this->table_array[$element_name]['value']; $data['checked'] = $this->table_array[$element_name]['value'];
$show_value = $value;
} }
$data['separator'] = ''; $data['separator'] = '';
} }
@@ -1126,7 +1202,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
'output_name' => $output_name, 'output_name' => $output_name,
'color' => $EDIT_FGCOLOR_T, 'color' => $EDIT_FGCOLOR_T,
'type' => $type, 'type' => $type,
'data' => $data 'data' => $data,
'show_value' => $show_value,
'allow_edit' => $this->base_acl_level >= $min_edit_acl ? 1 : 0,
'allow_show' => $this->base_acl_level >= $min_show_acl ? 1 : 0,
]; ];
} }
@@ -1146,6 +1225,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
} }
reset($this->table_array); reset($this->table_array);
foreach ($this->table_array as $key => $value) { foreach ($this->table_array as $key => $value) {
// skip if we are not allowe to write this anyway
// $this->log->debug('ERROR CHECK', 'ACL K: ' . $key . ', '
// . ($value['min_edit_acl'] ?? 100) . ' < ' . $this->base_acl_level);
if ($this->base_acl_level < ($value['min_edit_acl'] ?? 100)) {
continue;
}
//if ($value['mandatory'] && $value['error_check']) //if ($value['mandatory'] && $value['error_check'])
// if error value set && somethign input, check if input okay // if error value set && somethign input, check if input okay
if ( if (
@@ -1373,6 +1458,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// do check for reference tables // do check for reference tables
reset($this->reference_array); reset($this->reference_array);
foreach ($this->reference_array as $key => $value) { foreach ($this->reference_array as $key => $value) {
// skip if not allowed to write
if (
$this->base_acl_level < ($this->reference_array[$key]['min_edit_acl'] ?? 100)
) {
continue;
}
if ( if (
isset($this->reference_array[$key]['mandatory']) && isset($this->reference_array[$key]['mandatory']) &&
$this->reference_array[$key]['mandatory'] && $this->reference_array[$key]['mandatory'] &&
@@ -1392,6 +1483,12 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
if (!is_array($reference_array)) { if (!is_array($reference_array)) {
$reference_array = []; $reference_array = [];
} }
// skip if not allowed to write
if (
$this->base_acl_level < ($this->reference_array['min_edit_acl'] ?? 100)
) {
continue;
}
// set pk/fk id for this // set pk/fk id for this
$_pk_name = ''; $_pk_name = '';
$_fk_name = ''; $_fk_name = '';
@@ -1567,32 +1664,33 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
{ {
// get order name // get order name
$order_name = $this->formGetColNameFromKey('order'); $order_name = $this->formGetColNameFromKey('order');
if ($order_name) { if (empty($order_name)) {
// first check out of order ... return $this->table_array;
if (empty($this->table_array[$order_name]['value'])) { }
// set order (read max) // first check out of order ...
$q = 'SELECT MAX(' . $order_name . ') + 1 AS max_page_order ' if (empty($this->table_array[$order_name]['value'])) {
. 'FROM ' . $this->table_name; // set order (read max)
if ( $q = 'SELECT MAX(' . $order_name . ') + 1 AS max_page_order '
is_array($res = $this->dbReturnRow($q)) && . 'FROM ' . $this->table_name;
!empty($res['max_page_order']) if (
) { is_array($res = $this->dbReturnRow($q)) &&
$this->table_array[$order_name]['value'] = $res['max_page_order']; !empty($res['max_page_order'])
} ) {
// frist element is 0 because NULL gets returned, set to 1 $this->table_array[$order_name]['value'] = $res['max_page_order'];
if (!$this->table_array[$order_name]['value']) { }
$this->table_array[$order_name]['value'] = 1; // frist element is 0 because NULL gets returned, set to 1
} if (!$this->table_array[$order_name]['value']) {
} elseif (!empty($this->table_array[$this->int_pk_name]['value'])) { $this->table_array[$order_name]['value'] = 1;
$q = 'SELECT ' . $order_name . ' AS order_name ' }
. 'FROM ' . $this->table_name . ' ' } elseif (!empty($this->table_array[$this->int_pk_name]['value'])) {
. 'WHERE ' . $this->int_pk_name . ' = ' . $this->table_array[$this->int_pk_name]['value']; $q = 'SELECT ' . $order_name . ' AS order_name '
if ( . 'FROM ' . $this->table_name . ' '
is_array($res = $this->dbReturnRow($q)) && . 'WHERE ' . $this->int_pk_name . ' = ' . $this->table_array[$this->int_pk_name]['value'];
!empty($res['order_name']) if (
) { is_array($res = $this->dbReturnRow($q)) &&
$this->table_array[$order_name]['value'] = $res['order_name']; !empty($res['order_name'])
} ) {
$this->table_array[$order_name]['value'] = $res['order_name'];
} }
} }
return $this->table_array; return $this->table_array;
@@ -1681,7 +1779,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
* @param bool $addslashes override internal addslasahes flag (default false) * @param bool $addslashes override internal addslasahes flag (default false)
* @return void has no return * @return void has no return
*/ */
public function formSaveTableArray($addslashes = false) public function formSaveTableArray(bool $addslashes = false)
{ {
// for drop_down_db_input check if text field is filled and if, if not yet in db ... // for drop_down_db_input check if text field is filled and if, if not yet in db ...
// and upload files // and upload files
@@ -1827,7 +1925,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
// . $this->table_array[$this->pk_name]['value'] . "/" // . $this->table_array[$this->pk_name]['value'] . "/"
// . $this->table_array[$this->int_pk_name]['value']); // . $this->table_array[$this->int_pk_name]['value']);
// write the object // write the object
$this->dbWrite($addslashes); $this->dbWrite($addslashes, [], true);
// write reference array (s) if necessary // write reference array (s) if necessary
if (is_array($this->reference_array)) { if (is_array($this->reference_array)) {
if (!is_array($this->reference_array)) { if (!is_array($this->reference_array)) {
@@ -1852,6 +1950,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
$type = []; $type = [];
reset($this->element_list); reset($this->element_list);
foreach ($this->element_list as $table_name => $reference_array) { foreach ($this->element_list as $table_name => $reference_array) {
// early skip if not enought ACL
if ($this->base_acl_level < ($reference_array['min_edit_acl'] ?? 100)) {
continue;
}
// init arrays // init arrays
$q_begin = []; $q_begin = [];
$q_middle = []; $q_middle = [];
@@ -2157,7 +2259,14 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
public function formCreateElementReferenceTable(string $table_name): array public function formCreateElementReferenceTable(string $table_name): array
{ {
$data = []; $data = [];
//
$show_value = '';
// set default min edit/read to 100 (admin)
$min_edit_acl = $this->reference_array[$table_name]['min_edit_acl'] ?? 100;
$min_show_acl = $this->reference_array[$table_name]['min_show_acl'] ?? 100;
// output name
$output_name = $this->reference_array[$table_name]['output_name']; $output_name = $this->reference_array[$table_name]['output_name'];
// mandatory flag
if ( if (
isset($this->reference_array[$table_name]['mandatory']) && isset($this->reference_array[$table_name]['mandatory']) &&
$this->reference_array[$table_name]['mandatory'] $this->reference_array[$table_name]['mandatory']
@@ -2169,17 +2278,27 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
while (is_array($res = $this->dbReturn($this->reference_array[$table_name]['query']))) { while (is_array($res = $this->dbReturn($this->reference_array[$table_name]['query']))) {
$data['value'][] = $res[0]; $data['value'][] = $res[0];
$data['output'][] = $res[1]; $data['output'][] = $res[1];
$data['selected'][] = (\CoreLibs\Convert\Html::checked( $selected = (\CoreLibs\Convert\Html::checked(
$this->reference_array[$table_name]['selected'] ?? '', $this->reference_array[$table_name]['selected'] ?? '',
$res[0] $res[0]
)) ? $res[0] : ''; )) ? $res[0] : '';
$data['selected'][] = $selected;
if (!empty($selected)) {
if (!empty($show_value)) {
$show_value .= ", ";
}
$show_value .= $res[1];
}
} }
$type = 'reference_table'; $type = 'reference_table';
return [ return [
'output_name' => $output_name, 'output_name' => $output_name,
'type' => $type, 'type' => $type,
'color' => 'edit_fgcolor', 'color' => 'edit_fgcolor',
'data' => $data 'data' => $data,
'show_value' => empty($show_value) ? '-' : $show_value,
'allow_edit' => $this->base_acl_level >= $min_edit_acl ? 1 : 0,
'allow_show' => $this->base_acl_level >= $min_show_acl ? 1 : 0,
]; ];
} }
@@ -2211,8 +2330,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
'pos' => [], 'pos' => [],
'table_name' => $table_name // sub table name 'table_name' => $table_name // sub table name
]; ];
$show_value = '-';
// set default min edit/read to 100 (admin)
$min_edit_acl = $this->element_list[$table_name]['min_edit_acl'] ?? 100;
$min_show_acl = $this->element_list[$table_name]['min_show_acl'] ?? 100;
// output name for the viewable left table td box, prefixed with * if mandatory // output name for the viewable left table td box, prefixed with * if mandatory
$output_name = $this->element_list[$table_name]['output_name']; $output_name = $this->element_list[$table_name]['output_name'];
// mandatory flag
if ( if (
isset($this->element_list[$table_name]['mandatory']) && isset($this->element_list[$table_name]['mandatory']) &&
$this->element_list[$table_name]['mandatory'] $this->element_list[$table_name]['mandatory']
@@ -2523,7 +2647,10 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
'output_name' => $output_name, 'output_name' => $output_name,
'type' => $type, 'type' => $type,
'color' => 'edit_fgcolor', 'color' => 'edit_fgcolor',
'data' => $data 'data' => $data,
'show_value' => $show_value,
'allow_edit' => $this->base_acl_level >= $min_edit_acl ? 1 : 0,
'allow_show' => $this->base_acl_level >= $min_show_acl ? 1 : 0,
]; ];
} }
// end of class // end of class

View File

@@ -105,6 +105,8 @@ class SmartyExtend extends \Smarty
public $CSS_TEMPLATE_NAME; public $CSS_TEMPLATE_NAME;
/** @var string|null */ /** @var string|null */
public $TEMPLATE_TRANSLATE; public $TEMPLATE_TRANSLATE;
/** @var string|null */
public $JS_TRANSLATE;
// core group // core group
/** @var string */ /** @var string */
public $JS_CORE_TEMPLATE_NAME; public $JS_CORE_TEMPLATE_NAME;
@@ -317,14 +319,14 @@ class SmartyExtend extends \Smarty
} }
// javascript translate data as template for auto translate // javascript translate data as template for auto translate
if (empty($this->TEMPLATE_TRANSLATE)) { if (empty($this->TEMPLATE_TRANSLATE)) {
$this->TEMPLATE_TRANSLATE = 'jsTranslate_' $this->TEMPLATE_TRANSLATE = 'jsTranslate-'
. $this->locale_set . '.' . $this->encoding . $this->locale_set . '.' . $this->encoding
. '.tpl'; . '.tpl';
} else { } else {
// we assume we have some fixed set // we assume we have some fixed set
// we must add _<$this->lang> // we must add _<locale>.<encoding>
// if .tpl, put before .tpl // if .tpl, put before .tpl
// if not .tpl, add _<$this->lang>.tpl // if not .tpl, add _<locale>.<encoding>.tpl
if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) { if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
$this->TEMPLATE_TRANSLATE = str_replace( $this->TEMPLATE_TRANSLATE = str_replace(
'.tpl', '.tpl',
@@ -332,7 +334,7 @@ class SmartyExtend extends \Smarty
$this->TEMPLATE_TRANSLATE $this->TEMPLATE_TRANSLATE
); );
} else { } else {
$this->TEMPLATE_TRANSLATE .= '_' $this->TEMPLATE_TRANSLATE .= '-'
. $this->locale_set . '.' . $this->encoding . $this->locale_set . '.' . $this->encoding
. '.tpl'; . '.tpl';
} }
@@ -341,6 +343,31 @@ class SmartyExtend extends \Smarty
if (!file_exists($this->getTemplateDir()[0] . DIRECTORY_SEPARATOR . $this->TEMPLATE_TRANSLATE)) { if (!file_exists($this->getTemplateDir()[0] . DIRECTORY_SEPARATOR . $this->TEMPLATE_TRANSLATE)) {
$this->TEMPLATE_TRANSLATE = null; $this->TEMPLATE_TRANSLATE = null;
} }
if (empty($this->JS_TRANSLATE)) {
$this->JS_TRANSLATE = 'translate-'
. $this->locale_set . '.' . $this->encoding . '.js';
} else {
// we assume we have some fixed set
// we must add _<locale>.<encoding>
// if .js, put before .js
// if not .js, add _<locale>.<encoding>.js
if (strpos($this->JS_TRANSLATE, '.js')) {
$this->JS_TRANSLATE = str_replace(
'.js',
'-' . $this->locale_set . '.' . $this->encoding . '.js',
$this->JS_TRANSLATE
);
} else {
$this->JS_TRANSLATE .= '-'
. $this->locale_set . '.' . $this->encoding
. '.js';
}
}
if (!file_exists($this->JAVASCRIPT . $this->JS_TRANSLATE)) {
$this->JS_TRANSLATE = null;
} else {
$this->JS_TRANSLATE = $this->JAVASCRIPT . $this->JS_TRANSLATE;
}
} }
/** /**
@@ -423,7 +450,7 @@ class SmartyExtend extends \Smarty
$this->DATA['ADMIN'] = $cms->acl['admin'] ?? 0; $this->DATA['ADMIN'] = $cms->acl['admin'] ?? 0;
// top menu // top menu
$this->DATA['nav_menu'] = $cms->adbTopMenu(); $this->DATA['nav_menu'] = $cms->adbTopMenu();
$this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0; $this->DATA['nav_menu_count'] = count($this->DATA['nav_menu']);
// messages = ['msg' =>, 'class' => 'error/warning/...'] // messages = ['msg' =>, 'class' => 'error/warning/...']
$this->DATA['messages'] = $cms->messages; $this->DATA['messages'] = $cms->messages;
} else { /** @phpstan-ignore-line Because I assume object for phpstan */ } else { /** @phpstan-ignore-line Because I assume object for phpstan */
@@ -438,7 +465,7 @@ class SmartyExtend extends \Smarty
$this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT; $this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
// the page name // the page name
$this->DATA['page_name'] = $this->page_name; $this->DATA['page_name'] = $this->page_name;
$this->DATA['table_width'] = empty($this->PAGE_WIDTH) ?: PAGE_WIDTH; $this->DATA['table_width'] = !empty($this->PAGE_WIDTH) ?: PAGE_WIDTH;
$this->DATA['form_name'] = $this->DATA['FORM_NAME']; $this->DATA['form_name'] = $this->DATA['FORM_NAME'];
// for tinymce special // for tinymce special
$this->DATA['TINYMCE_LANG'] = $this->lang_short; $this->DATA['TINYMCE_LANG'] = $this->lang_short;
@@ -469,6 +496,7 @@ class SmartyExtend extends \Smarty
$this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME; $this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
$this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE; $this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
$this->DATA['TEMPLATE_TRANSLATE'] = $this->TEMPLATE_TRANSLATE ?? null; $this->DATA['TEMPLATE_TRANSLATE'] = $this->TEMPLATE_TRANSLATE ?? null;
$this->DATA['JS_TRANSLATE'] = $this->JS_TRANSLATE ?? null;
$this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name) . '.tpl'; $this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name) . '.tpl';
// render page // render page
$this->renderSmarty(); $this->renderSmarty();

View File

@@ -27,6 +27,7 @@ return array(
'CoreLibs\\Convert\\Math' => $baseDir . '/lib/CoreLibs/Convert/Math.php', 'CoreLibs\\Convert\\Math' => $baseDir . '/lib/CoreLibs/Convert/Math.php',
'CoreLibs\\Convert\\MimeAppName' => $baseDir . '/lib/CoreLibs/Convert/MimeAppName.php', 'CoreLibs\\Convert\\MimeAppName' => $baseDir . '/lib/CoreLibs/Convert/MimeAppName.php',
'CoreLibs\\Convert\\MimeEncode' => $baseDir . '/lib/CoreLibs/Convert/MimeEncode.php', 'CoreLibs\\Convert\\MimeEncode' => $baseDir . '/lib/CoreLibs/Convert/MimeEncode.php',
'CoreLibs\\Convert\\Strings' => $baseDir . '/lib/CoreLibs/Convert/Strings.php',
'CoreLibs\\Create\\Email' => $baseDir . '/lib/CoreLibs/Create/Email.php', 'CoreLibs\\Create\\Email' => $baseDir . '/lib/CoreLibs/Create/Email.php',
'CoreLibs\\Create\\Hash' => $baseDir . '/lib/CoreLibs/Create/Hash.php', 'CoreLibs\\Create\\Hash' => $baseDir . '/lib/CoreLibs/Create/Hash.php',
'CoreLibs\\Create\\RandomKey' => $baseDir . '/lib/CoreLibs/Create/RandomKey.php', 'CoreLibs\\Create\\RandomKey' => $baseDir . '/lib/CoreLibs/Create/RandomKey.php',
@@ -366,6 +367,7 @@ return array(
'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', 'PHPUnit\\Util\\Annotation\\DocBlock' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php',
'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php', 'PHPUnit\\Util\\Annotation\\Registry' => $vendorDir . '/phpunit/phpunit/src/Util/Annotation/Registry.php',
'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', 'PHPUnit\\Util\\Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php',
'PHPUnit\\Util\\Cloner' => $vendorDir . '/phpunit/phpunit/src/Util/Cloner.php',
'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php', 'PHPUnit\\Util\\Color' => $vendorDir . '/phpunit/phpunit/src/Util/Color.php',
'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php',
'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php', 'PHPUnit\\Util\\Exception' => $vendorDir . '/phpunit/phpunit/src/Util/Exception.php',
@@ -382,6 +384,7 @@ return array(
'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php',
'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php',
'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php',
'PHPUnit\\Util\\Reflection' => $vendorDir . '/phpunit/phpunit/src/Util/Reflection.php',
'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Util/RegularExpression.php',
'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php',
'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php',
@@ -666,10 +669,12 @@ return array(
'SebastianBergmann\\Type\\NeverType' => $vendorDir . '/sebastian/type/src/type/NeverType.php', 'SebastianBergmann\\Type\\NeverType' => $vendorDir . '/sebastian/type/src/type/NeverType.php',
'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/type/NullType.php', 'SebastianBergmann\\Type\\NullType' => $vendorDir . '/sebastian/type/src/type/NullType.php',
'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/type/ObjectType.php', 'SebastianBergmann\\Type\\ObjectType' => $vendorDir . '/sebastian/type/src/type/ObjectType.php',
'SebastianBergmann\\Type\\Parameter' => $vendorDir . '/sebastian/type/src/Parameter.php',
'SebastianBergmann\\Type\\ReflectionMapper' => $vendorDir . '/sebastian/type/src/ReflectionMapper.php', 'SebastianBergmann\\Type\\ReflectionMapper' => $vendorDir . '/sebastian/type/src/ReflectionMapper.php',
'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php', 'SebastianBergmann\\Type\\RuntimeException' => $vendorDir . '/sebastian/type/src/exception/RuntimeException.php',
'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/type/SimpleType.php', 'SebastianBergmann\\Type\\SimpleType' => $vendorDir . '/sebastian/type/src/type/SimpleType.php',
'SebastianBergmann\\Type\\StaticType' => $vendorDir . '/sebastian/type/src/type/StaticType.php', 'SebastianBergmann\\Type\\StaticType' => $vendorDir . '/sebastian/type/src/type/StaticType.php',
'SebastianBergmann\\Type\\TrueType' => $vendorDir . '/sebastian/type/src/type/TrueType.php',
'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/type/Type.php', 'SebastianBergmann\\Type\\Type' => $vendorDir . '/sebastian/type/src/type/Type.php',
'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php', 'SebastianBergmann\\Type\\TypeName' => $vendorDir . '/sebastian/type/src/TypeName.php',
'SebastianBergmann\\Type\\UnionType' => $vendorDir . '/sebastian/type/src/type/UnionType.php', 'SebastianBergmann\\Type\\UnionType' => $vendorDir . '/sebastian/type/src/type/UnionType.php',

View File

@@ -7,6 +7,5 @@ $baseDir = dirname($vendorDir);
return array( return array(
'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php', 'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
'6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
); );

View File

@@ -6,10 +6,6 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir); $baseDir = dirname($vendorDir);
return array( return array(
'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'),
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'), 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),

View File

@@ -8,26 +8,12 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
{ {
public static $files = array ( public static $files = array (
'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php', 'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
'6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
); );
public static $prefixLengthsPsr4 = array ( public static $prefixLengthsPsr4 = array (
'p' =>
array (
'phpDocumentor\\Reflection\\' => 25,
),
'W' =>
array (
'Webmozart\\Assert\\' => 17,
),
'S' =>
array (
'Symfony\\Polyfill\\Ctype\\' => 23,
),
'P' => 'P' =>
array ( array (
'Prophecy\\' => 9,
'PhpParser\\' => 10, 'PhpParser\\' => 10,
), ),
'D' => 'D' =>
@@ -38,24 +24,6 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
); );
public static $prefixDirsPsr4 = array ( public static $prefixDirsPsr4 = array (
'phpDocumentor\\Reflection\\' =>
array (
0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
),
'Webmozart\\Assert\\' =>
array (
0 => __DIR__ . '/..' . '/webmozart/assert/src',
),
'Symfony\\Polyfill\\Ctype\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
),
'Prophecy\\' =>
array (
0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy',
),
'PhpParser\\' => 'PhpParser\\' =>
array ( array (
0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser',
@@ -92,6 +60,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
'CoreLibs\\Convert\\Math' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/Math.php', 'CoreLibs\\Convert\\Math' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/Math.php',
'CoreLibs\\Convert\\MimeAppName' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeAppName.php', 'CoreLibs\\Convert\\MimeAppName' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeAppName.php',
'CoreLibs\\Convert\\MimeEncode' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeEncode.php', 'CoreLibs\\Convert\\MimeEncode' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/MimeEncode.php',
'CoreLibs\\Convert\\Strings' => __DIR__ . '/../..' . '/lib/CoreLibs/Convert/Strings.php',
'CoreLibs\\Create\\Email' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Email.php', 'CoreLibs\\Create\\Email' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Email.php',
'CoreLibs\\Create\\Hash' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Hash.php', 'CoreLibs\\Create\\Hash' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Hash.php',
'CoreLibs\\Create\\RandomKey' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/RandomKey.php', 'CoreLibs\\Create\\RandomKey' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/RandomKey.php',
@@ -431,6 +400,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php', 'PHPUnit\\Util\\Annotation\\DocBlock' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/DocBlock.php',
'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php', 'PHPUnit\\Util\\Annotation\\Registry' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Annotation/Registry.php',
'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', 'PHPUnit\\Util\\Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php',
'PHPUnit\\Util\\Cloner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Cloner.php',
'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php', 'PHPUnit\\Util\\Color' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Color.php',
'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', 'PHPUnit\\Util\\ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php',
'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php', 'PHPUnit\\Util\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Exception.php',
@@ -447,6 +417,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php', 'PHPUnit\\Util\\PHP\\DefaultPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php',
'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php', 'PHPUnit\\Util\\PHP\\WindowsPhpProcess' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php',
'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', 'PHPUnit\\Util\\Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php',
'PHPUnit\\Util\\Reflection' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Reflection.php',
'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php', 'PHPUnit\\Util\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/RegularExpression.php',
'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', 'PHPUnit\\Util\\Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php',
'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php', 'PHPUnit\\Util\\TestDox\\CliTestDoxPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php',
@@ -731,10 +702,12 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
'SebastianBergmann\\Type\\NeverType' => __DIR__ . '/..' . '/sebastian/type/src/type/NeverType.php', 'SebastianBergmann\\Type\\NeverType' => __DIR__ . '/..' . '/sebastian/type/src/type/NeverType.php',
'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/type/NullType.php', 'SebastianBergmann\\Type\\NullType' => __DIR__ . '/..' . '/sebastian/type/src/type/NullType.php',
'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/ObjectType.php', 'SebastianBergmann\\Type\\ObjectType' => __DIR__ . '/..' . '/sebastian/type/src/type/ObjectType.php',
'SebastianBergmann\\Type\\Parameter' => __DIR__ . '/..' . '/sebastian/type/src/Parameter.php',
'SebastianBergmann\\Type\\ReflectionMapper' => __DIR__ . '/..' . '/sebastian/type/src/ReflectionMapper.php', 'SebastianBergmann\\Type\\ReflectionMapper' => __DIR__ . '/..' . '/sebastian/type/src/ReflectionMapper.php',
'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php', 'SebastianBergmann\\Type\\RuntimeException' => __DIR__ . '/..' . '/sebastian/type/src/exception/RuntimeException.php',
'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/type/SimpleType.php', 'SebastianBergmann\\Type\\SimpleType' => __DIR__ . '/..' . '/sebastian/type/src/type/SimpleType.php',
'SebastianBergmann\\Type\\StaticType' => __DIR__ . '/..' . '/sebastian/type/src/type/StaticType.php', 'SebastianBergmann\\Type\\StaticType' => __DIR__ . '/..' . '/sebastian/type/src/type/StaticType.php',
'SebastianBergmann\\Type\\TrueType' => __DIR__ . '/..' . '/sebastian/type/src/type/TrueType.php',
'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/type/Type.php', 'SebastianBergmann\\Type\\Type' => __DIR__ . '/..' . '/sebastian/type/src/type/Type.php',
'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php', 'SebastianBergmann\\Type\\TypeName' => __DIR__ . '/..' . '/sebastian/type/src/TypeName.php',
'SebastianBergmann\\Type\\UnionType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnionType.php', 'SebastianBergmann\\Type\\UnionType' => __DIR__ . '/..' . '/sebastian/type/src/type/UnionType.php',

View File

@@ -137,17 +137,17 @@
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.13.2", "version": "v4.15.1",
"version_normalized": "4.13.2.0", "version_normalized": "4.15.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nikic/PHP-Parser.git", "url": "https://github.com/nikic/PHP-Parser.git",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077" "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077", "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -158,7 +158,7 @@
"ircmaxell/php-yacc": "^0.0.7", "ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
}, },
"time": "2021-11-30T19:35:32+00:00", "time": "2022-09-04T07:30:47+00:00",
"bin": [ "bin": [
"bin/php-parse" "bin/php-parse"
], ],
@@ -190,7 +190,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/nikic/PHP-Parser/issues", "issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.1"
}, },
"install-path": "../nikic/php-parser" "install-path": "../nikic/php-parser"
}, },
@@ -311,265 +311,26 @@
}, },
"install-path": "../phar-io/version" "install-path": "../phar-io/version"
}, },
{
"name": "phpdocumentor/reflection-common",
"version": "2.2.0",
"version_normalized": "2.2.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"time": "2020-06-27T09:03:43+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-2.x": "2.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jaap van Otterdijk",
"email": "opensource@ijaap.nl"
}
],
"description": "Common reflection classes used by phpdocumentor to reflect the code structure",
"homepage": "http://www.phpdoc.org",
"keywords": [
"FQSEN",
"phpDocumentor",
"phpdoc",
"reflection",
"static analysis"
],
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
"source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
},
"install-path": "../phpdocumentor/reflection-common"
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "5.3.0",
"version_normalized": "5.3.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
"reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
"shasum": ""
},
"require": {
"ext-filter": "*",
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.3",
"webmozart/assert": "^1.9.1"
},
"require-dev": {
"mockery/mockery": "~1.3.2",
"psalm/phar": "^4.8"
},
"time": "2021-10-19T17:43:47+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
},
{
"name": "Jaap van Otterdijk",
"email": "account@ijaap.nl"
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
},
"install-path": "../phpdocumentor/reflection-docblock"
},
{
"name": "phpdocumentor/type-resolver",
"version": "1.6.1",
"version_normalized": "1.6.1.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "77a32518733312af16a44300404e945338981de3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3",
"reference": "77a32518733312af16a44300404e945338981de3",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
"psalm/phar": "^4.8"
},
"time": "2022-03-15T21:29:03+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-1.x": "1.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
}
],
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1"
},
"install-path": "../phpdocumentor/type-resolver"
},
{
"name": "phpspec/prophecy",
"version": "v1.15.0",
"version_normalized": "1.15.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.2",
"php": "^7.2 || ~8.0, <8.2",
"phpdocumentor/reflection-docblock": "^5.2",
"sebastian/comparator": "^3.0 || ^4.0",
"sebastian/recursion-context": "^3.0 || ^4.0"
},
"require-dev": {
"phpspec/phpspec": "^6.0 || ^7.0",
"phpunit/phpunit": "^8.0 || ^9.0"
},
"time": "2021-12-08T12:19:24+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Konstantin Kudryashov",
"email": "ever.zet@gmail.com",
"homepage": "http://everzet.com"
},
{
"name": "Marcello Duarte",
"email": "marcello.duarte@gmail.com"
}
],
"description": "Highly opinionated mocking framework for PHP 5.3+",
"homepage": "https://github.com/phpspec/prophecy",
"keywords": [
"Double",
"Dummy",
"fake",
"mock",
"spy",
"stub"
],
"support": {
"issues": "https://github.com/phpspec/prophecy/issues",
"source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
},
"install-path": "../phpspec/prophecy"
},
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "9.2.15", "version": "9.2.17",
"version_normalized": "9.2.15.0", "version_normalized": "9.2.17.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8",
"reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-xmlwriter": "*", "ext-xmlwriter": "*",
"nikic/php-parser": "^4.13.0", "nikic/php-parser": "^4.14",
"php": ">=7.3", "php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3", "phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2", "phpunit/php-text-template": "^2.0.2",
@@ -587,7 +348,7 @@
"ext-pcov": "*", "ext-pcov": "*",
"ext-xdebug": "*" "ext-xdebug": "*"
}, },
"time": "2022-03-07T09:28:20+00:00", "time": "2022-08-30T12:24:04+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -620,7 +381,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.17"
}, },
"funding": [ "funding": [
{ {
@@ -885,17 +646,17 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "9.5.20", "version": "9.5.25",
"version_normalized": "9.5.20.0", "version_normalized": "9.5.25.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", "reference": "3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -910,7 +671,6 @@
"phar-io/manifest": "^2.0.3", "phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2", "phar-io/version": "^3.0.2",
"php": ">=7.3", "php": ">=7.3",
"phpspec/prophecy": "^1.12.1",
"phpunit/php-code-coverage": "^9.2.13", "phpunit/php-code-coverage": "^9.2.13",
"phpunit/php-file-iterator": "^3.0.5", "phpunit/php-file-iterator": "^3.0.5",
"phpunit/php-invoker": "^3.1.1", "phpunit/php-invoker": "^3.1.1",
@@ -918,25 +678,21 @@
"phpunit/php-timer": "^5.0.2", "phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1", "sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6", "sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5", "sebastian/comparator": "^4.0.8",
"sebastian/diff": "^4.0.3", "sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3", "sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3", "sebastian/exporter": "^4.0.5",
"sebastian/global-state": "^5.0.1", "sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3", "sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3", "sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^3.0", "sebastian/type": "^3.2",
"sebastian/version": "^3.0.2" "sebastian/version": "^3.0.2"
}, },
"require-dev": {
"ext-pdo": "*",
"phpspec/prophecy-phpunit": "^2.0.1"
},
"suggest": { "suggest": {
"ext-soap": "*", "ext-soap": "*",
"ext-xdebug": "*" "ext-xdebug": "*"
}, },
"time": "2022-04-01T12:37:26+00:00", "time": "2022-09-25T03:44:45+00:00",
"bin": [ "bin": [
"phpunit" "phpunit"
], ],
@@ -975,7 +731,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.25"
}, },
"funding": [ "funding": [
{ {
@@ -985,6 +741,10 @@
{ {
"url": "https://github.com/sebastianbergmann", "url": "https://github.com/sebastianbergmann",
"type": "github" "type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
"type": "tidelift"
} }
], ],
"install-path": "../phpunit/phpunit" "install-path": "../phpunit/phpunit"
@@ -1167,17 +927,17 @@
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "4.0.6", "version": "4.0.8",
"version_normalized": "4.0.6.0", "version_normalized": "4.0.8.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382" "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382", "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1188,7 +948,7 @@
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.3" "phpunit/phpunit": "^9.3"
}, },
"time": "2020-10-26T15:49:45+00:00", "time": "2022-09-14T12:41:17+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1232,7 +992,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
}, },
"funding": [ "funding": [
{ {
@@ -1439,17 +1199,17 @@
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",
"version": "4.0.4", "version": "4.0.5",
"version_normalized": "4.0.4.0", "version_normalized": "4.0.5.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git", "url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1460,7 +1220,7 @@
"ext-mbstring": "*", "ext-mbstring": "*",
"phpunit/phpunit": "^9.3" "phpunit/phpunit": "^9.3"
}, },
"time": "2021-11-11T14:18:36+00:00", "time": "2022-09-14T06:03:37+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
@@ -1507,7 +1267,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues", "issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
}, },
"funding": [ "funding": [
{ {
@@ -1888,17 +1648,17 @@
}, },
{ {
"name": "sebastian/type", "name": "sebastian/type",
"version": "3.0.0", "version": "3.2.0",
"version_normalized": "3.0.0.0", "version_normalized": "3.2.0.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/type.git", "url": "https://github.com/sebastianbergmann/type.git",
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -1907,11 +1667,11 @@
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.5" "phpunit/phpunit": "^9.5"
}, },
"time": "2022-03-15T09:54:48+00:00", "time": "2022-09-12T14:47:03+00:00",
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "3.0-dev" "dev-master": "3.2-dev"
} }
}, },
"installation-source": "dist", "installation-source": "dist",
@@ -1935,7 +1695,7 @@
"homepage": "https://github.com/sebastianbergmann/type", "homepage": "https://github.com/sebastianbergmann/type",
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/type/issues", "issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/3.0.0" "source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
}, },
"funding": [ "funding": [
{ {
@@ -2001,91 +1761,6 @@
], ],
"install-path": "../sebastian/version" "install-path": "../sebastian/version"
}, },
{
"name": "symfony/polyfill-ctype",
"version": "v1.25.0",
"version_normalized": "1.25.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "30885182c981ab175d4d034db0f6f469898070ab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab",
"reference": "30885182c981ab175d4d034db0f6f469898070ab",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"provide": {
"ext-ctype": "*"
},
"suggest": {
"ext-ctype": "For best performance"
},
"time": "2021-10-20T20:35:02+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"installation-source": "dist",
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Gert de Pagter",
"email": "BackEndTea@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"ctype",
"polyfill",
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"install-path": "../symfony/polyfill-ctype"
},
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",
"version": "1.2.1", "version": "1.2.1",
@@ -2138,67 +1813,6 @@
} }
], ],
"install-path": "../theseer/tokenizer" "install-path": "../theseer/tokenizer"
},
{
"name": "webmozart/assert",
"version": "1.10.0",
"version_normalized": "1.10.0.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"phpstan/phpstan": "<0.12.20",
"vimeo/psalm": "<4.6.1 || 4.6.2"
},
"require-dev": {
"phpunit/phpunit": "^8.5.13"
},
"time": "2021-03-09T10:59:23+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.10-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Webmozart\\Assert\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "Assertions to validate method input/output with nice error messages.",
"keywords": [
"assert",
"check",
"validate"
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/1.10.0"
},
"install-path": "../webmozart/assert"
} }
], ],
"dev": true, "dev": true,
@@ -2208,10 +1822,6 @@
"nikic/php-parser", "nikic/php-parser",
"phar-io/manifest", "phar-io/manifest",
"phar-io/version", "phar-io/version",
"phpdocumentor/reflection-common",
"phpdocumentor/reflection-docblock",
"phpdocumentor/type-resolver",
"phpspec/prophecy",
"phpunit/php-code-coverage", "phpunit/php-code-coverage",
"phpunit/php-file-iterator", "phpunit/php-file-iterator",
"phpunit/php-invoker", "phpunit/php-invoker",
@@ -2234,8 +1844,6 @@
"sebastian/resource-operations", "sebastian/resource-operations",
"sebastian/type", "sebastian/type",
"sebastian/version", "sebastian/version",
"symfony/polyfill-ctype", "theseer/tokenizer"
"theseer/tokenizer",
"webmozart/assert"
] ]
} }

View File

@@ -38,12 +38,12 @@
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'nikic/php-parser' => array( 'nikic/php-parser' => array(
'pretty_version' => 'v4.13.2', 'pretty_version' => 'v4.15.1',
'version' => '4.13.2.0', 'version' => '4.15.1.0',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../nikic/php-parser', 'install_path' => __DIR__ . '/../nikic/php-parser',
'aliases' => array(), 'aliases' => array(),
'reference' => '210577fe3cf7badcc5814d99455df46564f3c077', 'reference' => '0ef6c55a3f47f89d7a374e6f835197a0b5fcf900',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'phar-io/manifest' => array( 'phar-io/manifest' => array(
@@ -64,49 +64,13 @@
'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74', 'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'phpdocumentor/reflection-common' => array(
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../phpdocumentor/reflection-common',
'aliases' => array(),
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
'dev_requirement' => true,
),
'phpdocumentor/reflection-docblock' => array(
'pretty_version' => '5.3.0',
'version' => '5.3.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock',
'aliases' => array(),
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
'dev_requirement' => true,
),
'phpdocumentor/type-resolver' => array(
'pretty_version' => '1.6.1',
'version' => '1.6.1.0',
'type' => 'library',
'install_path' => __DIR__ . '/../phpdocumentor/type-resolver',
'aliases' => array(),
'reference' => '77a32518733312af16a44300404e945338981de3',
'dev_requirement' => true,
),
'phpspec/prophecy' => array(
'pretty_version' => 'v1.15.0',
'version' => '1.15.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../phpspec/prophecy',
'aliases' => array(),
'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
'dev_requirement' => true,
),
'phpunit/php-code-coverage' => array( 'phpunit/php-code-coverage' => array(
'pretty_version' => '9.2.15', 'pretty_version' => '9.2.17',
'version' => '9.2.15.0', 'version' => '9.2.17.0',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage',
'aliases' => array(), 'aliases' => array(),
'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f', 'reference' => 'aa94dc41e8661fe90c7316849907cba3007b10d8',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'phpunit/php-file-iterator' => array( 'phpunit/php-file-iterator' => array(
@@ -146,12 +110,12 @@
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'phpunit/phpunit' => array( 'phpunit/phpunit' => array(
'pretty_version' => '9.5.20', 'pretty_version' => '9.5.25',
'version' => '9.5.20.0', 'version' => '9.5.25.0',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/phpunit', 'install_path' => __DIR__ . '/../phpunit/phpunit',
'aliases' => array(), 'aliases' => array(),
'reference' => '12bc8879fb65aef2138b26fc633cb1e3620cffba', 'reference' => '3e6f90ca7e3d02025b1d147bd8d4a89fd4ca8a1d',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'sebastian/cli-parser' => array( 'sebastian/cli-parser' => array(
@@ -182,12 +146,12 @@
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'sebastian/comparator' => array( 'sebastian/comparator' => array(
'pretty_version' => '4.0.6', 'pretty_version' => '4.0.8',
'version' => '4.0.6.0', 'version' => '4.0.8.0',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/comparator', 'install_path' => __DIR__ . '/../sebastian/comparator',
'aliases' => array(), 'aliases' => array(),
'reference' => '55f4261989e546dc112258c7a75935a81a7ce382', 'reference' => 'fa0f136dd2334583309d32b62544682ee972b51a',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'sebastian/complexity' => array( 'sebastian/complexity' => array(
@@ -218,12 +182,12 @@
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'sebastian/exporter' => array( 'sebastian/exporter' => array(
'pretty_version' => '4.0.4', 'pretty_version' => '4.0.5',
'version' => '4.0.4.0', 'version' => '4.0.5.0',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/exporter', 'install_path' => __DIR__ . '/../sebastian/exporter',
'aliases' => array(), 'aliases' => array(),
'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9', 'reference' => 'ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'sebastian/global-state' => array( 'sebastian/global-state' => array(
@@ -281,12 +245,12 @@
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'sebastian/type' => array( 'sebastian/type' => array(
'pretty_version' => '3.0.0', 'pretty_version' => '3.2.0',
'version' => '3.0.0.0', 'version' => '3.2.0.0',
'type' => 'library', 'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/type', 'install_path' => __DIR__ . '/../sebastian/type',
'aliases' => array(), 'aliases' => array(),
'reference' => 'b233b84bc4465aff7b57cf1c4bc75c86d00d6dad', 'reference' => 'fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'sebastian/version' => array( 'sebastian/version' => array(
@@ -298,15 +262,6 @@
'reference' => 'c6c1022351a901512170118436c764e473f6de8c', 'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'symfony/polyfill-ctype' => array(
'pretty_version' => 'v1.25.0',
'version' => '1.25.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
'aliases' => array(),
'reference' => '30885182c981ab175d4d034db0f6f469898070ab',
'dev_requirement' => true,
),
'theseer/tokenizer' => array( 'theseer/tokenizer' => array(
'pretty_version' => '1.2.1', 'pretty_version' => '1.2.1',
'version' => '1.2.1.0', 'version' => '1.2.1.0',
@@ -316,14 +271,5 @@
'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e', 'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
'dev_requirement' => true, 'dev_requirement' => true,
), ),
'webmozart/assert' => array(
'pretty_version' => '1.10.0',
'version' => '1.10.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../webmozart/assert',
'aliases' => array(),
'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
'dev_requirement' => true,
),
), ),
); );

View File

@@ -3,10 +3,10 @@ PHP Parser
[![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) [![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master)
This is a PHP 5.2 to PHP 8.0 parser written in PHP. Its purpose is to simplify static code analysis and This is a PHP 5.2 to PHP 8.2 parser written in PHP. Its purpose is to simplify static code analysis and
manipulation. manipulation.
[**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.0). [**Documentation for version 4.x**][doc_4_x] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.2).
[Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). [Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2).
@@ -222,4 +222,4 @@ Component documentation:
* Parent and sibling references * Parent and sibling references
[doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc [doc_3_x]: https://github.com/nikic/PHP-Parser/tree/3.x/doc
[doc_master]: https://github.com/nikic/PHP-Parser/tree/master/doc [doc_4_x]: https://github.com/nikic/PHP-Parser/tree/4.x/doc

View File

@@ -689,9 +689,7 @@ array_expr:
scalar_dereference: scalar_dereference:
array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
| T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; }
{ $attrs = attributes(); $attrs['kind'] = strKind($1);
$$ = Expr\ArrayDimFetch[new Scalar\String_(Scalar\String_::parse($1), $attrs), $3]; }
| constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
| scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; }
/* alternative array syntax missing intentionally */ /* alternative array syntax missing intentionally */
@@ -793,10 +791,8 @@ ctor_arguments:
common_scalar: common_scalar:
T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); } T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); }
| T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; } | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); }
| T_CONSTANT_ENCAPSED_STRING | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes(), false); }
{ $attrs = attributes(); $attrs['kind'] = strKind($1);
$$ = new Scalar\String_(Scalar\String_::parse($1, false), $attrs); }
| T_LINE { $$ = Scalar\MagicConst\Line[]; } | T_LINE { $$ = Scalar\MagicConst\Line[]; }
| T_FILE { $$ = Scalar\MagicConst\File[]; } | T_FILE { $$ = Scalar\MagicConst\File[]; }
| T_DIR { $$ = Scalar\MagicConst\Dir[]; } | T_DIR { $$ = Scalar\MagicConst\Dir[]; }

View File

@@ -382,8 +382,18 @@ enum_case_expr:
class_entry_type: class_entry_type:
T_CLASS { $$ = 0; } T_CLASS { $$ = 0; }
| T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } | class_modifiers T_CLASS { $$ = $1; }
| T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } ;
class_modifiers:
class_modifier { $$ = $1; }
| class_modifiers class_modifier { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; }
;
class_modifier:
T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; }
| T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; }
| T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; }
; ;
extends_from: extends_from:
@@ -561,7 +571,7 @@ type_expr:
type { $$ = $1; } type { $$ = $1; }
| '?' type { $$ = Node\NullableType[$2]; } | '?' type { $$ = Node\NullableType[$2]; }
| union_type { $$ = Node\UnionType[$1]; } | union_type { $$ = Node\UnionType[$1]; }
| intersection_type { $$ = Node\IntersectionType[$1]; } | intersection_type { $$ = $1; }
; ;
type: type:
@@ -575,34 +585,52 @@ type_without_static:
| T_CALLABLE { $$ = Node\Identifier['callable']; } | T_CALLABLE { $$ = Node\Identifier['callable']; }
; ;
union_type_element:
type { $$ = $1; }
| '(' intersection_type ')' { $$ = $2; }
;
union_type: union_type:
type '|' type { init($1, $3); } union_type_element '|' union_type_element { init($1, $3); }
| union_type '|' type { push($1, $3); } | union_type '|' union_type_element { push($1, $3); }
;
union_type_without_static_element:
type_without_static { $$ = $1; }
| '(' intersection_type_without_static ')' { $$ = $2; }
; ;
union_type_without_static: union_type_without_static:
type_without_static '|' type_without_static { init($1, $3); } union_type_without_static_element '|' union_type_without_static_element { init($1, $3); }
| union_type_without_static '|' type_without_static { push($1, $3); } | union_type_without_static '|' union_type_without_static_element { push($1, $3); }
;
intersection_type_list:
type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { init($1, $3); }
| intersection_type_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type
{ push($1, $3); }
; ;
intersection_type: intersection_type:
type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type { init($1, $3); } intersection_type_list { $$ = Node\IntersectionType[$1]; }
| intersection_type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type ;
intersection_type_without_static_list:
type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static
{ init($1, $3); }
| intersection_type_without_static_list T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static
{ push($1, $3); } { push($1, $3); }
; ;
intersection_type_without_static: intersection_type_without_static:
type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static intersection_type_without_static_list { $$ = Node\IntersectionType[$1]; }
{ init($1, $3); }
| intersection_type_without_static T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static
{ push($1, $3); }
; ;
type_expr_without_static: type_expr_without_static:
type_without_static { $$ = $1; } type_without_static { $$ = $1; }
| '?' type_without_static { $$ = Node\NullableType[$2]; } | '?' type_without_static { $$ = Node\NullableType[$2]; }
| union_type_without_static { $$ = Node\UnionType[$1]; } | union_type_without_static { $$ = Node\UnionType[$1]; }
| intersection_type_without_static { $$ = Node\IntersectionType[$1]; } | intersection_type_without_static { $$ = $1; }
; ;
optional_type_without_static: optional_type_without_static:
@@ -1014,9 +1042,7 @@ dereferencable_scalar:
{ $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG;
$$ = new Expr\Array_($3, $attrs); } $$ = new Expr\Array_($3, $attrs); }
| array_short_syntax { $$ = $1; } | array_short_syntax { $$ = $1; }
| T_CONSTANT_ENCAPSED_STRING | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes()); }
{ $attrs = attributes(); $attrs['kind'] = strKind($1);
$$ = new Scalar\String_(Scalar\String_::parse($1), $attrs); }
| '"' encaps_list '"' | '"' encaps_list '"'
{ $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED;
parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); }
@@ -1024,7 +1050,7 @@ dereferencable_scalar:
scalar: scalar:
T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); } T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); }
| T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; } | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); }
| dereferencable_scalar { $$ = $1; } | dereferencable_scalar { $$ = $1; }
| constant { $$ = $1; } | constant { $$ = $1; }
| class_constant { $$ = $1; } | class_constant { $$ = $1; }

View File

@@ -128,14 +128,6 @@ function resolveMacros($code) {
. ' else { ' . $args[0] . ' = null; }'; . ' else { ' . $args[0] . ' = null; }';
} }
if ('strKind' === $name) {
assertArgs(1, $args, $name);
return '(' . $args[0] . '[0] === "\'" || (' . $args[0] . '[1] === "\'" && '
. '(' . $args[0] . '[0] === \'b\' || ' . $args[0] . '[0] === \'B\')) '
. '? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED)';
}
if ('prependLeadingComments' === $name) { if ('prependLeadingComments' === $name) {
assertArgs(1, $args, $name); assertArgs(1, $args, $name);

View File

@@ -67,7 +67,7 @@ class Class_ extends Declaration
* @return $this The builder instance (for fluid interface) * @return $this The builder instance (for fluid interface)
*/ */
public function makeAbstract() { public function makeAbstract() {
$this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT);
return $this; return $this;
} }
@@ -78,7 +78,13 @@ class Class_ extends Declaration
* @return $this The builder instance (for fluid interface) * @return $this The builder instance (for fluid interface)
*/ */
public function makeFinal() { public function makeFinal() {
$this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL);
return $this;
}
public function makeReadonly() {
$this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY);
return $this; return $this;
} }

View File

@@ -178,7 +178,20 @@ final class BuilderHelpers
} }
$builtinTypes = [ $builtinTypes = [
'array', 'callable', 'string', 'int', 'float', 'bool', 'iterable', 'void', 'object', 'mixed', 'never', 'array',
'callable',
'bool',
'int',
'float',
'string',
'iterable',
'void',
'object',
'null',
'false',
'mixed',
'never',
'true',
]; ];
$lowerType = strtolower($type); $lowerType = strtolower($type);
@@ -310,4 +323,13 @@ final class BuilderHelpers
Stmt\Class_::verifyModifier($modifiers, $modifier); Stmt\Class_::verifyModifier($modifiers, $modifier);
return $modifiers | $modifier; return $modifiers | $modifier;
} }
/**
* Adds a modifier and returns new modifier bitmask.
* @return int New modifiers
*/
public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int {
Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet);
return $existingModifiers | $modifierToSet;
}
} }

View File

@@ -33,7 +33,7 @@ abstract class KeywordEmulator extends TokenEmulator
/** /**
* @param mixed[] $tokens * @param mixed[] $tokens
* @return mixed[]|null * @return array|string|null
*/ */
private function getPreviousNonSpaceToken(array $tokens, int $start) private function getPreviousNonSpaceToken(array $tokens, int $start)
{ {

View File

@@ -20,4 +20,17 @@ final class ReadonlyTokenEmulator extends KeywordEmulator
{ {
return \T_READONLY; return \T_READONLY;
} }
}
protected function isKeywordContext(array $tokens, int $pos): bool
{
if (!parent::isKeywordContext($tokens, $pos)) {
return false;
}
// Support "function readonly("
return !(isset($tokens[$pos + 1]) &&
($tokens[$pos + 1][0] === '(' ||
($tokens[$pos + 1][0] === \T_WHITESPACE &&
isset($tokens[$pos + 2]) &&
$tokens[$pos + 2][0] === '(')));
}
}

View File

@@ -11,7 +11,7 @@ class Const_ extends NodeAbstract
/** @var Expr Value */ /** @var Expr Value */
public $value; public $value;
/** @var Name Namespaced name (if using NameResolver) */ /** @var Name|null Namespaced name (if using NameResolver) */
public $namespacedName; public $namespacedName;
/** /**
@@ -30,7 +30,7 @@ class Const_ extends NodeAbstract
public function getSubNodeNames() : array { public function getSubNodeNames() : array {
return ['name', 'value']; return ['name', 'value'];
} }
public function getType() : string { public function getType() : string {
return 'Const'; return 'Const';
} }

View File

@@ -162,7 +162,7 @@ class Name extends NodeAbstract
$realLength = $numParts - $realOffset; $realLength = $numParts - $realOffset;
} else { } else {
$realLength = $length < 0 ? $length + $numParts - $realOffset : $length; $realLength = $length < 0 ? $length + $numParts - $realOffset : $length;
if ($realLength < 0 || $realLength > $numParts) { if ($realLength < 0 || $realLength > $numParts - $realOffset) {
throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length)); throw new \OutOfBoundsException(sprintf('Length %d is out of bounds', $length));
} }
} }

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