PageRenderTime 26ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/phprd/users/users.php

http://yt-cache.googlecode.com/
PHP | 214 lines | 191 code | 18 blank | 5 comment | 50 complexity | 38e1739404fb262dd598747ae8976847 MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. /**
  3. * @author dr4g0n
  4. * @copyright 2008
  5. */
  6. require_once "phprd/error-log/error.php";
  7. class user_sessions {
  8. private $storage="UNDEFINED"; // file or mysql implemented
  9. private $db_handle=NULL;
  10. private $db_table=NULL;
  11. private $error=NULL;
  12. public function __construct($storage_engine="mysql",$mysql_server="localhost",$mysql_username="root",$mysql_password="",$mysql_db="phprd",$mysql_table="users") {
  13. $this->error=ErrorHandler::singleton();
  14. if (empty($storage_engine) || empty($mysql_server) || empty($mysql_username) || empty($mysql_db) || empty($mysql_table))
  15. $this->error->add_error_die("Not enough parameters for connection to DB");
  16. switch ($storage_engine) {
  17. case "mysql":
  18. $this->db_handle=new mysql;
  19. $r=$this->db_handle->connect($mysql_server,$mysql_username,$mysql_password,$mysql_db);
  20. if (!$r) {
  21. $this->error->add_error_die("Server <strong>{$mysql_server}</strong> connect failure");
  22. } else {
  23. $query='CREATE TABLE IF NOT EXISTS `users`(`id` serial, `username` varchar(32) default "" not null, `password` varchar(32) default "" not null, `email` varchar(64) default "" not null, `group` varchar(32) default "" not null)';
  24. $r=$this->db_handle->sql($query);
  25. $this->storage=$storage_engine;
  26. $this->db_table=$mysql_table;
  27. }
  28. break;
  29. case "file":
  30. $this->storage=$storage_engine;
  31. break;
  32. default:
  33. break;
  34. }
  35. }
  36. public function login_http($realm="Restricted") {
  37. if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
  38. $username = mysql_escape_string(trim($_SERVER['PHP_AUTH_USER']));
  39. $password = mysql_escape_string(trim($_SERVER['PHP_AUTH_PW']));
  40. $r=$this->login_user($username,$password);
  41. if (!$r) {
  42. header("WWW-Authenticate: Basic realm=\"$realm\"");
  43. header("HTTP/1.0 401 Unauthorized");
  44. die();
  45. } else return true;
  46. } else {
  47. header("WWW-Authenticate: Basic realm=\"$realm\"");
  48. header("HTTP/1.0 401 Unauthorized");
  49. die();
  50. }
  51. }
  52. public function login_user($username,$password,$userdb="users.db") {
  53. switch ($this->storage) {
  54. case "file":
  55. $r=$this->login_file($username,$password,$userdb);
  56. if ($r) {
  57. if (empty($_SESSION['online']))
  58. $_SESSION['online']=time();
  59. return true;
  60. } else return false;
  61. break;
  62. case "mysql":
  63. $r=$this->login_mysql($username,$password);
  64. if ($r) {
  65. if (empty($_SESSION['online']))
  66. $_SESSION['online']=time();
  67. return true;
  68. } else return false;
  69. break;
  70. default:
  71. return false;
  72. }
  73. }
  74. private function login_mysql ($s_username,$s_password) {
  75. if (empty($s_username) || empty($s_password)) return false;
  76. $finduser=array("username"=>$s_username,"password"=>md5($s_password));
  77. $res=$this->db_handle->get_row($this->db_table,$finduser);
  78. if (!$res)
  79. return false;
  80. $_SESSION['s_username']=$s_username;
  81. $_SESSION['s_password']=$s_password;
  82. return true;
  83. }
  84. private function login_file($username,$password,$userdb) {
  85. // file can be user password or seralized array of username and password
  86. if (empty($username) || empty($password) || empty($userdb))
  87. $this->error->add_error_die("One of the vars are empty!");
  88. if (!file_exists($userdb)) {
  89. $this->error->add_error_die("Login file does not exist!");
  90. }
  91. $fh=fopen($userdb,"r"); //open db in read-only mode
  92. while (!feof($fh))
  93. $users.=fread($fh,999999); //read all accounts-warning, very big userdb can eat alot of mem
  94. if (strlen($users)<1)
  95. $this->error->add_error_die("Users file empty!");
  96. fclose($fh);
  97. $users=explode("\r\n",$users); //parse all users
  98. foreach ($users as $user) {
  99. if (!empty($user)) {
  100. $user_array=unserialize($user);
  101. if (empty($user_array)) {
  102. $user_a=explode(" ",$user); //parse all users
  103. $user_array["username"]=$user_a[0];
  104. $user_array["password"]=$user_a[1];
  105. }
  106. if ($username==$user_array["username"] && (md5($password)==$user_array["password"]) || $password==$user_array["password"]) return true;
  107. }
  108. }
  109. return false;
  110. }
  111. public function create_user($username,$password,$email,$group) {
  112. switch ($this->storage) {
  113. case "file":
  114. return $this->create_user_file($username,$password,$email,$group);
  115. break;
  116. case "mysql":
  117. if (!$this->db_handle)
  118. $this->error->add_error_die("No DB handle!");
  119. $username=mysql_real_escape_string($username);
  120. $password=md5($password);
  121. $find=array("username"=>$username);
  122. $row=$this->db_handle->get_row("users",$find);
  123. if (!empty($row))
  124. return false; // user with same username already exists!
  125. $row=array("username"=>$username,"password"=>$password,"email"=>$email,"group"=>$group);
  126. $this->db_handle->insert_row("users",$row);
  127. if ($this->db_handle->rows_affected<1)
  128. return false;
  129. else
  130. return true;
  131. break;
  132. default:
  133. return false;
  134. }
  135. }
  136. private function create_user_file($username,$password,$email,$group) {
  137. $fh=fopen($userdb,"a");
  138. $user=array("username"=>$username,"password"=>md5($password),"email"=>$email,"group"=>$group);
  139. fseek($fh,0,SEEK_END);
  140. $users=fwrite($fh,serialize($user)."\r\n");
  141. fclose($fh);
  142. return true;
  143. }
  144. public function check_session($db,$table,$passwordmethod='md5') {
  145. switch ($this->storage) {
  146. case "file":
  147. return $this->check_session_file($db,$table,$passwordmethod='md5');
  148. break;
  149. case "mysql":
  150. return $this->check_session_mysql($db,$table,$passwordmethod='md5');
  151. break;
  152. default:
  153. $this->error->add_error_die("Uindentified login method!");
  154. }
  155. }
  156. private function check_session_mysql (mysql &$db,$table="users",$passwordmethod='md5') {
  157. if (!$db) $this->error->add_error_die("No DB set!");
  158. session_start();
  159. $s_username=$_SESSION['s_username'];
  160. $s_password=$_SESSION['s_password'];
  161. if (empty($s_username) || empty($s_password)) return false;
  162. if (empty($_SESSION['online'])) $_SESSION['online']=time();
  163. switch ($passwordmethod) {
  164. case "md5":
  165. $finduser=array("username"=>$s_username,"password"=>md5($s_password));
  166. break;
  167. case "sha1":
  168. $finduser=array("username"=>$s_username,"password"=>sha1($s_password));
  169. break;
  170. default: //plaintext
  171. $finduser=array("username"=>$s_username,"password"=>$s_password);
  172. }
  173. $res=$db->get_row($table,$finduser);
  174. if (!$res) return false;
  175. return true;
  176. }
  177. private function check_session_file($db,$table="users",$passwordmethod='md5') {
  178. if (!empty($db)) $this->error->add_error_die("No DB set!");
  179. session_start();
  180. $s_username=$_SESSION['s_username'];
  181. $s_password=$_SESSION['s_password'];
  182. if (empty($s_username) || empty($s_password)) return false;
  183. if (empty($_SESSION['online'])) $_SESSION['online']=time();
  184. return $this->login_file($s_username,$s_password,$db);
  185. }
  186. public function logout () {
  187. $_SESSION['s_username']="";
  188. $_SESSION['s_password']="";
  189. }
  190. public function get_userinfo () {
  191. $online=(int) $_SESSION['online'];
  192. $return_array=array("online_time"=>time()-$online);
  193. return $return_array;
  194. }
  195. }
  196. ?>