*/ class User extends Model { public $belongs_to = "group"; public $has_many = array("posts", "pages"); /** * Function: __construct * See Also: * */ public function __construct($user_id, $options = array()) { parent::grab($this, $user_id, $options); if ($this->no_results) return false; Trigger::current()->filter($this, "user"); } /** * Function: find * See Also: * */ static function find($options = array(), $options_for_object = array()) { fallback($options["order"], "id ASC"); return parent::search(get_class(), $options, $options_for_object); } /** * Function: authenticate * Checks to see if a given Login and Password match a user in the database. * * Parameters: * $login - The Login to check. * $password - The matching Password to check. * * Returns: * @true@ or @false@ */ static function authenticate($login, $password) { $check = new self(array("login" => $login)); if ($check->no_results) return false; else { if (self::checkPassword($password, $check->password)) return true; elseif (md5($password) == $check->password) { # Backwards-compatibility: # if their old password is stored as MD5, update # it on authentication to the new hashing scheme. $check->update(null, self::hashPassword($password)); return true; } elseif(SQL::current()->adapter == "mysql") { # Some imports might use MySQL password hashing (such as MovableType 3). # Try those too, and update the user if they match. $sql = SQL::current(); $old = $sql->query("SELECT OLD_PASSWORD(:pass)", array(":pass" => $password))->fetch(); if ($old[0] == $check->password) { $check->update(null, self::hashPassword($password)); return true; } $new = $sql->query("SELECT PASSWORD(:pass)", array(":pass" => $password))->fetch(); if ($new[0] == $check->password) { $check->update(null, self::hashPassword($password)); return true; } } } return false; } /** * Function: add * Adds a user to the database with the passed username, password, and e-mail. * * Calls the @add_user@ trigger with the inserted user. * * Parameters: * $login - The Login for the new user. * $password - The Password for the new user. Don't hash this, it's done in the function. * $email - The E-Mail for the new user. * $full_name - The full name of the user. * $website - The user's website. * $group - The user's group (defaults to the configured default group). * $joined_at - Join date (defaults to now). * $hash_password - Hash the password automatically? (defaults to true) * * Returns: * The newly created . * * See Also: * */ static function add($login, $password, $email, $full_name = "", $website = "", $group_ = null, $joined_at = null, $hash_password = true) { $config = Config::current(); $sql = SQL::current(); $trigger = Trigger::current(); if (empty($group)) $group_id = $config->default_group; else $group_id = ($group instanceof Group) ? $group->id : $group; $new_values = array("login" => strip_tags($login), "password" => ($hash_password ? self::hashPassword($password) : $password), "email" => strip_tags($email), "full_name" => strip_tags($full_name), "website" => strip_tags($website), "group_id" => $group_id, "joined_at" => oneof($joined_at, datetime())); $trigger->filter($new_values, "before_add_user"); $sql->insert("users", $new_values); $user = new self($sql->latest("users")); $trigger->call("add_user", $user); return $user; } /** * Function: update * Updates the user with the given login, password, full name, e-mail, website, and ID. * * Passes all of the arguments to the update_user trigger. * * Parameters: * $login - The new Login to set. * $password - The new Password to set, already encoded. * $full_name - The new Full Name to set. * $email - The new E-Mail to set. * $website - The new Website to set. * $group_id - The new to set. * * See Also: * */ public function update($login = null, $password = null, $email = null, $full_name = null, $website = null, $group_id = null, $joined_at = null) { if ($this->no_results) return false; $sql = SQL::current(); $trigger = Trigger::current(); $old = clone $this; foreach (array("login", "password", "email", "full_name", "website", "group_id", "joined_at") as $attr) $this->$attr = $$attr = ($$attr !== null ? $$attr : $this->$attr); $new_values = array("login" => strip_tags($login), "password" => $password, "email" => strip_tags($email), "full_name" => strip_tags($full_name), "website" => strip_tags($website), "group_id" => $group_id, "joined_at" => $joined_at); $trigger->filter($new_values, "before_update_user"); $sql->update("users", array("id" => $this->id), $new_values); $trigger->call("update_user", $this, $old); } /** * Function: delete * Deletes a given user. Calls the @delete_user@ trigger and passes the as an argument. * * Parameters: * $id - The user to delete. */ static function delete($id) { parent::destroy(get_class(), $id); } /** * Function: hashPassword * Creates a secure hash of a user's password. * * Parameters: * $password - The unhashed password. * * Returns: * The securely hashed password to be stored in the database. */ static function hashPassword($password) { $hasher = new PasswordHash(8, false); $hashedPassword = $hasher->HashPassword($password); return $hashedPassword; } /** * Function: checkPassword * Checks a given password against the stored hash. * * Parameters: * $password - The unhashed password given during a login attempt. * $storedHash - The stored hash for the user. * * Returns: * @true@ or @false@ */ static function checkPassword($password, $storedHash) { $hasher = new PasswordHash(8, false); return $hasher->CheckPassword($password, $storedHash); } /** * Function: group * Returns a user's group. Example: $user->group->can("do_something") * * !! DEPRECATED AFTER 2.0 !! */ public function group() { if ($this->no_results) return false; return new Group($this->group_id); } /** * Function: posts * Returns all the posts of the user. * * !! DEPRECATED AFTER 2.0 !! */ public function posts() { if ($this->no_results) return false; return Post::find(array("where" => array("user_id" => $this->id))); } /** * Function: pages * Returns all the pages of the user. * * !! DEPRECATED AFTER 2.0 !! */ public function pages() { if ($this->no_results) return false; return Page::find(array("where" => array("user_id" => $this->id))); } }