diff --git a/4dev/database/function/edit_set_group_uid.sql b/4dev/database/function/edit_set_group_uid.sql new file mode 100755 index 00000000..8f957bd0 --- /dev/null +++ b/4dev/database/function/edit_set_group_uid.sql @@ -0,0 +1,28 @@ +-- add uid add for edit_group table + +CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS +$$ + DECLARE + myrec RECORD; + v_uid VARCHAR; + BEGIN + -- skip if NEW.name is not set + IF NEW.name IS NOT NULL AND NEW.name <> '' THEN + -- use NEW.name as base, remove all spaces + -- name data is already unique, so we do not need to worry about this here + v_uid := REPLACE(NEW.name, ' ', ''); + IF TG_OP = 'INSERT' THEN + -- always set + NEW.uid := v_uid; + ELSIF TG_OP = 'UPDATE' THEN + -- check if not set, then set + SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id; + IF FOUND THEN + NEW.uid := v_uid; + END IF; + END IF; + END IF; + RETURN NEW; + END; +$$ + LANGUAGE 'plpgsql'; diff --git a/4dev/database/table/edit_user.sql b/4dev/database/table/edit_user.sql index 50ab8d03..e5f7c834 100644 --- a/4dev/database/table/edit_user.sql +++ b/4dev/database/table/edit_user.sql @@ -38,5 +38,10 @@ CREATE TABLE edit_user ( locked SMALLINT DEFAULT 0, 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_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested + password_reset_uid VARCHAR, -- the uid to access the password reset page additional_acl JSONB -- additional ACL as JSON string (can be set by other pages) ) INHERITS (edit_generic) WITHOUT OIDS; + +COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check'; +COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid'; diff --git a/4dev/database/trigger/trg_edit_group.sql b/4dev/database/trigger/trg_edit_group.sql index c53d277d..dea71524 100644 --- a/4dev/database/trigger/trg_edit_group.sql +++ b/4dev/database/trigger/trg_edit_group.sql @@ -2,3 +2,8 @@ DROP TRIGGER IF EXISTS trg_edit_group ON edit_group; CREATE TRIGGER trg_edit_group BEFORE INSERT OR UPDATE ON edit_group FOR EACH ROW EXECUTE PROCEDURE set_edit_generic(); + +DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group; +CREATE TRIGGER trg_set_edit_group_uid +BEFORE INSERT OR UPDATE ON edit_group +FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid(); diff --git a/www/configs/config.master.php b/www/configs/config.master.php index 6ff5d447..c8cd89cb 100644 --- a/www/configs/config.master.php +++ b/www/configs/config.master.php @@ -101,8 +101,23 @@ define('LOGOUT_TARGET', ''); define('PASSWORD_CHANGE', false); define('PASSWORD_FORGOT', false); // min/max password length -define('PASSWORD_MIN_LENGTH', 8); +define('PASSWORD_MIN_LENGTH', 9); define('PASSWORD_MAX_LENGTH', 255); +// defines allowed special characters +DEFINE('PASSWORD_SPECIAL_RANGE', '@$!%*?&'); +// password must have upper case, lower case, number, special +// comment out for not mandatory +DEFINE('PASSWORD_LOWER', '(?=.*[a-z])'); +DEFINE('PASSWORD_UPPER', '(?=.*[A-Z])'); +DEFINE('PASSWORD_NUMBER', '(?=.*\d)'); +DEFINE('PASSWORD_SPECIAL', "(?=.*[".PASSWORD_SPECIAL_RANGE."])"); +// define full regex +DEFINE('PASSWORD_REGEX', "/^". + (defined('PASSWORD_LOWER') ? PASSWORD_LOWER : ''). + (defined('PASSWORD_UPPER') ? PASSWORD_UPPER : ''). + (defined('PASSWORD_NUMBER') ? PASSWORD_NUMBER : ''). + (defined('PASSWORD_SPECIAL') ? PASSWORD_SPECIAL : ''). + "[A-Za-z\d".PASSWORD_SPECIAL_RANGE."]{".PASSWORD_MIN_LENGTH.",".PASSWORD_MAX_LENGTH."}$/"); /************* AJAX / ACCESS *************/ // ajax request type diff --git a/www/layout/admin/javascript/edit.jq.js b/www/layout/admin/javascript/edit.jq.js index 99de37de..fc4bacc8 100644 --- a/www/layout/admin/javascript/edit.jq.js +++ b/www/layout/admin/javascript/edit.jq.js @@ -607,7 +607,9 @@ function showActionIndicator(loc) el.id = 'indicator'; $('body').append(el); } else if (!$('#indicator').hasClass('progress')) { - $('#indicator').addClass('progress'); + // if I add a class it will not be hidden anymore + // hide it + $('#indicator').addClass('progress').hide(); } // indicator not visible if (!$('#indicator').is(':visible')) { @@ -772,7 +774,8 @@ function ael(base, attach, id = '') if (id) { // base id match already if (base.id == id) { - base.sub.push(Object.assign({}, attach)); + // base.sub.push(Object.assign({}, attach)); + base.sub.push(deepCopyFunction(attach)); } else { // sub check if (isObject(base.sub) && base.sub.length > 0) { @@ -783,7 +786,8 @@ function ael(base, attach, id = '') } } } else { - base.sub.push(Object.assign({}, attach)); + // base.sub.push(Object.assign({}, attach)); + base.sub.push(deepCopyFunction(attach)); } return base; } @@ -798,7 +802,8 @@ function ael(base, attach, id = '') function aelx(base, ...attach) { for (var i = 0; i < attach.length; i ++) { - base.sub.push(Object.assign({}, attach[i])); + // base.sub.push(Object.assign({}, attach[i])); + base.sub.push(deepCopyFunction(attach[i])); } return base; } @@ -813,7 +818,8 @@ function aelx(base, ...attach) function aelxar(base, attach) { for (var i = 0; i < attach.length; i ++) { - base.sub.push(Object.assign({}, attach[i])); + // base.sub.push(Object.assign({}, attach[i])); + base.sub.push(deepCopyFunction(attach[i])); } return base; } @@ -937,6 +943,22 @@ function phfo(tree) // combine to string return content.join(''); } + +/** + * Create HTML elements from array list + * as a flat element without master object file + * Is like tree.sub call + * @param {Array} list Array of cel created objects + * @return {String} HTML String + */ +function phfa(list) +{ + var content = []; + for (i = 0; i < list.length; i ++) { + content.push(phfo(list[i])); + } + return content.join(''); +} // *** DOM MANAGEMENT FUNCTIONS // BLOCK: html wrappers for quickly creating html data blocks diff --git a/www/lib/autoloader.php b/www/lib/autoloader.php index 8f89e1c1..0705ea55 100644 --- a/www/lib/autoloader.php +++ b/www/lib/autoloader.php @@ -44,7 +44,7 @@ if (class_exists('Autoload', false) === false) { // print "(2) Class clean: $path
"; // if path is set and a valid file if ($path !== false && is_file($path)) { - // echo "(3) Load Path: $path
"; + // print "(3) Load Path: $path
"; // we should sub that // self::loadFile($path); include $path;