query( "SELECT * FROM user WHERE email = :email AND active = 1", [ ':email' => $email ] )->getFirst(); // if no user, return false if ($user === false) return false; return $user; } /** get user (by index key) * * user detailed array * includes all user properties + granted roles + privileges * * @param $id (int) : user id * @param $value (string) */ public static function getUser($id) { $user = Registry::use('database')->query( "SELECT user.*, ( -- construct array (json) of roles granted to user SELECT CONCAT( '[', GROUP_CONCAT(role.id), ']' ) FROM `role` WHERE role.id IN ( SELECT user_role.role_id FROM user_role WHERE user_role.user_id = :id ) ) AS Roles_json FROM user WHERE id = :id", [ ':id' => $id ] )->getFirst(); // if no user, return false if ($user === false) return false; // TODO: // * merge root+sub privilede lists // * convert json strings to php arrays // TODO: // cache user super array return $user; } /** create user * * creates user record; * assigns privileged (usualy defaults); * creates activation_code * * @param $data (array): Request->POST array * @param $password (string): secure hashed password * * @return $activation_code * */ public static function registerUser($data, $password, $privileges = DEFAULT_PRIVILEGES) { $required_fields = [ 'name', 'surname', 'email', 'password' ]; // check required fields $isOK = true; foreach($required_fields as $fi) { if (empty($data[$fi])) $isOK = false; } // if empty required fields exists ... return false if (!$isOK) { return [ "success" => false, 'error' => EMPTY_REQUIRED_FIELDS ]; } // create an activation code $activation_code = md5($data['email'].time().rand(0, 10000)); // if isOK go on and... // create user record $new_user_id = Registry::use('database')->query( "INSERT INTO user (`first_name`, `last_name`, `email`, `password`, `active`, `activation`) VALUES (:nam, :surname, :email, :pass, :act, :actcode)", [ ':nam' => $data['name'], ':surname' => $data['surname'], ':email' => $data['email'], ':pass' => $password, ':act' => 0, // needs email confirmation to be activated ... ':actcode' => $activation_code // ... with the activation code ] )->lastInsertID(); // set default privileges self::set_user_privileges($new_user_id, $privileges); // set reader role self::set_user_role($new_user_id, 5); // update history History_model::trackUserAccess($new_user_id, TRACK_ACCOUNT, 'Create User Account'); // return success and user id return [ "success" => true, 'id' => $new_user_id , 'activation' => $activation_code ]; } /** activate * * check if activation code is valid; * if valid, set account active; * * @param $ticket (hex/MD5): activation code; * */ public static function activate($ticket) { $user = Registry::use('database')->query( "SELECT * FROM user WHERE activation = :ticket", [ 'ticket' => $ticket ] )->getFirst(); // if no user with this activation code, return false if ($user === false) return false; // remove activation code from user record Registry::use('database')->runQuery( "UPDATE user SET active = 1, `activation` = NULL WHERE activation = :ticket", [ 'ticket' => $ticket ] ); // update history History_model::trackUserAccess($user['id'], TRACK_ACCOUNT, 'User Account Activated'); return true; } ## Set permission methods ## ------------------------------------------------------------------------- /** set_user_privileges * * @param $privileges (array) */ public static function set_user_privileges($user, $privileges) { $db = Registry::use('database'); // database connection foreach($privileges as $pri) { // pri = privilege id $db->runQuery( "INSERT INTO user_privilege (user_id, privilege_id) VALUES (:user, :pri)", [ ':user' => $user, ":pri" => $pri ] ); } return true; } /** set_user_role * * user, role are (int) IDs */ public static function set_user_role($user, $role) { Registry::use('database')->runQuery( "INSERT INTO user_role (user_id, role_id) VALUES (:user, :role)", [ ':user' => $user, ":role" => $role ] ); return true; } ## List methods ## ------------------------------------------------------------------------- /** privileges * --- * get all privileges (as a list) * used by cacher; speeds up seveal things * * @param void * @return privileges (array) */ public static function privileges() { return Registry::use('database')->runQuery( "SELECT * FROM privilege",[] ); } }