/src/bin/i/classes/User.class.php

https://github.com/jalleyne/inception.- · PHP · 278 lines · 173 code · 46 blank · 59 comment · 14 complexity · afe25aa63325d9c5c14609037d64a438 MD5 · raw file

  1. <?php
  2. /**
  3. * Copyright 2011 Jovan Alleyne <me@jalleyne.ca>.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  6. * not use this file except in compliance with the License. You may obtain
  7. * a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14. * License for the specific language governing permissions and limitations
  15. * under the License.
  16. */
  17. /**
  18. * Generic User object.
  19. *
  20. * @author Jovan Alleyne <me@jalleyne.ca>
  21. */
  22. class User {
  23. public $id;
  24. public $role;
  25. public $username;
  26. public $email;
  27. public $access_token;
  28. function __construct() {
  29. }
  30. /*
  31. * access control
  32. */
  33. public function login() {
  34. $_SESSION['user'] = serialize($this);
  35. $_SESSION['access_token'] =
  36. $this->access_token = str_replace(' ','_',
  37. base64_encode(md5($_SESSION['user'].microtime())).
  38. microtime());
  39. }
  40. public function logout() {
  41. unset ($_SESSION['user']);
  42. unset ($_SESSION['access_token']);
  43. }
  44. /*
  45. * password management
  46. */
  47. public function changePassword($newPwd) {
  48. global $db;
  49. /* */
  50. $q = $db->prepare('UPDATE `users` ' .
  51. 'SET `password`=MD5(\'%s\') ' .
  52. 'WHERE `id`=%d; ', array (
  53. $newPwd,
  54. $this->id
  55. ));
  56. $r = $db->query($q);
  57. if ($r)
  58. return true;
  59. else
  60. return false;
  61. }
  62. public function invalidateResetToken() {
  63. global $db;
  64. /* */
  65. $q = $db->prepare('UPDATE `password_resets` ' .
  66. 'SET `reset`=\'1\' ' .
  67. 'WHERE `uid`=%d; ', array (
  68. $this->id
  69. ));
  70. $r = $db->query($q);
  71. /* */
  72. unset ($_SESSION['password_reset_token']);
  73. /* */
  74. return (boolean) $r;
  75. }
  76. public function hasValidResetToken() {
  77. /* */
  78. $q = $db->prepare('SELECT `uid`, `token` ' .
  79. 'FROM `password_resets` ' .
  80. 'WHERE `token`=\'%s\' AND `reset`=\'0\';', array (
  81. $_SESSION['password_reset_token']
  82. ));
  83. $r = $dbo->query($q);
  84. return mysql_num_rows($r) ? TRUE : FALSE;
  85. }
  86. /*
  87. *
  88. */
  89. public function requestPasswordReset($emailsubject, $emailpath) {
  90. global $db;
  91. /* */
  92. $token = $this->generatePasswordResetToken();
  93. /* */
  94. if ($this->id && $token) {
  95. $q = $db->prepare('INSERT INTO `password_resets` ' .
  96. '(`uid`,`token`) ' .
  97. 'VALUES(%d,\'%s\'); ', array (
  98. $this->id,
  99. $token
  100. ));
  101. $r = $db->query($q);
  102. if ($r) {
  103. /* */
  104. $this->sendPasswordResetEmail($emailsubject, $emailpath, $token);
  105. /* */
  106. return true;
  107. } else
  108. return false;
  109. } else
  110. return false;
  111. }
  112. private function generatePasswordResetToken() {
  113. if ($this->id && $this->username && $this->email)
  114. return base64_encode(MD5($this->id . $this->username . $this->email) . $this->id) . '.' . microtime();
  115. else
  116. return null;
  117. }
  118. public function getPasswordResetUrl($token = null) {
  119. return WS_URI . 'u/resetpassword/?_=' . ($token?$token:$this->generatePasswordResetToken());
  120. }
  121. public function sendPasswordResetEmail($subject, $messagepath, $token) {
  122. /* */
  123. $message = get_message_template($messagepath);
  124. /* */
  125. $vars = array (
  126. '[$USERNAME]',
  127. '[$RESET_URL]'
  128. );
  129. $values = array (
  130. $this->username,
  131. $this->getPasswordResetUrl($token)
  132. );
  133. return send_email(
  134. $subject,
  135. $this->username,
  136. $this->email,
  137. NOREPLY_EMAIL,
  138. EMAIL_SENDER_NAME,
  139. replace_message_vars($vars, $values, $message)
  140. );
  141. }
  142. /*
  143. * load user details
  144. */
  145. public function load($user, $from = 'id') {
  146. global $db;
  147. $q = $db->prepare("SELECT `id`, `username`, `email`, `activated` " .
  148. "FROM `users` " .
  149. "WHERE `%s` = '%s' " .
  150. "LIMIT 1;", array (
  151. $from,
  152. $user
  153. ));
  154. $r = $db->query($q);
  155. if ($r) {
  156. /* */
  157. $u = mysql_fetch_assoc($r);
  158. $this->id = $u['id'];
  159. $this->email = $u['email'];
  160. $this->username = $u['username'];
  161. $this->activated = $u['activated'];
  162. return TRUE;
  163. } else
  164. return NULL;
  165. }
  166. /*
  167. * user meta data
  168. */
  169. /*
  170. *
  171. */
  172. public function writeUserMeta( $key, $value ){
  173. global $db;
  174. //
  175. $q = $db->prepare(
  176. 'INSERT INTO `user_meta` ' .
  177. '(`uid`,`key`,`value`) ' .
  178. 'VALUES(%d,\'%s\',\'%s\'); ',
  179. array(
  180. $this->id,
  181. $key,
  182. $value
  183. )
  184. );
  185. //
  186. $r = $db->query( $q );
  187. if( $r ) return $db->getLastInsertID();
  188. else return FALSE;
  189. }
  190. public function updateUserMeta( $key, $value ){
  191. global $db;
  192. //
  193. $q = $db->prepare(
  194. 'UPDATE `user_meta` ' .
  195. 'SET `value`=\'%s\' ' .
  196. 'WHERE `uid`=%s AND `key`=\'%s\'; ',
  197. array(
  198. $value,
  199. $this->id,
  200. $key
  201. )
  202. );
  203. //
  204. if( $db->query( $q ) ) return TRUE;
  205. else return FALSE;
  206. }
  207. /*
  208. *
  209. */
  210. public function loadUserMeta( ){
  211. global $db;
  212. //
  213. $q = $db->prepare(
  214. 'SELECT `key`,`value` ' .
  215. 'FROM `user_meta` ' .
  216. 'WHERE `uid`=%s; ',
  217. array(
  218. $this->id,
  219. )
  220. );
  221. //
  222. $r = $db->query( $q );
  223. if( $r ) {
  224. $meta = array();
  225. while($um=mysql_fetch_assoc($r))
  226. $meta[$um['key']] = $um['value'];
  227. return $meta;
  228. }
  229. else return FALSE;
  230. }
  231. }
  232. ?>