Added Kohana v3.0.8
This commit is contained in:
27
includes/kohana/modules/auth/classes/model/auth/role.php
Normal file
27
includes/kohana/modules/auth/classes/model/auth/role.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
/**
|
||||
* Default auth role
|
||||
*
|
||||
* @package Kohana/Auth
|
||||
* @author Kohana Team
|
||||
* @copyright (c) 2007-2009 Kohana Team
|
||||
* @license http://kohanaphp.com/license.html
|
||||
*/
|
||||
class Model_Auth_Role extends ORM {
|
||||
|
||||
// Relationships
|
||||
protected $_has_many = array('users' => array('through' => 'roles_users'));
|
||||
|
||||
// Validation rules
|
||||
protected $_rules = array(
|
||||
'name' => array(
|
||||
'not_empty' => NULL,
|
||||
'min_length' => array(4),
|
||||
'max_length' => array(32),
|
||||
),
|
||||
'description' => array(
|
||||
'max_length' => array(255),
|
||||
),
|
||||
);
|
||||
|
||||
} // End Auth Role Model
|
244
includes/kohana/modules/auth/classes/model/auth/user.php
Normal file
244
includes/kohana/modules/auth/classes/model/auth/user.php
Normal file
@@ -0,0 +1,244 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
/**
|
||||
* Default auth user
|
||||
*
|
||||
* @package Kohana/Auth
|
||||
* @author Kohana Team
|
||||
* @copyright (c) 2007-2009 Kohana Team
|
||||
* @license http://kohanaphp.com/license.html
|
||||
*/
|
||||
class Model_Auth_User extends ORM {
|
||||
|
||||
// Relationships
|
||||
protected $_has_many = array(
|
||||
'user_tokens' => array('model' => 'user_token'),
|
||||
'roles' => array('model' => 'role', 'through' => 'roles_users'),
|
||||
);
|
||||
|
||||
// Validation rules
|
||||
protected $_rules = array(
|
||||
'username' => array(
|
||||
'not_empty' => NULL,
|
||||
'min_length' => array(4),
|
||||
'max_length' => array(32),
|
||||
'regex' => array('/^[-\pL\pN_.]++$/uD'),
|
||||
),
|
||||
'password' => array(
|
||||
'not_empty' => NULL,
|
||||
'min_length' => array(5),
|
||||
'max_length' => array(42),
|
||||
),
|
||||
'password_confirm' => array(
|
||||
'matches' => array('password'),
|
||||
),
|
||||
'email' => array(
|
||||
'not_empty' => NULL,
|
||||
'min_length' => array(4),
|
||||
'max_length' => array(127),
|
||||
'email' => NULL,
|
||||
),
|
||||
);
|
||||
|
||||
// Validation callbacks
|
||||
protected $_callbacks = array(
|
||||
'username' => array('username_available'),
|
||||
'email' => array('email_available'),
|
||||
);
|
||||
|
||||
// Field labels
|
||||
protected $_labels = array(
|
||||
'username' => 'username',
|
||||
'email' => 'email address',
|
||||
'password' => 'password',
|
||||
'password_confirm' => 'password confirmation',
|
||||
);
|
||||
|
||||
// Columns to ignore
|
||||
protected $_ignored_columns = array('password_confirm');
|
||||
|
||||
/**
|
||||
* Validates login information from an array, and optionally redirects
|
||||
* after a successful login.
|
||||
*
|
||||
* @param array values to check
|
||||
* @param string URI or URL to redirect to
|
||||
* @return boolean
|
||||
*/
|
||||
public function login(array & $array, $redirect = FALSE)
|
||||
{
|
||||
$fieldname = $this->unique_key($array['username']);
|
||||
$array = Validate::factory($array)
|
||||
->label('username', $this->_labels[$fieldname])
|
||||
->label('password', $this->_labels['password'])
|
||||
->filter(TRUE, 'trim')
|
||||
->rules('username', $this->_rules[$fieldname])
|
||||
->rules('password', $this->_rules['password']);
|
||||
|
||||
// Get the remember login option
|
||||
$remember = isset($array['remember']);
|
||||
|
||||
// Login starts out invalid
|
||||
$status = FALSE;
|
||||
|
||||
if ($array->check())
|
||||
{
|
||||
// Attempt to load the user
|
||||
$this->where($fieldname, '=', $array['username'])->find();
|
||||
|
||||
if ($this->loaded() AND Auth::instance()->login($this, $array['password'], $remember))
|
||||
{
|
||||
if (is_string($redirect))
|
||||
{
|
||||
// Redirect after a successful login
|
||||
Request::instance()->redirect($redirect);
|
||||
}
|
||||
|
||||
// Login is successful
|
||||
$status = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
$array->error('username', 'invalid');
|
||||
}
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates an array for a matching password and password_confirm field,
|
||||
* and optionally redirects after a successful save.
|
||||
*
|
||||
* @param array values to check
|
||||
* @param string URI or URL to redirect to
|
||||
* @return boolean
|
||||
*/
|
||||
public function change_password(array & $array, $redirect = FALSE)
|
||||
{
|
||||
$array = Validate::factory($array)
|
||||
->label('password', $this->_labels['password'])
|
||||
->label('password_confirm', $this->_labels['password_confirm'])
|
||||
->filter(TRUE, 'trim')
|
||||
->rules('password', $this->_rules['password'])
|
||||
->rules('password_confirm', $this->_rules['password_confirm']);
|
||||
|
||||
if ($status = $array->check())
|
||||
{
|
||||
// Change the password
|
||||
$this->password = $array['password'];
|
||||
|
||||
if ($status = $this->save() AND is_string($redirect))
|
||||
{
|
||||
// Redirect to the success page
|
||||
Request::instance()->redirect($redirect);
|
||||
}
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete the login for a user by incrementing the logins and saving login timestamp
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function complete_login()
|
||||
{
|
||||
if ( ! $this->_loaded)
|
||||
{
|
||||
// nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
// Update the number of logins
|
||||
$this->logins = new Database_Expression('logins + 1');
|
||||
|
||||
// Set the last login date
|
||||
$this->last_login = time();
|
||||
|
||||
// Save the user
|
||||
$this->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the reverse of unique_key_exists() by triggering error if username exists.
|
||||
* Validation callback.
|
||||
*
|
||||
* @param Validate Validate object
|
||||
* @param string field name
|
||||
* @return void
|
||||
*/
|
||||
public function username_available(Validate $array, $field)
|
||||
{
|
||||
if ($this->unique_key_exists($array[$field], 'username'))
|
||||
{
|
||||
$array->error($field, 'username_available', array($array[$field]));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the reverse of unique_key_exists() by triggering error if email exists.
|
||||
* Validation callback.
|
||||
*
|
||||
* @param Validate Validate object
|
||||
* @param string field name
|
||||
* @return void
|
||||
*/
|
||||
public function email_available(Validate $array, $field)
|
||||
{
|
||||
if ($this->unique_key_exists($array[$field], 'email'))
|
||||
{
|
||||
$array->error($field, 'email_available', array($array[$field]));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if a unique key value exists in the database.
|
||||
*
|
||||
* @param mixed the value to test
|
||||
* @param string field name
|
||||
* @return boolean
|
||||
*/
|
||||
public function unique_key_exists($value, $field = NULL)
|
||||
{
|
||||
if ($field === NULL)
|
||||
{
|
||||
// Automatically determine field by looking at the value
|
||||
$field = $this->unique_key($value);
|
||||
}
|
||||
|
||||
return (bool) DB::select(array('COUNT("*")', 'total_count'))
|
||||
->from($this->_table_name)
|
||||
->where($field, '=', $value)
|
||||
->where($this->_primary_key, '!=', $this->pk())
|
||||
->execute($this->_db)
|
||||
->get('total_count');
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows a model use both email and username as unique identifiers for login
|
||||
*
|
||||
* @param string unique value
|
||||
* @return string field name
|
||||
*/
|
||||
public function unique_key($value)
|
||||
{
|
||||
return Validate::email($value) ? 'email' : 'username';
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the current object. Will hash password if it was changed.
|
||||
*
|
||||
* @return ORM
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
if (array_key_exists('password', $this->_changed))
|
||||
{
|
||||
$this->_object['password'] = Auth::instance()->hash_password($this->_object['password']);
|
||||
}
|
||||
|
||||
return parent::save();
|
||||
}
|
||||
|
||||
} // End Auth User Model
|
101
includes/kohana/modules/auth/classes/model/auth/user/token.php
Normal file
101
includes/kohana/modules/auth/classes/model/auth/user/token.php
Normal file
@@ -0,0 +1,101 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
/**
|
||||
* Default auth user toke
|
||||
*
|
||||
* @package Kohana/Auth
|
||||
* @author Kohana Team
|
||||
* @copyright (c) 2007-2009 Kohana Team
|
||||
* @license http://kohanaphp.com/license.html
|
||||
*/
|
||||
class Model_Auth_User_Token extends ORM {
|
||||
|
||||
// Relationships
|
||||
protected $_belongs_to = array('user' => array());
|
||||
|
||||
// Current timestamp
|
||||
protected $_now;
|
||||
|
||||
/**
|
||||
* Handles garbage collection and deleting of expired objects.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($id = NULL)
|
||||
{
|
||||
parent::__construct($id);
|
||||
|
||||
// Set the now, we use this a lot
|
||||
$this->_now = time();
|
||||
|
||||
if (mt_rand(1, 100) === 1)
|
||||
{
|
||||
// Do garbage collection
|
||||
$this->delete_expired();
|
||||
}
|
||||
|
||||
if ($this->expires < $this->_now)
|
||||
{
|
||||
// This object has expired
|
||||
$this->delete();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Overload saving to set the created time and to create a new token
|
||||
* when the object is saved.
|
||||
*
|
||||
* @return ORM
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
if ($this->loaded() === FALSE)
|
||||
{
|
||||
// Set the created time, token, and hash of the user agent
|
||||
$this->created = $this->_now;
|
||||
$this->user_agent = sha1(Request::$user_agent);
|
||||
}
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
// Generate a new token
|
||||
$this->token = $this->create_token();
|
||||
|
||||
try
|
||||
{
|
||||
return parent::save();
|
||||
}
|
||||
catch (Kohana_Database_Exception $e)
|
||||
{
|
||||
// Collision occurred, token is not unique
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes all expired tokens.
|
||||
*
|
||||
* @return ORM
|
||||
*/
|
||||
public function delete_expired()
|
||||
{
|
||||
// Delete all expired tokens
|
||||
DB::delete($this->_table_name)
|
||||
->where('expires', '<', $this->_now)
|
||||
->execute($this->_db);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a new unique token.
|
||||
*
|
||||
* @return string
|
||||
* @uses Text::random
|
||||
*/
|
||||
protected function create_token()
|
||||
{
|
||||
// Create a random token
|
||||
return Text::random('alnum', 32);
|
||||
}
|
||||
|
||||
} // End Auth User Token Model
|
7
includes/kohana/modules/auth/classes/model/role.php
Normal file
7
includes/kohana/modules/auth/classes/model/role.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
class Model_Role extends Model_Auth_Role {
|
||||
|
||||
// This class can be replaced or extended
|
||||
|
||||
} // End Role Model
|
7
includes/kohana/modules/auth/classes/model/user.php
Normal file
7
includes/kohana/modules/auth/classes/model/user.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
class Model_User extends Model_Auth_User {
|
||||
|
||||
// This class can be replaced or extended
|
||||
|
||||
} // End User Model
|
@@ -0,0 +1,7 @@
|
||||
<?php defined('SYSPATH') or die('No direct access allowed.');
|
||||
|
||||
class Model_User_Token extends Model_Auth_User_Token {
|
||||
|
||||
// This class can be replaced or extended
|
||||
|
||||
} // End User Token Model
|
Reference in New Issue
Block a user