00001 <?php
00006 class GenieGate_UserAccount {
00010 var $DBH;
00011
00012
00013 var $LISTENERS = array();
00014
00020 function GenieGate_UserAccount(&$dbh){
00021 $this->DBH = $dbh;
00022 }
00030 function addListener(&$listener){
00031 array_push($this->LISTENERS,$listener);
00032 }
00033
00042 function createUserAccount(&$fields,&$mview){
00043 $errors = $this->checkNewUserFields($fields);
00044 $this->fireCheckUserAccount($fields,$errors);
00045 if(count($errors) > 0){
00046 return($errors);
00047 }
00048
00049 $c = "Y";
00050 if($mview){
00051 $c = "U";
00052 }
00053 $id = rand(1,5000);
00054 $sql = sprintf("INSERT into ua_users (id,created,uid,email,name,password,confirm) VALUES('$id',CURRENT_DATE,'%s','%s','%s','%s','$c')",
00055 mysql_escape_string($fields[uid]),
00056 mysql_escape_string($fields[email]),
00057 mysql_escape_string($fields[name]),
00058 mysql_escape_string($fields[password])
00059 );
00060 mysql_query($sql,$this->DBH) or die("Database error: " . mysql_error($this->DBH));
00061
00062 if($mview){
00063 $mview->param("ACCOUNT",$fields);
00064 $mview->param("CONF_NO",$id);
00065 }
00066
00067
00068 if(! $mview){
00069 $this->fireSetupUserAccount($fields,$id);
00070 }
00071 return($errors);
00072 }
00073
00081 function createConfirmedUserAccount(&$fields){
00082
00083 # First we check it.
00084 $errors = $this->checkNewUserFields($fields);
00085 $this->fireCheckUserAccount($fields,$errors);
00086 if(count($errors)){
00087 return($errors);
00088 }
00089 $sql = sprintf("INSERT into ua_users (id,created,uid,email,name,password,confirm) VALUES('$id',CURRENT_DATE,'%s','%s','%s','%s','Y')",
00090 mysql_escape_string($fields[uid]),
00091 mysql_escape_string($fields[email]),
00092 mysql_escape_string($fields[name]),
00093 mysql_escape_string($fields[password])
00094 );
00095 mysql_query($sql,$this->DBH) or die("Database error: " . mysql_error($this->DBH));
00096 $this->fireSetupUserAccount($fields,$id);
00097 return($errors);
00098 }
00099
00100
00107 function updateUserAccount($uid,&$fields){
00108
00109 $user = $this->lookupUid($uid);
00110 if(! $user){
00111 return(FALSE);
00112 }
00113 $sql = sprintf("UPDATE ua_users SET email='%s',password='%s',name='%s' WHERE uid='%s'",
00114 mysql_escape_string($fields[email]),
00115 mysql_escape_string($fields[password]),
00116 mysql_escape_string($fields[name]),
00117 mysql_escape_string($uid));
00118 mysql_query($sql,$this->DBH) or die("Database error: " . mysql_error($this->DBH));
00119 $this->fireUserAccountChange($uid,$user,$fields);
00120 }
00128 function getUserStats(){
00129 $stats = array();
00130 $sql = "SELECT MAX(created), MIN(created), COUNT(id) FROM ua_users";
00131 $result = mysql_query($sql,$this->DBH) or die(mysql_error($this->DBH));
00132 $row = mysql_fetch_row($result);
00133 $stats[signup_newest]= $row[0];
00134 $stats[signup_oldest]= $row[1];
00135 $stats[total_users]= $row[2];
00136 mysql_free_result($result);
00137 $sql = "SELECT COUNT(id) FROM ua_users WHERE confirm='Y'";
00138 $result = mysql_query($sql,$this->DBH) or die(mysql_error($this->DBH));
00139 $row = mysql_fetch_row($result);
00140 $stats[registered_users]= $row[0];
00141 return($stats);
00142 }
00143
00151 function scanUsers($keyword){
00152 $users = array();
00153 $string = mysql_escape_string(str_replace("*","%",strtolower($keyword)));
00154 $sql = "SELECT id,uid,created,confirm,email,name,password FROM ua_users ";
00155 $sql .= "WHERE LCASE(CONCAT(uid,name,email,created,password)) LIKE '%$string%'";
00156 $result = mysql_query($sql,$this->DBH) or die(mysql_error($this->DBH));
00157 if($result) {
00158 while($row = mysql_fetch_assoc($result)){
00159 array_push($users,$row);
00160 }
00161 }
00162 mysql_free_result($result);
00163 return($users);
00164 }
00165
00179 function searchUsers($email,$name,$from,$to){
00180 $name = mysql_escape_string(str_replace("*","%",strtolower($name)));
00181 $email = mysql_escape_string(str_replace("*","%",strtolower($email)));
00182 $to = mysql_escape_string($to);
00183 $from = mysql_escape_string($from);
00184 $sql = "SELECT id,uid,created,confirm,email,name,password FROM ua_users ";
00185 $sql .= sprintf("WHERE created <= '%s' AND created >= '%s' AND name LIKE('%s') AND email LIKE('%s')",
00186 $to, $from,$name,$email);
00187 $users = array();
00188 $result = mysql_query($sql,$this->DBH) or die(mysql_error($this->DBH));
00189 if($result) {
00190 while($row = mysql_fetch_assoc($result)){
00191 array_push($users,$row);
00192 }
00193 }
00194 mysql_free_result($result);
00195 return($users);
00196 }
00197
00207 function removeUser($uid,$password = "", $confirm = TRUE){
00208 $fields = $this->lookupUid($uid);
00209 if($fields){
00210 if($confirm){
00211 if($fields[password] != $password){
00212 error_log("Password for [$uid] not [$fields[password]]");
00213 return(FALSE);
00214 }
00215 }
00216 $sql = sprintf("DELETE FROM ua_users WHERE uid='%s'",mysql_escape_string($uid));
00217 mysql_query($sql,$this->DBH);
00218 $this->fireRemoveUser($uid,$fields);
00219 }
00220 return(TRUE);
00221 }
00222
00231 function confirmUserAccount($uid,$conf_no){
00232 $errors = array();
00233 $fields = $this->lookupUid($uid);
00234 if(! $fields){
00235 array_push($errors,"Invalid User");
00236 }
00237 if($fields[id] != $conf_no){
00238 if($fields){
00239 array_push($errors,"Invalid Account.");
00240 }
00241 }
00242 $this->firePreConfirmUserAccount($fields,$conf_no,$errors);
00243 if(count($errors) > 0){
00244 return($errors);
00245 }
00246 $sql = sprintf("UPDATE ua_users SET confirm='Y' WHERE uid='%s' AND id='%s'",
00247 mysql_escape_string($uid),
00248 mysql_escape_string($conf_no));
00249 mysql_query($sql,$this->DBH) or die(mysql_error());
00250
00251 $this->fireSetupUserAccount($fields,$conf_id);
00252 return($errors);
00253 }
00254
00266 function expungeNonConfirmed($all = FALSE){
00267 if($all){
00268 $sql = "DELETE FROM ua_users WHERE confirm='U'";
00269 }else{
00270 $sql = "DELETE FROM ua_users WHERE confirm='U' AND created < CURRENT_DATE";
00271 }
00272 mysql_query($sql,$this->DBH) or die("Database error: " . mysql_error($this->DBH));
00273 }
00274
00275 function fireUserAccountChange($uid,&$old_values, &$new_values){
00276 foreach($this->LISTENERS as $l){
00277 $l->userInfoChanged($this,$uid,$old_values,$new_values);
00278 }
00279 }
00280
00282 function fireSetupUserAccount(&$fields,$conf_id){
00283 foreach($this->LISTENERS as $l){
00284 $l->setupUser($this,$fields,$conf_id);
00285 }
00286 }
00287
00288
00290 function fireRemoveUser($uid,&$fields){
00291 foreach($this->LISTENERS as $l){
00292 $l->removeUser($this,$uid,$fields);
00293 }
00294 }
00295
00296
00298 function firePreConfirmUserAccount(&$fields,$conf_id,&$errors){
00299 foreach($this->LISTENERS as $l){
00300 $l->preConfirm($this,$fields,$conf_id,$errors);
00301 }
00302 return;
00303 }
00307 function fireCheckUserAccount(&$fields,&$errors){
00308 foreach($this->LISTENERS as $l){
00309 $l->preCheck($this,$fields,$errors);
00310 }
00311 }
00312
00320 function checkNewUserFields(&$fields,$is_new = TRUE){
00321 $errors = array();
00322 $email = $fields[email];
00323 if(! ereg('.+@.+\..+',$email)){
00324 array_push($errors,"Invalid Email address");
00325 }else{
00326 if($is_new){
00327 if($this->lookupEmail($email)){
00328 array_push($errors,"Email address already exists");
00329 }
00330 }
00331 }
00332 if(preg_match("/\W/",$gid)){
00333 array_push($errors,"User ID may contain only letters and numbers.");
00334 }
00335 if(strlen($fields[uid]) > 1){
00336 if($is_new){
00337 if($this->lookupUid($fields[uid])){
00338 array_push($errors,"User ID already taken.");
00339 }
00340 }
00341 }else{
00342 array_push($errors,"Invalid user ID.");
00343 }
00344 if(strlen($fields[password]) < 6){
00345 array_push($errors,"Invalid password, (must be longer)");
00346 }
00347 return($errors);
00348 }
00349
00356 function lookupUid($uid){
00357 $sql = sprintf("SELECT id,uid,created,confirm,email,name,password FROM ua_users WHERE uid='%s'",
00358 mysql_escape_string($uid));
00359 $rs = mysql_query($sql,$this->DBH);
00360 if($rs){
00361 $user = mysql_fetch_assoc($rs);
00362 mysql_free_result($rs);
00363 if($user[uid]){
00364 return($user);
00365 }
00366 }
00367 return(FALSE);
00368 }
00369
00376 function lookupEmail($email){
00377 $sql = sprintf("SELECT id,uid,created,confirm,email,name,password FROM ua_users WHERE email='%s'",
00378 mysql_escape_string($email));
00379
00380 $rs = mysql_query($sql,$this->DBH);
00381 if($rs){
00382 $user = mysql_fetch_assoc($rs);
00383 mysql_free_result($rs);
00384 if($user[uid]){
00385 return($user);
00386 }
00387 }
00388 return(FALSE);
00389 }
00390 }
00391 ?>