Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0fd89727e9 | ||
|
|
a8e75d158b | ||
|
|
4b3fbaa309 | ||
|
|
1a6c65df0e | ||
|
|
24f553a17e | ||
|
|
9a3ea2f7db | ||
|
|
bcdb877d90 | ||
|
|
6d0e528c38 | ||
|
|
7e6474195b | ||
|
|
1795d3ba6c | ||
|
|
e1340acf55 | ||
|
|
b5ead3e266 | ||
|
|
f5daaca598 | ||
|
|
6b4f310cd2 | ||
|
|
7b5bddb529 | ||
|
|
0a6fdf1248 | ||
|
|
3220180d58 | ||
|
|
8c8f14ec74 | ||
|
|
643991c3fd | ||
|
|
c81c46d426 | ||
|
|
d97b173ee7 | ||
|
|
b61152f10e | ||
|
|
0c68ebe652 | ||
|
|
31d0cdb8ad | ||
|
|
0f823bd283 | ||
|
|
6385a48824 | ||
|
|
a754d897cf | ||
|
|
4600f8f7bf | ||
|
|
04e4fe46f2 |
@@ -5,6 +5,7 @@ function/set_edit_generic.sql
|
|||||||
function/edit_access_set_uid.sql
|
function/edit_access_set_uid.sql
|
||||||
function/edit_group_set_uid.sql
|
function/edit_group_set_uid.sql
|
||||||
function/edit_log_partition_insert.sql
|
function/edit_log_partition_insert.sql
|
||||||
|
function/edit_user_set_login_user_id_set_date.sql
|
||||||
# generic tables
|
# generic tables
|
||||||
table/edit_temp_files.sql
|
table/edit_temp_files.sql
|
||||||
table/edit_generic.sql
|
table/edit_generic.sql
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
-- create random string with length X
|
-- create random string with length X
|
||||||
|
|
||||||
CREATE FUNCTION random_string(randomLength int)
|
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(
|
||||||
@@ -14,35 +15,40 @@ SELECT array_to_string(
|
|||||||
),
|
),
|
||||||
''
|
''
|
||||||
)
|
)
|
||||||
$$ LANGUAGE SQL
|
$$
|
||||||
|
LANGUAGE SQL
|
||||||
RETURNS NULL ON NULL INPUT
|
RETURNS NULL ON NULL INPUT
|
||||||
VOLATILE; -- LEAKPROOF;-- END: function/random_string.sql
|
VOLATILE; -- LEAKPROOF;
|
||||||
|
-- END: function/random_string.sql
|
||||||
-- START: function/set_edit_generic.sql
|
-- START: function/set_edit_generic.sql
|
||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||||
DECLARE
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
random_length INT = 12; -- that should be long enough
|
random_length INT = 12; -- 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';
|
||||||
-- END: function/set_edit_generic.sql
|
-- END: function/set_edit_generic.sql
|
||||||
-- START: function/edit_access_set_uid.sql
|
-- START: function/edit_access_set_uid.sql
|
||||||
-- add uid add for edit_access table
|
-- add uid add for edit_access table
|
||||||
|
|
||||||
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
|
||||||
@@ -60,7 +66,7 @@ $$
|
|||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_access_set_uid.sql
|
-- END: function/edit_access_set_uid.sql
|
||||||
@@ -69,10 +75,10 @@ $$
|
|||||||
|
|
||||||
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
|
||||||
@@ -90,7 +96,7 @@ $$
|
|||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_group_set_uid.sql
|
-- END: function/edit_group_set_uid.sql
|
||||||
@@ -246,6 +252,34 @@ END
|
|||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_log_partition_insert.sql
|
-- END: function/edit_log_partition_insert.sql
|
||||||
|
-- START: function/edit_user_set_login_user_id_set_date.sql
|
||||||
|
-- set edit user login_user_id_set_date if login_user_id is set
|
||||||
|
-- NOW() if not empty
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
-- if new is not null/empty
|
||||||
|
-- and old one is null or old one different new one
|
||||||
|
-- set NOW()
|
||||||
|
-- if new one is NULL
|
||||||
|
-- set NULL
|
||||||
|
IF
|
||||||
|
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)
|
||||||
|
THEN
|
||||||
|
NEW.login_user_id_set_date = NOW();
|
||||||
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
|
NEW.login_user_id_set_date = NULL;
|
||||||
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
-- END: function/edit_user_set_login_user_id_set_date.sql
|
||||||
-- START: table/edit_temp_files.sql
|
-- START: table/edit_temp_files.sql
|
||||||
-- AUTHOR: Clemens Schwaighofer
|
-- AUTHOR: Clemens Schwaighofer
|
||||||
-- DATE: 2005/07/08
|
-- DATE: 2005/07/08
|
||||||
@@ -526,34 +560,85 @@ CREATE TABLE edit_user (
|
|||||||
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,
|
-- username/password
|
||||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
username VARCHAR UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
|
-- 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 VARCHAR,
|
||||||
|
-- eanbled/deleted flag
|
||||||
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- general flags
|
||||||
|
strict SMALLINT DEFAULT 0,
|
||||||
|
locked SMALLINT DEFAULT 0,
|
||||||
|
protected SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- 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,
|
||||||
email VARCHAR,
|
-- is admin user
|
||||||
protected SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
admin SMALLINT NOT NULL DEFAULT 0,
|
admin SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- last login log
|
||||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- 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,
|
||||||
strict SMALLINT DEFAULT 0,
|
-- time locked
|
||||||
locked SMALLINT DEFAULT 0,
|
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- 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
|
||||||
|
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_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_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_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
||||||
|
-- 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 edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||||
|
|
||||||
|
COMMENT ON COLUMN edit_user.username IS 'Login username, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.password IS 'Login password, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.enabled IS 'Login is enabled (master switch)';
|
||||||
|
COMMENT ON COLUMN edit_user.deleted IS 'Login is deleted (master switch), overrides all other';
|
||||||
|
COMMENT ON COLUMN edit_user.strict IS 'If too many failed logins user will be locked, default off';
|
||||||
|
COMMENT ON COLUMN edit_user.locked IS 'Locked from too many wrong password logins';
|
||||||
|
COMMENT ON COLUMN edit_user.protected IS 'User can only be chnaged by admin user';
|
||||||
|
COMMENT ON COLUMN edit_user.debug IS 'Turn debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.db_debug IS 'Turn DB debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.admin IS 'If set, this user is SUPER admin';
|
||||||
|
COMMENT ON COLUMN edit_user.last_login IS 'Last succesfull login tiemstamp';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_count IS 'Number of failed logins, reset on successful login';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_last IS 'Last login error date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_first IS 'First login error date, reset on successfull login';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_until IS 'Account is locked until this date, <';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_after IS 'Account is locked after this date, >';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_date IS 'Password was changed on';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_interval IS 'After how many days the password has to be changed';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid';
|
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid, one time, invalid after reset successful or time out';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id IS 'Min 32 character UID to be used to login without password. Via GET/POST parameter';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_set_date IS 'loginUserId was set at what date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_last_revalidate IS 'set when username/password login is done and loginUserId is set';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_from IS 'loginUserId is valid from this date, >=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_until IS 'loginUserId is valid until this date, <=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_revalidate_after IS 'If set to a number greater 0 then user must login after given amount of days to revalidate the loginUserId, set to 0 for valid forver';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_locked IS 'A separte lock flag for loginUserId, user can still login normal';
|
||||||
|
COMMENT ON COLUMN edit_user.additional_acl IS 'Additional Access Control List stored in JSON format';
|
||||||
-- END: table/edit_user.sql
|
-- END: table/edit_user.sql
|
||||||
-- START: table/edit_log.sql
|
-- START: table/edit_log.sql
|
||||||
-- AUTHOR: Clemens Schwaighofer
|
-- AUTHOR: Clemens Schwaighofer
|
||||||
@@ -774,6 +859,11 @@ FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
|||||||
CREATE TRIGGER trg_edit_user
|
CREATE TRIGGER trg_edit_user
|
||||||
BEFORE INSERT OR UPDATE ON edit_user
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
|
-- DROP TRIGGER IF EXISTS trg_edit_user_set_login_user_id_set_date ON edit_user;
|
||||||
|
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||||
-- END: trigger/trg_edit_user.sql
|
-- END: trigger/trg_edit_user.sql
|
||||||
-- START: trigger/trg_edit_visible_group.sql
|
-- START: trigger/trg_edit_visible_group.sql
|
||||||
-- DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
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
|
||||||
@@ -23,6 +23,6 @@ $$
|
|||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
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
|
||||||
@@ -23,6 +23,6 @@ $$
|
|||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
-- set edit user login_user_id_set_date if login_user_id is set
|
||||||
|
-- NOW() if not empty
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
-- if new is not null/empty
|
||||||
|
-- and old one is null or old one different new one
|
||||||
|
-- set NOW()
|
||||||
|
-- if new one is NULL
|
||||||
|
-- set NULL
|
||||||
|
IF
|
||||||
|
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)
|
||||||
|
THEN
|
||||||
|
NEW.login_user_id_set_date = NOW();
|
||||||
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
|
NEW.login_user_id_set_date = NULL;
|
||||||
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
-- create random string with length X
|
-- create random string with length X
|
||||||
|
|
||||||
CREATE FUNCTION random_string(randomLength int)
|
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(
|
||||||
@@ -13,6 +14,7 @@ SELECT array_to_string(
|
|||||||
),
|
),
|
||||||
''
|
''
|
||||||
)
|
)
|
||||||
$$ LANGUAGE SQL
|
$$
|
||||||
|
LANGUAGE SQL
|
||||||
RETURNS NULL ON NULL INPUT
|
RETURNS NULL ON NULL INPUT
|
||||||
VOLATILE; -- LEAKPROOF;
|
VOLATILE; -- LEAKPROOF;
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_date() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_date()
|
||||||
BEGIN
|
RETURNS TRIGGER AS
|
||||||
IF TG_OP = ''INSERT'' THEN
|
$$
|
||||||
NEW.date_created := ''now'';
|
BEGIN
|
||||||
ELSIF TG_OP = ''UPDATE'' THEN
|
IF TG_OP = 'INSERT' THEN
|
||||||
NEW.date_updated := ''now'';
|
NEW.date_created := 'now';
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
NEW.date_updated := 'now';
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
' LANGUAGE 'plpgsql';
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||||
DECLARE
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
random_length INT = 12; -- that should be long enough
|
random_length INT = 12; -- 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';
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
-- set generic with date and uid combined
|
-- set generic with date and uid combined
|
||||||
-- don't use with set_generic/set_uid together
|
-- don't use with set_generic/set_uid together
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_generic()
|
||||||
DECLARE
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
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';
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_uid()
|
||||||
DECLARE
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
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';
|
||||||
|
|||||||
@@ -2,15 +2,18 @@
|
|||||||
|
|
||||||
-- OLD, DEPRECATED, use set_generic.sql
|
-- OLD, DEPRECATED, use set_generic.sql
|
||||||
|
|
||||||
-- CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
-- CREATE OR REPLACE FUNCTION set_generic()
|
||||||
|
-- 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';
|
||||||
|
|||||||
@@ -18,31 +18,82 @@ CREATE TABLE edit_user (
|
|||||||
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,
|
-- username/password
|
||||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
username VARCHAR UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
|
-- 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 VARCHAR,
|
||||||
|
-- eanbled/deleted flag
|
||||||
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- general flags
|
||||||
|
strict SMALLINT DEFAULT 0,
|
||||||
|
locked SMALLINT DEFAULT 0,
|
||||||
|
protected SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- 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,
|
||||||
email VARCHAR,
|
-- is admin user
|
||||||
protected SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
admin SMALLINT NOT NULL DEFAULT 0,
|
admin SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- last login log
|
||||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- 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,
|
||||||
strict SMALLINT DEFAULT 0,
|
-- time locked
|
||||||
locked SMALLINT DEFAULT 0,
|
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- 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
|
||||||
|
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_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_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_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
||||||
|
-- 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 edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||||
|
|
||||||
|
COMMENT ON COLUMN edit_user.username IS 'Login username, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.password IS 'Login password, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.enabled IS 'Login is enabled (master switch)';
|
||||||
|
COMMENT ON COLUMN edit_user.deleted IS 'Login is deleted (master switch), overrides all other';
|
||||||
|
COMMENT ON COLUMN edit_user.strict IS 'If too many failed logins user will be locked, default off';
|
||||||
|
COMMENT ON COLUMN edit_user.locked IS 'Locked from too many wrong password logins';
|
||||||
|
COMMENT ON COLUMN edit_user.protected IS 'User can only be chnaged by admin user';
|
||||||
|
COMMENT ON COLUMN edit_user.debug IS 'Turn debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.db_debug IS 'Turn DB debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.admin IS 'If set, this user is SUPER admin';
|
||||||
|
COMMENT ON COLUMN edit_user.last_login IS 'Last succesfull login tiemstamp';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_count IS 'Number of failed logins, reset on successful login';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_last IS 'Last login error date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_first IS 'First login error date, reset on successfull login';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_until IS 'Account is locked until this date, <';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_after IS 'Account is locked after this date, >';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_date IS 'Password was changed on';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_interval IS 'After how many days the password has to be changed';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid';
|
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid, one time, invalid after reset successful or time out';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id IS 'Min 32 character UID to be used to login without password. Via GET/POST parameter';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_set_date IS 'loginUserId was set at what date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_last_revalidate IS 'set when username/password login is done and loginUserId is set';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_from IS 'loginUserId is valid from this date, >=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_until IS 'loginUserId is valid until this date, <=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_revalidate_after IS 'If set to a number greater 0 then user must login after given amount of days to revalidate the loginUserId, set to 0 for valid forver';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_locked IS 'A separte lock flag for loginUserId, user can still login normal';
|
||||||
|
COMMENT ON COLUMN edit_user.additional_acl IS 'Additional Access Control List stored in JSON format';
|
||||||
|
|||||||
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
--
|
||||||
|
SELECT
|
||||||
|
eu.cuid, eu.username,
|
||||||
|
eu.lock_until, eu.lock_after,
|
||||||
|
CASE WHEN (
|
||||||
|
(eu.lock_until IS NULL
|
||||||
|
OR (eu.lock_until IS NOT NULL AND NOW() >= eu.lock_until))
|
||||||
|
AND (eu.lock_after IS NULL
|
||||||
|
OR (eu.lock_after IS NOT NULL AND NOW() <= eu.lock_after))
|
||||||
|
) THEN 0::INT ELSE 1::INT END locked_period
|
||||||
|
FROM edit_user eu
|
||||||
|
WHERE eu.username = 'empty';
|
||||||
|
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_until = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_after = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_until = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_after = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
UPDATE edit_user SET lock_until = NULL, lock_after = NULL WHERE username = 'empty';
|
||||||
|
|
||||||
|
--
|
||||||
|
SELECT
|
||||||
|
eu.cuid, eu.username,
|
||||||
|
eu.login_user_id, login_user_id_set_date, eu.login_user_id_last_revalidate,
|
||||||
|
(eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE AS reval_date, NOW()::DATE,
|
||||||
|
eu.login_user_id_valid_from, eu.login_user_id_valid_until,
|
||||||
|
eu.login_user_id_revalidate_after,
|
||||||
|
CASE WHEN (
|
||||||
|
(eu.login_user_id_valid_from IS NULL
|
||||||
|
OR (eu.login_user_id_valid_from IS NOT NULL AND NOW() >= eu.login_user_id_valid_from))
|
||||||
|
AND (eu.login_user_id_valid_until IS NULL
|
||||||
|
OR (eu.login_user_id_valid_until IS NOT NULL AND NOW() <= eu.login_user_id_valid_until))
|
||||||
|
) THEN 1::INT ELSE 0::INT END AS login_user_id_valid_date,
|
||||||
|
CASE WHEN eu.login_user_id_revalidate_after IS NOT NULL
|
||||||
|
AND eu.login_user_id_revalidate_after > '0 days'::INTERVAL
|
||||||
|
AND (eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE <= NOW()::DATE
|
||||||
|
THEN 1::INT ELSE 0::INT END AS login_user_id_revalidate
|
||||||
|
FROM edit_user eu
|
||||||
|
WHERE eu.username = 'empty';
|
||||||
|
|
||||||
|
-- init
|
||||||
|
UPDATE edit_user SET login_user_id = random_string(5) WHERE username = 'empty';
|
||||||
|
|
||||||
|
-- outside valid
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_from = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_until = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
-- inside valid
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_from = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_until = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
-- revalidate must
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_last_revalidate = NOW() - '1 day'::interval,
|
||||||
|
login_user_id_revalidate_after = '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
-- revalidate not yet
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_last_revalidate = NOW(),
|
||||||
|
login_user_id_revalidate_after = '6 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE edit_user SET login_user_id_set_date = NULL, login_user_id_last_revalidate = NULL, login_user_id_valid_from = NULL, login_user_id_valid_until = NULL, login_user_id_revalidate_after = NULL WHERE username = 'empty';
|
||||||
@@ -2,3 +2,8 @@
|
|||||||
CREATE TRIGGER trg_edit_user
|
CREATE TRIGGER trg_edit_user
|
||||||
BEFORE INSERT OR UPDATE ON edit_user
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
|
-- DROP TRIGGER IF EXISTS trg_edit_user_set_login_user_id_set_date ON edit_user;
|
||||||
|
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ declare(strict_types=1);
|
|||||||
* 1 for file loadable, but no data inside
|
* 1 for file loadable, but no data inside
|
||||||
* 2 for file not readable
|
* 2 for file not readable
|
||||||
* 3 for file not found
|
* 3 for file not found
|
||||||
* @deprecated V6 Use \CoreLibs\Get\ReadEnvFile::readEnvFile()
|
* @deprecated V6 Use \CoreLibs\Get\DotEnv::readEnvFile()
|
||||||
*/
|
*/
|
||||||
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
||||||
{
|
{
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,7 @@
|
|||||||
# PARAMETER 2: db user WHO MUST BE ABLE TO CREATE A DATABASE
|
# PARAMETER 2: db user WHO MUST BE ABLE TO CREATE A DATABASE
|
||||||
# PARAMETER 3: db name
|
# PARAMETER 3: db name
|
||||||
# PARAMETER 4: db host
|
# PARAMETER 4: db host
|
||||||
|
# PARAMETER 5: print out for testing
|
||||||
|
|
||||||
load_sql="${1}";
|
load_sql="${1}";
|
||||||
# abort with 1 if we cannot find the file
|
# abort with 1 if we cannot find the file
|
||||||
@@ -34,8 +35,13 @@ if [ $? -ne 0 ]; then
|
|||||||
echo 4;
|
echo 4;
|
||||||
exit 4;
|
exit 4;
|
||||||
fi;
|
fi;
|
||||||
# load data (redirect ALL error to null), on error exit with 5
|
# if error 5 thrown, test with enabled below
|
||||||
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null;
|
if [ ! -z "${5}" ]; then
|
||||||
|
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
|
||||||
|
else
|
||||||
|
# load data (redirect ALL error to null), on error exit with 5
|
||||||
|
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null;
|
||||||
|
fi;
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo 5;
|
echo 5;
|
||||||
exit 5;
|
exit 5;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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__
|
||||||
|
|||||||
261
4dev/tests/CoreLibsConvertStringsTest.php
Normal file
261
4dev/tests/CoreLibsConvertStringsTest.php
Normal 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',
|
||||||
|
'2-2',
|
||||||
|
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__
|
||||||
692
4dev/tests/CoreLibsCreateEmailTest.php
Normal file
692
4dev/tests/CoreLibsCreateEmailTest.php
Normal file
@@ -0,0 +1,692 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Create\Email
|
||||||
|
* @coversDefaultClass \CoreLibs\Create\Email
|
||||||
|
* @testdox \CoreLibs\Create\Email method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCreateEmailTest extends TestCase
|
||||||
|
{
|
||||||
|
private static $log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* start DB conneciton, setup DB, etc
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setUpBeforeClass(): void
|
||||||
|
{
|
||||||
|
self::$log = new \CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
||||||
|
'file_id' => 'CoreLibs-Create-Email-Test',
|
||||||
|
'debug_all' => true,
|
||||||
|
'echo_all' => false,
|
||||||
|
'print_all' => true,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function encodeEmailNameProvider(): array
|
||||||
|
{
|
||||||
|
// 0: email
|
||||||
|
// 1: name
|
||||||
|
// 2: encoding
|
||||||
|
// 3: kv_folding
|
||||||
|
// 4: expected
|
||||||
|
return [
|
||||||
|
'all empty' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'email only' => [
|
||||||
|
'test@test.com',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'email and name' => [
|
||||||
|
'test@test.com',
|
||||||
|
'Test Name',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"Test Name" <test@test.com>'
|
||||||
|
],
|
||||||
|
'name in mime encoded, default UTF-8' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"=?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' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
'UTF-8',
|
||||||
|
null,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
// does internal UTF-8 to ISO-2022-JP convert
|
||||||
|
'encoding in ISO-2022-JP' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
'ISO-2022-JP',
|
||||||
|
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,
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider encodeEmailNameProvider
|
||||||
|
* @testdox encode email $email, name $name, encoding $encoding, folding $kv_folding will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testEncodeEmailName(
|
||||||
|
string $email,
|
||||||
|
?string $name,
|
||||||
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
if ($name === null && $encoding === null && $kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
|
||||||
|
} elseif ($encoding === null && $kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
|
||||||
|
} elseif ($kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
|
||||||
|
} else {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding, $kv_folding);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$encoded_email
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sendEmailProvider(): array
|
||||||
|
{
|
||||||
|
// 0: subject
|
||||||
|
// 1: body
|
||||||
|
// 2: from email
|
||||||
|
// 3: from name ('')
|
||||||
|
// 4: array for to email
|
||||||
|
// 5: replace content ([]/null)
|
||||||
|
// 6: encoding (UTF-8/null)
|
||||||
|
// 7: kv_folding
|
||||||
|
// 8: return status
|
||||||
|
// 9: expected content
|
||||||
|
return [
|
||||||
|
'all empty, fail -1' => [
|
||||||
|
'subject' => '',
|
||||||
|
'body' => '',
|
||||||
|
'from_email' => '',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -1,
|
||||||
|
'expected_content' => [],
|
||||||
|
],
|
||||||
|
'missing to entry, fail -2' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -2,
|
||||||
|
'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' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1, encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe?=',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'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' => [
|
||||||
|
'subject' => 'SUBJECT 日本語',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'ISO-2022-JP',
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=',
|
||||||
|
// body is stored as UTF-8 in log and here, so both must be translated
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 2' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'e1@test.com',
|
||||||
|
'e2@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'e1@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'e2@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT foo',
|
||||||
|
'body' => 'BODY foo bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic, to override' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 'test@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to',
|
||||||
|
'body' => 'BODY foo to bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic, to override encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 'test@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0bw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo to bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 3: dynamic, to mixed override' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 't1@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 1'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't2@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 2'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't3@test.com',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't1@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to 1',
|
||||||
|
'body' => 'BODY foo to 1 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't2@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to 2',
|
||||||
|
'body' => 'BODY foo to 2 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't3@test.com',
|
||||||
|
'subject' => 'SUBJECT foo',
|
||||||
|
'body' => 'BODY foo bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 3: dynamic, to mixed override encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 't1@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 1'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't2@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 2'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't3@test.com',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't1@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAx?=',
|
||||||
|
'body' => 'BODY 日本語 foo to 1 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't2@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAy?=',
|
||||||
|
'body' => 'BODY 日本語 foo to 2 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't3@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider sendEmailProvider
|
||||||
|
* @testdox email sending with expected status $expected_status [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $subject
|
||||||
|
* @param string $body
|
||||||
|
* @param string $from_email
|
||||||
|
* @param string $from_name
|
||||||
|
* @param array $to_email
|
||||||
|
* @param array|null $replace
|
||||||
|
* @param string|null $encoding
|
||||||
|
* @param bool|null $kv_folding
|
||||||
|
* @param int $expected_status
|
||||||
|
* @param array $expected_content
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSendEmail(
|
||||||
|
string $subject,
|
||||||
|
string $body,
|
||||||
|
string $from_email,
|
||||||
|
string $from_name,
|
||||||
|
array $to_email,
|
||||||
|
?array $replace,
|
||||||
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
|
int $expected_status,
|
||||||
|
array $expected_content
|
||||||
|
): void {
|
||||||
|
if ($replace === null) {
|
||||||
|
$replace = [];
|
||||||
|
}
|
||||||
|
if ($encoding === null) {
|
||||||
|
$encoding = 'UTF-8';
|
||||||
|
}
|
||||||
|
if ($kv_folding === null) {
|
||||||
|
$kv_folding = false;
|
||||||
|
}
|
||||||
|
// force new set for each run
|
||||||
|
self::$log->setLogUniqueId(true);
|
||||||
|
// set on of unique log id
|
||||||
|
self::$log->setLogPer('run', true);
|
||||||
|
// init logger
|
||||||
|
$status = \CoreLibs\Create\Email::sendEmail(
|
||||||
|
$subject,
|
||||||
|
$body,
|
||||||
|
$from_email,
|
||||||
|
$from_name,
|
||||||
|
$to_email,
|
||||||
|
$replace,
|
||||||
|
$encoding,
|
||||||
|
$kv_folding,
|
||||||
|
true,
|
||||||
|
self::$log
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_status,
|
||||||
|
$status,
|
||||||
|
'Assert sending status'
|
||||||
|
);
|
||||||
|
// assert content: must load JSON from log file
|
||||||
|
if ($status == 2) {
|
||||||
|
// open file, get last entry with 'SEND EMAIL JSON' key
|
||||||
|
$file = file_get_contents(self::$log->getLogFileName());
|
||||||
|
if ($file !== false) {
|
||||||
|
// extract SEND EMAIL JSON line
|
||||||
|
$found = preg_match_all("/^.* <SEND EMAIL JSON> - (.*)$/m", $file, $matches);
|
||||||
|
// print "Found: $found | EMAIL: " . print_r($matches, true) . "\n";
|
||||||
|
if (!empty($matches[1])) {
|
||||||
|
foreach ($matches[1] as $pos => $email_json) {
|
||||||
|
$email = \CoreLibs\Convert\Json::jsonConvertToArray($email_json);
|
||||||
|
// print "EMAIL: " . print_r($email, true) . "\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['header']['From'] ?? 'MISSING FROM',
|
||||||
|
$email['header']['From'] ?? '',
|
||||||
|
'Email check: assert header from'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'text/plain; charset=' . $encoding ?? 'UTF-8',
|
||||||
|
$email['header']['Content-type'] ?? '',
|
||||||
|
'Email check: assert header content type'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'1.0',
|
||||||
|
$email['header']['MIME-Version'] ?? '',
|
||||||
|
'Email check: assert header mime version'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['to'] ?? 'MISSING TO',
|
||||||
|
$email['to'] ?? '',
|
||||||
|
'Email check: assert to'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['subject'] ?? 'MISSING SUBJECT',
|
||||||
|
$email['subject'] ?? '',
|
||||||
|
'Email check: assert subject'
|
||||||
|
);
|
||||||
|
// body must be translated back to encoding if encoding is not UTF-8
|
||||||
|
$this->assertEquals(
|
||||||
|
$encoding != 'UTF-8' ?
|
||||||
|
mb_convert_encoding($expected_content[$pos]['body'] ?? '', $encoding, 'UTF-8') :
|
||||||
|
$expected_content[$pos]['body'] ?? 'MISSING BODY',
|
||||||
|
$email['encoding'] != 'UTF-8' ?
|
||||||
|
mb_convert_encoding($email['body'] ?? '', $email['encoding'], 'UTF-8') :
|
||||||
|
$email['body'] ?? '',
|
||||||
|
'Email check: assert body'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -13,7 +13,11 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsCreateHashTest extends TestCase
|
final class CoreLibsCreateHashTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function hashData(): array
|
public function hashData(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -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') {
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ final class CoreLibsDBExtendedArrayIOTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDBIO()
|
public function testArrayDBIO()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
// $this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2536,7 +2536,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 (
|
||||||
|
|||||||
@@ -15,8 +15,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsDebugLoggingTest extends TestCase
|
final class CoreLibsDebugLoggingTest extends TestCase
|
||||||
{
|
{
|
||||||
public $log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test set for options BASIC
|
* test set for options BASIC
|
||||||
*
|
*
|
||||||
@@ -85,6 +83,47 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init logging class
|
||||||
|
*
|
||||||
|
* @dataProvider optionsProvider
|
||||||
|
* @testdox init test [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array|null $options
|
||||||
|
* @param array $expected
|
||||||
|
* @param array $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testClassInit(?array $options, array $expected, array $override): void
|
||||||
|
{
|
||||||
|
if (!empty($override['constant'])) {
|
||||||
|
foreach ($override['constant'] as $var => $value) {
|
||||||
|
define($var, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($options === null) {
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
} else {
|
||||||
|
$log = new \CoreLibs\Debug\Logging($options);
|
||||||
|
}
|
||||||
|
// check that settings match
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['log_folder'],
|
||||||
|
$log->getSetting('log_folder')
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['debug_all'],
|
||||||
|
$log->getSetting('debug_output_all')
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['print_all'],
|
||||||
|
$log->getSetting('print_output_all')
|
||||||
|
);
|
||||||
|
// print "LOG: " . $log->getSetting('log_folder') . "\n";
|
||||||
|
// print "DEBUG: " . $log->getSetting('debug_output_all') . "\n";
|
||||||
|
// print "PRINT: " . $log->getSetting('print_output_all') . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* adds log ID settings based on basic options
|
* adds log ID settings based on basic options
|
||||||
*
|
*
|
||||||
@@ -173,6 +212,52 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test the setting and getting of LogId
|
||||||
|
*
|
||||||
|
* @covers ::setLogId
|
||||||
|
* @dataProvider logIdOptionsProvider
|
||||||
|
* @testdox log id set/get tests [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array|null $options
|
||||||
|
* @param array $expected
|
||||||
|
* @param array $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLogId(?array $options, array $expected, array $override): void
|
||||||
|
{
|
||||||
|
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
|
||||||
|
if (!empty($override['constant'])) {
|
||||||
|
foreach ($override['constant'] as $var => $value) {
|
||||||
|
define($var, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($override['globals'])) {
|
||||||
|
foreach ($override['globals'] as $var => $value) {
|
||||||
|
$GLOBALS[$var] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($options === null) {
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
} else {
|
||||||
|
$log = new \CoreLibs\Debug\Logging($options);
|
||||||
|
}
|
||||||
|
// check current
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogId(),
|
||||||
|
$expected['log_file_id']
|
||||||
|
);
|
||||||
|
// we need to override now too
|
||||||
|
if (!empty($override['values'])) {
|
||||||
|
// check if we have values, set them post and assert
|
||||||
|
$log->setLogId($override['values']['log_file_id']);
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogId(),
|
||||||
|
$expected['set_log_file_id']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -180,6 +265,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function logLevelAllProvider(): array
|
public function logLevelAllProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: type
|
||||||
|
// 1: flag
|
||||||
|
// 2: expected set
|
||||||
|
// 3: expected get
|
||||||
return [
|
return [
|
||||||
'debug all true' => [
|
'debug all true' => [
|
||||||
'debug',
|
'debug',
|
||||||
@@ -208,6 +297,38 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check set/get for log level all flag
|
||||||
|
*
|
||||||
|
* @dataProvider logLevelAllProvider
|
||||||
|
* @testdox set/get all log level $type with flag $flag [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @param bool $flag
|
||||||
|
* @param bool $expected_set
|
||||||
|
* @param bool $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogLevelAll(
|
||||||
|
string $type,
|
||||||
|
bool $flag,
|
||||||
|
bool $expected_set,
|
||||||
|
bool $expected_get
|
||||||
|
): void {
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setLogLevelAll($type, $flag),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
// get and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogLevelAll($type),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -215,6 +336,12 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function logLevelProvider(): array
|
public function logLevelProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: type
|
||||||
|
// 1: flag
|
||||||
|
// 2: debug on (array)
|
||||||
|
// 3: expected set
|
||||||
|
// 4: level
|
||||||
|
// 5: expected get
|
||||||
return [
|
return [
|
||||||
'set debug on for level A,B,C and check full set' => [
|
'set debug on for level A,B,C and check full set' => [
|
||||||
'debug',
|
'debug',
|
||||||
@@ -287,6 +414,43 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* checks setting for per log info level
|
||||||
|
*
|
||||||
|
* @covers ::setLogLevel
|
||||||
|
* @dataProvider logLevelProvider
|
||||||
|
* @testdox set/get log level $type to $flag check with $level [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @param string $flag
|
||||||
|
* @param array $debug_on
|
||||||
|
* @param bool $expected_set
|
||||||
|
* @param string|null $level
|
||||||
|
* @param bool|array<mixed> $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogLevel(
|
||||||
|
string $type,
|
||||||
|
string $flag,
|
||||||
|
array $debug_on,
|
||||||
|
bool $expected_set,
|
||||||
|
?string $level,
|
||||||
|
$expected_get
|
||||||
|
): void {
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setLogLevel($type, $flag, $debug_on),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
// get, if level is null compare to?
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogLevel($type, $flag, $level),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -294,6 +458,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function logPerProvider(): array
|
public function logPerProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: type
|
||||||
|
// 1: set
|
||||||
|
// 2: expected set
|
||||||
|
// 3: expected get
|
||||||
return [
|
return [
|
||||||
'level set true' => [
|
'level set true' => [
|
||||||
'level',
|
'level',
|
||||||
@@ -328,6 +496,68 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set and get per log
|
||||||
|
* for level/class/page/run flags
|
||||||
|
*
|
||||||
|
* @covers ::setLogPer
|
||||||
|
* @dataProvider logPerProvider
|
||||||
|
* @testdox set/get log per $type with $set [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @param boolean $set
|
||||||
|
* @param boolean $expected_set
|
||||||
|
* @param boolean $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogPer(
|
||||||
|
string $type,
|
||||||
|
bool $set,
|
||||||
|
bool $expected_set,
|
||||||
|
bool $expected_get
|
||||||
|
): void {
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setLogPer($type, $set),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
// get and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogPer($type),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the print log file date part
|
||||||
|
*
|
||||||
|
* @covers ::setGetLogPrintFileDate
|
||||||
|
* @testWith [true, true, true]
|
||||||
|
* [false, false, false]
|
||||||
|
* @testdox set/get log file date to $input [$_dataName]
|
||||||
|
*
|
||||||
|
* @param boolean $input
|
||||||
|
* @param boolean $expected_set
|
||||||
|
* @param boolean $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
|
||||||
|
{
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setGetLogPrintFileDate($input),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setGetLogPrintFileDate(),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -369,6 +599,95 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convert array to string with ## pre replace space holders
|
||||||
|
*
|
||||||
|
* @covers ::prAr
|
||||||
|
* @dataProvider prArProvider
|
||||||
|
* @testdox check prAr array to string conversion [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrAr(array $input, string $expected): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->prAr($input),
|
||||||
|
$expected
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function prBlProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input flag (bool)
|
||||||
|
// 1: is true
|
||||||
|
// 2: is flase
|
||||||
|
// 3: epxected
|
||||||
|
return [
|
||||||
|
'true bool default' => [
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'true'
|
||||||
|
],
|
||||||
|
'false bool default' => [
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'false'
|
||||||
|
],
|
||||||
|
'true bool override' => [
|
||||||
|
true,
|
||||||
|
'ok',
|
||||||
|
'not ok',
|
||||||
|
'ok'
|
||||||
|
],
|
||||||
|
'false bool override' => [
|
||||||
|
false,
|
||||||
|
'ok',
|
||||||
|
'not ok',
|
||||||
|
'not ok'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check bool to string converter
|
||||||
|
*
|
||||||
|
* @covers ::prBl
|
||||||
|
* @dataProvider prBlProvider
|
||||||
|
* @testdox check prBl $input ($true/$false) is expected $false [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $input
|
||||||
|
* @param string|null $true
|
||||||
|
* @param string|null $false
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrBl(bool $input, ?string $true, ?string $false, string $expected): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
$return = '';
|
||||||
|
if ($true === null && $false === null) {
|
||||||
|
$return = $log->prBl($input);
|
||||||
|
} elseif ($true !== null || $false !== null) {
|
||||||
|
$return = $log->prBl($input, $true ?? '', $false ?? '');
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$return
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// from here are complex debug tests
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -471,304 +790,6 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* init logging class
|
|
||||||
*
|
|
||||||
* @dataProvider optionsProvider
|
|
||||||
* @testdox init test [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array|null $options
|
|
||||||
* @param array $expected
|
|
||||||
* @param array $override
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testClassInit(?array $options, array $expected, array $override): void
|
|
||||||
{
|
|
||||||
if (!empty($override['constant'])) {
|
|
||||||
foreach ($override['constant'] as $var => $value) {
|
|
||||||
define($var, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($options === null) {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check that settings match
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['log_folder'],
|
|
||||||
$this->log->getSetting('log_folder')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['debug_all'],
|
|
||||||
$this->log->getSetting('debug_output_all')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['print_all'],
|
|
||||||
$this->log->getSetting('print_output_all')
|
|
||||||
);
|
|
||||||
// print "LOG: " . $this->log->getSetting('log_folder') . "\n";
|
|
||||||
// print "DEBUG: " . $this->log->getSetting('debug_output_all') . "\n";
|
|
||||||
// print "PRINT: " . $this->log->getSetting('print_output_all') . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* test the setting and getting of LogId
|
|
||||||
*
|
|
||||||
* @covers ::setLogId
|
|
||||||
* @dataProvider logIdOptionsProvider
|
|
||||||
* @testdox log id set/get tests [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array|null $options
|
|
||||||
* @param array $expected
|
|
||||||
* @param array $override
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testLogId(?array $options, array $expected, array $override): void
|
|
||||||
{
|
|
||||||
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
|
|
||||||
if (!empty($override['constant'])) {
|
|
||||||
foreach ($override['constant'] as $var => $value) {
|
|
||||||
define($var, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!empty($override['globals'])) {
|
|
||||||
foreach ($override['globals'] as $var => $value) {
|
|
||||||
$GLOBALS[$var] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($options === null) {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check current
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogId(),
|
|
||||||
$expected['log_file_id']
|
|
||||||
);
|
|
||||||
// we need to override now too
|
|
||||||
if (!empty($override['values'])) {
|
|
||||||
// check if we have values, set them post and assert
|
|
||||||
$this->log->basicSetLogId($override['values']['log_file_id']);
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogId(),
|
|
||||||
$expected['set_log_file_id']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check set/get for log level all flag
|
|
||||||
*
|
|
||||||
* @dataProvider logLevelAllProvider
|
|
||||||
* @testdox set/get all log level $type with flag $flag [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param bool $flag
|
|
||||||
* @param bool $expected_set
|
|
||||||
* @param bool $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogLevelAll(
|
|
||||||
string $type,
|
|
||||||
bool $flag,
|
|
||||||
bool $expected_set,
|
|
||||||
bool $expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogLevelAll($type, $flag),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogLevelAll($type),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* checks setting for per log info level
|
|
||||||
*
|
|
||||||
* @covers ::setLogLevel
|
|
||||||
* @dataProvider logLevelProvider
|
|
||||||
* @testdox set/get log level $type to $flag check with $level [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param string $flag
|
|
||||||
* @param array $debug_on
|
|
||||||
* @param bool $expected_set
|
|
||||||
* @param string|null $level
|
|
||||||
* @param bool|array<mixed> $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogLevel(
|
|
||||||
string $type,
|
|
||||||
string $flag,
|
|
||||||
array $debug_on,
|
|
||||||
bool $expected_set,
|
|
||||||
?string $level,
|
|
||||||
$expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogLevel($type, $flag, $debug_on),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get, if level is null compare to?
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogLevel($type, $flag, $level),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set and get per log
|
|
||||||
* for level/class/page/run flags
|
|
||||||
*
|
|
||||||
* @covers ::setLogPer
|
|
||||||
* @dataProvider logPerProvider
|
|
||||||
* @testdox set/get log per $type with $set [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param boolean $set
|
|
||||||
* @param boolean $expected_set
|
|
||||||
* @param boolean $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogPer(
|
|
||||||
string $type,
|
|
||||||
bool $set,
|
|
||||||
bool $expected_set,
|
|
||||||
bool $expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogPer($type, $set),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogPer($type),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set the print log file date part
|
|
||||||
*
|
|
||||||
* @covers ::setGetLogPrintFileDate
|
|
||||||
* @testWith [true, true, true]
|
|
||||||
* [false, false, false]
|
|
||||||
* @testdox set/get log file date to $input [$_dataName]
|
|
||||||
*
|
|
||||||
* @param boolean $input
|
|
||||||
* @param boolean $expected_set
|
|
||||||
* @param boolean $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
|
|
||||||
{
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setGetLogPrintFileDate($input),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setGetLogPrintFileDate(),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* convert array to string with ## pre replace space holders
|
|
||||||
*
|
|
||||||
* @covers ::prAr
|
|
||||||
* @dataProvider prArProvider
|
|
||||||
* @testdox check prAr array to string conversion [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrAr(array $input, string $expected): void
|
|
||||||
{
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->prAr($input),
|
|
||||||
$expected
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function prBlProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'true bool default' => [
|
|
||||||
true,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'true'
|
|
||||||
],
|
|
||||||
'false bool default' => [
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'false'
|
|
||||||
],
|
|
||||||
'true bool override' => [
|
|
||||||
true,
|
|
||||||
'ok',
|
|
||||||
'not ok',
|
|
||||||
'ok'
|
|
||||||
],
|
|
||||||
'false bool override' => [
|
|
||||||
false,
|
|
||||||
'ok',
|
|
||||||
'not ok',
|
|
||||||
'not ok'
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check bool to string converter
|
|
||||||
*
|
|
||||||
* @covers ::prBl
|
|
||||||
* @dataProvider prBlProvider
|
|
||||||
* @textdox check prBl $input ($true/$false) is expected $false [$_dataName]
|
|
||||||
*
|
|
||||||
* @param bool $input
|
|
||||||
* @param string|null $true
|
|
||||||
* @param string|null $false
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrBl(bool $input, ?string $true, ?string $false, string $expected): void
|
|
||||||
{
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
$return = '';
|
|
||||||
if ($true === null && $false === null) {
|
|
||||||
$return = $this->log->prBl($input);
|
|
||||||
} elseif ($true !== null || $false !== null) {
|
|
||||||
$return = $this->log->prBl($input, $true ?? '', $false ?? '');
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
$return
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// from here are complex debug tests
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test debug flow
|
* Test debug flow
|
||||||
*
|
*
|
||||||
@@ -824,11 +845,11 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
// remove any files named /tmp/error_log_TestDebug*.log
|
// remove any files named /tmp/error_log_TestDebug*.log
|
||||||
array_map('unlink', glob($options['log_folder'] . 'error_msg_' . $options['file_id'] . '*.log'));
|
array_map('unlink', glob($options['log_folder'] . 'error_msg_' . $options['file_id'] . '*.log'));
|
||||||
// init logger
|
// init logger
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
$log = new \CoreLibs\Debug\Logging($options);
|
||||||
// * debug (A/B)
|
// * debug (A/B)
|
||||||
// NULL check for strip/prefix
|
// NULL check for strip/prefix
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$this->log->debug(
|
$log->debug(
|
||||||
$debug_msg['level'],
|
$debug_msg['level'],
|
||||||
$debug_msg['string'],
|
$debug_msg['string'],
|
||||||
$debug_msg['strip'],
|
$debug_msg['strip'],
|
||||||
@@ -837,7 +858,7 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
$expected_debug
|
$expected_debug
|
||||||
);
|
);
|
||||||
// * if print check data in log file
|
// * if print check data in log file
|
||||||
$log_file = $this->log->getLogFileName();
|
$log_file = $log->getLogFileName();
|
||||||
if (!empty($options['debug_all']) && !empty($options['print_all'])) {
|
if (!empty($options['debug_all']) && !empty($options['print_all'])) {
|
||||||
// file name matching
|
// file name matching
|
||||||
$this->assertStringStartsWith(
|
$this->assertStringStartsWith(
|
||||||
@@ -866,10 +887,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
// ** ECHO ON
|
// ** ECHO ON
|
||||||
$log_string = $this->log->printErrorMsg();
|
$log_string = $log->printErrorMsg();
|
||||||
// * print
|
// * print
|
||||||
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
|
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
|
||||||
// print $this->log->printErrorMsg() . "\n";
|
// print $log->printErrorMsg() . "\n";
|
||||||
// echo string must start with
|
// echo string must start with
|
||||||
$this->assertStringStartsWith(
|
$this->assertStringStartsWith(
|
||||||
$expected_string_start,
|
$expected_string_start,
|
||||||
@@ -893,6 +914,77 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: setLogUniqueId/getLogUniqueId
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function logUniqueIdProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'option set' => [
|
||||||
|
'option' => true,
|
||||||
|
'override' => false,
|
||||||
|
],
|
||||||
|
'direct set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => false,
|
||||||
|
],
|
||||||
|
'override set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => true,
|
||||||
|
],
|
||||||
|
'option and override set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => true,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogUniqueId
|
||||||
|
* @covers ::getLogUniqueId
|
||||||
|
* @dataProvider logUniqueIdProvider
|
||||||
|
* @testdox per run log id set test: option: $option, override: $override [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $option
|
||||||
|
* @param bool $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLogUniqueId(bool $option, bool $override): void
|
||||||
|
{
|
||||||
|
if ($option === true) {
|
||||||
|
$log = new \CoreLibs\Debug\Logging(['per_run' => $option]);
|
||||||
|
} else {
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
$log->setLogUniqueId();
|
||||||
|
}
|
||||||
|
$per_run_id = $log->getLogUniqueId();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||||
|
$per_run_id,
|
||||||
|
'assert per log run id 1st'
|
||||||
|
);
|
||||||
|
if ($override === true) {
|
||||||
|
$log->setLogUniqueId(true);
|
||||||
|
$per_run_id_2nd = $log->getLogUniqueId();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||||
|
$per_run_id_2nd,
|
||||||
|
'assert per log run id 2nd'
|
||||||
|
);
|
||||||
|
$this->assertNotEquals(
|
||||||
|
$per_run_id,
|
||||||
|
$per_run_id_2nd,
|
||||||
|
'1st and 2nd don\'t match'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -120,6 +120,16 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
null,
|
null,
|
||||||
'a string',
|
'a string',
|
||||||
],
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
'a number' => [
|
'a number' => [
|
||||||
1234,
|
1234,
|
||||||
null,
|
null,
|
||||||
@@ -180,22 +190,41 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function debugStringProvider(): array
|
public function debugStringProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: input string
|
||||||
|
// 1: replace
|
||||||
|
// 2: html flag
|
||||||
|
// 3: expected
|
||||||
return [
|
return [
|
||||||
'null string, default' => [
|
'null string, default' => [
|
||||||
0 => null,
|
null,
|
||||||
1 => null,
|
null,
|
||||||
2 => '-'
|
null,
|
||||||
|
'-'
|
||||||
],
|
],
|
||||||
'empty string, ... replace' => [
|
'empty string, ... replace' => [
|
||||||
0 => '',
|
'',
|
||||||
1 => '...',
|
'...',
|
||||||
2 => '...'
|
null,
|
||||||
|
'...'
|
||||||
],
|
],
|
||||||
'filled string' => [
|
'filled string' => [
|
||||||
0 => 'some string',
|
'some string',
|
||||||
1 => null,
|
null,
|
||||||
2 => 'some string'
|
null,
|
||||||
]
|
'some string'
|
||||||
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,12 +395,14 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
if (count($compare) == 10) {
|
if (count($compare) == 10) {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Debug\Support::getCallerMethodList()
|
\CoreLibs\Debug\Support::getCallerMethodList(),
|
||||||
|
'assert expected 10'
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_group,
|
$expected_group,
|
||||||
\CoreLibs\Debug\Support::getCallerMethodList()
|
\CoreLibs\Debug\Support::getCallerMethodList(),
|
||||||
|
'assert expected group'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -398,24 +429,33 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @cover ::debugString
|
* @cover ::debugString
|
||||||
* @dataProvider debugStringProvider
|
* @dataProvider debugStringProvider
|
||||||
* @testdox debugString $input with replace $replace will be $expected [$_dataName]
|
* @testdox debugString $input with replace $replace and html $flag will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
* @param string|null $input
|
* @param string|null $input
|
||||||
* @param string|null $replace
|
* @param string|null $replace
|
||||||
|
* @param bool|null $flag
|
||||||
* @param string $expected
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDebugString(?string $input, ?string $replace, string $expected)
|
public function testDebugString(?string $input, ?string $replace, ?bool $flag, string $expected): void
|
||||||
{
|
{
|
||||||
if ($replace === null) {
|
if ($replace === null && $flag === null) {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Debug\Support::debugString($input)
|
\CoreLibs\Debug\Support::debugString($input),
|
||||||
|
'assert all default'
|
||||||
|
);
|
||||||
|
} elseif ($flag === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Debug\Support::debugString($input, $replace),
|
||||||
|
'assert flag default'
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Debug\Support::debugString($input, $replace)
|
\CoreLibs\Debug\Support::debugString($input, $replace, $flag),
|
||||||
|
'assert all set'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputFormElementsTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputFormElements()
|
public function testOutputFormElements()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'Output Form Elements Tests not implemented');
|
// $this->assertTrue(true, 'Output Form Elements Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'Output\Form\Elements Tests have not yet been implemented'
|
'Output\Form\Elements Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputFormTokenTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputFormToken()
|
public function testOutputFormToken()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'Output Form Token Tests not implemented');
|
// $this->assertTrue(true, 'Output Form Token Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'Output\Form\Token Tests have not yet been implemented'
|
'Output\Form\Token Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputImageTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputImage()
|
public function testOutputImage()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'Output Image Tests not implemented');
|
// $this->assertTrue(true, 'Output Image Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'Output\Image Tests have not yet been implemented'
|
'Output\Image Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -22,10 +22,10 @@ final class CoreLibsOutputProgressbarTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputProgressbar()
|
public function testOutputProgressbar()
|
||||||
{
|
{
|
||||||
/* $this->assertTrue(true, 'Output Progressbar Tests not implemented');
|
// $this->assertTrue(true, 'Output Progressbar Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
// $this->markTestIncomplete(
|
||||||
'Output\Progressbar Tests have not yet been implemented'
|
// 'Output\Progressbar Tests have not yet been implemented'
|
||||||
); */
|
// );
|
||||||
$this->markTestSkipped('No implementation for Output\Progressbar at the moment');
|
$this->markTestSkipped('No implementation for Output\Progressbar at the moment');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
-- create random string with length X
|
-- create random string with length X
|
||||||
|
|
||||||
CREATE FUNCTION random_string(randomLength int)
|
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(
|
||||||
@@ -14,35 +15,40 @@ SELECT array_to_string(
|
|||||||
),
|
),
|
||||||
''
|
''
|
||||||
)
|
)
|
||||||
$$ LANGUAGE SQL
|
$$
|
||||||
|
LANGUAGE SQL
|
||||||
RETURNS NULL ON NULL INPUT
|
RETURNS NULL ON NULL INPUT
|
||||||
VOLATILE; -- LEAKPROOF;-- END: function/random_string.sql
|
VOLATILE; -- LEAKPROOF;
|
||||||
|
-- END: function/random_string.sql
|
||||||
-- START: function/set_edit_generic.sql
|
-- START: function/set_edit_generic.sql
|
||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||||
DECLARE
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
random_length INT = 12; -- that should be long enough
|
random_length INT = 12; -- 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';
|
||||||
-- END: function/set_edit_generic.sql
|
-- END: function/set_edit_generic.sql
|
||||||
-- START: function/edit_access_set_uid.sql
|
-- START: function/edit_access_set_uid.sql
|
||||||
-- add uid add for edit_access table
|
-- add uid add for edit_access table
|
||||||
|
|
||||||
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
|
||||||
@@ -60,7 +66,7 @@ $$
|
|||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_access_set_uid.sql
|
-- END: function/edit_access_set_uid.sql
|
||||||
@@ -69,10 +75,10 @@ $$
|
|||||||
|
|
||||||
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
|
||||||
@@ -90,7 +96,7 @@ $$
|
|||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_group_set_uid.sql
|
-- END: function/edit_group_set_uid.sql
|
||||||
@@ -246,6 +252,34 @@ END
|
|||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_log_partition_insert.sql
|
-- END: function/edit_log_partition_insert.sql
|
||||||
|
-- START: function/edit_user_set_login_user_id_set_date.sql
|
||||||
|
-- set edit user login_user_id_set_date if login_user_id is set
|
||||||
|
-- NOW() if not empty
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
-- if new is not null/empty
|
||||||
|
-- and old one is null or old one different new one
|
||||||
|
-- set NOW()
|
||||||
|
-- if new one is NULL
|
||||||
|
-- set NULL
|
||||||
|
IF
|
||||||
|
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)
|
||||||
|
THEN
|
||||||
|
NEW.login_user_id_set_date = NOW();
|
||||||
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
|
NEW.login_user_id_set_date = NULL;
|
||||||
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
-- END: function/edit_user_set_login_user_id_set_date.sql
|
||||||
-- START: table/edit_temp_files.sql
|
-- START: table/edit_temp_files.sql
|
||||||
-- AUTHOR: Clemens Schwaighofer
|
-- AUTHOR: Clemens Schwaighofer
|
||||||
-- DATE: 2005/07/08
|
-- DATE: 2005/07/08
|
||||||
@@ -526,34 +560,85 @@ CREATE TABLE edit_user (
|
|||||||
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,
|
-- username/password
|
||||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
username VARCHAR UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
|
-- 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 VARCHAR,
|
||||||
|
-- eanbled/deleted flag
|
||||||
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- general flags
|
||||||
|
strict SMALLINT DEFAULT 0,
|
||||||
|
locked SMALLINT DEFAULT 0,
|
||||||
|
protected SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- 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,
|
||||||
email VARCHAR,
|
-- is admin user
|
||||||
protected SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
admin SMALLINT NOT NULL DEFAULT 0,
|
admin SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- last login log
|
||||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- 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,
|
||||||
strict SMALLINT DEFAULT 0,
|
-- time locked
|
||||||
locked SMALLINT DEFAULT 0,
|
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- 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
|
||||||
|
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_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_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_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
||||||
|
-- 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 edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||||
|
|
||||||
|
COMMENT ON COLUMN edit_user.username IS 'Login username, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.password IS 'Login password, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.enabled IS 'Login is enabled (master switch)';
|
||||||
|
COMMENT ON COLUMN edit_user.deleted IS 'Login is deleted (master switch), overrides all other';
|
||||||
|
COMMENT ON COLUMN edit_user.strict IS 'If too many failed logins user will be locked, default off';
|
||||||
|
COMMENT ON COLUMN edit_user.locked IS 'Locked from too many wrong password logins';
|
||||||
|
COMMENT ON COLUMN edit_user.protected IS 'User can only be chnaged by admin user';
|
||||||
|
COMMENT ON COLUMN edit_user.debug IS 'Turn debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.db_debug IS 'Turn DB debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.admin IS 'If set, this user is SUPER admin';
|
||||||
|
COMMENT ON COLUMN edit_user.last_login IS 'Last succesfull login tiemstamp';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_count IS 'Number of failed logins, reset on successful login';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_last IS 'Last login error date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_first IS 'First login error date, reset on successfull login';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_until IS 'Account is locked until this date, <';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_after IS 'Account is locked after this date, >';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_date IS 'Password was changed on';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_interval IS 'After how many days the password has to be changed';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid';
|
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid, one time, invalid after reset successful or time out';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id IS 'Min 32 character UID to be used to login without password. Via GET/POST parameter';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_set_date IS 'loginUserId was set at what date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_last_revalidate IS 'set when username/password login is done and loginUserId is set';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_from IS 'loginUserId is valid from this date, >=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_until IS 'loginUserId is valid until this date, <=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_revalidate_after IS 'If set to a number greater 0 then user must login after given amount of days to revalidate the loginUserId, set to 0 for valid forver';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_locked IS 'A separte lock flag for loginUserId, user can still login normal';
|
||||||
|
COMMENT ON COLUMN edit_user.additional_acl IS 'Additional Access Control List stored in JSON format';
|
||||||
-- END: table/edit_user.sql
|
-- END: table/edit_user.sql
|
||||||
-- START: table/edit_log.sql
|
-- START: table/edit_log.sql
|
||||||
-- AUTHOR: Clemens Schwaighofer
|
-- AUTHOR: Clemens Schwaighofer
|
||||||
@@ -774,6 +859,11 @@ FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
|||||||
CREATE TRIGGER trg_edit_user
|
CREATE TRIGGER trg_edit_user
|
||||||
BEFORE INSERT OR UPDATE ON edit_user
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
|
-- DROP TRIGGER IF EXISTS trg_edit_user_set_login_user_id_set_date ON edit_user;
|
||||||
|
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||||
-- END: trigger/trg_edit_user.sql
|
-- END: trigger/trg_edit_user.sql
|
||||||
-- START: trigger/trg_edit_visible_group.sql
|
-- START: trigger/trg_edit_visible_group.sql
|
||||||
-- DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
-- 2022/6/17 update edit_user with login uid
|
||||||
|
|
||||||
|
-- !!! COPY TABLE ARRAY FOLDER !!!
|
||||||
|
|
||||||
|
-- the login uid, at least 32 chars
|
||||||
|
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;
|
||||||
|
-- ALTER TABLE edit_user ADD CONSTRAINT edit_user_login_user_id_key UNIQUE (login_user_id);
|
||||||
|
-- when above uid was set
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- if set, from/until when the above uid is valid
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- user must login to revalidated login id after set days, 0 for forever
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_revalidate_after INTERVAL;
|
||||||
|
-- lock for login user id, but still allow normal login
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_locked SMALLINT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
-- disable login before date
|
||||||
|
ALTER TABLE edit_user ADD lock_until TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- disable login after date
|
||||||
|
ALTER TABLE edit_user ADD lock_after TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
-- if new is not null/empty
|
||||||
|
-- and old one is null or old one different new one
|
||||||
|
-- set NOW()
|
||||||
|
-- if new one is NULL
|
||||||
|
-- set NULL
|
||||||
|
IF
|
||||||
|
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)
|
||||||
|
THEN
|
||||||
|
NEW.login_user_id_set_date = NOW();
|
||||||
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
|
NEW.login_user_id_set_date = NULL;
|
||||||
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|
||||||
|
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||||
|
|
||||||
|
-- __END__
|
||||||
23
4dev/update/20220906_edit_acl_update/20220906_readme.md
Normal file
23
4dev/update/20220906_edit_acl_update/20220906_readme.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
```
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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.#'
|
||||||
|
|||||||
144
www/admin/class_test.create_email.php
Normal file
144
www/admin/class_test.create_email.php
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
// will be overwritten in config.master.php depending on location
|
||||||
|
$DEBUG_ALL_OVERRIDE = true; // set to 1 to debug on live/remote server locations
|
||||||
|
$DEBUG_ALL = true;
|
||||||
|
$PRINT_ALL = true;
|
||||||
|
$ECHO_ALL = true;
|
||||||
|
$DB_DEBUG = true;
|
||||||
|
|
||||||
|
if ($DEBUG_ALL) {
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', false);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-create_email';
|
||||||
|
ob_end_flush();
|
||||||
|
// override echo all from config.master.php
|
||||||
|
$ECHO_ALL = true;
|
||||||
|
|
||||||
|
use CoreLibs\Create\Email;
|
||||||
|
use CoreLibs\Convert\Html;
|
||||||
|
|
||||||
|
$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,
|
||||||
|
'echo_all' => $ECHO_ALL,
|
||||||
|
'print_all' => $PRINT_ALL,
|
||||||
|
]);
|
||||||
|
|
||||||
|
// define a list of from to color sets for conversion test
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: CREATE EMAIL';
|
||||||
|
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>';
|
||||||
|
|
||||||
|
$from_name = '日本語';
|
||||||
|
$from_email = 'test@test.com';
|
||||||
|
print "SET: $from_name / $from_email: "
|
||||||
|
. Html::htmlent(Email::encodeEmailName($from_email, $from_name)) . "<br>";
|
||||||
|
|
||||||
|
$status = Email::sendEmail(
|
||||||
|
'TEST',
|
||||||
|
'BODY',
|
||||||
|
'test@test.com',
|
||||||
|
'Test Name',
|
||||||
|
[
|
||||||
|
[
|
||||||
|
'name' => 'To 1',
|
||||||
|
'email' => 'to1@test.com'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
'UTF-8',
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
$log
|
||||||
|
);
|
||||||
|
print "SENDING A: " . $status . "<br>";
|
||||||
|
$status = Email::sendEmail(
|
||||||
|
'TEST {REPLACE}',
|
||||||
|
'BODY {OTHER}',
|
||||||
|
'test@test.com',
|
||||||
|
'Test Name',
|
||||||
|
[
|
||||||
|
[
|
||||||
|
'name' => 'To 1-A',
|
||||||
|
'email' => 'to1-a@test.com'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => 'To 2-A',
|
||||||
|
'email' => 'to2-a@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'OTHER' => '--FOR 2 A other--'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'REPLACE' => '**replaced**',
|
||||||
|
'OTHER' => '**other**'
|
||||||
|
],
|
||||||
|
'UTF-8',
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
$log
|
||||||
|
);
|
||||||
|
print "SENDING B: " . $status . "<br>";
|
||||||
|
|
||||||
|
$status = Email::sendEmail(
|
||||||
|
'TEST',
|
||||||
|
'BODY',
|
||||||
|
'test@test.com',
|
||||||
|
'Test Name',
|
||||||
|
['a@a.com', 'b@b.com'],
|
||||||
|
[],
|
||||||
|
'UTF-8',
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
$log
|
||||||
|
);
|
||||||
|
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
|
||||||
|
print $log->printErrorMsg();
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ print "S::PRINTBOOL(name): " . DebugSupport::printBool(true, 'Name') . "<br>";
|
|||||||
print "S::PRINTBOOL(name, ok): " . DebugSupport::printBool(true, 'Name', 'ok') . "<br>";
|
print "S::PRINTBOOL(name, ok): " . DebugSupport::printBool(true, 'Name', 'ok') . "<br>";
|
||||||
print "S::PRINTBOOL(name, ok, not): " . DebugSupport::printBool(false, 'Name', 'ok', 'not') . "<br>";
|
print "S::PRINTBOOL(name, ok, not): " . DebugSupport::printBool(false, 'Name', 'ok', 'not') . "<br>";
|
||||||
print "S::DEBUSTRING(s): " . DebugSupport::debugString('SET') . "<br>";
|
print "S::DEBUSTRING(s): " . DebugSupport::debugString('SET') . "<br>";
|
||||||
|
print "S::DEBUSTRING(s>): " . DebugSupport::debugString('<SET>') . "<br>";
|
||||||
print "S::DEBUSTRING(''): " . DebugSupport::debugString('') . "<br>";
|
print "S::DEBUSTRING(''): " . DebugSupport::debugString('') . "<br>";
|
||||||
print "S::DEBUSTRING(,s): " . DebugSupport::debugString(null, '{-}') . "<br>";
|
print "S::DEBUSTRING(,s): " . DebugSupport::debugString(null, '{-}') . "<br>";
|
||||||
|
|
||||||
|
|||||||
@@ -63,12 +63,14 @@ print '<div><a href="class_test.password.php">Class Test: PASSWORD</a></div>';
|
|||||||
print '<div><a href="class_test.math.php">Class Test: MATH</a></div>';
|
print '<div><a href="class_test.math.php">Class Test: MATH</a></div>';
|
||||||
print '<div><a href="class_test.html.php">Class Test: HTML/ELEMENTS</a></div>';
|
print '<div><a href="class_test.html.php">Class Test: HTML/ELEMENTS</a></div>';
|
||||||
print '<div><a href="class_test.email.php">Class Test: EMAIL</a></div>';
|
print '<div><a href="class_test.email.php">Class Test: EMAIL</a></div>';
|
||||||
|
print '<div><a href="class_test.create_email.php">Class Test: CREATE EMAIL</a></div>';
|
||||||
print '<div><a href="class_test.uids.php">Class Test: UIDS</a></div>';
|
print '<div><a href="class_test.uids.php">Class Test: UIDS</a></div>';
|
||||||
print '<div><a href="class_test.phpv.php">Class Test: PHP VERSION</a></div>';
|
print '<div><a href="class_test.phpv.php">Class Test: PHP VERSION</a></div>';
|
||||||
print '<div><a href="class_test.hash.php">Class Test: HASH</a></div>';
|
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>';
|
||||||
|
|||||||
86
www/admin/class_test.strings.php
Normal file
86
www/admin/class_test.strings.php
Normal 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__
|
||||||
61
www/admin/edit_groups_test.php
Normal file
61
www/admin/edit_groups_test.php
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
<?php // phpcs:ignore PSR1.Files.SideEffects
|
||||||
|
|
||||||
|
// this is an empty test page for login tests only
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$DEBUG_ALL_OVERRIDE = false; // set to 1 to debug on live/remote server locations
|
||||||
|
$DEBUG_ALL = true;
|
||||||
|
$PRINT_ALL = true;
|
||||||
|
$DB_DEBUG = true;
|
||||||
|
|
||||||
|
if ($DEBUG_ALL) {
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', true);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest';
|
||||||
|
$SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||||
|
|
||||||
|
// init login & backend class
|
||||||
|
$session = new CoreLibs\Create\Session($SET_SESSION_NAME);
|
||||||
|
$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,
|
||||||
|
]);
|
||||||
|
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||||
|
$login = new CoreLibs\ACL\Login($db, $log, $session);
|
||||||
|
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
|
$l10n = new \CoreLibs\Language\L10n(
|
||||||
|
$locale['locale'],
|
||||||
|
$locale['domain'],
|
||||||
|
$locale['path'],
|
||||||
|
);
|
||||||
|
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>GROUP TESTER</title><head>";
|
||||||
|
print "<body>";
|
||||||
|
|
||||||
|
print '<form method="post" name="loginlogout">';
|
||||||
|
print '<a href="javascript:document.loginlogout.login_logout.value=\'Logou\';'
|
||||||
|
. 'document.loginlogout.submit();">Logout</a>';
|
||||||
|
print '<input type="hidden" name="login_logout" value="">';
|
||||||
|
print '</form>';
|
||||||
|
|
||||||
|
print "<h1>TEST Login</h1>";
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
426
www/composer.lock
generated
426
www/composer.lock
generated
@@ -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.24",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba"
|
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5"
|
||||||
},
|
},
|
||||||
"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/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
|
||||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
|
||||||
"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",
|
||||||
@@ -889,13 +661,9 @@
|
|||||||
"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.1",
|
||||||
"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.24"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -949,7 +717,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-04-01T12:37:26+00:00"
|
"time": "2022-08-30T07:42:16+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/cli-parser",
|
"name": "sebastian/cli-parser",
|
||||||
@@ -1808,16 +1576,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/type",
|
"name": "sebastian/type",
|
||||||
"version": "3.0.0",
|
"version": "3.1.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/type.git",
|
"url": "https://github.com/sebastianbergmann/type.git",
|
||||||
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad"
|
"reference": "fb44e1cc6e557418387ad815780360057e40753e"
|
||||||
},
|
},
|
||||||
"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/fb44e1cc6e557418387ad815780360057e40753e",
|
||||||
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
|
"reference": "fb44e1cc6e557418387ad815780360057e40753e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1829,7 +1597,7 @@
|
|||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "3.0-dev"
|
"dev-master": "3.1-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -1852,7 +1620,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.1.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1860,7 +1628,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2022-03-15T09:54:48+00:00"
|
"time": "2022-08-29T06:55:37+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/version",
|
"name": "sebastian/version",
|
||||||
@@ -1915,88 +1683,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 +1732,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": [],
|
||||||
|
|||||||
@@ -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' => '',
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ if ($is_secure) {
|
|||||||
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
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* AUTHOR: Clemens Schwaighofer
|
* AUTHOR: Clemens Schwaighofer
|
||||||
* CREATED: 2008/08/14
|
* CREATED:
|
||||||
* SHORT DESCRIPTION:
|
* SHORT DESCRIPTION:
|
||||||
* URL redirect header
|
*
|
||||||
* HISTORY:
|
* HISTORY:
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* AUTHOR: Clemens Schwaighofer
|
* AUTHOR: Clemens Schwaighofer
|
||||||
* CREATED: 2008/08/01
|
* CREATED:
|
||||||
* SHORT DESCRIPTION:
|
* SHORT DESCRIPTION:
|
||||||
|
*
|
||||||
* HISTORY:
|
* HISTORY:
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
@@ -108,7 +109,7 @@ $data = [
|
|||||||
];
|
];
|
||||||
// log action
|
// log action
|
||||||
// no log if login
|
// no log if login
|
||||||
if (!$login->login) {
|
if (!$login->loginActionRun()) {
|
||||||
$cms->adbEditLog('Submit', $data, 'BINARY');
|
$cms->adbEditLog('Submit', $data, 'BINARY');
|
||||||
}
|
}
|
||||||
//------------------------------ logging end
|
//------------------------------ logging end
|
||||||
|
|||||||
@@ -397,10 +397,18 @@ if ($form->my_page_name == 'edit_order') {
|
|||||||
$elements[] = $form->formCreateElement('login_error_date_last');
|
$elements[] = $form->formCreateElement('login_error_date_last');
|
||||||
$elements[] = $form->formCreateElement('login_error_date_first');
|
$elements[] = $form->formCreateElement('login_error_date_first');
|
||||||
$elements[] = $form->formCreateElement('enabled');
|
$elements[] = $form->formCreateElement('enabled');
|
||||||
|
$elements[] = $form->formCreateElement('deleted');
|
||||||
$elements[] = $form->formCreateElement('protected');
|
$elements[] = $form->formCreateElement('protected');
|
||||||
$elements[] = $form->formCreateElement('username');
|
$elements[] = $form->formCreateElement('username');
|
||||||
$elements[] = $form->formCreateElement('password');
|
$elements[] = $form->formCreateElement('password');
|
||||||
$elements[] = $form->formCreateElement('password_change_interval');
|
$elements[] = $form->formCreateElement('password_change_interval');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_set_date');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_last_revalidate');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_locked');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_revalidate_after');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_valid_from');
|
||||||
|
$elements[] = $form->formCreateElement('login_user_id_valid_until');
|
||||||
$elements[] = $form->formCreateElement('email');
|
$elements[] = $form->formCreateElement('email');
|
||||||
$elements[] = $form->formCreateElement('last_name');
|
$elements[] = $form->formCreateElement('last_name');
|
||||||
$elements[] = $form->formCreateElement('first_name');
|
$elements[] = $form->formCreateElement('first_name');
|
||||||
@@ -408,6 +416,8 @@ if ($form->my_page_name == 'edit_order') {
|
|||||||
$elements[] = $form->formCreateElement('edit_access_right_id');
|
$elements[] = $form->formCreateElement('edit_access_right_id');
|
||||||
$elements[] = $form->formCreateElement('strict');
|
$elements[] = $form->formCreateElement('strict');
|
||||||
$elements[] = $form->formCreateElement('locked');
|
$elements[] = $form->formCreateElement('locked');
|
||||||
|
$elements[] = $form->formCreateElement('lock_until');
|
||||||
|
$elements[] = $form->formCreateElement('lock_after');
|
||||||
$elements[] = $form->formCreateElement('admin');
|
$elements[] = $form->formCreateElement('admin');
|
||||||
$elements[] = $form->formCreateElement('debug');
|
$elements[] = $form->formCreateElement('debug');
|
||||||
$elements[] = $form->formCreateElement('db_debug');
|
$elements[] = $form->formCreateElement('db_debug');
|
||||||
@@ -542,6 +552,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();
|
||||||
|
|||||||
@@ -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,20 @@ $edit_users = [
|
|||||||
'1' => 'Yes',
|
'1' => 'Yes',
|
||||||
'0' => 'No'
|
'0' => 'No'
|
||||||
],
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '-1',
|
||||||
|
],
|
||||||
|
'deleted' => [
|
||||||
|
'value' => $GLOBALS['deleted'] ?? '',
|
||||||
|
'output_name' => 'Deleted',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
],
|
],
|
||||||
'strict' => [
|
'strict' => [
|
||||||
'value' => $GLOBALS['strict'] ?? '',
|
'value' => $GLOBALS['strict'] ?? '',
|
||||||
@@ -62,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'] ?? '',
|
||||||
@@ -72,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'] ?? '',
|
||||||
@@ -82,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'] ?? '',
|
||||||
@@ -92,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'] ?? '',
|
||||||
@@ -102,22 +132,115 @@ $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' => [
|
||||||
|
'value' => $GLOBALS['lock_until'] ?? '',
|
||||||
|
'output_name' => 'Lock account until',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'lock_after' => [
|
||||||
|
'value' => $GLOBALS['lock_after'] ?? '',
|
||||||
|
'output_name' => 'Lock account after',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'datetime' => 1,'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id' => [
|
||||||
|
'value' => $GLOBALS['login_user_id'] ?? '',
|
||||||
|
'output_name' => '_GET/_POST loginUserId direct login ID',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'unique|custom',
|
||||||
|
'error_regex' => "/^[A-Za-z0-9]+$/",
|
||||||
|
'emptynull' => 1,'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_set_date' => [
|
||||||
|
'output_name' => 'loginUserId set date',
|
||||||
|
'value' => $GLOBALS['login_user_id_set_date'] ?? '',
|
||||||
|
'type' => 'view',
|
||||||
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_last_revalidate' => [
|
||||||
|
'output_name' => 'loginUserId last revalidate date',
|
||||||
|
'value' => $GLOBALS['login_user_id_last_revalidate'] ?? '',
|
||||||
|
'type' => 'view',
|
||||||
|
'empty' => '-',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_locked' => [
|
||||||
|
'value' => $GLOBALS['login_user_id_locked'] ?? '',
|
||||||
|
'output_name' => 'loginUserId usage locked',
|
||||||
|
'type' => 'binary',
|
||||||
|
'int' => 1,
|
||||||
|
'element_list' => [
|
||||||
|
'1' => 'Yes',
|
||||||
|
'0' => 'No'
|
||||||
|
],
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_revalidate_after' => [
|
||||||
|
'value' => $GLOBALS['login_user_id_revalidate_after'] ?? '',
|
||||||
|
'output_name' => 'loginUserId, User must login after n days',
|
||||||
|
'type' => 'text',
|
||||||
|
'error_check' => 'intervalshort',
|
||||||
|
'interval' => 1, // interval needs NULL write for empty
|
||||||
|
'size' => 5, // make it 5 chars long
|
||||||
|
'length' => 5,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_valid_from' => [
|
||||||
|
'value' => $GLOBALS['login_user_id_valid_from'] ?? '',
|
||||||
|
'output_name' => 'loginUserId valid from',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'datetime' => 1,
|
||||||
|
'min_edit_acl' => '100',
|
||||||
|
'min_show_acl' => '100',
|
||||||
|
],
|
||||||
|
'login_user_id_valid_until' => [
|
||||||
|
'value' => $GLOBALS['login_user_id_valid_until'] ?? '',
|
||||||
|
'output_name' => 'loginUserId valid until',
|
||||||
|
'type' => 'datetime',
|
||||||
|
'error_check' => 'datetime',
|
||||||
|
'sql_read' => 'YYYY-MM-DD HH24:MI',
|
||||||
|
'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'] ?? '',
|
||||||
@@ -125,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'] ?? '',
|
||||||
@@ -140,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'] ?? '',
|
||||||
@@ -148,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'] ?? '',
|
||||||
@@ -177,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'] ?? '',
|
||||||
@@ -184,11 +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, debug, db_debug, strict, locked, login_error_count "
|
'load_query' => "SELECT edit_user_id, username, enabled, deleted, "
|
||||||
. "FROM edit_user ORDER BY username",
|
. "strict, locked, login_error_count "
|
||||||
|
. "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' => [
|
||||||
[
|
[
|
||||||
@@ -197,38 +349,38 @@ $edit_users = [
|
|||||||
[
|
[
|
||||||
'name' => 'enabled',
|
'name' => 'enabled',
|
||||||
'binary' => ['Yes', 'No'],
|
'binary' => ['Yes', 'No'],
|
||||||
'before_value' => 'Enabled: '
|
'before_value' => 'ENBL: '
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'debug',
|
'name' => 'deleted',
|
||||||
'binary' => ['Yes', 'No'],
|
'binary' => ['Yes', 'No'],
|
||||||
'before_value' => 'Debug: '
|
'before_value' => 'DEL: '
|
||||||
],
|
|
||||||
[
|
|
||||||
'name' => 'db_debug',
|
|
||||||
'binary' => ['Yes', 'No'],
|
|
||||||
'before_value' => 'DB Debug: '
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'strict',
|
'name' => 'strict',
|
||||||
'binary' => ['Yes', 'No'],
|
'binary' => ['Yes', 'No'],
|
||||||
'before_value' => 'Strict: '
|
'before_value' => 'STRC: '
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'locked',
|
'name' => 'locked',
|
||||||
'binary' => ['Yes', 'No'],
|
'binary' => ['Yes', 'No'],
|
||||||
'before_value' => 'Locked: '
|
'before_value' => 'LCK: '
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'login_error_count',
|
'name' => 'login_error_count',
|
||||||
'before_value' => 'Errors: '
|
'before_value' => 'ERR: '
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
'element_list' => [
|
'element_list' => [
|
||||||
'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',
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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}
|
||||||
@@ -32,7 +33,10 @@
|
|||||||
<input type="hidden" name="HIDDEN_{$element.data.name}" value="{$element.data.HIDDEN_value}">
|
<input type="hidden" name="HIDDEN_{$element.data.name}" value="{$element.data.HIDDEN_value}">
|
||||||
{/if}
|
{/if}
|
||||||
{if $element.type == 'date'}
|
{if $element.type == 'date'}
|
||||||
<input type="text" name="{$element.data.name}" value="{$element.data.value}" size="10" maxlength="10">
|
<input type="text" name="{$element.data.name}" value="{$element.data.value}" size="10" maxlength="10" placeholder="YYYY-MM-DD">
|
||||||
|
{/if}
|
||||||
|
{if $element.type == 'datetime'}
|
||||||
|
<input type="text" name="{$element.data.name}" value="{$element.data.value}" size="16" maxlength="16" placeholder="YYYY-MM-DD HH:mm">
|
||||||
{/if}
|
{/if}
|
||||||
{if $element.type == 'textarea'}
|
{if $element.type == 'textarea'}
|
||||||
<textarea name="{$element.data.name}"{if $element.data.rows} rows="{$element.data.rows}"{/if}{if $element.data.cols} cols="{$element.data.cols}"{/if}>{$element.data.value}</textarea>
|
<textarea name="{$element.data.name}"{if $element.data.rows} rows="{$element.data.rows}"{/if}{if $element.data.cols} cols="{$element.data.cols}"{/if}>{$element.data.value}</textarea>
|
||||||
@@ -126,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}
|
||||||
|
|||||||
@@ -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 //-->
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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"> {t}really{/t}
|
<input type="checkbox" name="really_delete" value="yes"> {t}really{/t}
|
||||||
@@ -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">
|
||||||
|
|
||||||
{/if}
|
{/if}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{/if}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -72,30 +72,36 @@ use CoreLibs\Check\Password;
|
|||||||
|
|
||||||
class Login
|
class Login
|
||||||
{
|
{
|
||||||
/** @var string */
|
/** @var string the user id var*/
|
||||||
private $euid; // the user id var
|
private $euid;
|
||||||
|
/** @var string _GET/_POST loginUserId parameter for non password login */
|
||||||
|
private $login_user_id = '';
|
||||||
|
/** @var string source, either _GET or _POST or empty */
|
||||||
|
private $login_user_id_source = '';
|
||||||
|
/** @var bool set to true if illegal characters where found in the login user id string */
|
||||||
|
private $login_user_id_unclear = false;
|
||||||
// is set to one if login okay, or EUID is set and user is okay to access this page
|
// is set to one if login okay, or EUID is set and user is okay to access this page
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
private $permission_okay = false;
|
private $permission_okay = false;
|
||||||
/** @var string */
|
/** @var string pressed login */
|
||||||
public $login; // pressed login
|
private $login = '';
|
||||||
/** @var string */
|
/** @var string master action command */
|
||||||
private $action; // master action command
|
private $action;
|
||||||
/** @var string */
|
/** @var string login name */
|
||||||
private $username; // login name
|
private $username;
|
||||||
/** @var string */
|
/** @var string login password */
|
||||||
private $password; // login password
|
private $password;
|
||||||
/** @var string */
|
/** @var string logout button */
|
||||||
private $logout; // logout button
|
private $logout;
|
||||||
/** @var bool */
|
/** @var bool if this is set to true, the user can change passwords */
|
||||||
private $password_change = false; // if this is set to true, the user can change passwords
|
private $password_change = false;
|
||||||
/** @var bool */
|
/** @var bool password change was successful */
|
||||||
private $password_change_ok = false; // password change was successful
|
private $password_change_ok = false;
|
||||||
// can we reset password and mail to user with new password set screen
|
// can we reset password and mail to user with new password set screen
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
private $password_forgot = false;
|
private $password_forgot = false;
|
||||||
/** @var bool */
|
/** @var bool password forgot mail send ok */
|
||||||
// private $password_forgot_ok = false; // password forgot mail send ok
|
// private $password_forgot_ok = false;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private $change_password;
|
private $change_password;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
@@ -106,8 +112,8 @@ class Login
|
|||||||
private $pw_new_password;
|
private $pw_new_password;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private $pw_new_password_confirm;
|
private $pw_new_password_confirm;
|
||||||
/** @var array<string> */
|
/** @var array<string> array of users for which the password change is forbidden */
|
||||||
private $pw_change_deny_users = []; // array of users for which the password change is forbidden
|
private $pw_change_deny_users = [];
|
||||||
/** @var string */
|
/** @var string */
|
||||||
private $logout_target = '';
|
private $logout_target = '';
|
||||||
/** @var int */
|
/** @var int */
|
||||||
@@ -117,8 +123,7 @@ class Login
|
|||||||
/** @var string */
|
/** @var string */
|
||||||
private $page_name = '';
|
private $page_name = '';
|
||||||
|
|
||||||
// if we have password change we need to define some rules
|
/** @var int if we have password change we need to define some rules */
|
||||||
/** @var int */
|
|
||||||
private $password_min_length = 9;
|
private $password_min_length = 9;
|
||||||
/** @var int an true maxium min, can never be set below this */
|
/** @var int an true maxium min, can never be set below this */
|
||||||
private $password_min_length_max = 9;
|
private $password_min_length_max = 9;
|
||||||
@@ -126,8 +131,7 @@ class Login
|
|||||||
// it will be set back to 255
|
// it will be set back to 255
|
||||||
/** @var int */
|
/** @var int */
|
||||||
private $password_max_length = 255;
|
private $password_max_length = 255;
|
||||||
// can have several regexes, if nothing set, all is ok
|
/** @var array<string> can have several regexes, if nothing set, all is ok */
|
||||||
/** @var array<string> */
|
|
||||||
private $password_valid_chars = [
|
private $password_valid_chars = [
|
||||||
// '^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$',
|
// '^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z!@#$%]{8,}$',
|
||||||
// '^(?.*(\pL)u)(?=.*(\pN)u)(?=.*([^\pL\pN])u).{8,}',
|
// '^(?.*(\pL)u)(?=.*(\pN)u)(?=.*([^\pL\pN])u).{8,}',
|
||||||
@@ -234,6 +238,14 @@ class Login
|
|||||||
'msg' => 'Login Failed - Wrong Username or Password',
|
'msg' => 'Login Failed - Wrong Username or Password',
|
||||||
'flag' => 'e'
|
'flag' => 'e'
|
||||||
],
|
],
|
||||||
|
'1101' => [
|
||||||
|
'msg' => 'Login Failed - Login User ID must be validated',
|
||||||
|
'flag' => 'e'
|
||||||
|
],
|
||||||
|
'1102' => [
|
||||||
|
'msg' => 'Login Failed - Login User ID is outside valid date range',
|
||||||
|
'flag' => 'e'
|
||||||
|
],
|
||||||
'102' => [
|
'102' => [
|
||||||
'msg' => 'Login Failed - Please enter username and password',
|
'msg' => 'Login Failed - Please enter username and password',
|
||||||
'flag' => 'e'
|
'flag' => 'e'
|
||||||
@@ -250,6 +262,18 @@ class Login
|
|||||||
'msg' => 'Login Failed - User is locked',
|
'msg' => 'Login Failed - User is locked',
|
||||||
'flag' => 'e'
|
'flag' => 'e'
|
||||||
],
|
],
|
||||||
|
'106' => [
|
||||||
|
'msg' => 'Login Failed - User is deleted',
|
||||||
|
'flag' => 'e'
|
||||||
|
],
|
||||||
|
'107' => [
|
||||||
|
'msg' => 'Login Failed - User in locked via date period',
|
||||||
|
'flag' => 'e'
|
||||||
|
],
|
||||||
|
'108' => [
|
||||||
|
'msg' => 'Login Failed - User is locked via Login User ID',
|
||||||
|
'flag' => 'e'
|
||||||
|
],
|
||||||
'109' => [
|
'109' => [
|
||||||
'msg' => 'Check permission query reading failed',
|
'msg' => 'Check permission query reading failed',
|
||||||
'flag' => 'e'
|
'flag' => 'e'
|
||||||
@@ -360,6 +384,47 @@ class Login
|
|||||||
// **** PRIVATE INTERNAL
|
// **** PRIVATE INTERNAL
|
||||||
// *************************************************************************
|
// *************************************************************************
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks for all flags and sets error codes for each
|
||||||
|
* In order:
|
||||||
|
* delete > enable > lock > period lock > login user id lock
|
||||||
|
*
|
||||||
|
* @param int $deleted User deleted check
|
||||||
|
* @param int $enabled User not enabled check
|
||||||
|
* @param int $locked Locked because of too many invalid passwords
|
||||||
|
* @param int $locked_period Locked because of time period set
|
||||||
|
* @param int $login_user_id_locked Locked from using Login User Id
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function loginValidationCheck(
|
||||||
|
int $deleted,
|
||||||
|
int $enabled,
|
||||||
|
int $locked,
|
||||||
|
int $locked_period,
|
||||||
|
int $login_user_id_locked
|
||||||
|
): bool {
|
||||||
|
$validation = false;
|
||||||
|
if ($deleted) {
|
||||||
|
// user is deleted
|
||||||
|
$this->login_error = 106;
|
||||||
|
} elseif (!$enabled) {
|
||||||
|
// user is not enabled
|
||||||
|
$this->login_error = 104;
|
||||||
|
} elseif ($locked) {
|
||||||
|
// user is locked, either set or auto set
|
||||||
|
$this->login_error = 105;
|
||||||
|
} elseif ($locked_period) {
|
||||||
|
// locked date trigger
|
||||||
|
$this->login_error = 107;
|
||||||
|
} elseif ($login_user_id_locked) {
|
||||||
|
// user is locked, either set or auto set
|
||||||
|
$this->login_error = 108;
|
||||||
|
} else {
|
||||||
|
$validation = true;
|
||||||
|
}
|
||||||
|
return $validation;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* checks if password is valid, sets internal error login variable
|
* checks if password is valid, sets internal error login variable
|
||||||
*
|
*
|
||||||
@@ -393,7 +458,6 @@ class Login
|
|||||||
) {
|
) {
|
||||||
// this means password cannot be decrypted because of missing crypt methods
|
// this means password cannot be decrypted because of missing crypt methods
|
||||||
$this->login_error = 9999;
|
$this->login_error = 9999;
|
||||||
$password_ok = false;
|
|
||||||
} elseif (
|
} elseif (
|
||||||
preg_match("/^\\$2y\\$/", $hash) &&
|
preg_match("/^\\$2y\\$/", $hash) &&
|
||||||
!Password::passwordVerify($password, $hash)
|
!Password::passwordVerify($password, $hash)
|
||||||
@@ -401,7 +465,6 @@ class Login
|
|||||||
// this is the new password hash method, is only $2y$
|
// this is the new password hash method, is only $2y$
|
||||||
// all others are not valid anymore
|
// all others are not valid anymore
|
||||||
$this->login_error = 1013;
|
$this->login_error = 1013;
|
||||||
$password_ok = false;
|
|
||||||
} elseif (
|
} elseif (
|
||||||
!preg_match("/^\\$2(a|y)\\$/", $hash) &&
|
!preg_match("/^\\$2(a|y)\\$/", $hash) &&
|
||||||
!preg_match("/^\\$1\\$/", $hash) &&
|
!preg_match("/^\\$1\\$/", $hash) &&
|
||||||
@@ -410,7 +473,6 @@ class Login
|
|||||||
) {
|
) {
|
||||||
// check old plain password, case sensitive
|
// check old plain password, case sensitive
|
||||||
$this->login_error = 1012;
|
$this->login_error = 1012;
|
||||||
$password_ok = false;
|
|
||||||
} else {
|
} else {
|
||||||
// all ok
|
// all ok
|
||||||
$password_ok = true;
|
$password_ok = true;
|
||||||
@@ -418,6 +480,28 @@ class Login
|
|||||||
return $password_ok;
|
return $password_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Login User ID is allowed to login
|
||||||
|
*
|
||||||
|
* @param int $login_user_id_valid_date
|
||||||
|
* @param int $login_user_id_revalidate
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function loginLoginUserIdCheck(
|
||||||
|
int $login_user_id_valid_date,
|
||||||
|
int $login_user_id_revalidate
|
||||||
|
): bool {
|
||||||
|
$login_id_ok = false;
|
||||||
|
if ($login_user_id_revalidate) {
|
||||||
|
$this->login_error = 1101;
|
||||||
|
} elseif (!$login_user_id_valid_date) {
|
||||||
|
$this->login_error = 1102;
|
||||||
|
} else {
|
||||||
|
$login_id_ok = true;
|
||||||
|
}
|
||||||
|
return $login_id_ok;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* if user pressed login button this script is called,
|
* if user pressed login button this script is called,
|
||||||
* but only if there is no preview euid set
|
* but only if there is no preview euid set
|
||||||
@@ -427,11 +511,12 @@ class Login
|
|||||||
private function loginLoginUser(): void
|
private function loginLoginUser(): void
|
||||||
{
|
{
|
||||||
// if pressed login at least and is not yet loggined in
|
// if pressed login at least and is not yet loggined in
|
||||||
if ($this->euid || !$this->login) {
|
if ($this->euid || (!$this->login && !$this->login_user_id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// if not username AND password where given
|
// if not username AND password where given
|
||||||
if (!($this->password && $this->username)) {
|
// OR no login_user_id
|
||||||
|
if (!($this->username && $this->password) && !$this->login_user_id) {
|
||||||
$this->login_error = 102;
|
$this->login_error = 102;
|
||||||
$this->permission_okay = false;
|
$this->permission_okay = false;
|
||||||
return;
|
return;
|
||||||
@@ -441,12 +526,42 @@ class Login
|
|||||||
$q = "SELECT eu.edit_user_id, eu.username, eu.password, "
|
$q = "SELECT eu.edit_user_id, eu.username, eu.password, "
|
||||||
. "eu.edit_group_id, "
|
. "eu.edit_group_id, "
|
||||||
. "eg.name AS edit_group_name, admin, "
|
. "eg.name AS edit_group_name, admin, "
|
||||||
|
// login error + locked
|
||||||
. "eu.login_error_count, eu.login_error_date_last, "
|
. "eu.login_error_count, eu.login_error_date_last, "
|
||||||
. "eu.login_error_date_first, eu.strict, eu.locked, "
|
. "eu.login_error_date_first, eu.strict, eu.locked, "
|
||||||
|
// date based lock
|
||||||
|
. "CASE WHEN ("
|
||||||
|
. "(eu.lock_until IS NULL "
|
||||||
|
. "OR (eu.lock_until IS NOT NULL AND NOW() >= eu.lock_until)) "
|
||||||
|
. "AND (eu.lock_after IS NULL "
|
||||||
|
. "OR (eu.lock_after IS NOT NULL AND NOW() <= eu.lock_after))"
|
||||||
|
. ") THEN 0::INT ELSE 1::INT END locked_period, "
|
||||||
|
// debug (legacy)
|
||||||
. "eu.debug, eu.db_debug, "
|
. "eu.debug, eu.db_debug, "
|
||||||
|
// enabled
|
||||||
|
. "eu.enabled, eu.deleted, "
|
||||||
|
// for checks only
|
||||||
|
. "eu.login_user_id, "
|
||||||
|
// login id validation
|
||||||
|
. "CASE WHEN ("
|
||||||
|
. "(eu.login_user_id_valid_from IS NULL "
|
||||||
|
. "OR (eu.login_user_id_valid_from IS NOT NULL AND NOW() >= eu.login_user_id_valid_from)) "
|
||||||
|
. "AND (eu.login_user_id_valid_until IS NULL "
|
||||||
|
. "OR (eu.login_user_id_valid_until IS NOT NULL AND NOW() <= eu.login_user_id_valid_until))"
|
||||||
|
. ") THEN 1::INT ELSE 0::INT END AS login_user_id_valid_date, "
|
||||||
|
// check if user must login
|
||||||
|
. "CASE WHEN eu.login_user_id_revalidate_after IS NOT NULL "
|
||||||
|
. "AND eu.login_user_id_revalidate_after > '0 days'::INTERVAL "
|
||||||
|
. "AND (eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE "
|
||||||
|
. "<= NOW()::DATE "
|
||||||
|
. "THEN 1::INT ELSE 0::INT END AS login_user_id_revalidate, "
|
||||||
|
. "eu.login_user_id_locked, "
|
||||||
|
// language
|
||||||
|
. "el.short_name AS locale, el.iso_name AS encoding, "
|
||||||
|
// levels
|
||||||
. "eareu.level AS user_level, eareu.type AS user_type, "
|
. "eareu.level AS user_level, eareu.type AS user_type, "
|
||||||
. "eareg.level AS group_level, eareg.type AS group_type, "
|
. "eareg.level AS group_level, eareg.type AS group_type, "
|
||||||
. "eu.enabled, el.short_name AS locale, el.iso_name AS encoding, "
|
// colors
|
||||||
. "first.header_color AS first_header_color, "
|
. "first.header_color AS first_header_color, "
|
||||||
. "second.header_color AS second_header_color, second.template "
|
. "second.header_color AS second_header_color, second.template "
|
||||||
. "FROM edit_user eu "
|
. "FROM edit_user eu "
|
||||||
@@ -458,11 +573,17 @@ class Login
|
|||||||
. "edit_scheme first "
|
. "edit_scheme first "
|
||||||
. "WHERE first.edit_scheme_id = eg.edit_scheme_id "
|
. "WHERE first.edit_scheme_id = eg.edit_scheme_id "
|
||||||
. "AND eu.edit_group_id = eg.edit_group_id "
|
. "AND eu.edit_group_id = eg.edit_group_id "
|
||||||
. "AND eu.edit_language_id = el.edit_language_id AND "
|
. "AND eu.edit_language_id = el.edit_language_id "
|
||||||
. "eu.edit_access_right_id = eareu.edit_access_right_id AND "
|
. "AND eu.edit_access_right_id = eareu.edit_access_right_id "
|
||||||
. "eg.edit_access_right_id = eareg.edit_access_right_id AND "
|
. "AND eg.edit_access_right_id = eareg.edit_access_right_id "
|
||||||
|
. "AND "
|
||||||
|
// either login_user_id OR password must be given
|
||||||
|
. (!empty($this->login_user_id && empty($this->username)) ?
|
||||||
|
// check with login id if set and NO username
|
||||||
|
"eu.login_user_id = " . $this->db->dbEscapeLiteral($this->login_user_id) . " " :
|
||||||
// password match is done in script, against old plain or new blowfish encypted
|
// password match is done in script, against old plain or new blowfish encypted
|
||||||
. "(LOWER(username) = '" . $this->db->dbEscapeString(strtolower($this->username)) . "') ";
|
"LOWER(username) = " . $this->db->dbEscapeLiteral(strtolower($this->username)) . " "
|
||||||
|
);
|
||||||
// reset any query data that might exist
|
// reset any query data that might exist
|
||||||
$this->db->dbCacheReset($q);
|
$this->db->dbCacheReset($q);
|
||||||
// never cache return data
|
// never cache return data
|
||||||
@@ -488,17 +609,34 @@ class Login
|
|||||||
// - password is readable
|
// - password is readable
|
||||||
// - encrypted password matches
|
// - encrypted password matches
|
||||||
// - plain password matches
|
// - plain password matches
|
||||||
|
if (
|
||||||
if (!$res['enabled']) {
|
!$this->loginValidationCheck(
|
||||||
// user is enabled
|
(int)$res['deleted'],
|
||||||
$this->login_error = 104;
|
(int)$res['enabled'],
|
||||||
} elseif ($res['locked']) {
|
(int)$res['locked'],
|
||||||
// user is locked, either set or auto set
|
(int)$res['locked_period'],
|
||||||
$this->login_error = 105;
|
(int)$res['login_user_id_locked']
|
||||||
} elseif (!$this->loginPasswordCheck($res['password'])) {
|
)
|
||||||
|
) {
|
||||||
|
// error set in method (104, 105, 106, 107, 108)
|
||||||
|
} elseif (
|
||||||
|
empty($this->username) &&
|
||||||
|
!empty($this->login_user_id) &&
|
||||||
|
!$this->loginLoginUserIdCheck(
|
||||||
|
(int)$res['login_user_id_valid_date'],
|
||||||
|
(int)$res['login_user_id_revalidate']
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
// check done in loginLoginIdCheck method
|
||||||
|
// aborts on must revalidate and not valid (date range)
|
||||||
|
} elseif (
|
||||||
|
!empty($this->username) &&
|
||||||
|
!$this->loginPasswordCheck($res['password'])
|
||||||
|
) {
|
||||||
// none to be set, set in login password check
|
// none to be set, set in login password check
|
||||||
// this is not valid password input error here
|
// this is not valid password input error here
|
||||||
// all error codes are set in loginPasswordCheck method
|
// all error codes are set in loginPasswordCheck method
|
||||||
|
// also valid if login_user_id is ok
|
||||||
} else {
|
} else {
|
||||||
// check if the current password is an invalid hash and do a rehash and set password
|
// check if the current password is an invalid hash and do a rehash and set password
|
||||||
// $this->debug('LOGIN', 'Hash: '.$res['password'].' -> VERIFY: '
|
// $this->debug('LOGIN', 'Hash: '.$res['password'].' -> VERIFY: '
|
||||||
@@ -517,6 +655,15 @@ class Login
|
|||||||
// check if user is okay
|
// check if user is okay
|
||||||
$this->loginCheckPermissions();
|
$this->loginCheckPermissions();
|
||||||
if ($this->login_error == 0) {
|
if ($this->login_error == 0) {
|
||||||
|
if (
|
||||||
|
!empty($res['login_user_id']) &&
|
||||||
|
!empty($this->username) && !empty($this->password)
|
||||||
|
) {
|
||||||
|
$q = "UPDATE edit_user SET "
|
||||||
|
. "login_user_id_last_revalidate = NOW() "
|
||||||
|
. "WHERE edit_user_id = " . $this->euid;
|
||||||
|
$this->db->dbExec($q);
|
||||||
|
}
|
||||||
// now set all session vars and read page permissions
|
// now set all session vars and read page permissions
|
||||||
$_SESSION['DEBUG_ALL'] = $this->db->dbBoolean($res['debug']);
|
$_SESSION['DEBUG_ALL'] = $this->db->dbBoolean($res['debug']);
|
||||||
$_SESSION['DB_DEBUG'] = $this->db->dbBoolean($res['db_debug']);
|
$_SESSION['DB_DEBUG'] = $this->db->dbBoolean($res['db_debug']);
|
||||||
@@ -984,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'];
|
||||||
@@ -1140,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
|
||||||
@@ -1182,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">
|
||||||
@@ -1338,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>';
|
||||||
@@ -1396,6 +1548,34 @@ EOM;
|
|||||||
$this->login_is_ajax_page = true;
|
$this->login_is_ajax_page = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// attach outside uid for login post > get > empty
|
||||||
|
$this->login_user_id = $_POST['loginUserId'] ?? $_GET['loginUserId'] ?? '';
|
||||||
|
// cleanup only alphanumeric
|
||||||
|
if (!empty($this->login_user_id)) {
|
||||||
|
// set post/get only if actually set
|
||||||
|
if (isset($_POST['loginUserId'])) {
|
||||||
|
$this->login_user_id_source = 'POST';
|
||||||
|
} elseif (isset($_GET['loginUserId'])) {
|
||||||
|
$this->login_user_id_source = 'GET';
|
||||||
|
}
|
||||||
|
// clean login user id
|
||||||
|
$login_user_id_changed = 0;
|
||||||
|
$this->login_user_id = preg_replace(
|
||||||
|
"/[^A-Za-z0-9]/",
|
||||||
|
'',
|
||||||
|
$this->login_user_id,
|
||||||
|
-1,
|
||||||
|
$login_user_id_changed
|
||||||
|
);
|
||||||
|
// flag unclean input data
|
||||||
|
if ($login_user_id_changed > 0) {
|
||||||
|
$this->login_user_id_unclear = true;
|
||||||
|
// error for invalid user id?
|
||||||
|
$this->log->debug('LOGIN USER ID', 'Invalid characters: '
|
||||||
|
. $login_user_id_changed . ' in loginUserId: '
|
||||||
|
. $this->login_user_id . ' (' . $this->login_user_id_source . ')');
|
||||||
|
}
|
||||||
|
}
|
||||||
// if there is none, there is none, saves me POST/GET check
|
// if there is none, there is none, saves me POST/GET check
|
||||||
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0;
|
$this->euid = array_key_exists('EUID', $_SESSION) ? $_SESSION['EUID'] : 0;
|
||||||
// get login vars, are so, can't be changed
|
// get login vars, are so, can't be changed
|
||||||
@@ -1440,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 {
|
||||||
@@ -1706,8 +1886,31 @@ EOM;
|
|||||||
if ($this->login_error == 103) {
|
if ($this->login_error == 103) {
|
||||||
return $this->permission_okay;
|
return $this->permission_okay;
|
||||||
}
|
}
|
||||||
// if ($this->euid && $this->login_error != 103) {
|
$q = "SELECT ep.filename, "
|
||||||
$q = "SELECT ep.filename "
|
// base lock flags
|
||||||
|
. "eu.deleted, eu.enabled, eu.locked, "
|
||||||
|
// date based lock
|
||||||
|
. "CASE WHEN ("
|
||||||
|
. "(eu.lock_until IS NULL "
|
||||||
|
. "OR (eu.lock_until IS NOT NULL AND NOW() >= eu.lock_until)) "
|
||||||
|
. "AND (eu.lock_after IS NULL "
|
||||||
|
. "OR (eu.lock_after IS NOT NULL AND NOW() <= eu.lock_after))"
|
||||||
|
. ") THEN 0::INT ELSE 1::INT END locked_period, "
|
||||||
|
// login id validation
|
||||||
|
. "login_user_id, "
|
||||||
|
. "CASE WHEN ("
|
||||||
|
. "(eu.login_user_id_valid_from IS NULL "
|
||||||
|
. "OR (eu.login_user_id_valid_from IS NOT NULL AND NOW() >= eu.login_user_id_valid_from)) "
|
||||||
|
. "AND (eu.login_user_id_valid_until IS NULL "
|
||||||
|
. "OR (eu.login_user_id_valid_until IS NOT NULL AND NOW() <= eu.login_user_id_valid_until))"
|
||||||
|
. ") THEN 1::INT ELSE 0::INT END AS login_user_id_valid_date, "
|
||||||
|
// check if user must login
|
||||||
|
. "CASE WHEN eu.login_user_id_revalidate_after IS NOT NULL "
|
||||||
|
. "AND eu.login_user_id_revalidate_after > '0 days'::INTERVAL "
|
||||||
|
. "AND eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after <= NOW()::DATE "
|
||||||
|
. "THEN 1::INT ELSE 0::INT END AS login_user_id_revalidate, "
|
||||||
|
. "eu.login_user_id_locked "
|
||||||
|
//
|
||||||
. "FROM edit_page ep, edit_page_access epa, edit_group eg, edit_user eu "
|
. "FROM edit_page ep, edit_page_access epa, edit_group eg, edit_user eu "
|
||||||
. "WHERE ep.edit_page_id = epa.edit_page_id "
|
. "WHERE ep.edit_page_id = epa.edit_page_id "
|
||||||
. "AND eg.edit_group_id = epa.edit_group_id "
|
. "AND eg.edit_group_id = epa.edit_group_id "
|
||||||
@@ -1720,6 +1923,30 @@ EOM;
|
|||||||
$this->login_error = 109;
|
$this->login_error = 109;
|
||||||
return $this->permission_okay;
|
return $this->permission_okay;
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
!$this->loginValidationCheck(
|
||||||
|
(int)$res['deleted'],
|
||||||
|
(int)$res['enabled'],
|
||||||
|
(int)$res['locked'],
|
||||||
|
(int)$res['locked_period'],
|
||||||
|
(int)$res['login_user_id_locked']
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
// errors set in method
|
||||||
|
return $this->permission_okay;
|
||||||
|
}
|
||||||
|
// if login user id parameter and no username, check period here
|
||||||
|
if (
|
||||||
|
empty($this->username) &&
|
||||||
|
!empty($this->login_user_id) &&
|
||||||
|
!$this->loginLoginUserIdCheck(
|
||||||
|
(int)$res['login_user_id_valid_date'],
|
||||||
|
(int)$res['login_user_id_revalidate']
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
// errors set in method
|
||||||
|
return $this->permission_okay;
|
||||||
|
}
|
||||||
if (isset($res['filename']) && $res['filename'] == $this->page_name) {
|
if (isset($res['filename']) && $res['filename'] == $this->page_name) {
|
||||||
$this->permission_okay = true;
|
$this->permission_okay = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -1917,6 +2144,47 @@ EOM;
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if login button was pressed
|
||||||
|
*
|
||||||
|
* @return bool If login action was run, return true
|
||||||
|
*/
|
||||||
|
public function loginActionRun(): bool
|
||||||
|
{
|
||||||
|
return empty($this->login) ? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns current set loginUserId or empty if unset
|
||||||
|
*
|
||||||
|
* @return string loginUserId or empty string for not set
|
||||||
|
*/
|
||||||
|
public function loginGetLoginUserId(): string
|
||||||
|
{
|
||||||
|
return $this->login_user_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns GET/POST for where the loginUserId was set
|
||||||
|
*
|
||||||
|
* @return string GET or POST or empty string for not set
|
||||||
|
*/
|
||||||
|
public function loginGetLoginUserIdSource(): string
|
||||||
|
{
|
||||||
|
return $this->login_user_id_source;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns unclear login user id state. If true then illegal characters
|
||||||
|
* where present in the loginUserId parameter
|
||||||
|
*
|
||||||
|
* @return bool False for clear, True if illegal characters found
|
||||||
|
*/
|
||||||
|
public function loginGetLoginUserIdUnclean(): bool
|
||||||
|
{
|
||||||
|
return $this->login_user_id_unclear;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* old name for loginGetEditAccessData
|
* old name for loginGetEditAccessData
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* html convert functions
|
* array search and transform functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|||||||
@@ -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
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
123
www/lib/CoreLibs/Convert/Strings.php
Normal file
123
www/lib/CoreLibs/Convert/Strings.php
Normal 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__
|
||||||
291
www/lib/CoreLibs/Create/Email.php
Normal file
291
www/lib/CoreLibs/Create/Email.php
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create email class
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace CoreLibs\Create;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sending simple text emails
|
||||||
|
*/
|
||||||
|
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.
|
||||||
|
* If encoding is not UTF-8 it will convert the email name to target encoding
|
||||||
|
* FROM UTF-8
|
||||||
|
* Source data is ALWAYS seen as utf-8
|
||||||
|
*
|
||||||
|
* @param string $email E-Mail address
|
||||||
|
* @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 bool $kv_folding If set to true and a valid encoding, do KV folding
|
||||||
|
* @return string Correctly encoded and build email string
|
||||||
|
*/
|
||||||
|
public static function encodeEmailName(
|
||||||
|
string $email,
|
||||||
|
string $email_name = '',
|
||||||
|
string $encoding = 'UTF-8',
|
||||||
|
bool $kv_folding = false
|
||||||
|
): string {
|
||||||
|
if (empty($email_name)) {
|
||||||
|
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
|
||||||
|
*
|
||||||
|
* @param string $subject Subject 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 string $encoding Encoding for subject encode mime header
|
||||||
|
* @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(
|
||||||
|
string $subject,
|
||||||
|
string $body,
|
||||||
|
array $replace,
|
||||||
|
string $encoding,
|
||||||
|
bool $kv_folding
|
||||||
|
): array {
|
||||||
|
foreach (['subject', 'body'] as $element) {
|
||||||
|
$$element = str_replace(
|
||||||
|
array_map(
|
||||||
|
function ($key) {
|
||||||
|
return '{' . $key . '}';
|
||||||
|
},
|
||||||
|
array_keys($replace)
|
||||||
|
),
|
||||||
|
array_values($replace),
|
||||||
|
$$element
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// if encoding is NOT UTF-8 convert to target
|
||||||
|
if ($encoding != 'UTF-8') {
|
||||||
|
$subject = mb_convert_encoding($subject, $encoding, 'UTF-8');
|
||||||
|
$body = mb_convert_encoding($body, $encoding, 'UTF-8');
|
||||||
|
}
|
||||||
|
// we need to encodde the subject
|
||||||
|
$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];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send plain text email with possible to replace subject/body data
|
||||||
|
* either global or per to email set.
|
||||||
|
* replace to tags are in {} in the subject or body
|
||||||
|
*
|
||||||
|
* @param string $subject Mail subject, mandatory, in UTF-8
|
||||||
|
* @param string $body Mail body, mandatory, in UTF-8
|
||||||
|
* @param string $from_email From email, mandatory
|
||||||
|
* @param string $from_name From email name, in UTF-8
|
||||||
|
* if empty '' then not set
|
||||||
|
* @param array<mixed> $send_to_emails to email or array for email/replace
|
||||||
|
* If array: name/email/replace[key,value]
|
||||||
|
* name and replace must be in UTF-8
|
||||||
|
* At least one must be set
|
||||||
|
* @param array<string,string> $replace_content Subject/Body replace as
|
||||||
|
* search -> replace, in 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 \CoreLibs\Debug\Logging|null $log Logging class,
|
||||||
|
* only used if test flag is true
|
||||||
|
* @return int 2 test only, no sent
|
||||||
|
* 1 for ok,
|
||||||
|
* 0 for send not ok
|
||||||
|
* -1 for nothing set (emails, subject, body)
|
||||||
|
* -2 for empty to list
|
||||||
|
* -3 encoding target not valid or not installed
|
||||||
|
*/
|
||||||
|
public static function sendEmail(
|
||||||
|
string $subject,
|
||||||
|
string $body,
|
||||||
|
string $from_email,
|
||||||
|
string $from_name,
|
||||||
|
array $send_to_emails,
|
||||||
|
array $replace_content = [],
|
||||||
|
string $encoding = 'UTF-8',
|
||||||
|
bool $kv_folding = false,
|
||||||
|
bool $test = false,
|
||||||
|
?\CoreLibs\Debug\Logging $log = null
|
||||||
|
): int {
|
||||||
|
/** @var array<string> */
|
||||||
|
$to_emails = [];
|
||||||
|
/** @var array<string,array<string,string>> */
|
||||||
|
$to_replace = [];
|
||||||
|
/** @var string */
|
||||||
|
$out_subject = $subject;
|
||||||
|
/** @var string */
|
||||||
|
$out_body = $body;
|
||||||
|
// check basic set
|
||||||
|
if (empty($subject) || empty($body) || empty($from_email)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
$encoding != 'UTF-8' &&
|
||||||
|
!in_array($encoding, mb_list_encodings())
|
||||||
|
) {
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
// if not one valid to, abort
|
||||||
|
foreach ($send_to_emails as $to_email) {
|
||||||
|
// to_email can be string, then only to email
|
||||||
|
// else expect 'email' & 'name'
|
||||||
|
if (
|
||||||
|
is_array($to_email) &&
|
||||||
|
isset($to_email['email'])
|
||||||
|
) {
|
||||||
|
$_to_email = self::encodeEmailName(
|
||||||
|
$to_email['email'],
|
||||||
|
$to_email['name'] ?? '',
|
||||||
|
$encoding,
|
||||||
|
$kv_folding
|
||||||
|
);
|
||||||
|
$to_emails[] = $_to_email;
|
||||||
|
// if we have to replacement, this override replace content
|
||||||
|
if (isset($to_email['replace']) && count($to_email['replace'])) {
|
||||||
|
// merge with original replace content,
|
||||||
|
// to data will override original data
|
||||||
|
$to_replace[$_to_email] = array_merge(
|
||||||
|
$replace_content,
|
||||||
|
$to_email['replace']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} elseif (is_string($to_email)) {
|
||||||
|
$to_emails[] = $to_email;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!count($to_emails)) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the email headers needed
|
||||||
|
$headers = [
|
||||||
|
'From' => self::encodeEmailName($from_email, $from_name, $encoding),
|
||||||
|
'Content-type' => "text/plain; charset=" . $encoding,
|
||||||
|
'MIME-Version' => "1.0",
|
||||||
|
];
|
||||||
|
|
||||||
|
// if we have a replace string, we need to do replace run
|
||||||
|
// only if there is no dedicated to replace
|
||||||
|
// also run replace if there is nothing to replace at all
|
||||||
|
// this will mime encode the subject
|
||||||
|
if (!count($to_replace)) {
|
||||||
|
list($out_subject, $out_body) = self::replaceContent(
|
||||||
|
$subject,
|
||||||
|
$body,
|
||||||
|
$replace_content,
|
||||||
|
$encoding,
|
||||||
|
$kv_folding
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$mail_delivery_status = 1;
|
||||||
|
// send the email
|
||||||
|
foreach ($to_emails as $to_email) {
|
||||||
|
// default mail status is success
|
||||||
|
$mail_status = true;
|
||||||
|
// if there is a to replace, if not use the original replace content
|
||||||
|
if (count($to_replace)) {
|
||||||
|
$_replace = [];
|
||||||
|
if (!empty($to_replace[$to_email])) {
|
||||||
|
$_replace = $to_replace[$to_email];
|
||||||
|
} elseif (count($replace_content)) {
|
||||||
|
$_replace = $replace_content;
|
||||||
|
}
|
||||||
|
if (count($_replace)) {
|
||||||
|
list($out_subject, $out_body) = self::replaceContent(
|
||||||
|
$subject,
|
||||||
|
$body,
|
||||||
|
$_replace,
|
||||||
|
$encoding,
|
||||||
|
$kv_folding
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if we are in test mode, do not send an email and set status to 2
|
||||||
|
if ($test === false) {
|
||||||
|
$mail_status = mail($to_email, $out_subject, $out_body, $headers);
|
||||||
|
} else {
|
||||||
|
$mail_delivery_status = 2;
|
||||||
|
}
|
||||||
|
// log if an log instance exists
|
||||||
|
if ($log instanceof \CoreLibs\Debug\Logging) {
|
||||||
|
// build debug strings: convert to UTF-8 if not utf-8
|
||||||
|
$log->debug('SEND EMAIL', 'HEADERS: ' . $log->prAr($headers) . ', '
|
||||||
|
. 'ENCODING: ' . $encoding . ', '
|
||||||
|
. 'KV FOLDING: ' . $log->prBl($kv_folding) . ', '
|
||||||
|
. 'TO: ' . $to_email . ', '
|
||||||
|
. 'SUBJECT: ' . $out_subject . ', '
|
||||||
|
. 'BODY: ' . ($encoding == 'UTF-8' ?
|
||||||
|
$out_body :
|
||||||
|
mb_convert_encoding($out_body, 'UTF-8', $encoding)));
|
||||||
|
$log->debug('SEND EMAIL JSON', json_encode([
|
||||||
|
'encoding' => $encoding,
|
||||||
|
'kv_folding' => $kv_folding,
|
||||||
|
'header' => $headers,
|
||||||
|
'to' => $to_email,
|
||||||
|
'subject' => $out_subject,
|
||||||
|
'body' => ($encoding == 'UTF-8' ?
|
||||||
|
$out_body :
|
||||||
|
mb_convert_encoding($out_body, 'UTF-8', $encoding))
|
||||||
|
]) ?: '{}');
|
||||||
|
}
|
||||||
|
if (!$mail_status) {
|
||||||
|
$mail_delivery_status = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $mail_delivery_status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* html convert functions
|
* random key functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ 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
|
||||||
@@ -55,12 +58,16 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
* @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
|
||||||
@@ -177,7 +212,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
public function dbResetArray($reset_pk = false): void
|
public function dbResetArray($reset_pk = false): void
|
||||||
{
|
{
|
||||||
reset($this->table_array);
|
reset($this->table_array);
|
||||||
foreach ($this->table_array as $column => $data_array) {
|
foreach (array_keys($this->table_array) as $column) {
|
||||||
if (!$this->table_array[$column]['pk']) {
|
if (!$this->table_array[$column]['pk']) {
|
||||||
unset($this->table_array[$column]['value']);
|
unset($this->table_array[$column]['value']);
|
||||||
} elseif ($reset_pk) {
|
} elseif ($reset_pk) {
|
||||||
@@ -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,13 +238,18 @@ 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'] . ' ';
|
||||||
// delete files and build FK query
|
// delete files and build FK query
|
||||||
reset($this->table_array);
|
reset($this->table_array);
|
||||||
$q_where = '';
|
$q_where = '';
|
||||||
foreach ($this->table_array as $column => $data_array) {
|
foreach (array_keys($this->table_array) as $column) {
|
||||||
// suchen nach bildern und lschen ...
|
// suchen nach bildern und lschen ...
|
||||||
if (
|
if (
|
||||||
!empty($this->table_array[$column]['file']) &&
|
!empty($this->table_array[$column]['file']) &&
|
||||||
@@ -271,11 +312,22 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
if ($q_select) {
|
if ($q_select) {
|
||||||
$q_select .= ', ';
|
$q_select .= ', ';
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
!empty($data_array['type']) && $data_array['type'] == 'datetime' &&
|
||||||
|
!empty($data_array['sql_read'])
|
||||||
|
) {
|
||||||
|
// convert tom different timestamp type
|
||||||
|
$q_select .= "TO_CHAR($column, '" . $data_array['sql_read'] . "') AS $column";
|
||||||
|
} else {
|
||||||
$q_select .= $column;
|
$q_select .= $column;
|
||||||
|
}
|
||||||
|
|
||||||
// check FK ...
|
// check FK ...
|
||||||
if (isset($this->table_array[$column]['fk']) && isset($this->table_array[$column]['value'])) {
|
if (
|
||||||
if ($q_where) {
|
isset($this->table_array[$column]['fk']) &&
|
||||||
|
isset($this->table_array[$column]['value'])
|
||||||
|
) {
|
||||||
|
if (!empty($q_where)) {
|
||||||
$q_where .= ' AND ';
|
$q_where .= ' AND ';
|
||||||
}
|
}
|
||||||
$q_where .= $column .= ' = ' . $this->table_array[$column]['value'];
|
$q_where .= $column .= ' = ' . $this->table_array[$column]['value'];
|
||||||
@@ -327,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;
|
||||||
}
|
}
|
||||||
@@ -344,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 = '';
|
||||||
@@ -397,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 (
|
||||||
@@ -450,7 +526,12 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
} elseif (isset($this->table_array[$column]['bool'])) {
|
} elseif (isset($this->table_array[$column]['bool'])) {
|
||||||
// boolean storeage (reverse check on ifset)
|
// boolean storeage (reverse check on ifset)
|
||||||
$q_data .= "'" . $this->dbBoolean($this->table_array[$column]['value'], true) . "'";
|
$q_data .= "'" . $this->dbBoolean($this->table_array[$column]['value'], true) . "'";
|
||||||
} elseif (isset($this->table_array[$column]['interval'])) {
|
} elseif (
|
||||||
|
isset($this->table_array[$column]['interval']) ||
|
||||||
|
isset($this->table_array[$column]['date']) ||
|
||||||
|
isset($this->table_array[$column]['datetime']) ||
|
||||||
|
isset($this->table_array[$column]['emptynull'])
|
||||||
|
) {
|
||||||
// for interval we check if no value, then we set null
|
// for interval we check if no value, then we set null
|
||||||
if (
|
if (
|
||||||
!isset($this->table_array[$column]['value']) ||
|
!isset($this->table_array[$column]['value']) ||
|
||||||
@@ -458,7 +539,7 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
) {
|
) {
|
||||||
$_value = 'NULL';
|
$_value = 'NULL';
|
||||||
} elseif (isset($this->table_array[$column]['value'])) {
|
} elseif (isset($this->table_array[$column]['value'])) {
|
||||||
$_value = $this->table_array[$column]['value'];
|
$_value = $this->dbEscapeLiteral($this->table_array[$column]['value']);
|
||||||
} else {
|
} else {
|
||||||
// fallback
|
// fallback
|
||||||
$_value = 'NULL';
|
$_value = 'NULL';
|
||||||
@@ -494,13 +575,21 @@ 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);
|
||||||
// create select part & addition FK part
|
// create select part & addition FK part
|
||||||
foreach ($this->table_array as $column => $data_array) {
|
foreach ($this->table_array as $column => $data_array) {
|
||||||
// check FK ...
|
// check FK ...
|
||||||
if (isset($this->table_array[$column]['fk']) && isset($this->table_array[$column]['value'])) {
|
if (
|
||||||
|
isset($this->table_array[$column]['fk']) &&
|
||||||
|
isset($this->table_array[$column]['value'])
|
||||||
|
) {
|
||||||
if (!empty($q_where)) {
|
if (!empty($q_where)) {
|
||||||
$q_where .= ' AND ';
|
$q_where .= ' AND ';
|
||||||
}
|
}
|
||||||
@@ -546,7 +635,6 @@ class ArrayIO extends \CoreLibs\DB\IO
|
|||||||
}
|
}
|
||||||
// set primary key
|
// set primary key
|
||||||
if ($insert) {
|
if ($insert) {
|
||||||
// FIXME: this has to be fixes by fixing DB::IO clas
|
|
||||||
$insert_id = $this->dbGetInsertPK();
|
$insert_id = $this->dbGetInsertPK();
|
||||||
if (is_array($insert_id)) {
|
if (is_array($insert_id)) {
|
||||||
$insert_id = 0;
|
$insert_id = 0;
|
||||||
|
|||||||
@@ -2580,9 +2580,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 +2963,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 +2978,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;
|
||||||
|
|||||||
@@ -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']);
|
||||||
@@ -293,15 +293,7 @@ class Logging
|
|||||||
}
|
}
|
||||||
// set per run ID
|
// set per run ID
|
||||||
if ($this->log_per_run) {
|
if ($this->log_per_run) {
|
||||||
/* if (isset($GLOBALS['LOG_FILE_UNIQUE_ID'])) {
|
$this->setLogUniqueId();
|
||||||
$this->log_file_unique_id = $GLOBALS['LOG_FILE_UNIQUE_ID'];
|
|
||||||
} */
|
|
||||||
if (!$this->log_file_unique_id) {
|
|
||||||
// $GLOBALS['LOG_FILE_UNIQUE_ID'] =
|
|
||||||
$this->log_file_unique_id =
|
|
||||||
date('Y-m-d_His') . '_U_'
|
|
||||||
. substr(hash('sha1', uniqid((string)mt_rand(), true)), 0, 8);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,7 +386,10 @@ class Logging
|
|||||||
|
|
||||||
// write to file
|
// write to file
|
||||||
// first check if max file size is is set and file is bigger
|
// first check if max file size is is set and file is bigger
|
||||||
if ($this->log_max_filesize > 0 && ((filesize($fn) / 1024) > $this->log_max_filesize)) {
|
if (
|
||||||
|
$this->log_max_filesize > 0 &&
|
||||||
|
((filesize($fn) / 1024) > $this->log_max_filesize)
|
||||||
|
) {
|
||||||
// for easy purpose, rename file only to attach timestamp, nur sequence numbering
|
// for easy purpose, rename file only to attach timestamp, nur sequence numbering
|
||||||
rename($fn, $fn . '.' . date("YmdHis"));
|
rename($fn, $fn . '.' . date("YmdHis"));
|
||||||
}
|
}
|
||||||
@@ -593,6 +588,10 @@ class Logging
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$this->{'log_per_' . $type} = $set;
|
$this->{'log_per_' . $type} = $set;
|
||||||
|
// if per run set unique id
|
||||||
|
if ($type == 'run' && $set == true) {
|
||||||
|
$this->setLogUniqueId();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -610,6 +609,33 @@ class Logging
|
|||||||
return $this->{'log_per_' . $type};
|
return $this->{'log_per_' . $type};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a unique id based on current date (y/m/d, h:i:s) and a unique id (8 chars)
|
||||||
|
* if override is set to true it will be newly set, else if already set nothing changes
|
||||||
|
*
|
||||||
|
* @param bool $override True to force new set
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setLogUniqueId(bool $override = false): void
|
||||||
|
{
|
||||||
|
if (!$this->log_file_unique_id || $override == true) {
|
||||||
|
$this->log_file_unique_id =
|
||||||
|
date('Y-m-d_His') . '_U_'
|
||||||
|
. substr(hash('sha1', uniqid((string)mt_rand(), true)), 0, 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return current set log file unique id,
|
||||||
|
* empty string for not set
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getLogUniqueId(): string
|
||||||
|
{
|
||||||
|
return $this->log_file_unique_id;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set or get the log file date extension flag
|
* Set or get the log file date extension flag
|
||||||
* if null or empty parameter gets current flag
|
* if null or empty parameter gets current flag
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace CoreLibs\Debug;
|
namespace CoreLibs\Debug;
|
||||||
|
|
||||||
|
use CoreLibs\Convert\Html;
|
||||||
|
|
||||||
class Support
|
class Support
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@@ -89,7 +91,7 @@ class Support
|
|||||||
* Debug\Logging compatible output
|
* Debug\Logging compatible output
|
||||||
*
|
*
|
||||||
* @param mixed $mixed
|
* @param mixed $mixed
|
||||||
* @param bool $no_html set to true to use ##HTMLPRE##
|
* @param bool $no_html set to true to use ##HTMLPRE##or html escape
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function printToString($mixed, bool $no_html = false): string
|
public static function printToString($mixed, bool $no_html = false): string
|
||||||
@@ -103,6 +105,12 @@ class Support
|
|||||||
} elseif (is_array($mixed)) {
|
} elseif (is_array($mixed)) {
|
||||||
// use the pre one OR debug one
|
// use the pre one OR debug one
|
||||||
return self::printAr($mixed, $no_html);
|
return self::printAr($mixed, $no_html);
|
||||||
|
} elseif (is_string($mixed)) {
|
||||||
|
if ($no_html) {
|
||||||
|
return Html::htmlent((string)$mixed);
|
||||||
|
} else {
|
||||||
|
return (string)$mixed;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// should be int/float/string
|
// should be int/float/string
|
||||||
return (string)$mixed;
|
return (string)$mixed;
|
||||||
@@ -190,13 +198,20 @@ class Support
|
|||||||
* @param string $replace [default '-'] What to replace the empty string with
|
* @param string $replace [default '-'] What to replace the empty string with
|
||||||
* @return string String itself or the replaced value
|
* @return string String itself or the replaced value
|
||||||
*/
|
*/
|
||||||
public static function debugString(?string $string, string $replace = '-'): string
|
public static function debugString(
|
||||||
{
|
?string $string,
|
||||||
|
string $replace = '-',
|
||||||
|
bool $no_html = false
|
||||||
|
): string {
|
||||||
if (empty($string)) {
|
if (empty($string)) {
|
||||||
return $replace;
|
$string = $replace;
|
||||||
}
|
}
|
||||||
|
if ($no_html) {
|
||||||
|
return Html::htmlent($string);
|
||||||
|
} else {
|
||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -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,11 +772,27 @@ 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']
|
||||||
) {
|
) {
|
||||||
|
return $return_array;
|
||||||
|
}
|
||||||
|
if (empty($this->load_query)) {
|
||||||
|
$this->log->debug('LOAD LIST ERROR', 'Missing load list query');
|
||||||
|
return $return_array;
|
||||||
|
}
|
||||||
|
|
||||||
$t_pk_name = $this->archive_pk_name;
|
$t_pk_name = $this->archive_pk_name;
|
||||||
|
|
||||||
// load list data
|
// load list data
|
||||||
@@ -795,12 +831,13 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
$pk_names[] = $t_string;
|
$pk_names[] = $t_string;
|
||||||
}
|
}
|
||||||
} // show it at all
|
$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,19 +845,26 @@ 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']
|
||||||
) {
|
) {
|
||||||
|
return [
|
||||||
|
'new_name' => $new_name,
|
||||||
|
'show_checkbox' => $show_checkbox,
|
||||||
|
'seclevel_okay' => $seclevel_okay,
|
||||||
|
];
|
||||||
|
}
|
||||||
if ($this->yes && !$hide_new_checkbox) {
|
if ($this->yes && !$hide_new_checkbox) {
|
||||||
$show_checkbox = 1;
|
$show_checkbox = false;
|
||||||
}
|
}
|
||||||
// set type of new name
|
// set type of new name
|
||||||
if ($this->yes) {
|
if ($this->yes) {
|
||||||
@@ -828,10 +872,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
} else {
|
} else {
|
||||||
$new_name = $this->l->__('New');
|
$new_name = $this->l->__('New');
|
||||||
}
|
}
|
||||||
} // security level okay
|
$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,29 +887,44 @@ 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,
|
||||||
|
'save' => $save,
|
||||||
|
'pk_name' => $pk_name,
|
||||||
|
'pk_value' => $pk_value,
|
||||||
|
'show_delete' => $show_delete,
|
||||||
|
'old_school_hidden' => $old_school_hidden,
|
||||||
|
'hide_delete_checkbox' => $hide_delete_checkbox
|
||||||
|
];
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!empty($this->security_level['save']) &&
|
||||||
|
$this->base_acl_level >= $this->security_level['save']
|
||||||
|
) {
|
||||||
|
$seclevel_okay = true;
|
||||||
if (empty($this->table_array[$this->int_pk_name]['value'])) {
|
if (empty($this->table_array[$this->int_pk_name]['value'])) {
|
||||||
$save = $this->l->__('Save');
|
$save = $this->l->__('Save');
|
||||||
} else {
|
} else {
|
||||||
$save = $this->l->__('Update');
|
$save = $this->l->__('Update');
|
||||||
}
|
}
|
||||||
// print the old_school hidden if requestet
|
// print the old_school hidden if requestet
|
||||||
if ($old_school_hidden == 1) { /** @phpstan-ignore-line Unclear logic */
|
if ($old_school_hidden === true) {
|
||||||
$pk_name = $this->int_pk_name;
|
$pk_name = $this->int_pk_name;
|
||||||
$pk_value = $this->table_array[$this->int_pk_name]['value'];
|
$pk_value = $this->table_array[$this->int_pk_name]['value'];
|
||||||
}
|
}
|
||||||
@@ -873,11 +933,11 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
if (
|
if (
|
||||||
!empty($this->table_array[$this->int_pk_name]['value']) &&
|
!empty($this->table_array[$this->int_pk_name]['value']) &&
|
||||||
!$hide_delete &&
|
!$hide_delete &&
|
||||||
|
!empty($this->security_level['delete']) &&
|
||||||
$this->base_acl_level >= $this->security_level['delete']
|
$this->base_acl_level >= $this->security_level['delete']
|
||||||
) {
|
) {
|
||||||
$show_delete = 1;
|
$show_delete = true;
|
||||||
}
|
}
|
||||||
} // print save/delete row at all$
|
|
||||||
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') {
|
||||||
@@ -969,11 +1039,15 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
}
|
}
|
||||||
// date (YYYY-MM-DD)
|
// date (YYYY-MM-DD)
|
||||||
if ($this->table_array[$element_name]['type'] == 'date') {
|
if ($this->table_array[$element_name]['type'] == 'date') {
|
||||||
if (!$this->table_array[$element_name]['value']) {
|
|
||||||
$this->table_array[$element_name]['value'] = 'YYYY-MM-DD';
|
|
||||||
}
|
|
||||||
$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)
|
||||||
|
if ($this->table_array[$element_name]['type'] == 'datetime') {
|
||||||
|
$data['name'] = $element_name;
|
||||||
|
$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') {
|
||||||
@@ -981,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'])) {
|
||||||
@@ -1045,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
|
||||||
@@ -1077,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1091,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'] = '';
|
||||||
}
|
}
|
||||||
@@ -1124,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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1144,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 (
|
||||||
@@ -1168,7 +1255,7 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
if (!\CoreLibs\Combined\DateTime::checkDate($this->table_array[$key]['value'])) {
|
if (!\CoreLibs\Combined\DateTime::checkDate($this->table_array[$key]['value'])) {
|
||||||
$this->msg .= sprintf(
|
$this->msg .= sprintf(
|
||||||
$this->l->__(
|
$this->l->__(
|
||||||
'Please enter a vailid date (YYYY-MM-DD) for the <b>%s</b> Field!<br>'
|
'Please enter a valid date (YYYY-MM-DD) for the <b>%s</b> Field!<br>'
|
||||||
),
|
),
|
||||||
$this->table_array[$key]['output_name']
|
$this->table_array[$key]['output_name']
|
||||||
);
|
);
|
||||||
@@ -1178,17 +1265,30 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
if (!\CoreLibs\Combined\DateTime::checkDateTime($this->table_array[$key]['value'])) {
|
if (!\CoreLibs\Combined\DateTime::checkDateTime($this->table_array[$key]['value'])) {
|
||||||
$this->msg .= sprintf(
|
$this->msg .= sprintf(
|
||||||
$this->l->__(
|
$this->l->__(
|
||||||
'Please enter a vailid time (HH:MM[:SS]) for the <b>%s</b> Field!<br>'
|
'Please enter a valid time (HH:mm[:SS]) for the <b>%s</b> Field!<br>'
|
||||||
),
|
),
|
||||||
$this->table_array[$key]['output_name']
|
$this->table_array[$key]['output_name']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'datetime': // YYYY-MM-DD HH:MM[:SS]
|
case 'datetime': // YYYY-MM-DD HH:MM[:SS]
|
||||||
// not implemented
|
if (!\CoreLibs\Combined\DateTime::checkDateTime($this->table_array[$key]['value'])) {
|
||||||
|
$this->msg .= sprintf(
|
||||||
|
$this->l->__(
|
||||||
|
'Please enter a valid date time (YYYY-MM-DD HH:mm) '
|
||||||
|
. 'for the <b>%s</b> Field!<br>'
|
||||||
|
),
|
||||||
|
$this->table_array[$key]['output_name']
|
||||||
|
);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'intervalshort': // ony interval n [Y/M/D] only
|
case 'intervalshort': // ony interval n [Y/M/D] only
|
||||||
if (preg_match("/^\d{1,3}\ ?[YMDymd]{1}$/", $this->table_array[$key]['value'])) {
|
if (
|
||||||
|
!preg_match(
|
||||||
|
"/^\d{1,3}\ ?([ymd]{1}|day(s)?|year(s)?|month(s)?)$/i",
|
||||||
|
$this->table_array[$key]['value']
|
||||||
|
)
|
||||||
|
) {
|
||||||
$this->msg .= sprintf(
|
$this->msg .= sprintf(
|
||||||
$this->l->__(
|
$this->l->__(
|
||||||
'Please enter a valid time interval in the format '
|
'Please enter a valid time interval in the format '
|
||||||
@@ -1358,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'] &&
|
||||||
@@ -1377,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 = '';
|
||||||
@@ -1552,7 +1664,9 @@ 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)) {
|
||||||
|
return $this->table_array;
|
||||||
|
}
|
||||||
// first check out of order ...
|
// first check out of order ...
|
||||||
if (empty($this->table_array[$order_name]['value'])) {
|
if (empty($this->table_array[$order_name]['value'])) {
|
||||||
// set order (read max)
|
// set order (read max)
|
||||||
@@ -1579,7 +1693,6 @@ class Generate extends \CoreLibs\DB\Extended\ArrayIO
|
|||||||
$this->table_array[$order_name]['value'] = $res['order_name'];
|
$this->table_array[$order_name]['value'] = $res['order_name'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return $this->table_array;
|
return $this->table_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1666,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
|
||||||
@@ -1812,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)) {
|
||||||
@@ -1837,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 = [];
|
||||||
@@ -2142,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']
|
||||||
@@ -2154,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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2196,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']
|
||||||
@@ -2508,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
|
||||||
|
|||||||
@@ -423,7 +423,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 */
|
||||||
|
|||||||
4
www/vendor/composer/autoload_classmap.php
vendored
4
www/vendor/composer/autoload_classmap.php
vendored
@@ -27,6 +27,8 @@ 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\\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',
|
||||||
'CoreLibs\\Create\\Session' => $baseDir . '/lib/CoreLibs/Create/Session.php',
|
'CoreLibs\\Create\\Session' => $baseDir . '/lib/CoreLibs/Create/Session.php',
|
||||||
@@ -381,6 +383,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',
|
||||||
@@ -669,6 +672,7 @@ return array(
|
|||||||
'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',
|
||||||
|
|||||||
1
www/vendor/composer/autoload_files.php
vendored
1
www/vendor/composer/autoload_files.php
vendored
@@ -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',
|
||||||
);
|
);
|
||||||
|
|||||||
4
www/vendor/composer/autoload_psr4.php
vendored
4
www/vendor/composer/autoload_psr4.php
vendored
@@ -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'),
|
||||||
|
|||||||
36
www/vendor/composer/autoload_static.php
vendored
36
www/vendor/composer/autoload_static.php
vendored
@@ -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,8 @@ 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\\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',
|
||||||
'CoreLibs\\Create\\Session' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Session.php',
|
'CoreLibs\\Create\\Session' => __DIR__ . '/../..' . '/lib/CoreLibs/Create/Session.php',
|
||||||
@@ -446,6 +416,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',
|
||||||
@@ -734,6 +705,7 @@ class ComposerStaticInit10fe8fe2ec4017b8644d2b64bcf398b9
|
|||||||
'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',
|
||||||
|
|||||||
460
www/vendor/composer/installed.json
vendored
460
www/vendor/composer/installed.json
vendored
@@ -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.24",
|
||||||
"version_normalized": "9.5.20.0",
|
"version_normalized": "9.5.24.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba"
|
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5"
|
||||||
},
|
},
|
||||||
"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/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
|
||||||
"reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba",
|
"reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5",
|
||||||
"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",
|
||||||
@@ -925,18 +685,14 @@
|
|||||||
"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.1",
|
||||||
"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-08-30T07:42:16+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.24"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1888,17 +1644,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/type",
|
"name": "sebastian/type",
|
||||||
"version": "3.0.0",
|
"version": "3.1.0",
|
||||||
"version_normalized": "3.0.0.0",
|
"version_normalized": "3.1.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": "fb44e1cc6e557418387ad815780360057e40753e"
|
||||||
},
|
},
|
||||||
"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/fb44e1cc6e557418387ad815780360057e40753e",
|
||||||
"reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad",
|
"reference": "fb44e1cc6e557418387ad815780360057e40753e",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1907,11 +1663,11 @@
|
|||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "^9.5"
|
"phpunit/phpunit": "^9.5"
|
||||||
},
|
},
|
||||||
"time": "2022-03-15T09:54:48+00:00",
|
"time": "2022-08-29T06:55:37+00:00",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "3.0-dev"
|
"dev-master": "3.1-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"installation-source": "dist",
|
"installation-source": "dist",
|
||||||
@@ -1935,7 +1691,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.1.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -2001,91 +1757,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 +1809,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 +1818,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 +1840,6 @@
|
|||||||
"sebastian/resource-operations",
|
"sebastian/resource-operations",
|
||||||
"sebastian/type",
|
"sebastian/type",
|
||||||
"sebastian/version",
|
"sebastian/version",
|
||||||
"symfony/polyfill-ctype",
|
"theseer/tokenizer"
|
||||||
"theseer/tokenizer",
|
|
||||||
"webmozart/assert"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
78
www/vendor/composer/installed.php
vendored
78
www/vendor/composer/installed.php
vendored
@@ -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.24',
|
||||||
'version' => '9.5.20.0',
|
'version' => '9.5.24.0',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../phpunit/phpunit',
|
'install_path' => __DIR__ . '/../phpunit/phpunit',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'reference' => '12bc8879fb65aef2138b26fc633cb1e3620cffba',
|
'reference' => 'd0aa6097bef9fd42458a9b3c49da32c6ce6129c5',
|
||||||
'dev_requirement' => true,
|
'dev_requirement' => true,
|
||||||
),
|
),
|
||||||
'sebastian/cli-parser' => array(
|
'sebastian/cli-parser' => 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.1.0',
|
||||||
'version' => '3.0.0.0',
|
'version' => '3.1.0.0',
|
||||||
'type' => 'library',
|
'type' => 'library',
|
||||||
'install_path' => __DIR__ . '/../sebastian/type',
|
'install_path' => __DIR__ . '/../sebastian/type',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'reference' => 'b233b84bc4465aff7b57cf1c4bc75c86d00d6dad',
|
'reference' => 'fb44e1cc6e557418387ad815780360057e40753e',
|
||||||
'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,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
6
www/vendor/nikic/php-parser/README.md
vendored
6
www/vendor/nikic/php-parser/README.md
vendored
@@ -3,10 +3,10 @@ PHP Parser
|
|||||||
|
|
||||||
[](https://coveralls.io/github/nikic/PHP-Parser?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
|
||||||
|
|||||||
10
www/vendor/nikic/php-parser/grammar/php5.y
vendored
10
www/vendor/nikic/php-parser/grammar/php5.y
vendored
@@ -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[]; }
|
||||||
|
|||||||
62
www/vendor/nikic/php-parser/grammar/php7.y
vendored
62
www/vendor/nikic/php-parser/grammar/php7.y
vendored
@@ -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; }
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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] === '(')));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,17 @@ class DNumber extends Scalar
|
|||||||
return ['value'];
|
return ['value'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed[] $attributes
|
||||||
|
*/
|
||||||
|
public static function fromString(string $str, array $attributes = []): DNumber
|
||||||
|
{
|
||||||
|
$attributes['rawValue'] = $str;
|
||||||
|
$float = self::parse($str);
|
||||||
|
|
||||||
|
return new DNumber($float, $attributes);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -41,6 +41,8 @@ class LNumber extends Scalar
|
|||||||
* @return LNumber The constructed LNumber, including kind attribute
|
* @return LNumber The constructed LNumber, including kind attribute
|
||||||
*/
|
*/
|
||||||
public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber {
|
public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber {
|
||||||
|
$attributes['rawValue'] = $str;
|
||||||
|
|
||||||
$str = str_replace('_', '', $str);
|
$str = str_replace('_', '', $str);
|
||||||
|
|
||||||
if ('0' !== $str[0] || '0' === $str) {
|
if ('0' !== $str[0] || '0' === $str) {
|
||||||
|
|||||||
@@ -42,6 +42,22 @@ class String_ extends Scalar
|
|||||||
return ['value'];
|
return ['value'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes
|
||||||
|
*/
|
||||||
|
public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self
|
||||||
|
{
|
||||||
|
$attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B')))
|
||||||
|
? Scalar\String_::KIND_SINGLE_QUOTED
|
||||||
|
: Scalar\String_::KIND_DOUBLE_QUOTED;
|
||||||
|
|
||||||
|
$attributes['rawValue'] = $str;
|
||||||
|
|
||||||
|
$string = self::parse($str, $parseUnicodeEscape);
|
||||||
|
|
||||||
|
return new self($string, $attributes);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ abstract class ClassLike extends Node\Stmt
|
|||||||
/** @var Node\AttributeGroup[] PHP attribute groups */
|
/** @var Node\AttributeGroup[] PHP attribute groups */
|
||||||
public $attrGroups;
|
public $attrGroups;
|
||||||
|
|
||||||
/** @var Node\Name Namespaced name (if using NameResolver) */
|
/** @var Node\Name|null Namespaced name (if using NameResolver) */
|
||||||
public $namespacedName;
|
public $namespacedName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ class ClassMethod extends Node\Stmt implements FunctionLike
|
|||||||
'__clone' => true,
|
'__clone' => true,
|
||||||
'__invoke' => true,
|
'__invoke' => true,
|
||||||
'__debuginfo' => true,
|
'__debuginfo' => true,
|
||||||
|
'__serialize' => true,
|
||||||
|
'__unserialize' => true,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -68,6 +68,10 @@ class Class_ extends ClassLike
|
|||||||
return (bool) ($this->flags & self::MODIFIER_FINAL);
|
return (bool) ($this->flags & self::MODIFIER_FINAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isReadonly() : bool {
|
||||||
|
return (bool) ($this->flags & self::MODIFIER_READONLY);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the class is anonymous.
|
* Whether the class is anonymous.
|
||||||
*
|
*
|
||||||
@@ -77,6 +81,27 @@ class Class_ extends ClassLike
|
|||||||
return null === $this->name;
|
return null === $this->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
public static function verifyClassModifier($a, $b) {
|
||||||
|
if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) {
|
||||||
|
throw new Error('Multiple abstract modifiers are not allowed');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) {
|
||||||
|
throw new Error('Multiple final modifiers are not allowed');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) {
|
||||||
|
throw new Error('Multiple readonly modifiers are not allowed');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($a & 48 && $b & 48) {
|
||||||
|
throw new Error('Cannot use the final modifier on an abstract class');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class Function_ extends Node\Stmt implements FunctionLike
|
|||||||
/** @var Node\AttributeGroup[] PHP attribute groups */
|
/** @var Node\AttributeGroup[] PHP attribute groups */
|
||||||
public $attrGroups;
|
public $attrGroups;
|
||||||
|
|
||||||
/** @var Node\Name Namespaced name (if using NameResolver) */
|
/** @var Node\Name|null Namespaced name (if using NameResolver) */
|
||||||
public $namespacedName;
|
public $namespacedName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class UnionType extends ComplexType
|
|||||||
/**
|
/**
|
||||||
* Constructs a union type.
|
* Constructs a union type.
|
||||||
*
|
*
|
||||||
* @param (Identifier|Name)[] $types Types
|
* @param (Identifier|Name|IntersectionType)[] $types Types
|
||||||
* @param array $attributes Additional attributes
|
* @param array $attributes Additional attributes
|
||||||
*/
|
*/
|
||||||
public function __construct(array $types, array $attributes = []) {
|
public function __construct(array $types, array $attributes = []) {
|
||||||
|
|||||||
@@ -2147,8 +2147,7 @@ class Php5 extends \PhpParser\ParserAbstract
|
|||||||
$this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
|
$this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
|
||||||
},
|
},
|
||||||
392 => function ($stackPos) {
|
392 => function ($stackPos) {
|
||||||
$attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(4-1)][0] === "'" || ($this->semStack[$stackPos-(4-1)][1] === "'" && ($this->semStack[$stackPos-(4-1)][0] === 'b' || $this->semStack[$stackPos-(4-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED);
|
$this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
|
||||||
$this->semValue = new Expr\ArrayDimFetch(new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(4-1)]), $attrs), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
|
|
||||||
},
|
},
|
||||||
393 => function ($stackPos) {
|
393 => function ($stackPos) {
|
||||||
$this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
|
$this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes);
|
||||||
@@ -2275,11 +2274,10 @@ class Php5 extends \PhpParser\ParserAbstract
|
|||||||
$this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true);
|
$this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true);
|
||||||
},
|
},
|
||||||
434 => function ($stackPos) {
|
434 => function ($stackPos) {
|
||||||
$this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos-(1-1)]), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
|
$this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
|
||||||
},
|
},
|
||||||
435 => function ($stackPos) {
|
435 => function ($stackPos) {
|
||||||
$attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED);
|
$this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false);
|
||||||
$this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)], false), $attrs);
|
|
||||||
},
|
},
|
||||||
436 => function ($stackPos) {
|
436 => function ($stackPos) {
|
||||||
$this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
|
$this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user