root/trunk/campsite/implementation/management/classes/User.php
| Revision 4418 (by paul, 02/01/06 19:07:28) |
|---|
<?php
/**
* @package Campsite
*/
/**
* Includes
*/
// We indirectly reference the DOCUMENT_ROOT so we can enable
// scripts to use this file from the command line, $_SERVER['DOCUMENT_ROOT']
// is not defined in these cases.
if (!isset($g_documentRoot)) {
$g_documentRoot = $_SERVER['DOCUMENT_ROOT'];
}
require_once($g_documentRoot.'/db_connect.php');
require_once($g_documentRoot.'/classes/DatabaseObject.php');
require_once($g_documentRoot.'/classes/Log.php');
/**
* @package Campsite
*/
class User extends DatabaseObject {
var $m_dbTableName = 'Users';
var $m_keyColumnNames = array('Id');
var $m_keyIsAutoIncrement = true;
var $m_config = array();
var $m_columnNames = array(
'Id',
'KeyId',
'Name',
'UName',
'Password',
'EMail',
'Reader',
'City',
'StrAddress',
'State',
'CountryCode',
'Phone',
'Fax',
'Contact',
'Phone2',
'Title',
'Gender',
'Age',
'PostalCode',
'Employer',
'EmployerType',
'Position',
'Interests',
'How',
'Languages',
'Improvements',
'Pref1',
'Pref2',
'Pref3',
'Pref4',
'Field1',
'Field2',
'Field3',
'Field4',
'Field5',
'Text1',
'Text2',
'Text3',
'time_created');
var $m_defaultConfig = array(
'ManagePub'=>'N',
'DeletePub'=>'N',
'ManageIssue'=>'N',
'DeleteIssue'=>'N',
'ManageSection'=>'N',
'DeleteSection'=>'N',
'AddArticle'=>'N',
'ChangeArticle'=>'N',
'MoveArticle'=>'N',
'TranslateArticle'=>'N',
'DeleteArticle'=>'N',
'AttachImageToArticle'=>'N',
'AttachTopicToArticle'=>'N',
'AddImage'=>'N',
'ChangeImage'=>'N',
'DeleteImage'=>'N',
'ManageTempl'=>'N',
'DeleteTempl'=>'N',
'ManageUsers'=>'N',
'ManageReaders'=>'N',
'ManageSubscriptions'=>'N',
'DeleteUsers'=>'N',
'ManageUserTypes'=>'N',
'ManageArticleTypes'=>'N',
'DeleteArticleTypes'=>'N',
'ManageLanguages'=>'N',
'DeleteLanguages'=>'N',
'MailNotify'=>'N',
'ManageCountries'=>'N',
'DeleteCountries'=>'N',
'ViewLogs'=>'N',
'ManageLocalizer'=>'N',
'ManageIndexer'=>'N',
'Publish'=>'N',
'ManageTopics'=>'N',
'EditorBold'=>'N',
'EditorItalic'=>'N',
'EditorUnderline'=>'N',
'EditorUndoRedo'=>'N',
'EditorCopyCutPaste'=>'N',
'EditorFindReplace'=>'N',
'EditorCharacterMap'=>'N',
'EditorImage'=>'N',
'EditorTextAlignment'=>'N',
'EditorFontColor'=>'N',
'EditorFontSize'=>'N',
'EditorFontFace'=>'N',
'EditorTable'=>'N',
'EditorSuperscript'=>'N',
'EditorSubscript'=>'N',
'EditorStrikethrough'=>'N',
'EditorIndent'=>'N',
'EditorListBullet'=>'N',
'EditorListNumber'=>'N',
'EditorHorizontalRule'=>'N',
'EditorSourceView'=>'N',
'EditorEnlarge'=>'N',
'EditorTextDirection'=>'N',
'EditorLink'=>'N',
'EditorSubhead'=>'N',
'InitializeTemplateEngine'=>'N',
'AddFile'=>'N',
'ChangeFile'=>'N',
'DeleteFile'=>'N');
/**
* A user of the system is a frontend reader or a 'admin' user, meaning
* they have login rights to the backend.
*
* @param int $p_userId
*/
function User($p_userId = null)
{
parent::DatabaseObject($this->m_columnNames);
if (is_numeric($p_userId) && ($p_userId > 0)) {
$this->m_data['Id'] = $p_userId;
if ($this->keyValuesExist()) {
$this->fetch();
}
}
} // constructor
function create($p_values = null)
{
if (is_array($p_values)) {
$p_values['time_created'] = strftime("%Y-%m-%d %H:%M:%S", time());
}
$success = parent::create($p_values);
if ($success) {
if (function_exists("camp_load_language")) { camp_load_language("api"); }
$logtext = getGS('User account $1 created', $this->m_data['Name']." (".$this->m_data['UName'].")");
Log::Message($logtext, null, 51);
}
return $success;
} // fn create
/**
* Delete the user. This will delete all config values and subscriptions of the user.
*
* @return boolean
*/
function delete()
{
global $Campsite;
if ($this->exists()) {
parent::delete();
$Campsite['db']->Execute("DELETE FROM UserConfig WHERE fk_user_id = ".$this->m_data['Id']);
$res = $Campsite['db']->Execute("SELECT Id FROM Subscriptions WHERE IdUser = ".$this->m_data['Id']);
while ($row = $res->FetchRow()) {
$Campsite['db']->Execute("DELETE FROM SubsSections WHERE IdSubscription=".$row['Id']);
}
$Campsite['db']->Execute("DELETE FROM Subscriptions WHERE IdUser=".$this->m_data['Id']);
$Campsite['db']->Execute("DELETE FROM SubsByIP WHERE IdUser=".$this->m_data['Id']);
if (function_exists("camp_load_language")) { camp_load_language("api"); }
$logtext = getGS('The user account $1 has been deleted.', $this->m_data['Name']." (".$this->m_data['UName'].")");
Log::Message($logtext, null, 52);
}
return true;
} // fn delete
/**
* Get the user from the database.
*
* @param array $p_recordSet
*/
function fetch($p_recordSet = null)
{
global $Campsite;
$success = parent::fetch($p_recordSet);
if ($success) {
// Fetch the user's permissions.
$queryStr = 'SELECT varname, value FROM UserConfig '
.' WHERE fk_user_id='.$this->getProperty('Id');
$config = $Campsite['db']->GetAll($queryStr);
if ($config) {
// Make m_config an associative array.
foreach ($config as $value) {
$this->m_config[$value['varname']] = $value['value'];
}
}
}
} // fn fetch
/**
* Set the user to the given user type.
*
* @param string $p_userType
*
* @return void
*/
function setUserType($p_userType)
{
global $Campsite;
if (!$this->exists()) {
return;
}
// Fetch the user type's permissions.
$userType =& new UserType($p_userType);
if ($userType->exists()) {
// Drop all current user permissions.
//$queryStr = "DELETE FROM UserConfig WHERE fk_user_id=".$this->m_data['Id'];
$configVars = $userType->getConfig();
foreach ($configVars as $varname => $value) {
$queryStr = "SELECT value FROM UserConfig "
." WHERE fk_user_id=".$this->m_data['Id']
." AND varname='$varname'";
$exists = $Campsite['db']->GetOne($queryStr);
if ($exists !== false) {
if ($value != $this->m_config[$varname]) {
$queryStr = "UPDATE UserConfig SET value='$value' "
." WHERE fk_user_id=".$this->m_data['Id']
." AND varname='$varname'";
$Campsite['db']->Execute($queryStr);
}
} else {
$queryStr = "INSERT INTO UserConfig SET "
." fk_user_id=".$this->m_data['Id'].","
." varname='$varname',"
." value='$value'";
$Campsite['db']->Execute($queryStr);
}
}
$this->fetch();
if (function_exists("camp_load_language")) { camp_load_language("api"); }
$logtext = getGS('User permissions for $1 changed', $this->m_data['Name']." (".$this->m_data['UName'].")");
Log::Message($logtext, null, 55);
}
} // fn setUserType
/**
* @return int
*/
function getUserId()
{
return $this->getProperty('Id');
} // fn getUserId
/**
* Get unique login key for this user - login key is only good for the time the
* user is logged in.
* @return int
*/
function getKeyId()
{
return $this->getProperty('KeyId');
} // fn getKeyId
/**
* Get the real name of the user.
* @return string
*/
function getRealName()
{
return $this->getProperty('Name');
} // fn getRealName
/**
* Get the login name of the user.
* @return string
*/
function getUserName()
{
return $this->getProperty('UName');
} // fn getUserName
/**
* Return the value of the given variable name.
* If the variable name does not exist, return null.
*
* @param string $p_varName
* @return mixed
*/
function getConfigValue($p_varName)
{
if (isset($this->m_config[$p_varName])) {
return $this->m_config[$p_varName];
} else {
return null;
}
} // fn getConfigValue
/**
* Set the user variable to the given value.
* If the variable does not exist, it will be created.
*
* @param string $p_varName
* @param mixed $p_value
*
* @return void
*/
function setConfigValue($p_varName, $p_value)
{
global $Campsite;
if (!$this->exists() || empty($p_varName) || !is_string($p_varName)) {
return;
}
if (strtolower($p_varName) == "reader") {
// Special case for the "Reader" property.
$this->setProperty("Reader", $p_value);
} else {
if (isset($this->m_config[$p_varName])) {
if ($this->m_config[$p_varName] != $p_value) {
$sql = "UPDATE UserConfig SET value='".mysql_real_escape_string($p_value)."'"
." WHERE fk_user_id=".$this->m_data['Id']
." AND varname='".mysql_real_escape_string($p_varName)."'";
$Campsite['db']->Execute($sql);
}
} else {
$sql = "INSERT INTO UserConfig SET "
." fk_user_id=".$this->m_data['Id'].", "
." varname='".mysql_real_escape_string($p_varName)."', "
." value='".mysql_real_escape_string($p_value)."'";
$Campsite['db']->Execute($sql);
}
}
} // fn setConfigValue
/**
* Get the user config variables in the form array("varname" => "value").
*
* @return array
*/
function getConfig()
{
return $this->m_config;
} // fn getConfig
/**
* Get the default config for all users.
*
* @return array
*/
function GetDefaultConfig()
{
if (isset($this->m_defaultConfig)) {
return $this->m_defaultConfig;
} else {
$tmpUser =& new User();
return $tmpUser->m_defaultConfig;
}
} // fn GetDefaultConfig
/**
* Return true if the user has the permission specified.
*
* @param string $p_permissionString
*
* @return boolean
*/
function hasPermission($p_permissionString)
{
return (isset($this->m_config[$p_permissionString])
&& ($this->m_config[$p_permissionString] == 'Y'));
} // fn hasPermission
/**
* Set the specified permission enabled or disabled.
*
* @param string $p_permissionString
* @param boolean $p_value
*
* @return void
*/
function setPermission($p_permissionString, $p_value)
{
$p_value = $p_value ? 'Y' : 'N';
$this->setConfigValue($p_permissionString, $p_value);
} // fn setPermission
/**
* Return TRUE if this user is an administrator.
*
* @return boolean
*/
function isAdmin()
{
return ($this->getProperty('Reader') == 'N');
} // fn isAdmin
/**
* @return boolean
*/
function isValidPassword($p_password)
{
global $Campsite;
$userPasswordSQL = mysql_real_escape_string($p_password);
$queryStr = "SELECT Password, SHA1('$userPasswordSQL') AS SHA1Password,"
. " PASSWORD('$userPasswordSQL') AS OLDPassword FROM Users "
. " WHERE Id = '".mysql_real_escape_string($this->getUserId())."' ";
if (!($row = $Campsite['db']->GetRow($queryStr))) {
return false;
}
if ($row['Password'] == $row['SHA1Password'] || $row['Password'] == $row['OLDPassword']) {
return true;
}
$queryStr = "SELECT Password, OLD_PASSWORD('$userPasswordSQL') AS OLDPassword FROM Users "
. " WHERE Id = '".mysql_real_escape_string($this->getUserId())."' ";
if (!($row = $Campsite['db']->GetRow($queryStr))) {
return false;
}
if ($row['Password'] == $row['OLDPassword']) {
return true;
}
} // fn isValidPassword
/**
* @return boolean
*/
function setPassword($p_password)
{
global $Campsite;
$queryStr = "SELECT SHA1('".mysql_real_escape_string($p_password)."') AS PWD";
$row = $Campsite['db']->GetRow($queryStr);
$this->setProperty('Password', $row['PWD']);
if (function_exists("camp_load_language")) { camp_load_language("api"); }
$logtext = getGS('Password changed for $1', $this->m_data['Name']." (".$this->m_data['UName'].")");
Log::Message($logtext, null, 54);
} // fn setPassword
/**
* This is a static function. Check if the user is allowed
* to access the site.
*
* @return array
* An array of two elements:
* boolean - whether the login was successful
* object - if successful, the user object
*/
function Login($p_userName, $p_userPassword)
{
global $Campsite;
$queryStr = "SELECT * FROM Users WHERE UName='$p_userName' AND Reader='N'";
$row = $Campsite['db']->GetRow($queryStr);
if ($row) {
$user =& new User();
$user->fetch($row);
if ($user->isValidPassword($p_userPassword)) {
// Generate the Key ID
$user->setProperty('KeyId', 'RAND()*1000000000+RAND()*1000000+RAND()*1000', true, true);
return array(true, $user);
}
return array(false, null);
} else {
return array(false, null);
}
} // fn Login
/**
* Return true if the user name exists.
*
* @param string $p_userName
* @return boolean
*/
function UserNameExists($p_userName)
{
global $Campsite;
$sql = "SELECT UName FROM Users WHERE UName='".mysql_real_escape_string($p_userName)."'";
if ($Campsite['db']->GetOne($sql)) {
return true;
} else {
return false;
}
} // fn UserNameExists
} // class User
?>
Note: See TracBrowser for help on using the browser.