/site/lib/lib.auth.php

https://github.com/stamen/fieldpapers · PHP · 191 lines · 168 code · 23 blank · 0 comment · 14 complexity · deb7d00eb1bb4f83aa60456bb11d2e4d MD5 · raw file

  1. <?php
  2. require_once 'data.php';
  3. function add_user(&$dbh)
  4. {
  5. while(true)
  6. {
  7. $user_id = generate_id();
  8. $q = "INSERT INTO users (id) VALUES (?)";
  9. log_debug($q, $user_id);
  10. $res = $dbh->query($q, $user_id);
  11. if(PEAR::isError($res))
  12. {
  13. if($res->getCode() == DB_ERROR_ALREADY_EXISTS)
  14. continue;
  15. die_with_code(500, "{$res->message}\n{$q}\n");
  16. }
  17. return get_user($dbh, $user_id);
  18. }
  19. }
  20. function get_user(&$dbh, $user_id)
  21. {
  22. $q = 'SELECT id, name, email,
  23. UNIX_TIMESTAMP(created) AS created,
  24. UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(created) AS age
  25. FROM users
  26. WHERE id = ?';
  27. $res = $dbh->query($q, $user_id);
  28. if(PEAR::isError($res))
  29. die_with_code(500, "{$res->message}\n{$q}\n");
  30. return $res->fetchRow(DB_FETCHMODE_ASSOC);
  31. }
  32. function get_user_by_name(&$dbh, $user_name)
  33. {
  34. $q = 'SELECT id, name,
  35. UNIX_TIMESTAMP(created) AS created,
  36. UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(created) AS age
  37. FROM users
  38. WHERE name = ?';
  39. $res = $dbh->query($q, $user_name);
  40. if(PEAR::isError($res))
  41. die_with_code(500, "{$res->message}\n{$q}\n");
  42. return $res->fetchRow(DB_FETCHMODE_ASSOC);
  43. }
  44. function set_user(&$dbh, $user)
  45. {
  46. $old_user = get_user($dbh, $user['id']);
  47. if(!$old_user)
  48. return false;
  49. $update_clauses = array();
  50. if(!is_null($user['name']) && $user['name'] != $old_user['name'])
  51. $update_clauses[] = sprintf('name = %s', $dbh->quoteSmart($user['name']));
  52. if(!is_null($user['email']) && $user['email'] != $old_user['email'])
  53. $update_clauses[] = sprintf('email = %s', $dbh->quoteSmart($user['email']));
  54. if(!is_null($user['password']))
  55. $update_clauses[] = sprintf('password = SHA1(%s)', $dbh->quoteSmart($user['password']));
  56. if(empty($update_clauses)) {
  57. error_log("skipping user {$user['id']} update since there's nothing to change");
  58. } else {
  59. $update_clauses = join(', ', $update_clauses);
  60. $q = "UPDATE users
  61. SET {$update_clauses}
  62. WHERE id = ".$dbh->quoteSmart($user['id']);
  63. error_log(preg_replace('/\s+/', ' ', $q));
  64. $res = $dbh->query($q);
  65. if(PEAR::isError($res))
  66. {
  67. if($res->getCode() == DB_ERROR_ALREADY_EXISTS)
  68. {
  69. return false;
  70. }
  71. die_with_code(500, "{$res->message}\n{$q}\n");
  72. }
  73. }
  74. return get_user($dbh, $user['id']);
  75. }
  76. function delete_user(&$dbh, $user_id)
  77. {
  78. $q = 'DELETE FROM users
  79. WHERE id = ?';
  80. log_debug($q, $user_id);
  81. $res = $dbh->query($q, $user_id);
  82. if(PEAR::isError($res))
  83. die_with_code(500, "{$res->message}\n{$q}\n");
  84. return true;
  85. }
  86. /**
  87. * Return true if a given user ID and password match the database.
  88. */
  89. function check_user_password(&$dbh, $user_id, $password)
  90. {
  91. $q = sprintf('SELECT password = SHA1(%s)
  92. FROM users
  93. WHERE id = ?
  94. LIMIT 1',
  95. $dbh->quoteSmart($password));
  96. log_debug($q, $user_id);
  97. $res = $dbh->query($q, $user_id);
  98. if(PEAR::isError($res))
  99. die_with_code(500, "{$res->message}\n{$q}\n");
  100. $match = $res->fetchRow();
  101. return $match[0] ? true : false;
  102. }
  103. /**
  104. * Functions below all assume that session_start() has already been called.
  105. */
  106. /**
  107. * Is the user logged in?
  108. */
  109. function is_logged_in()
  110. {
  111. return isset($_SESSION['user_id']);
  112. }
  113. /**
  114. * If the session contains a user id, return the associated user. Otherwise,
  115. * return null.
  116. */
  117. function cookied_user(&$dbh)
  118. {
  119. if ($_SESSION['user_id'] && ($user = get_user($dbh, $_SESSION['user_id']))) {
  120. return $user;
  121. }
  122. return null;
  123. }
  124. /**
  125. * Mark the user as being logged in by stashing their id in the session.
  126. */
  127. function login_user_by_id(&$dbh, $user_id) {
  128. $_SESSION['user_id'] = $user_id;
  129. }
  130. function login_user_by_name(&$dbh, $user) {
  131. if ($user = get_user_by_name($dbh, $user)) {
  132. $_SESSION['user_id'] = $user['id'];
  133. }
  134. }
  135. /**
  136. * Log a user out.
  137. */
  138. function logout_user()
  139. {
  140. session_destroy();
  141. }
  142. ?>