Source for file user.php
Documentation is available at user.php
* @package Joomla.Platform
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
* User class. Handles all application interaction with a user
* @package Joomla.Platform
* A cached switch for if this user has root access rights.
* The user's real name (or nickname)
* Clear password, only available when a new password is set for a user
* Should this user receive system email
* Date the user was registered
* Associative array of user names => group ids
* Count since last Reset Time
* Authorised access groups
* Authorised access levels
* Authorised access actions
* @var array JUser instances container.
protected static $instances =
array();
* Constructor activating the default information of the language
* @param integer $identifier The primary key of the user to load (optional).
// Create the user parameters object
// Load the user if it exists
$this->load($identifier);
* Returns the global User object, only creating it if it
* @param integer $identifier The user to load - Can be an integer or string - If string, it is converted to ID automatically.
* @return JUser The User object.
// If the $id is zero, just return an empty JUser.
// Note: don't cache this user because it'll have a new ID on save!
// Check if the user ID is already cached.
if (empty(self::$instances[$id]))
self::$instances[$id] =
$user;
return self::$instances[$id];
* Method to get a parameter value
* @param string $key Parameter key
* @param mixed $default Parameter default value
* @return mixed The value or the default if it did not exist
public function getParam($key, $default =
null)
* Method to set a parameter
* @param string $key Parameter key
* @param mixed $value Parameter value
* @return mixed Set parameter value
* Method to set a default parameter if it does not exist
* @param string $key Parameter key
* @param mixed $value Parameter value
* @return mixed Set parameter value
* Method to check JUser object authorisation against an access control
* object and optionally an access extension object
* @param string $action The name of the action to check for permission.
* @param string $assetname The name of the asset on which to perform the action.
* @return boolean True if authorised
public function authorise($action, $assetname =
null)
// Make sure we only check for core.admin once during the run.
// Check for the configuration file failsafe.
$rootUser =
$config->get('root_user');
// The root_user variable can be a numeric user ID or a username.
// Get all groups against which the user is mapped.
* Method to return a list of all categories that a user has permission for a given action
* @param string $component The component from which to retrieve the categories
* @param string $action The name of the section within the component from which to retrieve the actions.
* @return array List of categories that this group can do this action to (empty array if none). Categories must be published.
// Brute force method: get all published category rows for the component and check each one
// TODO: Modify the way permissions are stored in the db to allow for faster implementation and better scaling
$query =
$db->getQuery(true)
->select('c.id AS id, a.name AS asset_name')
->from('#__categories AS c')
->join('INNER', '#__assets AS a ON c.asset_id = a.id')
->where('c.extension = ' .
$db->quote($component))
->where('c.published = 1');
$allCategories =
$db->loadObjectList('id');
$allowedCategories =
array();
foreach ($allCategories as $category)
if ($this->authorise($action, $category->asset_name))
$allowedCategories[] = (int)
$category->id;
return $allowedCategories;
* Gets an array of the authorised access levels for the user
* Gets an array of the authorised user groups
* Pass through method to the table for setting the last visit date
* @param integer $timestamp The timestamp, defaults to 'now'.
* @return boolean True on success.
// Create the user table object
return $table->setLastVisit($timestamp);
* Method to get the user parameters
* This method used to load the user parameters from a file.
* @return object The user parameters object.
* @deprecated 12.3 (Platform) & 4.0 (CMS) - Instead use JUser::getParam()
// @codeCoverageIgnoreStart
JLog::add('JUser::getParameters() is deprecated. JUser::getParam().', JLog::WARNING, 'deprecated');
// @codeCoverageIgnoreEnd
* Method to get the user parameters
* @param object $params The user parameters object
* Method to get the user table object
* This function uses a static variable to store the table name of the user table to
* instantiate. You can call this function statically to set the table name if
* @param string $type The user table name to be used
* @param string $prefix The user table prefix to be used
* @return object The user table object
public static function getTable($type =
null, $prefix =
'JTable')
// Set the default tabletype;
$tabletype['name'] =
'user';
$tabletype['prefix'] =
'JTable';
// Set a custom table type is defined
$tabletype['name'] =
$type;
$tabletype['prefix'] =
$prefix;
// Create the user table object
* Method to bind an associative array of data to a user object
* @param array &$array The associative array to bind to the object
* @return boolean True on success
public function bind(&$array)
// The Joomla user plugin allows you to use weaker passwords if necessary.
if ($joomlaPluginEnabled)
$userPluginParams =
new JRegistry($userPlugin->params);
$defaultEncryption =
'bcrypt';
// Let's check to see if the user is new or not
// Check the password and create the crypted password
if (empty($array['password']))
$array['password2'] =
$array['password'];
// Not all controllers check the password, although they should.
// Hence this code is required:
if (isset
($array['password2']) &&
$array['password'] !=
$array['password2'])
$array['password'] =
$crypt;
// Set the registration timestamp
// Check that username is not greater than 150 characters
$username =
$this->get('username');
$username =
substr($username, 0, 150);
$this->set('username', $username);
// Use a limit to prevent abuse since it is unfiltered
// The maximum password length for bcrypt is 55 characters.
$password =
$this->get('password');
$password =
substr($password, 0, 55);
$this->set('password', $password);
// Updating an existing user
if (!empty($array['password']))
if ($array['password'] !=
$array['password2'])
$array['password'] =
$crypt .
':' .
$salt;
$params =
$array['params'];
// Make sure its an integer
$this->id = (int)
$this->id;
* Method to save the JUser object to the database
* @param boolean $updateOnly Save the object only if not a new user
* Currently only used in the user reset password method.
* @return boolean True on success
* @throws RuntimeException
public function save($updateOnly =
false)
// Create the user table object
// Allow an exception to be thrown.
// Check and store the object.
// If user is made a Super Admin group and user is NOT a Super Admin
// @todo ACL - this needs to be acl checked
// Are we creating a new user
$isNew =
empty($this->id);
// If we aren't allowed to create new users return
if ($isNew &&
$updateOnly)
// The only mandatory check is that only Super Admins can operate on other Super Admin accounts.
// To add additional business rules, use a user plugin and throw an Exception with onUserBeforeSave.
// Check if I am a Super Admin
$iAmSuperAdmin =
$my->authorise('core.admin');
$iAmRehashingSuperadmin =
false;
if (($my->id ==
0 &&
!$isNew) &&
$this->id ==
$oldUser->id &&
$oldUser->authorise('core.admin') &&
substr($oldUser->password, 0, 4) !=
'$2y$')
$iAmRehashingSuperadmin =
true;
// We are only worried about edits to this account if I am not a Super Admin.
if ($iAmSuperAdmin !=
true &&
$iAmRehashingSuperadmin !=
true)
// Check if the new user is being put into a Super Admin group.
foreach ($this->groups as $groupId)
throw
new RuntimeException('User not Super Administrator');
// I am not a Super Admin, and this one is, so fail.
throw
new RuntimeException('User not Super Administrator');
// I am not a Super Admin and I'm trying to make one.
foreach ($this->groups as $groupId)
throw
new RuntimeException('User not Super Administrator');
// Fire the onUserBeforeSave event.
$result =
$dispatcher->trigger('onUserBeforeSave', array($oldUser->getProperties(), $isNew, $this->getProperties()));
// Plugin will have to raise its own error or throw an exception.
// Store the user data in the database
$result =
$table->store();
// Set the id for the JUser object in case we created a new user.
$this->id =
$table->get('id');
if ($my->id ==
$table->id)
$registry->loadString($table->params);
$my->setParameters($registry);
// Fire the onUserAfterSave event
$dispatcher->trigger('onUserAfterSave', array($this->getProperties(), $isNew, $result, $this->getError()));
* Method to delete the JUser object from the database
* @return boolean True on success
// Trigger the onUserBeforeDelete event
$dispatcher->trigger('onUserBeforeDelete', array($this->getProperties()));
// Create the user table object
if (!$result =
$table->delete($this->id))
// Trigger the onUserAfterDelete event
* Method to load a JUser object by user id number
* @param mixed $id The user id of the user to load
* @return boolean True on success
public function load($id)
// Create the user table object
// Load the JUserModel object based on the user id or throw a warning.
* Set the user parameters using the default XML file. We might want to
* extend this in the future to allow for the ability to have custom
* user parameters, but for right now we'll leave it how it is.
// Assuming all is well at this point let's bind the data
// The user is no longer a guest
Documentation generated on Tue, 19 Nov 2013 15:16:21 +0100 by phpDocumentor 1.4.3