Merge remote-tracking branch 'origin/master' into nginx
authorMatteo Nastasi <nastasi@alternativeoutput.it>
Thu, 12 Jan 2017 06:23:23 +0000 (06:23 +0000)
committerMatteo Nastasi <nastasi@alternativeoutput.it>
Thu, 12 Jan 2017 06:23:23 +0000 (06:23 +0000)
Conflicts:
web/briskin5/index_wr.php
web/index_wr.php

30 files changed:
INSTALL.sh
TODO.txt
bin/get_globals.sh [new file with mode: 0755]
doc/ARCHITECTURE.txt
sql/builder.sh
sql/sql.d/066-insert-unnorm-games.sql.test [deleted file]
sql/sql.d/066-insert-unnorm-games_test.sql [new file with mode: 0644]
sql/sql.d/075-users-network.sql [new file with mode: 0644]
sql/sql.d/100-anagr.sql.devel [deleted file]
sql/sql.d/900-anagr_devel.sql [new file with mode: 0644]
sql/sql.d/910-usernet_devel.sql [new file with mode: 0644]
test/logintest.php [new file with mode: 0755]
web/Obj/brisk.conf-templ.pho
web/Obj/brisk.phh
web/Obj/dbase_base.phh
web/Obj/dbase_pgsql.phh
web/Obj/sac-a-push.phh
web/Obj/user.phh
web/brisk.css
web/briskin5/Obj/briskin5.phh
web/commons.js
web/fieldify.js
web/index.php
web/index_wr.php
web/info.js [new file with mode: 0644]
web/mailmgr.php
web/prefs.js
web/room.css
web/room.js
web/usermgmt.php

index a4b076c..219c73e 100755 (executable)
@@ -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 <auth_tab>] [-G <cert_tab>] [-A <apache-conf>] [-a <auth_file_name>] [-f <conffile>] [-p <outconf>] [-U <usock_path>] [-u <sys_user>] [-d <TRUE|FALSE>] [-w <web_dir>] [-k <ftok_dir>] [-l <legal_path>] [-y <proxy_path>] [-P <prefix_path>] [-x]"
+    echo "$1 [-W] [-n 3|5] [-c 2|8] [-t <(n>=4)>] [-T <auth_tab>] [-r <appr_tab>] [-G <cert_tab>] [-A <apache-conf>] [-a <auth_file_name>] [-f <conffile>] [-p <outconf>] [-U <usock_path>] [-u <sys_user>] [-d <TRUE|FALSE>] [-w <web_dir>] [-k <ftok_dir>] [-l <legal_path>] [-y <proxy_path>] [-P <prefix_path>] [-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;
index 8de1e80..ce58d46 100644 (file)
--- 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
+   <release>
+   - 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 
+     <release>
+     - 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
          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 (executable)
index 0000000..f235dfb
--- /dev/null
@@ -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
+
+
index f1d7069..b89ba88 100644 (file)
@@ -1,5 +1,10 @@
 ===== Sparse documentation about Brisk. =====
 
+==== Form Workflow ====
+
+- div on page
+
+
 User cleanup:
   spush::garbage_manager()
     if (user->the_end)
index b71624d..f67fa23 100755 (executable)
@@ -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 (file)
index 930815e..0000000
+++ /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 (file)
index 0000000..930815e
--- /dev/null
@@ -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 (file)
index 0000000..c725938
--- /dev/null
@@ -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 (file)
index 9de8924..0000000
+++ /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 (file)
index 0000000..4730163
--- /dev/null
@@ -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 (file)
index 0000000..1c780b7
--- /dev/null
@@ -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 (executable)
index 0000000..0ad0984
--- /dev/null
@@ -0,0 +1,29 @@
+#!/usr/bin/php
+<?php
+
+$G_base = "web/";
+
+require_once('test/Obj/test.phh');
+require_once('web/Obj/brisk.phh');
+
+printf("testing internal_encoding: ");
+if (mb_internal_encoding() != "UTF-8") {
+    printf("mb_internal_encoding from cli/php.ini: [%s], FIX with UTF-8\n", mb_internal_encoding());
+    exit(1);
+}
+else {
+    printf("UTF-8, OK\n");
+}
+
+$nam = array ("ò12345678912", "ò123456789123", "pippo", "pìppo", "zorrro", "pìììppo");
+
+if (mb_strlen($nam[0]) != 12) {
+    printf("mb_strlen not return expected len (12) but %d\n", mb_strlen($nam[0]));
+    exit(1);
+}
+
+for ($i = 0 ; $i < count($nam) ; $i++) {
+    printf("[%s] %s\n", $nam[$i], (login_consistency($nam[$i]) ? "TRUE" : "FALSE"));
+}
+
+?>
\ No newline at end of file
index 8d4858c..837e4ed 100644 (file)
@@ -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";
index 45e5fd1..0c33591 100644 (file)
@@ -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.'), <b>NOVITA\'</b>: 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.'), <b>NOVITA\'</b>: 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 <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ),
-                       'en' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NEWS</b>: ENcomando /info e doppio click sugli utenti registrati, nuovi utenti apprendisti.',
-                                       'If you want to subscribe our <a target="_blank" href="ml-briscola+subscribe@milug.org">Mailing List</a>, click it!' ) );
+                       'en' => array ( 'EN Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: 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 <a target="_blank" href="mailto:ml-briscola+subscribe@milug.org">Mailing List</a>, cliccala!' ) );
 
 $G_room_help = array( 'it' => '
 <div style=\\"text-align: left; padding: 8px;\\">
@@ -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 <b>\'%s\'</b> &egrave; gi&agrave; registrato, <b>se il suo proprietario si autentificher&agrave; verrai rinominato d\'ufficio come ghost<i>N</i>.</b>" */
-                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);
+}
 ?>
index 1e7a19a..66c998f 100644 (file)
@@ -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
index f8b7538..cdcec51 100644 (file)
@@ -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
index ca9c0cb..46227fc 100644 (file)
@@ -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") {
index ad42e7f..c972404 100644 (file)
@@ -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;
+}
 ?>
index d4bafaa..75b4975 100644 (file)
@@ -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;
 }
index 0b61781..67b584c 100644 (file)
@@ -1353,7 +1353,7 @@ class Bin5 {
     }
 
 
-    function chatt_send($user, $mesg)
+    function chatt_send($user, $mesg, $mlang_indwr = NULL)
     {
         GLOBAL $mlang_brisk, $G_lang;
 
index d1d2318..29f6056 100644 (file)
@@ -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 = " ";
         }
     }
index 254dd0d..fdc9795 100644 (file)
@@ -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
 }
index c841325..155935a 100644 (file)
@@ -228,18 +228,34 @@ $mlang_room = array( 'userpassuse'  => array('it' => 'Il tuo nickname &egrave; 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";
 <table width="100%%" border="0" cols="3"><tr>
 <td align="left"><div style="padding-left: 8px;">'.$banner_top_left.'</div></td>
 <td align="center">'.(($G_with_topbanner || $G_with_donors) ? '<table><tr><td>' : '').'<div style="text-align: center;">
-    <img class="nobo" src="img/brisk_logo64.png">
+    <!--<img class="nobo" src="img/brisk_logo64.png">--><img class="nobo" src="img/brisk_logo64_blackribbon.png" title="ciao grrr">
     '.$mlang_room['headline'][$G_lang].'<br>
     </div>'.( ($G_with_topbanner || $G_with_donors) ? sprintf('</td><td>%s</td></tr></table>',
                                                                 ($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].'</a><br>
 <hr>
 
-<!--
-<a href="#"
-   onmouseover="menu_hide(0,1);"
-   title="perché supportare brisk?" onclick="act_whysupport();">supportare?</a><br>
--->
 <a href="#"
    onmouseover="menu_hide(0,1);"
    title="'.$mlang_room['tit_cla'][$G_lang].'" onclick="act_placing();">'.$mlang_room['itm_cla'][$G_lang].'</a><br>
@@ -764,7 +775,7 @@ google_color_url = "000000";
 
 <a href="http://it-it.facebook.com/event.php?eid=165523204539&index=1"
    target="_blank" onmouseover="menu_hide(0,2);"
-   title="1° Torneo-Meeting di Parma del 22/11/2009" <img style="display: inline;" class="nobo" src="img/coppa16.png">Parma 11/09</a><br>
+   title="1° Torneo-Meeting di Parma del 22/11/2009"><img style="display: inline;" class="nobo" src="img/coppa16.png">Parma 11/09</a><br>
 
 <a href="http://it-it.facebook.com/event.php?eid=105699129890&index=1"
    target="_blank" onmouseover="menu_hide(0,2);"
@@ -984,7 +995,7 @@ supported by:<br>
 <div style="position: absolute;">
 '.$altout_support_big.'
 </div>
-<a style="/* position: absolute; top: 40px; left: 6px;" */ target="_blank" href="http://it-it.facebook.com/group.php?gid=59742820791"><img class="nobo" id="btn_facebook" src="img/facebook_btn.png" title="unisciti al gruppo \'quelli della brisk\'"></a>
+<a style="/* position: absolute; top: 40px; left: 6px; */" target="_blank" href="http://it-it.facebook.com/group.php?gid=59742820791"><img class="nobo" id="btn_facebook" src="img/facebook_btn.png" title="unisciti al gruppo \'quelli della brisk\'"></a>
 ' . ( /* NOTE: here facebook or fake facebook */
 (!$G_is_local && $_cookie_law_3party == 'true') ?
 '<div class="fb-like" style="margin-top: 4px;" data-href="https://www.facebook.com/pages/Brisk-briscola-chiamata-in-salsa-ajax/716026558416911" data-share="false" data-send="true" data-width="70" data-show-faces="false" data-colorscheme="dark" layout="button_count"></div>
@@ -1006,6 +1017,7 @@ supported by:<br>
 <script type="text/javascript" src="commons.js"></script>
 <script type="text/javascript" src="fieldify.js"></script>
 <script type="text/javascript" src="prefs.js"></script>
+<script type="text/javascript" src="info.js"></script>
 <!-- <script type="text/javascript" src="myconsole.js"></script> -->
 <script type="text/javascript" src="menu.js"></script>
 <script type="text/javascript" src="heartbit.js"></script>
@@ -1026,6 +1038,7 @@ var g_debug = 0;
 var g_lang = "<? echo $G_lang; ?>";
 var g_lng = "<? echo $G_lng; ?>";
 var g_tables_n = <? echo TABLES_N; ?>;
+var g_tables_appr_n = <? echo TABLES_APPR_N; ?>;
 var g_tables_auth_n = <? echo TABLES_AUTH_N; ?>;
 var g_tables_cert_n = <? echo TABLES_CERT_N; ?>;
 var g_prefs, g_prefs_new = null;
@@ -1174,6 +1187,7 @@ cookie_law(null);
 <script type="text/javascript" src="commons.js"></script>
 <script type="text/javascript" src="fieldify.js"></script>
 <script type="text/javascript" src="prefs.js"></script>
+<script type="text/javascript" src="info.js"></script>
 <!-- <script type="text/javascript" src="myconsole.js"></script> -->
 <script type="text/javascript" src="menu.js"></script>
 <script type="text/javascript" src="ticker.js"></script>
@@ -1194,6 +1208,7 @@ cookie_law(null);
    var g_lang = "<? echo $G_lang; ?>";
    var g_lng = "<? echo $G_lng; ?>";
    var g_tables_n = <? echo TABLES_N; ?>;
+   var g_tables_appr_n = <? echo TABLES_APPR_N; ?>;
    var g_tables_auth_n = <? echo TABLES_AUTH_N; ?>;
    var g_tables_cert_n = <? echo 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
 <div id="xhrdeltalog"></div>
 </div>
 
-<div id="info" class="notify" style="z-index: 200; width: 400px; margin-left: -200px; height: 340px; top: 150px; visibility: hidden;">
+<div id="info" class="notify" style="z-index: 200; width: 500px; margin-left: -250px; height: 340px; top: 150px; visibility: hidden;">
 <table class="info">
-<tr><td class="le"><b><?php echo $mlang_room['info_login'][$G_lang]; ?></b></td><td class="ri"><span class="login_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_state'][$G_lang]; ?></b></td><td class="ri"><span class="state_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_guar'][$G_lang]; ?></b></td><td class="ri"><span class="guar_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_match'][$G_lang]; ?></b></td><td class="ri"><span class="match_id"></span></td></tr>
-<tr><td class="le"><b><?php echo $mlang_room['info_game'][$G_lang]; ?></b></td><td class="ri"><span class="game_id"></span></td></tr>
-<tr><td colspan="2" style="background-color: pink;">di seguito le opzioni che verranno attivate successivamente:</td></tr>
-<tr><td class="le ri" colspan="2"><b><?php echo $mlang_room['info_frie'][$G_lang]; ?></b></td></tr>
-<tr><td class="le info-opt"><input type="radio" name="friend" class="friend_id" value="black">Da evitare</td>
-    <td class="ri info-opt"><input type="radio" name="friend" class="friend_id" value="friend">Amico</td></tr>
-<tr><td class="le info-opt"><input type="radio" name="friend" class="friend_id" value="unknown">Sconosciuto</td>
-<td class="ri info-opt"><input type="radio" name="friend" class="friend_id" value="bff">Amico fidato</td></tr>
-<tr><td class="le info-opt"><input type="radio" name="friend" class="friend_id" value="test">In prova</td></tr>
-<tr><td class="le"><b>Bravura:</b></td><td class="le"><b>Credibilità:</b></td></tr>
-<tr><td class="info-opt">
+
+<tr>
+<td class="head"><span><?php echo $mlang_room['info_login'][$G_lang]; ?>:</span></td>
+<td class="ri b-right data"><span class="login_id"></span></td>
+<td class="head"><span><?php echo $mlang_room['info_status'][$G_lang]; ?>:</span></td>
+<td class="ri data"><span class="state_id"></span></td>
+</tr>
+
+<tr>
+<td class="head"><span><?php echo $mlang_room['info_guar'][$G_lang]; ?>:</span></td>
+<td class="ri b-right data"><span class="guar_id"></span></td>
+<td class="head"><span class="title" title="<?php echo $mlang_room['info_match_tit'][$G_lang]; ?>"><?php echo $mlang_room['info_match'][$G_lang]; ?>:</span></td>
+<td class="ri data"><span class="match_id"></span></td>
+</tr>
+
+<tr>
+<td class="head"><span class="title" title="<?php echo $mlang_room['info_party_tit'][$G_lang]; ?>"><?php echo $mlang_room['info_party'][$G_lang]; ?>:</span></td>
+<td class="ri b-right data"><span class="party_id"></span></td>
+<td class="head"><span class="title" title="<?php echo $mlang_room['info_game_tit'][$G_lang]; ?>"><?php echo $mlang_room['info_game'][$G_lang]; ?>:</span></td>
+<td class="ri data"><span class="game_id"></span></td>
+</tr>
+
+<tr class="widefriend_id">
+<td colspan="3" class="head"><span><?php echo $mlang_room['info_repfrie'][$G_lang]; ?>:</span></td>
+<td class="le data"><?php echo $mlang_room['info_skill'][$G_lang]; ?>: <span class="skill_id"></span></td>
+</tr>
+
+<tr class="widefriend_id"><td class="le info-opt data">Da evitare: <span class="black_id"></span></td>
+<td class="le info-opt data">In prova: <span class="test_id"></span></td>
+<td class="le info-opt data">Amico: <span class="friend_id"></span></td>
+<td class="le data">Fidato: <span class="bff_id"></span></td></tr>
+
+<tr class="narrowfriend_id">
+<td colspan="3" class="head"><span><?php echo $mlang_room['info_repbff'][$G_lang]; ?>:</span></td>
+<td class="le data"><?php echo $mlang_room['info_skill'][$G_lang]; ?>: <span class="skill_id"></span></td></tr>
+
+<tr class="narrowfriend_id"><td class="le info-opt data">Da evitare: <span class="black_id"></span></td>
+<td class="le info-opt data">In prova: <span class="test_id"></span></td>
+<td class="le info-opt data">Amico: <span class="friend_id"></span></td>
+<td class="le data">Fidato: <span class="bff_id"></span></td></tr>
+<tr><td class="le ri triple" colspan="3"><b><?php echo $mlang_room['info_frie'][$G_lang]; ?></b></td>
+<td class="le data triple"><input type="radio" name="friend" class="friend_id" value="black"
+    onclick="info_onlyifknown_isvisible();">Da evitare</td></tr>
+<tr>
+<td class="le info-opt data"><input type="radio" name="friend" class="friend_id" value="unknown"
+    onclick="info_onlyifknown_isvisible();">Sconosciuto</td>
+<td class="le info-opt data"><input type="radio" name="friend" class="friend_id" value="test"
+    onclick="info_onlyifknown_isvisible();">In prova</td>
+<td class="ri info-opt data"><input type="radio" name="friend" class="friend_id" value="friend"
+    onclick="info_onlyifknown_isvisible();">Amico</td>
+<td class="ri info-opt data"><input type="radio" name="friend" class="friend_id" value="bff"
+    onclick="info_onlyifknown_isvisible();">Amico fidato</td>
+</tr>
+<tr class="onlyifknown_gid">
+<td class="le head"><span><?php echo $mlang_room['info_skill'][$G_lang]; ?>:</span></td>
+<td class="data">
     <table class="fiverank" style="margin: auto;">
        <tr><td class="c1t">1</td>
            <td class="c2t">2</td>
@@ -1406,26 +1463,28 @@ type="submit" class="button" onclick="this.form.elements['realsub'].value = 'chi
            <td class="c5b"><input type="radio" name="skill" class="skill_id" value="5"></td>
        </tr>
     </table>
-</td><td class="info-opt">
+</td>
+<td class="le"><b>Credibilità:</b></td>
+<td class="data">
     <table class="fiverank" style="margin: auto;">
        <tr><td class="c1t">1</td>
            <td class="c2t">2</td>
            <td class="c3t">3</td>
            <td class="c4t">4</td>
            <td class="c5t">5</td></tr>
-       <tr><td class="c1b"><input type="radio" name="credib" class="credib_id" value="1"></td>
-           <td class="c2b"><input type="radio" name="credib" class="credib_id" value="2"></td>
-           <td class="c3b"><input type="radio" name="credib" class="credib_id" value="3"></td>
-           <td class="c4b"><input type="radio" name="credib" class="credib_id" value="4"></td>
-           <td class="c5b"><input type="radio" name="credib" class="credib_id" value="5"></td>
+       <tr><td class="c1b"><input type="radio" name="trust" class="trust_id" value="1"></td>
+           <td class="c2b"><input type="radio" name="trust" class="trust_id" value="2"></td>
+           <td class="c3b"><input type="radio" name="trust" class="trust_id" value="3"></td>
+           <td class="c4b"><input type="radio" name="trust" class="trust_id" value="4"></td>
+           <td class="c5b"><input type="radio" name="trust" class="trust_id" value="5"></td>
        </tr>
     </table>
 </td></tr>
 </table>
 <div style="position: absolute; bottom: 8px; margin: auto; width: 100%;">
 <input type="submit" class="input_sub" style="bottom: 4px;" onclick="$('info').style.visibility = 'hidden';" value="<?php echo $mlang_room['btn_close'][$G_lang]; ?>"/>
-<!-- <input type="submit" class="input_sub" style="bottom: 4px;" onclick="prefs_reset();" value="<?php echo $mlang_room['btn_reset'][$G_lang]; ?>"/>
-<input type="submit" class="input_sub" style="bottom: 4px;" onclick="prefs_save();" value="<?php echo $mlang_room['btn_save'][$G_lang]; ?>"/> -->
+<input type="submit" class="input_sub" style="bottom: 4px;" onclick="info_reset();" value="<?php echo $mlang_room['btn_reset'][$G_lang]; ?>"/>
+<input type="submit" class="input_sub" style="bottom: 4px;" onclick="info_save();" value="<?php echo $mlang_room['btn_save'][$G_lang]; ?>"/>
 </div>
 
 </div>
index 71b3f9c..48b3c14 100644 (file)
@@ -42,6 +42,8 @@ $mlang_indwr = array( 'unknownerr'    => array( 'it' => 'errore sconosciuto',
                                            'en' => 'To send a message to the administrator you have to be authenticated'),
                       'shutmsg'  => array( 'it' => '<b>Il server sta per essere riavviato, non possono avere inizio nuove partite.</b>',
                                            'en' => '<b>The server is going to be rebooted, new games are not allowed.</b>'),
+                      'mustappr' => array( 'it' => '<b>Il tavolo a cui volevi sederti richiede autentifica o apprendistato.</b>',
+                                           'en' => '<b>The table where you want to sit require authentication or apprentice</b>'),
                       'mustauth' => array( 'it' => '<b>Il tavolo a cui volevi sederti richiede autentifica.</b>',
                                            'en' => '<b>The table where you want to sit require authentication</b>'),
                       'mustcert' => array( 'it' => '<b>Il tavolo a cui volevi sederti richiede autentifica e certificazione.</b>',
@@ -117,6 +119,10 @@ Ti sei registrato col nickname \'%s\',<br>
 Ciò è necessario per ottenere la password.<br><br>
 Saluti e buone partite, mop.<br>',
                                            'en' => 'EN mhtml [%s] [%s]'),
+                      'info_err' => array( 'it' => 'E\' occorso un errore (%d), riprova più tardi.',
+                                           'en' => 'Some error occurs (%d), retry later.'),
+                      'info_auth' => array('it' => 'Non essendo autenticato non puoi costruire una rete di preferenze.',
+                                           'en' => 'Some error occurs (%d), retry later.')
                       );
 
 define('LICMGR_CHO_ACCEPT', 0);
@@ -224,9 +230,6 @@ function index_wr_main(&$brisk, $remote_addr_full, $get, $post, $cookie)
 
             echo show_notify(str_replace("\n", " ", placings_show(FALSE)), 0, $mlang_indwr['btn_close'][$G_lang], 800, 600);
         }
-        else if ($argz[0] == 'whysupport') {
-            echo show_notify(str_replace("\n", " ", $G_room_whysupport[$G_lang]), 0, $mlang_indwr['btn_close'][$G_lng], 400, 200);
-        }
         else if ($argz[0] == 'apprentice') {
             if (($cli_name = gpcs_var('cli_name', $get, $post, $cookie)) === FALSE)
                 $cli_name = "";
@@ -239,6 +242,12 @@ function index_wr_main(&$brisk, $remote_addr_full, $get, $post, $cookie)
             // check existence of username or email
             $is_trans = FALSE;
             do {
+                error_log($cli_name);
+                if (login_consistency($cli_name) == FALSE) {
+                    $mesg_to_user = "Il nickname non è conforme alle regole per la sua costruzione.";
+                    break;
+                }
+
                 if (($bdb = BriskDB::create()) == FALSE) {
                     $mesg_to_user = "Connessione al database fallita";
                     break;
@@ -351,6 +360,26 @@ function index_wr_main(&$brisk, $remote_addr_full, $get, $post, $cookie)
     if ($argz[0] == 'ping') {
         log_wr("PING RECEIVED");
     }
+    else if ($argz[0] == 'info') {
+        if ($user->is_auth()) {
+            if ($argz[1] == 'save') {
+                if (!isset($post['info'])) {
+                    return FALSE;
+                }
+                if (($ret = $brisk->info_save($user, $post['info'])) == 0) {
+                    echo "1";
+                    return TRUE;
+                }
+
+                printf($mlang_indwr['info_err'][$G_lang], $ret);
+                return FALSE;
+            }
+        }
+        else {
+            printf($mlang_indwr['info_auth'][$G_lang]);
+            return FALSE;
+        }
+    }
     else if ($argz[0] == 'prefs') {
         if ($argz[1] == 'save') {
             if (!isset($post['prefs'])) {
@@ -412,7 +441,7 @@ function index_wr_main(&$brisk, $remote_addr_full, $get, $post, $cookie)
                 if (($wa_lock = Warrant::lock_data(TRUE)) != FALSE) {
                     if (($fp = @fopen(LEGAL_PATH."/warrant.txt", 'a')) != FALSE) {
                         /* Unix time | session | nickname | IP | where was | mesg */
-                        fwrite($fp, sprintf("%ld|%s|%s|%s|\n", $curtime, xcapelt($user->name), xcapelt(urldecode($cli_name)), xcapelt(urldecode($cli_email))));
+                        fwrite($fp, sprintf("%ld|%s|%s|%s|\n", $curtime, xcapelt($user->name), xcapelt(trim(urldecode($cli_name))), xcapelt(trim(urldecode($cli_email)))));
                         fclose($fp);
                     }
                     Warrant::unlock_data($wa_lock);
@@ -434,8 +463,8 @@ function index_wr_main(&$brisk, $remote_addr_full, $get, $post, $cookie)
                     if (($bdb = BriskDB::create()) == FALSE)
                         break;
 
-                    $cli_name = urldecode($cli_name);
-                    $cli_email = urldecode($cli_email);
+                    $cli_name = trim(urldecode($cli_name));
+                    $cli_email = trim(urldecode($cli_email));
 
                     // check for already used fields
                     if (($idret = $bdb->check_record_by_login_or_email($cli_name, $cli_email)) != 0) {
@@ -736,17 +765,9 @@ function index_wr_main(&$brisk, $remote_addr_full, $get, $post, $cookie)
             log_wr($user->comm[$user->step % COMM_N]);
             $user->step_inc();
 
-        }
-        else if ($argz[0] == 'whysupport') {
-            $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ";
-            $user->comm[$user->step % COMM_N] .=  show_notify(str_replace("\n", " ", $G_room_whysupport[$G_lang]), 0, $mlang_indwr['btn_backtotab'][$G_lang], 400, 200);
-
-            log_wr($user->comm[$user->step % COMM_N]);
-            $user->step_inc();
-
         }
         else if ($argz[0] == 'chatt') {
-            $brisk->chatt_send($user, xcapemesg($mesg));
+            $brisk->chatt_send($user, xcapemesg($mesg), $mlang_indwr);
         }
         else if ($argz[0] == 'tosmgr') {
             // check IF is authnticated user, both terms of service versions matches
@@ -811,6 +832,10 @@ function index_wr_main(&$brisk, $remote_addr_full, $get, $post, $cookie)
                           (!$user->is_auth() || $user->is_appr()) ) {
                     $not_allowed_msg = nickserv_msg($dt, $mlang_indwr['mustauth'][$G_lang]);
                 }
+                else if ( $table->auth_type == TABLE_AUTH_TY_APPR &&
+                          (!$user->is_auth()) ) {
+                    $not_allowed_msg = nickserv_msg($dt, $mlang_indwr['mustappr'][$G_lang]);
+                }
                 else if ($user->flags & USER_FLAG_TY_FIRONLY && $table->player_n > 0) {
                     $not_allowed_msg = nickserv_msg($dt, $mlang_indwr['mustfirst'][$G_lang]);
                 }
diff --git a/web/info.js b/web/info.js
new file mode 100644 (file)
index 0000000..1d4e197
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ *  brisk - info.js
+ *
+ *  Copyright (C) 2015      Matteo Nastasi
+ *                          mailto: nastasi@alternativeoutput.it
+ *                                  matteo.nastasi@milug.org
+ *                          web: http://www.alternativeoutput.it
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details. You should have received a
+ * copy of the GNU General Public License along with this program; if
+ * not, write to the Free Software Foundation, Inc, 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+var mlang_info = { 'btn_close' : { 'it' : 'Chiudi.',
+                                   'en' : 'Close.' }
+                 };
+
+
+function info_fld(dobj)
+{
+    var fields = { login: { type: 'value' },
+                   state: { type: 'value', perms: 'ro' },
+                   guar: { type: 'value', perms: 'ro' },
+
+                   widefriend: { type: 'fields', fields: { skill: { type: 'value', perms: 'ro' },
+                                                           black: { type: 'value', perms: 'ro' },
+                                                           test: { type: 'value', perms: 'ro'},
+                                                           friend: { type: 'value', perms: 'ro'},
+                                                           bff: { type: 'value', perms: 'ro'}
+                                                         } },
+                   narrowfriend: { type: 'fields', fields: { skill: { type: 'value', perms: 'ro' },
+                                                             black: { type: 'value', perms: 'ro'},
+                                                             test: { type: 'value', perms: 'ro'},
+                                                             friend: { type: 'value', perms: 'ro'},
+                                                             bff: { type: 'value', perms: 'ro'}
+                                                         } },
+                   match: { type: 'value', perms: 'ro' },
+                   game: { type: 'value', perms: 'ro' },
+                   party: { type: 'value', perms: 'ro' },
+                   friend: { type: 'radio' },
+                   skill: { type: 'radio' },
+                   trust: { type: 'radio' }
+                 };
+
+    var ret = new Fieldify([dobj], fields);
+    return (ret);
+ }
+
+function info_show(username)
+{
+    var info_in_in = server_request('mesg', 'chatt|/info ' +
+                                            encodeURIComponent(username));
+    var info_in = JSON.parse(info_in_in);
+    var info = null;
+
+    if (info_in.ret == 0) {
+        info = info_fld($('info'));
+        info.json2dom(info_in);
+        info_onlyifknown_isvisible();
+        info.visible(true);
+        }
+    else {
+        var noti = new notify(gst, info_in.mesg, 0, mlang_info['btn_close'][g_lang], 400, 150);
+    }
+}
+
+var g__info_show_target = "";
+function info_show_cb(e)
+{
+    if (g__info_show_target == e.target.innerHTML) {
+        g__info_show_target = "";
+        info_show(e.target.innerHTML);
+    }
+    else {
+        g__info_show_target = e.target.innerHTML;
+    }
+}
+
+function info_reset()
+{
+    var ret, target;
+
+    target = $('info').getElementsByClassName('login_id')[0].innerHTML;
+    return info_show(target);
+}
+
+function info_save()
+{
+    var info, jinfo, ret;
+
+    info = info_fld($('info'));
+    jinfo = info.dom2json();
+
+    ret = server_request('mesg', 'info|save','__POST__', 'info', JSON.stringify(jinfo));
+
+    if (ret == 1) {
+        $('info').style.visibility = 'hidden';
+    }
+    else {
+        alert(ret);
+    }
+}
+function info_onlyifknown_isvisible()
+{
+    var vis = 'inherit';
+    var arr = fieldify_get_dom_element([$('info')], 'friend');
+    var obj = null;
+
+    for (var k = 0 ; k < arr.length ; k++) {
+        if (arr[k].checked == true) {
+            obj = arr[k];
+            break;
+        }
+    }
+    if (obj == null) {
+        return false;
+    }
+
+    if (obj.value == 'black' || obj.value == 'unknown') {
+        vis = 'hidden';
+    }
+    $('info').getElementsByClassName('onlyifknown_gid')[0].style.visibility = vis;
+    return true;
+}
index c2e89ee..8d4e107 100644 (file)
@@ -76,8 +76,14 @@ function main() {
             $errcode = 0;
         } while (FALSE);
         if ($errcode) {
-            singlemsg("E' occorso un errore durante la verifica della e-mail.",
-                      sprintf("E' occorso un errore durante la verifica della e-mail.<br><br>Codice d'errore: %d.<br>", $errcode));
+            if ($errcode == 10002) {
+                singlemsg("L'email è già stata verificata con successo.",
+                          "L'email è già stata verificata con successo, ora attenda che le venga recapitata la password.");
+            }
+            else {
+                singlemsg("E' occorso un errore durante la verifica della e-mail.",
+                          sprintf("E' occorso un errore durante la verifica della e-mail.<br><br>Codice d'errore: %d.<br>", $errcode));
+            }
             $bdb->transaction('ROLLBACK');
         }
     }
index 51b7eba..87d84c8 100644 (file)
@@ -114,8 +114,12 @@ function prefs_save()
 
     ret = server_request('mesg', 'prefs|save','__POST__', 'prefs', JSON.stringify(g_prefs));
 
-    if (ret == 1)
+    if (ret == 1) {
         $('preferences').style.visibility = 'hidden';
+    }
+    else {
+        alert(ret);
+    }
 }
 
 function prefs_reset()
index ab78151..02d8cd6 100644 (file)
@@ -138,7 +138,7 @@ table.placings td
 }
 
 table.placing {
-    background-image: url('img/najole_light.png');
+    background-image: url('img/najole_wh_light.png');
     background-attachment: fixed;
 
     border: 1px solid gray;
@@ -196,7 +196,7 @@ table.room_tab td {
     -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;
 
     width: 25%;
@@ -244,7 +244,7 @@ table.room_standup {
     border-spacing: 0px;
     padding: 0px;
 
-    background-image: url('img/najole_light.png');
+    background-image: url('img/najole_wh_light.png');
     background-attachment: fixed;
 }
 
@@ -264,7 +264,7 @@ table.login {
     border: 1px solid gray;
     margin-top: 8px;
 
-    background-image: url('img/najole_light.png');
+    background-image: url('img/najole_wh_light.png');
     background-attachment: fixed;
  }
 
@@ -316,7 +316,7 @@ div.esco {
     -moz-border-radius: 4px;
     border-radius: 4px;
 
-    background-image: url('img/najole_light.png');
+    background-image: url('img/najole_wh_light.png');
     background-attachment: fixed;
 }
 
@@ -510,10 +510,29 @@ table.info {
 
 table.info td {
     border-top: 1px solid grey;
-    padding: 4px;
-    width: 50%;
+    padding: 6px;
+    width: 25%;
+}
+
+table.info td.triple {
+    border-top: 2px solid #000000;
+}
+
+table.info td.head span.title {
+    cursor: help;
+}
+
+table.info td.head span {
+    font-weight: bold;
 }
 
+table.info td.data {
+    background-color: white;
+}
+table.info td.data span {
+    text-align: left;
+    font-style: italic;
+}
 
 table.info table.fiverank {
     border-collapse: collapse;
@@ -575,16 +594,20 @@ table.info td.info-opt {
     padding: 0px 4px 4px 4px;
     }
 
+table.info td.b-right {
+    border-right: 1px solid grey;
+    }
+
 table.info td.noborder {
     border-top: 0px;
     }
 
 table.info td.le {
-    padding-left: 16px;
+    padding-left: 8px;
     }
 
 table.info td.ro {
-    padding-right: 16px;
+    padding-right: 8px;
     }
 
 body.explain h1 {
index f6d6d24..38a3d2a 100644 (file)
@@ -426,7 +426,7 @@ function j_stand_cont(ddata)
 
     var usr = $("standup").getElementsByClassName("id_usr");
     for (i = 0 ; i < usr.length ; i++) {
-        addEvent(usr[i], "click", click_update_cb);
+        addEvent(usr[i], "click", info_show_cb);
     }
 }
 
@@ -437,44 +437,6 @@ function esco_cb() {
     act_logout(0);
  };
 
-var g_user_info_target = "";
-
-function info_show(username)
-{
-    // ret = server_request('mesg', 'prefs|save','__POST__', 'prefs', JSON.stringify(g_prefs));
-    var info_in = JSON.parse(server_request('mesg', 'chatt|/info ' + username));
-    var info = null;
-
-    if (info_in.ret == 0) {
-        var fields = { login: { type: 'value' },
-                       state: { type: 'value' },
-                       guar: { type: 'value' },
-                       match: { type: 'value' },
-                       game: { type: 'value' },
-                       friend: { type: 'radio' } };
-
-        info = new Fieldify($('info'), fields);
-        info.populate(info_in);
-        info.visible(true);
-        }
-    else {
-        console.log("some error: open a dialog");
-    }
-    // FIXME: just to be finished
-    console.log(info);
-}
-
-function click_update_cb(e)
-{
-    if (g_user_info_target == e.target.innerHTML) {
-        g_user_info_target = "";
-        info_show(e.target.innerHTML);
-        }
-    else {
-        g_user_info_target = e.target.innerHTML;
-        }
-}
-
 function j_tab_cont(table_idx, data)
 {
     var i;
@@ -488,7 +450,7 @@ function j_tab_cont(table_idx, data)
     $("table"+table_idx).innerHTML = content;
     var usr = $("table"+table_idx).getElementsByClassName("id_usr");
     for (i = 0 ; i < usr.length ; i++) {
-        addEvent(usr[i], "click", click_update_cb);
+        addEvent(usr[i], "click", info_show_cb);
     }
 }
 
@@ -498,6 +460,10 @@ function j_tab_act_cont(idx, act)
         // MLANG 1
         $("table_act"+idx).innerHTML = '<input type="button" class="button" name="xhenter'+idx+'"  value="'+(g_lang == 'en' ? "Sit down." : "Mi siedo.")+'" onclick="act_sitdown('+idx+');">';
     }
+    else if (act == 'sitappr') {
+        // MLANG 1
+        $("table_act"+idx).innerHTML = '<input type="button" style="background-repeat: no-repeat; background-position: center; background-image: url(\'img/okappr.png\');" class="button" name="xhenter'+idx+'"  value="'+(g_lang == 'en' ? "Sit down." : "Mi siedo.")+'" onclick="act_sitdown('+idx+');" title="'+(g_lang == 'en' ? "reserved table for authenticated and apprentice users only" : "tavolo riservato agli utenti registrati e agli apprendisti")+'" alt="'+(g_lang == 'en' ? "reserved table for authenticated and apprentice users only" : "tavolo riservato agli utenti registrati e agli apprendisti")+'">';
+    }
     else if (act == 'sitreser') {
         // MLANG 1
         $("table_act"+idx).innerHTML = '<input type="button" style="background-repeat: no-repeat; background-position: center; background-image: url(\'img/okauth.png\');" class="button" name="xhenter'+idx+'"  value="'+(g_lang == 'en' ? "Sit down." : "Mi siedo.")+'" onclick="act_sitdown('+idx+');" title="'+(g_lang == 'en' ? "reserved table for authenticated users only" : "tavolo riservato agli utenti registrati")+'" alt="'+(g_lang == 'en' ? "reserved table for authenticated users only" : "tavolo riservato agli utenti registrati")+'">';
@@ -538,13 +504,13 @@ function j_check_login(login, ret)
             (login[i] >= 'A' && login[i] <= 'Z')) {
             if (old_c != login[i]) {
                 old_c = login[i];
-                old_ct = 0;
+                old_ct = 1;
             }
             else {
-                if (old_ct > 3) {
+                if (old_ct > 2) {
                     // FIXME LANG
-                    ret.ret = (g_lang == 'en' ? "More than three contiguous '" + old_c + "' not allowed." :
-                               "Il nickname contiene più di tre caratteri '" + old_c + "' consecutivi.");
+                    ret.ret = (g_lang == 'en' ? "More than two contiguous '" + old_c + "' not allowed." :
+                               "Il nickname contiene più di 2 caratteri '" + old_c + "' consecutivi.");
                     return (false);
                 }
             }
index 5dfc9ff..3f52c36 100644 (file)
@@ -512,13 +512,13 @@ SELECT usr.*, guar.login AS guar_login
             }
 
             $usr_n = pg_numrows($usr_pg);
-            $tab_lines = "<tr><th></th><th>User</th><th>Guar</th><th>Apprendice</th><th>Date</th></tr>";
+            $tab_lines = "<tr><th></th><th>User</th><th>EMail</th><th>Guar</th><th>Apprendice</th><th>Date</th></tr>";
             for ($i = 0 ; $i < $usr_n ; $i++) {
                 $usr_obj = pg_fetch_object($usr_pg, $i);
 
-                $tab_lines .= sprintf("<tr><td><input name=\"f_newuser%d\" type=\"checkbox\" %s></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
+                $tab_lines .= sprintf("<tr><td><input name=\"f_newuser%d\" type=\"checkbox\" %s></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\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);
             }