Updated to KH 3.3 and improved

This commit is contained in:
Deon George
2013-04-13 16:17:56 +10:00
parent 6f50463ec7
commit 6f7913d363
1551 changed files with 96188 additions and 29813 deletions

View File

@@ -0,0 +1,291 @@
<?php defined('SYSPATH') OR die('No direct access allowed.');
/**
* ORM Auth driver.
*
* @package Kohana/Auth
* @author Kohana Team
* @copyright (c) 2007-2012 Kohana Team
* @license http://kohanaframework.org/license
*/
class Kohana_Auth_ORM extends Auth {
/**
* Checks if a session is active.
*
* @param mixed $role Role name string, role ORM object, or array with role names
* @return boolean
*/
public function logged_in($role = NULL)
{
// Get the user from the session
$user = $this->get_user();
if ( ! $user)
return FALSE;
if ($user instanceof Model_User AND $user->loaded())
{
// If we don't have a roll no further checking is needed
if ( ! $role)
return TRUE;
if (is_array($role))
{
// Get all the roles
$roles = ORM::factory('Role')
->where('name', 'IN', $role)
->find_all()
->as_array(NULL, 'id');
// Make sure all the roles are valid ones
if (count($roles) !== count($role))
return FALSE;
}
else
{
if ( ! is_object($role))
{
// Load the role
$roles = ORM::factory('Role', array('name' => $role));
if ( ! $roles->loaded())
return FALSE;
}
}
return $user->has('roles', $roles);
}
}
/**
* Logs a user in.
*
* @param string $username
* @param string $password
* @param boolean $remember enable autologin
* @return boolean
*/
protected function _login($user, $password, $remember)
{
if ( ! is_object($user))
{
$username = $user;
// Load the user
$user = ORM::factory('User');
$user->where($user->unique_key($username), '=', $username)->find();
}
if (is_string($password))
{
// Create a hashed password
$password = $this->hash($password);
}
// If the passwords match, perform a login
if ($user->has('roles', ORM::factory('Role', array('name' => 'login'))) AND $user->password === $password)
{
if ($remember === TRUE)
{
// Token data
$data = array(
'user_id' => $user->pk(),
'expires' => time() + $this->_config['lifetime'],
'user_agent' => sha1(Request::$user_agent),
);
// Create a new autologin token
$token = ORM::factory('User_Token')
->values($data)
->create();
// Set the autologin cookie
Cookie::set('authautologin', $token->token, $this->_config['lifetime']);
}
// Finish the login
$this->complete_login($user);
return TRUE;
}
// Login failed
return FALSE;
}
/**
* Forces a user to be logged in, without specifying a password.
*
* @param mixed $user username string, or user ORM object
* @param boolean $mark_session_as_forced mark the session as forced
* @return boolean
*/
public function force_login($user, $mark_session_as_forced = FALSE)
{
if ( ! is_object($user))
{
$username = $user;
// Load the user
$user = ORM::factory('User');
$user->where($user->unique_key($username), '=', $username)->find();
}
if ($mark_session_as_forced === TRUE)
{
// Mark the session as forced, to prevent users from changing account information
$this->_session->set('auth_forced', TRUE);
}
// Run the standard completion
$this->complete_login($user);
}
/**
* Logs a user in, based on the authautologin cookie.
*
* @return mixed
*/
public function auto_login()
{
if ($token = Cookie::get('authautologin'))
{
// Load the token and user
$token = ORM::factory('User_Token', array('token' => $token));
if ($token->loaded() AND $token->user->loaded())
{
if ($token->user_agent === sha1(Request::$user_agent))
{
// Save the token to create a new unique token
$token->save();
// Set the new token
Cookie::set('authautologin', $token->token, $token->expires - time());
// Complete the login with the found data
$this->complete_login($token->user);
// Automatic login was successful
return $token->user;
}
// Token is invalid
$token->delete();
}
}
return FALSE;
}
/**
* Gets the currently logged in user from the session (with auto_login check).
* Returns $default if no user is currently logged in.
*
* @param mixed $default to return in case user isn't logged in
* @return mixed
*/
public function get_user($default = NULL)
{
$user = parent::get_user($default);
if ($user === $default)
{
// check for "remembered" login
if (($user = $this->auto_login()) === FALSE)
return $default;
}
return $user;
}
/**
* Log a user out and remove any autologin cookies.
*
* @param boolean $destroy completely destroy the session
* @param boolean $logout_all remove all tokens for user
* @return boolean
*/
public function logout($destroy = FALSE, $logout_all = FALSE)
{
// Set by force_login()
$this->_session->delete('auth_forced');
if ($token = Cookie::get('authautologin'))
{
// Delete the autologin cookie to prevent re-login
Cookie::delete('authautologin');
// Clear the autologin token from the database
$token = ORM::factory('User_Token', array('token' => $token));
if ($token->loaded() AND $logout_all)
{
// Delete all user tokens. This isn't the most elegant solution but does the job
$tokens = ORM::factory('User_Token')->where('user_id','=',$token->user_id)->find_all();
foreach ($tokens as $_token)
{
$_token->delete();
}
}
elseif ($token->loaded())
{
$token->delete();
}
}
return parent::logout($destroy);
}
/**
* Get the stored password for a username.
*
* @param mixed $user username string, or user ORM object
* @return string
*/
public function password($user)
{
if ( ! is_object($user))
{
$username = $user;
// Load the user
$user = ORM::factory('User');
$user->where($user->unique_key($username), '=', $username)->find();
}
return $user->password;
}
/**
* Complete the login for a user by incrementing the logins and setting
* session data: user_id, username, roles.
*
* @param object $user user ORM object
* @return void
*/
protected function complete_login($user)
{
$user->complete_login();
return parent::complete_login($user);
}
/**
* Compare password with original (hashed). Works for current (logged in) user
*
* @param string $password
* @return boolean
*/
public function check_password($password)
{
$user = $this->get_user();
if ( ! $user)
return FALSE;
return ($this->hash($password) === $user->password);
}
} // End Auth ORM

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,198 @@
<?php defined('SYSPATH') OR die('No direct script access.');
/**
* ORM Validation exceptions.
*
* @package Kohana/ORM
* @author Kohana Team
* @copyright (c) 2007-2012 Kohana Team
* @license http://kohanaframework.org/license
*/
class Kohana_ORM_Validation_Exception extends Kohana_Exception {
/**
* Array of validation objects
* @var array
*/
protected $_objects = array();
/**
* The alias of the main ORM model this exception was created for
* @var string
*/
protected $_alias = NULL;
/**
* Constructs a new exception for the specified model
*
* @param string $alias The alias to use when looking for error messages
* @param Validation $object The Validation object of the model
* @param string $message The error message
* @param array $values The array of values for the error message
* @param integer $code The error code for the exception
* @return void
*/
public function __construct($alias, Validation $object, $message = 'Failed to validate array', array $values = NULL, $code = 0, Exception $previous = NULL)
{
$this->_alias = $alias;
$this->_objects['_object'] = $object;
$this->_objects['_has_many'] = FALSE;
parent::__construct($message, $values, $code, $previous);
}
/**
* Adds a Validation object to this exception
*
* // The following will add a validation object for a profile model
* // inside the exception for a user model.
* $e->add_object('profile', $validation);
* // The errors array will now look something like this
* // array
* // (
* // 'username' => 'This field is required',
* // 'profile' => array
* // (
* // 'first_name' => 'This field is required',
* // ),
* // );
*
* @param string $alias The relationship alias from the model
* @param Validation $object The Validation object to merge
* @param mixed $has_many The array key to use if this exception can be merged multiple times
* @return ORM_Validation_Exception
*/
public function add_object($alias, Validation $object, $has_many = FALSE)
{
// We will need this when generating errors
$this->_objects[$alias]['_has_many'] = ($has_many !== FALSE);
if ($has_many === TRUE)
{
// This is most likely a has_many relationship
$this->_objects[$alias][]['_object'] = $object;
}
elseif ($has_many)
{
// This is most likely a has_many relationship
$this->_objects[$alias][$has_many]['_object'] = $object;
}
else
{
$this->_objects[$alias]['_object'] = $object;
}
return $this;
}
/**
* Merges an ORM_Validation_Exception object into the current exception
* Useful when you want to combine errors into one array
*
* @param ORM_Validation_Exception $object The exception to merge
* @param mixed $has_many The array key to use if this exception can be merged multiple times
* @return ORM_Validation_Exception
*/
public function merge(ORM_Validation_Exception $object, $has_many = FALSE)
{
$alias = $object->alias();
// We will need this when generating errors
$this->_objects[$alias]['_has_many'] = ($has_many !== FALSE);
if ($has_many === TRUE)
{
// This is most likely a has_many relationship
$this->_objects[$alias][] = $object->objects();
}
elseif ($has_many)
{
// This is most likely a has_many relationship
$this->_objects[$alias][$has_many] = $object->objects();
}
else
{
$this->_objects[$alias] = $object->objects();
}
return $this;
}
/**
* Returns a merged array of the errors from all the Validation objects in this exception
*
* // Will load Model_User errors from messages/orm-validation/user.php
* $e->errors('orm-validation');
*
* @param string $directory Directory to load error messages from
* @param mixed $translate Translate the message
* @return array
* @see generate_errors()
*/
public function errors($directory = NULL, $translate = TRUE)
{
return $this->generate_errors($this->_alias, $this->_objects, $directory, $translate);
}
/**
* Recursive method to fetch all the errors in this exception
*
* @param string $alias Alias to use for messages file
* @param array $array Array of Validation objects to get errors from
* @param string $directory Directory to load error messages from
* @param mixed $translate Translate the message
* @return array
*/
protected function generate_errors($alias, array $array, $directory, $translate)
{
$errors = array();
foreach ($array as $key => $object)
{
if (is_array($object))
{
$errors[$key] = ($key === '_external')
// Search for errors in $alias/_external.php
? $this->generate_errors($alias.'/'.$key, $object, $directory, $translate)
// Regular models get their own file not nested within $alias
: $this->generate_errors($key, $object, $directory, $translate);
}
elseif ($object instanceof Validation)
{
if ($directory === NULL)
{
// Return the raw errors
$file = NULL;
}
else
{
$file = trim($directory.'/'.$alias, '/');
}
// Merge in this array of errors
$errors += $object->errors($file, $translate);
}
}
return $errors;
}
/**
* Returns the protected _objects property from this exception
*
* @return array
*/
public function objects()
{
return $this->_objects;
}
/**
* Returns the protected _alias property from this exception
*
* @return string
*/
public function alias()
{
return $this->_alias;
}
} // End Kohana_ORM_Validation_Exception