5 * Copyright (C) 2006-2011 Matteo Nastasi
6 * mailto: nastasi@alternativeoutput.it
7 * matteo.nastasi@milug.org
8 * web: http://www.alternativeoutput.it
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details. You should have received a
19 * copy of the GNU General Public License along with this program; if
20 * not, write to the Free Software Foundation, Inc, 59 Temple Place -
21 * Suite 330, Boston, MA 02111-1307, USA.
25 require_once("${G_base}Obj/dbase_${G_dbasetype}.phh");
27 define(CHAL_SHM_DIMS_MIN, 16384);
28 define(CHAL_SHM_DIMS_MAX, 65536);
29 define(CHAL_SHM_DIMS_DLT, 16384);
30 define(CHAL_VALID_TIME, 15);
31 define(CHAL_GARBAGE_TIMEOUT, 5);
40 function Challenge($login, $token, $ip, $tstamp)
42 $this->login = $login;
43 $this->token = $token;
45 $this->tstamp = $tstamp + CHAL_VALID_TIME;
62 $this->item = array();
64 $this->garbage_timeout = 0;
68 function add($login, $token, $ip, $tstamp)
72 log_auth("xxx", sprintf("Challenges::add [%s]\n", $login));
78 // log_auth("xxx", "LOOPI tstamp: ".$this->item[$i]->tstamp." curtime: ".$curtime);
80 if (($chal = new Challenge($login, $token, $ip, $tstamp)) == FALSE) {
84 $this->item[$this->item_n] = $chal;
93 /* remove all istances related to $login */
99 for ($i = 0 ; $i < $this->item_n ; $i++) {
100 if ($this->item[$i]->login == $login) {
102 for ($e = $i ; $e < ($this->item_n - 1) ; $e++) {
103 $this->item[$e] = $this->item[$e + 1];
108 unset($this->item[$this->item_n]);
116 function garbage_manager()
120 // FIXME remove set to 0
121 $this->garbage_timeout = 0;
122 if ($this->garbage_timeout > $curtime)
127 for ($i = 0 ; $i < $this->item_n ; $i++) {
128 log_auth("xxx", "LOOPI item: ".$i." tstamp: ".$this->item[$i]->tstamp." curtime: ".$curtime);
129 if ($this->item[$i]->tstamp < $curtime) {
130 for ($e = $i ; $e < ($this->item_n - 1) ; $e++) {
131 $this->item[$e] = $this->item[$e + 1];
136 log_auth("xxx", "LOOPI unset: ".$this->item_n);
137 unset($this->item[$this->item_n]);
143 log_auth("xxx", "LOOPI AFTER: ".count($this->item)." _n:" .$this->item_n );
145 $this->garbage_timeout = $curtime + CHAL_GARBAGE_TIMEOUT;
156 static function create()
158 $chal =& new Challenges();
169 if (($tok = @ftok(FTOK_PATH."/challenges", "B")) == -1) {
170 log_main("ftok failed");
174 if (($shm_sz = sharedmem_sz($tok)) == -1) {
175 log_main("shmop_open failed");
179 $shm_sz = CHAL_SHM_DIMS_MIN;
181 if ($shm = shm_attach($tok, $shm_sz)) {
182 $chals = @shm_get_var($shm, $tok); // CHECKED BELOW
184 log_only("challenges == ".($chals == FALSE ? "FALSE" : "TRUE")." challenges === ".($chals === FALSE ? "FALSE" : "TRUE")." challenges isset ".(isset($chals) ? "TRUE" : "FALSE"));
186 if ($chals == FALSE) {
187 log_only("INIT CHALLENGES DATA");
189 $chals =& Challenges::create();
190 if (@shm_put_var($shm, $tok, $chals) == FALSE) {
191 log_only("PUT_VAR FALLITA ".strlen(serialize($chals)));
192 log_only(serialize($chals));
194 log_shme("Challenges::save_data2");
196 $chals->shm_sz = $shm_sz;
201 $chals->garbage_manager();
210 function save_data($chals)
213 $oldmod = $chals->mod;
215 if (($tok = @ftok(FTOK_PATH."/challenges", "B")) == -1)
218 while ($chals->shm_sz < CHAL_SHM_DIMS_MAX) {
219 if (($shm = shm_attach($tok, $chals->shm_sz)) == FALSE)
223 log_only("challenges count ".count($chals->item)." _n: ".$chals->item_n);
226 if (@shm_put_var($shm, $tok, $chals) != FALSE) {
227 log_shme("Challenges::save_data");
231 $chals->mod = $oldmod;
233 if (shm_remove($shm) === FALSE) {
234 log_only("REMOVE FALLITA");
238 $chals->shm_sz += CHAL_SHM_DIMS_DLT;
247 static function lock_data()
249 if (($tok = @ftok(FTOK_PATH."/challenges", "B")) == -1) {
252 // echo "FTOK ".$tok."<br>";
253 if (($res = sem_get($tok)) == FALSE) {
256 if (sem_acquire($res)) {
257 self::$delta_t = microtime(TRUE);
258 log_lock("LOCK challenges [".self::$delta_t."]");
265 static function unlock_data($res)
269 log_lock("UNLOCK challenges [".(microtime(TRUE) - (self::$delta_t))."]");
271 return (sem_release($res));
273 } // End CLASS Challenges