version updated to 5.4.2
[brisk.git] / web / Obj / brisk.phh
index 85d8dda..42e4bd1 100644 (file)
@@ -2,7 +2,7 @@
 /*
  *  brisk - brisk.phh
  *
- *  Copyright (C) 2006-2014 Matteo Nastasi
+ *  Copyright (C) 2006-2015 Matteo Nastasi
  *                          mailto: nastasi@alternativeoutput.it
  *                                  matteo.nastasi@milug.org
  *                          web: http://www.alternativeoutput.it
@@ -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);
@@ -140,27 +141,26 @@ $mlang_brisk = array( 'btn_backstand'=> array( 'it' => 'torna in piedi',
                                           'en'  => 'Connection to the database failed<br>All authentications are suspended temporarly, you login as normal user.<br>We are about the limitation'),
 
                       'tos_old'  => array( 'it' => '<b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.',
-                                           'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessari per poter richiedere questa funzionalità.'),
-                      'gua_nfd'  => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
+                                           'en' => 'EN <b>%s</b> ha sottoscritto dei Termini del Servizio antecedenti a quelli necessarig per poter richiedere questa funzionalità.'),
+                      'inf_self' => array( 'it' => 'Non puoi informarti su te stesso.',
+                                           'en' => 'EN Non puoi informarti su te stesso.'),
+                      'inf_nfd'  => array( 'it' => 'Non è stato trovato un garante per <b>%s</b>.',
                                            'en' => 'EN Non è stato trovato un garante per <b>%s</b>.'),
-                      'gua_self' => array( 'it' => '<b>%s</b> si è auto-garantito.',
-                                           'en' => 'EN <b>%s</b> si è auto-garantito.'),
-                      'gua_info' => array( 'it' => 'Il garante di <b>%s</b> è <b>%s</b>.',
-                                           'en' => 'EN Il garante di <b>%s</b> è <b>%s</b>.'),
-                      'gua_err'  => array( 'it' => 'Error %d. Utilizzo: <b>/guar <i>&lt;login&gt;</i></b>.',
-                                           'en' => 'Error %d. Usage: <b>/guar <i>&lt;login&gt;</i></b>.')
+                      'inf_err'  => array( 'it' => 'Error %d. Utilizzo: <b>/info <i>&lt;login&gt;</i></b>.',
+                                           'en' => 'Error %d. Usage: <b>/info <i>&lt;login&gt;</i></b>.')
 );
 
 $G_lng = langtolng($G_lang);
 
 $G_all_points = array( 11,10,4,3,2, 0,0,0,0,0 );
-$G_brisk_version = "4.18.3";
+$G_brisk_version = "5.4.2";
 
 /* MLANG: ALL THE INFO STRINGS IN brisk.phh */
-$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: Puffin riattivato, accessi da cloud disattivati, corretto bug sulla gestione di puffin, riabilitato blocco dei proxy.',
+$root_wellarr = array( 'it' => array ( 'Brisk (Ver. '.$G_brisk_version.'), <b>NOVITA\'</b>: uscita più veloce dal sito.',
                                        '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>: Puffin re-enabled, cloud accesses disabled, fixed puffin mgmt bug, re-enabled proxy access block.',
-                                       '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;\\">
@@ -187,7 +187,7 @@ Dopo che &egrave; iniziata una partita per uscirne dovete chiedere agli altri gi
 <dd><b>/tav <i>&lt;frase di invito&gt;</i></b> - invito per gli altri giocatori al tavolo dove si &egrave; seduti
 <dd><b>/st <i>&lt;stato&gt;</i></b> - cambia l\'icona associata al tuo user; <i>stato</i> pu&ograve; valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
 <dd><b>/cont <i>&lt;id partita&gt;</i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
-<dd><b>/guar <i>&lt;login&gt;</i></b> - mostra il garante dell\'utente con il login passato come argomento
+<dd><b>/info <i>&lt;login&gt;</i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
 <dd><b>/authreq</b> - se si &egrave; autenticati permette di garantire per un utente fidato
 <dd><b>/mesgtoadm</b> - se si &egrave; autenticati permette di lasciare un messaggio all\'amministratore del sito
 <dd><b>/listen &lt;all or auth&gt;</b> - se si &egrave; autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
@@ -220,7 +220,7 @@ Dopo che &egrave; iniziata una partita per uscirne dovete chiedere agli altri gi
 <dd><b>/tav <i>&lt;frase di invito&gt;</i></b> - invito per gli altri giocatori al tavolo dove si &egrave; seduti
 <dd><b>/st <i>&lt;stato&gt;</i></b> - cambia l\'icona associata al tuo user; <i>stato</i> pu&ograve; valere: \\"normale\\", \\"fuori\\", \\"pausa\\", \\"cibo\\", \\"cane\\", \\"lavoro\\", \\"presente\\" oppure \\"sigaretta\\"
 <dd><b>/cont <i>&lt;id partita&gt;</i></b> - quando si è a un tavolo per garantiti, permette di proseguire una partita giocata in precedenza con gli stessi giocatori
-<dd><b>/guar <i>&lt;login&gt;</i></b> - mostra il garante dell\'utente con il login passato come argomento
+<dd><b>/info <i>&lt;login&gt;</i></b> - mostra lo stato corrente dell\'utente passato come argomento e in che relazione siete
 <dd><b>/authreq</b> - se si &egrave; autenticati permette di garantire per un utente fidato
 <dd><b>/mesgtoadm</b> - se si &egrave; autenticati permette di lasciare un messaggio all\'amministratore del sito
 <dd><b>/listen &lt;all or auth&gt;</b> - se si &egrave; autenticati permette leggere solo i messaggi degli altri autenticati (auth) o di tutti (all)
@@ -345,6 +345,39 @@ $G_PG_cons_n = 345;
     /*     printf("\n"); */
     /* } */
 
+function ip2int($s)
+{
+    return (ip2long($s));
+}
+
+function int2ip($i)
+{
+    return (long2ip($i));
+}
+
+function int2four($l)
+{
+    if (PHP_INT_SIZE == 4)
+        return ($l);
+
+    return ( ($l & 0x80000000 ? 0xffffffff00000000 : 0x00) | $l );
+}
+
+function four2int($s)
+{
+    return ($s & 0xffffffff);
+}
+
+function ip2four($s)
+{
+    return int2four( ip2int($s) );
+}
+
+function four2ip($i)
+{
+    return int2ip( four2int($i) );
+}
+
 function nickserv_msg($dt, $msg) {
     return sprintf('chatt_sub("%s",[0x040003,"%s"],"%s");', $dt, NICKSERV, $msg);
 }
@@ -603,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 {
@@ -640,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;
 
@@ -783,17 +819,23 @@ class Table {
       if ($sitted < PLAYERS_N) {
           switch ($this->auth_type) {
           case TABLE_AUTH_TY_CERT:
-              if ($user->is_cert())
+              if ($user->is_cert() && !$user->is_appr())
                   $act = "sitcert";
               else
                   $act = 'resercert';
               break;
           case TABLE_AUTH_TY_AUTH:
-              if ($user->is_auth())
+              if ($user->is_auth() && !$user->is_appr())
                   $act = "sitreser";
               else
                   $act = 'reserved';
               break;
+          case TABLE_AUTH_TY_APPR:
+              if ($user->is_auth())
+                  $act = "sitappr";
+              else
+                  $act = 'reserved';
+              break;
           default:
               $act = 'sit';
               break;
@@ -964,6 +1006,7 @@ define('GHOST_SESS_REAS_ANOT', 2); // another user get session
 define('GHOST_SESS_REAS_TOUT', 3); // room timeout
 define('GHOST_SESS_REAS_TTOT', 4); // table timeout
 define('GHOST_SESS_REAS_ANON', 5); // anonymizer access
+define('GHOST_SESS_REAS_PROX', 6); // proxy access
 
 class GhostSessEl
 {
@@ -1183,10 +1226,15 @@ class Brisk
 
     function users_cleanup()
     {
+        $curtime = time();
         for ($i = 0 ; $i < MAX_PLAYERS ; $i++) {
             $user_cur = $this->user[$i];
 
-            if ($user_cur->the_end) {
+            if ($user_cur->the_end
+                && (($user_cur->rd_toflush == FALSE
+                     && $user_cur->rd_step == $user_cur->step)
+                    || $user_cur->rd_endtime_is_expired($curtime))
+                ) {
                 $user_cur->reset(); // users_cleanup, OK
             }
         }
@@ -1420,7 +1468,6 @@ class Brisk
     return ($ret);
   }
 
-
   function room_wakeup($user)
   {
     $table_idx = $user->table;
@@ -1463,7 +1510,6 @@ class Brisk
         $remove_wagon = TRUE;
     }
 
-
     /* aggiorna l'array dei giocatori al tavolo. */
     $table->user_rem($this, $user);
 
@@ -1613,15 +1659,22 @@ class Brisk
     }
   }
 
-  function guarantee_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;
 
+      $mesg = "";
       $user_code = -1;
       $ret = 0;
 
       do {
-          if ($user_login == "") {
+          if ($target == "") {
               $ret = 1;
               break;
           }
@@ -1629,8 +1682,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_item = $bdb->getitem_bylogin($target, $user_code)) == FALSE) {
+              $ret = 4;
               break;
           }
           if (($guar_item = $bdb->getitem_bycode($user_item->guar_code_get())) != FALSE) {
@@ -1641,29 +1699,87 @@ 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 = nickserv_msg($dt, 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 = nickserv_msg($dt, sprintf($mlang_brisk['gua_nfd'][$G_lang], xcape($user_login)));
-          }
-          else if ($guar_login == $user_login) {
-              $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_self'][$G_lang], xcape($user_login)));
-          }
-          else {
-              $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_info'][$G_lang],
-                                                xcape($user_login), xcape($guar_login)));
+              $mesg = sprintf($mlang_brisk['inf_nfd'][$G_lang], xcape($target));
           }
       } while (0);
 
-      if ($ret > 0) {
-          $mesg = nickserv_msg($dt, sprintf($mlang_brisk['gua_err'][$G_lang], $ret));
+      if ($ret > 0 && $mesg == "") {
+          $mesg = sprintf($mlang_brisk['inf_err'][$G_lang], $ret);
       }
 
-      $user->comm[$user->step % COMM_N] = "gst.st = ".($user->step+1)."; ".$mesg;
-      $user->step_inc();
+      if ($ret != 0) {
+          $jret = json_encode(array("ret" => $ret, "mesg" => $mesg));
+      }
+      else {
+          $jret = json_encode(array("ret" => 0,
+                                    "mesg" => "",
+                                    "login" => $target,
+                                    // FIXME: state internationalization
+                                    "state" =>
+                                    ($user_item->type & USER_FLAG_TY_APPR ? "Apprendista" :
+                                     ($user_item->type & USER_FLAG_TY_CERT ? "Certificato" :
+                                      ($user_item->type & (USER_FLAG_TY_NORM | USER_FLAG_TY_SUPER) ?
+                                       "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" => usersnet_friend_getlabel($usersnet_item->friend),
+                                    "skill" => $usersnet_item->skill,
+                                    "trust"  => $usersnet_item->trust,
+                                    "widefriend" => $usersnet_item->widefriend,
+                                    "narrowfriend" => $usersnet_item->narrowfriend
+                                    ));
+      }
 
-      return TRUE;
+      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)
@@ -1812,11 +1928,13 @@ 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;
 
+    fprintf(STDERR, "WE ARE HERE: [%s]\n", $mesg);
+
     // common settings
     $msg = mb_substr($mesg, 6, 128, "UTF-8");
     $curtime = time();
@@ -2011,7 +2129,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);
                 }
@@ -2023,10 +2141,21 @@ class Brisk
         $update_room = TRUE;
       } while (0);
     } // nick chat command
-    else if (strncmp($msg, "/guar ", 6) == 0 || $msg == "/guar") {
-        $guar_user = substr($msg, 6);
+    else if (strncmp($msg, "/info ", 6) == 0) {
+        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);
 
-        $this->guarantee_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");
@@ -2120,7 +2249,9 @@ class Brisk
         $to_user = sprintf('chatt_sub("%s",[%d,"%s"],"%s");', $dt, $user->flags, xcape($user->name), xcape("== chat ban =="));
       }
       else {
-          if ( TRUE && (! $user->is_auth()) ) {
+          // TEMPORARY DISABLED UNTIL test user option will be available
+          // if ( TRUE && (!$user->is_auth() || $user->is_appr()) ) {
+          if (!$user->is_auth()) {
               $to_user = nickserv_msg($dt, xcape("Visto l'elevato numero di molestatori che ultimamente hanno preso dimora su Brisk abbiamo deciso"));
               $to_user .= nickserv_msg($dt, xcape("di disattivare temporaneamente la chat in room per i non registrati, non ce ne vogliate e buone feste."));
               if (FALSE) {
@@ -2319,7 +2450,7 @@ class Brisk
             }
         }
         else {
-            $login_exists =  $bdb->login_exists($name_new);
+            $login_exists =  $bdb->login_exists(strtolower($name_new));
         }
     }
     else {
@@ -3300,7 +3431,7 @@ function validate_name($name)
 {
     $name_new = str_replace(' ', '_', mb_substr(trim($name),0,12, "UTF-8"));
 
-  for ($i = 0 ; $i < strlen($name_new) ; $i++) {
+  for ($i = 0 ; $i < mb_strlen($name_new) ; $i++) {
     $c = $name_new[$i];
     if (($c >= "a" && $c <= "z") || ($c >= "A" && $c <= "Z") || ($c >= "0" && $c <= "9"))
       return ($name_new);
@@ -3414,5 +3545,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);
+}
 ?>