From: Matteo Nastasi Date: Thu, 12 Jan 2017 06:23:23 +0000 (+0000) Subject: Merge remote-tracking branch 'origin/master' into nginx X-Git-Tag: v5.6.0~34 X-Git-Url: https://mop.ddnsfree.com/gitweb/?a=commitdiff_plain;h=302c97f7ac81dfcc6fc8d8d44359f4f432e4618a;hp=5866b9ff7c9cfb7a068becd863b14db733a31206;p=brisk.git Merge remote-tracking branch 'origin/master' into nginx Conflicts: web/briskin5/index_wr.php web/index_wr.php --- diff --git a/INSTALL.sh b/INSTALL.sh index a4b076c..219c73e 100755 --- a/INSTALL.sh +++ b/INSTALL.sh @@ -9,7 +9,8 @@ apache_conf="/etc/apache2/sites-available/default" card_hand=3 players_n=3 tables_n=44 -tables_auth_n=12 +tables_appr_n=12 +tables_auth_n=8 tables_cert_n=4 brisk_auth_conf="brisk_spu_auth.conf.pho" brisk_debug="0x0400" @@ -31,7 +32,7 @@ function usage () { echo "$1 -h" echo "$1 chk - run lintian on all ph* files." echo "$1 pkg - build brisk packages." - echo "$1 [-W] [-n 3|5] [-c 2|8] [-t <(n>=4)>] [-T ] [-G ] [-A ] [-a ] [-f ] [-p ] [-U ] [-u ] [-d ] [-w ] [-k ] [-l ] [-y ] [-P ] [-x]" + echo "$1 [-W] [-n 3|5] [-c 2|8] [-t <(n>=4)>] [-T ] [-r ] [-G ] [-A ] [-a ] [-f ] [-p ] [-U ] [-u ] [-d ] [-w ] [-k ] [-l ] [-y ] [-P ] [-x]" echo " -h this help" echo " -f use this config file" echo " -p save preferences in the file" @@ -40,6 +41,7 @@ function usage () { echo " -c number cards in hand - def. $card_hand" echo " -n number of players - def. $players_n" echo " -t number of tables - def. $tables_n" + echo " -r number of appr-only tables - def. $tables_appr_n" echo " -T number of auth-only tables - def. $tables_auth_n" echo " -G number of cert-only tables - def. $tables_cert_n" echo " -a authorization file name - def. \"$brisk_auth_conf\"" @@ -170,6 +172,7 @@ while [ $# -gt 0 ]; do -c*) card_hand="$(get_param "-c" "$1" "$2")"; sh=$?;; -n*) players_n="$(get_param "-n" "$1" "$2")"; sh=$?;; -t*) tables_n="$(get_param "-t" "$1" "$2")"; sh=$?;; + -r*) tables_appr_n="$(get_param "-r" "$1" "$2")"; sh=$?;; -T*) tables_auth_n="$(get_param "-T" "$1" "$2")"; sh=$?;; -G*) tables_cert_n="$(get_param "-G" "$1" "$2")"; sh=$?;; -a*) brisk_auth_conf="$(get_param "-a" "$1" "$2")"; sh=$?;; @@ -207,6 +210,7 @@ echo " apache_conf:\"$apache_conf\"" echo " card_hand: $card_hand" echo " players_n: $players_n" echo " tables_n: $tables_n" +echo " tables_appr_n: $tables_appr_n" echo " tables_auth_n: $tables_auth_n" echo " tables_cert_n: $tables_cert_n" echo " brisk_auth_conf: \"$brisk_auth_conf\"" @@ -231,6 +235,7 @@ if [ ! -z "$outconf" ]; then echo "card_hand=$card_hand" echo "players_n=$players_n" echo "tables_n=$tables_n" + echo "tables_appr_n=$tables_appr_n" echo "tables_auth_n=$tables_auth_n" echo "tables_cert_n=$tables_cert_n" echo "brisk_auth_conf=\"$brisk_auth_conf\"" @@ -411,6 +416,7 @@ s@define *( *'SITE_PREFIX_LEN',[^)]*)@define('SITE_PREFIX_LEN', $prefix_path_len sed -i "s@define *( *'USOCK_PATH',[^)]*)@define('USOCK_PATH', \"$usock_path\")@g" ${web_path}__/spush/brisk-spush.phh sed -i "s@define *( *'TABLES_N',[^)]*)@define('TABLES_N', $tables_n)@g; +s@define *( *'TABLES_APPR_N',[^)]*)@define('TABLES_APPR_N', $tables_appr_n)@g; s@define *( *'TABLES_AUTH_N',[^)]*)@define('TABLES_AUTH_N', $tables_auth_n)@g; s@define *( *'TABLES_CERT_N',[^)]*)@define('TABLES_CERT_N', $tables_cert_n)@g; s@define *( *'BRISK_DEBUG',[^)]*)@define('BRISK_DEBUG', $brisk_debug)@g; diff --git a/TODO.txt b/TODO.txt index 8de1e80..ce58d46 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,9 +1,53 @@ TODO | ------+ + BUGS | + ------+ + DONE - Not sequence of 3 same chars + DONE . check server side with test + DONE - Global vars checker + + - usermgmt: add user delete + DONE - 10002 message when already clicked + DONE - trim spaces in apprentice form + DONE - Remove books from chat + DONE - usermgmt: add email + + FEATURES | ----------+ - - Global vars checker + WIP * inherited info + * Users Network construction + DONE - sql + DONE - dbase API + DONE - add apprentices tables + DONE - remove entry when set unknown + DONE - enhance info interface + DONE . SQL to show current evaluation + DONE . disable parts of interface + WIP . add title to items + . fix SELECT + + - minisplash at end of the match + - differentiate table authorization + * add new kind of isolation for apprentice + + * Double click on chat to open preferences + + * APPRENTICE + Phase2 + DONE - match counters (part 2) + DONE . migration script for old users + - guarantee for apprentice + + + +--------- + - APPRENTICE + Phase2 + DONE - match counters (part 2) + DONE . migration script for old users + - APPRENTICE Phase1 DONE - correggere minuta giornaliera @@ -30,11 +74,6 @@ DONE - fix layout of tables DONE - aggiungere books.png - Phase2 - - match counters (part 2) - . migration script for old users - - guarantee for apprentice - - MENTORS - listen all diff --git a/bin/get_globals.sh b/bin/get_globals.sh new file mode 100755 index 0000000..f235dfb --- /dev/null +++ b/bin/get_globals.sh @@ -0,0 +1,17 @@ +#!/bin/bash +glob="$(grep '$G_' $(find -type f -name '*.ph*') | sed 's/\$G_/\n\$G_/g' | grep '^\$G_' | sed 's/[^\$a-zA-Z0-9_].*//g' | sort | uniq | sed 's/\$//g' )" + +li="" +for i in $glob ; do + if [ $(echo "${li}, '$i'," | wc -c) -gt 80 ]; then + echo $li + li="" + fi + if [ "$li" = "" ]; then + li="'${i}', " + else + li="${li} '${i}'," + fi +done + + diff --git a/doc/ARCHITECTURE.txt b/doc/ARCHITECTURE.txt index f1d7069..b89ba88 100644 --- a/doc/ARCHITECTURE.txt +++ b/doc/ARCHITECTURE.txt @@ -1,5 +1,10 @@ ===== Sparse documentation about Brisk. ===== +==== Form Workflow ==== + +- div on page + + User cleanup: spush::garbage_manager() if (user->the_end) diff --git a/sql/builder.sh b/sql/builder.sh index b71624d..f67fa23 100755 --- a/sql/builder.sh +++ b/sql/builder.sh @@ -55,12 +55,12 @@ one_or_all() { if [ "$1" ]; then echo "$1" elif [ "$TYPE_FILES" = "a" ]; then - echo sql.d/[0-9]* + find sql.d/ -name '[0-9]*' -type f | sort -n | tr '\n' ' ' elif [ "$TYPE_FILES" = "d" ]; then - echo sql.d/[0-9]*.{sql,devel} + find sql.d/ -name '[0-9]*' | egrep '.*_devel.sql$|^[^_]+.sql$' | sort -n | tr '\n' ' ' else - echo sql.d/[0-9]*.sql - fi); do + find sql.d/ -name '[0-9]*' | egrep '^[^_]+.sql$' | sort -n | tr '\n' ' ' + fi); do echo "-- FILE BEG: $fil" cat "$fil" echo "-- FILE END: $fil" diff --git a/sql/sql.d/066-insert-unnorm-games.sql.test b/sql/sql.d/066-insert-unnorm-games.sql.test deleted file mode 100644 index 930815e..0000000 --- a/sql/sql.d/066-insert-unnorm-games.sql.test +++ /dev/null @@ -1,37 +0,0 @@ -DELETE FROM #PFX#bin5_matches WHERE code = 100 OR code = 101; - -INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (100, 'normalize_points', 2, 1, 1) RETURNING *; -INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10101, 0); -INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10102, 1); -INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10103, 2); -INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) - VALUES (200, 100, to_timestamp(#NOW# - 1000), 2, 60, 0, -1, -1, 0, 0) RETURNING *; -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10101, 0); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10102, 0); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10103, 0); -UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100; -INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) - VALUES (201, 100, to_timestamp(#NOW# - 900), 0, 61, 37, 2, 1, 1, 1) RETURNING *; -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10101, 2); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10102, -2); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10103, -4); - - -INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (101, 'normalize_points2', 2, 1, 0) RETURNING *; -INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10101, 0); -INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10102, 1); -INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10103, 2); -INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) - VALUES (202, 101, to_timestamp(#NOW# - 800), 2, 60, 0, -1, -1, 0, 0) RETURNING *; -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10101, 0); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10102, 0); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10103, 0); -UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100; -INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) - VALUES (203, 101, to_timestamp(#NOW# - 700), 0, 81, 37, 2, 1, 1, 1) RETURNING *; -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10101, 6); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10102, -6); -INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10103, -12); - - - diff --git a/sql/sql.d/066-insert-unnorm-games_test.sql b/sql/sql.d/066-insert-unnorm-games_test.sql new file mode 100644 index 0000000..930815e --- /dev/null +++ b/sql/sql.d/066-insert-unnorm-games_test.sql @@ -0,0 +1,37 @@ +DELETE FROM #PFX#bin5_matches WHERE code = 100 OR code = 101; + +INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (100, 'normalize_points', 2, 1, 1) RETURNING *; +INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10101, 0); +INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10102, 1); +INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (100, 10103, 2); +INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) + VALUES (200, 100, to_timestamp(#NOW# - 1000), 2, 60, 0, -1, -1, 0, 0) RETURNING *; +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10101, 0); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10102, 0); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (200, 10103, 0); +UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100; +INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) + VALUES (201, 100, to_timestamp(#NOW# - 900), 0, 61, 37, 2, 1, 1, 1) RETURNING *; +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10101, 2); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10102, -2); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (201, 10103, -4); + + +INSERT INTO #PFX#bin5_matches (code, ttok, tidx, mazzo_next, mult_next) VALUES (101, 'normalize_points2', 2, 1, 0) RETURNING *; +INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10101, 0); +INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10102, 1); +INSERT INTO #PFX#bin5_table_orders (mcode, ucode, pos) VALUES (101, 10103, 2); +INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) + VALUES (202, 101, to_timestamp(#NOW# - 800), 2, 60, 0, -1, -1, 0, 0) RETURNING *; +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10101, 0); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10102, 0); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (202, 10103, 0); +UPDATE #PFX#bin5_matches SET (mazzo_next, mult_next) = (2, 0) WHERE code = 100; +INSERT INTO #PFX#bin5_games (code, mcode, tstamp, act, asta_pnt, pnt, asta_win, friend, mazzo, mult) + VALUES (203, 101, to_timestamp(#NOW# - 700), 0, 81, 37, 2, 1, 1, 1) RETURNING *; +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10101, 6); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10102, -6); +INSERT INTO #PFX#bin5_points (gcode, ucode, pts) VALUES (203, 10103, -12); + + + diff --git a/sql/sql.d/075-users-network.sql b/sql/sql.d/075-users-network.sql new file mode 100644 index 0000000..c725938 --- /dev/null +++ b/sql/sql.d/075-users-network.sql @@ -0,0 +1,80 @@ +-- +-- Table to manage users trust network +-- +DROP TABLE IF EXISTS #PFX#usersnet; +CREATE TABLE #PFX#usersnet ( + owner integer REFERENCES #PFX#users (code) + ON DELETE cascade ON UPDATE cascade, -- network owner + target integer REFERENCES #PFX#users (code) + ON DELETE cascade ON UPDATE cascade, -- evaluated user + friend integer, -- friendship level + -- 1"black", 2"unknown", 3"test", 4"friend", 5"bff" + skill float, -- skill level + trust float, -- auth + ctime timestamp DEFAULT now(), -- creation time + mtime timestamp DEFAULT to_timestamp(0) -- modification time + ); + +DROP INDEX IF EXISTS #PFX#usersnet_owner_idx; +DROP INDEX IF EXISTS #PFX#usersnet_target_idx; +DROP INDEX IF EXISTS #PFX#usersnet_owner_target_idx; + +CREATE INDEX #PFX#usersnet_owner_idx ON #PFX#usersnet (owner); +CREATE INDEX #PFX#usersnet_target_idx ON #PFX#usersnet (target); +CREATE UNIQUE INDEX #PFX#usersnet_owner_target_idx ON #PFX#usersnet (owner, target); + +DROP VIEW #PFX#usersnet_widefriend; +CREATE VIEW #PFX#usersnet_widefriend + AS SELECT un.owner, ur.target, ur.friend, count(*) as count + FROM #PFX#usersnet AS un, #PFX#usersnet AS ur + WHERE un.target = ur.owner AND un.friend >= 4 -- 'un' is, at least, our friend + GROUP BY un.owner, ur.target, ur.friend; + +DROP VIEW #PFX#usersnet_narrowfriend; +CREATE VIEW #PFX#usersnet_narrowfriend + AS SELECT un.owner, ur.target, ur.friend, count(*) as count + FROM #PFX#usersnet AS un, #PFX#usersnet AS ur + WHERE un.target = ur.owner AND un.friend >= 5 -- 'un' is, at least, our friend + GROUP BY un.owner, ur.target, ur.friend; + +DROP VIEW #PFX#usersnet_wideskill; +CREATE VIEW #PFX#usersnet_wideskill + AS SELECT un.owner, ur.target, SUM(ur.skill * un.trust) / SUM(un.trust) as skill, count(*) as count + FROM #PFX#usersnet AS un, #PFX#usersnet AS ur + WHERE un.target = ur.owner AND un.friend >= 4 -- 'un' is, at least, our friend + AND ur.friend > 2 + GROUP BY un.owner, ur.target; + +DROP VIEW #PFX#usersnet_narrowskill; +CREATE VIEW #PFX#usersnet_narrowskill + AS SELECT + un.owner AS owner + , ur.target AS target + , SUM(ur.skill * un.trust) / SUM(un.trust) AS skill + , COUNT(*) AS count + FROM #PFX#usersnet AS un, #PFX#usersnet as ur + WHERE un.target = ur.owner AND un.friend = 5 -- 'ur' owner must be bbf of un.owner + AND ur.friend > 2 + GROUP BY un.owner, ur.target; + +DROP VIEW #PFX#usersnet_narrowblack; +CREATE VIEW #PFX#usersnet_narrowblack + AS SELECT DISTINCT un.owner AS owner, ur.target AS target, 1 AS black_cnt + FROM #PFX#usersnet AS un, #PFX#usersnet as ur + WHERE un.target = ur.owner + AND un.friend = 5 -- ur owner must be bbf of un.owner + AND ur.friend = 1; -- ur must be blacked + +DROP VIEW #PFX#usersnet_party; +CREATE VIEW #PFX#usersnet_party + AS (SELECT ns.*, nb.black_cnt FROM #PFX#usersnet_narrowskill AS ns + LEFT JOIN #PFX#usersnet_narrowblack AS nb + USING (owner, target) + -- all except targets managed directly by the owner + WHERE black_cnt is null + AND target NOT IN (SELECT target FROM #PFX#usersnet AS du WHERE du.owner = ns.owner) + UNION ALL + (SELECT owner, target, skill, 1 AS count, null AS black_cnt + FROM #PFX#usersnet + WHERE friend > 2)) + ORDER BY target; diff --git a/sql/sql.d/100-anagr.sql.devel b/sql/sql.d/100-anagr.sql.devel deleted file mode 100644 index 9de8924..0000000 --- a/sql/sql.d/100-anagr.sql.devel +++ /dev/null @@ -1,28 +0,0 @@ --- --- Populate users db. --- - --- macro for user_flag bit-field --- define('USER_FLAG_TY_ALL', 0xff0000); // done --- define('USER_FLAG_TY_NORM', 0x010000); // done --- define('USER_FLAG_TY_SUPER', 0x020000); // done --- define('USER_FLAG_TY_CERT', 0x040000); // done --- define('USER_FLAG_TY_FIRONLY', 0x200000); // done --- define('USER_FLAG_TY_ADMIN', 0x400000); // done --- define('USER_FLAG_TY_DISABLE', 0x800000); // done - - -DELETE FROM #PFX#users WHERE code = 10101; -DELETE FROM #PFX#users WHERE guar_code = 10101 AND code != 10101; -INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10101, 'uno', md5('one'), 'uno@pluto.com', CAST (X'00450000' as integer), 10101); -DELETE FROM #PFX#users WHERE code = 10102; -INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10102, 'due', md5('two'), 'due@pluto.com', CAST (X'00010000' as integer), 10101); -DELETE FROM #PFX#users WHERE code = 10103; -INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10103, 'tre', md5('thr'), 'tre@pluto.com', CAST (X'00010000' as integer), 10102); -DELETE FROM #PFX#users WHERE code = 10104; -INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10104, 'qua', md5('for'), 'qua@pluto.com', CAST (X'00010000' as integer), 10102); -DELETE FROM #PFX#users WHERE code = 10105; -INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10105, 'cin', md5('fiv'), 'cin@pluto.com', CAST (X'00010000' as integer), 10103); -DELETE FROM #PFX#users WHERE code = 10106; -INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10106, 'sei', md5('six'), 'sei@pluto.com', CAST (X'00210000' as integer), 10103); -ALTER SEQUENCE #PFX#users_code_seq RESTART WITH 10107; diff --git a/sql/sql.d/900-anagr_devel.sql b/sql/sql.d/900-anagr_devel.sql new file mode 100644 index 0000000..4730163 --- /dev/null +++ b/sql/sql.d/900-anagr_devel.sql @@ -0,0 +1,49 @@ +-- +-- Populate users db. +-- + +-- macro for user_flag bit-field +-- define('USER_FLAG_TY_ALL', 0xff0000); // done +-- define('USER_FLAG_TY_NORM', 0x010000); // done +-- define('USER_FLAG_TY_SUPER', 0x020000); // done +-- define('USER_FLAG_TY_CERT', 0x040000); // done +-- define('USER_FLAG_TY_APPR', 0x080000); // done +-- define('USER_FLAG_TY_FIRONLY', 0x200000); // done +-- define('USER_FLAG_TY_ADMIN', 0x400000); // done +-- define('USER_FLAG_TY_DISABLE', 0x800000); // done + + +DELETE FROM #PFX#users WHERE code = 10101; +DELETE FROM #PFX#users WHERE guar_code = 10101 AND code != 10101; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10101, 'uno', md5('one'), 'uno@pluto.com', CAST (X'00450000' as integer), 10101); +DELETE FROM #PFX#users WHERE code = 10102; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10102, 'due', md5('two'), 'due@pluto.com', CAST (X'00010000' as integer), 10101); +DELETE FROM #PFX#users WHERE code = 10103; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10103, 'tre', md5('thr'), 'tre@pluto.com', CAST (X'00030000' as integer), 10102); +DELETE FROM #PFX#users WHERE code = 10104; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10104, 'qua', md5('for'), 'qua@pluto.com', CAST (X'00010000' as integer), 10102); +DELETE FROM #PFX#users WHERE code = 10105; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10105, 'cin', md5('fiv'), 'cin@pluto.com', CAST (X'00010000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10106; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10106, 'sei', md5('six'), 'sei@pluto.com', CAST (X'00210000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10107; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10107, E'"/\\''|', md5('sev'), 'sev@pluto.com', CAST (X'00210000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10108; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10108, E'appr', md5('appr'), 'appr@pluto.com', CAST (X'00080000' as integer), 10103); + +DELETE FROM #PFX#users WHERE code = 10109; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10109, 'bosi', md5('bosi'), 'bosi@pluto.com', CAST (X'00010000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10110; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10110, 'bono', md5('bono'), 'bono@pluto.com', CAST (X'00010000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10111; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10111, 'nosi', md5('nosi'), 'nosi@pluto.com', CAST (X'00010000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10112; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10112, 'sino', md5('sino'), 'sino@pluto.com', CAST (X'00010000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10113; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10113, 'doub', md5('boub'), 'doub@pluto.com', CAST (X'00010000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10114; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10114, 'selfguar', md5('self'), 'self@pluto.com', CAST (X'00010000' as integer), 10103); +DELETE FROM #PFX#users WHERE code = 10115; +INSERT INTO #PFX#users (code, login, pass, email, type, guar_code) VALUES (10115, 'bonoonly', md5('bonoonly'), 'bonoonly@pluto.com', CAST (X'00010000' as integer), 10101); + +ALTER SEQUENCE #PFX#users_code_seq RESTART WITH 10116; diff --git a/sql/sql.d/910-usernet_devel.sql b/sql/sql.d/910-usernet_devel.sql new file mode 100644 index 0000000..1c780b7 --- /dev/null +++ b/sql/sql.d/910-usernet_devel.sql @@ -0,0 +1,77 @@ +-- primary owner 10101 +DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10102; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10102, 4, 2, 5); +DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10103; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10103, 5, 2, 3); +-- doub +DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10113; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10113, 5, 2, 5); + +-- primary owner: discarded target +DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10104; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10104, 1, 2, 5); + +-- secondary owners for 10101 +DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10105; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10105, 4, 2, 3); +DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10105; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10105, 4, 3, 4); +DELETE FROM #PFX#usersnet WHERE owner = 10104 AND target = 10105; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10104, 10105, 4, 5, 4); +DELETE FROM #PFX#usersnet WHERE owner = 10113 AND target = 10105; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10113, 10105, 4, 2, 5); + +DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10107; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10107, 3, 3, 4); + +-- check sit permission +-- bosi +DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10109; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10109, 4, 2, 3); +DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10109; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10109, 4, 2, 3); + +-- bono +DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10110; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10110, 4, 2, 3); +DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10110; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10110, 1, 2, 3); + +-- nosi +DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10111; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10111, 1, 2, 3); +DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10111; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10111, 4, 2, 3); +DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10111; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10111, 4, 2, 3); + +-- sino +DELETE FROM #PFX#usersnet WHERE owner = 10101 AND target = 10112; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10101, 10112, 4, 2, 3); +DELETE FROM #PFX#usersnet WHERE owner = 10102 AND target = 10112; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10102, 10112, 4, 2, 3); +DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10112; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10112, 1, 2, 3); + +-- bonoonly +DELETE FROM #PFX#usersnet WHERE owner = 10103 AND target = 10115; +INSERT INTO #PFX#usersnet (owner, target, friend, skill, trust) VALUES (10103, 10115, 1, 0, 0); + +SELECT * FROM #PFX#usersnet WHERE owner = 10101 OR owner IN (10102, 10103, 10113) ORDER BY target; + +SELECT * FROM #PFX#usersnet_wideskill ORDER BY owner, target; + +SELECT * FROM #PFX#usersnet_narrowskill ORDER BY owner, target; + +SELECT owner, target, skill, 1 AS count, us.login as login FROM #PFX#usersnet, #PFX#users as us WHERE owner = 10101 AND us.code = target AND friend > 2 ORDER BY target; + +SELECT ns.*, us.login AS login FROM #PFX#usersnet_narrowskill as ns, #PFX#users AS us WHERE owner = 10101 + AND ns.target NOT IN (SELECT target FROM #PFX#usersnet WHERE owner = 10101) +AND us.code = ns.target UNION SELECT owner, target, skill, 1 AS count +-- , 0 AS black +, us.login as login FROM #PFX#usersnet, #PFX#users as us WHERE owner = 10101 AND us.code = target AND friend > 2 ORDER BY target; + +SELECT us.login, pa.* FROM #PFX#usersnet_party pa, #PFX#users as us WHERE pa.target = us.code AND pa.owner = 10101; + +SELECT * FROM #PFX#usersnet_widefriend ORDER BY owner, target, friend; +SELECT * FROM #PFX#usersnet_narrowfriend ORDER BY owner, target, friend; diff --git a/test/logintest.php b/test/logintest.php new file mode 100755 index 0000000..0ad0984 --- /dev/null +++ b/test/logintest.php @@ -0,0 +1,29 @@ +#!/usr/bin/php + \ No newline at end of file diff --git a/web/Obj/brisk.conf-templ.pho b/web/Obj/brisk.conf-templ.pho index 8d4858c..837e4ed 100644 --- a/web/Obj/brisk.conf-templ.pho +++ b/web/Obj/brisk.conf-templ.pho @@ -17,6 +17,7 @@ else { // 26 hours between 2 successive registration from this area $G_selfreg_mask = 0xfffff000; $G_selfreg_tout = 93600; +$G_notguar_code = 10114; // G_dbasetype value can be "pgsql" or "file" $G_dbasetype="pgsql"; diff --git a/web/Obj/brisk.phh b/web/Obj/brisk.phh index 45e5fd1..0c33591 100644 --- a/web/Obj/brisk.phh +++ b/web/Obj/brisk.phh @@ -28,6 +28,7 @@ define('FTOK_PATH', "/var/lib/brisk"); define('LEGAL_PATH', "/tmp/legal_brisk"); define('PROXY_PATH', "/var/lib/brisk_proxy"); define('TABLES_N', 36); +define('TABLES_APPR_N', 12); define('TABLES_AUTH_N', 8); define('TABLES_CERT_N', 4); define('PLAYERS_N', 3); @@ -152,13 +153,14 @@ $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi', $G_lng = langtolng($G_lang); $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 ); -$G_brisk_version = "5.1.3"; +$G_brisk_version = "5.2.1"; /* MLANG: ALL THE INFO STRINGS IN brisk.phh */ -$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NOVITA\': comando /info e doppio click sugli utenti registrati, nuovi utenti apprendisti, info su numero di mani e di partite.', +$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NOVITA\': puoi creare la tua rete di amicizie con /info, vedere cosa pensano i tuoi amici degli altri utenti e ci sono i nuovi tavoli riservati per registrati e apprendisti, corretti alcuni errori.', 'Se vuoi iscriverti alla Mailing List, cliccala!' ), - 'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), NEWS: ENcomando /info e doppio click sugli utenti registrati, nuovi utenti apprendisti.', - 'If you want to subscribe our Mailing List, click it!' ) ); + 'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), NOVITA\': puoi creare la tua rete di amicizie con /info,', + 'vedere cosa pensano i tuoi amici degli altri utenti e tavoli riservati per registrati e apprendisti.', + 'Se vuoi iscriverti alla Mailing List, cliccala!' ) ); $G_room_help = array( 'it' => '
@@ -634,8 +636,9 @@ class Vect { } define('TABLE_AUTH_TY_PUBL', 0); -define('TABLE_AUTH_TY_AUTH', 1); -define('TABLE_AUTH_TY_CERT', 2); +define('TABLE_AUTH_TY_APPR', 1); +define('TABLE_AUTH_TY_AUTH', 2); +define('TABLE_AUTH_TY_CERT', 3); class Table { @@ -671,6 +674,8 @@ class Table { $thiz->auth_type = TABLE_AUTH_TY_CERT; else if ($idx < TABLES_AUTH_N) $thiz->auth_type = TABLE_AUTH_TY_AUTH; + else if ($idx < TABLES_APPR_N) + $thiz->auth_type = TABLE_AUTH_TY_APPR; else $thiz->auth_type = TABLE_AUTH_TY_PUBL; @@ -825,6 +830,12 @@ class Table { else $act = 'reserved'; break; + case TABLE_AUTH_TY_APPR: + if ($user->is_auth()) + $act = "sitappr"; + else + $act = 'reserved'; + break; default: $act = 'sit'; break; @@ -1643,7 +1654,13 @@ class Brisk } } - function info_show($user, $user_login, $dt) + /* + function info_show($user, $target, $dt) + + if success return assoc. array with "ret" => 0 and other fields + else return an assoc. array with "ret: != 0 and "mesg" with an error description + */ + function info_show($user, $target, $dt) { GLOBAL $G_lang, $mlang_brisk, $G_base; @@ -1652,7 +1669,7 @@ class Brisk $ret = 0; do { - if ($user_login == "") { + if ($target == "") { $ret = 1; break; } @@ -1660,13 +1677,13 @@ class Brisk $ret = 2; break; } - if (($user_item = $bdb->getitem_bylogin($user_login, $user_code)) == FALSE) { + if ($target == $user->name) { $ret = 3; + $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]); break; } - if ($user_login == $user->name) { + if (($user_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) { $ret = 4; - $mesg = sprintf($mlang_brisk['inf_self'][$G_lang]); break; } if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) { @@ -1677,11 +1694,24 @@ class Brisk } $user_tos_vers = $user_item->tos_vers_get(); + $partyskill = $bdb->usersnet_partyskill($user->code, $user_item->code); + + $widefriend = $bdb->usersnet_widefriend($user->code, $user_item->code); + $widefriend['skill'] = $bdb->usersnet_wideskill($user->code, $user_item->code); + $narrowfriend = $bdb->usersnet_narrowfriend($user->code, $user_item->code); + $narrowfriend['skill'] = $bdb->usersnet_narrowskill($user->code, $user_item->code); + + if (($usersnet_item = $bdb->usersnet_bycode($user->code, $user_item->code, + $widefriend, $narrowfriend)) == FALSE) { + $usersnet_item = $bdb->usersnet_default($user->code, $user_item->code, + $widefriend, $narrowfriend); + } + if (versions_cmp($user_tos_vers, "1.2") < 0) { - $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($user_login)); + $mesg = sprintf($mlang_brisk['tos_old'][$G_lang], xcape($target)); } else if ($guar_login == "") { - $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($user_login)); + $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target)); } } while (0); @@ -1695,7 +1725,7 @@ class Brisk else { $jret = json_encode(array("ret" => 0, "mesg" => "", - "login" => $user_login, + "login" => $target, // FIXME: state internationalization "state" => ($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" : @@ -1704,14 +1734,49 @@ class Brisk "Normale" : "Stato sconosciuto"))), "guar" => ($user_item->type & USER_FLAG_TY_APPR ? "" : $guar_login), + "party" => $partyskill, "match" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->match_cnt) , "game" => (versions_cmp($user_tos_vers, "1.4") < 0 ? "non autorizzato" : $user_item->game_cnt), - "friend" => "unknown")); + "friend" => usersnet_friend_getlabel($usersnet_item->friend), + "skill" => $usersnet_item->skill, + "trust" => $usersnet_item->trust, + "widefriend" => $usersnet_item->widefriend, + "narrowfriend" => $usersnet_item->narrowfriend + )); } return $jret; } + function info_save($user, $json_s) + { + GLOBAL $G_lang, $mlang_brisk, $G_base; + + $mesg = ""; + $user_code = -1; + $ret = 0; + $subret = 0; + + do { + if (($json = json_decode($json_s)) == FALSE) { + $ret = 1; + break; + } + + if (($bdb = BriskDB::create()) == FALSE) { + $ret = 2; + break; + } + + if (($subret = $bdb->usersnet_save($user->code, $json)) != 0) { + $ret = 4000 + $subret; + break; + } + } while(0); + + return ($ret); + } + function room_outstandup($user) { $this->room_sitdown($user, -1); @@ -1858,7 +1923,7 @@ class Brisk return ($this->kickuser($user_out, $out_reas)); } - function chatt_send($user, $mesg) + function chatt_send($user, $mesg, $mlang_indwr = NULL) { GLOBAL $G_base, $G_alarm_passwd, $mlang_brisk, $G_lang; $only_you = FALSE; @@ -2059,7 +2124,7 @@ class Brisk if (($bdb = BriskDB::create()) != FALSE) { $bdb->users_load(); /* MLANG: "Il nickname \'%s\' è già registrato, se il suo proprietario si autentificherà verrai rinominato d\'ufficio come ghostN." */ - if ($bdb->login_exists($name_new)) { + if ($bdb->login_exists(strtolower($name_new))) { $prestr = sprintf($mlang_brisk['nickjust'][$G_lang], xcape($name_new)); $to_user .= nickserv_msg($dt, $prestr); } @@ -2072,10 +2137,20 @@ class Brisk } while (0); } // nick chat command else if (strncmp($msg, "/info ", 6) == 0) { - $guar_user = substr($msg, 6); + do { + if (! $user->is_auth()) { + if ($mlang_indwr) { + $to_user = nickserv_msg($dt, $mlang_indwr['info_auth'][$G_lang]); + } + else { + $to_user = nickserv_msg($dt, "error"); + } + break; + } + $info_user = substr($msg, 6); - error_log("here [" . $guar_user."]"); - echo $this->info_show($user, $guar_user, $dt); + echo $this->info_show($user, urldecode($info_user), $dt); + } while(0); } else if (strncmp($msg, "/st ", 4) == 0) { log_main("chatt_send BEGIN"); @@ -2370,7 +2445,7 @@ class Brisk } } else { - $login_exists = $bdb->login_exists($name_new); + $login_exists = $bdb->login_exists(strtolower($name_new)); } } else { @@ -3466,5 +3541,31 @@ function carousel_top() } } +function login_consistency($name) +{ + $old_c = ''; + if (($len = mb_strlen($name)) > 12) { + return FALSE; + } + for ($i = 0 ; $i < mb_strlen($name) ; $i++) { + $c = mb_substr($name, $i, 1); + if (mb_ereg_match ("[a-zA-Z0-9]", $c)) { + if ($old_c != $c) { + $old_c = $c; + $old_ct = 1; + } + else { + $old_ct++; + if ($old_ct > 2) { + return (FALSE); + } + } + } + else { + return (FALSE); + } + } + return (TRUE); +} ?> diff --git a/web/Obj/dbase_base.phh b/web/Obj/dbase_base.phh index 1e7a19a..66c998f 100644 --- a/web/Obj/dbase_base.phh +++ b/web/Obj/dbase_base.phh @@ -3,7 +3,7 @@ * brisk - dbase_base.phh * * Copyright (C) 2011-2012 Matteo Nastasi - * mailto: nastasi@alternativeoutput.it + * mailto: nastasi@alternativeoutput.it * matteo.nastasi@milug.org * web: http://www.alternativeoutput.it * @@ -56,7 +56,7 @@ class LoginDBItem { static function LoginDBItemFromRecord($rec) { - $ret = new LoginDBItem($rec->code, $rec->login, $rec->pass, + $ret = new LoginDBItem($rec->code, $rec->login, $rec->pass, $rec->email, $rec->type, $rec->last_dona, $rec->supp_comp, $rec->tos_vers, $rec->disa_reas, $rec->guar_code, $rec->match_cnt, $rec->game_cnt); @@ -73,7 +73,7 @@ class LoginDBItem { { return $this->login; } - + function pass_get() { return $this->pass; @@ -181,4 +181,53 @@ class MailDBItem { return $bdb->mail_add_fromitem($this); } } + +define('USERSNET_DEF_FRIEND', 2); +define('USERSNET_DEF_SKILL', 2); +define('USERSNET_DEF_TRUST', 2); + +class UsersNetItem { + var $owner; + var $target; + var $friend; + var $skill; + var $trust; + + var $from_db; + + function UsersNetItem($owner, $target, $friend, $skill, $trust, + $widefriend, $narrowfriend, $from_db) + { + $this->owner = $owner; + $this->target = $target; + $this->friend = $friend; + $this->skill = $skill; + $this->trust = $trust; + $this->widefriend = $widefriend; + $this->narrowfriend = $narrowfriend; + + $this->from_db = $from_db; + } + + static function UsersNetItemFromRecord($rec, $widefriend, $narrowfriend) + { + $ret = new UsersNetItem($rec->owner, $rec->target, $rec->friend, + $rec->skill, $rec->trust, + $widefriend, $narrowfriend, TRUE); + + return ($ret); + } + + static function UsersNetItemDefaults($owner, $target, $widefriend, $narrowfriend) + { + $ret = new UsersNetItem($owner, $target, USERSNET_DEF_FRIEND, + USERSNET_DEF_SKILL, USERSNET_DEF_TRUST, + $widefriend, $narrowfriend, FALSE); + + return ($ret); + } + + +} + ?> \ No newline at end of file diff --git a/web/Obj/dbase_pgsql.phh b/web/Obj/dbase_pgsql.phh index f8b7538..cdcec51 100644 --- a/web/Obj/dbase_pgsql.phh +++ b/web/Obj/dbase_pgsql.phh @@ -25,7 +25,7 @@ require_once("${G_base}Obj/dbase_base.phh"); $escsql_from = array( "\\", "'" ); -$escsql_to = array( "\\\\", "\\'" ); +$escsql_to = array( "\\\\", "''" ); function escsql($s) { @@ -62,8 +62,9 @@ class DBConn static function destroy() { if (DBConn::$dbcnnx != FALSE) { + $ret = pg_close(DBConn::$dbcnnx); DBConn::$dbcnnx = FALSE; - return (pg_close(DBConn::$dbcnnx)); + return ($ret); } return TRUE; } @@ -112,11 +113,17 @@ class BriskDB function query($sql) { - if (($res = pg_query($this->dbconn->db(), $sql)) == FALSE) { + if (!$this->dbconn) + if (($this->dbconn = DBConn::recover()) == FALSE) + return FALSE; + + if (($res = @pg_query($this->dbconn->db(), $sql)) == FALSE) { + error_log('pg_result_status: ' . pg_result_status($res)); + error_log('pg_connection_status: ' . pg_connection_status($this->dbconn->db())); // try to recover the connection if (($this->dbconn = DBConn::recover()) == FALSE) return FALSE; - return (pg_query($this->dbconn->db(), $sql)); + return (@pg_query($this->dbconn->db(), $sql)); } return ($res); @@ -138,7 +145,7 @@ class BriskDB /* check the existence of the nick in the BriskDB */ log_main("login_exists: ".$login); - $user_sql = sprintf("SELECT * FROM %susers WHERE login = lower('%s')", + $user_sql = sprintf("SELECT * FROM %susers WHERE login = '%s'", $G_dbpfx, escsql($login)); if (($user_pg = $this->query($user_sql)) != FALSE) if (pg_numrows($user_pg) == 1) @@ -203,10 +210,6 @@ class BriskDB return (FALSE); } - if (($sere_pg = $this->query($sere_sql)) == FALSE) { - return (FALSE); - } - $sere_sql = sprintf("SELECT * FROM %sselfreg_chk WHERE (ip & %d) = %d;", $G_dbpfx, int2four($G_selfreg_mask), int2four($laddr & $G_selfreg_mask)); if (($sere_pg = $this->query($sere_sql)) == FALSE) { @@ -352,11 +355,9 @@ class BriskDB $user_sql = sprintf("UPDATE %susers SET (type, supp_comp) = (%d, '%s') WHERE code = %d;", $G_dbpfx, $flags, escsql($supp_comp), $code); - fprintf(STDERR, "REQUEST [%s]\n", $user_sql); if ( ! (($user_pg = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) { return FALSE; } - fprintf(STDERR, "REQUEST GOOD [%s]\n", $user_sql); return TRUE; } @@ -367,11 +368,9 @@ class BriskDB $user_sql = sprintf("UPDATE %susers SET (type, disa_reas) = (%d, %d) WHERE code = %d;", $G_dbpfx, $flags, $disa_reas, $code); - fprintf(STDERR, "REQUEST [%s]\n", $user_sql); if ( ! (($user_pg = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) { return FALSE; } - fprintf(STDERR, "REQUEST GOOD [%s]\n", $user_sql); return TRUE; } @@ -382,11 +381,9 @@ class BriskDB $user_sql = sprintf("UPDATE %susers SET (tos_vers) = ('%s') WHERE code = %d;", $G_dbpfx, escsql($tos_vers), $code); - fprintf(STDERR, "REQUEST [%s]\n", $user_sql); if ( ! (($user_pg = $this->query($user_sql)) != FALSE && pg_affected_rows($user_pg) == 1) ) { return FALSE; } - fprintf(STDERR, "REQUEST GOOD [%s]\n", $user_sql); return TRUE; } @@ -855,7 +852,222 @@ INSERT INTO %smails (code, ucode, type, tstamp, subj, body_txt, body_htm, hash) return (TRUE); } + function friendship_default() + { + return (array(usersnet_friend_getlabel(1) => "0", + usersnet_friend_getlabel(2) => "0", + usersnet_friend_getlabel(3) => "0", + usersnet_friend_getlabel(4) => "0", + usersnet_friend_getlabel(5) => "0")); + } + + function usersnet_widefriend($owner, $target) + { + GLOBAL $G_dbpfx; + + $widefriend = $this->friendship_default(); + + $wfri_sql = sprintf("SELECT * FROM %susersnet_widefriend WHERE owner = %d AND target = %d;", + $G_dbpfx, $owner, $target); + if (($wfri_pg = $this->query($wfri_sql)) == FALSE) { + return ($widefriend); + } + + for ($i = 0 ; $i < pg_numrows($wfri_pg) ; $i++) { + $wfri_obj = pg_fetch_object($wfri_pg, $i); + $widefriend[usersnet_friend_getlabel(intval($wfri_obj->friend))] = $wfri_obj->count; + } + + return ($widefriend); + } + + function usersnet_wideskill($owner, $target) + { + GLOBAL $G_dbpfx; + + $wideskill = "//"; + $wskl_sql = sprintf("SELECT * FROM %susersnet_wideskill WHERE owner = %d AND target = %d;", + $G_dbpfx, $owner, $target); + if (($wskl_pg = $this->query($wskl_sql)) == FALSE) { + return ($wideskill); + } + + if (pg_numrows($wskl_pg) > 0) { + $wskl_obj = pg_fetch_object($wskl_pg, 0); + // TODO: UNCOMMENT IF THE NETWORK WORKS VERY WELL + // if ($wskl_obj->count >= 3) + $wideskill = sprintf("%3.2f", $wskl_obj->skill); + } + return ($wideskill); + } + + function usersnet_narrowfriend($owner, $target) + { + GLOBAL $G_dbpfx; + + $narrowfriend = $this->friendship_default(); + + $nfri_sql = sprintf("SELECT * FROM %susersnet_narrowfriend WHERE owner = %d AND target = %d;", + $G_dbpfx, $owner, $target); + if (($nfri_pg = $this->query($nfri_sql)) == FALSE) { + return $narrowfriend; + } + + for ($i = 0 ; $i < pg_numrows($nfri_pg) ; $i++) { + $nfri_obj = pg_fetch_object($nfri_pg, $i); + $narrowfriend[usersnet_friend_getlabel(intval($nfri_obj->friend))] = $nfri_obj->count; + } + return ($narrowfriend); + } + + function usersnet_narrowskill($owner, $target) + { + GLOBAL $G_dbpfx; + + $narrowskill = "//"; + + $nskl_sql = sprintf("SELECT * FROM %susersnet_narrowskill WHERE owner = %d AND target = %d;", + $G_dbpfx, $owner, $target); + if (($nskl_pg = $this->query($nskl_sql)) == FALSE) { + return ($narrowskill); + } + + if (pg_numrows($nskl_pg) > 0) { + $nskl_obj = pg_fetch_object($nskl_pg, 0); + // TODO: UNCOMMENT IF THE NETWORK WORKS VERY WELL + // if ($nskl_obj->count >= 3) + $narrowskill = sprintf("%3.2f", $nskl_obj->skill); + } + return ($narrowskill); + } + + function usersnet_partyskill($owner, $target) + { + GLOBAL $G_dbpfx; + + $partyskill = "non disponibile"; + + $pskl_sql = sprintf("SELECT * FROM %susersnet_party WHERE owner = %d AND target = %d;", + $G_dbpfx, $owner, $target); + if (($pskl_pg = $this->query($pskl_sql)) == FALSE) { + return ($partyskill); + } + + if (pg_numrows($pskl_pg) > 0) { + $pskl_obj = pg_fetch_object($pskl_pg, 0); + // TODO: UNCOMMENT IF THE NETWORK WORKS VERY WELL + // if ($wskl_obj->count >= 3) + $partyskill = sprintf("%3.2f", $pskl_obj->skill); + } + return ($partyskill); + } + + function usersnet_bycode($owner, $target, $widefriend, $narrowfriend) + { + GLOBAL $G_dbpfx; + $ret = FALSE; + + $net_sql = sprintf("SELECT * FROM %susersnet WHERE owner = %d AND target = %d;", + $G_dbpfx, $owner, $target); + if (($net_pg = $this->query($net_sql)) == FALSE) + return FALSE; + + if (pg_numrows($net_pg) != 1) + return FALSE; + + $net_obj = pg_fetch_object($net_pg, 0); + + return (UsersNetItem::UsersNetItemFromRecord($net_obj, $widefriend, $narrowfriend)); + } + + function usersnet_default($owner, $target, $widefriend, $narrowfriend) + { + return (UsersNetItem::UsersNetItemDefaults($owner, $target, $widefriend, $narrowfriend)); + } + + function usersnet_save($owner_id, $json) + { + GLOBAL $G_dbpfx; + $ret = 99999; + $trans = FALSE; + + do { + $friend = usersnet_friend_getid($json->friend); + + $json->skill = intval($json->skill); + $json->trust = intval($json->trust); + + if ($json->skill < 1 || $json->skill > 5 || + $json->trust < 1 || $json->trust > 5 || + $friend == FALSE) { + $ret = 1; + break; + } + $this->transaction('BEGIN'); + $trans = TRUE; + + if ($friend == USERSNET_FRIEND_UNKNOWN) { + // try to update + $net_sql = sprintf(" + DELETE FROM %susersnet + USING %susers as us + WHERE owner = %d AND us.login = '%s' AND target = us.code;", + $G_dbpfx, $G_dbpfx, + $owner_id, escsql(strtolower($json->login))); + + if (($net_pg = $this->query($net_sql)) == FALSE) { + $ret = 5; + break; + } + } + else { // if ($friend == USERSNET_FRIEND_UNKNOWN + // try to update + $net_sql = sprintf(" + UPDATE %susersnet SET (friend, skill, trust, mtime) = + (%d, %d, %d, now()) + FROM %susers as us + WHERE owner = %d AND us.login = '%s' AND target = us.code RETURNING *;", + $G_dbpfx, + $friend, $json->skill, $json->trust, + $G_dbpfx, + $owner_id, escsql(strtolower($json->login))); + if (($net_pg = $this->query($net_sql)) == FALSE || pg_numrows($net_pg) == 0) { + $net_sql = sprintf(" + INSERT INTO %susersnet SELECT %d AS owner, us.code as target, + %d as friend, %d as skill, %d as trust + FROM %susers as us WHERE us.login = '%s' RETURNING *;", + $G_dbpfx, $owner_id, + $friend, $json->skill, $json->trust, + $G_dbpfx, escsql(strtolower($json->login))); + if (($net_pg = $this->query($net_sql)) == FALSE) { + log_wr('insert query failed'); + $ret = 2; + break; + } + if (pg_numrows($net_pg) != 1) { + log_wr(sprintf('insert numrow failed [%s] [%d]', $net_sql, pg_numrows($net_pg))); + $ret = 3; + break; + } + } + else { + if (pg_numrows($net_pg) != 1) { + log_wr('update numrow failed'); + $ret = 4; + break; + } + } + } + $this->transaction('COMMIT'); + return (0); + } while (0); + + if ($trans) + $this->transaction('ROLLBACK'); + + return ($ret); + } } // End class BriskDB class LoginDBOld diff --git a/web/Obj/sac-a-push.phh b/web/Obj/sac-a-push.phh index ca9c0cb..46227fc 100644 --- a/web/Obj/sac-a-push.phh +++ b/web/Obj/sac-a-push.phh @@ -30,6 +30,22 @@ define('DIRECT_ST_WRITE', 2); declare(ticks = 1); +/* this list is created with bin/get_globals.sh */ +$_globals_list = array( +'G_admin_mail', 'G_alarm_passwd', 'G_all_points', 'G_ban_list', 'G_base', +'G_black_list', 'G_brisk_version', 'G_btrace_pref_sub', 'G_cloud_smasher', +'G_crypt_key', 'G_dbasetype', 'G_dbauth', 'G_dbpfx', 'G_doc_path', +'G_domain', 'G_donors_all', 'G_donors_cur', 'G_is_local', 'G_lang', 'G_lng', +'G_mail_seed', 'G_notguar_code', 'G_PG_cons', 'G_PG_cons_n', 'G_PG_vow', +'G_PG_vow_n', 'G_poll_entries', 'G_poll_name', 'G_poll_title', +'G_provider_proxy', 'G_proxy_white_list', 'G_room_about', 'G_room_help', +'G_room_passwdhowto', 'G_room_roadmap', +'G_selfreg_mask', 'G_selfreg_tout', 'G_shutdown', 'G_sidebanner', +'G_sidebanner_idx', 'G_splash_content', 'G_splash_contents', +'G_splash_cont_idx', 'G_splash_h', 'G_splash_idx', 'G_splash_interval', +'G_splash_timeout', 'G_splash_w', 'G_topbanner', 'G_tos_dthard', +'G_tos_dtsoft', 'G_tos_fname', 'G_tos_idx', 'G_tos_vers', 'G_webbase'); + function global_dump() { GLOBAL $G_alarm_passwd, $G_ban_list, $G_black_list, $G_btrace_pref_sub, $G_dbauth; @@ -40,7 +56,7 @@ function global_dump() GLOBAL $G_splash_h, $G_splash_idx, $G_splash_interval, $G_splash_timeout; GLOBAL $G_splash_w, $G_topbanner, $G_with_donors, $G_with_poll; GLOBAL $G_with_splash, $G_sidebanner, $G_sidebanner_idx; - GLOBAL $G_with_topbanner, $G_selfreg_tout; + GLOBAL $G_with_topbanner, $G_selfreg_tout, $G_selfreg_mask; fprintf(STDERR, "G_alarm_passwd = [%s]\n", print_r($G_alarm_passwd, TRUE)); fprintf(STDERR, "G_ban_list = [%s]\n", print_r($G_ban_list, TRUE)); @@ -629,6 +645,18 @@ class Sac_a_push { $this->app->users_cleanup(); } + function check_globals() + { + GLOBAL $_globals_list; + foreach ($_globals_list as $g) { + if (!array_search($g, $GLOBALS) || !isset($GLOBALS[$g])) { + error_log(sprintf("Global [%s] not declared", $g)); + return FALSE; + } + } + return TRUE; + } + function run() { GLOBAL $DOCUMENT_ROOT, $HTTP_HOST; @@ -645,6 +673,11 @@ class Sac_a_push { GLOBAL $G_with_topbanner; GLOBAL $G_tos_vers, $G_tos_fname, $G_tos_dtsoft, $G_tos_dthard, $G_tos_idx, $G_doc_path; + if (!$this->check_globals()) { + fprintf(STDERR, "Take a look to the phplog file, GLOBALS missing!\n"); + sleep(10); + } + if ($this->main_loop) { return (FALSE); } @@ -816,6 +849,10 @@ class Sac_a_push { $this->reload(FALSE, $G_provider_proxy); $this->app->reload(FALSE, $G_ban_list, $G_black_list, $G_cloud_smasher); + if (!$this->check_globals()) { + fprintf(STDERR, "Take a look to the phplog file, GLOBALS missing!\n"); + sleep(10); + } global_dump(); } else if ($line == "shutdown" || $line == "sd") { diff --git a/web/Obj/user.phh b/web/Obj/user.phh index ad42e7f..c972404 100644 --- a/web/Obj/user.phh +++ b/web/Obj/user.phh @@ -923,5 +923,39 @@ function chunked_fini() } // end class User +define('USERSNET_FRIEND_BLACK', 1); +define('USERSNET_FRIEND_UNKNOWN', 2); +define('USERSNET_FRIEND_TEST', 3); +define('USERSNET_FRIEND_FRIEND', 4); +define('USERSNET_FRIEND_BFF', 5); + +if (!isset($__usersnet_friend_map)) { + $__usersnet_friend_map = array("black", "unknown", "test", "friend", "bff"); +} + +function usersnet_friend_getlabel($id) +{ + GLOBAL $__usersnet_friend_map; + + $id_i = intval($id); + + if ($id_i < 1 || $id_i > count($__usersnet_friend_map)) { + return FALSE; + } + return ($__usersnet_friend_map[$id_i - 1]); +} + +/* return index + 1 of friend label */ +function usersnet_friend_getid($label_in) +{ + GLOBAL $__usersnet_friend_map; + foreach ($__usersnet_friend_map as $id => $label) { + if ($label == $label_in) { + return ($id + 1); + } + } + + return FALSE; +} ?> diff --git a/web/brisk.css b/web/brisk.css index d4bafaa..75b4975 100644 --- a/web/brisk.css +++ b/web/brisk.css @@ -28,7 +28,7 @@ } body { - background-image: url('img/najole.png'); + background-image: url('img/najole_wh.png'); background-color: #fafafa; background-attachment: fixed; margin: 0px; @@ -110,7 +110,7 @@ img.ib_nobo { -moz-border-radius: 8px; border-radius: 8px; - background-image: url('img/najole_light.png'); + background-image: url('img/najole_wh_light.png'); background-attachment: fixed; top: 0; @@ -269,19 +269,29 @@ img.button:hover { span.au0 span { font-weight: bold; } +span.au0_off span { + font-weight: bold; +} span.au1 span { padding-left: 2px; padding-right: 4px; font-style: italic; -/* orange background-color: #ffd780; */ -/* red background-color: #ffb0b0; */ + background-color: #a1c8ff; +} +span.au1_off span { + padding-left: 2px; + padding-right: 4px; + font-style: italic; background-color: #a1c8ff; } span.au2 span { background-color: #bafcba; } +span.au2_off span { + background-color: #bafcba; +} span.au3 { padding-left: 24px; @@ -290,6 +300,12 @@ span.au3 { background-position: left center; } +span.au3_off span { + background-color: transparent; +} +span.au3_off { +} + span.au3 span { background-color: transparent; } diff --git a/web/briskin5/Obj/briskin5.phh b/web/briskin5/Obj/briskin5.phh index 0b61781..67b584c 100644 --- a/web/briskin5/Obj/briskin5.phh +++ b/web/briskin5/Obj/briskin5.phh @@ -1353,7 +1353,7 @@ class Bin5 { } - function chatt_send($user, $mesg) + function chatt_send($user, $mesg, $mlang_indwr = NULL) { GLOBAL $mlang_brisk, $G_lang; diff --git a/web/commons.js b/web/commons.js index d1d2318..29f6056 100644 --- a/web/commons.js +++ b/web/commons.js @@ -430,11 +430,6 @@ function act_roadmap() send_mesg("roadmap"); } -function act_whysupport() -{ - send_mesg("whysupport"); -} - function act_lascio() { send_mesg("lascio"); @@ -1038,7 +1033,7 @@ function user_decorator(user, is_real) for (i = 0 ; i < 4 ; i++) { if (flags & (1 << i)) { - cl += sp + "au" + i; + cl += sp + "au" + i + (is_real ? "" : "_off"); sp = " "; } } diff --git a/web/fieldify.js b/web/fieldify.js index 254dd0d..fdc9795 100644 --- a/web/fieldify.js +++ b/web/fieldify.js @@ -1,25 +1,79 @@ +function ends_with(s, suffix) +{ + if (s.indexOf(suffix, s.length - suffix.length) !== -1) { + return true; + } + return false; +} + +function __ffa_nav(obj, ret, name) +{ + var arr; + + arr = obj.className.split(" "); + if (arr.indexOf(name + "_id") != -1) { + ret.push(obj); + return; + } + + // check if the current element is a leaf or a node + // if it is then return + for (var i = 0 ; i < arr.length ; i++) { + if (ends_with(arr[i], "_id")) { + return; + } + } + + for (var i = 0 ; i < obj.children.length ; i++) { + __ffa_nav(obj.children[i], ret, name); + } + return; +} + +function fieldify_get_dom_element(objarr, name) +{ + var obj, ret = []; + + for (var i = 0 ; i < objarr.length ; i++) { + obj = objarr[i]; + for (var e = 0 ; e < obj.children.length ; e++) { + __ffa_nav(obj.children[e], ret, name); + } + } + + if (ret.length > 0) { + return ret; + } + return false; +} // fieldsdescr = { name: { type: 'typename' }, ... } -function Fieldify(ancestor, fieldsdescr) +function Fieldify(dom_elements, fieldsdescr) { - this.ancestor = ancestor; - + var item; + + this.dom_elements = dom_elements; this.field = new Array(); for (k in fieldsdescr) { this.field[k] = fieldsdescr[k]; + if (this.field[k].type == 'fields') { + if (item = fieldify_get_dom_element(this.dom_elements, k)) { + this.field[k].obj = new Fieldify(item, this.field[k].fields); + } + } } } Fieldify.prototype = { - ancestor: null, + dom_elements: null, field: null, - + visible: function(is_visible) { - this.ancestor.style.visibility = (is_visible ? "visible" : "hidden" ); + this.dom_elements[0].style.visibility = (is_visible ? "visible" : "hidden" ); }, // { 'name': 'value' } - populate: function(field_values) + json2dom: function(field_values) { for (k in this.field) { if (this.field[k].type == 'value') { @@ -28,27 +82,75 @@ Fieldify.prototype = { else if (this.field[k].type == 'radio') { this.fld_radio_set(k, field_values[k]); } + else if (this.field[k].type == 'fields') { + this.field[k].obj.json2dom(field_values[k]); + } + } + }, + + dom2json: function() + { + var ret = {}; + for (k in this.field) { + if (this.field[k].perms == 'ro') + continue; + if (this.field[k].type == 'value') { + ret[k] = this.fld_value_get(k); + } + else if (this.field[k].type == 'radio') { + ret[k] = this.fld_radio_get(k); + } + else if (this.field[k].type == 'fields') { + ret[k] = this.field[k].obj.dom2json(); + } } + return ret; }, fld_value_set: function(name, value) { - console.log(name + "=" + value); - this.ancestor.getElementsByClassName(name + '_id')[0].innerHTML = value; + var item = fieldify_get_dom_element(this.dom_elements, name); + if (item) { + item[0].innerHTML = value; + } + }, + + fld_value_get: function(name) + { + var item = fieldify_get_dom_element(this.dom_elements, name); + if (item) { + return (item[0].innerHTML); + } + return false; }, - + fld_radio_set: function(name, value) { - var arr = this.ancestor.getElementsByClassName(name + '_id'); - - console.log(name + "=" + value); + var arr = fieldify_get_dom_element(this.dom_elements, name); + if (arr) { + for (k in arr) { + if (arr[k].value == value) + arr[k].checked = true; + else + arr[k].checked = false; + } + } + }, - for (k in arr) { - if (arr[k].value == value) - arr[k].checked = true; - else - arr[k].checked = false; + fld_radio_get: function(name) + { + var ret = null; + var arr = fieldify_get_dom_element(this.dom_elements, name); + if (arr) { + for (k in arr) { + if (arr[k].checked == true) { + ret = arr[k].value; + break; + } + } } + return ret; }, + tap: null } diff --git a/web/index.php b/web/index.php index c841325..155935a 100644 --- a/web/index.php +++ b/web/index.php @@ -228,18 +228,34 @@ $mlang_room = array( 'userpassuse' => array('it' => 'Il tuo nickname è g 'en' => 'Send a message to the administrator:'), 'mesgtoadm_sub'=> array('it' => 'soggetto:', 'en' => 'subject:'), - 'info_login' => array('it' => 'Utente:', - 'en' => 'User:'), - 'info_state' => array('it' => 'Stato:', - 'en' => 'State:'), - 'info_guar' => array('it' => 'Garante:', - 'en' => 'Guarantee:'), - 'info_match' => array('it' => 'Partite:', - 'en' => 'Matches:'), - 'info_game' => array('it' => 'Mani:', - 'en' => 'Hands:'), + 'info_login' => array('it' => 'Utente', + 'en' => 'User'), + 'info_status' => array('it' => 'Stato', + 'en' => 'Status'), + 'info_status_tit' => array('it' => 'Stato dell\' utente.', + 'en' => 'User status.'), + 'info_guar' => array('it' => 'Garante', + 'en' => 'Guarantee'), + 'info_match' => array('it' => 'Partite', + 'en' => 'Matches'), + 'info_match_tit' => array('it' => 'Partite giocate ai tavoli riservati.', + 'en' => 'Matches played at reserved tables.'), + 'info_party' => array('it' => 'Party', + 'en' => 'Party'), + 'info_party_tit' => array('it' => 'Bravura calcolata in base ad amici, agli amici fidati e agli amici degli amici fidati in base alla credibilità degli amici fidati.', + 'en' => 'Skill calculated with party rules.'), + 'info_game' => array('it' => 'Mani', + 'en' => 'Hands'), + 'info_game_tit' => array('it' => 'Mani giocate ai tavoli riservati.', + 'en' => 'Hands played at reserved tables.'), 'info_frie' => array('it' => 'Conoscenza:', 'en' => 'Friendship:'), + 'info_repfrie' => array('it' => 'Cosa ne pensano gli amici', + 'en' => 'Friends reputation'), + 'info_repbff' => array('it' => 'Cosa ne pensano gli amici fidati', + 'en' => 'Best friends reputation'), + 'info_skill' => array('it' => 'Bravura', + 'en' => 'Skill') ); require_once("briskin5/Obj/briskin5.phh"); @@ -669,7 +685,7 @@ google_color_url = "000000"; "; + $tab_lines = ""; for ($i = 0 ; $i < $usr_n ; $i++) { $usr_obj = pg_fetch_object($usr_pg, $i); - $tab_lines .= sprintf("\n", + $tab_lines .= sprintf("\n", $usr_obj->code, ($nocheck ? "" : "CHECKED"), - eschtml($usr_obj->login), eschtml($usr_obj->guar_login), + eschtml($usr_obj->login), eschtml($usr_obj->email), eschtml($usr_obj->guar_login), ($usr_obj->type & USER_FLAG_TY_APPR ? "Yes" : "No"), $usr_obj->lintm); }
'.$banner_top_left.'
'.(($G_with_topbanner || $G_with_donors) ? '
' : '').'
- + '.$mlang_room['headline'][$G_lang].'
'.( ($G_with_topbanner || $G_with_donors) ? sprintf('
%s
', ($G_with_topbanner ? $G_topbanner : @@ -737,11 +753,6 @@ google_color_url = "000000"; alt="'.$mlang_room['tit_cook'][$G_lang].'">'.$mlang_room['itm_cook'][$G_lang].'

- '.$mlang_room['itm_cla'][$G_lang].'
@@ -764,7 +775,7 @@ google_color_url = "000000"; Parma 11/09
+ title="1° Torneo-Meeting di Parma del 22/11/2009">Parma 11/09
'.$altout_support_big.'
-
+ ' . ( /* NOTE: here facebook or fake facebook */ (!$G_is_local && $_cookie_law_3party == 'true') ? '
@@ -1006,6 +1017,7 @@ supported by:
+ @@ -1026,6 +1038,7 @@ var g_debug = 0; var g_lang = ""; var g_lng = ""; var g_tables_n = ; +var g_tables_appr_n = ; var g_tables_auth_n = ; var g_tables_cert_n = ; var g_prefs, g_prefs_new = null; @@ -1174,6 +1187,7 @@ cookie_law(null); + @@ -1194,6 +1208,7 @@ cookie_law(null); var g_lang = ""; var g_lng = ""; var g_tables_n = ; + var g_tables_appr_n = ; var g_tables_auth_n = ; var g_tables_cert_n = ; var g_prefs, g_prefs_new = null; @@ -1377,22 +1392,64 @@ type="submit" class="button" onclick="this.form.elements['realsub'].value = 'chi
-
UserGuarApprendiceDate
UserEMailGuarApprendiceDate
%s%s%s%s
%s%s%s%s%s