| Server IP : 180.180.241.3 / Your IP : 216.73.216.216 Web Server : Microsoft-IIS/7.5 System : Windows NT NETWORK-NHRC 6.1 build 7601 (Windows Server 2008 R2 Standard Edition Service Pack 1) i586 User : IUSR ( 0) PHP Version : 5.3.28 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : C:/AppServ/www/news/administrator/components/com_jfusion/models/ |
Upload File : |
<?php
/**
* Model for joomla actions
*
* PHP version 5
*
* @category JFusion
* @package Models
* @author JFusion Team <webmaster@jfusion.org>
* @copyright 2008 JFusion. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @link http://www.jfusion.org
*/
// no direct access
defined('_JEXEC') or die('Restricted access');
/**
* load the JFusion framework
*/
require_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfusion' . DS . 'models' . DS . 'model.jfusion.php';
require_once JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_jfusion' . DS . 'models' . DS . 'model.curl.php';
/**
* Common Class for Joomla JFusion plugins
*
* @category JFusion
* @package Models
* @author JFusion Team <webmaster@jfusion.org>
* @copyright 2008 JFusion. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @link http://www.jfusion.org
*/
class JFusionJplugin
{
/**
* Generates an encrypted password based on the userinfo passed to this function
*
* @param object $userinfo userdata object containing the userdata
*
* @return string Returns generated password
*/
public static function generateEncryptedPassword($userinfo)
{
jimport('joomla.user.helper');
$crypt = JUserHelper::getCryptedPassword($userinfo->password_clear, $userinfo->password_salt);
return $crypt;
}
/**
* returns the name of user table of integrated software
*
* @return string table name
*/
public static function getTablename()
{
return 'users';
}
/**
* Returns the registration URL for the integrated software
*
* @param string $jname
*
* @return string registration URL
*/
public static function getRegistrationURL($jname='joomla_int')
{
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$url = 'index.php?option=com_users&view=registration';
} else {
$url = 'index.php?option=com_user&view=register';
}
return $url;
}
/**
* Returns the lost password URL for the integrated software
*
* @param string $jname
*
* @return string lost password URL
*/
public static function getLostPasswordURL($jname='joomla_int')
{
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$url = 'index.php?option=com_users&view=reset';
} else {
$url = 'index.php?option=com_user&view=reset';
}
return $url;
}
/**
* Returns the lost username URL for the integrated software
*
* @param string $jname
*
* @return string lost username URL
*/
public static function getLostUsernameURL($jname='joomla_int')
{
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$url = 'index.php?option=com_users&view=remind';
} else {
$url = 'index.php?option=com_user&view=remind';
}
return $url;
}
/**
* Returns the a list of users of the integrated software
*
* @param string $jname jfusion plugin name
* @param int $limitstart start at
* @param int $limit number of results
*
* @return array List of usernames/emails
*/
public static function getUserList($jname,$limitstart = 0, $limit = 0)
{
$db = JFusionFactory::getDatabase($jname);
$query = 'SELECT username, email from #__users';
$db->setQuery($query,$limitstart,$limit);
$userlist = $db->loadObjectList();
return $userlist;
}
/**
* Returns the the number of users in the integrated software. Allows for fast retrieval total number of users for the usersync
*
* @param string $jname jfusion plugin name
*
* @return integer Number of registered users
*/
public static function getUserCount($jname)
{
$db = JFusionFactory::getDatabase($jname);
$query = 'SELECT count(*) from #__users';
$db->setQuery($query);
//getting the results
return $db->loadResult();
}
/**
* Returns the a list of usersgroups of the integrated software
*
* @param string $jname jfusion plugin name
*
* @return array List of usergroups
*/
public static function getUsergroupList($jname)
{
$db = JFusionFactory::getDatabase($jname);
if(JFusionFunction::isJoomlaVersion('1.6',$jname)){
$query = 'SELECT id, title as name FROM #__usergroups';
} else {
$query = 'SELECT id, name FROM #__core_acl_aro_groups WHERE name != \'ROOT\' AND name != \'USERS\'';
}
$db->setQuery($query);
//getting the results
return $db->loadObjectList();
}
/**
* Function used to display the default usergroup in the JFusion plugin overview
*
* @param string $jname jfusion plugin name
*
* @return string Default usergroup name
*/
public static function getDefaultUsergroup($jname)
{
$params = JFusionFactory::getParams($jname);
$db = JFusionFactory::getDatabase($jname);
if (JFusionFunction::isAdvancedUsergroupMode($jname)) {
$group = JText::_('ADVANCED_GROUP_MODE');
} else {
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$usergroup_id = $params->get('usergroup', 2);
//we want to output the usergroup name
$query = 'SELECT title from #__usergroups WHERE id = ' . $usergroup_id;
$db->setQuery($query);
$group = $db->loadResult();
} else {
$usergroup_id = $params->get('usergroup', 18);
//we want to output the usergroup name
$query = 'SELECT name from #__core_acl_aro_groups WHERE id = ' . $usergroup_id;
$db->setQuery($query);
$group = $db->loadResult();
}
}
return $group;
}
/**
* Function used get usergroup name by id
*
* @param string $jname jfusion plugin name
* @param int $gid joomla group id
*
* @return string Default usergroup name
*/
function getUsergroupName($jname,$gid)
{
$params = JFusionFactory::getParams($jname);
$db = JFusionFactory::getDatabase($jname);
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
//we want to output the usergroup name
$query = 'SELECT title from #__usergroups WHERE id = ' . $gid;
$db->setQuery($query);
$group = $db->loadResult();
} else {
//we want to output the usergroup name
$query = 'SELECT name from #__core_acl_aro_groups WHERE id = ' . $gid;
$db->setQuery($query);
$group = $db->loadResult();
}
return $group;
}
/**
* Checks if the software allows new users to register
*
* @param string $jname jfusion plugin name
*
* @return boolean True if new user registration is allowed, otherwise returns false
*/
public static function allowRegistration($jname)
{
if ($jname == 'joomla_int') {
$params = JComponentHelper::getParams('com_users');
} else {
$db = JFusionFactory::getDatabase($jname);
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
//we want to output the usergroup name
$query = 'SELECT params from #__extensions WHERE element = \'com_users\'';
$db->setQuery($query);
$params = $db->loadResult();
} else {
//we want to output the usergroup name
$query = 'SELECT params from #__components WHERE option = \'com_users\'';
$db->setQuery($query);
$params = $db->loadResult();
}
$params = new JParameter($params);
}
// Return true if the 'allowUserRegistration' switch is enabled in the component parameters.
return ($params->get('allowUserRegistration') ? true : false);
}
/**
* Function finds config file of integrated software and automatically configures the JFusion plugin
*
* @param string $path path to root of integrated software
*
* @return object JParam JParam objects with ne newly found configuration
* Now Joomla 1.6+ compatible
*/
public static function setupFromPath($path)
{
//check for trailing slash and generate file path
if (substr($path, -1) == DS) {
$configfile = $path . 'configuration.php';
//joomla 1.6+ test
$test_version_file = $path . 'includes' . DS . 'version.php';
} else {
$configfile = $path . DS . 'configuration.php';
$test_version_file = $path . DS . 'includes' . DS . 'version.php';
}
$params = array();
if (($file_handle = @fopen($configfile, 'r')) === false) {
JError::raiseWarning(500, JText::_('WIZARD_FAILURE') . ": $configfile " . JText::_('WIZARD_MANUAL'));
} else {
//parse the file line by line to get only the config variables
//we can not directly include the config file as JConfig is already defined
$file_handle = fopen($configfile, 'r');
$config = array();
while (!feof($file_handle)) {
$line = fgets($file_handle);
if (strpos($line, '$')) {
//extract the name and value, it was coded to avoid the use of eval() function
// because from Joomla 1.6 the configuration items are declared public in tead of var
// we just convert public to var
$line = str_replace('public $','var $',$line);
$vars = explode("'", $line);
$names = explode('var', $vars[0]);
if (isset($vars[1]) && isset($names[1])) {
$name = trim($names[1], ' $=');
$value = trim($vars[1], ' $=');
$config[$name] = $value;
}
}
}
fclose($file_handle);
//Save the parameters into the standard JFusion params format
$params['database_host'] = isset($config['host']) ? $config['host'] : '';
$params['database_name'] = isset($config['db']) ? $config['db'] : '';
$params['database_user'] = isset($config['user']) ? $config['user'] : '';
$params['database_password'] = isset($config['password']) ? $config['password'] : '';
$params['database_prefix'] = isset($config['dbprefix']) ? $config['dbprefix'] : '';
$params['database_type'] = isset($config['dbtype']) ? $config['dbtype'] : '';
$params['source_path'] = $path;
//determine if this is 1.5 or 1.6+
$params['joomlaversion'] = (file_exists($test_version_file)) ? '1.6' : '1.5';
}
return $params;
}
/**
* Common code for user.php
*
* @param object $userinfo userinfo
* @param array $options options
* @param string $jname jname
* @param string $type jname
* @param array $curl_options_merge
*
* @return string nothing
*/
public static function createSession($userinfo, $options, $jname, $type = 'brute_force',$curl_options_merge=array())
{
global $ch;
global $cookiearr;
global $cookies_to_set;
global $cookies_to_set_index;
$cookiearr = array();
$cookies_to_set = array();
$cookies = array();
$cookie = array();
$curl_options = array();
$status = array('error' => array(),'debug' => array());
$cookies_to_set_index = 0;
$params = JFusionFactory::getParams($jname);
$source_url = $params->get('source_url');
$login_url = $params->get('login_url');
//prevent user error by not supplying trailing forward slash
if (substr($source_url, -1) != '/') {
$source_url = $source_url . '/';
}
//prevent user error by preventing a heading forward slash
ltrim($login_url, '/');
$curl_options['post_url'] = $source_url . $login_url;
//set some defaults for standard Joomla login modules
if ($jname == 'joomla_ext') {
$jv = $params->get('joomlaversion', '1.5');
$default_loginform = ($jv == '1.5') ? 'form-login' : 'login-form';
} else {
$default_loginform = '';
}
$curl_options['formid'] = $params->get('loginform_id', $default_loginform);
$login_identifier = $params->get('login_identifier', '1');
$identifier = ($login_identifier === '2') ? 'email' : 'username';
$curl_options['username'] = $userinfo->$identifier;
$curl_options['password'] = $userinfo->password_clear;
$integrationtype1 = $params->get('integrationtype');
$curl_options['relpath']= $params->get('relpath');
$curl_options['hidden'] = $params->get('hidden');
$curl_options['buttons'] = $params->get('buttons');
$curl_options['override'] = $params->get('override');
$curl_options['cookiedomain'] = $params->get('cookie_domain');
$curl_options['cookiepath'] = $params->get('cookie_path');
$curl_options['expires'] = $params->get('cookie_expires');
$curl_options['input_username_id'] = $params->get('input_username_id');
$curl_options['input_password_id'] = $params->get('input_password_id');
$curl_options['secure'] = $params->get('secure');
$curl_options['httponly'] = $params->get('httponly');
$curl_options['verifyhost'] = 0; //$params->get('ssl_verifyhost');
$curl_options['httpauth'] = $params->get('httpauth');
$curl_options['httpauth_username'] = $params->get('curl_username');
$curl_options['httpauth_password'] = $params->get('curl_password');
// to prevent endless loops on systems where there are multiple places where a user can login
// we post an unique ID for the initiating software so we can make a difference between
// a user logging in or another jFusion installation, or even another system with reverse dual login code.
// We always use the source url of the initializing system, here the source_url as defined in the joomla_int
// plugin. This is totally transparent for the the webmaster. No additional setup is needed
$my_ID = rtrim(parse_url(JURI::root(), PHP_URL_HOST).parse_url(JURI::root(), PHP_URL_PATH), '/');
$curl_options['jnodeid'] = strtolower($my_ID);
// For further simplifying setup we send also an indication if this system is a host. Other hosts should
// only perform local joomla login when received this post. We define being a host if we have
// at least one slave.
$plugins = JFusionFactory::getPlugins('slave');
if (count($plugins) > 2 ) {
$jhost = true;
} else {
$jhost = false;
}
if ($jhost) {
$curl_options['jhost'] = true;
}
if (!empty($curl_options_merge)) {
$curl_options = array_merge($curl_options,$curl_options_merge);
}
// This check is just for Jfusion 1.x to support the reverse dual login function
// We need to check if JFusion tries to create this session because of this integration
// initiated a login by means of the reverse dual login extensions. Note that
// if the curl routines are not used, the same check must be performed in the
// create session routine in the user.php file of the plugin concerned.
// In version 2.0 we will never reach this point as the user plugin will handle this
$jnodeid = strtolower(JRequest::getVar('jnodeid'));
if (!empty($jnodeid)){
if($jnodeid == JFusionFactory::getPluginNodeId($jname)) {
// do not create a session, this integration started the log in and the user is already logged in
$status['debug'][]=JText::_('ALREADY_LOGGED_IN');
return $status;
}
}
// correction of the integration type for Joomla Joomla using a sessionid in the logout form
// for joomla 1.5 we need integration type 1 for login (LI) and 0 for logout (LO)
// this is backward compatible
// joomla 1.5 : use 3
// joomla 1.6+ : use 1
switch ($integrationtype1) {
case "0": // LI = 0 LO = 0
case "2": // LI = 0, LO = 1
$integrationtype = 0;
break;
case "1": // LI = 1 LO = 1
case "3": // LI = 1, LO = 0
default:
$integrationtype = 1;
break;
}
$curl_options['integrationtype'] = $integrationtype;
// extra lines for passing curl options to other routines, like ambrasubs payment processor
// we are using the super global $_SESSION to pass data in $_SESSION[$var]
$var = 'curl_options';
if(!array_key_exists($var,$_SESSION)) $_SESSION[$var]='';
$_SESSION[$var]=$curl_options;
$GLOBALS[$var]=&$_SESSION[$var];
// end extra lines
$type = strtolower($type);
switch ($type) {
case "url":
// $status = JFusionCurl::RemoteLoginUrl($curl_options);
$status['error'][]=JText::_('CURL_LOGINTYPE_NOT_SUPPORTED');
break;
case "brute_force":
$curl_options['brute_force'] = $type;
$status = JFusionCurl::RemoteLogin($curl_options);
break;
default:
$status = JFusionCurl::RemoteLogin($curl_options);
}
$status['debug'][]=JText::_('CURL_LOGINTYPE').'='.$type;
return $status;
}
/**
* Function that automatically logs out the user from the integrated software
*
* @param object $userinfo contains the userinfo
* @param array $options contains Array with the login options, such as remember_me
* @param string $jname jname
* @param string $type method of destruction
* @param array $curl_options_merge
*
* @return array result Array containing the result of the session destroy
*/
public static function destroySession($userinfo, $options, $jname, $type = 'brute_force',$curl_options_merge=array())
{
global $ch;
global $cookiearr;
global $cookies_to_set;
global $cookies_to_set_index;
$cookiearr = array();
$cookies_to_set = array();
$cookies = array();
$cookie = array();
$curl_options = array();
$status = array('error' => array(),'debug' => array());
$cookies_to_set_index = 0;
$params = JFusionFactory::getParams($jname);
$source_url = $params->get('source_url');
$logout_url = $params->get('logout_url');
//prevent user error by not supplying trailing forward slash
if (substr($source_url, -1) != '/') {
$source_url = $source_url . '/';
}
//prevent user error by preventing a heading forward slash
ltrim($logout_url, '/');
$curl_options['post_url'] = $source_url . $logout_url;
//set some defaults for standard Joomla login modules
if ($jname == 'joomla_ext') {
$jv = $params->get('joomlaversion', '1.5');
$default_loginform = ($jv == '1.5') ? 'form-login' : 'login-form';
} else {
$default_loginform = '';
}
$curl_options['formid'] = $params->get('loginform_id', $default_loginform);
$curl_options['username'] = $userinfo->username;
// $curl_options['password'] = $userinfo->password_clear;
$integrationtype1 = $params->get('integrationtype');
$curl_options['relpath'] = $params->get('relpathl',$params->get('relpath',0));
$curl_options['hidden'] = '1';
$curl_options['buttons'] = '1';
$curl_options['override'] = '';
$curl_options['cookiedomain'] = $params->get('cookie_domain');
$curl_options['cookiepath'] = $params->get('cookie_path');
$curl_options['expires'] = time() - 30*60*60;
$curl_options['input_username_id'] = $params->get('input_username_id');
$curl_options['input_password_id'] = $params->get('input_password_id');
$curl_options['secure'] = $params->get('secure');
$curl_options['httponly'] = $params->get('httponly');
$curl_options['verifyhost'] = 0; //$params->get('ssl_verifyhost');
$curl_options['httpauth'] = $params->get('httpauth');
$curl_options['httpauth_username'] = $params->get('curl_username');
$curl_options['httpauth_password'] = $params->get('curl_password');
$curl_options['leavealone'] = $params->get('leavealone');
$curl_options['postfields'] = $params->get('postfields',"");
$curl_options['logout'] = '1';
// to prevent endless loops on systems where there are multiple places where a user can login
// we post an unique ID for the initiating software so we can make a difference between
// a user logging in or another jFusion installation, or even another system with reverse dual login code.
// We always use the source url of the initializing system, here the source_url as defined in the joomla_int
// plugin. This is totally transparent for the the webmaster. No additional setup is needed
$my_ID = rtrim(parse_url(JURI::root(), PHP_URL_HOST).parse_url(JURI::root(), PHP_URL_PATH), '/');
$curl_options['jnodeid'] = strtolower($my_ID);
// For further simplifying setup we send also an indication if this system is a host. Other hosts should
// only perform local joomla login when received this post. We define being a host if we have
// at least one slave.
$plugins = JFusionFactory::getPlugins('slave');
if (count($plugins) > 2 ) {
$jhost = true;
} else {
$jhost = false;
}
if ($jhost) {
$curl_options['jhost'] = true;
}
if (!empty($curl_options_merge)) {
$curl_options = array_merge($curl_options,$curl_options_merge);
}
// This check is just for Jfusion 1.x to support the reverse dual login function
// We need to check if JFusion tries to delete this session because of this integration
// initiated a logout by means of the reverse dual login extensions. Note that
// if the curl routines are not used, the same check must be performed in the
// destroysession routine in the user.php file of the plugin concerned.
// In version 2.0 we will never reach this point as the user plugin will handle this
$jnodeid = strtolower(JRequest::getVar('jnodeid'));
if (!empty($jnodeid)){
if($jnodeid == JFusionFactory::getPluginNodeId($jname)) {
// do not delete a session, this integration started the log out and the user is already logged out
$status['debug'][]=JText::_('ALREADY_LOGGED_OUT');
return $status;
}
}
// correction of the integration type for Joomla Joomla using a sessionid in the logout form
// for joomla 1.5 we need integration type 1 for login (LI) and 0 for logout (LO)
// this is backward compatible
// joomla 1.5 : use 3
// joomla 1.6+ : use 1
switch ($integrationtype1) {
case "0": // LI = 0 LO = 0
case "3": // LI = 1, LO = 0
$integrationtype = 0;
break;
case "1": // LI = 1 LO = 1
case "2": // LI = 0, LO = 1
default:
$integrationtype = 1;
break;
}
$curl_options['integrationtype'] = $integrationtype;
$type = strtolower($type);
switch ($type) {
case "url":
$status = JFusionCurl::RemoteLogoutUrl($curl_options);
break;
case "form":
$status = JFusionCurl::RemoteLogin($curl_options);
break;
case "brute_force":
default:
$status = JFusionCurl::RemoteLogout($curl_options);
}
$status['debug'][]=JText::_('CURL_LOGOUTTYPE').'='.$type;
return $status;
}
/**
* gets the userinfo from the JFusion integrated software. Definition of object:
*
* @param object $userinfo contains the object of the user
* @param string $jname jname
*
* @return null|object userinfo Object containing the user information
*/
public static function getUser($userinfo, $jname)
{
$db = JFusionFactory::getDatabase($jname);
$JFusionUser = JFusionFactory::getUser($jname);
list($identifier_type, $identifier) = $JFusionUser->getUserIdentifier($userinfo, 'username', 'email');
if ($jname == 'joomla_int' && $identifier_type == 'username') {
$params = JFusionFactory::getParams($jname);
if ($params->get('case_insensitive')) {
$where = 'LOWER(a.' . $identifier_type . ') = ' . $db->Quote(strtolower($identifier));
} else {
$where = 'a.' . $identifier_type . ' = ' . $db->Quote($identifier);
}
//first check the JFusion user table if the identifier_type = username
if(JFusionFunction::isJoomlaVersion('1.6',$jname)){
$db->setQuery('SELECT b.id as userid, b.activation, a.username, b.name, b.password, b.email, b.block, b.params FROM #__users as b INNER JOIN #__jfusion_users as a ON a.id = b.id WHERE ' . $where);
} else {
$db->setQuery('SELECT b.id as userid, b.activation, a.username, b.name, b.password, b.email, b.block, b.usertype as group_name, b.gid as group_id, b.params FROM #__users as b INNER JOIN #__jfusion_users as a ON a.id = b.id WHERE ' . $where);
}
$result = $db->loadObject();
if (!$result) {
if ($params->get('case_insensitive')) {
$where = 'LOWER(' . $identifier_type . ') = ' . $db->Quote(strtolower($identifier));
} else {
$where = $identifier_type . ' = ' . $db->Quote($identifier);
}
//check directly in the joomla user table
if(JFusionFunction::isJoomlaVersion('1.6',$jname)){
$db->setQuery('SELECT id as userid, activation, username, name, password, email, block, params FROM #__users WHERE ' . $where);
} else {
$db->setQuery('SELECT id as userid, activation, username, name, password, email, block, usertype as group_name, gid as group_id, params FROM #__users WHERE ' . $where);
}
$result = $db->loadObject();
if ($result) {
//update the lookup table so that we don't have to do a double query next time
$query = 'REPLACE INTO #__jfusion_users (id, username) VALUES (' . $result->userid . ', ' . $db->Quote($identifier) . ')';
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
}
}
} else {
if(JFusionFunction::isJoomlaVersion('1.6',$jname)){
$db->setQuery('SELECT id as userid, activation, username, name, password, email, block, params FROM #__users WHERE ' . $identifier_type . ' = ' . $db->Quote($identifier));
} else {
$db->setQuery('SELECT id as userid, activation, username, name, password, email, block, usertype as group_name, gid as group_id, params FROM #__users WHERE ' . $identifier_type . ' = ' . $db->Quote($identifier));
}
$result = $db->loadObject();
}
if ($result) {
if(JFusionFunction::isJoomlaVersion('1.6',$jname)){
$query = 'SELECT a.group_id, b.title as name FROM #__user_usergroup_map as a INNER JOIN #__usergroups as b ON a.group_id = b.id WHERE a.user_id='.$db->Quote($result->userid);
$db->setQuery($query);
$groupList = $db->loadObjectList();
if ($groupList) {
foreach ($groupList as $group) {
$result->groups[] = $group->group_id;
$result->groupnames[] = $group->name;
if ( !isset($result->group_id) || $group->group_id > $result->group_id) {
$result->group_id = $group->group_id;
$result->group_name = $group->name;
}
}
} else {
$result->groups = array();
$result->groupnames = array();
}
}
//split up the password if it contains a salt
//note we cannot use explode as a salt from another software may contain a colon which messes Joomla up
if (strpos($result->password, ':') !== false) {
$saltStart = strpos($result->password, ':');
$result->password_salt = substr($result->password, $saltStart + 1);
$result->password = substr($result->password, 0, $saltStart);
} else {
//prevent php notices
$result->password_salt = '';
}
// Get the language of the user and store it as variable in the user object
$user_params = new JParameter($result->params);
$JLang = JFactory::getLanguage();
$result->language = $user_params->get('language', $JLang->getTag());
unset($JLang);
//unset the activation status if not blocked
if ($result->block == 0) {
$result->activation = '';
}
//unset the block if user is inactive
if (!empty($result->block) && !empty($result->activation)) {
$result->block = 0;
}
//check to see if CB is installed and activated and if so update the activation and ban accordingly
if(JFusionFunction::isJoomlaVersion('1.6',$jname)){
$query = 'SELECT enabled FROM #__extensions WHERE name LIKE \'%com_comprofiler%\'';
} else {
$query = 'SELECT enabled FROM #__components WHERE link LIKE \'%option=com_comprofiler%\'';
}
$db->setQuery($query);
$cbenabled = $db->loadResult();
if (!empty($cbenabled)) {
$query = 'SELECT confirmed, approved, cbactivation FROM #__comprofiler WHERE user_id = '.$result->userid;
$db->setQuery($query);
$cbresult = $db->loadObject();
if (!empty($cbresult)) {
if (empty($cbresult->confirmed) && !empty($cbresult->cbactivation)) {
$result->activation = $cbresult->cbactivation;
$result->block = 0;
} elseif (empty($cbresult->confirmed) || empty($cbresult->approved)) {
$result->block = 1;
}
}
}
}
return $result;
}
/**
* Function that updates the user email
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function updateEmail($userinfo, &$existinguser, &$status, $jname)
{
$db = JFusionFactory::getDatabase($jname);
$query = 'UPDATE #__users SET email =' . $db->Quote($userinfo->email) . ' WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('EMAIL_UPDATE_ERROR') . $db->stderr();
} else {
$status['debug'][] = JText::_('EMAIL_UPDATE') . ': ' . $existinguser->email . ' -> ' . $userinfo->email;
}
}
/**
* Function that updates the user password
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function updatePassword($userinfo, &$existinguser, &$status, $jname)
{
$db = JFusionFactory::getDatabase($jname);
jimport( 'joomla.user.helper' );
$userinfo->password_salt = JUserHelper::genRandomPassword(32);
$userinfo->password = JUserHelper::getCryptedPassword($userinfo->password_clear, $userinfo->password_salt);
$new_password = $userinfo->password . ':' . $userinfo->password_salt;
$query = 'UPDATE #__users SET password =' . $db->Quote($new_password) . ' WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('PASSWORD_UPDATE_ERROR') . $db->stderr();
} else {
$status['debug'][] = JText::_('PASSWORD_UPDATE') . ' ' . substr($existinguser->password, 0, 6) . '********';
}
}
/**
* Function that blocks user
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function blockUser($userinfo, &$existinguser, &$status, $jname)
{
//do not block super administrators
if ($existinguser->group_id != 25) {
//block the user
$db = JFusionFactory::getDatabase($jname);
$query = 'UPDATE #__users SET block = 1 WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('BLOCK_UPDATE_ERROR') . $db->stderr();
} else {
$status['debug'][] = JText::_('BLOCK_UPDATE') . ': ' . $existinguser->block . ' -> ' . $userinfo->block;
}
} else {
$status['debug'][] = JText::_('BLOCK_UPDATE_ERROR') . ': ' . JText::_('CANNOT_BLOCK_SUPERADMINS');
}
}
/**
* Function that unblocks user
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function unblockUser($userinfo, &$existinguser, &$status, $jname)
{
//unblock the user
$db = JFusionFactory::getDatabase($jname);
$query = 'UPDATE #__users SET block = 0 WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('BLOCK_UPDATE_ERROR') . $db->stderr();
} else {
$status['debug'][] = JText::_('BLOCK_UPDATE') . ': ' . $existinguser->block . ' -> ' . $userinfo->block;
}
}
/**
* Function that activates user
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function activateUser($userinfo, &$existinguser, &$status, $jname)
{
//unblock the user
$db = JFusionFactory::getDatabase($jname);
$query = 'UPDATE #__users SET block = 0, activation = \'\' WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('ACTIVATION_UPDATE_ERROR') . $db->stderr();
} else {
$status['debug'][] = JText::_('ACTIVATION_UPDATE') . ': ' . $existinguser->activation . ' -> ' . $userinfo->activation;
}
}
/**
* Function that inactivates user
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function inactivateUser($userinfo, &$existinguser, &$status, $jname)
{
if ($existinguser->group_id != 25) {
//unblock the user
$db = JFusionFactory::getDatabase($jname);
$query = 'UPDATE #__users SET block = 1, activation = ' . $db->Quote($userinfo->activation) . ' WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('ACTIVATION_UPDATE_ERROR') . $db->stderr();
} else {
$status['debug'][] = JText::_('ACTIVATION_UPDATE') . ': ' . $existinguser->activation . ' -> ' . $userinfo->activation;
}
} else {
$status['debug'][] = JText::_('ACTIVATION_UPDATE_ERROR') . ': ' . JText::_('CANNOT_INACTIVATE_SUPERADMINS');
}
}
/**
* filters the username to remove invalid characters
*
* @param string $username contains username
* @param string $jname contains name of plugin
*
* @return string filtered username
*/
public static function filterUsername($username, $jname)
{
//check to see if additional username filtering need to be applied
$params = JFusionFactory::getParams($jname);
$added_filter = $params->get('username_filter');
if ($added_filter && $added_filter != $jname) {
$JFusionPlugin = JFusionFactory::getUser($added_filter);
if (method_exists($JFusionPlugin, 'filterUsername')) {
$filteredUsername = $JFusionPlugin->filterUsername($username);
}
}
//make sure the filtered username isn't empty
$username = (!empty($filteredUsername)) ? $filteredUsername : $username;
//define which characters which Joomla forbids in usernames
$trans = array('<' => '_', '<' => '_', '>' => '_', '>' => '_', '"' => '_', '"' => '_', ''' => '_', '%' => '_', ';' => '_', '(' => '_', ')' => '_', '&' => '_', '&' => '_', '<' => '_', '>' => '_', '"' => '_', '\'' => '_', '%' => '_', ';' => '_', '(' => '_', ')' => '_', '&' => '_');
//remove forbidden characters for the username
$username = strtr($username, $trans);
//make sure the username is at least 2 characters long
while (strlen($username) < 2) {
$username.= '_';
}
return $username;
}
/**
* Function that updates username
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function updateUsername($userinfo, &$existinguser, &$status, $jname)
{
//generate the filtered integration username
$db = JFusionFactory::getDatabase($jname);
$username_clean = JFusionJplugin::filterUsername($userinfo->username, $jname);
$status['debug'][] = JText::_('USERNAME') . ': ' . $userinfo->username . ' -> ' . JText::_('FILTERED_USERNAME') . ':' . $username_clean;
$query = 'UPDATE #__users SET username =' . $db->Quote($username_clean) . 'WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
//update failed, return error
$status['error'][] = JText::_('USERNAME_UPDATE_ERROR') . ': ' . $db->stderr();
} else {
$status['debug'][] = JText::_('USERNAME_UPDATE') . ': ' . $username_clean;
}
if ($jname == 'joomla_int') {
//update the lookup table
$query = 'REPLACE INTO #__jfusion_users (id, username) VALUES (' . $existinguser->userid . ', ' . $db->Quote($userinfo->username) . ')';
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('USERNAME_UPDATE_ERROR') . ': ' . $db->stderr();
} else {
$status['debug'][] = JText::_('USERNAME_UPDATE') . ': ' . $username_clean;
}
}
}
/**
* Function that creates a new user account
*
* @param object $userinfo Object containing the new userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
*
* @return string updates are passed on into the $status array
*/
public static function createUser($userinfo, &$status, $jname)
{
$usergroups = JFusionFunction::getCorrectUserGroups($jname,$userinfo);
//get the default user group and determine if we are using simple or advanced
//check to make sure that if using the advanced group mode, $userinfo->group_id exists
if (empty($usergroups)) {
$status['error'][] = JText::_('ERROR_CREATE_USER') . ' ' . JText::_('USERGROUP_MISSING');
} else {
//load the database
$db = JFusionFactory::getDatabase($jname);
//joomla does not allow duplicate email addresses, check to see if the email is unique
$query = 'SELECT id as userid, username, email from #__users WHERE email =' . $db->Quote($userinfo->email);
$db->setQuery($query);
$existinguser = $db->loadObject();
if (empty($existinguser)) {
//apply username filtering
$username_clean = JFusionJplugin::filterUsername($userinfo->username, $jname);
//now we need to make sure the username is unique in Joomla
$db->setQuery('SELECT id FROM #__users WHERE username=' . $db->Quote($username_clean));
while ($db->loadResult()) {
$username_clean.= '_';
$db->setQuery('SELECT id FROM #__users WHERE username=' . $db->Quote($username_clean));
}
$status['debug'][] = JText::_('USERNAME') . ':' . $userinfo->username . ' ' . JText::_('FILTERED_USERNAME') . ':' . $username_clean;
//create a Joomla password hash if password_clear is available
if (!empty($userinfo->password_clear)) {
jimport( 'joomla.user.helper' );
$userinfo->password_salt = JUserHelper::genRandomPassword(32);
$userinfo->password = JUserHelper::getCryptedPassword($userinfo->password_clear, $userinfo->password_salt);
$password = $userinfo->password . ':' . $userinfo->password_salt;
} else {
//if password_clear is not available, store hashed password as is and also store the salt if present
if (isset($userinfo->password_salt)) {
$password = $userinfo->password . ':' . $userinfo->password_salt;
} else {
$password = $userinfo->password;
}
}
$instance = new JUser();
$instance->set('name', $userinfo->name);
$instance->set('username', $username_clean);
$instance->set('password', $password);
$instance->set('email', $userinfo->email);
$instance->set('block', $userinfo->block);
$instance->set('activation', $userinfo->activation);
$instance->set('sendEmail', 0);
//find out what usergroup the new user should have
//the $userinfo object was probably reconstructed in the user plugin and autoregister = 1
$isadmin = false;
if (isset($usergroups[0])) {
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$isadmin = (in_array ( 7 , $usergroups,true ) || in_array ( 8 , $usergroups,true )) ? true : false;
} else {
$isadmin = ($usergroups[0] == 24 || $usergroups[0] == 25) ? true : false;
}
} else {
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$usergroups = array(2);
} else {
$usergroups = array(18);
}
}
//work around the issue where joomla will not allow the creation of an admin or super admin if the logged in user is not a super admin
if ($isadmin && $jname == 'joomla_int') {
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$usergroups = array(2);
} else {
$usergroups = array(18);
}
}
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
$instance->set('usertype', 'deprecated');
$instance->set('groups', $usergroups);
} else {
$usergroup = JFusionJplugin::getUsergroupName($jname,$usergroups[0]);
$instance->set('usertype', $usergroup);
$instance->set('gid', $usergroups[0]);
}
if ($jname == 'joomla_int') {
//store the username passed into this to prevent the user plugin from attempting to recreate users
$instance->set('original_username', $userinfo->username);
// save the user
if (!$instance->save(false)) {
//report the error
$status['error'] = $instance->getError();
return $status;
} else {
$createdUser = $instance->getProperties();
$createdUser = (object)$createdUser;
//update the user's group to the correct group if they are an admin
if ($isadmin) {
$createdUser->userid = $createdUser->id;
JFusionJplugin::updateUsergroup($userinfo, $createdUser, $status, $jname, false);
}
//create a new entry in the lookup table
//if the credentialed username is available (from the auth plugin), store it; otherwise store the $userinfo username
$username = (!empty($userinfo->credentialed_username)) ? $userinfo->credentialed_username : $userinfo->username;
$query = 'REPLACE INTO #__jfusion_users (id, username) VALUES (' . $createdUser->id . ', ' . $db->Quote($username) . ')';
$db->setQuery($query);
if (!$db->query()) {
JError::raiseWarning(0, $db->stderr());
}
}
} else {
// joomla_ext
// convert the Joomla userobject to a std object
$user = $instance->getProperties();
// get rid of internal properties
unset($user['password_clear']);
unset($user['aid']);
unset($user['guest']);
// set the creation time and last access time
$user['registerDate'] = date('Y-m-d H:i:s', time());
$user = (object)$user;
$user->id = null;
if (!$db->insertObject('#__users', $user, 'id')) {
//return the error
$status['error'][] = JText::_('USER_CREATION_ERROR') . $db->stderr();
return $status;
}
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
foreach ($usergroups as $group) {
$query = 'INSERT INTO #__user_usergroup_map (group_id,user_id) VALUES (' . $group . ',' . $user->id . ')';
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('USER_CREATION_ERROR') . $db->stderr();
}
}
} else {
//add the user to the core_acl_aro
$acl = array();
$acl['section_value'] = 'users';
$acl['value'] = $user->id;
$acl['order_value'] = 0;
$acl['name'] = $userinfo->name;
$acl['hidden'] = 0;
$acl = (object)$acl;
$acl->id = null;
if (!$db->insertObject('#__core_acl_aro', $acl, 'id')) {
//return the error
$status['error'][] = JText::_('USER_CREATION_ERROR') . $db->stderr();
return $status;
}
// and finally add the user to the core_acl_groups_aro_map
$query = 'INSERT INTO #__core_acl_groups_aro_map (group_id, aro_id) VALUES (' . $usergroups[0] . ',' . $acl->id . ')';
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('USER_CREATION_ERROR') . $db->stderr();
return $status;
}
}
}
//check to see if the user exists now
$joomla_user = JFusionJplugin::getUser($userinfo, $jname);
if ($joomla_user) {
//report back success
$status['userinfo'] = $joomla_user;
$status['debug'][] = JText::_('USER_CREATION');
} else {
$status['error'] = JText::_('COULD_NOT_CREATE_USER');
}
} else {
//Joomla does not allow duplicate emails report error
$status['debug'][] = JText::_('USERNAME') . ' ' . JText::_('CONFLICT') . ': ' . $existinguser->username . ' -> ' . $userinfo->username;
$status['error'] = JText::_('EMAIL_CONFLICT') . '. UserID: ' . $existinguser->userid . ' JFusionPlugin: ' . $jname;
$status['userinfo'] = $existinguser;
}
}
return $status;
}
/**
* Updates or creates a user for the integrated software. This allows JFusion to have external software as slave for user management
*
* @param object $userinfo contains the userinfo
* @param int $overwrite determines if the userinfo can be overwritten
* @param string $jname jname
*
* @return array result Array containing the result of the user update
*/
public static function updateUser($userinfo, $overwrite, $jname)
{
// Initialise some variables
$params = JFusionFactory::getParams($jname);
$db = JFusionFactory::getDatabase($jname);
$update_block = $params->get('update_block');
$update_activation = $params->get('update_activation');
$update_email = $params->get('update_email');
$status = array('error' => array(),'debug' => array());
//check to see if a valid $userinfo object was passed on
if (!is_object($userinfo)) {
$status['error'][] = JText::_('NO_USER_DATA_FOUND');
} else {
//check to see if user exists
$existinguser = JFusionJplugin::getUser($userinfo, $jname);
if (!empty($existinguser)) {
$changed = false;
//a matching user has been found
$status['debug'][] = JText::_('USER_DATA_FOUND');
// email update?
if (strtolower($existinguser->email) != strtolower($userinfo->email)) {
$status['debug'][] = JText::_('EMAIL_CONFLICT');
if ($update_email || $overwrite) {
$status['debug'][] = JText::_('EMAIL_CONFLICT_OVERWITE_ENABLED');
JFusionJplugin::updateEmail($userinfo, $existinguser, $status, $jname);
$changed = true;
} else {
//return a email conflict
$status['debug'][] = JText::_('EMAIL_CONFLICT_OVERWITE_DISABLED');
$status['error'][] = JText::_('EMAIL') . ' ' . JText::_('CONFLICT') . ': ' . $existinguser->email . ' -> ' . $userinfo->email;
$status['userinfo'] = $existinguser;
return $status;
}
}
// password update ?
if (!empty($userinfo->password_clear) && strlen($userinfo->password_clear) != 32) {
//if not salt set, update the password
$existinguser->password_clear = $userinfo->password_clear;
//check if the password needs to be updated
$model = JFusionFactory::getAuth($jname);
$testcrypt = $model->generateEncryptedPassword($existinguser);
//if the passwords are not the same or if Joomla salt has inherited a colon which will confuse Joomla without JFusion; generate a new password hash
if ($testcrypt != $existinguser->password || strpos($existinguser->password_salt, ':') !== false) {
JFusionJplugin::updatePassword($userinfo, $existinguser, $status, $jname);
$changed = true;
} else {
$status['debug'][] = JText::_('SKIPPED_PASSWORD_UPDATE') . ': ' . JText::_('PASSWORD_VALID');
}
} else {
$status['debug'][] = JText::_('SKIPPED_PASSWORD_UPDATE') . ': ' . JText::_('PASSWORD_UNAVAILABLE');
}
//block status update?
if ($existinguser->block != $userinfo->block) {
if ($update_block || $overwrite) {
if ($userinfo->block) {
//block the user
JFusionJplugin::blockUser($userinfo, $existinguser, $status, $jname);
$changed = true;
} else {
//unblock the user
JFusionJplugin::unblockUser($userinfo, $existinguser, $status, $jname);
$changed = true;
}
} else {
//return a debug to inform we skipped this step
$status['debug'][] = JText::_('SKIPPED_BLOCK_UPDATE') . ': ' . $existinguser->block . ' -> ' . $userinfo->block;
}
}
//activation status update?
if ($existinguser->activation != $userinfo->activation) {
if ($update_activation || $overwrite) {
if ($userinfo->activation) {
//inactive the user
JFusionJplugin::inactivateUser($userinfo, $existinguser, $status, $jname);
$changed = true;
} else {
//activate the user
JFusionJplugin::activateUser($userinfo, $existinguser, $status, $jname);
$changed = true;
}
} else {
//return a debug to inform we skipped this step
$status['debug'][] = JText::_('SKIPPED_EMAIL_UPDATE') . ': ' . $existinguser->email . ' -> ' . $userinfo->email;
}
}
//check for advanced usergroup sync
$master = JFusionFunction::getMaster();
if (!$userinfo->block && empty($userinfo->activation) && $master->name != $jname) {
if (JFusionFunction::isAdvancedUsergroupMode($jname)) {
$usergroups = JFusionFunction::getCorrectUserGroups($jname,$userinfo);
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
if (!JFusionFunction::compareUserGroups($existinguser,$usergroups)) {
JFusionJplugin::updateUsergroup($userinfo, $existinguser, $status, $jname);
$changed = true;
} else {
$status['debug'][] = JText::_('SKIPPED_GROUP_UPDATE') . ':' . JText::_('GROUP_VALID');
}
} else if (isset($usergroups[0])) {
$correct_usergroup = $usergroups[0];
//make sure that ACL has not been corrupted
$correct_groupname = JFusionJplugin::getUsergroupName($jname,$correct_usergroup);
$query = 'SELECT group_id FROM #__core_acl_aro as a INNER JOIN #__core_acl_groupsaro__map as b ON a.id = b.aro_id WHERE a.value = ' . $existinguser->userid;
$db->setQuery($query);
$acl_group_id = $db->loadResult();
if ($correct_usergroup != $existinguser->group_id || $correct_groupname != $existinguser->group_name || $correct_usergroup != $acl_group_id) {
JFusionJplugin::updateUsergroup($userinfo, $existinguser, $status, $jname);
$changed = true;
} else {
$status['debug'][] = JText::_('SKIPPED_GROUP_UPDATE') . ':' . JText::_('GROUP_VALID');
}
}
}
}
//Update the user language in the one existing from an other plugin
if (!empty($userinfo->language) && !empty($existinguser->language) && $userinfo->language != $existinguser->language) {
JFusionJplugin::updateUserLanguage($userinfo, $existinguser, $status, $jname);
$existinguser->language = $userinfo->language;
$changed = true;
} else {
//return a debug to inform we skipped this step
$status['debug'][] = JText::_('LANGUAGE_NOT_UPDATED');
}
if (empty($status['error'])) {
if ($changed == true) {
$status['action'] = 'updated';
$status['userinfo'] = JFusionJplugin::getUser($userinfo, $jname);
} else {
$status['action'] = 'unchanged';
$status['userinfo'] = $existinguser;
}
}
} else {
$status['debug'][] = JText::_('NO_USER_FOUND_CREATING_ONE');
JFusionJplugin::createUser($userinfo, $status, $jname);
if (empty($status['error'])) {
$status['action'] = 'created';
}
}
}
return $status;
}
/**
* Function that updates usergroup
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname jname
* @param bool $fire_user_plugins needs more detail
*
* @return string updates are passed on into the $status array
*/
public static function updateUsergroup($userinfo, &$existinguser, &$status, $jname, $fire_user_plugins = true)
{
$usergroups = JFusionFunction::getCorrectUserGroups($jname,$userinfo);
//make sure the group exists
if (empty($usergroups)) {
$status['error'][] = JText::_('GROUP_UPDATE_ERROR') . ': ' . JText::_('ADVANCED_GROUPMODE_MASTERGROUP_NOTEXIST');
} else {
$db = JFusionFactory::getDatabase($jname);
$params = JFusionFactory::getParams($jname);
$dispatcher = JDispatcher::getInstance();
//Fire the user plugin functions for joomla_int
if ($jname == 'joomla_int' && $fire_user_plugins) {
// Get the old user
$old = new JUser($existinguser->userid);
//Fire the onBeforeStoreUser event.
JPluginHelper::importPlugin('user');
$dispatcher->trigger('onBeforeStoreUser', array($old->getProperties(), false));
}
if(JFusionFunction::isJoomlaVersion('1.6',$jname)) {
jimport('joomla.user.helper');
$query = 'DELETE FROM #__user_usergroup_map WHERE user_id = ' . $db->Quote($existinguser->userid);
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('GROUP_UPDATE_ERROR') . ': ' . $db->stderr();
} else {
foreach ($usergroups as $key => $group) {
$temp = new stdClass;
$temp->user_id = $existinguser->userid;
$temp->group_id = $group;
if (!$db->insertObject('#__user_usergroup_map', $temp)) {
//return the error
$status['error'] = JText::_('USER_CREATION_ERROR') . ': ' . $db->stderr();
return $status;
}
}
$status['debug'][] = JText::_('GROUP_UPDATE') . ': ' . implode(',', $existinguser->groups) . ' -> ' .implode(',', $usergroups);
//Fire the user plugin functions for joomla_int
if ($jname == 'joomla_int' && $fire_user_plugins) {
//Fire the onAfterStoreUser event
$updated = new JUser($existinguser->userid);
$dispatcher->trigger('onAfterStoreUser', array($updated->getProperties(), false, true, ''));
}
}
} else {
$gid = $usergroups[0];
$usertype = JFusionJplugin::getUsergroupName($jname,$gid);
if (!empty($gid) && !empty($usertype ) ) {
//update the user table
$query = 'UPDATE #__users SET usertype = '.$db->Quote($usertype).' , gid = '.$gid.' WHERE id = '.$existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('GROUP_UPDATE_ERROR') . ': ' . $db->stderr();
} else {
//we have to update the acl table
$query = 'SELECT id FROM #__core_acl_aro WHERE value = ' . $existinguser->userid;
$db->setQuery($query);
$aro_id = $db->loadResult();
if (!empty($aro_id)) {
$query = 'UPDATE #__core_acl_groups_aro_map SET group_id = '.$gid.' WHERE aro_id = '.$aro_id;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('GROUP_UPDATE_ERROR') . ': ' . $db->stderr();
//update to acl table failed, attempt to revert changes to user table
$query = 'UPDATE #__users SET usertype = '.$db->Quote($existinguser->group_name).' , gid = '.$existinguser->group_id.' WHERE id = '.$existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('GROUP_UPDATE_ERROR') . ': ' . $db->stderr();
}
} else {
$status['debug'][] = JText::_('GROUP_UPDATE') . ': ' . $existinguser->group_id . ' -> ' . $gid;
//Fire the user plugin functions for joomla_int
if ($jname == 'joomla_int' && $fire_user_plugins) {
// Fire the onAfterStoreUser event
$updated = new JUser($existinguser->userid);
$dispatcher->trigger('onAfterStoreUser', array($updated->getProperties(), false, true, ''));
}
}
} else {
$status['error'][] = JText::_('GROUP_UPDATE_ERROR') . ': ' . $db->stderr();
}
}
}
}
}
return $status;
}
/************************************************
* Functions For JFusion Who's Online Module
***********************************************/
/**
* Returns a query to find online users
* Make sure columns are named as userid, username, username_clean (if applicable), name (of user), and email
*
* @param int $limit integer to use as a limiter for the number of results returned
*
* @return string online user query
*/
public static function getOnlineUserQuery($limit)
{
$limiter = (!empty($limit)) ? "LIMIT 0,$limit" : '';
$query = 'SELECT DISTINCT u.id AS userid, u.username, u.name, u.email' . ' FROM #__users AS u INNER JOIN #__session AS s' . ' ON u.id = s.userid' . ' WHERE s.client_id = 0' . ' AND s.guest = 0 ' . $limiter;
return $query;
}
/**
* Returns number of guests
*
* @return int
*/
public static function getNumberOnlineGuests()
{
$db = JFactory::getDBO();
$query = 'SELECT COUNT(*) FROM #__session WHERE guest = 1 AND usertype = \'\' AND client_id = 0';
$db->setQuery($query);
return $db->loadResult();
}
/**
* Returns number of logged in users
*
* @return int
*/
public static function getNumberOnlineMembers()
{
$db = JFactory::getDBO();
$query = 'SELECT COUNT(DISTINCT userid) AS c FROM #__session WHERE guest = 0 AND client_id = 0';
$db->setQuery($query);
return $db->loadResult();
}
/**
* Update the language front end param in the account of the user if this one changes it
* NORMALLY THE LANGUAGE SELECTION AND CHANGEMENT FOR JOOMLA IS PROVIDED BY THIRD PARTY LIKE JOOMFISH
*
* @param string $jname jname
* @param object $userinfo userinfo
*
* @return array status
*/
public static function setLanguageFrontEnd($jname, $userinfo)
{
$status = array('error' => array(),'debug' => array());
$existinguser = (isset($userinfo)) ? JFusionJplugin::getUser($userinfo, $jname) : null;
// If the user is connected we change his account parameter in function of the language front end
if ($existinguser) {
$JLang = JFactory::getLanguage();
$userinfo->language = $JLang->getTag();
JFusionJplugin::updateUserLanguage($userinfo, $existinguser, $status, $jname);
} else {
$status['debug'] = JText::_('NO_USER_DATA_FOUND');
}
return $status;
}
/**
* Update the language user in his account when he logs in Joomla or
* when the language is changed in the frontend
*
* @see JFusionJplugin::updateUser
* @see JFusionJplugin::setLanguageFrontEnd
*
* @param object $userinfo Object containing the new userinfo
* @param object &$existinguser Object containing the old userinfo
* @param array &$status Array containing the errors and result of the function
* @param string $jname current plugin name
*/
public static function updateUserLanguage($userinfo, &$existinguser, &$status, $jname)
{
/**
* @TODO joomla 1.5/1.6 if we are talking to external joomla since joomla 1.5 store params in json
*/
$db = JFusionFactory::getDatabase($jname);
$params = new JParameter($existinguser->params);
$params->set('language', $userinfo->language);
$query = 'UPDATE #__users SET params =' . $db->Quote($params->toString()) . ' WHERE id =' . $existinguser->userid;
$db->setQuery($query);
if (!$db->query()) {
$status['error'][] = JText::_('LANGUAGE_UPDATE_ERROR') . $db->stderr();
} else {
$status['debug'][] = JText::_('LANGUAGE_UPDATE') . ' ' . $existinguser->language;
}
}
}