Advertisement
Guest User

FuelPHP User Model

a guest
Apr 30th, 2013
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.71 KB | None | 0 0
  1. <?php
  2. /**
  3.  * User model
  4.  *
  5.  * @package  app
  6.  * @extends  Model
  7.  */
  8.  
  9. namespace Model;
  10.  
  11. class User extends \Model
  12. {
  13.     protected $user = null;
  14.  
  15.     public static function _init()
  16.     {
  17.         // load langauge strings
  18.         \Lang::load('errors', 'validation');
  19.     }
  20.  
  21.     public static function check_username_availability($username)
  22.     {
  23.         $cleanUsername = \Security::xss_clean($username);
  24.         $result = \DB::select('username')->from('users')->where('username', $cleanUsername)->execute()->current();
  25.         return (count($result) == 0) ? "AVAILABLE" : "NOT AVAILABLE";
  26.     }
  27.    
  28.     public static function fetch_user_hash_token($username)
  29.     {
  30.         $result = \DB::select('hash_token')->from('users')->where('username', $username)->execute()->current();
  31.         return $result['hash_token'];
  32.     }
  33.    
  34.     public static function confirm_account($token)
  35.     {
  36.         $result = \DB::select('activation_token', 'account_status')->from('users')->where('activation_token', $token)->limit(1)->execute()->current();
  37.        
  38.         if(!$token)
  39.             return 'MISSING_TOKEN';
  40.         else
  41.         {
  42.             if(!$result)
  43.                 return 'INVALID_TOKEN';
  44.             else if($result['account_status'] == 'pending_activation')
  45.             {
  46.                 \DB::update('users')
  47.                 ->value('account_status', 'active')
  48.                 ->where('activation_token', '=', $token)
  49.                 ->execute();
  50.            
  51.                 return 'CONFIRMED';
  52.             }
  53.             else
  54.                 return 'ALREADY_CONFIRMED';
  55.         }
  56.     }
  57.        
  58.    
  59.     public static function process_registration($email, $username, $password, $confirmPassword)
  60.     {      
  61.         // perform server side validation as a fail-safe to client side validation
  62.         $cleanEmail = \Security::xss_clean($email);
  63.         $cleanUsername = \Security::xss_clean($username);
  64.         $cleanPassword = \Security::xss_clean($password);
  65.         $cleanConfirmedPassword = \Security::xss_clean($confirmPassword);
  66.        
  67.         $usernameFilter = "/^[A-Za-z0-9 ]+$/";
  68.        
  69.         preg_match($usernameFilter, $cleanUsername, $usernameMatches);
  70.         $existingEmail = \DB::select('email')->from('users')->where('email', $cleanEmail)->limit(1)->execute()->current();
  71.  
  72.         if(strlen($cleanEmail) == 0)
  73.             return __('errors.validation.COMPLETE_REQUIRED_FIELDS');
  74.         if(strlen($cleanUsername) == 0)
  75.             return __('errors.validation.COMPLETE_REQUIRED_FIELDS');
  76.         if(strlen($cleanPassword) == 0)
  77.             return __('errors.validation.COMPLETE_REQUIRED_FIELDS');
  78.         if(strlen($cleanConfirmedPassword) == 0)
  79.             return __('errors.validation.COMPLETE_REQUIRED_FIELDS');
  80.         if(!filter_var($cleanEmail, FILTER_VALIDATE_EMAIL))
  81.             return __('errors.validation.INVALID_EMAIL');
  82.         if($cleanPassword != $cleanConfirmedPassword)
  83.             return __('errors.validation.PASSWORD_MISMATCH');
  84.         if(count($usernameMatches) == 0)
  85.             return __('errors.validation.INVALID_USERNAME');
  86.         if(strlen($cleanUsername) < 5)
  87.             return __('errors.validation.USERNAME_MIN_LEN');
  88.         if(count($existingEmail) > 0)
  89.             return __('errors.validation.EXISTING_EMAIL');
  90.         if(static::check_username_availability($cleanUsername) == "NOT AVAILABLE")
  91.             return __('errors.validation.USERNAME_NOT_AVAILABLE');
  92.  
  93.         // all good!  
  94.         $randSeed = substr(number_format(\Date::forge()->get_timestamp() * rand(),0,'',''),0,10);
  95.         list($insert_id, $rows_affected) = \DB::insert('users')->set(array(
  96.             'username'   => $cleanUsername,
  97.             'password'   => \Crypt::encode($cleanPassword . $randSeed, $randSeed),
  98.             'group'      => 1,
  99.             'email'      => $cleanEmail,
  100.             'last_login' => '',
  101.             'login_hash' => '',
  102.             'hash_token' => $randSeed,
  103.             'created_at' => \Date::forge()->get_timestamp(),
  104.             'account_status' => 'pending_activation',
  105.             'activation_token' => substr(\Crypt::encode($cleanUsername . $randSeed, $randSeed), 0, 30)
  106.         ))->execute();
  107.  
  108.                 if(!$insert_id)
  109.                     return __('errors.validation.REGISTRATION_FAILED');
  110.  
  111.                 // retrieve activation token && send the mail
  112.                 $result = \DB::select('activation_token')->from('users')->where('id', $insert_id)->limit(1)->execute()->current(); 
  113.         $email = \Email::forge();
  114.         $data = array('activation_token' => $result['activation_token']);
  115.        
  116.         $email->to($cleanEmail);
  117.         $email->subject('Activate your PoochFinder account');
  118.         $email->body(\View::forge('templates/email/activation', $data));
  119.         $email->send();
  120.  
  121.         return 'SUCCESS';
  122.     }
  123.    
  124.     public static function process_login($username, $password, $rememberMe)
  125.     {      
  126.         // perform server side validation as a fail-safe to client side validation
  127.         $cleanUsername = \Security::xss_clean($username);
  128.         $cleanPassword = \Security::xss_clean($password);
  129.        
  130.         $usernameFilter = "/^[A-Za-z0-9 ]+$/";
  131.        
  132.         preg_match($usernameFilter, $cleanUsername, $usernameMatches);
  133.  
  134.         if(strlen($cleanUsername) == 0)
  135.             return __('errors.validation.COMPLETE_REQUIRED_FIELDS');
  136.         if(strlen($cleanPassword) == 0)
  137.             return __('errors.validation.COMPLETE_REQUIRED_FIELDS');
  138.         if(count($usernameMatches) == 0)
  139.             return __('errors.validation.INVALID_USERNAME');
  140.  
  141.         // check login details
  142.         $hashToken = static::fetch_user_hash_token($cleanUsername);
  143.        
  144.         $this->user = \DB::select_array(array('username', 'login_hash'))
  145.             ->from('users')
  146.             ->where('username', '=', $cleanUsername)
  147.             ->where('password', '=', \Crypt::encode($cleanPassword . $hashToken, $hashToken))
  148.             ->limit(1)->execute()->current();
  149.            
  150.         // FAIL!
  151.         if(!$this->user)
  152.             return __('errors.validation.INVALID_USERNAME_OR_PASSWORD');
  153.            
  154.         // log em in
  155.         $last_login = \Date::forge()->get_timestamp();
  156.         $login_hash = \Crypt::encode($cleanUsername . $last_login . $hashToken, $hashToken);
  157.  
  158.         \DB::update('users')
  159.             ->set(array('last_login' => $last_login, 'login_hash' => $login_hash))
  160.             ->where('username', '=', $cleanUsername)
  161.             ->execute();
  162.         \Session::set('username', $cleanUsername);
  163.         \Session::set('login_hash', $login_hash);
  164.         \Session::instance()->rotate();
  165.        
  166.         return 'SUCCESS';
  167.     }
  168.    
  169.     public static function initiate_password_reset($email)
  170.     {
  171.         // we start by cleaning & validating the e-mail address
  172.         $cleanEmail = \Security::xss_clean($email);
  173.         $result = \DB::select('id', 'hash_token')->from('users')->where('email', $cleanEmail)->execute()->current();
  174.        
  175.         if(strlen($cleanEmail) == 0)
  176.             return __('errors.validation.COMPLETE_REQUIRED_FIELDS');
  177.         if(!filter_var($cleanEmail, FILTER_VALIDATE_EMAIL))
  178.             return __('errors.validation.INVALID_EMAIL');
  179.         if(count($result) == 0)
  180.             return __('errors.validation.EMAIL_NOT_FOUND');
  181.        
  182.         list($insert_id, $rows_affected) = \DB::insert('pw_reset_requests')->set(array(
  183.             'request_id'    => '',
  184.             'user_id'       => $result['id'],
  185.             'request_token' => substr(\Crypt::encode($cleanEmail . $result['hash_token'], $result['hash_token']), 0, 30),
  186.             'timestamp'     => \Date::forge()->get_timestamp()
  187.         ))->execute();
  188.        
  189.         if(!$insert_id)
  190.                     return __('errors.validation.REQUEST_FAILED');
  191.                        
  192.                 // retrieve reset token && send the mail
  193.                 $result = \DB::select('request_token')->from('pw_reset_requests')->where('request_id', $insert_id)->limit(1)->execute()->current();
  194.         $email = \Email::forge();
  195.         $data = array('request_token' => $result['request_token']);
  196.        
  197.         $email->to($cleanEmail);
  198.         $email->subject('Reset your password');
  199.         $email->body(\View::forge('templates/email/confirmPwReset', $data));
  200.         $email->send();
  201.        
  202.                 return 'SUCCESS';
  203.     }
  204.    
  205.     public static function complete_password_reset($token)
  206.     {
  207.         $result = \DB::select('request_token', 'user_id', 'timestamp')->from('pw_reset_requests')->where('request_token', $token)->limit(1)->execute()->current();
  208.         $userResult = \DB::select('email')->from('users')->where('id', '=', $result['user_id'])->limit(1)->execute()->current();
  209.        
  210.         if(!$token)
  211.             return 'MISSING_TOKEN';
  212.         else
  213.         {
  214.             if(!$result)
  215.                 return 'INVALID_TOKEN';
  216.             else
  217.             {  
  218.                 // is token still valid?
  219.                 if((\Date::forge()->get_timestamp() - $result['timestamp']) > 86400)
  220.                     return 'EXPIRED_TOKEN';
  221.                
  222.                 // generate && set a random 7 character alpha-numeric password
  223.                 $randSeed = substr(number_format(\Date::forge()->get_timestamp() * rand(),0,'',''),0,10);
  224.                 $randPw = substr(md5(rand(0, 1000000)), 0, 10);
  225.                
  226.                 \DB::update('users')
  227.                 ->set(array(
  228.                     'hash_token' => $randSeed,
  229.                     'password'   => \Crypt::encode($randPw . $randSeed, $randSeed)
  230.                 ))
  231.                 ->where('id', '=', $result['user_id'])
  232.                 ->execute();
  233.                
  234.                 // delete the reset request as it is complete
  235.                 \DB::delete('pw_reset_requests')->where('request_token', '=', $result['request_token'])->execute();
  236.                
  237.                 // email temporary password
  238.                 $email = \Email::forge();
  239.                 $data = array('tempPw' => $randPw);
  240.        
  241.                 $email->to($userResult['email']);
  242.                 $email->subject('Your temporary password');
  243.                 $email->body(\View::forge('templates/email/tempPw', $data));
  244.                 $email->send();
  245.            
  246.                 return 'SUCCESS';
  247.             }
  248.         }
  249.     }        
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement