Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7354632479 | ||
|
|
5a21d22c7b | ||
|
|
cee3b5c2d1 | ||
|
|
47e44c15cc | ||
|
|
83738adcb6 | ||
|
|
5454133239 | ||
|
|
87f35f23c3 | ||
|
|
3c4c5d3106 | ||
|
|
b080727ff3 |
@@ -9,6 +9,7 @@ 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);
|
||||||
|
NEW.cuuid := gen_random_uuid();
|
||||||
ELSIF TG_OP = 'UPDATE' THEN
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
NEW.date_updated := 'now';
|
NEW.date_updated := 'now';
|
||||||
END IF;
|
END IF;
|
||||||
|
|||||||
107
4dev/database/function/upgrade_serial_to_identity.sql
Normal file
107
4dev/database/function/upgrade_serial_to_identity.sql
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
-- Upgrade serial to identity type
|
||||||
|
--
|
||||||
|
-- Original: https://www.enterprisedb.com/blog/postgresql-10-identity-columns-explained#section-6
|
||||||
|
--
|
||||||
|
-- @param reclass tbl The table where the column is located, prefix with 'schema.' if different schema
|
||||||
|
-- @param name col The column to be changed
|
||||||
|
-- @param varchar identity_type [default=a] Allowed a, d, assigned, default
|
||||||
|
-- @param varchar col_type [default=''] Allowed smallint, int, bigint, int2, int4, int8
|
||||||
|
-- @raises EXCEPTON on column not found, no linked sequence, more than one linked sequence found
|
||||||
|
--
|
||||||
|
CREATE OR REPLACE FUNCTION upgrade_serial_to_identity(
|
||||||
|
tbl regclass,
|
||||||
|
col name,
|
||||||
|
identity_type varchar = 'a',
|
||||||
|
col_type varchar = ''
|
||||||
|
)
|
||||||
|
RETURNS void
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
colnum smallint;
|
||||||
|
seqid oid;
|
||||||
|
count int;
|
||||||
|
col_type_oid int;
|
||||||
|
col_type_len int;
|
||||||
|
current_col_atttypid oid;
|
||||||
|
current_col_attlen int;
|
||||||
|
BEGIN
|
||||||
|
-- switch between always (default) or default identiy type
|
||||||
|
IF identity_type NOT IN ('a', 'd', 'assigned', 'default') THEN
|
||||||
|
identity_type := 'a';
|
||||||
|
ELSE
|
||||||
|
IF identity_type = 'default' THEN
|
||||||
|
identity_type := 'd';
|
||||||
|
ELSIF identity_type = 'assigned' THEN
|
||||||
|
identity_type := 'a';
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
-- find column number, attribute oid and attribute len
|
||||||
|
SELECT attnum, atttypid, attlen
|
||||||
|
INTO colnum, current_col_atttypid, current_col_attlen
|
||||||
|
FROM pg_attribute
|
||||||
|
WHERE attrelid = tbl AND attname = col;
|
||||||
|
IF NOT FOUND THEN
|
||||||
|
RAISE EXCEPTION 'column does not exist';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- find sequence
|
||||||
|
SELECT INTO seqid objid
|
||||||
|
FROM pg_depend
|
||||||
|
WHERE (refclassid, refobjid, refobjsubid) = ('pg_class'::regclass, tbl, colnum)
|
||||||
|
AND classid = 'pg_class'::regclass AND objsubid = 0
|
||||||
|
AND deptype = 'a';
|
||||||
|
|
||||||
|
GET DIAGNOSTICS count = ROW_COUNT;
|
||||||
|
IF count < 1 THEN
|
||||||
|
RAISE EXCEPTION 'no linked sequence found';
|
||||||
|
ELSIF count > 1 THEN
|
||||||
|
RAISE EXCEPTION 'more than one linked sequence found';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- drop the default
|
||||||
|
EXECUTE 'ALTER TABLE ' || tbl || ' ALTER COLUMN ' || quote_ident(col) || ' DROP DEFAULT';
|
||||||
|
|
||||||
|
-- change the dependency between column and sequence to internal
|
||||||
|
UPDATE pg_depend
|
||||||
|
SET deptype = 'i'
|
||||||
|
WHERE (classid, objid, objsubid) = ('pg_class'::regclass, seqid, 0)
|
||||||
|
AND deptype = 'a';
|
||||||
|
|
||||||
|
-- mark the column as identity column
|
||||||
|
UPDATE pg_attribute
|
||||||
|
-- set to 'd' for default
|
||||||
|
SET attidentity = identity_type
|
||||||
|
WHERE attrelid = tbl
|
||||||
|
AND attname = col;
|
||||||
|
RAISE NOTICE 'Update to identity for table "%" and columen "%" with type "%"', tbl, col, identity_type;
|
||||||
|
|
||||||
|
-- set type if requested and not empty
|
||||||
|
IF col_type <> '' THEN
|
||||||
|
IF col_type IN ('smallint', 'int', 'bigint', 'int2', 'int4', 'int8') THEN
|
||||||
|
-- rewrite smallint, int, bigint
|
||||||
|
IF col_type = 'smallint' THEN
|
||||||
|
col_type := 'int2';
|
||||||
|
ELSIF col_type = 'int' THEN
|
||||||
|
col_type := 'int4';
|
||||||
|
ELSIF col_type = 'bigint' THEN
|
||||||
|
col_type := 'int8';
|
||||||
|
END IF;
|
||||||
|
-- get the length and oid for selected
|
||||||
|
SELECT oid, typlen INTO col_type_oid, col_type_len FROM pg_type WHERE typname = col_type;
|
||||||
|
-- set only if diff or hight
|
||||||
|
IF current_col_atttypid <> col_type_oid AND col_type_len > current_col_attlen THEN
|
||||||
|
RAISE NOTICE 'Change col type: %', col_type;
|
||||||
|
-- update type
|
||||||
|
UPDATE pg_attribute
|
||||||
|
SET
|
||||||
|
atttypid = col_type_oid, attlen = col_type_len
|
||||||
|
WHERE attrelid = tbl
|
||||||
|
AND attname = col;
|
||||||
|
END IF;
|
||||||
|
ELSE
|
||||||
|
RAISE NOTICE 'Invalid col type: %', col_type;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access;
|
-- DROP TABLE edit_access;
|
||||||
CREATE TABLE edit_access (
|
CREATE TABLE edit_access (
|
||||||
edit_access_id SERIAL PRIMARY KEY,
|
edit_access_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
protected SMALLINT DEFAULT 0,
|
protected SMALLINT DEFAULT 0,
|
||||||
deleted SMALLINT DEFAULT 0,
|
deleted SMALLINT DEFAULT 0,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_data;
|
-- DROP TABLE edit_access_data;
|
||||||
CREATE TABLE edit_access_data (
|
CREATE TABLE edit_access_data (
|
||||||
edit_access_data_id SERIAL PRIMARY KEY,
|
edit_access_data_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_right;
|
-- DROP TABLE edit_access_right;
|
||||||
CREATE TABLE edit_access_right (
|
CREATE TABLE edit_access_right (
|
||||||
edit_access_right_id SERIAL PRIMARY KEY,
|
edit_access_right_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
level SMALLINT,
|
level SMALLINT,
|
||||||
type VARCHAR,
|
type VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_user;
|
-- DROP TABLE edit_access_user;
|
||||||
CREATE TABLE edit_access_user (
|
CREATE TABLE edit_access_user (
|
||||||
edit_access_user_id SERIAL PRIMARY KEY,
|
edit_access_user_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_user_id INT NOT NULL,
|
edit_user_id INT NOT NULL,
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
-- DROP TABLE edit_generic;
|
-- DROP TABLE edit_generic;
|
||||||
CREATE TABLE edit_generic (
|
CREATE TABLE edit_generic (
|
||||||
cuid VARCHAR,
|
cuid VARCHAR,
|
||||||
|
cuuid UUID DEFAULT gen_random_uuid(),
|
||||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_group;
|
-- DROP TABLE edit_group;
|
||||||
CREATE TABLE edit_group (
|
CREATE TABLE edit_group (
|
||||||
edit_group_id SERIAL PRIMARY KEY,
|
edit_group_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_scheme_id INT,
|
edit_scheme_id INT,
|
||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_language;
|
-- DROP TABLE edit_language;
|
||||||
CREATE TABLE edit_language (
|
CREATE TABLE edit_language (
|
||||||
edit_language_id SERIAL PRIMARY KEY,
|
edit_language_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
lang_default SMALLINT NOT NULL DEFAULT 0,
|
lang_default SMALLINT NOT NULL DEFAULT 0,
|
||||||
long_name VARCHAR,
|
long_name VARCHAR,
|
||||||
|
|||||||
@@ -7,11 +7,13 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_log;
|
-- DROP TABLE edit_log;
|
||||||
CREATE TABLE edit_log (
|
CREATE TABLE edit_log (
|
||||||
edit_log_id SERIAL PRIMARY KEY,
|
edit_log_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
||||||
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
||||||
username VARCHAR,
|
username VARCHAR,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
|
ecuid VARCHAR,
|
||||||
|
ecuuid UUID,
|
||||||
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
ip VARCHAR,
|
ip VARCHAR,
|
||||||
error TEXT,
|
error TEXT,
|
||||||
@@ -21,6 +23,7 @@ CREATE TABLE edit_log (
|
|||||||
page VARCHAR,
|
page VARCHAR,
|
||||||
action VARCHAR,
|
action VARCHAR,
|
||||||
action_id VARCHAR,
|
action_id VARCHAR,
|
||||||
|
action_sub_id VARCHAR,
|
||||||
action_yes VARCHAR,
|
action_yes VARCHAR,
|
||||||
action_flag VARCHAR,
|
action_flag VARCHAR,
|
||||||
action_menu VARCHAR,
|
action_menu VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_menu_group;
|
-- DROP TABLE edit_menu_group;
|
||||||
CREATE TABLE edit_menu_group (
|
CREATE TABLE edit_menu_group (
|
||||||
edit_menu_group_id SERIAL PRIMARY KEY,
|
edit_menu_group_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
flag VARCHAR,
|
flag VARCHAR,
|
||||||
order_number INT NOT NULL
|
order_number INT NOT NULL
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_page;
|
-- DROP TABLE edit_page;
|
||||||
CREATE TABLE edit_page (
|
CREATE TABLE edit_page (
|
||||||
edit_page_id SERIAL PRIMARY KEY,
|
edit_page_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
||||||
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||||
filename VARCHAR,
|
filename VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_access;
|
-- DROP TABLE edit_page_access;
|
||||||
CREATE TABLE edit_page_access (
|
CREATE TABLE edit_page_access (
|
||||||
edit_page_access_id SERIAL PRIMARY KEY,
|
edit_page_access_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_group_id INT NOT NULL,
|
edit_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_content;
|
-- DROP TABLE edit_page_content;
|
||||||
CREATE TABLE edit_page_content (
|
CREATE TABLE edit_page_content (
|
||||||
edit_page_content_id SERIAL PRIMARY KEY,
|
edit_page_content_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_query_string;
|
-- DROP TABLE edit_query_string;
|
||||||
CREATE TABLE edit_query_string (
|
CREATE TABLE edit_query_string (
|
||||||
edit_query_string_id SERIAL PRIMARY KEY,
|
edit_query_string_id SERIAINT GENERATED ALWAYS AS IDENTITYL PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_scheme;
|
-- DROP TABLE edit_scheme;
|
||||||
CREATE TABLE edit_scheme (
|
CREATE TABLE edit_scheme (
|
||||||
edit_scheme_id SERIAL PRIMARY KEY,
|
edit_scheme_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
header_color VARCHAR,
|
header_color VARCHAR,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_user;
|
-- DROP TABLE edit_user;
|
||||||
CREATE TABLE edit_user (
|
CREATE TABLE edit_user (
|
||||||
edit_user_id SERIAL PRIMARY KEY,
|
edit_user_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
connect_edit_user_id INT, -- possible reference to other user
|
connect_edit_user_id INT, -- possible reference to other user
|
||||||
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_language_id INT NOT NULL,
|
edit_language_id INT NOT NULL,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
-- DROP TABLE edit_visible_group;
|
-- DROP TABLE edit_visible_group;
|
||||||
CREATE TABLE edit_visible_group (
|
CREATE TABLE edit_visible_group (
|
||||||
edit_visible_group_id SERIAL PRIMARY KEY,
|
edit_visible_group_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
flag VARCHAR
|
flag VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -243,6 +243,8 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
[],
|
[],
|
||||||
[
|
[
|
||||||
'EUID' => 1,
|
'EUID' => 1,
|
||||||
|
'ECUID' => 'abc',
|
||||||
|
'ECUUID' => '1233456-1234-1234-1234-123456789012',
|
||||||
],
|
],
|
||||||
2,
|
2,
|
||||||
[],
|
[],
|
||||||
@@ -260,6 +262,8 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
[],
|
[],
|
||||||
[
|
[
|
||||||
'EUID' => 1,
|
'EUID' => 1,
|
||||||
|
'ECUID' => 'abc',
|
||||||
|
'ECUUID' => '1233456-1234-1234-1234-123456789012',
|
||||||
'USER_NAME' => '',
|
'USER_NAME' => '',
|
||||||
'GROUP_NAME' => '',
|
'GROUP_NAME' => '',
|
||||||
'ADMIN' => 1,
|
'ADMIN' => 1,
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ CREATE FUNCTION random_string(randomLength int)
|
|||||||
RETURNS text AS
|
RETURNS text AS
|
||||||
$$
|
$$
|
||||||
SELECT array_to_string(
|
SELECT array_to_string(
|
||||||
ARRAY(
|
ARRAY(
|
||||||
SELECT substring(
|
SELECT substring(
|
||||||
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
|
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
|
||||||
trunc(random() * 62)::int + 1,
|
trunc(random() * 62)::int + 1,
|
||||||
1
|
1
|
||||||
)
|
)
|
||||||
FROM generate_series(1, randomLength) AS gs(x)
|
FROM generate_series(1, randomLength) AS gs(x)
|
||||||
),
|
),
|
||||||
''
|
''
|
||||||
)
|
)
|
||||||
$$
|
$$
|
||||||
LANGUAGE SQL
|
LANGUAGE SQL
|
||||||
@@ -27,15 +27,16 @@ CREATE OR REPLACE FUNCTION set_edit_generic()
|
|||||||
RETURNS TRIGGER AS
|
RETURNS TRIGGER AS
|
||||||
$$
|
$$
|
||||||
DECLARE
|
DECLARE
|
||||||
random_length INT = 12; -- that should be long enough
|
random_length INT = 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
|
NEW.cuuid := gen_random_uuid();
|
||||||
NEW.date_updated := 'now';
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
END IF;
|
NEW.date_updated := 'now';
|
||||||
RETURN NEW;
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
@@ -46,29 +47,29 @@ LANGUAGE 'plpgsql';
|
|||||||
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
|
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
|
||||||
$$
|
$$
|
||||||
DECLARE
|
DECLARE
|
||||||
myrec RECORD;
|
myrec RECORD;
|
||||||
v_uid VARCHAR;
|
v_uid VARCHAR;
|
||||||
BEGIN
|
BEGIN
|
||||||
-- skip if NEW.name is not set
|
-- skip if NEW.name is not set
|
||||||
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||||
-- use NEW.name as base, remove all spaces
|
-- use NEW.name as base, remove all spaces
|
||||||
-- name data is already unique, so we do not need to worry about this here
|
-- name data is already unique, so we do not need to worry about this here
|
||||||
v_uid := REPLACE(NEW.name, ' ', '');
|
v_uid := REPLACE(NEW.name, ' ', '');
|
||||||
IF TG_OP = 'INSERT' THEN
|
IF TG_OP = 'INSERT' THEN
|
||||||
-- always set
|
-- always set
|
||||||
NEW.uid := v_uid;
|
NEW.uid := v_uid;
|
||||||
ELSIF TG_OP = 'UPDATE' THEN
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
-- check if not set, then set
|
-- check if not set, then set
|
||||||
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
|
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
|
||||||
IF FOUND THEN
|
IF FOUND THEN
|
||||||
NEW.uid := v_uid;
|
NEW.uid := v_uid;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_access_set_uid.sql
|
-- END: function/edit_access_set_uid.sql
|
||||||
-- START: function/edit_group_set_uid.sql
|
-- START: function/edit_group_set_uid.sql
|
||||||
-- add uid add for edit_group table
|
-- add uid add for edit_group table
|
||||||
@@ -76,29 +77,29 @@ $$
|
|||||||
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
|
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
|
||||||
$$
|
$$
|
||||||
DECLARE
|
DECLARE
|
||||||
myrec RECORD;
|
myrec RECORD;
|
||||||
v_uid VARCHAR;
|
v_uid VARCHAR;
|
||||||
BEGIN
|
BEGIN
|
||||||
-- skip if NEW.name is not set
|
-- skip if NEW.name is not set
|
||||||
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||||
-- use NEW.name as base, remove all spaces
|
-- use NEW.name as base, remove all spaces
|
||||||
-- name data is already unique, so we do not need to worry about this here
|
-- name data is already unique, so we do not need to worry about this here
|
||||||
v_uid := REPLACE(NEW.name, ' ', '');
|
v_uid := REPLACE(NEW.name, ' ', '');
|
||||||
IF TG_OP = 'INSERT' THEN
|
IF TG_OP = 'INSERT' THEN
|
||||||
-- always set
|
-- always set
|
||||||
NEW.uid := v_uid;
|
NEW.uid := v_uid;
|
||||||
ELSIF TG_OP = 'UPDATE' THEN
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
-- check if not set, then set
|
-- check if not set, then set
|
||||||
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
|
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
|
||||||
IF FOUND THEN
|
IF FOUND THEN
|
||||||
NEW.uid := v_uid;
|
NEW.uid := v_uid;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
-- END: function/edit_group_set_uid.sql
|
-- END: function/edit_group_set_uid.sql
|
||||||
-- START: function/edit_log_partition_insert.sql
|
-- START: function/edit_log_partition_insert.sql
|
||||||
-- AUTHOR: Clemens Schwaighofer
|
-- AUTHOR: Clemens Schwaighofer
|
||||||
@@ -112,142 +113,142 @@ CREATE OR REPLACE FUNCTION edit_log_insert_trigger ()
|
|||||||
RETURNS TRIGGER AS
|
RETURNS TRIGGER AS
|
||||||
$$
|
$$
|
||||||
DECLARE
|
DECLARE
|
||||||
start_date DATE := '2010-01-01';
|
start_date DATE := '2010-01-01';
|
||||||
end_date DATE;
|
end_date DATE;
|
||||||
timeformat TEXT := 'YYYY';
|
timeformat TEXT := 'YYYY';
|
||||||
selector TEXT := 'year';
|
selector TEXT := 'year';
|
||||||
base_table TEXT := 'edit_log';
|
base_table TEXT := 'edit_log';
|
||||||
_interval INTERVAL := '1 ' || selector;
|
_interval INTERVAL := '1 ' || selector;
|
||||||
_interval_next INTERVAL := '2 ' || selector;
|
_interval_next INTERVAL := '2 ' || selector;
|
||||||
table_name TEXT;
|
table_name TEXT;
|
||||||
-- compare date column
|
-- compare date column
|
||||||
compare_date DATE := NEW.event_date;
|
compare_date DATE := NEW.event_date;
|
||||||
compare_date_name TEXT := 'event_date';
|
compare_date_name TEXT := 'event_date';
|
||||||
-- the create commands
|
-- the create commands
|
||||||
command_create_table TEXT := 'CREATE TABLE IF NOT EXISTS {TABLE_NAME} (CHECK({COMPARE_DATE_NAME} >= {START_DATE} AND {COMPARE_DATE_NAME} < {END_DATE})) INHERITS ({BASE_NAME})';
|
command_create_table TEXT := 'CREATE TABLE IF NOT EXISTS {TABLE_NAME} (CHECK({COMPARE_DATE_NAME} >= {START_DATE} AND {COMPARE_DATE_NAME} < {END_DATE})) INHERITS ({BASE_NAME})';
|
||||||
command_create_primary_key TEXT := 'ALTER TABLE {TABLE_NAME} ADD PRIMARY KEY ({BASE_TABLE}_id)';
|
command_create_primary_key TEXT := 'ALTER TABLE {TABLE_NAME} ADD PRIMARY KEY ({BASE_TABLE}_id)';
|
||||||
command_create_foreign_key_1 TEXT := 'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT {TABLE_NAME}_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL';
|
command_create_foreign_key_1 TEXT := 'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT {TABLE_NAME}_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL';
|
||||||
command_create_trigger_1 TEXT = 'CREATE TRIGGER trg_{TABLE_NAME} BEFORE INSERT OR UPDATE ON {TABLE_NAME} FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()';
|
command_create_trigger_1 TEXT = 'CREATE TRIGGER trg_{TABLE_NAME} BEFORE INSERT OR UPDATE ON {TABLE_NAME} FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()';
|
||||||
BEGIN
|
BEGIN
|
||||||
-- we are in valid start time area
|
-- we are in valid start time area
|
||||||
IF (NEW.event_date >= start_date) THEN
|
IF (NEW.event_date >= start_date) THEN
|
||||||
-- current table name
|
-- current table name
|
||||||
table_name := base_table || '_' || to_char(NEW.event_date, timeformat);
|
table_name := base_table || '_' || to_char(NEW.event_date, timeformat);
|
||||||
BEGIN
|
BEGIN
|
||||||
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
||||||
-- if insert failed because of missing table, create new below
|
-- if insert failed because of missing table, create new below
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN undefined_table THEN
|
WHEN undefined_table THEN
|
||||||
-- another block, so in case the creation fails here too
|
-- another block, so in case the creation fails here too
|
||||||
BEGIN
|
BEGIN
|
||||||
-- create new table here + all indexes
|
-- create new table here + all indexes
|
||||||
start_date := date_trunc(selector, NEW.event_date);
|
start_date := date_trunc(selector, NEW.event_date);
|
||||||
end_date := date_trunc(selector, NEW.event_date + _interval);
|
end_date := date_trunc(selector, NEW.event_date + _interval);
|
||||||
-- creat table
|
-- creat table
|
||||||
EXECUTE format(REPLACE( -- end date
|
EXECUTE format(REPLACE( -- end date
|
||||||
REPLACE( -- start date
|
REPLACE( -- start date
|
||||||
REPLACE( -- compare date name
|
REPLACE( -- compare date name
|
||||||
REPLACE( -- base name (inherit)
|
REPLACE( -- base name (inherit)
|
||||||
REPLACE( -- table name
|
REPLACE( -- table name
|
||||||
command_create_table,
|
command_create_table,
|
||||||
'{TABLE_NAME}',
|
'{TABLE_NAME}',
|
||||||
table_name
|
table_name
|
||||||
),
|
),
|
||||||
'{BASE_NAME}',
|
'{BASE_NAME}',
|
||||||
base_table
|
base_table
|
||||||
),
|
),
|
||||||
'{COMPARE_DATE_NAME}',
|
'{COMPARE_DATE_NAME}',
|
||||||
compare_date_name
|
compare_date_name
|
||||||
),
|
),
|
||||||
'{START_DATE}',
|
'{START_DATE}',
|
||||||
quote_literal(start_date)
|
quote_literal(start_date)
|
||||||
),
|
),
|
||||||
'{END_DATE}',
|
'{END_DATE}',
|
||||||
quote_literal(end_date)
|
quote_literal(end_date)
|
||||||
));
|
));
|
||||||
-- create all indexes and triggers
|
-- create all indexes and triggers
|
||||||
EXECUTE format(REPLACE(
|
EXECUTE format(REPLACE(
|
||||||
REPLACE(
|
REPLACE(
|
||||||
command_create_primary_key,
|
command_create_primary_key,
|
||||||
'{TABLE_NAME}',
|
'{TABLE_NAME}',
|
||||||
table_name
|
table_name
|
||||||
),
|
),
|
||||||
'{BASE_TABLE}',
|
'{BASE_TABLE}',
|
||||||
base_table
|
base_table
|
||||||
));
|
));
|
||||||
-- FK constraints
|
-- FK constraints
|
||||||
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
||||||
-- generic trigger
|
-- generic trigger
|
||||||
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
||||||
|
|
||||||
-- insert try again
|
-- insert try again
|
||||||
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
||||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||||
END;
|
END;
|
||||||
-- other errors, insert into overlow
|
-- other errors, insert into overlow
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
||||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||||
END;
|
END;
|
||||||
-- main insert run done, check if we have to create next months table
|
-- main insert run done, check if we have to create next months table
|
||||||
BEGIN
|
BEGIN
|
||||||
-- check if next month table exists
|
-- check if next month table exists
|
||||||
table_name := base_table || '_' || to_char((SELECT NEW.event_date + _interval)::DATE, timeformat);
|
table_name := base_table || '_' || to_char((SELECT NEW.event_date + _interval)::DATE, timeformat);
|
||||||
-- RAISE NOTICE 'SEARCH NEXT: %', table_name;
|
-- RAISE NOTICE 'SEARCH NEXT: %', table_name;
|
||||||
IF (SELECT to_regclass(table_name)) IS NULL THEN
|
IF (SELECT to_regclass(table_name)) IS NULL THEN
|
||||||
-- move inner interval same
|
-- move inner interval same
|
||||||
start_date := date_trunc(selector, NEW.event_date + _interval);
|
start_date := date_trunc(selector, NEW.event_date + _interval);
|
||||||
end_date := date_trunc(selector, NEW.event_date + _interval_next);
|
end_date := date_trunc(selector, NEW.event_date + _interval_next);
|
||||||
-- RAISE NOTICE 'CREATE NEXT: %', table_name;
|
-- RAISE NOTICE 'CREATE NEXT: %', table_name;
|
||||||
-- create table
|
-- create table
|
||||||
EXECUTE format(REPLACE( -- end date
|
EXECUTE format(REPLACE( -- end date
|
||||||
REPLACE( -- start date
|
REPLACE( -- start date
|
||||||
REPLACE( -- compare date name
|
REPLACE( -- compare date name
|
||||||
REPLACE( -- base name (inherit)
|
REPLACE( -- base name (inherit)
|
||||||
REPLACE( -- table name
|
REPLACE( -- table name
|
||||||
command_create_table,
|
command_create_table,
|
||||||
'{TABLE_NAME}',
|
'{TABLE_NAME}',
|
||||||
table_name
|
table_name
|
||||||
),
|
),
|
||||||
'{BASE_NAME}',
|
'{BASE_NAME}',
|
||||||
base_table
|
base_table
|
||||||
),
|
),
|
||||||
'{COMPARE_DATE_NAME}',
|
'{COMPARE_DATE_NAME}',
|
||||||
compare_date_name
|
compare_date_name
|
||||||
),
|
),
|
||||||
'{START_DATE}',
|
'{START_DATE}',
|
||||||
quote_literal(start_date)
|
quote_literal(start_date)
|
||||||
),
|
),
|
||||||
'{END_DATE}',
|
'{END_DATE}',
|
||||||
quote_literal(end_date)
|
quote_literal(end_date)
|
||||||
));
|
));
|
||||||
-- create all indexes and triggers
|
-- create all indexes and triggers
|
||||||
EXECUTE format(REPLACE(
|
EXECUTE format(REPLACE(
|
||||||
REPLACE(
|
REPLACE(
|
||||||
command_create_primary_key,
|
command_create_primary_key,
|
||||||
'{TABLE_NAME}',
|
'{TABLE_NAME}',
|
||||||
table_name
|
table_name
|
||||||
),
|
),
|
||||||
'{BASE_TABLE}',
|
'{BASE_TABLE}',
|
||||||
base_table
|
base_table
|
||||||
));
|
));
|
||||||
-- FK constraints
|
-- FK constraints
|
||||||
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
||||||
-- generic trigger
|
-- generic trigger
|
||||||
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
||||||
END IF;
|
END IF;
|
||||||
EXCEPTION
|
EXCEPTION
|
||||||
WHEN OTHERS THEN
|
WHEN OTHERS THEN
|
||||||
RAISE NOTICE 'Failed to create next table: %', table_name;
|
RAISE NOTICE 'Failed to create next table: %', table_name;
|
||||||
END;
|
END;
|
||||||
ELSE
|
ELSE
|
||||||
-- if outside valid date, insert into overflow
|
-- if outside valid date, insert into overflow
|
||||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NULL;
|
RETURN NULL;
|
||||||
END
|
END
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
@@ -260,22 +261,22 @@ CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
|||||||
RETURNS TRIGGER AS
|
RETURNS TRIGGER AS
|
||||||
$$
|
$$
|
||||||
BEGIN
|
BEGIN
|
||||||
-- if new is not null/empty
|
-- if new is not null/empty
|
||||||
-- and old one is null or old one different new one
|
-- and old one is null or old one different new one
|
||||||
-- set NOW()
|
-- set NOW()
|
||||||
-- if new one is NULL
|
-- if new one is NULL
|
||||||
-- set NULL
|
-- set NULL
|
||||||
IF
|
IF
|
||||||
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
||||||
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
||||||
THEN
|
THEN
|
||||||
NEW.login_user_id_set_date = NOW();
|
NEW.login_user_id_set_date = NOW();
|
||||||
NEW.login_user_id_last_revalidate = NOW();
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
NEW.login_user_id_set_date = NULL;
|
NEW.login_user_id_set_date = NULL;
|
||||||
NEW.login_user_id_last_revalidate = NULL;
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
@@ -290,8 +291,8 @@ LANGUAGE 'plpgsql';
|
|||||||
|
|
||||||
-- DROP TABLE temp_files;
|
-- DROP TABLE temp_files;
|
||||||
CREATE TABLE temp_files (
|
CREATE TABLE temp_files (
|
||||||
filename VARCHAR,
|
filename VARCHAR,
|
||||||
folder VARCHAR
|
folder VARCHAR
|
||||||
);
|
);
|
||||||
-- END: table/edit_temp_files.sql
|
-- END: table/edit_temp_files.sql
|
||||||
-- START: table/edit_generic.sql
|
-- START: table/edit_generic.sql
|
||||||
@@ -304,9 +305,10 @@ CREATE TABLE temp_files (
|
|||||||
|
|
||||||
-- DROP TABLE edit_generic;
|
-- DROP TABLE edit_generic;
|
||||||
CREATE TABLE edit_generic (
|
CREATE TABLE edit_generic (
|
||||||
cuid VARCHAR,
|
cuid VARCHAR,
|
||||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
cuuid UUID,
|
||||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||||
|
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||||
);
|
);
|
||||||
-- END: table/edit_generic.sql
|
-- END: table/edit_generic.sql
|
||||||
-- START: table/edit_visible_group.sql
|
-- START: table/edit_visible_group.sql
|
||||||
@@ -319,9 +321,9 @@ CREATE TABLE edit_generic (
|
|||||||
|
|
||||||
-- DROP TABLE edit_visible_group;
|
-- DROP TABLE edit_visible_group;
|
||||||
CREATE TABLE edit_visible_group (
|
CREATE TABLE edit_visible_group (
|
||||||
edit_visible_group_id SERIAL PRIMARY KEY,
|
edit_visible_group_id SERIAL PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
flag VARCHAR
|
flag VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_visible_group.sql
|
-- END: table/edit_visible_group.sql
|
||||||
-- START: table/edit_menu_group.sql
|
-- START: table/edit_menu_group.sql
|
||||||
@@ -334,10 +336,10 @@ CREATE TABLE edit_visible_group (
|
|||||||
|
|
||||||
-- DROP TABLE edit_menu_group;
|
-- DROP TABLE edit_menu_group;
|
||||||
CREATE TABLE edit_menu_group (
|
CREATE TABLE edit_menu_group (
|
||||||
edit_menu_group_id SERIAL PRIMARY KEY,
|
edit_menu_group_id SERIAL PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
flag VARCHAR,
|
flag VARCHAR,
|
||||||
order_number INT NOT NULL
|
order_number INT NOT NULL
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
|
||||||
@@ -352,18 +354,18 @@ CREATE TABLE edit_menu_group (
|
|||||||
|
|
||||||
-- DROP TABLE edit_page;
|
-- DROP TABLE edit_page;
|
||||||
CREATE TABLE edit_page (
|
CREATE TABLE edit_page (
|
||||||
edit_page_id SERIAL PRIMARY KEY,
|
edit_page_id SERIAL PRIMARY KEY,
|
||||||
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
||||||
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||||
filename VARCHAR,
|
filename VARCHAR,
|
||||||
name VARCHAR UNIQUE,
|
name VARCHAR UNIQUE,
|
||||||
order_number INT NOT NULL,
|
order_number INT NOT NULL,
|
||||||
online SMALLINT NOT NULL DEFAULT 0,
|
online SMALLINT NOT NULL DEFAULT 0,
|
||||||
menu SMALLINT NOT NULL DEFAULT 0,
|
menu SMALLINT NOT NULL DEFAULT 0,
|
||||||
popup SMALLINT NOT NULL DEFAULT 0,
|
popup SMALLINT NOT NULL DEFAULT 0,
|
||||||
popup_x SMALLINT,
|
popup_x SMALLINT,
|
||||||
popup_y SMALLINT,
|
popup_y SMALLINT,
|
||||||
hostname VARCHAR
|
hostname VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_page.sql
|
-- END: table/edit_page.sql
|
||||||
-- START: table/edit_query_string.sql
|
-- START: table/edit_query_string.sql
|
||||||
@@ -376,13 +378,13 @@ CREATE TABLE edit_page (
|
|||||||
|
|
||||||
-- DROP TABLE edit_query_string;
|
-- DROP TABLE edit_query_string;
|
||||||
CREATE TABLE edit_query_string (
|
CREATE TABLE edit_query_string (
|
||||||
edit_query_string_id SERIAL PRIMARY KEY,
|
edit_query_string_id SERIAL PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
value VARCHAR,
|
value VARCHAR,
|
||||||
dynamic SMALLINT NOT NULL DEFAULT 0
|
dynamic SMALLINT NOT NULL DEFAULT 0
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_query_string.sql
|
-- END: table/edit_query_string.sql
|
||||||
-- START: table/edit_page_visible_group.sql
|
-- START: table/edit_page_visible_group.sql
|
||||||
@@ -395,10 +397,10 @@ CREATE TABLE edit_query_string (
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_visible_group;
|
-- DROP TABLE edit_page_visible_group;
|
||||||
CREATE TABLE edit_page_visible_group (
|
CREATE TABLE edit_page_visible_group (
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_visible_group_id INT NOT NULL,
|
edit_visible_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
);
|
);
|
||||||
-- END: table/edit_page_visible_group.sql
|
-- END: table/edit_page_visible_group.sql
|
||||||
-- START: table/edit_page_menu_group.sql
|
-- START: table/edit_page_menu_group.sql
|
||||||
@@ -411,10 +413,10 @@ CREATE TABLE edit_page_visible_group (
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_menu_group;
|
-- DROP TABLE edit_page_menu_group;
|
||||||
CREATE TABLE edit_page_menu_group (
|
CREATE TABLE edit_page_menu_group (
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_menu_group_id INT NOT NULL,
|
edit_menu_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
);
|
);
|
||||||
-- END: table/edit_page_menu_group.sql
|
-- END: table/edit_page_menu_group.sql
|
||||||
-- START: table/edit_access_right.sql
|
-- START: table/edit_access_right.sql
|
||||||
@@ -428,11 +430,11 @@ CREATE TABLE edit_page_menu_group (
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_right;
|
-- DROP TABLE edit_access_right;
|
||||||
CREATE TABLE edit_access_right (
|
CREATE TABLE edit_access_right (
|
||||||
edit_access_right_id SERIAL PRIMARY KEY,
|
edit_access_right_id SERIAL PRIMARY KEY,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
level SMALLINT,
|
level SMALLINT,
|
||||||
type VARCHAR,
|
type VARCHAR,
|
||||||
UNIQUE (level,type)
|
UNIQUE (level,type)
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_access_right.sql
|
-- END: table/edit_access_right.sql
|
||||||
-- START: table/edit_scheme.sql
|
-- START: table/edit_scheme.sql
|
||||||
@@ -445,12 +447,12 @@ CREATE TABLE edit_access_right (
|
|||||||
|
|
||||||
-- DROP TABLE edit_scheme;
|
-- DROP TABLE edit_scheme;
|
||||||
CREATE TABLE edit_scheme (
|
CREATE TABLE edit_scheme (
|
||||||
edit_scheme_id SERIAL PRIMARY KEY,
|
edit_scheme_id SERIAL PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
header_color VARCHAR,
|
header_color VARCHAR,
|
||||||
css_file VARCHAR,
|
css_file VARCHAR,
|
||||||
template VARCHAR
|
template VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_scheme.sql
|
-- END: table/edit_scheme.sql
|
||||||
-- START: table/edit_language.sql
|
-- START: table/edit_language.sql
|
||||||
@@ -464,13 +466,13 @@ CREATE TABLE edit_scheme (
|
|||||||
|
|
||||||
-- DROP TABLE edit_language;
|
-- DROP TABLE edit_language;
|
||||||
CREATE TABLE edit_language (
|
CREATE TABLE edit_language (
|
||||||
edit_language_id SERIAL PRIMARY KEY,
|
edit_language_id SERIAL PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
lang_default SMALLINT NOT NULL DEFAULT 0,
|
lang_default SMALLINT NOT NULL DEFAULT 0,
|
||||||
long_name VARCHAR,
|
long_name VARCHAR,
|
||||||
short_name VARCHAR, -- en_US, en or en_US@latin without encoding
|
short_name VARCHAR, -- en_US, en or en_US@latin without encoding
|
||||||
iso_name VARCHAR, -- should actually be encoding
|
iso_name VARCHAR, -- should actually be encoding
|
||||||
order_number INT
|
order_number INT
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_language.sql
|
-- END: table/edit_language.sql
|
||||||
-- START: table/edit_group.sql
|
-- START: table/edit_group.sql
|
||||||
@@ -483,16 +485,16 @@ CREATE TABLE edit_language (
|
|||||||
|
|
||||||
-- DROP TABLE edit_group;
|
-- DROP TABLE edit_group;
|
||||||
CREATE TABLE edit_group (
|
CREATE TABLE edit_group (
|
||||||
edit_group_id SERIAL PRIMARY KEY,
|
edit_group_id SERIAL PRIMARY KEY,
|
||||||
edit_scheme_id INT,
|
edit_scheme_id INT,
|
||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
deleted SMALLINT DEFAULT 0,
|
deleted SMALLINT DEFAULT 0,
|
||||||
uid VARCHAR,
|
uid VARCHAR,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
additional_acl JSONB
|
additional_acl JSONB
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_group.sql
|
-- END: table/edit_group.sql
|
||||||
-- START: table/edit_page_access.sql
|
-- START: table/edit_page_access.sql
|
||||||
@@ -505,14 +507,14 @@ CREATE TABLE edit_group (
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_access;
|
-- DROP TABLE edit_page_access;
|
||||||
CREATE TABLE edit_page_access (
|
CREATE TABLE edit_page_access (
|
||||||
edit_page_access_id SERIAL PRIMARY KEY,
|
edit_page_access_id SERIAL PRIMARY KEY,
|
||||||
edit_group_id INT NOT NULL,
|
edit_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0
|
enabled SMALLINT NOT NULL DEFAULT 0
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
|
||||||
@@ -528,15 +530,15 @@ CREATE TABLE edit_page_access (
|
|||||||
|
|
||||||
-- DROP TABLE edit_page_content;
|
-- DROP TABLE edit_page_content;
|
||||||
CREATE TABLE edit_page_content (
|
CREATE TABLE edit_page_content (
|
||||||
edit_page_content_id SERIAL PRIMARY KEY,
|
edit_page_content_id SERIAL PRIMARY KEY,
|
||||||
edit_page_id INT NOT NULL,
|
edit_page_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
uid VARCHAR UNIQUE,
|
uid VARCHAR UNIQUE,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
order_number INT NOT NULL,
|
order_number INT NOT NULL,
|
||||||
online SMALLINT NOT NULL DEFAULT 0
|
online SMALLINT NOT NULL DEFAULT 0
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_page_content.sql
|
-- END: table/edit_page_content.sql
|
||||||
-- START: table/edit_user.sql
|
-- START: table/edit_user.sql
|
||||||
@@ -549,63 +551,63 @@ CREATE TABLE edit_page_content (
|
|||||||
|
|
||||||
-- DROP TABLE edit_user;
|
-- DROP TABLE edit_user;
|
||||||
CREATE TABLE edit_user (
|
CREATE TABLE edit_user (
|
||||||
edit_user_id SERIAL PRIMARY KEY,
|
edit_user_id SERIAL PRIMARY KEY,
|
||||||
connect_edit_user_id INT, -- possible reference to other user
|
connect_edit_user_id INT, -- possible reference to other user
|
||||||
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_language_id INT NOT NULL,
|
edit_language_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_group_id INT NOT NULL,
|
edit_group_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_scheme_id INT,
|
edit_scheme_id INT,
|
||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
-- username/password
|
-- username/password
|
||||||
username VARCHAR UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
-- name block
|
-- name block
|
||||||
first_name VARCHAR,
|
first_name VARCHAR,
|
||||||
last_name VARCHAR,
|
last_name VARCHAR,
|
||||||
first_name_furigana VARCHAR,
|
first_name_furigana VARCHAR,
|
||||||
last_name_furigana VARCHAR,
|
last_name_furigana VARCHAR,
|
||||||
-- email
|
-- email
|
||||||
email VARCHAR,
|
email VARCHAR,
|
||||||
-- eanbled/deleted flag
|
-- eanbled/deleted flag
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||||
-- general flags
|
-- general flags
|
||||||
strict SMALLINT DEFAULT 0,
|
strict SMALLINT DEFAULT 0,
|
||||||
locked SMALLINT DEFAULT 0,
|
locked SMALLINT DEFAULT 0,
|
||||||
protected SMALLINT NOT NULL DEFAULT 0,
|
protected SMALLINT NOT NULL DEFAULT 0,
|
||||||
-- legacy, debug flags
|
-- legacy, debug flags
|
||||||
debug SMALLINT NOT NULL DEFAULT 0,
|
debug SMALLINT NOT NULL DEFAULT 0,
|
||||||
db_debug SMALLINT NOT NULL DEFAULT 0,
|
db_debug SMALLINT NOT NULL DEFAULT 0,
|
||||||
-- is admin user
|
-- is admin user
|
||||||
admin SMALLINT NOT NULL DEFAULT 0,
|
admin SMALLINT NOT NULL DEFAULT 0,
|
||||||
-- last login log
|
-- last login log
|
||||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||||
-- login error
|
-- login error
|
||||||
login_error_count INT DEFAULT 0,
|
login_error_count INT DEFAULT 0,
|
||||||
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
||||||
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
||||||
-- time locked
|
-- time locked
|
||||||
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
||||||
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
||||||
-- password change
|
-- password change
|
||||||
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
||||||
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
||||||
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
||||||
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
||||||
-- _GET login id for direct login
|
-- _GET login id for direct login
|
||||||
login_user_id VARCHAR UNIQUE, -- the loginUserId, at least 32 chars
|
login_user_id VARCHAR UNIQUE, -- the loginUserId, at least 32 chars
|
||||||
login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE, -- when above uid was set
|
login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE, -- when above uid was set
|
||||||
login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE, -- when the last login was done with user name and password
|
login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE, -- when the last login was done with user name and password
|
||||||
login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE, -- if set, from when the above uid is valid
|
login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE, -- if set, from when the above uid is valid
|
||||||
login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE, -- if set, until when the above uid is valid
|
login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE, -- if set, until when the above uid is valid
|
||||||
login_user_id_revalidate_after INTERVAL, -- user must login to revalidated loginUserId after set days, 0 for forever
|
login_user_id_revalidate_after INTERVAL, -- user must login to revalidated loginUserId after set days, 0 for forever
|
||||||
login_user_id_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
login_user_id_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
||||||
-- additional ACL json block
|
-- additional ACL json block
|
||||||
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
-- create unique index
|
-- create unique index
|
||||||
@@ -650,37 +652,40 @@ COMMENT ON COLUMN edit_user.additional_acl IS 'Additional Access Control List st
|
|||||||
|
|
||||||
-- DROP TABLE edit_log;
|
-- DROP TABLE edit_log;
|
||||||
CREATE TABLE edit_log (
|
CREATE TABLE edit_log (
|
||||||
edit_log_id SERIAL PRIMARY KEY,
|
edit_log_id SERIAL PRIMARY KEY,
|
||||||
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
||||||
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
ecuid VARCHAR,
|
||||||
username VARCHAR,
|
ecuuid UUID,
|
||||||
password VARCHAR,
|
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
||||||
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
username VARCHAR,
|
||||||
ip VARCHAR,
|
password VARCHAR,
|
||||||
error TEXT,
|
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||||
event TEXT,
|
ip VARCHAR,
|
||||||
data_binary BYTEA,
|
error TEXT,
|
||||||
data TEXT,
|
event TEXT,
|
||||||
page VARCHAR,
|
data_binary BYTEA,
|
||||||
action VARCHAR,
|
data TEXT,
|
||||||
action_id VARCHAR,
|
page VARCHAR,
|
||||||
action_yes VARCHAR,
|
action VARCHAR,
|
||||||
action_flag VARCHAR,
|
action_id VARCHAR,
|
||||||
action_menu VARCHAR,
|
action_sub_id VARCHAR,
|
||||||
action_loaded VARCHAR,
|
action_yes VARCHAR,
|
||||||
action_value VARCHAR,
|
action_flag VARCHAR,
|
||||||
action_type VARCHAR,
|
action_menu VARCHAR,
|
||||||
action_error VARCHAR,
|
action_loaded VARCHAR,
|
||||||
user_agent VARCHAR,
|
action_value VARCHAR,
|
||||||
referer VARCHAR,
|
action_type VARCHAR,
|
||||||
script_name VARCHAR,
|
action_error VARCHAR,
|
||||||
query_string VARCHAR,
|
user_agent VARCHAR,
|
||||||
server_name VARCHAR,
|
referer VARCHAR,
|
||||||
http_host VARCHAR,
|
script_name VARCHAR,
|
||||||
http_accept VARCHAR,
|
query_string VARCHAR,
|
||||||
http_accept_charset VARCHAR,
|
server_name VARCHAR,
|
||||||
http_accept_encoding VARCHAR,
|
http_host VARCHAR,
|
||||||
session_id VARCHAR
|
http_accept VARCHAR,
|
||||||
|
http_accept_charset VARCHAR,
|
||||||
|
http_accept_encoding VARCHAR,
|
||||||
|
session_id VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_log.sql
|
-- END: table/edit_log.sql
|
||||||
-- START: table/edit_log_overflow.sql
|
-- START: table/edit_log_overflow.sql
|
||||||
@@ -707,15 +712,15 @@ ALTER TABLE edit_log_overflow ADD CONSTRAINT edit_log_overflow_euid_fkey FOREIGN
|
|||||||
|
|
||||||
-- DROP TABLE edit_access;
|
-- DROP TABLE edit_access;
|
||||||
CREATE TABLE edit_access (
|
CREATE TABLE edit_access (
|
||||||
edit_access_id SERIAL PRIMARY KEY,
|
edit_access_id SERIAL PRIMARY KEY,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
protected SMALLINT DEFAULT 0,
|
protected SMALLINT DEFAULT 0,
|
||||||
deleted SMALLINT DEFAULT 0,
|
deleted SMALLINT DEFAULT 0,
|
||||||
uid VARCHAR,
|
uid VARCHAR,
|
||||||
name VARCHAR UNIQUE,
|
name VARCHAR UNIQUE,
|
||||||
description VARCHAR,
|
description VARCHAR,
|
||||||
color VARCHAR,
|
color VARCHAR,
|
||||||
additional_acl JSONB
|
additional_acl JSONB
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_access.sql
|
-- END: table/edit_access.sql
|
||||||
-- START: table/edit_access_user.sql
|
-- START: table/edit_access_user.sql
|
||||||
@@ -728,15 +733,15 @@ CREATE TABLE edit_access (
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_user;
|
-- DROP TABLE edit_access_user;
|
||||||
CREATE TABLE edit_access_user (
|
CREATE TABLE edit_access_user (
|
||||||
edit_access_user_id SERIAL PRIMARY KEY,
|
edit_access_user_id SERIAL PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_user_id INT NOT NULL,
|
edit_user_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_default SMALLINT DEFAULT 0,
|
edit_default SMALLINT DEFAULT 0,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0
|
enabled SMALLINT NOT NULL DEFAULT 0
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
-- END: table/edit_access_user.sql
|
-- END: table/edit_access_user.sql
|
||||||
-- START: table/edit_access_data.sql
|
-- START: table/edit_access_data.sql
|
||||||
@@ -749,12 +754,12 @@ CREATE TABLE edit_access_user (
|
|||||||
|
|
||||||
-- DROP TABLE edit_access_data;
|
-- DROP TABLE edit_access_data;
|
||||||
CREATE TABLE edit_access_data (
|
CREATE TABLE edit_access_data (
|
||||||
edit_access_data_id SERIAL PRIMARY KEY,
|
edit_access_data_id SERIAL PRIMARY KEY,
|
||||||
edit_access_id INT NOT NULL,
|
edit_access_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
value VARCHAR
|
value VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
-- create a unique index for each attached data block for each edit access can
|
-- create a unique index for each attached data block for each edit access can
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ final class CoreLibsCreateUidsTest extends TestCase
|
|||||||
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
||||||
*
|
*
|
||||||
* @covers ::uuidv4
|
* @covers ::uuidv4
|
||||||
|
* @covers ::validateUuidv4
|
||||||
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -129,13 +130,18 @@ final class CoreLibsCreateUidsTest extends TestCase
|
|||||||
{
|
{
|
||||||
$uuid = \CoreLibs\Create\Uids::uuidv4();
|
$uuid = \CoreLibs\Create\Uids::uuidv4();
|
||||||
$this->assertMatchesRegularExpression(
|
$this->assertMatchesRegularExpression(
|
||||||
'/^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$/',
|
'/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/',
|
||||||
$uuid
|
$uuid,
|
||||||
|
'Failed regex check'
|
||||||
|
);
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Create\Uids::validateUuuidv4($uuid),
|
||||||
|
'Failed validate regex method'
|
||||||
|
);
|
||||||
|
$this->assertFalse(
|
||||||
|
\CoreLibs\Create\Uids::validateUuuidv4('not-a-uuidv4'),
|
||||||
|
'Failed wrong uuid validated as true'
|
||||||
);
|
);
|
||||||
// $this->assertStringMatchesFormat(
|
|
||||||
// '%4s%4s-%4s-%4s-%4s-%4s%4s%4s',
|
|
||||||
// $uuid
|
|
||||||
// );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -160,15 +160,12 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
// create the tables
|
// create the tables
|
||||||
$db->dbExec(
|
$db->dbExec(
|
||||||
// primary key name is table + '_id'
|
// primary key name is table + '_id'
|
||||||
|
// table_with_primary_key_id SERIAL PRIMARY KEY,
|
||||||
<<<SQL
|
<<<SQL
|
||||||
CREATE TABLE table_with_primary_key (
|
CREATE TABLE table_with_primary_key (
|
||||||
table_with_primary_key_id SERIAL PRIMARY KEY,
|
table_with_primary_key_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||||
$base_table
|
$base_table
|
||||||
SQL
|
SQL
|
||||||
/* "CREATE TABLE table_with_primary_key ("
|
|
||||||
// primary key name is table + '_id'
|
|
||||||
. "table_with_primary_key_id SERIAL PRIMARY KEY, "
|
|
||||||
. $base_table */
|
|
||||||
);
|
);
|
||||||
$db->dbExec(
|
$db->dbExec(
|
||||||
<<<SQL
|
<<<SQL
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
-- 20241203: update edit tables
|
||||||
|
ALTER TABLE edit_generic ADD cuuid UUID DEFAULT gen_random_uuid();
|
||||||
|
ALTER TABLE edit_log ADD ecuid VARCHAR;
|
||||||
|
ALTER TABLE edit_log ADD ecuuid VARCHAR;
|
||||||
|
ALTER TABLE edit_log ADD action_sub_id VARCHAR;
|
||||||
|
|
||||||
|
-- update set_edit_gneric
|
||||||
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
random_length INT = 25; -- that should be long enough
|
||||||
|
BEGIN
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
NEW.date_created := 'now';
|
||||||
|
NEW.cuid := random_string(random_length);
|
||||||
|
NEW.cuuid := gen_random_uuid();
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
NEW.date_updated := 'now';
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -42,6 +42,20 @@ $backend = new CoreLibs\Admin\Backend(
|
|||||||
$l10n,
|
$l10n,
|
||||||
DEFAULT_ACL_LEVEL
|
DEFAULT_ACL_LEVEL
|
||||||
);
|
);
|
||||||
|
$login = new CoreLibs\ACL\Login(
|
||||||
|
$db,
|
||||||
|
$log,
|
||||||
|
$session,
|
||||||
|
[
|
||||||
|
'auto_login' => false,
|
||||||
|
'default_acl_level' => DEFAULT_ACL_LEVEL,
|
||||||
|
'logout_target' => '',
|
||||||
|
'site_locale' => SITE_LOCALE,
|
||||||
|
'site_domain' => SITE_DOMAIN,
|
||||||
|
'site_encoding' => SITE_ENCODING,
|
||||||
|
'locale_path' => BASE . INCLUDES . LOCALE,
|
||||||
|
]
|
||||||
|
);
|
||||||
use CoreLibs\Debug\Support;
|
use CoreLibs\Debug\Support;
|
||||||
|
|
||||||
$PAGE_NAME = 'TEST CLASS: ADMIN BACKEND';
|
$PAGE_NAME = 'TEST CLASS: ADMIN BACKEND';
|
||||||
@@ -55,10 +69,30 @@ print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
|||||||
print "SETACL[]: <br>";
|
print "SETACL[]: <br>";
|
||||||
$backend->setACL(['EMPTY' => 'EMPTY']);
|
$backend->setACL(['EMPTY' => 'EMPTY']);
|
||||||
print "ADBEDITLOG: <br>";
|
print "ADBEDITLOG: <br>";
|
||||||
$backend->adbEditLog('CLASSTEST-ADMIN-BINARY', 'Some info string', 'BINARY');
|
$login->writeLog(
|
||||||
$backend->adbEditLog('CLASSTEST-ADMIN-ZLIB', 'Some info string', 'ZLIB');
|
'CLASSTEST-ADMIN-BINARY',
|
||||||
$backend->adbEditLog('CLASSTEST-ADMIN-SERIAL', 'Some info string', 'SERIAL');
|
'Some info string',
|
||||||
$backend->adbEditLog('CLASSTEST-ADMIN-INVALID', 'Some info string', 'INVALID');
|
$backend->adbGetActionSet(),
|
||||||
|
write_type:'BINARY'
|
||||||
|
);
|
||||||
|
$login->writeLog(
|
||||||
|
'CLASSTEST-ADMIN-ZLIB',
|
||||||
|
'Some info string',
|
||||||
|
$backend->adbGetActionSet(),
|
||||||
|
write_type:'ZLIB'
|
||||||
|
);
|
||||||
|
$login->writeLog(
|
||||||
|
'CLASSTEST-ADMIN-SERIAL',
|
||||||
|
'Some info string',
|
||||||
|
$backend->adbGetActionSet(),
|
||||||
|
write_type:'SERIAL'
|
||||||
|
);
|
||||||
|
$login->writeLog(
|
||||||
|
'CLASSTEST-ADMIN-INVALID',
|
||||||
|
'Some info string',
|
||||||
|
$backend->adbGetActionSet(),
|
||||||
|
write_type:'INVALID'
|
||||||
|
);
|
||||||
// test with various
|
// test with various
|
||||||
$backend->action = 'TEST ACTION';
|
$backend->action = 'TEST ACTION';
|
||||||
$backend->action_id = 'TEST ACTION ID';
|
$backend->action_id = 'TEST ACTION ID';
|
||||||
@@ -69,10 +103,10 @@ $backend->action_loaded = 'TEST ACTION LOADED';
|
|||||||
$backend->action_value = 'TEST ACTION VALUE';
|
$backend->action_value = 'TEST ACTION VALUE';
|
||||||
$backend->action_type = 'TEST ACTION TYPE';
|
$backend->action_type = 'TEST ACTION TYPE';
|
||||||
$backend->action_error = 'TEST ACTION ERROR';
|
$backend->action_error = 'TEST ACTION ERROR';
|
||||||
$backend->adbEditLog('CLASSTEST-ADMIN-JSON', [
|
$login->writeLog('CLASSTEST-ADMIN-JSON', [
|
||||||
"_GET" => $_GET,
|
"_GET" => $_GET,
|
||||||
"_POST" => $_POST,
|
"_POST" => $_POST,
|
||||||
], 'JSON');
|
], $backend->adbGetActionSet(), write_type:'JSON');
|
||||||
|
|
||||||
print "ADBTOPMENU(0): " . Support::printAr($backend->adbTopMenu(CONTENT_PATH)) . "<br>";
|
print "ADBTOPMENU(0): " . Support::printAr($backend->adbTopMenu(CONTENT_PATH)) . "<br>";
|
||||||
print "ADBMSG: <br>";
|
print "ADBMSG: <br>";
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ print "PREPARE INSERT PREVIOUS INSERTED: "
|
|||||||
|
|
||||||
print "PREPARE CURSOR RETURN:<br>";
|
print "PREPARE CURSOR RETURN:<br>";
|
||||||
foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) {
|
foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) {
|
||||||
print "KEY: " . $key . ': ' . $db->dbGetPrepareCursorValue('ins_test_foo', $key) . "<br>";
|
print "KEY: " . $key . ': ' . Support::prAr($db->dbGetPrepareCursorValue('ins_test_foo', $key)) . "<br>";
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = <<<SQL
|
$query = <<<SQL
|
||||||
|
|||||||
@@ -58,4 +58,16 @@ echo "ACL: " . \CoreLibs\Debug\Support::printAr($login->loginGetAcl()) . "<br>";
|
|||||||
echo "ACL (MIN): " . \CoreLibs\Debug\Support::printAr($login->loginGetAcl()['min'] ?? []) . "<br>";
|
echo "ACL (MIN): " . \CoreLibs\Debug\Support::printAr($login->loginGetAcl()['min'] ?? []) . "<br>";
|
||||||
echo "LOCALE: " . \CoreLibs\Debug\Support::printAr($login->loginGetLocale()) . "<br>";
|
echo "LOCALE: " . \CoreLibs\Debug\Support::printAr($login->loginGetLocale()) . "<br>";
|
||||||
|
|
||||||
|
echo "ECUID: " . $login->loginGetEcuid() . "<br>";
|
||||||
|
echo "ECUUID: " . $login->loginGetEcuuid() . "<br>";
|
||||||
|
|
||||||
|
$login->writeLog(
|
||||||
|
'TEST LOG',
|
||||||
|
[
|
||||||
|
'test' => 'TEST A'
|
||||||
|
],
|
||||||
|
error:'No Error',
|
||||||
|
write_type:'JSON'
|
||||||
|
);
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|||||||
@@ -205,6 +205,9 @@ print "HOST: " . HOST_NAME . " => DB HOST: " . DB_CONFIG_NAME . " => " . Support
|
|||||||
print "DS is: " . DIRECTORY_SEPARATOR . "<br>";
|
print "DS is: " . DIRECTORY_SEPARATOR . "<br>";
|
||||||
print "SERVER HOST: " . $_SERVER['HTTP_HOST'] . "<br>";
|
print "SERVER HOST: " . $_SERVER['HTTP_HOST'] . "<br>";
|
||||||
|
|
||||||
|
print "ECUID: " . $_SESSION['ECUID'] . "<br>";
|
||||||
|
print "ECUUID: " . $_SESSION['ECUUID'] . "<br>";
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
# __END__
|
# __END__
|
||||||
|
|||||||
@@ -52,6 +52,14 @@ print "S:UNIQID (512): " . Uids::uniqId(512) . "<br>";
|
|||||||
// uniq ids
|
// uniq ids
|
||||||
print "UNIQU ID SHORT : " . Uids::uniqIdShort() . "<br>";
|
print "UNIQU ID SHORT : " . Uids::uniqIdShort() . "<br>";
|
||||||
print "UNIQU ID LONG : " . Uids::uniqIdLong() . "<br>";
|
print "UNIQU ID LONG : " . Uids::uniqIdLong() . "<br>";
|
||||||
|
// validate
|
||||||
|
$uuidv4 = Uids::uuidv4();
|
||||||
|
if (!Uids::validateUuuidv4($uuidv4)) {
|
||||||
|
print "Invalid UUIDv4: " . $uuidv4 . "<br>";
|
||||||
|
}
|
||||||
|
if (!Uids::validateUuuidv4("foobar")) {
|
||||||
|
print "Invalid UUIDv4: hard coded<Br>";
|
||||||
|
}
|
||||||
|
|
||||||
// DEPRECATED
|
// DEPRECATED
|
||||||
/* print "D/UUIDV4: ".$basic->uuidv4()."<br>";
|
/* print "D/UUIDV4: ".$basic->uuidv4()."<br>";
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ $data = [
|
|||||||
// log action
|
// log action
|
||||||
// no log if login
|
// no log if login
|
||||||
if (!$login->loginActionRun()) {
|
if (!$login->loginActionRun()) {
|
||||||
$cms->adbEditLog('Submit', $data, 'BINARY');
|
$login->writeLog('Submit', $data, $cms->adbGetActionSet(), 'BINARY');
|
||||||
}
|
}
|
||||||
//------------------------------ logging end
|
//------------------------------ logging end
|
||||||
|
|
||||||
|
|||||||
@@ -69,12 +69,17 @@ declare(strict_types=1);
|
|||||||
namespace CoreLibs\ACL;
|
namespace CoreLibs\ACL;
|
||||||
|
|
||||||
use CoreLibs\Security\Password;
|
use CoreLibs\Security\Password;
|
||||||
|
use CoreLibs\Create\Uids;
|
||||||
use CoreLibs\Convert\Json;
|
use CoreLibs\Convert\Json;
|
||||||
|
|
||||||
class Login
|
class Login
|
||||||
{
|
{
|
||||||
/** @var ?int the user id var*/
|
/** @var ?int the user id var*/
|
||||||
private ?int $euid;
|
private ?int $euid;
|
||||||
|
/** @var ?string the user cuid (note will be super seeded with uuid v4 later) */
|
||||||
|
private ?string $ecuid;
|
||||||
|
/** @var ?string UUIDv4, will superseed the ecuid and replace euid as login id */
|
||||||
|
private ?string $ecuuid;
|
||||||
/** @var string _GET/_POST loginUserId parameter for non password login */
|
/** @var string _GET/_POST loginUserId parameter for non password login */
|
||||||
private string $login_user_id = '';
|
private string $login_user_id = '';
|
||||||
/** @var string source, either _GET or _POST or empty */
|
/** @var string source, either _GET or _POST or empty */
|
||||||
@@ -193,6 +198,12 @@ class Login
|
|||||||
/** @var bool */
|
/** @var bool */
|
||||||
private bool $login_is_ajax_page = false;
|
private bool $login_is_ajax_page = false;
|
||||||
|
|
||||||
|
// logging
|
||||||
|
/** @var array<string> list of allowed types for edit log write */
|
||||||
|
private const WRITE_TYPES = ['BINARY', 'BZIP2', 'LZIP', 'STRING', 'SERIAL', 'JSON'];
|
||||||
|
/** @var array<string> list of available write types for log */
|
||||||
|
private array $write_types_available = [];
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
/** @var array<string,mixed> options */
|
/** @var array<string,mixed> options */
|
||||||
private array $options = [];
|
private array $options = [];
|
||||||
@@ -379,6 +390,8 @@ class Login
|
|||||||
$_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list;
|
$_SESSION['DEFAULT_ACL_LIST'] = $this->default_acl_list;
|
||||||
$_SESSION['DEFAULT_ACL_LIST_TYPE'] = $this->default_acl_list_type;
|
$_SESSION['DEFAULT_ACL_LIST_TYPE'] = $this->default_acl_list_type;
|
||||||
|
|
||||||
|
$this->loginSetEditLogWriteTypeAvailable();
|
||||||
|
|
||||||
// this will be deprecated
|
// this will be deprecated
|
||||||
if ($this->options['auto_login'] === true) {
|
if ($this->options['auto_login'] === true) {
|
||||||
$this->loginMainCall();
|
$this->loginMainCall();
|
||||||
@@ -757,7 +770,7 @@ class Login
|
|||||||
}
|
}
|
||||||
// have to get the global stuff here for setting it later
|
// have to get the global stuff here for setting it later
|
||||||
// we have to get the themes in here too
|
// we have to get the themes in here too
|
||||||
$q = "SELECT eu.edit_user_id, eu.username, eu.password, "
|
$q = "SELECT eu.edit_user_id, eu.cuid, eu.cuuid, eu.username, eu.password, "
|
||||||
. "eu.edit_group_id, "
|
. "eu.edit_group_id, "
|
||||||
. "eg.name AS edit_group_name, eu.admin, "
|
. "eg.name AS edit_group_name, eu.admin, "
|
||||||
// additinal acl lists
|
// additinal acl lists
|
||||||
@@ -889,6 +902,8 @@ class Login
|
|||||||
// normal user processing
|
// normal user processing
|
||||||
// set class var and session var
|
// set class var and session var
|
||||||
$_SESSION['EUID'] = $this->euid = (int)$res['edit_user_id'];
|
$_SESSION['EUID'] = $this->euid = (int)$res['edit_user_id'];
|
||||||
|
$_SESSION['ECUID'] = $this->ecuid = (string)$res['cuid'];
|
||||||
|
$_SESSION['ECUUID'] = $this->ecuuid = (string)$res['cuuid'];
|
||||||
// check if user is okay
|
// check if user is okay
|
||||||
$this->loginCheckPermissions();
|
$this->loginCheckPermissions();
|
||||||
if ($this->login_error == 0) {
|
if ($this->login_error == 0) {
|
||||||
@@ -1132,6 +1147,9 @@ class Login
|
|||||||
// username (login), group name
|
// username (login), group name
|
||||||
$this->acl['user_name'] = $_SESSION['USER_NAME'];
|
$this->acl['user_name'] = $_SESSION['USER_NAME'];
|
||||||
$this->acl['group_name'] = $_SESSION['GROUP_NAME'];
|
$this->acl['group_name'] = $_SESSION['GROUP_NAME'];
|
||||||
|
// edit user cuid
|
||||||
|
$this->acl['ecuid'] = $_SESSION['ECUID'];
|
||||||
|
$this->acl['ecuuid'] = $_SESSION['ECUUID'];
|
||||||
// set additional acl
|
// set additional acl
|
||||||
$this->acl['additional_acl'] = [
|
$this->acl['additional_acl'] = [
|
||||||
'user' => $_SESSION['USER_ADDITIONAL_ACL'],
|
'user' => $_SESSION['USER_ADDITIONAL_ACL'],
|
||||||
@@ -1425,7 +1443,7 @@ class Login
|
|||||||
$data = 'Illegal user for password change: ' . $this->pw_username;
|
$data = 'Illegal user for password change: ' . $this->pw_username;
|
||||||
}
|
}
|
||||||
// log this password change attempt
|
// log this password change attempt
|
||||||
$this->writeLog($event, $data, $this->login_error, $this->pw_username);
|
$this->writeEditLog($event, $data, $this->login_error, $this->pw_username);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1566,7 +1584,7 @@ class Login
|
|||||||
$username = $res['username'];
|
$username = $res['username'];
|
||||||
}
|
}
|
||||||
} // if euid is set, get username (or try)
|
} // if euid is set, get username (or try)
|
||||||
$this->writeLog($event, '', $this->login_error, $username);
|
$this->writeEditLog($event, '', $this->login_error, $username);
|
||||||
} // write log under certain settings
|
} // write log under certain settings
|
||||||
// now close DB connection
|
// now close DB connection
|
||||||
// $this->error_msg = $this->_login();
|
// $this->error_msg = $this->_login();
|
||||||
@@ -1722,6 +1740,8 @@ HTML;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: LOGGING
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* writes detailed data into the edit user log table (keep log what user does)
|
* writes detailed data into the edit user log table (keep log what user does)
|
||||||
*
|
*
|
||||||
@@ -1731,7 +1751,7 @@ HTML;
|
|||||||
* @param string $username login user username
|
* @param string $username login user username
|
||||||
* @return void has no return
|
* @return void has no return
|
||||||
*/
|
*/
|
||||||
private function writeLog(
|
private function writeEditLog(
|
||||||
string $event,
|
string $event,
|
||||||
string $data,
|
string $data,
|
||||||
string|int $error = '',
|
string|int $error = '',
|
||||||
@@ -1749,50 +1769,191 @@ HTML;
|
|||||||
'_GET' => $_GET,
|
'_GET' => $_GET,
|
||||||
'_POST' => $_POST,
|
'_POST' => $_POST,
|
||||||
'_FILES' => $_FILES,
|
'_FILES' => $_FILES,
|
||||||
'error' => $this->login_error
|
'error' => $this->login_error,
|
||||||
|
'data' => $data,
|
||||||
];
|
];
|
||||||
$data_binary = $this->db->dbEscapeBytea((string)bzcompress(serialize($_data_binary)));
|
$_action_set = [
|
||||||
// SQL querie for log entry
|
'action' => $this->action,
|
||||||
$q = "INSERT INTO edit_log "
|
'action_id' => $this->username,
|
||||||
. "(username, password, euid, event_date, event, error, data, data_binary, page, "
|
'action_flag' => (string)$this->login_error,
|
||||||
. "ip, user_agent, referer, script_name, query_string, server_name, http_host, "
|
'action_value' => (string)$this->permission_okay,
|
||||||
. "http_accept, http_accept_charset, http_accept_encoding, session_id, "
|
];
|
||||||
. "action, action_id, action_yes, action_flag, action_menu, action_loaded, "
|
|
||||||
. "action_value, action_error) "
|
$this->writeLog($event, $_data_binary, $_action_set, $error, $username);
|
||||||
. "VALUES ('" . $this->db->dbEscapeString($username) . "', 'PASSWORD', "
|
}
|
||||||
. ($this->euid ? $this->euid : 'NULL') . ", "
|
|
||||||
. "NOW(), '" . $this->db->dbEscapeString($event) . "', "
|
/**
|
||||||
. "'" . $this->db->dbEscapeString((string)$error) . "', "
|
* writes all action vars plus other info into edit_log table
|
||||||
. "'" . $this->db->dbEscapeString($data) . "', '" . $data_binary . "', "
|
* this is for public class
|
||||||
. "'" . $this->page_name . "', ";
|
*
|
||||||
foreach (
|
* phpcs:disable Generic.Files.LineLength
|
||||||
[
|
* @param string $event [default=''] any kind of event description,
|
||||||
'REMOTE_ADDR', 'HTTP_USER_AGENT', 'HTTP_REFERER', 'SCRIPT_FILENAME',
|
* @param string|array<mixed> $data [default=''] any kind of data related to that event
|
||||||
'QUERY_STRING', 'SERVER_NAME', 'HTTP_HOST', 'HTTP_ACCEPT',
|
* @param array{action?:?string,action_id?:null|string|int,action_sub_id?:null|string|int,action_yes?:null|string|int|bool,action_flag?:?string,action_menu?:?string,action_loaded?:?string,action_value?:?string,action_type?:?string,action_error?:?string} $action_set [default=[]] action set names
|
||||||
'HTTP_ACCEPT_CHARSET', 'HTTP_ACCEPT_ENCODING'
|
* @param string|int $error error id (mostly an int)
|
||||||
] as $server_code
|
* @param string $write_type [default=JSON] write type can be
|
||||||
) {
|
* JSON, STRING/SERIEAL, BINARY/BZIP or ZLIB
|
||||||
if (array_key_exists($server_code, $_SERVER)) {
|
* @param string|null $db_schema [default=null] override target schema
|
||||||
$q .= "'" . $this->db->dbEscapeString($_SERVER[$server_code]) . "', ";
|
* @return void
|
||||||
} else {
|
* phpcs:enable Generic.Files.LineLength
|
||||||
$q .= "NULL, ";
|
*/
|
||||||
}
|
public function writeLog(
|
||||||
|
string $event = '',
|
||||||
|
string|array $data = '',
|
||||||
|
array $action_set = [],
|
||||||
|
string|int $error = '',
|
||||||
|
string $username = '',
|
||||||
|
string $write_type = 'JSON',
|
||||||
|
?string $db_schema = null
|
||||||
|
): void {
|
||||||
|
$data_binary = '';
|
||||||
|
$data_write = '';
|
||||||
|
|
||||||
|
// check if write type is valid, if not fallback to JSON
|
||||||
|
if (!in_array(strtoupper($write_type), $this->write_types_available)) {
|
||||||
|
$this->log->warning('Write type not in allowed array, fallback to JSON', context:[
|
||||||
|
"write_type" => $write_type,
|
||||||
|
"write_list" => $this->write_types_available,
|
||||||
|
]);
|
||||||
|
$write_type = 'JSON';
|
||||||
|
}
|
||||||
|
switch ($write_type) {
|
||||||
|
case 'BINARY':
|
||||||
|
case 'BZIP':
|
||||||
|
$data_binary = $this->db->dbEscapeBytea((string)bzcompress(serialize($data)));
|
||||||
|
$data_write = Json::jsonConvertArrayTo([
|
||||||
|
'type' => 'BZIP',
|
||||||
|
'message' => 'see bzip compressed data_binary field'
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
case 'ZLIB':
|
||||||
|
$data_binary = $this->db->dbEscapeBytea((string)gzcompress(serialize($data)));
|
||||||
|
$data_write = Json::jsonConvertArrayTo([
|
||||||
|
'type' => 'ZLIB',
|
||||||
|
'message' => 'see zlib compressed data_binary field'
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
case 'STRING':
|
||||||
|
case 'SERIAL':
|
||||||
|
$data_binary = $this->db->dbEscapeBytea(Json::jsonConvertArrayTo([
|
||||||
|
'type' => 'SERIAL',
|
||||||
|
'message' => 'see serial string data field'
|
||||||
|
]));
|
||||||
|
$data_write = serialize($data);
|
||||||
|
break;
|
||||||
|
case 'JSON':
|
||||||
|
$data_binary = $this->db->dbEscapeBytea(Json::jsonConvertArrayTo([
|
||||||
|
'type' => 'JSON',
|
||||||
|
'message' => 'see json string data field'
|
||||||
|
]));
|
||||||
|
// must be converted to array
|
||||||
|
if (!is_array($data)) {
|
||||||
|
$data = ["data" => $data];
|
||||||
|
}
|
||||||
|
$data_write = Json::jsonConvertArrayTo($data);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$this->log->alert('Invalid type for data compression was set', context:[
|
||||||
|
"write_type" => $write_type
|
||||||
|
]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var string $DB_SCHEMA check schema */
|
||||||
|
$DB_SCHEMA = 'public';
|
||||||
|
if ($db_schema !== null) {
|
||||||
|
$DB_SCHEMA = $db_schema;
|
||||||
|
} elseif (!empty($this->db->dbGetSchema())) {
|
||||||
|
$DB_SCHEMA = $this->db->dbGetSchema();
|
||||||
|
}
|
||||||
|
$q = <<<SQL
|
||||||
|
INSERT INTO {DB_SCHEMA}.edit_log (
|
||||||
|
username, euid, ecuid, ecuuid, event_date, event, error, data, data_binary, page,
|
||||||
|
ip, user_agent, referer, script_name, query_string, server_name, http_host,
|
||||||
|
http_accept, http_accept_charset, http_accept_encoding, session_id,
|
||||||
|
action, action_id, action_sub_id, action_yes, action_flag, action_menu, action_loaded,
|
||||||
|
action_value, action_type, action_error
|
||||||
|
) VALUES (
|
||||||
|
$1, $2, $3, $4, NOW(), $5, $6, $7, $8, $9,
|
||||||
|
$10, $11, $12, $13, $14, $15, $16,
|
||||||
|
$17, $18, $19, $20,
|
||||||
|
$21, $22, $23, $24, $25, $26, $27,
|
||||||
|
$28, $29, $30
|
||||||
|
)
|
||||||
|
SQL;
|
||||||
|
$this->db->dbExecParams(
|
||||||
|
str_replace(
|
||||||
|
['{DB_SCHEMA}'],
|
||||||
|
[$DB_SCHEMA],
|
||||||
|
$q
|
||||||
|
),
|
||||||
|
[
|
||||||
|
// row 1
|
||||||
|
empty($username) ? $_SESSION['USER_NAME'] ?? '' : $username,
|
||||||
|
!empty($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ?
|
||||||
|
$_SESSION['EUID'] : null,
|
||||||
|
!empty($_SESSION['ECUID']) && is_string($_SESSION['ECUID']) ?
|
||||||
|
$_SESSION['ECUID'] : null,
|
||||||
|
!empty($_SESSION['ECUUID']) && Uids::validateUuuidv4($_SESSION['ECUUID']) ?
|
||||||
|
$_SESSION['ECUUID'] : null,
|
||||||
|
(string)$event,
|
||||||
|
(string)$error,
|
||||||
|
$data_write,
|
||||||
|
$data_binary,
|
||||||
|
(string)$this->page_name,
|
||||||
|
// row 2
|
||||||
|
$_SERVER["REMOTE_ADDR"] ?? null,
|
||||||
|
$_SERVER['HTTP_USER_AGENT'] ?? null,
|
||||||
|
$_SERVER['HTTP_REFERER'] ?? null,
|
||||||
|
$_SERVER['SCRIPT_FILENAME'] ?? null,
|
||||||
|
$_SERVER['QUERY_STRING'] ?? null,
|
||||||
|
$_SERVER['SERVER_NAME'] ?? null,
|
||||||
|
$_SERVER['HTTP_HOST'] ?? null,
|
||||||
|
// row 3
|
||||||
|
$_SERVER['HTTP_ACCEPT'] ?? null,
|
||||||
|
$_SERVER['HTTP_ACCEPT_CHARSET'] ?? null,
|
||||||
|
$_SERVER['HTTP_ACCEPT_ENCODING'] ?? null,
|
||||||
|
$this->session->getSessionId() !== false ?
|
||||||
|
$this->session->getSessionId() : null,
|
||||||
|
// row 4
|
||||||
|
$action_set['action'] ?? null,
|
||||||
|
$action_set['action_id'] ?? null,
|
||||||
|
$action_set['action_sub_id'] ?? null,
|
||||||
|
$action_set['action_yes'] ?? null,
|
||||||
|
$action_set['action_flag'] ?? null,
|
||||||
|
$action_set['action_menu'] ?? null,
|
||||||
|
$action_set['action_loaded'] ?? null,
|
||||||
|
$action_set['action_value'] ?? null,
|
||||||
|
$action_set['action_type'] ?? null,
|
||||||
|
$action_set['action_error'] ?? null,
|
||||||
|
],
|
||||||
|
'NULL'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the write types that are allowed
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function loginSetEditLogWriteTypeAvailable()
|
||||||
|
{
|
||||||
|
// check what edit log data write types are allowed
|
||||||
|
$this->write_types_available = self::WRITE_TYPES;
|
||||||
|
if (!function_exists('bzcompress')) {
|
||||||
|
$this->write_types_available = array_diff($this->write_types_available, ['BINARY', 'BZIP']);
|
||||||
|
}
|
||||||
|
if (!function_exists('gzcompress')) {
|
||||||
|
$this->write_types_available = array_diff($this->write_types_available, ['LZIP']);
|
||||||
}
|
}
|
||||||
$q .= "'" . $this->session->getSessionId() . "', ";
|
|
||||||
$q .= "'" . $this->db->dbEscapeString($this->action) . "', ";
|
|
||||||
$q .= "'" . $this->db->dbEscapeString($this->username) . "', ";
|
|
||||||
$q .= "NULL, ";
|
|
||||||
$q .= "'" . $this->db->dbEscapeString((string)$this->login_error) . "', ";
|
|
||||||
$q .= "NULL, NULL, ";
|
|
||||||
$q .= "'" . $this->db->dbEscapeString((string)$this->permission_okay) . "', ";
|
|
||||||
$q .= "NULL)";
|
|
||||||
$this->db->dbExec($q, 'NULL');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// *************************************************************************
|
// *************************************************************************
|
||||||
// **** PUBLIC INTERNAL
|
// **** PUBLIC INTERNAL
|
||||||
// *************************************************************************
|
// *************************************************************************
|
||||||
|
|
||||||
|
// MARK: LOGIN CALL
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main call that needs to be run to actaully check for login
|
* Main call that needs to be run to actaully check for login
|
||||||
* If this is not called, no login checks are done, unless the class
|
* If this is not called, no login checks are done, unless the class
|
||||||
@@ -1862,6 +2023,9 @@ HTML;
|
|||||||
}
|
}
|
||||||
// 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) ? (int)$_SESSION['EUID'] : 0;
|
$this->euid = array_key_exists('EUID', $_SESSION) ? (int)$_SESSION['EUID'] : 0;
|
||||||
|
// TODO: allow load from cuid
|
||||||
|
// $this->ecuid = array_key_exists('ECUID', $_SESSION) ? (string)$_SESSION['ECUID'] : '';
|
||||||
|
// $this->ecuuid = array_key_exists('ECUUID', $_SESSION) ? (string)$_SESSION['ECUUID'] : '';
|
||||||
// get login vars, are so, can't be changed
|
// get login vars, are so, can't be changed
|
||||||
// prepare
|
// prepare
|
||||||
// pass on vars to Object vars
|
// pass on vars to Object vars
|
||||||
@@ -1942,6 +2106,8 @@ HTML;
|
|||||||
$this->loginSetAcl();
|
$this->loginSetAcl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: setters/getters
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns current set login_html content
|
* Returns current set login_html content
|
||||||
*
|
*
|
||||||
@@ -2111,6 +2277,8 @@ HTML;
|
|||||||
$this->session->sessionDestroy();
|
$this->session->sessionDestroy();
|
||||||
// unset euid
|
// unset euid
|
||||||
$this->euid = null;
|
$this->euid = null;
|
||||||
|
$this->ecuid = null;
|
||||||
|
$this->ecuuid = null;
|
||||||
// then prints the login screen again
|
// then prints the login screen again
|
||||||
$this->permission_okay = false;
|
$this->permission_okay = false;
|
||||||
}
|
}
|
||||||
@@ -2128,11 +2296,12 @@ HTML;
|
|||||||
if (empty($this->euid)) {
|
if (empty($this->euid)) {
|
||||||
return $this->permission_okay;
|
return $this->permission_okay;
|
||||||
}
|
}
|
||||||
|
// euid must match ecuid and ecuuid
|
||||||
// bail for previous wrong page match, eg if method is called twice
|
// bail for previous wrong page match, eg if method is called twice
|
||||||
if ($this->login_error == 103) {
|
if ($this->login_error == 103) {
|
||||||
return $this->permission_okay;
|
return $this->permission_okay;
|
||||||
}
|
}
|
||||||
$q = "SELECT ep.filename, "
|
$q = "SELECT ep.filename, eu.cuid, eu.cuuid, "
|
||||||
// base lock flags
|
// base lock flags
|
||||||
. "eu.deleted, eu.enabled, eu.locked, "
|
. "eu.deleted, eu.enabled, eu.locked, "
|
||||||
// date based lock
|
// date based lock
|
||||||
@@ -2198,6 +2367,9 @@ HTML;
|
|||||||
} else {
|
} else {
|
||||||
$this->login_error = 103;
|
$this->login_error = 103;
|
||||||
}
|
}
|
||||||
|
// set ECUID
|
||||||
|
$_SESSION['ECUID'] = $this->ecuid = (string)$res['cuid'];
|
||||||
|
$_SESSION['ECUUID'] = $this->ecuuid = (string)$res['cuuid'];
|
||||||
// if called from public, so we can check if the permissions are ok
|
// if called from public, so we can check if the permissions are ok
|
||||||
return $this->permission_okay;
|
return $this->permission_okay;
|
||||||
}
|
}
|
||||||
@@ -2503,6 +2675,26 @@ HTML;
|
|||||||
{
|
{
|
||||||
return (string)$this->euid;
|
return (string)$this->euid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current set ECUID (edit user cuid)
|
||||||
|
*
|
||||||
|
* @return string ECUID as string
|
||||||
|
*/
|
||||||
|
public function loginGetEcuid(): string
|
||||||
|
{
|
||||||
|
return (string)$this->ecuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current set ECUUID (edit user cuuid)
|
||||||
|
*
|
||||||
|
* @return string ECUUID as string
|
||||||
|
*/
|
||||||
|
public function loginGetEcuuid(): string
|
||||||
|
{
|
||||||
|
return (string)$this->ecuuid;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace CoreLibs\Admin;
|
namespace CoreLibs\Admin;
|
||||||
|
|
||||||
|
use CoreLibs\Create\Uids;
|
||||||
use CoreLibs\Convert\Json;
|
use CoreLibs\Convert\Json;
|
||||||
|
|
||||||
class Backend
|
class Backend
|
||||||
@@ -258,6 +259,27 @@ class Backend
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* return all the action data, if not set, sets entry to null
|
||||||
|
*
|
||||||
|
* @return array{action:?string,action_id:null|string|int,action_sub_id:null|string|int,action_yes:null|string|int|bool,action_flag:?string,action_menu:?string,action_loaded:?string,action_value:?string,action_type:?string,action_error:?string}
|
||||||
|
*/
|
||||||
|
public function adbGetActionSet(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'action' => $this->action ?? null,
|
||||||
|
'action_id' => $this->action_id ?? null,
|
||||||
|
'action_sub_id' => $this->action_sub_id ?? null,
|
||||||
|
'action_yes' => $this->action_yes ?? null,
|
||||||
|
'action_flag' => $this->action_flag ?? null,
|
||||||
|
'action_menu' => $this->action_menu ?? null,
|
||||||
|
'action_loaded' => $this->action_loaded ?? null,
|
||||||
|
'action_value' => $this->action_value ?? null,
|
||||||
|
'action_type' => $this->action_type ?? null,
|
||||||
|
'action_error' => $this->action_error ?? null,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* writes all action vars plus other info into edit_log table
|
* writes all action vars plus other info into edit_log table
|
||||||
*
|
*
|
||||||
@@ -267,6 +289,7 @@ class Backend
|
|||||||
* JSON, STRING/SERIEAL, BINARY/BZIP or ZLIB
|
* JSON, STRING/SERIEAL, BINARY/BZIP or ZLIB
|
||||||
* @param string|null $db_schema [default=null] override target schema
|
* @param string|null $db_schema [default=null] override target schema
|
||||||
* @return void
|
* @return void
|
||||||
|
* @deprecated Use $login->writeLog() and set action_set from ->adbGetActionSet()
|
||||||
*/
|
*/
|
||||||
public function adbEditLog(
|
public function adbEditLog(
|
||||||
string $event = '',
|
string $event = '',
|
||||||
@@ -335,17 +358,17 @@ class Backend
|
|||||||
}
|
}
|
||||||
$q = <<<SQL
|
$q = <<<SQL
|
||||||
INSERT INTO {DB_SCHEMA}.edit_log (
|
INSERT INTO {DB_SCHEMA}.edit_log (
|
||||||
euid, event_date, event, data, data_binary, page,
|
username, euid, ecuid, ecuuid, event_date, event, error, data, data_binary, page,
|
||||||
ip, user_agent, referer, script_name, query_string, server_name, http_host,
|
ip, user_agent, referer, script_name, query_string, server_name, http_host,
|
||||||
http_accept, http_accept_charset, http_accept_encoding, session_id,
|
http_accept, http_accept_charset, http_accept_encoding, session_id,
|
||||||
action, action_id, action_yes, action_flag, action_menu, action_loaded,
|
action, action_id, action_sub_id, action_yes, action_flag, action_menu, action_loaded,
|
||||||
action_value, action_type, action_error
|
action_value, action_type, action_error
|
||||||
) VALUES (
|
) VALUES (
|
||||||
$1, NOW(), $2, $3, $4, $5,
|
$1, $2, $3, $4, NOW(), $5, $6, $7, $8, $9,
|
||||||
$6, $7, $8, $9, $10, $11, $12,
|
$10, $11, $12, $13, $14, $15, $16,
|
||||||
$13, $14, $15, $16,
|
$17, $18, $19, $20,
|
||||||
$17, $18, $19, $20, $21, $22,
|
$21, $22, $23, $24, $25, $26, $27,
|
||||||
$23, $24, $25
|
$28, $29, $30
|
||||||
)
|
)
|
||||||
SQL;
|
SQL;
|
||||||
$this->db->dbExecParams(
|
$this->db->dbExecParams(
|
||||||
@@ -356,9 +379,15 @@ class Backend
|
|||||||
),
|
),
|
||||||
[
|
[
|
||||||
// row 1
|
// row 1
|
||||||
isset($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ?
|
'',
|
||||||
|
!empty($_SESSION['EUID']) && is_numeric($_SESSION['EUID']) ?
|
||||||
$_SESSION['EUID'] : null,
|
$_SESSION['EUID'] : null,
|
||||||
|
!empty($_SESSION['ECUID']) && is_string($_SESSION['ECUID']) ?
|
||||||
|
$_SESSION['ECUID'] : null,
|
||||||
|
!empty($_SESSION['ECUUID']) && Uids::validateUuuidv4($_SESSION['ECUID']) ?
|
||||||
|
$_SESSION['ECUID'] : null,
|
||||||
(string)$event,
|
(string)$event,
|
||||||
|
'',
|
||||||
$data_write,
|
$data_write,
|
||||||
$data_binary,
|
$data_binary,
|
||||||
(string)$this->page_name,
|
(string)$this->page_name,
|
||||||
@@ -379,6 +408,7 @@ class Backend
|
|||||||
// row 4
|
// row 4
|
||||||
$this->action ?? '',
|
$this->action ?? '',
|
||||||
$this->action_id ?? '',
|
$this->action_id ?? '',
|
||||||
|
$this->action_sub_id ?? '',
|
||||||
$this->action_yes ?? '',
|
$this->action_yes ?? '',
|
||||||
$this->action_flag ?? '',
|
$this->action_flag ?? '',
|
||||||
$this->action_menu ?? '',
|
$this->action_menu ?? '',
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class HSB implements Interface\CoordinatesInterface
|
|||||||
private float $B = 0.0;
|
private float $B = 0.0;
|
||||||
|
|
||||||
/** @var string color space: either ok or cie */
|
/** @var string color space: either ok or cie */
|
||||||
private string $colorspace = '';
|
private string $colorspace = ''; /** @phpstan-ignore-line */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HSB (HSV) color coordinates
|
* HSB (HSV) color coordinates
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class HSL implements Interface\CoordinatesInterface
|
|||||||
/** @var float lightness (luminance) */
|
/** @var float lightness (luminance) */
|
||||||
private float $L = 0.0;
|
private float $L = 0.0;
|
||||||
|
|
||||||
/** @var string color space: either ok or cie */
|
/** @var string color space: either sRGB */
|
||||||
private string $colorspace = '';
|
private string $colorspace = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -56,26 +56,6 @@ class Uids
|
|||||||
*/
|
*/
|
||||||
public static function uuidv4(): string
|
public static function uuidv4(): string
|
||||||
{
|
{
|
||||||
/* return sprintf(
|
|
||||||
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
|
||||||
// 32 bits for "time_low"
|
|
||||||
mt_rand(0, 0xffff),
|
|
||||||
mt_rand(0, 0xffff),
|
|
||||||
// 16 bits for "time_mid"
|
|
||||||
mt_rand(0, 0xffff),
|
|
||||||
// 16 bits for "time_hi_and_version",
|
|
||||||
// four most significant bits holds version number 4
|
|
||||||
mt_rand(0, 0x0fff) | 0x4000,
|
|
||||||
// 16 bits, 8 bits for "clk_seq_hi_res",
|
|
||||||
// 8 bits for "clk_seq_low",
|
|
||||||
// two most significant bits holds zero and one for variant DCE1.1
|
|
||||||
mt_rand(0, 0x3fff) | 0x8000,
|
|
||||||
// 48 bits for "node"
|
|
||||||
mt_rand(0, 0xffff),
|
|
||||||
mt_rand(0, 0xffff),
|
|
||||||
mt_rand(0, 0xffff)
|
|
||||||
); */
|
|
||||||
|
|
||||||
$data = random_bytes(16);
|
$data = random_bytes(16);
|
||||||
assert(strlen($data) == 16);
|
assert(strlen($data) == 16);
|
||||||
|
|
||||||
@@ -93,6 +73,20 @@ class Uids
|
|||||||
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
|
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* regex validate uuid v4
|
||||||
|
*
|
||||||
|
* @param string $uuidv4
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function validateUuuidv4(string $uuidv4): bool
|
||||||
|
{
|
||||||
|
if (!preg_match("/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/", $uuidv4)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* creates a uniq id based on lengths
|
* creates a uniq id based on lengths
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -285,6 +285,22 @@ interface SqlFunctions
|
|||||||
*/
|
*/
|
||||||
public function __dbConnectionBusySocketWait(int $timeout_seconds = 3): bool;
|
public function __dbConnectionBusySocketWait(int $timeout_seconds = 3): bool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string $parameter
|
||||||
|
* @param bool $strip
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function __dbVersionInfo(string $parameter, bool $strip = true): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function __dbVersionInfoParameterList(): array;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -292,6 +308,13 @@ interface SqlFunctions
|
|||||||
*/
|
*/
|
||||||
public function __dbVersion(): string;
|
public function __dbVersion(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function __dbVersionNumeric(): int;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -306,6 +329,14 @@ interface SqlFunctions
|
|||||||
?int &$end = null
|
?int &$end = null
|
||||||
): ?array;
|
): ?array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string $parameter
|
||||||
|
* @return string|bool
|
||||||
|
*/
|
||||||
|
public function __dbParameter(string $parameter): string|bool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -343,6 +374,14 @@ interface SqlFunctions
|
|||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function __dbGetEncoding(): string;
|
public function __dbGetEncoding(): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @param string $query
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function __dbCountQueryParams(string $query): int;
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -407,17 +407,13 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
}
|
}
|
||||||
// no PK name given at all
|
// no PK name given at all
|
||||||
if (empty($pk_name)) {
|
if (empty($pk_name)) {
|
||||||
// if name is plurar, make it singular
|
|
||||||
// if (preg_match("/.*s$/i", $table))
|
|
||||||
// $table = substr($table, 0, -1);
|
|
||||||
// set pk_name to "id"
|
// set pk_name to "id"
|
||||||
$pk_name = $table . "_id";
|
$pk_name = $table . "_id";
|
||||||
}
|
}
|
||||||
$seq = ($schema ? $schema . '.' : '') . $table . "_" . $pk_name . "_seq";
|
$q = "SELECT CURRVAL(pg_get_serial_sequence($1, $2)) AS insert_id";
|
||||||
$q = "SELECT CURRVAL('$seq') AS insert_id";
|
|
||||||
// I have to do manually or I overwrite the original insert internal vars ...
|
// I have to do manually or I overwrite the original insert internal vars ...
|
||||||
if ($q = $this->__dbQuery($q)) {
|
if ($cursor = $this->__dbQueryParams($q, [$table, $pk_name])) {
|
||||||
if (is_array($res = $this->__dbFetchArray($q))) {
|
if (is_array($res = $this->__dbFetchArray($cursor))) {
|
||||||
list($id) = $res;
|
list($id) = $res;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@@ -451,26 +447,36 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
$table_prefix = $schema . '.';
|
$table_prefix = $schema . '.';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$params = [$table_prefix . $table];
|
||||||
|
$replace = ['', ''];
|
||||||
// read from table the PK name
|
// read from table the PK name
|
||||||
// faster primary key get
|
// faster primary key get
|
||||||
$q = "SELECT pg_attribute.attname AS column_name, "
|
$q = <<<SQL
|
||||||
. "format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type "
|
SELECT
|
||||||
. "FROM pg_index, pg_class, pg_attribute ";
|
pg_attribute.attname AS column_name,
|
||||||
|
format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS type
|
||||||
|
FROM pg_index, pg_class, pg_attribute{PG_NAMESPACE}
|
||||||
|
WHERE
|
||||||
|
-- regclass translates the OID to the name
|
||||||
|
pg_class.oid = $1::regclass AND
|
||||||
|
indrelid = pg_class.oid AND
|
||||||
|
pg_attribute.attrelid = pg_class.oid AND
|
||||||
|
pg_attribute.attnum = any(pg_index.indkey) AND
|
||||||
|
indisprimary
|
||||||
|
{NSPNAME}
|
||||||
|
SQL;
|
||||||
if ($schema) {
|
if ($schema) {
|
||||||
$q .= ", pg_namespace ";
|
$params[] = $schema;
|
||||||
|
$replace = [
|
||||||
|
", pg_namespace",
|
||||||
|
"AND pg_class.relnamespace = pg_namespace.oid AND nspname = $2"
|
||||||
|
];
|
||||||
}
|
}
|
||||||
$q .= "WHERE "
|
$cursor = $this->__dbQueryParams(str_replace(
|
||||||
// regclass translates the OID to the name
|
['{PG_NAMESPACE}', '{NSPNAME}'],
|
||||||
. "pg_class.oid = '" . $table_prefix . $table . "'::regclass AND "
|
$replace,
|
||||||
. "indrelid = pg_class.oid AND ";
|
$q
|
||||||
if ($schema) {
|
), $params);
|
||||||
$q .= "nspname = '" . $schema . "' AND "
|
|
||||||
. "pg_class.relnamespace = pg_namespace.oid AND ";
|
|
||||||
}
|
|
||||||
$q .= "pg_attribute.attrelid = pg_class.oid AND "
|
|
||||||
. "pg_attribute.attnum = any(pg_index.indkey) "
|
|
||||||
. "AND indisprimary";
|
|
||||||
$cursor = $this->__dbQuery($q);
|
|
||||||
if ($cursor !== false) {
|
if ($cursor !== false) {
|
||||||
$__db_fetch_array = $this->__dbFetchArray($cursor);
|
$__db_fetch_array = $this->__dbFetchArray($cursor);
|
||||||
if (!is_array($__db_fetch_array)) {
|
if (!is_array($__db_fetch_array)) {
|
||||||
@@ -895,11 +901,13 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
public function __dbSetSchema(string $db_schema): int
|
public function __dbSetSchema(string $db_schema): int
|
||||||
{
|
{
|
||||||
// check if schema actually exists
|
// check if schema actually exists
|
||||||
$query = "SELECT EXISTS("
|
$query = <<<SQL
|
||||||
. "SELECT 1 FROM information_schema.schemata "
|
SELECT EXISTS (
|
||||||
. "WHERE schema_name = " . $this->__dbEscapeLiteral($db_schema)
|
SELECT 1 FROM information_schema.schemata
|
||||||
. ")";
|
WHERE schema_name = $1
|
||||||
$cursor = $this->__dbQuery($query);
|
)
|
||||||
|
SQL;
|
||||||
|
$cursor = $this->__dbQueryParams($query, [$db_schema]);
|
||||||
// abort if execution fails
|
// abort if execution fails
|
||||||
if ($cursor === false) {
|
if ($cursor === false) {
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user