Project

General

Profile

Bug #3341 » controller.default.php

Pre-patched CB 1.8.1 file - krileon, 05 July 2012 20:15

 
<?php
/**
* Joomla/Mambo Community Builder
* @version $Id: controller.default.php 1812 2012-06-20 07:50:34Z beat $
* @package Community Builder
* @subpackage admin.comprofiler.php : default controller
* @author JoomlaJoe and Beat, database check function by Nick
* @copyright (C) JoomlaJoe and Beat, www.joomlapolis.com
* @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2
*/

// ensure this file is being included by a parent file
if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }

class CBController_default {
// dummy for now
} // class CBController_default

global $_CB_framework;
global $_CB_Admin_Done, $_CB_adminpath, $ueConfig, $mainframe;
$option = $_CB_framework->getRequestVar( 'option' );
$task = $_CB_framework->getRequestVar( 'task' );
$cid = cbGetParam( $_REQUEST, 'cid', array( 0 ) );
if ( ! is_array( $cid )) {
$cid = array ( (int) $cid );
}
$taskPart1 = strtok( $task, '.' );

if ( defined( 'JPATH_ADMINISTRATOR' ) ) {
$_CB_adminpath = JPATH_ADMINISTRATOR . '/components/com_comprofiler';
require_once $_CB_adminpath . '/admin.comprofiler.html.php';
} else {
require_once $mainframe->getPath( 'admin_html' );
}

cbimport( 'cb.tabs' );
cbimport( 'cb.imgtoolbox' );

if ( class_exists( 'JFactory' ) ) { // Joomla 1.5 : for string WARNREG_EMAIL_INUSE used in error js popup.
$lang = JFactory::getLanguage();
$lang->load( "com_users" );
}

// backend only:
cbimport( 'cb.adminfilesystem' );
cbimport( 'cb.installer' );
cbimport( 'cb.params' );
cbimport( 'cb.pagination' );

//$task = trim( cbGetParam( $_REQUEST, 'task', null ) );
$uid = cbGetParam( $_REQUEST, 'uid', array( 0 ) );


switch ( $taskPart1 ) {
case "remove":
cbSpoofCheck( 'user' );
checkCanAdminPlugins( 'core.delete', null, 'com_users' );
removeUsers( $cid, $option );
break;

case "block":
cbSpoofCheck( 'user' );
checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
changeUserBlock( $cid, 1, $option );
break;

case "unblock":
cbSpoofCheck( 'user' );
checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
changeUserBlock( $cid, 0, $option );
break;

case "approve":
cbSpoofCheck( 'user' );
checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
approveUser( $cid, 1, $option );
break;

case "reject":
cbSpoofCheck( 'user' );
checkCanAdminPlugins( 'core.edit.state', null, 'com_users' );
approveUser( $cid, 0, $option );
break;

case "showconfig":
checkCanAdminPlugins( 'core.admin' );
showConfig( $option );
break;

case "saveconfig":
cbSpoofCheck( 'config' );
checkCanAdminPlugins( 'core.admin' );
saveConfig( $option );
break;

case "removeTab":
cbSpoofCheck( 'tab' );
checkCanAdminPlugins( 'core.edit' );
removeTabs( $cid, $option );
break;

case "showTab":
checkCanAdminPlugins( 'core.edit' );
showTab( $option );
break;

case "orderupTab":
case "orderdownTab":
cbSpoofCheck( 'tab' );
checkCanAdminPlugins( 'core.edit.state' );
orderTabs( $cid[0], ($task == 'orderupTab' ? -1 : 1), $option);
break;

case "removeField":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit' );
removeField( $cid, $option );
break;

case "showField":
checkCanAdminPlugins( 'core.edit' );
showField( $option );
break;

case "orderupField":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
orderFields( $cid[0], -1, $option );
break;

case "orderdownField":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
orderFields( $cid[0], 1, $option );
break;

case "saveList":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit' );
saveList($option );
break;

case "editList":
checkCanAdminPlugins( 'core.edit' );
editList( $cid[0], 1, $option );
break;
case "newList":
checkCanAdminPlugins( 'core.edit' );
editList( 0, $option);
break;

case "showLists":
checkCanAdminPlugins( 'core.edit' );
showLists( $option );
break;
case "removeList":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit' );
removeList( $cid, $option );
break;
case "orderupList":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit.state' );
orderLists( $cid[0], -1, $option );
break;

case "orderdownList":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit.state' );
orderLists( $cid[0], 1, $option );
break;

case "fieldPublishedYes":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
publishField( $cid, 1, $option );
break;

case "fieldPublishedNo":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
publishField( $cid, 0, $option );
break;

case "fieldRequiredYes":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
requiredField( $cid, 1, $option );
break;

case "fieldRequiredNo":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
requiredField( $cid, 0, $option );
break;

case "fieldProfileYes1":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
profileField( $cid, 1, $option );
break;

case "fieldProfileYes2":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
profileField( $cid, 2, $option );
break;

case "fieldProfileNo":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
profileField( $cid, 0, $option );
break;

case "fieldRegistrationYes":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
registrationField( $cid, 1, $option );
break;

case "fieldRegistrationNo":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
registrationField( $cid, 0, $option );
break;

case "fieldSearchableYes":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
searchableField( $cid, 1, $option );
break;

case "fieldSearchableNo":
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
searchableField( $cid, 0, $option );
break;

case "listPublishedYes":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit.state' );
listPublishedField( $cid, 1, $option );
break;

case "listPublishedNo":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit.state' );
listPublishedField( $cid, 0, $option );
break;

case "listDefaultYes":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit.state' );
listDefaultField( $cid, 1, $option );
break;

case "listDefaultNo":
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit.state' );
listDefaultField( $cid, 0, $option );
break;

case "tabPublishedYes":
cbSpoofCheck( 'tab' );
checkCanAdminPlugins( 'core.edit.state' );
tabPublishedField( $cid, 1, $option );
break;

case "tabPublishedNo":
cbSpoofCheck( 'tab' );
checkCanAdminPlugins( 'core.edit.state' );
tabPublishedField( $cid, 0, $option );
break;

case "tools":
checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
loadTools();
break;

case "loadSampleData":
cbSpoofCheck( 'cbtools', 'GET' );
checkCanAdminPlugins( array( 'core.admin' ) );
loadSampleData();
break;

case "syncUsers":
cbSpoofCheck( 'cbtools', 'GET' );
checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
syncUsers();
break;

case "checkcbdb":
cbSpoofCheck( 'cbtools', 'GET' );
checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
checkcbdb( (int) cbGetParam( $_GET, 'databaseid', 0 ) );
break;

case "fixcbdb":
cbSpoofCheck( 'cbtools', 'GET' );
checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
fixcbdb( (int) cbGetParam( $_GET, 'dryrun', 1 ), (int) cbGetParam( $_GET, 'databaseid', 0 ) );
break;

case "fixacldb":
cbSpoofCheck( 'cbtools', 'GET' );
checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
fixacldb();
break;

case "fixcbmiscdb":
cbSpoofCheck( 'cbtools', 'GET' );
checkCanAdminPlugins( array( 'core.admin', 'core.edit' ) );
fixcbmiscdb();
break;

case 'savetaborder':
cbSpoofCheck( 'tab' );
checkCanAdminPlugins( 'core.edit.state' );
saveTabOrder( $cid );
break;

case 'savefieldorder':
cbSpoofCheck( 'field' );
checkCanAdminPlugins( 'core.edit.state' );
saveFieldOrder( $cid );
break;

case 'savelistorder':
cbSpoofCheck( 'list' );
checkCanAdminPlugins( 'core.edit.state' );
saveListOrder( $cid );
break;

case 'deletePlugin':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.admin', $cid );
removePlugin( $cid, $option );
break;

case 'cancelPlugin':
checkCanAdminPlugins( 'core.edit' );
cancelPlugin( $option );
break;

case 'cancelPluginAction':
checkCanAdminPlugins( 'core.edit' );
cancelPluginAction( $option );
break;

case 'publishPlugin':
case 'unpublishPlugin':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.edit.state', $cid );
publishPlugin( $cid, ($task == 'publishPlugin'), $option );
break;

case 'orderupPlugin':
case 'orderdownPlugin':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.edit.state', $cid[0] );
orderPlugin( $cid[0], ($task == 'orderupPlugin' ? -1 : 1), $option);
break;

case 'accesspublic':
case 'accessregistered':
case 'accessspecial':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.edit', $cid[0] );
accessMenu( $cid[0], $task, $option );
break;

case 'savepluginorder':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.edit.state', $cid );
savePluginOrder( $cid, $option );
break;

case 'showPlugins':
checkCanAdminPlugins( array( 'core.admin', 'core.edit', 'core.edit.state' ), $cid );
viewPlugins( $option);
break;

case 'installPluginUpload':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.admin' );
installPluginUpload();
break;

case 'installPluginDir':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.admin' );
installPluginDir();
break;

case 'installPluginURL':
cbSpoofCheck( 'plugin' );
checkCanAdminPlugins( 'core.admin' );
installPluginURL();
break;

case 'latestVersion':
latestVersion();
break;

case "fieldclass":
case "tabclass":
case "pluginclass":
tabClass( $option, $task, cbGetParam( $_REQUEST, 'user', 0 ) );
break;

case "finishinstallation":
finishInstallation( $option );
break;

default:
teamCredits(2);
break;
}

function saveList( $option ) {
global $_CB_framework, $_CB_database, $_POST;

$oldrow = new moscomprofilerLists( $_CB_database );
if ( isset( $_POST['listid'] ) && $_POST['listid'] ) {
$oldrow->load( (int) $_POST['listid'] );
// Check if user is a super user:
if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
// Check if user belongs to useraccessgroupid:
if ( ! in_array( $oldrow->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
// Check if user belongs to viewaccesslevel:
if ( ! in_array( $oldrow->viewaccesslevel, CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
}
}

$row = new moscomprofilerLists( $_CB_database );

$_POST['params'] = cbParamsEditorController::getRawParamsMagicgpcEscaped( $_POST['params'] );

if (!$row->bind( $_POST )) {
echo "<script type=\"text/javascript\"> alert('".$row->getError()."'); window.history.go(-1); </script>\n";
exit();
}
// Set defaults if nothing is found
// Also check if oldrow value to use its current value or default otherwise
// This prevents a tab from storing to database with null values when some inputs are set disabled:
if ( $row->published == '' ) {
$row->published = ( $oldrow->published != '' ? $oldrow->published : 1 );
}
if ( $row->default == '' ) {
$row->default = ( $oldrow->default != '' ? $oldrow->default : 0 );
}
if ( $row->useraccessgroupid == '' ) {
$row->useraccessgroupid = ( $oldrow->useraccessgroupid != '' ? $oldrow->useraccessgroupid : -2 );
}
if ( $row->viewaccesslevel == '' ) {
$row->viewaccesslevel = ( $oldrow->viewaccesslevel != '' ? $oldrow->viewaccesslevel : 1 );
}
if ( $row->ordering == '' ) {
$row->ordering = ( $oldrow->ordering != '' ? $oldrow->ordering : 999 );
}
if ( $row->usergroupids == '' ) {
$row->usergroupids = ( $oldrow->usergroupids != '' ? $oldrow->usergroupids : implode( ', ', $_CB_framework->acl->get_groups_below_me( null, true ) ) );
}

$row->description = cleanEditorsTranslationJunk( trim( $row->description ) );

// Check if user is a super user:
if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
$failed = false;
$canEditState = CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
// Check if user belongs to useraccessgroupid
if ( ( $row->useraccessgroupid != '' ) && ( ! in_array( $row->useraccessgroupid != '', $_CB_framework->acl->get_groups_below_me( null, true ) ) ) ) {
$failed = true;
}
// Check if user belongs to viewaccesslevel
if ( ( $row->viewaccesslevel != '' ) && ( ! in_array( $row->viewaccesslevel, CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false ) ) ) ) {
$failed = true;
}
// Check if user can edit status:
if ( ! $canEditState ) {
// Check if row exists and if publish is different from existing row
// Check if row doesn't exist and if publish is different from default
if ( ( $oldrow->listid && ( ( $row->published != '' ) && ( $oldrow->published != $row->published ) ) )
|| ( ( ! $oldrow->listid ) && ( ( $row->published != '' ) && ( $row->published != 1 ) ) ) )
{
$failed = true;
}
// Check if row exists and if publish is different from existing row
// Check if row doesn't exist and if publish is different from default
if ( ( $oldrow->listid && ( ( $row->default != '' ) && ( $oldrow->default != $row->default ) ) )
|| ( ( ! $oldrow->listid ) && ( ( $row->default != '' ) && ( $row->default != 1 ) ) ) )
{
$failed = true;
}
// Check if row exists and if useraccessgroupid is different from existing row
// Check if row doesn't exist and if useraccessgroupid is different from default
if ( ( $oldrow->listid && ( ( $row->useraccessgroupid != '' ) && ( $oldrow->useraccessgroupid != $row->useraccessgroupid ) ) )
|| ( ( ! $oldrow->listid ) && ( ( $row->useraccessgroupid != '' ) && ( $row->useraccessgroupid != -2 ) ) ) )
{
$failed = true;
}
// Check if row exists and if viewaccesslevel is different from existing row
// Check if row doesn't exist and if viewaccesslevel is different from default
if ( ( $oldrow->listid && ( ( $row->viewaccesslevel != '' ) && ( $oldrow->viewaccesslevel != $row->viewaccesslevel ) ) )
|| ( ( ! $oldrow->listid ) && ( ( $row->viewaccesslevel != '' ) && ( $row->viewaccesslevel != 1 ) ) ) )
{
$failed = true;
}
// Check if row exists and if ordering is different from existing row
// Check if row doesn't exist and if ordering is different from default
if ( ( $oldrow->listid && ( ( $row->ordering != '' ) && ( $oldrow->ordering != $row->ordering ) ) )
|| ( ( ! $oldrow->listid ) && ( ( $row->ordering != '' ) && ( $row->ordering != 999 ) ) ) )
{
$failed = true;
}
}
if ( $failed ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
}

if(isset($_POST['col1'])) { $row->col1fields = implode("|*|",$_POST['col1']); } else { $row->col1fields = null; } ;
if(isset($_POST['col2'])) { $row->col2fields = implode("|*|",$_POST['col2']); } else { $row->col2fields = null; } ;
if(isset($_POST['col3'])) { $row->col3fields = implode("|*|",$_POST['col3']); } else { $row->col3fields = null; } ;
if(isset($_POST['col4'])) { $row->col4fields = implode("|*|",$_POST['col4']); } else { $row->col4fields = null; } ;

if ($row->col1enabled != 1) $row->col1enabled=0;
if ($row->col2enabled != 1) $row->col2enabled=0;
if ($row->col3enabled != 1) $row->col3enabled=0;
if ($row->col4enabled != 1) $row->col4enabled=0;
if ($row->col1captions != 1) $row->col1captions=0;
if ($row->col2captions != 1) $row->col2captions=0;
if ($row->col3captions != 1) $row->col3captions=0;
if ($row->col4captions != 1) $row->col4captions=0;
if (!$row->store( (int) $_POST['listid'],true)) {
echo "<script type=\"text/javascript\"> alert('".$row->getError()."'); window.history.go(-2); </script>\n";
exit();
}

cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ), sprintf(CBTxt::T('Successfully Saved List: %s'), $row->title) );
}

function showLists( $option ) {
global $_CB_database, $_CB_framework;

$limit = (int) $_CB_framework->getCfg( 'list_limit' );
if ( $limit == 0 ) {
$limit = 10;
}
$limit = $_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
if($lastCBlist=='showlists') {
$limitstart = $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
$search = $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
if ($lastSearch != $search) {
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
}
$search = trim( strtolower( $search ) );
} else {
clearSearchBox();
$search="";
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
$_CB_framework->setUserState( "view{$option}lastCBlist", "showlists" );
}

$where = array();
if (isset( $search ) && $search!= "") {
$search = cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
$where[] = "(a.title LIKE '%$search%' OR a.description LIKE '%$search%')";
}

if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
$viewAccessLevelsInts = CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false );
$where[] = 'a.viewaccesslevel IN ('. implode( ',', $viewAccessLevelsInts ) . ')';

$where[] = "a.useraccessgroupid IN (" . implode( ',', $_CB_framework->acl->get_groups_below_me( null, true ) ) . ")";
}

$_CB_database->setQuery( "SELECT COUNT(*)"
. "\n FROM #__comprofiler_lists AS a"
. (count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
);
$total = $_CB_database->loadResult();
echo $_CB_database->getErrorMsg();
if ($total <= $limitstart) $limitstart = 0;

cbimport( 'cb.pagination' );
$pageNav = new cbPageNav( $total, $limitstart, $limit );

if ( checkJversion() == 2 ) {
$title = 'title';
} else {
$title = 'name';
}

$query = "SELECT a.listid, a.title, a.description, a.published, a.`default`, a.ordering, a.viewaccesslevel, al.$title AS viewaccesslevelname, a.useraccessgroupid"
. "\nFROM #__comprofiler_lists a";
if ( checkJversion() == 2 ) {
$query .= "\n LEFT JOIN #__viewlevels AS al ON al.id = a.viewaccesslevel";
} else {
$query .= "\n LEFT JOIN #__groups AS al ON al.id + 1 = a.viewaccesslevel"; // fix J1.5-'s wrong access levels, same as g.id = IF( m.access = 0, 1, IF( m.access = 1, 2, IF( m.access = 2, 3, m.access ) ) )
}

$query .= (count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
. "\n ORDER BY ordering";
$_CB_database->setQuery( $query, (int) $pageNav->limitstart, (int) $pageNav->limit );

$rows = $_CB_database->loadObjectList();
if ($_CB_database->getErrorNum()) {
echo $_CB_database->stderr();
return false;
}

$canEdit = CBuser::getMyInstance()->authoriseAction( 'core.edit' );
$canEditState = CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
$showUserAccessGroupId = isStillUsingGroupsForViewAccess( '#__comprofiler_lists' );

HTML_comprofiler::showLists( $rows, $pageNav, $search, $option, $canEdit, $canEditState, $showUserAccessGroupId );
return true;
}

function editList( $fid='0', $option='com_comprofiler', $task = 'editList') {
global $_CB_database, $_CB_framework, $ueConfig;

$canEditState = CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );

$row = new moscomprofilerLists( $_CB_database );

if ( $fid ) {
// load the row from the db table
$row->load( (int) $fid );
// Check if user is a super user:
if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
// Check if user belongs to useraccessgroupid:
if ( ! in_array( $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
// Check if user belongs to viewaccesslevel:
if ( ! in_array( $row->viewaccesslevel, CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
}
} else {
$row->published = 1;
$row->default = 0;
$row->col1enabled = '1';
$row->viewaccesslevel = 1;
$row->useraccessgroupid = -2;
$row->ordering = 999;
}

$lists['published'] = moscomprofilerHTML::yesnoSelectList( 'published', 'class="inputbox" size="1"' . ( $canEditState ? '' : ' disabled="disabled"' ), $row->published );
$lists['default'] = moscomprofilerHTML::yesnoSelectList( 'default', 'class="inputbox" size="1"' . ( $canEditState ? '' : ' disabled="disabled"' ), $row->default );

$gtree2 = array();
if ( ( ! $_CB_framework->acl->amIaSuperAdmin() ) && in_array( (int) $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
// This should always be the case:
// ensure user can't add group higher than themselves:
$gtree2 = array_merge( $gtree2, $_CB_framework->acl->get_groups_below_me() ); // vs $_CB_framework->acl->get_groups_below_me( null, true ) in tab lists
} else {
// Just in case we missed one, and as super-admin we should see everything:
$gtree2 = array_merge( $gtree2, $_CB_framework->acl->get_group_children_tree( null, 'USERS', false ));
}

if ( ! $fid ) {
$row->usergroupids = implode( ', ', $_CB_framework->acl->get_groups_below_me( null, true ) );
}

$usergids = explode( ', ', $row->usergroupids );
$ugids = array();
foreach($usergids as $usergid) {
$ugids[] = $usergid;
}

// build the html select list for the view level access (filtered by View Access Levels visible by the admin if not super user:
$accessTree = $_CB_framework->acl->get_access_children_tree( true, false, ( ! $_CB_framework->acl->amIaSuperAdmin() ) );
$lists['viewaccesslevel'] = moscomprofilerHTML::selectList( $accessTree, 'viewaccesslevel', 'class="inputbox"' . ( $canEditState ? '' : ' disabled="disabled"' ), 'value', 'text', intval( $row->viewaccesslevel ), 2 );

$lists['usergroups'] = moscomprofilerHTML::selectList( $gtree2, 'usergroups', 'size="4" MULTIPLE onblur="loadUGIDs(this);" mosReq=1 mosLabel="' . htmlspecialchars( CBTxt::T('User Groups to Include in List') ) . '"' . ( $canEditState ? '' : ' disabled="disabled"' ), 'value', 'text', $ugids, 1, false );

// We want to use View Access Levels in Joomla 1.6, and hide old method if unused:
if ( isStillUsingGroupsForViewAccess( $row->_tbl ) ) {
$gtree3 = array();
$gtree3[] = moscomprofilerHTML::makeOption( -2 , '- ' . CBtxt::T('Everybody') . ' -' );
$gtree3[] = moscomprofilerHTML::makeOption( -1 , '- ' . CBtxt::T('All Registered Users') . ' -' );
if ( ( ! $_CB_framework->acl->amIaSuperAdmin() ) && in_array( (int) $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
// This should always be the case:
// ensure user can't add group higher than themselves:
$gtree3 = array_merge( $gtree3, $_CB_framework->acl->get_groups_below_me() ); // vs $_CB_framework->acl->get_groups_below_me( null, true ) in tab lists
} else {
// Just in case we missed one, and as super-admin we should see everything:
$gtree3 = array_merge( $gtree3, $_CB_framework->acl->get_group_children_tree( null, 'USERS', false ));
}
$lists['useraccessgroup'] = moscomprofilerHTML::selectList( $gtree3, 'useraccessgroupid', 'size="4" mosReq=1 mosLabel="' . htmlspecialchars( CBTxt::T('User Group to allow access to') ) . '"' . ( $canEditState ? '' : ' disabled="disabled"' ), 'value', 'text', $row->useraccessgroupid, 2, false, false );
} else {
$lists['useraccessgroup'] = null;
}


$_CB_database->setQuery( "SELECT f.fieldid, f.title"
. "\n FROM #__comprofiler_fields AS f"
. "\n INNER JOIN #__comprofiler_plugin AS p ON (f.pluginid = p.id)"
. "\n WHERE ( ( f.published = 1"
. "\n AND f.profile > 0 ) OR ( f.name = 'username' ) " . ( in_array( $ueConfig['name_format'], array( 1, 2, 4 ) ) ? "OR ( f.name = 'name' ) " : '' ) . ")"
. "\n AND p.published = 1"
. "\n ORDER BY f.ordering"
);
$field = $_CB_database->loadObjectList();
$fields = array();
for ( $i = 0, $n = count( $field ) ; $i < $n ; $i++ ) {
$fieldvalue =& $field[$i];
$fields[$fieldvalue->fieldid] = $fieldvalue->title;
}
//print_r(array_values($fields));

// params:
$paramsEditorHtml = array();
$options = array( 'option' => $option, 'task' => $task, 'cid' => $row->listid );

// list-specific own parameters:
cbimport( 'cb.xml.simplexml' );
$listXml = new CBSimpleXMLElement( file_get_contents( $_CB_framework->getCfg( 'absolute_path' ) . '/administrator/components/com_comprofiler/xmlcb/cb.lists.xml' ) );
$null = null;
$params = new cbParamsEditorController( $row->params, $listXml, $listXml, $null, null, 'cbxml', 'version', '1' );
$params->setOptions( $options );
$listParamsEditHtml = $params->draw( null, 'views', 'view', 'name', 'editlist' );
$paramsEditorHtml[] = array( 'title' => CBTxt::T('List parameters'), 'content' => $listParamsEditHtml );
/*

// params:
$paramsEditorHtml = array();
$options = array( 'option' => $option, 'task' => $task, 'cid' => $row->fieldid );

// field-specific own parameters:
$fieldHandler = new cbFieldHandler();
$fieldOwnParamsEditHtml = $fieldHandler->drawParamsEditor( $row, $options );
if ( $fieldOwnParamsEditHtml ) {
$paramsEditorHtml[] = array( 'title' => CBTxt::T('Field-specific Parameters'), 'content' => $fieldOwnParamsEditHtml );
}

// additional non-specific other parameters:
$fieldsParamsPlugins = $_PLUGINS->getUserFieldParamsPluginIds();
foreach ($fieldsParamsPlugins as $pluginId => $fieldParamHandlerClassName ) {
$fieldParamHandler = new $fieldParamHandlerClassName( $pluginId, $row ); // cbFieldParamsHandler();
$addParamsHtml = $fieldParamHandler->drawParamsEditor( $options );
if ( $addParamsHtml ) {
$addParamsTitle = $fieldParamHandler->getFieldsParamsLabel();
$paramsEditorHtml[] = array( 'title' => $addParamsTitle, 'content' => $addParamsHtml );
}
}
*/
HTML_comprofiler::editList( $row, $lists,$fields, $option, $fid, $paramsEditorHtml );
}

function removeList( $cid, $option ) {
global $_CB_framework, $_CB_database;

if (!is_array( $cid ) || count( $cid ) < 1) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
exit;
}
$msg = '';
if (count( $cid )) {
$obj = new moscomprofilerLists( $_CB_database );
foreach ($cid as $id) {
$obj->delete( $id );
}
}

//if($msg!='') echo "<script type=\"text/javascript\"> alert('".$msg."'); window.history.go(-1);</script>\n";
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ), $msg );
}

function orderLists( $lid, $inc, $option ) {
global $_CB_framework, $_CB_database;
$row = new moscomprofilerLists( $_CB_database );
$row->load( (int) $lid );
$row->move( $inc );
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ) );
}

function showField( $option ) {
global $_CB_database, $_CB_framework;

_upgradeCbFieldsTableOldFields();

$limit = (int) $_CB_framework->getCfg( 'list_limit' );
if ( $limit == 0 ) {
$limit = 10;
}
$limit = $_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
if($lastCBlist=='showfields') {
$limitstart = $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
$search = $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
if ($lastSearch != $search) {
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
}
$search = trim( strtolower( $search ) );
} else {
clearSearchBox();
$search="";
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
$_CB_framework->setUserState( "view{$option}lastCBlist", "showfields" );
}

$where = array();
// $where[] = "(f.sys = 0)";
if (isset( $search ) && $search!= "") {
$search = cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
$where[] = "(f.name LIKE '%$search%' OR f.type LIKE '%$search%')";
}
if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
$where[] = "t.useraccessgroupid IN (" . implode( ',', $_CB_framework->acl->get_groups_below_me( null, true ) ) . ")";
}

$_CB_database->setQuery( "SELECT COUNT(*)"
. "\n FROM #__comprofiler_fields AS f, #__comprofiler_tabs AS t"
. "\n WHERE (f.tabid = t.tabid) AND (t.fields = 1)" . ( count( $where ) ? ( " AND " . implode( ' AND ', $where ) ) : "" )
);
$total = $_CB_database->loadResult();
echo $_CB_database->getErrorMsg();
if ($total <= $limitstart) $limitstart = 0;

cbimport( 'cb.pagination' );
$pageNav = new cbPageNav( $total, $limitstart, $limit );
$_CB_database->setQuery( "SELECT f.fieldid, f.title, f.name, f.description, f.type, f.required, f.published, "
. "f.profile, f.ordering, f.registration, f.searchable, f.pluginid, f.sys, f.tablecolumns, "
. "t.title AS 'tab', t.enabled AS 'tabenabled', t.pluginid AS 'tabpluginid', "
. "p.name AS pluginname, p.published AS pluginpublished, "
. "pf.name AS fieldpluginname, pf.published AS fieldpluginpublished "
. "\n FROM #__comprofiler_fields AS f"
. "\n INNER JOIN #__comprofiler_tabs AS t ON ( (f.tabid = t.tabid) AND (t.fields = 1) ) "
. "\n LEFT JOIN #__comprofiler_plugin AS p ON p.id = t.pluginid"
. "\n LEFT JOIN #__comprofiler_plugin AS pf ON pf.id = f.pluginid"
. (count( $where ) ? "\n WHERE " . implode( ' AND ', $where ) : "")
. "\n ORDER BY t.ordering, f.ordering",
(int) $pageNav->limitstart, (int) $pageNav->limit
);

$rows = $_CB_database->loadObjectList();
if ($_CB_database->getErrorNum()) {
echo $_CB_database->stderr();
return false;
}

$canEdit = CBuser::getMyInstance()->authoriseAction( 'core.edit' );
$canEditState = CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );

HTML_comprofiler::showFields( $rows, $pageNav, $search, $option, $canEdit, $canEditState ); return true;
}

function _upgradeCbFieldsTableOldFields( ) {
global $_CB_database;

// Upgrade old-fashioned fields (and the ones created by Fireboard !)
$query = 'UPDATE #__comprofiler_fields SET tablecolumns = name, pluginid = 1 WHERE pluginid = 0';
$_CB_database->setQuery( $query );
$_CB_database->query();
}


function removeField( $cid, $option ) {
global $_CB_database, $_CB_framework;

if (!is_array( $cid ) || count( $cid ) < 1) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
exit;
}
$msg = '';
if (count( $cid )) {
$obj = new moscomprofilerFields( $_CB_database );

$deletedOkNames = array();

foreach ($cid as $id) {
$id = (int) $id;
$obj->load( $id );

$fieldTab = new moscomprofilerTabs( $_CB_database );
$fieldTab->load( (int) $obj->tabid );
if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
if ( ! in_array( $fieldTab->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) ."'); window.history.go(-1);</script>\n";
exit;
}
}

$noDelete = 0;
$_CB_database->setQuery("SELECT COUNT(*) FROM #__comprofiler_lists".
" WHERE col1fields like '%|*|$id' OR col1fields like '$id|*|%' OR col1fields like '%|*|$id|*|%' OR col1fields='$id'".
" OR col2fields like '%|*|$id' OR col2fields like '$id|*|%' OR col2fields like '%|*|$id|*|%' OR col2fields='$id'".
" OR col3fields like '%|*|$id' OR col3fields like '$id|*|%' OR col3fields like '%|*|$id|*|%' OR col3fields='$id'".
" OR col4fields like '%|*|$id' OR col4fields like '$id|*|%' OR col4fields like '%|*|$id|*|%' OR col4fields='$id'");
$onList = $_CB_database->loadResult();
if ($onList > 0) {
$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is on a List.') . "\n", getLangDefinition($obj->title));
$noDelete = 1;
}
if ($obj->sys==1) {
$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is a system field.') . "\n", getLangDefinition($obj->title));
$noDelete = 1;
}
if ($noDelete != 1) {
if ( $obj->deleteDataDescr( $id ) ) {
$sql="UPDATE #__comprofiler_fields SET ordering = ordering-1 WHERE ordering > ".(int) $obj->ordering." AND tabid = ".(int) $obj->tabid;
$_CB_database->setQuery($sql);
$_CB_database->query();
$deletedOkNames[] = $obj->title;
}
}
}
}

if ( ! $msg ) {
$msg = CBTxt::T('Successfully Deleted Fields') . ': '. implode( ', ', $deletedOkNames );
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ), $msg );
}


function orderFields( $fid, $inc, $option ) {
global $_CB_database, $_CB_framework;
$row = new moscomprofilerFields( $_CB_database );
$row->load( (int) $fid );

$fieldTab = new moscomprofilerTabs( $_CB_database );
$fieldTab->load( (int) $row->tabid );
if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
if ( ! in_array( $fieldTab->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
}

$row->move( $inc , "tabid='$row->tabid'");
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}


function showTab( $option ) {
global $_CB_database, $_CB_framework;

$limit = (int) $_CB_framework->getCfg( 'list_limit' );
if ( $limit == 0 ) {
$limit = 10;
}
$limit = $_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
if($lastCBlist=='showtab') {
$limitstart = $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
$search = $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
if ($lastSearch != $search) {
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
}
$search = trim( strtolower( $search ) );
} else {
clearSearchBox();
$search="";
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
$_CB_framework->setUserState( "view{$option}lastCBlist", "showtab" );
}

$where = array();
if (isset( $search ) && $search!= "") {
$search = cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
$where[] = "(a.title LIKE '%$search%')";
}

if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
$viewAccessLevelsInts = CBuser::getMyInstance()->getAuthorisedViewLevelsIds( false );
$where[] = 'a.viewaccesslevel IN ('. implode( ',', $viewAccessLevelsInts ) . ')';

$where[] = "a.useraccessgroupid IN (" . implode( ',', $_CB_framework->acl->get_groups_below_me( null, true ) ) . ")";
}

$_CB_database->setQuery( "SELECT COUNT(*)"
. "\nFROM #__comprofiler_tabs AS a"
. (count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
);
$total = $_CB_database->loadResult();
echo $_CB_database->getErrorMsg();
if ($total <= $limitstart) $limitstart = 0;

cbimport( 'cb.pagination' );
$pageNav = new cbPageNav( $total, $limitstart, $limit );

if ( checkJversion() == 2 ) {
$title = 'title';
} else {
$title = 'name';
}

$query = "SELECT a.*, p.name AS pluginname, p.published AS pluginpublished, al.$title AS viewaccesslevelname"
. "\n FROM #__comprofiler_tabs AS a"
. "\n LEFT JOIN #__comprofiler_plugin AS p ON p.id = a.pluginid";

if ( checkJversion() == 2 ) {
$query .= "\n LEFT JOIN #__viewlevels AS al ON al.id = a.viewaccesslevel";
} else {
$query .= "\n LEFT JOIN #__groups AS al ON al.id + 1 = a.viewaccesslevel"; // fix J1.5-'s wrong access levels, same as g.id = IF( m.access = 0, 1, IF( m.access = 1, 2, IF( m.access = 2, 3, m.access ) ) )
}

$query .= (count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : "")
. "\n ORDER BY position, ordering";

$_CB_database->setQuery( $query, (int) $pageNav->limitstart, (int) $pageNav->limit );
$rows = $_CB_database->loadObjectList();
if ($_CB_database->getErrorNum()) {
echo $_CB_database->stderr();
return false;
}

$canEdit = CBuser::getMyInstance()->authoriseAction( 'core.edit' );
$canEditState = CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
$showUserAccessGroupId = isStillUsingGroupsForViewAccess( '#__comprofiler_tabs' );

HTML_comprofiler::showTabs( $rows, $pageNav, $search, $option, $canEdit, $canEditState, $showUserAccessGroupId );
return true;
}

function removeTabs( $cid, $option ) {
global $_CB_database, $_CB_framework;

if (!is_array( $cid ) || count( $cid ) < 1) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
exit;
}
$msg = '';
if (count( $cid )) {
$obj = new moscomprofilerTabs( $_CB_database );
foreach ($cid as $id) {
$noDelete = 0;
$obj->load( (int) $id );
if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
if ( ! in_array( $obj->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
}

$_CB_database->setQuery( "SELECT COUNT(*) FROM #__comprofiler_fields WHERE tabid=" . (int) $id );
$onField = $_CB_database->loadResult();
if( $obj->sys > 0 ) {
$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is a system tab.'),getLangDefinition($obj->title)) . " \n";
$noDelete = 1;
}
if( $obj->pluginid ) {
$plugin = new moscomprofilerPlugin( $_CB_database );
if ( $plugin->load( $obj->pluginid ) ) {
$msg .= sprintf(CBTxt::T('%s cannot be deleted because it is a tab belonging to an installed plugin.'),getLangDefinition($obj->title)) . " \n";
$noDelete = 1;
}
}
if( $onField > 0 ) {
$msg .= sprintf(CBTxt::T('%s is being referenced by an existing field and cannot be deleted!'),getLangDefinition($obj->title));
$noDelete = 1;
}
if( $noDelete == 0 ) {
$obj->delete( $id );
$msg .= $obj->getError();
}
}
}
if ( $msg ) {
echo "<script type=\"text/javascript\"> alert('" . str_replace( "\n", '\\n', addslashes( $msg ) ) . "'); window.history.go(-1);</script>\n";
exit;
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showTab" ) );
}


function orderTabs( $tid, $inc, $option ) {
global $_CB_database, $_CB_framework;

$row = new moscomprofilerTabs( $_CB_database );
$row->load( (int) $tid );

if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
if ( ! in_array( $row->useraccessgroupid, $_CB_framework->acl->get_groups_below_me( null, true ) ) ) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Unauthorized Access') ) . "'); window.history.go(-1);</script>\n";
exit;
}
}

$row->move( $inc, "position='$row->position' AND ordering > -10000 AND ordering < 10000 " );
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showTab" ) );
}


function deleteUsers( $cid, $inComprofilerOnly = false ) {
global $_CB_framework, $_CB_database;

$msg = checkCBpermissions( $cid, "delete", false );

if (!$msg && is_array( $cid ) && count( $cid )) {
new cbTabs( 0, 2, null, false ); // loads plugins
foreach ($cid as $id) {
$obj =& $_CB_framework->_getCmsUserObject( (int) $id );
if ( ( $obj !== null ) || $inComprofilerOnly ) {
$count = 2;
if ( checkJversion() == 2 ) {
$cms_super_admin = 8; //TODO in CB 2.0 we will do this better
} else {
$cms_super_admin = 25;
}
if ( ( $obj !== null ) && ( $obj->gid == $cms_super_admin ) ) {
// count number of active super admins
if ( checkJversion() == 2 ) {
$query = 'SELECT COUNT( a.id )'
. "\n FROM #__users AS a"
. "\n INNER JOIN #__user_usergroup_map AS b"
. ' ON b.user_id = a.id'
. "\n WHERE b.group_id = " . (int) $cms_super_admin
. "\n AND a.block = 0"
;
} else {
$query = 'SELECT COUNT( id )'
. "\n FROM #__users"
. "\n WHERE gid = " . (int) $cms_super_admin
. "\n AND block = 0"
;
}
$_CB_database->setQuery( $query );
$count = $_CB_database->loadResult();
}

if ( $count <= 1 && $obj->gid == $cms_super_admin ) {
// cannot delete Super Admin where it is the only one that exists
$msg .= CBTxt::T('You cannot delete this Super Administrator as it is the only active Super Administrator for your site');
} else {
// delete user
$result = cbDeleteUser( $id, null, $inComprofilerOnly );
if ( $result === null ) {
$msg .= CBTxt::T('User not found');
} elseif (is_string( $result ) && ( $result != "" ) ) {
$msg .= $result;
}
}
} else {
$msg .= CBTxt::T('User not found');
}
}
}
return $msg;
}

function removeUsers( $cid, $option ) {
global $_CB_framework;

if (!is_array( $cid ) || count( $cid ) < 1) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select an item to delete') ) . "'); window.history.go(-1);</script>\n";
exit;
}

$msg = deleteUsers($cid);
if ($msg) {
echo "<script type=\"text/javascript\"> alert('".$msg."'); window.history.go(-1);</script>\n";
exit;
}

cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showusers" ), $msg );
}

/**
* Blocks or Unblocks one or more user records
* @param array An array of unique category id numbers
* @param integer 0 if unblock, 1 if blocking
* @param string The current url option
*/
function changeUserBlock( $cid=null, $block=1, $option ) {
$action = $block ? 'block' : 'unblock';
changeUsersStatus( $cid, $action, $block, $option );
}
/**
* Approves or Rejects one or more user records
* @param array An array of unique category id numbers
* @param integer 0 if reject, 1 if approve
* @param string The current url option
*/
function approveUser( $cid=null, $approved=1, $option ) {
$action = $approved ? 'Approve' : 'Reject';
changeUsersStatus( $cid, $action, $approved, $option );
}

/**
* Change users status
*
* @param array of int $cid
* @param string $action ( Approve, Reject, block, unblock )
* @param int $actionValue
* @param string $option
*/
function changeUsersStatus( $cid=null, $action, $actionValue, $option ) {
global $_CB_framework, $_CB_database, $ueConfig, $_PLUGINS;

if (count( $cid ) < 1) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}
$msg = checkCBpermissions( $cid, $action, false );
if ($msg) {
echo "<script type=\"text/javascript\"> alert('".$msg."'); window.history.go(-1);</script>\n";
exit;
}

cbArrayToInts($cid);
$cids = implode( ',', $cid );

$_PLUGINS->loadPluginGroup('user');
$query = "SELECT * FROM #__comprofiler c, #__users u WHERE c.id=u.id AND c.id IN ( " . $cids . " )";
$_CB_database->setQuery($query);
$users = $_CB_database->loadObjectList( null, 'moscomprofilerUser', array( & $_CB_database ) );

foreach ( $users as $row ) {
switch ( $action ) {
case 'Approve':
case 'Reject':
if ($actionValue == 0) {
$approved = 2; // "rejected"
} else {
$approved = $actionValue;
}
$_PLUGINS->trigger( 'onBeforeUserApproval', array( $row, $approved ) );
$_CB_database->setQuery( "UPDATE #__comprofiler SET approved=" . (int) $approved . " WHERE id = " . (int) $row->id );
if ($_CB_database->query()) {
if($approved==1) {
if( isset( $ueConfig['emailpass'] ) && ( $ueConfig['emailpass'] == "1" ) && ( $row->approved == 0 ) ) {
// if we need to generate a random password to be emailed with confirmation, set new random password only at first approval:
$row->setRandomPassword();
$row->storePassword( false );
}
if ($row->approved == 0 && $approved == 1 && $row->confirmed == 1 ) {
$row->approved = 1;
activateUser($row, 2, "UserApproval", false);
}
}
$_PLUGINS->trigger( 'onAfterUserApproval', array( $row, $approved, true ) );
}
break;

case 'block':
case 'unblock':
$_PLUGINS->trigger( 'onBeforeUserBlocking', array( $row, $actionValue ) );
$row->block = (int) $actionValue;
if ( $row->storeBlock( false ) ) {
// if action is to block a user, delete user acounts active sessions
if ( $actionValue == 1 ) {
$query = "DELETE FROM #__session"
. "\n WHERE userid = " . (int) $row->id;
$_CB_database->setQuery( $query );
$_CB_database->query();
}
}
break;

default:
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('unknown action %s') ), $action ) . "'); window.history.go(-1);</script>\n";
exit;
break;
}
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showusers" ) );
}

function cbIsEmail($email){
$rBool=false;

if(preg_match("/[\\w\\.\\-]+@\\w+[\\w\\.\\-]*?\\.\\w{1,4}/", $email)){
$rBool=true;
}
return $rBool;
}
function showConfig( $option ) {
global $_CB_framework, $_CB_database,$ueConfig;
global $_CB_adminpath;

cbimport( 'cb.adminfilesystem' );
$adminFS =& cbAdminFileSystem::getInstance();

$configfile = $_CB_adminpath."/ue_config.php";

//Add code to check if config file is writeable.
if ( $adminFS->isUsingStandardPHP() && ! is_writable($configfile)) {
@chmod ($configfile, 0766);
$permission = is_writable($configfile);
if (!$permission) {
echo "<center><h1><font color=red>" . _UE_WARNING . "...</font></h1><BR>";
echo "<b>" . _UE_YOUR_CONFIG_FILE . ": $configfile <font color=red>" . _UE_IS_NOT_WRITABLE . "</font></b><br />";
echo "<b>" . _UE_NEED_TO_CHMOD_CONFIG . "</b></center><br /><br />";
}
}

$lists = array();
// make a standard yes/no list
$yesno = array();
$yesno[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
$yesno[] = moscomprofilerHTML::makeOption( '1', _UE_YES );

$admin_allowcbregistration = array();
$admin_allowcbregistration[] = moscomprofilerHTML::makeOption( '0', _UE_REG_ALLOWREG_SAME_AS_GLOBAL );
$admin_allowcbregistration[] = moscomprofilerHTML::makeOption( '1', _UE_REG_ALLOWREG_YES );

$conNotifyTypes=array();
$conNotifyTypes[] = moscomprofilerHTML::makeOption( '0', _UE_NONE );
$conNotifyTypes[] = moscomprofilerHTML::makeOption( '1', CBTxt::T('Email') );
$conNotifyTypes[] = moscomprofilerHTML::makeOption( '2', CBTxt::T('PMS') );
$conNotifyTypes[] = moscomprofilerHTML::makeOption( '3', CBTxt::T('PMS+Email') );

$dateformats = array();
$dateformats[] = moscomprofilerHTML::makeOption('Y/m/d',CBTxt::T('yyyy/mm/dd'));
$dateformats[] = moscomprofilerHTML::makeOption('d/m/y',CBTxt::T('dd/mm/yy'));
$dateformats[] = moscomprofilerHTML::makeOption('y/m/d',CBTxt::T('yy/mm/dd'));
$dateformats[] = moscomprofilerHTML::makeOption('d/m/Y',CBTxt::T('dd/mm/yyyy'));
$dateformats[] = moscomprofilerHTML::makeOption('m/d/y',CBTxt::T('mm/dd/yy'));
$dateformats[] = moscomprofilerHTML::makeOption('m/d/Y',CBTxt::T('mm/dd/yyyy'));
$dateformats[] = moscomprofilerHTML::makeOption('Y-m-d',CBTxt::T('yyyy-mm-dd'));
$dateformats[] = moscomprofilerHTML::makeOption('d-m-y',CBTxt::T('dd-mm-yy'));
$dateformats[] = moscomprofilerHTML::makeOption('y-m-d',CBTxt::T('yy-mm-dd'));
$dateformats[] = moscomprofilerHTML::makeOption('d-m-Y',CBTxt::T('dd-mm-yyyy'));
$dateformats[] = moscomprofilerHTML::makeOption('m-d-y',CBTxt::T('mm-dd-yy'));
$dateformats[] = moscomprofilerHTML::makeOption('m-d-Y',CBTxt::T('mm-dd-yyyy'));
$dateformats[] = moscomprofilerHTML::makeOption('Y.m.d',CBTxt::T('yyyy.mm.dd'));
$dateformats[] = moscomprofilerHTML::makeOption('d.m.y',CBTxt::T('dd.mm.yy'));
$dateformats[] = moscomprofilerHTML::makeOption('y.m.d',CBTxt::T('yy.mm.dd'));
$dateformats[] = moscomprofilerHTML::makeOption('d.m.Y',CBTxt::T('dd.mm.yyyy'));
$dateformats[] = moscomprofilerHTML::makeOption('m.d.y',CBTxt::T('mm.dd.yy'));
$dateformats[] = moscomprofilerHTML::makeOption('m.d.Y',CBTxt::T('mm.dd.yyyy'));

$calendartypes = array();
$calendartypes[] = moscomprofilerHTML::makeOption('2', _UE_CALENDAR_TYPE_DROPDOWN_POPUP );
$calendartypes[] = moscomprofilerHTML::makeOption('1', _UE_CALENDAR_TYPE_POPUP );

$nameformats = array();
$nameformats[] = moscomprofilerHTML::makeOption('1', _UE_REG_NAMEFORMAT_NAME_ONLY );
$nameformats[] = moscomprofilerHTML::makeOption('2', _UE_REG_NAMEFORMAT_NAME_USERNAME );
$nameformats[] = moscomprofilerHTML::makeOption('3', _UE_REG_NAMEFORMAT_USERNAME_ONLY );
$nameformats[] = moscomprofilerHTML::makeOption('4', _UE_REG_NAMEFORMAT_USERNAME_NAME );

$imgToolBox = new imgToolBox();
$imgToolBox->_IM_path = $ueConfig['im_path'];
$imgToolBox->_NETPBM_path = $ueConfig['netpbm_path'];
$imageLibs = $imgToolBox->getImageLibs();
$conversiontype = array();
if(array_key_exists('imagemagick',$imageLibs)|| ($ueConfig['conversiontype']=='1')) $conversiontype[] = moscomprofilerHTML::makeOption('1',CBTxt::T('ImageMagick'));
if(array_key_exists('netpbm',$imageLibs) || ($ueConfig['conversiontype']=='2')) $conversiontype[] = moscomprofilerHTML::makeOption('2',CBTxt::T('NetPBM'));
if(array_key_exists('gd1',$imageLibs['gd']) || ($ueConfig['conversiontype']=='3')) $conversiontype[] = moscomprofilerHTML::makeOption('3',CBTxt::T('GD1 library'));
if(array_key_exists('gd2',$imageLibs['gd']) || ($ueConfig['conversiontype']=='4')) $conversiontype[] = moscomprofilerHTML::makeOption('4',CBTxt::T('GD2 library'));

$namestyles = array();
$namestyles[] = moscomprofilerHTML::makeOption('1', _UE_REG_NAMEFORMAT_SINGLE_FIELD );
$namestyles[] = moscomprofilerHTML::makeOption('2', _UE_REG_NAMEFORMAT_TWO_FIELDS );
$namestyles[] = moscomprofilerHTML::makeOption('3', _UE_REG_NAMEFORMAT_THREE_FIELDS );

$emailhandling = array();
$emailhandling[] = moscomprofilerHTML::makeOption('1', _UE_REG_EMAILDISPLAY_EMAIL_ONLY );
$emailhandling[] = moscomprofilerHTML::makeOption('2', _UE_REG_EMAILDISPLAY_EMAIL_W_MAILTO );
$emailhandling[] = moscomprofilerHTML::makeOption('3', _UE_REG_EMAILDISPLAY_EMAIL_W_FORM );
$emailhandling[] = moscomprofilerHTML::makeOption('4', _UE_REG_EMAILDISPLAY_EMAIL_NO );

$emailreplyto = array();
$emailreplyto[] = moscomprofilerHTML::makeOption('1',_UE_A_FROM_USER );
$emailreplyto[] = moscomprofilerHTML::makeOption('2',_UE_A_FROM_ADMIN );

$email_checker = array();
$email_checker[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
$email_checker[] = moscomprofilerHTML::makeOption( '1', _UE_REG_EMAILCHECKER_VALID_EMAIL_ONLY );
$email_checker[] = moscomprofilerHTML::makeOption( '2', _UE_REG_EMAILCHECKER_NOT_REGISTERED_AND_VALID_EMAIL );

$connectionDisplay = array();
$connectionDisplay[] = moscomprofilerHTML::makeOption( '0', _UE_PUBLIC );
$connectionDisplay[] = moscomprofilerHTML::makeOption( '1', _UE_PRIVATE );

$enableSpoofCheck = array();
$enableSpoofCheck[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
$enableSpoofCheck[] = moscomprofilerHTML::makeOption( '1', _UE_YES );

$noVersionCheck = array();
$noVersionCheck[] = moscomprofilerHTML::makeOption( '0', _UE_AUTOMATIC );
$noVersionCheck[] = moscomprofilerHTML::makeOption( '1', _UE_MANUAL );

$userprofileEdits = array();
$userprofileEdits[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
$userprofileEdits[] = moscomprofilerHTML::makeOption( '1', _UE_MODERATORS_AND_ABOVE ); //FIXME in CB 2.0: this conflicts with J1.6 ' registered group
$userprofileEdits[] = moscomprofilerHTML::makeOption( $_CB_framework->acl->mapGroupNamesToValues( 'Administrator' ), _UE_ADMINS_AND_SUPERADMINS_ONLY );
$userprofileEdits[] = moscomprofilerHTML::makeOption( $_CB_framework->acl->mapGroupNamesToValues( 'Superadministrator' ), _UE_SUPERADMINS_ONLY );

$reg_show_icons_explain = array();
$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '1', _UE_TOP );
$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '2', _UE_BOTTOM );
$reg_show_icons_explain[] = moscomprofilerHTML::makeOption( '3', _UE_TOP_AND_BOTTOM );

$icons_display = array();
$icons_display[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
$icons_display[] = moscomprofilerHTML::makeOption( '1', _UE_REQUIRED_ONLY );
$icons_display[] = moscomprofilerHTML::makeOption( '2', _UE_PROFILE_ONLY );
$icons_display[] = moscomprofilerHTML::makeOption( '3', _UE_REQUIRED_AND_PROFILE_ONLY );
$icons_display[] = moscomprofilerHTML::makeOption( '4', _UE_INFO_ONLY );
$icons_display[] = moscomprofilerHTML::makeOption( '5', _UE_REQUIRED_AND_INFO_ONLY );
$icons_display[] = moscomprofilerHTML::makeOption( '6', _UE_PROFILE_AND_INFO_ONLY );
$icons_display[] = moscomprofilerHTML::makeOption( '7', _UE_REQUIRED_PROFILE_AND_INFO );

//TBD NEXT 9 LINES: CB 1.2 RC 2+4 + CB 1.2 specific : remove after !
if ( ! defined( '_UE_USERNAME_OR_EMAIL' ) ) {
DEFINE('_UE_USERNAME_OR_EMAIL','Username or email');
}
if ( ! defined( '_UE_USERNAME_OR_AUTH' ) ) {
DEFINE('_UE_USERNAME_OR_AUTH','Username, email or enabled CMS authentication plugins');
}
if ( ! defined( '_UE_LOGIN_TYPE' ) ) {
DEFINE('_UE_LOGIN_TYPE','Login field type');
}
if ( ! defined( '_UE_LOGIN_TYPE_DESC' ) ) {
DEFINE('_UE_LOGIN_TYPE_DESC','Login can be by username + password, username or email + password, or email + password. The CB login module also adapts accordingly.');
}
$login_type = array();
$login_type[] = moscomprofilerHTML::makeOption( '0', _UE_USERNAME );
$login_type[] = moscomprofilerHTML::makeOption( '1', _UE_USERNAME_OR_EMAIL );
$login_type[] = moscomprofilerHTML::makeOption( '2', _UE_EMAIL );
$login_type[] = moscomprofilerHTML::makeOption( '3', _UE_USERNAME_OR_AUTH );

$translation_debug = array();
$translation_debug[] = moscomprofilerHTML::makeOption( '0', _UE_NO );
$translation_debug[] = moscomprofilerHTML::makeOption( '1', CBTxt::T("Display text markers") );
$translation_debug[] = moscomprofilerHTML::makeOption( '2', CBTxt::T("Display html and text markers") );
$translation_debug[] = moscomprofilerHTML::makeOption( '3', CBTxt::T("Display markers and list untranslated strings") );
$translation_debug[] = moscomprofilerHTML::makeOption( '4', CBTxt::T("Display markers and list all strings") );

$usedivs = array();
$usedivs[] = moscomprofilerHTML::makeOption( '0', CBTxt::T("Use tables") );
$usedivs[] = moscomprofilerHTML::makeOption( '1', CBTxt::T("Use divs (table-less output)") );

// ensure user can't add group higher than themselves
$gtree = $_CB_framework->acl->get_groups_below_me();

$gtree2=array();
$gtree2[] = moscomprofilerHTML::makeOption( -2 , '- ' ._UE_GROUPS_EVERYBODY . ' -' ); // '- Everybody -'
$gtree2[] = moscomprofilerHTML::makeOption( -1, '- ' . _UE_GROUPS_ALL_REG_USERS . ' -' ); // '- All Registered Users -'
$gtree2 = array_merge( $gtree2, $_CB_framework->acl->get_group_children_tree( null, 'USERS', false ));

// Fix initial configuration of gid 0:
$mygrps = array();
if ( $gtree ) foreach ( $gtree as $treegrp ) {
$mygrps[] = $treegrp->value;
}

if ( ( ! isset( $ueConfig['imageApproverGid'] ) ) || ( $ueConfig['imageApproverGid'] == '0' ) || ! in_array( $ueConfig['imageApproverGid'], $mygrps ) ) {
$image_approval = $_CB_framework->acl->mapGroupNamesToValues( 'Administrator' ); // Joomla 1.6 super-admin to fix the default ueConfig for 1.6.
} else {
$image_approval = $ueConfig['imageApproverGid'];
}

$mygtree2 = array();
foreach ( $gtree2 as $treegrp ) {
$mygtree2[] = $treegrp->value;
}

if ( ( ! isset( $ueConfig['allow_profileviewbyGID'] ) ) || ( $ueConfig['allow_profileviewbyGID'] == '0' ) || ! in_array( $ueConfig['allow_profileviewbyGID'], $mygtree2 ) ) {
$allow_profileviewbyGID = $_CB_framework->acl->mapGroupNamesToValues( 'Administrator' ); // Joomla 1.6 super-admin to fix the default ueConfig for 1.6.
} else {
$allow_profileviewbyGID = $ueConfig['allow_profileviewbyGID'];
}

$lists['imageApproverGid'] = moscomprofilerHTML::selectList( $gtree, 'cfg_imageApproverGid', '', 'value', 'text', $image_approval, 2, false, false );
$lists['allow_profileviewbyGID']=moscomprofilerHTML::selectList( $gtree2, 'cfg_allow_profileviewbyGID', '', 'value', 'text', $allow_profileviewbyGID, 2, false, false );
//$lists['allow_listviewbyGID']=moscomprofilerHTML::selectList( $gtree2, 'cfg_allow_listviewbyGID', 'size="4"', 'value', 'text', $ueConfig['allow_listviewbyGID'], 2 );
// registered users only
$tempdir = array();
$_CB_database->setQuery("SELECT `name`,`folder` FROM `#__comprofiler_plugin` WHERE `type`='templates' AND `published`=1 ORDER BY ordering");
//echo $_CB_database->getQuery();
$templates = $_CB_database->loadObjectList();
foreach ( $templates AS $template ) {
$tempdir[] = moscomprofilerHTML::makeOption( $template->folder , $template->name );
}
/*
require($_CB_framework->getCfg('absolute_path').'/components/com_comprofiler/plugin/user/plug_yancintegration/yanc.php');
$getNewslettersTab= new getNewslettersTab();
$newslettersList = $getNewslettersTab->getNewslettersList();
$newslettersRegList = array();
if ($newslettersList !== false) {
foreach ($newslettersList AS $nl) {
$newslettersRegList[] = moscomprofilerHTML::makeOption( $nl->id, $nl->list_name);
}
}
*/
$cbFielfs = new cbFields();
$badHtmlFilter =& $cbFielfs->getInputFilter( array (), array (), 1, 1 );
$lists['_filteredbydefault'] = implode( ' ', $badHtmlFilter->tagBlacklist );
if ( ! isset( $ueConfig['html_filter_allowed_tags'] ) ) {
$ueConfig['html_filter_allowed_tags'] = '';
}

$lists['allow_email_display'] = moscomprofilerHTML::selectList( $emailhandling, 'cfg_allow_email_display', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_email_display'], 2 );

$lists['allow_email_replyto'] = moscomprofilerHTML::selectList( $emailreplyto, 'cfg_allow_email_replyto', 'class="inputbox" size="1"', 'value', 'text', (isset($ueConfig['allow_email_replyto']) ? $ueConfig['allow_email_replyto'] : '1'), 2 );

$lists['name_format'] = moscomprofilerHTML::selectList($nameformats, 'cfg_name_format','class="inputbox" size="1"', 'value', 'text', $ueConfig['name_format'], 2 );

$lists['name_style'] = moscomprofilerHTML::selectList($namestyles, 'cfg_name_style','class="inputbox" size="1"', 'value', 'text', $ueConfig['name_style'], 2 );

$lists['date_format'] = moscomprofilerHTML::selectList($dateformats, 'cfg_date_format','class="inputbox" size="1"', 'value', 'text', $ueConfig['date_format'], 2 );
$lists['calendar_type'] = moscomprofilerHTML::selectList($calendartypes, 'cfg_calendar_type','class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['calendar_type'] ) ? $ueConfig['calendar_type'] : '2' ), 2 );

$lists['usernameedit'] = moscomprofilerHTML::selectList( $yesno, 'cfg_usernameedit', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['usernameedit'], 2 );

$lists['allow_profilelink'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_profilelink', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_profilelink'], 2 );

$lists['allow_email'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_email', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_email'], 2 );
$lists['allow_onlinestatus'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_onlinestatus', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_onlinestatus'], 2 );
$lists['allow_website'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allow_website', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allow_website'], 2 );
$lists['icons_display'] = moscomprofilerHTML::selectList( $icons_display, 'cfg_icons_display', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['icons_display'] ) ? $ueConfig['icons_display'] : '7' ), 2 );
$lists['login_type'] = moscomprofilerHTML::selectList( $login_type, 'cfg_login_type', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['login_type'] ) ? $ueConfig['login_type'] : '0' ), 2 );

$lists['reg_enable_toc'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_enable_toc', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['reg_enable_toc'], 2 );

$lists['admin_allowcbregistration'] = moscomprofilerHTML::selectList( $admin_allowcbregistration, 'cfg_reg_admin_allowcbregistration', 'class="inputbox" size="1"', 'value', 'text', (isset($ueConfig['reg_admin_allowcbregistration']) ? $ueConfig['reg_admin_allowcbregistration'] : '0' ), 2 );
$lists['emailpass'] = moscomprofilerHTML::selectList( $yesno, 'cfg_emailpass', 'class="inputbox" size="1"', 'value', 'text', (isset($ueConfig['emailpass']) ? $ueConfig['emailpass'] : '0' ), 2 );

$lists['admin_approval'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_admin_approval', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['reg_admin_approval'], 2 );

$lists['confirmation'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_confirmation', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['reg_confirmation'], 2 );

$lists['reg_username_checker'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_username_checker', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_username_checker'] ) ? $ueConfig['reg_username_checker'] : '0' ), 2 );
$lists['reg_email_checker'] = moscomprofilerHTML::selectList( $email_checker, 'cfg_reg_email_checker', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_email_checker'] ) ? $ueConfig['reg_email_checker'] : '0' ), 2 );

$lists['reg_show_login_on_page'] = moscomprofilerHTML::selectList( $yesno, 'cfg_reg_show_login_on_page', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_show_login_on_page'] ) ? $ueConfig['reg_show_login_on_page'] : '0' ), 2 );

$lists['reg_show_icons_explain'] = moscomprofilerHTML::selectList( $reg_show_icons_explain, 'cfg_reg_show_icons_explain', 'class="inputbox" size="1"', 'value', 'text', ( isset( $ueConfig['reg_show_icons_explain'] ) ? $ueConfig['reg_show_icons_explain'] : '3' ), 2 );

$lists['allowAvatar'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowAvatar', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowAvatar'], 2 );

$lists['allowAvatarUpload'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowAvatarUpload', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowAvatarUpload'], 2 );
$lists['avatarResizeAlways'] = moscomprofilerHTML::selectList( $yesno, 'cfg_avatarResizeAlways', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['avatarResizeAlways'] ) ? $ueConfig['avatarResizeAlways'] : '1', 2 );

$lists['allowAvatarGallery'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowAvatarGallery', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowAvatarGallery'], 2 );

$lists['avatarUploadApproval'] = moscomprofilerHTML::selectList( $yesno, 'cfg_avatarUploadApproval', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['avatarUploadApproval'], 2 );

$lists['allowUserReports'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowUserReports', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowUserReports'], 2 );
$lists['allowModeratorsUserEdit'] = moscomprofilerHTML::selectList( $userprofileEdits, 'cfg_allowModeratorsUserEdit', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['allowModeratorsUserEdit']) ? $ueConfig['allowModeratorsUserEdit'] : '0', 2 );
$lists['allowUserBanning'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowUserBanning', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowUserBanning'], 2 );
$lists['adminrequiredfields'] = moscomprofilerHTML::selectList( $yesno, 'cfg_adminrequiredfields', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['adminrequiredfields'], 2 );
$lists['moderatorEmail'] = moscomprofilerHTML::selectList( $yesno, 'cfg_moderatorEmail', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['moderatorEmail'], 2 );
$lists['allowModUserApproval'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowModUserApproval', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowModUserApproval'], 2 );
$lists['templatedir'] = moscomprofilerHTML::selectList( $tempdir, 'cfg_templatedir', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['templatedir'], 2 );
$lists['showEmptyTabs'] = moscomprofilerHTML::selectList( $yesno, 'cfg_showEmptyTabs', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['showEmptyTabs'] ) ? $ueConfig['showEmptyTabs'] : 0, 2 );
$lists['showEmptyFields'] = moscomprofilerHTML::selectList( $yesno, 'cfg_showEmptyFields', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['showEmptyFields'] ) ? $ueConfig['showEmptyFields'] : 0, 2 );
$lists['nesttabs'] = moscomprofilerHTML::selectList( $yesno, 'cfg_nesttabs', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['nesttabs'], 2 );
$lists['xhtmlComply'] = moscomprofilerHTML::selectList( $yesno, 'cfg_xhtmlComply', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['xhtmlComply'], 2 );
$lists['frontend_userparams'] = moscomprofilerHTML::selectList( $yesno, 'cfg_frontend_userparams', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['frontend_userparams'] ) ? $ueConfig['frontend_userparams'] : ( in_array( $_CB_framework->getCfg( "frontend_userparams" ), array( '1', null) ) ? '1' : '0' ), 2 );
$lists['use_divs'] = moscomprofilerHTML::selectList( $usedivs, 'cfg_use_divs', 'class="inputbox" size="1"', 'value', 'text', isset( $ueConfig['use_divs'] ) ? $ueConfig['use_divs'] : 0, 2 );
$lists['conversiontype'] = moscomprofilerHTML::selectList( $conversiontype, 'cfg_conversiontype', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['conversiontype'], 2 );
$lists['allowConnections'] = moscomprofilerHTML::selectList( $yesno, 'cfg_allowConnections', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['allowConnections'], 2 );
$lists['useMutualConnections'] = moscomprofilerHTML::selectList( $yesno, 'cfg_useMutualConnections', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['useMutualConnections'], 2 );
$lists['autoAddConnections'] = moscomprofilerHTML::selectList( $yesno, 'cfg_autoAddConnections', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['autoAddConnections'], 2 );
$lists['conNotifyTypes'] = moscomprofilerHTML::selectList( $conNotifyTypes, 'cfg_conNotifyType', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['conNotifyType'], 2 );
$lists['connectionDisplay'] = moscomprofilerHTML::selectList( $connectionDisplay, 'cfg_connectionDisplay', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['connectionDisplay'], 2 );
$lists['connectionPath'] = moscomprofilerHTML::selectList( $yesno, 'cfg_connectionPath', 'class="inputbox" size="1"', 'value', 'text', $ueConfig['connectionPath'], 2 );
$lists['enableSpoofCheck'] = moscomprofilerHTML::selectList( $enableSpoofCheck, 'cfg_enableSpoofCheck', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['enableSpoofCheck']) ? $ueConfig['enableSpoofCheck'] : '1', 2 );
$lists['noVersionCheck'] = moscomprofilerHTML::selectList( $noVersionCheck, 'cfg_noVersionCheck', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['noVersionCheck']) ? $ueConfig['noVersionCheck'] : '0', 2 );
$lists['translations_debug'] = moscomprofilerHTML::selectList( $translation_debug, 'cfg_translations_debug', 'class="inputbox" size="1"', 'value', 'text', isset($ueConfig['translations_debug']) ? $ueConfig['translations_debug'] : '0', 2 );

HTML_comprofiler::showConfig( $ueConfig, $lists, $option );
}

function saveConfig ( $option ) {
global $_CB_framework, $_CB_adminpath, $_POST;

cbimport( 'cb.adminfilesystem' );
$adminFS =& cbAdminFileSystem::getInstance();

$configfile = $_CB_adminpath."/ue_config.php";

//Add code to check if config file is writeable.
if ( $adminFS->isUsingStandardPHP() && ! is_writable($configfile)) {
@chmod ($configfile, 0766);
if (!is_writable($configfile)) {
cbRedirect($_CB_framework->backendUrl( "index.php?option=$option" ), CBTxt::T('FATAL ERROR: Config File Not writeable') );
}
}

// safely evaluate post:

$newConfig = array();
foreach ( $_POST as $k => $v ) {
$newVal = cbGetParam( $_POST, $k, '', _CB_ALLOWRAW | _CB_NOTRIM );
//TBD later when moving to DB storage:
// $newVal = stripslashes( $newVal );
// then check for stripslashes all over the place incl. in configuration display and email of welcome messages
if ( is_array( $newVal ) ) {
$newVal = implode( '|*|', $newVal );
}
if ( strpos( $k, 'cfg_' ) === 0 ) {
$newK = addslashes( substr( $k, 4 ) );
$newConfig[$newK] = $newVal;
}
}

// compose PHP ueconfig.php file:

$txt = "<?php\n";
foreach ( $newConfig as $k => $v ) {
$txt .= "\$ueConfig['" . $k . "']='$v';\n";
}
$txt .= "?>";

// write file:
$result = $adminFS->file_put_contents( $configfile, $txt );
if ( $result ) {
if ( _cbAdmin_chmod( $configfile ) ) {
$msg = CBTxt::T('Configuration file saved');
} else {
$msg = sprintf(CBTxt::T('Failed to change the permissions of the config file %s'), $configfile);
}
} else {
$msg = sprintf(CBTxt::T('Failed to create and write config file in %s'), $configfile);
}

if ( $result !== false ) {

// adapt name fields to new name:
_cbAdaptNameFieldsPublished( $newConfig );

cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showconfig" ), $msg );
} else {
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option" ), $msg . ': ' . CBTxt::T('ERROR: Configuration file administrator/components/com_comprofiler/ue_config.php could not be written by webserver. Please change file permissions in your web-pannel.') );
}
}

function _cbAdaptNameFieldsPublished( &$newConfig ) {
global $_CB_database;

if ( ! isset( $newConfig['this_is_default_config'] ) ) {
// checks and adapts only if it's not the default configuration:
switch ( $newConfig['name_style'] ) {
case 2:
$sqlArray = array( 'name' => 0, 'firstname' => 1, 'middlename' => 0, 'lastname' => 1 );
break;
case 3:
$sqlArray = array( 'name' => 0, 'firstname' => 1, 'middlename' => 1, 'lastname' => 1 );
break;
case 1:
default:
$sqlArray = array( 'name' => 1, 'firstname' => 0, 'middlename' => 0, 'lastname' => 0 );
break;
}
foreach ( $sqlArray as $name => $published ) {
$sql = 'UPDATE #__comprofiler_fields SET '
. $_CB_database->NameQuote( 'published' )
. ' = '
. (int) $published
. ' WHERE '
. $_CB_database->NameQuote( 'name' )
. ' = '
. $_CB_database->Quote( $name )
;
$_CB_database->setQuery( $sql );
if ( ! $_CB_database->query() ) {
echo "<script type=\"text/javascript\"> alert('_cbAdaptNameFieldsPublished: db error: " . addslashes( $_CB_database->getErrorMsg() ) . "'); window.history.go(-1);</script>\n";
exit;
}
}
}
}
function requiredField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

if (count( $cid ) < 1) {
$action = $flag ? CBTxt::T('Make Required') : CBTxt::T('Make Non-required');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET required = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function publishField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

if (count( $cid ) < 1) {
$action = $flag ? CBTxt::T('Publish') : CBTxt::T('UnPublish');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action ) ) . "'); window.history.go(-1);</script>\n";
exit;
}

foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET published = " . (int) $flag . " WHERE fieldid = " . (int) $cids . " AND sys = 0" );
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function registrationField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

if (count( $cid ) < 1) {
$action = $flag ? CBTxt::T('Add to Registration') : CBTxt::T('Remove from Registration');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET registration = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function searchableField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

$flag = $flag ? 1 : 0;
$action = $flag ? CBTxt::T('field searchable in users-lists') : CBTxt::T('field not searchable in users-lists');
if (count( $cid ) < 1) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBtxt::T('Select an item to make %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET searchable = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ), "Made " . $action );
}

function listPublishedField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

if (count( $cid ) < 1) {
$action = $flag ? CBTxt::T('Publish') : CBTxt::T('UnPublish');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_lists SET published = " . (int) $flag . " WHERE listid = " . (int) $cids);
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ) );
}
function tabPublishedField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

if (count( $cid ) < 1) {
$action = $flag ? CBTxt::T('Publish') : CBTxt::T('UnPublish');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_tabs SET enabled = " . (int) $flag . " WHERE tabid = " . (int) $cids);
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showTab" ) );
}
function listDefaultField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

if (count( $cid ) < 1) {
$action = $flag ? CBTxt::T('Make Default') : CBTxt::T('Reset Default');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf(CBTxt::T('Select an item to %s'),$action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

$published = "";
if($flag==1) {
$published = ", published = 1";
}
foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_lists SET `default` = 0");
$_CB_database->query();
$_CB_database->setQuery( "UPDATE #__comprofiler_lists SET `default` = " . (int) $flag . " $published WHERE listid = " . (int) $cids);
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showLists" ) );
}

function profileField( $cid=null, $flag=1, $option ) {
global $_CB_framework, $_CB_database;

if (count( $cid ) < 1) {
$action = $flag ? CBTxt::T('Add to Profile') : CBTxt::T('Remove from Profile');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select an item to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

foreach ($cid AS $cids) {
$_CB_database->setQuery( "UPDATE #__comprofiler_fields SET profile = " . (int) $flag . " WHERE fieldid = " . (int) $cids);
$_CB_database->query();
//print $_CB_database->getquery();
}
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showField" ) );
}

function loadSampleData() {
global $_CB_framework, $_CB_database;
$sql = "SELECT COUNT(*) FROM #__comprofiler_fields"
. "\n WHERE name IN ('website','location','occupation','interests','company','address','city','state','zipcode','country','phone','fax')";
$_CB_database->setQuery($sql);
$fieldCount = $_CB_database->loadresult();

IF($fieldCount < 1) {
$sqlStatements = array();

$sqlStatements[0]['query'] = "INSERT IGNORE INTO `#__comprofiler_tabs` (`tabid`, `title`, `position`, `ordering`, `sys`, `displaytype`) "
."\n VALUES (2, '_UE_ADDITIONAL_INFO_HEADER', 'cb_tabmain', 1, 0, 'tab')";
$sqlStatements[0]['message'] = '<font color="green">' . CBTxt::T('Tab Added Successfully!') . '</font><br />';

$sqlStatements[1]['query'] = "ALTER TABLE `#__comprofiler` ADD `website` varchar(255) default NULL,"
."\n ADD `location` varchar(255) default NULL,"
."\n ADD `occupation` varchar(255) default NULL,"
."\n ADD `interests` varchar(255) default NULL,"
."\n ADD `company` varchar(255) default NULL,"
."\n ADD `address` varchar(255) default NULL,"
."\n ADD `city` varchar(255) default NULL,"
."\n ADD `state` varchar(255) default NULL,"
."\n ADD `zipcode` varchar(255) default NULL,"
."\n ADD `country` varchar(255) default NULL,"
."\n ADD `phone` varchar(255) default NULL,"
."\n ADD `fax` varchar(255) default NULL";
$sqlStatements[1]['message'] = '<font color="green">' . CBTxt::T('Schema Changes Added Successfully!') .'</font><br />';

$sqlStatements[2]['query'] = "INSERT IGNORE INTO `#__comprofiler_fields` (`fieldid`, `name`, `tablecolumns`, `table`, `title`, `type`, `maxlength`, `size`, `required`, `tabid`, `ordering`, `cols`, `rows`, `value`, `default`, `published`, `registration`, `profile`, `calculated`, `sys`, `pluginid`) "
."\n VALUES (30, 'website', 'website', '#__comprofiler', '_UE_Website', 'webaddress', 0, 0, 0, 2, 1, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
."\n (31, 'location', 'location', '#__comprofiler', '_UE_Location', 'text', 50, 25, 0, 2, 2, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
."\n (32, 'occupation', 'occupation', '#__comprofiler', '_UE_Occupation', 'text', 0, 0, 0, 2, 3, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
."\n (33, 'interests', 'interests', '#__comprofiler', '_UE_Interests', 'text', 0, 0, 0, 2, 4, 0, 0, NULL, NULL, 1, 0, 1, 0, 0, 1),"
."\n (34, 'company', 'company', '#__comprofiler', '_UE_Company', 'text', 0, 0, 0, 2, 5, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
."\n (35, 'city', 'city', '#__comprofiler', '_UE_City', 'text', 0, 0, 0, 2, 6, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
."\n (36, 'state', 'state', '#__comprofiler', '_UE_State', 'text', 10, 4, 0, 2, 7, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
."\n (37, 'zipcode', 'zipcode', '#__comprofiler', '_UE_ZipCode', 'text', 0, 0, 0, 2, 8, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
."\n (38, 'country', 'country', '#__comprofiler', '_UE_Country', 'text', 0, 0, 0, 2, 9, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
."\n (40, 'address', 'address', '#__comprofiler', '_UE_Address', 'text', 0, 0, 0, 2, 10, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
."\n (43, 'phone', 'phone', '#__comprofiler', '_UE_PHONE', 'text', 0, 0, 0, 2, 11, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1),"
."\n (44, 'fax', 'fax', '#__comprofiler', '_UE_FAX', 'text', 0, 0, 0, 2, 12, 0, 0, NULL, NULL, 1, 1, 1, 0, 0, 1)";
$sqlStatements[2]['message'] = '<font color="green">' . CBTxt::T('Fields Added Successfully!') . '</font><br />';

$groups = implode( ', ', $_CB_framework->acl->mapGroupNamesToValues( array( 'Public', 'Registered', 'Author', 'Editor', 'Publisher', 'Manager', 'Administrator', 'Superadministrator' ) ) );
$groupPublic = $_CB_framework->acl->mapGroupNamesToValues( 'Public' );
$sqlStatements[3]['query'] = "INSERT INTO `#__comprofiler_lists` (`listid`, `title`, `description`, `published`, `default`, `usergroupids`, `sortfields`, `col1title`, `col1enabled`, `col1fields`, `col2title`, `col2enabled`, `col1captions`, `col2fields`, `col2captions`, `col3title`, `col3enabled`, `col3fields`, `col3captions`, `col4title`, `col4enabled`, `col4fields`, `col4captions`) "
."\n VALUES (2, 'Members List', 'my Description', 1, 1, '" . $groups . "', '`username` ASC', 'Image', 1, '" . $groupPublic . "', 'Username', 1, 0, '42', 0, 'Other', 1, '26|*|28|*|27', 1, '', 0, '', 0)";

$sqlStatements[3]['message'] = '<font color="green">' . CBTxt::T('List Added Successfully!') . '</font><br />';

foreach ($sqlStatements AS $sql) {
$_CB_database->setQuery($sql['query']);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
} else {
print $sql['message'];
}
//print $_CB_database->getquery();
}
} else {
print CBTxt::T('Sample Data is already loaded!');
}
}

function syncUsers() {
global $_CB_database, $ueConfig, $_PLUGINS;

// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

$_PLUGINS->loadPluginGroup('user');
$messages = $_PLUGINS->trigger( 'onBeforeSyncUser', true );
foreach ( $messages as $msg ) {
if ( $msg ) {
echo "<p>" . $msg . "</p>";
}
}
// 0a. delete user table for bad rows
$sql = "DELETE FROM #__users WHERE id = 0";
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s not allowed user id 0 entry.'), $affected) . "</font></p>";
}

// 0b. delete comprofiler table for bad rows
$sql = "DELETE FROM #__comprofiler WHERE id = 0";
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s not allowed user id 0 entry.'), $affected) . "</font></p>";
}


// 1. add missing comprofiler entries, guessing naming depending on CB's name style:
switch ( $ueConfig['name_style'] ) {
case 2:
// firstname + lastname:
$sql = "INSERT IGNORE INTO #__comprofiler(id,user_id,lastname,firstname) "
." SELECT id,id, SUBSTRING_INDEX(name,' ',-1), "
."SUBSTRING( name, 1, length( name ) - length( SUBSTRING_INDEX( name, ' ', -1 ) ) -1 ) "
." FROM #__users";
break;
case 3:
// firstname + middlename + lastname:
$sql = "INSERT IGNORE INTO #__comprofiler(id,user_id,middlename,lastname,firstname) "
. " SELECT id,id,SUBSTRING( name, INSTR( name, ' ' ) +1,"
." length( name ) - INSTR( name, ' ' ) - length( SUBSTRING_INDEX( name, ' ', -1 ) ) -1 ),"
." SUBSTRING_INDEX(name,' ',-1),"
." IF(INSTR(name,' '),SUBSTRING_INDEX( name, ' ', 1 ),'') "
. " FROM #__users";
break;
default:
// name only:
$sql = "INSERT IGNORE INTO #__comprofiler(id,user_id) SELECT id,id FROM #__users";
break;
}
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to Community Builder from users Table.'), $affected) . "</font></p>";
}

$sql = "UPDATE #__comprofiler SET `user_id`=`id`";
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Fixed %s existing entries in Community Builder: fixed wrong user_id.'), $affected) . "</font></p>";
}

// 2. remove excessive comprofiler entries (e.g. if admin used mambo/joomla delete user function:
$sql = "SELECT c.id FROM #__comprofiler c LEFT JOIN #__users u ON u.id = c.id WHERE u.id IS NULL";
$_CB_database->setQuery($sql);
$users = $_CB_database->loadResultArray();
if ($_CB_database->getErrorNum()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
if (count($users)) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Removing %s entries from Community Builder missing in users Table.'), count($users)) . "</font></p>";
$msg = deleteUsers($users, true);
print "<p>".$msg."</p>";
}
print "<font color=green>" . CBTxt::T('Joomla/Mambo User Table and Joomla/Mambo Community Builder User Table now in sync!') . "</font>";

$messages = $_PLUGINS->trigger( 'onAfterSyncUser', true );
foreach ( $messages as $msg ) {
if ( $msg ) {
echo "<p>" . $msg . "</p>";
}
}
}

function checkcbdb( $dbId = 0 ) {
global $_CB_database, $_CB_framework, $ueConfig, $_PLUGINS;

// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

HTML_comprofiler::secureAboveForm('checkcbdb');

outputCbTemplate( 2 );
outputCbJs( 2 );

global $_CB_Backend_Title;
$_CB_Backend_Title = array( 0 => array( 'cbicon-48-tools', CBTxt::T('CB Tools: Check database: Results') ) );

$cbSpoofField = cbSpoofField();
$cbSpoofString = cbSpoofString( null, 'cbtools' );

$version = $_CB_database->getVersion();
$version = substr( $version, 0, strpos( $version, '-' ) );

if ( $dbId == 0 ) {

echo "<div style='text-align:left;'><p>". CBTxt::T('Checking Community Builder Database') .":</p>";

// 1. check comprofiler_field_values table for bad rows
$sql = "SELECT fieldvalueid,fieldid FROM #__comprofiler_field_values WHERE fieldid=0";
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in Community Builder comprofiler_field_values have bad fieldid values.'), count($bad_rows)) . "</font></p>";
foreach ($bad_rows as $bad_row) {
if ( $bad_row->fieldvalueid == 0 ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ZERO fieldvalueid illegal: fieldvalueid=%s fieldid=0'), $bad_row->fieldvalueid) . "</font></p>";
} else {
echo "<p><font color=red>fieldvalueid=" . $bad_row->fieldvalueid . " fieldid=0</font></p>";
}
}
echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixcbmiscdb&$cbSpoofField=$cbSpoofString" ) . '"> ' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
} else {
echo "<p><font color=green>" . CBTxt::T('All Community Builder comprofiler_field_values table fieldid rows all match existing fields.') . "</font></p>";
}

// 2. check if comprofiler_field_values table has entries where corresponding fieldtype value in comprofiler_fields table
// does not allow values
$sql = "SELECT v.fieldvalueid, v.fieldid, f.name, f.type FROM #__comprofiler_field_values as v, #__comprofiler_fields as f WHERE v.fieldid = f.fieldid AND f.type NOT IN ('checkbox','multicheckbox','select','multiselect','radio')";
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in Community Builder comprofiler_field_values link back to fields of wrong fieldtype.'), count($bad_rows)) . "</font></p>";
foreach ($bad_rows as $bad_row) {
echo "<p><font color=red>fieldvalueid=" . $bad_row->fieldvalueid . " fieldtype=" . $bad_row->type ."</font></p>";
}
echo "<p><font color=red>" . CBTxt::T('This one can be fixed in SQL using a tool like phpMyAdmin.') . "</font></p>";
// not done automatically since some fields might have field values ! echo '<p><font color=red>This one can be fixed by <strong>first backing up database</strong> then <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixcbmiscdb&$cbSpoofField=$cbSpoofString" ) . '">by clicking here</a>.</font></p>';
} else {
echo "<p><font color=green>" . CBTxt::T('All Community Builder comprofiler_field_values table rows link to correct fieldtype fields in comprofiler_field table.') . "</font></p>";
}

// 5. check if all cb defined fields have corresponding comprofiler columns
$sql = "SELECT * FROM #__comprofiler";
$_CB_database->setQuery($sql, 0, 1);
$all_comprofiler_fields_and_values = $_CB_database->loadAssoc();

$all_comprofiler_fields = array();
if ( $all_comprofiler_fields_and_values === null ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif ( is_array( $all_comprofiler_fields_and_values ) ) {
while ( false != ( list( $_cbfield ) = each( $all_comprofiler_fields_and_values ) ) ) {
array_push( $all_comprofiler_fields, $_cbfield );
}
}

$sql = "SELECT * FROM #__comprofiler_fields WHERE `name` != 'NA' AND `table` = '#__comprofiler'";
$_CB_database->setQuery( $sql );
$field_rows = $_CB_database->loadObjectList( null, 'moscomprofilerFields', array( &$_CB_database ) );
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} else {
$html_output = array();
$cb11 = true;
foreach ( $field_rows as $field_row ) {
if ( $field_row->tablecolumns !== null ) {
// CB 1.2 way:
if ( $field_row->tablecolumns != '' ) {
$tableColumns = explode( ',', $field_row->tablecolumns );
foreach ( $tableColumns as $col ) {
if ( ! in_array( $col, $all_comprofiler_fields ) ) {
$html_output[] = "<p><font color=red>" . sprintf(CBTxt::T(' - Field %s - Column %s is missing from comprofiler table.'), $field_row->name, $col) . "</font></p>";
}
}
}
$cb11 = false;
} else {
// cb 1.1 way
if ( ! in_array( $field_row->name, $all_comprofiler_fields ) ) {
$html_output[] = "<p><font color=red>" . sprintf(CBTxt::T(' - Column %s is missing from comprofiler table.'), $field_row->name) . "</font></p>";
}
}
}
if ( count( $html_output ) > 0 ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('There are %s column(s) missing in the comprofiler table, which are defined as fields (rows in comprofiler_fields):'), count( $html_output )) . "</font></p>";
echo implode( '', $html_output );
echo "<p><font color=red>" . CBTxt::T('This one can be fixed by deleting and recreating the field(s) using components / Community Builder / Field Management.') . '<br />' . CBTxt::T('Please additionally make sure that columns in comprofiler table <strong>are not also duplicated in users table</strong>.') . "</font></p>";
} elseif ( $cb11 ) {
echo "<p><font color=red>" . CBTxt::T('All Community Builder fields from comprofiler_fields are present as columns in the comprofiler table, but comprofiler_fields table is not yet upgraded to CB 1.2 table structure. Just going to Community Builder Fields Management will fix this automatically.') . "</font></p>";
} else {
echo "<p><font color=green>" . CBTxt::T('All Community Builder fields from comprofiler_fields are present as columns in the comprofiler table.') . "</font></p>";
}
}
// 9. Check if images/comprofiler is writable:
$folder = 'images/comprofiler/';
if ( $ueConfig['allowAvatarUpload'] == 1 ) {
echo "<p>Checking Community Builder folders:</p>";
if ( ! is_writable( $_CB_framework->getCfg('absolute_path'). '/' . $folder ) ) {
echo '<font color="red">' . sprintf(CBTxt::T('Avatars and thumbnails folder: %s/%s is NOT writeable by the webserver.'), $_CB_framework->getCfg('absolute_path'), $folder) . ' </font>';
} else {
echo '<font color="green">' . CBTxt::T('Avatars and thumbnails folder is Writeable.') . '</font>';
}
}

cbimport( 'cb.dbchecker' );
$dbChecker = new CBdbChecker( $_CB_database );
$result = $dbChecker->checkCBMandatoryDb( false );
$dbName = CBTxt::T('Core CB mandatory basics');
$messagesAfter = array();
$messagesBefore = array();
HTML_comprofiler::fixcbdbShowResults( $dbChecker, false, false, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );

$dbChecker = new CBdbChecker( $_CB_database );
$result = $dbChecker->checkDatabase( false );

$_PLUGINS->loadPluginGroup('user');
$messagesAfter = $_PLUGINS->trigger( 'onAfterCheckCbDb', true );

$dbName = CBTxt::T('Core CB');
$messagesBefore = array();
HTML_comprofiler::fixcbdbShowResults( $dbChecker, false, false, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
echo '</div>';
// adapt published fields to global CB config (regarding name type)
_cbAdaptNameFieldsPublished( $ueConfig );

} elseif ( $dbId == 1 ) {
// Check plugins db:
$dbName = CBTxt::T('CB plugin');
$messagesBefore = array();
$messagesAfter = array();

cbimport( 'cb.installer' );
$sql = 'SELECT `id`, `name` FROM `#__comprofiler_plugin` ORDER BY `ordering`';
$_CB_database->setQuery( $sql );
$plugins = $_CB_database->loadObjectList();
if ( ! $_CB_database->getErrorNum() ) {
$cbInstaller = new cbInstallerPlugin();
foreach ( $plugins as $plug ) {
$result = $cbInstaller->checkDatabase( $plug->id, false );
if ( is_bool( $result ) ) {
HTML_comprofiler::fixcbdbShowResults( $cbInstaller, false, false, $result, $messagesBefore, $messagesAfter, $dbName . ' "' . $plug->name . '"', $dbId, false );
} elseif ( is_string( $result ) ) {
echo '<div style="color:orange;">' . $dbName . ' "' . $plug->name . '"' . ': ' . $result . '</div>';
} else {
echo '<div style="color:black;">' . sprintf(CBTxt::T('%s "%s": no database or no database description.'),$dbName ,$plug->name) . '</div>';
}
}
}
$dbName = CBTxt::T('CB plugins');
$null = null;
HTML_comprofiler::fixcbdbShowResults( $null, false, false, $result, array(), array(), $dbName, $dbId, true );

} elseif ( $dbId == 2 ) {

echo "<div style='text-align:left;'><p>" . CBTxt::T('Checking Users Database') . ":</p>";

// 3. check if comprofiler table is in sync with users table
$sql = "SELECT c.id FROM #__comprofiler c LEFT JOIN #__users u ON u.id = c.id WHERE u.id IS NULL";
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in Community Builder comprofiler table without corresponding user table rows.'), count($bad_rows)) . "</font></p>";
$badids = array();
foreach ($bad_rows as $bad_row) {
$badids[(int) $bad_row->id] = $bad_row->id;
}
echo "<p><font color=red>" . sprintf(CBTxt::T('Following comprofiler id: %s are missing in user table'), implode( ', ', $badids )) . ( isset( $badids[0] ) ? " " . CBtxt::T('This comprofiler entry with id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
} else {
echo "<p><font color=green>" . CBTxt::T('All Community Builder comprofiler table rows have links to user table.') . "</font></p>";
}

// 4. check if users table is in sync with comprofiler table
$sql = "SELECT u.id FROM #__users u LEFT JOIN #__comprofiler c ON c.id = u.id WHERE c.id IS NULL";
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in users table without corresponding comprofiler table rows.'), count($bad_rows)) . "</font></p>";
$badids = array();
foreach ($bad_rows as $bad_row) {
$badids[(int) $bad_row->id] = $bad_row->id;
}
echo "<p><font color=red>" . sprintf(CBTxt::T('users id: %s are missing in comprofiler table'), implode( ', ', $badids )) . "</font></p>";
echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
} else {
echo "<p><font color=green>" . CBTxt::T('All users table rows have links to comprofiler table.') . "</font></p>";
}

// 6. check if users table has id=0 in it
$sql = "SELECT u.id FROM #__users u WHERE u.id = 0";
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in users table with id=0.'), count($bad_rows)) . "</font></p>";
foreach ($bad_rows as $bad_row) {
echo "<p><font color=red>" . sprintf(CBTxt::T('users id=%s is not allowed.'), $bad_row->id) . "</font></p>";
}
echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
// echo "<p><font color=red>" . CBTxt::T('This one can be fixed in SQL using a tool like phpMyAdmin.') . " <strong><u>" . CBTxt::T('You also need to check in SQL if id is autoincremented.') . "<u><strong></font></p>";
} else {
echo "<p><font color=green>" . CBTxt::T('users table has no zero id row.') . "</font></p>";
}
// 7. check if comprofiler table has id=0 in it
$sql = "SELECT c.id FROM #__comprofiler c WHERE c.id = 0";
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in comprofiler table with id=0.'), count($bad_rows)) . "</font></p>";
foreach ($bad_rows as $bad_row) {
echo "<p><font color=red>" . sprintf(CBTxt::T('comprofiler id=%s is not allowed.'), $bad_row->id) . "</font></p>";
}
echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components / Community Builder / Tools and then click "Synchronize users".') . "</font></p>";
} else {
echo "<p><font color=green>" . CBTxt::T('comprofiler table has no zero id row.') . "</font></p>";
}
// 8. check if comprofiler table has user_id != id in it
$sql = "SELECT c.id, c.user_id FROM #__comprofiler c WHERE c.id <> c.user_id";
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in comprofiler table with user_id <> id.'), count($bad_rows)) . "</font></p>";
foreach ($bad_rows as $bad_row) {
echo "<p><font color=red>" . sprintf(CBTxt::T('comprofiler id=%s is different from user_id=%s.'), $bad_row->id, $bad_row->user_id) . "</font></p>";
}
echo "<p><font color=red>" . CBTxt::T('This one can be fixed using menu Components-&gt; Community Builder-&gt; tools and then click `Synchronize users`.') . "</font></p>";
} else {
echo "<p><font color=green>" . CBTxt::T('All rows in comprofiler table have user_id columns identical to id columns.') . "</font></p>";
}

// 10. check if #__core_acl_aro table is in sync with users table : A: user -> aro
if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
if ( checkJversion() == 2 ) {
$sql = "SELECT u.id FROM #__users u LEFT JOIN #__user_usergroup_map a ON a.user_id = CAST( u.id AS CHAR ) WHERE a.user_id IS NULL";
} else {
$sql = "SELECT u.id FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL";
}
} else {
if ( checkJversion() == 2 ) {
$sql = "SELECT u.id FROM #__users u LEFT JOIN #__user_usergroup_map a ON a.user_id = u.id WHERE a.user_id IS NULL";
} else {
$sql = "SELECT u.id FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = u.id WHERE a.value IS NULL";
}
}
// SELECT u.id FROM jos_users u LEFT JOIN jos_core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL
// INSERT INTO jos_core_acl_aro (section_value,value,order_value,name,hidden) SELECT 'users' AS section_value, u.id AS value, 0 AS order_value, u.name as name, 0 AS hidden FROM jos_users u LEFT JOIN jos_core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL;
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif ( count( $bad_rows ) != 0 ) {
echo "<p><font color=red>";
if ( checkJversion() == 2 ) {
echo sprintf(CBTxt::T('Warning: %s entries in the users table without corresponding user_usergroup_map table rows.'), count($bad_rows));
} else {
echo sprintf(CBTxt::T('Warning: %s entries in the users table without corresponding core_acl_aro table rows.'), count($bad_rows));
}
echo "</font></p>";
$badids = array();
foreach ($bad_rows as $bad_row) {
$badids[(int) $bad_row->id] = $bad_row->id;
}
echo "<p><font color=red>";
if ( checkJversion() == 2 ) {
echo sprintf(CBTxt::T('user id: %s are missing in user_usergroup_map table'), implode( ', ', $badids ));
} else {
echo sprintf(CBTxt::T('user id: %s are missing in core_acl_aro table'), implode( ', ', $badids ));
}
echo ( isset( $badids[0] ) ? " " . CBTxt::T('This user entry with id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
} else {
echo "<p><font color=green>";
if ( checkJversion() == 2 ) {
echo CBTxt::T('All users table rows have ACL entries in user_usergroup_map table.');
} else {
echo CBTxt::T('All users table rows have ACL entries in core_acl_aro table.');
}
echo "</font></p>";
}

// 11. check if #__core_acl_aro table is in sync with users table : B: aro -> user
if ( checkJversion() == 2 ) {
$sql = "SELECT a.user_id AS id FROM #__user_usergroup_map a LEFT JOIN #__users u ON u.id = a.user_id WHERE u.id IS NULL";
} elseif ( checkJversion() == 1 ) {
$sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
} else {
$sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
// SELECT a.value AS id, a.aro_id FROM jos_core_acl_aro a LEFT JOIN jos_users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL
// DELETE a FROM jos_core_acl_aro AS a LEFT JOIN jos_users AS u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL
}
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in the core_acl_aro table without corresponding users table rows.'), count($bad_rows)) . "</font></p>";
$badids = array();
foreach ($bad_rows as $bad_row) {
$badids[(int) $bad_row->id] = "user id=" . $bad_row->id . " (aro_id=" . $bad_row->aro_id . ")";
}
echo "<p><font color=red>" . CBTxt::P('Following entries of [tablename1] table are missing in [tablename2] table: [badids].', array( '[tablename1]' => ( checkJversion() == 2 ? 'user_usergroup_map' : 'core_acl_aro' ), '[tablename2]' => 'users', '[badids]' => implode( ', ', $badids ))) . ( isset( $badids[0] ) ? "<br /> " . CBTxt::T('This core_acl_aro entry with (user) value 0 should be removed, as it\'s not allowed.') : "" ) . ( ( $bad_row->aro_id == 0 ) ? " " . CBtxt::T('This core_acl_aro entry with aro_id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
} else {
echo "<p><font color=green>" . CBTxt::P('All [tablename1] table rows have corresponding entries in [tablename2] table.', array( '[tablename1]' => ( checkJversion() == 2 ? 'ACL user_usergroup_map' : 'ACL core_acl_aro' ), '[tablename2]' => 'users') ) . "</font></p>";
}

// 12. check if #__core_acl_groups_aro_map table is in sync with #__core_acl_aro table A: aro -> groups
if ( checkJversion() <= 1 ) {
if ( checkJversion() == 1 ) {
$sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
} else {
$sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
// SELECT a.value AS id, a.aro_id FROM jos_core_acl_aro a LEFT JOIN jos_core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL
// INSERT INTO jos_core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.aro_id, '', 18 AS group_id FROM jos_core_acl_aro a LEFT JOIN jos_core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL
}
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in the core_acl_aro table without corresponding core_acl_groups_aro_map table rows.'), count($bad_rows)) . "</font></p>";
$badids = array();
foreach ($bad_rows as $bad_row) {
$badids[(int) $bad_row->id] = "user id=" . $bad_row->id . " (aro_id=" . $bad_row->aro_id . ")";
}
echo "<p><font color=red>" . sprintf(CBTxt::T('Following entries of core_acl_aro table are missing in core_acl_groups_aro_map table: %s.'), implode( ', ', $badids )) . ( isset( $badids[0] ) ? "<br /> " . CBTxt::T('This core_acl_aro entry with (user) value 0 should be removed, as it\'s not allowed.') : "" ) . ( ( $bad_row->aro_id == 0 ) ? " " . CBtxt::T('This core_acl_aro entry with aro_id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('then by clicking here') . '</a>.</font></p>';
} else {
echo "<p><font color=green>" . CBTxt::T('All core_acl_aro table rows have ACL entries in core_acl_groups_aro_map table.') . "</font></p>";
}
}

// 13. check if #__core_acl_groups_aro_map table is in sync with #__core_acl_aro table B: groups -> aro
if ( checkJversion() <= 1 ) {
if ( checkJversion() == 1 ) {
$sql = "SELECT g.aro_id AS id FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.id = g.aro_id WHERE a.id IS NULL";
} else {
$sql = "SELECT g.aro_id AS id FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL";
// SELECT g.aro_id AS id FROM jos_core_acl_groups_aro_map g LEFT JOIN jos_core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL
// DELETE g FROM jos_core_acl_groups_aro_map g LEFT JOIN jos_core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL
}
$_CB_database->setQuery($sql);
$bad_rows = $_CB_database->loadObjectList();
if ( $_CB_database->getErrorNum() ) {
echo "<p><font color=red>" . sprintf(CBTxt::T('ERROR: sql query: %s : returned error: %s'), htmlspecialchars( $sql ), stripslashes( $_CB_database->getErrorMsg() )) . "</font></p>";
} elseif (count($bad_rows)!=0) {
echo "<p><font color=red>" . sprintf(CBTxt::T('Warning: %s entries in the core_acl_groups_aro_map without corresponding core_acl_aro table table rows.'), count($bad_rows)) . "</font></p>";
$badids = array();
foreach ($bad_rows as $bad_row) {
$badids[(int) $bad_row->id] = $bad_row->id;
}
echo "<p><font color=red>" . sprintf(CBTxt::T('aro_id = %s are missing in core_acl_aro table table.'),implode( ', ', $badids )) . ( isset( $badids[0] ) ? " " . CBTxt::T('This entry with aro_id 0 should be removed, as it\'s not allowed.') : "" ) . "</font></p>";
echo '<p><font color=red>' . CBTxt::T('This one can be fixed by <strong>first backing up database</strong>') . ' <a href="' . $_CB_framework->backendUrl( "index.php?option=com_comprofiler&task=fixacldb&$cbSpoofField=$cbSpoofString" ) . '">' . CBTxt::T('by clicking here') . '</a>.</font></p>';
} else {
echo "<p><font color=green>" . CBTxt::T('All core_acl_aro table rows have ACL entries in core_acl_groups_aro_map table.') . "</font></p>";
}
}

$dbName = CBTxt::T('Users');
echo '</div>';

} elseif ( $dbId == 3 ) {
// adapt published fields to global CB config (regarding name type)
_cbAdaptNameFieldsPublished( $ueConfig );

// Check fields db:
cbimport( 'cb.dbchecker' );
$dbChecker = new CBdbChecker( $_CB_database );
$result = $dbChecker->checkAllCBfieldsDb( false );
$dbName = CBTxt::T('CB fields data storage');
$messagesBefore = array();

$_PLUGINS->loadPluginGroup('user');
$messagesAfter = $_PLUGINS->trigger( 'onAfterCheckCbFieldsDb', true );

HTML_comprofiler::fixcbdbShowResults( $dbChecker, false, false, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
echo '</div>';
}

global $_CB_Backend_Title;
$_CB_Backend_Title = array( 0 => array( 'cbicon-48-tools', sprintf(CBTxt::T("CB Tools: Check %s database: Results"),$dbName) ) );
}

function fixacldb() {
global $_CB_database;
// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );
$version = $_CB_database->getVersion();
$version = substr( $version, 0, strpos( $version, '-' ) );

if ( checkJversion() <= 1 ) {
// 1. put #__core_acl_aro table in sync with users table : A: user -> aro
if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
$sql = "INSERT INTO #__core_acl_aro (section_value,value,order_value,name,hidden) SELECT 'users' AS section_value, u.id AS value, 0 AS order_value, u.name as name, 0 AS hidden FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = CAST( u.id AS CHAR ) WHERE a.value IS NULL";
} else {
$sql = "INSERT INTO #__core_acl_aro (section_value,value,order_value,name,hidden) SELECT 'users' AS section_value, u.id AS value, 0 AS order_value, u.name as name, 0 AS hidden FROM #__users u LEFT JOIN #__core_acl_aro a ON a.section_value = 'users' AND a.value = u.id WHERE a.value IS NULL";
}

$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to core_acl_aro table from users Table.'), $affected) . "</font></p>";
}

// 2. delete #__core_acl_aro table entries which are not in users table : B: aro -> user
if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
if ( checkJversion() == 2 ) {
$sql = "DELETE a FROM #__user_usergroup_map a LEFT JOIN #__users u ON u.id = a.user_id WHERE u.id IS NULL";
} elseif ( checkJversion() == 1 ) {
$sql = "DELETE a FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
} else {
$sql = "DELETE a FROM #__core_acl_aro a LEFT JOIN #__users u ON u.id = a.value WHERE a.section_value = 'users' AND u.id IS NULL";
}
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s core_acl_aro entries which didn\'t correspond to users table.'), $affected) ."</font></p>";
}
}
}

// 3. add missing #__core_acl_groups_aro_map table entries to put in sync with #__core_acl_aro table A: aro -> groups
if ( checkJversion() == 2 ) {
$sql = "INSERT INTO #__user_usergroup_map (user_id,group_id) SELECT u.id AS user_id, 2 AS group_id FROM #__users u LEFT JOIN #__user_usergroup_map g ON g.user_id = u.id WHERE g.user_id IS NULL";
} elseif ( checkJversion() == 1 ) {
// $sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.id AS aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
} else {
// $sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
}
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to core_acl_groups_aro_map table from core_acl_aro Table.'),$affected) . "</font></p>";
}

if ( checkJversion() <= 1 ) {
// 4. delete #__core_acl_groups_aro_map table entries which are not in sync with #__core_acl_aro table B: groups -> aro
if ( ! cbStartOfStringMatch( $version, '3.23' ) ) {
if ( checkJversion() == 1 ) {
$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.id = g.aro_id WHERE a.id IS NULL";
} else {
$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL";
}
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s core_acl_groups_aro_map entries which didn\'t correspond to core_acl_aro table.'), $affected) . "</font></p>";
}
}
}

print "<font color=green>" . CBTxt::T('Joomla/Mambo User Table and Joomla/Mambo ACL Table should now be in sync!') . "</font>";

}

function fixcbdb( $dryRun, $dbId = 0 ) {
global $_CB_database, $ueConfig, $_PLUGINS;

// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

$dryRun = ( $dryRun == 1 );

if ( $dbId == 0 ) {
$dbName = CBTxt::T('Core CB');

// Fix mandatory basics of core CB:
cbimport( 'cb.dbchecker' );
$dbChecker = new CBdbChecker( $_CB_database );
$result = $dbChecker->checkCBMandatoryDb( true, $dryRun );
$dbName = CBTxt::T('Core CB mandatory basics');
$messagesAfter = array();
$messagesBefore = array();

ob_start();
HTML_comprofiler::fixcbdbShowResults( $dbChecker, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
$html = ob_get_contents();
ob_end_clean();


// Fix core CB:

$_PLUGINS->loadPluginGroup('user');
$messagesBefore = $_PLUGINS->trigger( 'onBeforeFixDb', array( $dryRun ) );
$messagesBefore[] = $html;
$dbName = CBTxt::T('Core CB');
$dbChecker = new CBdbChecker( $_CB_database );
$result = $dbChecker->checkDatabase( true, $dryRun );

$messagesAfter = $_PLUGINS->trigger( 'onAfterFixDb', array( $dryRun ) );

// adapt published fields to global CB config (regarding name type)
_cbAdaptNameFieldsPublished( $ueConfig );

} elseif ( $dbId == 1 ) {
// Fix plugin $dbId:
$dbName = CBTxt::T('CB plugin');
$messagesBefore = array();
$messagesAfter = array();

cbimport( 'cb.installer' );
$sql = 'SELECT `id`, `name` FROM `#__comprofiler_plugin` ORDER BY `ordering`';
$_CB_database->setQuery( $sql );
$plugins = $_CB_database->loadObjectList();
if ( ! $_CB_database->getErrorNum() ) {
$cbInstaller = new cbInstallerPlugin();
foreach ( $plugins as $plug ) {
$result = $cbInstaller->checkDatabase( $plug->id, true, $dryRun );
if ( is_bool( $result ) ) {
HTML_comprofiler::fixcbdbShowResults( $cbInstaller, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName . ' "' . $plug->name . '"', $dbId, false );
} elseif ( is_string( $result ) ) {
echo '<div style="color:orange;">' . $dbName . ' "' . $plug->name . '"' . ': ' . $result . '</div>';
} else {
echo '<div style="color:black;">' . sprintf(CBTxt::T('%s "%s": no database or no database description.'),$dbName ,$plug->name) . '</div>';
}
}
}
$dbName = CBTxt::T('CB plugins');

} elseif ( $dbId == 3 ) {
// adapt published fields to global CB config (regarding name type)
_cbAdaptNameFieldsPublished( $ueConfig );

$_PLUGINS->loadPluginGroup('user');
$messagesBefore = $_PLUGINS->trigger( 'onBeforeFixFieldsDb', array( $dryRun ) );

// Check fields db:
cbimport( 'cb.dbchecker' );
$dbChecker = new CBdbChecker( $_CB_database );
$result = $dbChecker->checkAllCBfieldsDb( true, $dryRun );
$dbName = CBTxt::T('CB fields data storage');
$messagesAfter = array();
}
HTML_comprofiler::secureAboveForm('fixcbdb');

outputCbTemplate( 2 );
outputCbJs( 2 );

global $_CB_Backend_Title;
$_CB_Backend_Title = array( 0 => array( 'cbicon-48-tools', sprintf(CBTxt::T("CB Tools: Fix %s database: "),$dbName) . ( $dryRun ? CBTxt::T('Dry-run:') : CBTxt::T('Fixed:') ) . " " .CBTXT::T("Results") ) );

HTML_comprofiler::fixcbdbShowResults( $dbChecker, true, $dryRun, $result, $messagesBefore, $messagesAfter, $dbName, $dbId );
}

function fixcbmiscdb() {
global $_CB_database;
// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

// 1. delete comprofiler_field_values table for bad rows
$sql = "DELETE FROM #__comprofiler_field_values WHERE fieldid=0";
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s comprofiler_field_values entries which didn\'t match any field.'), $affected) . "</font></p>";
}

// 2. delete comprofiler_field_values table has entries where corresponding fieldtype value in comprofiler_fields table
// does not allow values
/* not done ! as some new fields might not be listed in here ! :
$sql = "DELETE v FROM #__comprofiler_field_values as v, #__comprofiler_fields as f WHERE v.fieldid = f.fieldid AND f.type NOT IN ('checkbox','multicheckbox','select','multiselect','radio')";
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s comprofiler_field_values entries which didn\'t match any field.'), $affected) . "</font></p>";
}
*/
// 3. add missing #__core_acl_groups_aro_map table entries to put in sync with #__core_acl_aro table A: aro -> groups
if ( checkJversion() == 1 ) {
// $sql = "SELECT a.value AS id, a.id AS aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.id AS aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.id WHERE g.aro_id IS NULL";
} else {
// $sql = "SELECT a.value AS id, a.aro_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
$sql = "INSERT INTO #__core_acl_groups_aro_map (aro_id,section_value,group_id) SELECT a.aro_id, '', 18 AS group_id FROM #__core_acl_aro a LEFT JOIN #__core_acl_groups_aro_map g ON g.aro_id = a.aro_id WHERE g.aro_id IS NULL";
}
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Added %s new entries to core_acl_groups_aro_map table from core_acl_aro Table.'),$affected) . "</font></p>";
}

// 4. delete #__core_acl_groups_aro_map table entries which are not in sync with #__core_acl_aro table B: groups -> aro
if ( checkJversion() == 1 ) {
$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.id = g.aro_id WHERE a.id IS NULL";
} else {
$sql = "DELETE g FROM #__core_acl_groups_aro_map g LEFT JOIN #__core_acl_aro a ON a.aro_id = g.aro_id WHERE a.aro_id IS NULL";
}
$_CB_database->setQuery($sql);
if (!$_CB_database->query()) {
print("<font color=red>" . sprintf(CBTxt::T('SQL error %s'), $_CB_database->stderr(true)) . "</font><br />");
return;
}
$affected = $_CB_database->getAffectedRows();
if ($affected) {
print "<p><font color='orange'>" . sprintf(CBTxt::T('Deleted %s core_acl_groups_aro_map entries which didn\'t correspond to core_acl_aro table.'), $affected) . "</font></p>";
}

print "<font color=green>" . CBTxt::T('Joomla/Mambo User Table and Joomla/Mambo ACL Table should now be in sync!') . "</font>";

}


function loadTools() {
HTML_comprofiler::showTools();
}

/**
* Compacts the ordering sequence of the selected records
* @param array of table key ids which need to get saved ($row[]->ordering contains old ordering and $_POST['order'] contains new ordering)
* @param object derived from comprofilerDBTable of corresponding class
* @param string Additional "WHERE" query to limit ordering to a particular subset of records
*/
function saveOrder( $cid, &$row, $conditionStatement ) {
global $_CB_database,$_POST;

$total = count( $cid );
$order = cbGetParam( $_POST, 'order', array(0) );
$conditions = array();
$cidsChanged = array();

// update ordering values
for( $i=0; $i < $total; $i++ ) {
$row->load( (int) $cid[$i] );
if ($row->ordering != $order[$i]) {
$row->ordering = $order[$i];
if (!$row->store( (int) $cid[$i])) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf(CBTxt::T('saveOrder:%s'), $_CB_database->getErrorMsg())) . "'); window.history.go(-1); </script>\n";
exit();
} // if
$cidsChanged[] = $cid[$i];
// remember to updateOrder this group if multiple groups (conditionStatement gives the group)
if ($conditionStatement) {
$condition=null; // to make php checker happy: the next line defines $condition
eval($conditionStatement);
$found = false;
foreach ( $conditions as $cond )
if ($cond[1]==$condition) {
$found = true;
break;
} // if
if (!$found) $conditions[] = array($cid[$i], $condition);
}
} // if
} // for

if ($conditionStatement) {
// execute updateOrder for each group
foreach ( $conditions as $cond ) {
$row->load( (int) $cond[0] );
$row->updateOrder( $cond[1], $cidsChanged );
} // foreach
} else if ($cidsChanged) {
$row->load( (int) $cidsChanged[0] );
$row->updateOrder( null, $cidsChanged );
}
return CBTxt::T('New ordering saved');
} // saveOrder

function saveFieldOrder( &$cid ) {
global $_CB_framework, $_CB_database;
$row = new moscomprofilerFields( $_CB_database );
$msg = saveOrder( $cid, $row, "\$condition = \"tabid=\$row->tabid\";" );
cbRedirect( $_CB_framework->backendUrl( 'index.php?option=com_comprofiler&task=showField' ), $msg );
} // saveFieldOrder

function saveTabOrder( &$cid ) {
global $_CB_framework, $_CB_database;
$row = new moscomprofilerTabs( $_CB_database );
$msg = saveOrder( $cid, $row, "\$condition = \"position='\$row->position' AND ordering > -10000 AND ordering < 10000 \";" );
cbRedirect( $_CB_framework->backendUrl( 'index.php?option=com_comprofiler&task=showTab' ), $msg );
} // saveTabOrder saveOrder

function saveListOrder( &$cid ) {
global $_CB_framework, $_CB_database;
$row = new moscomprofilerLists( $_CB_database );
$msg = saveOrder( $cid, $row, null );
cbRedirect( $_CB_framework->backendUrl( 'index.php?option=com_comprofiler&task=showLists' ), $msg );
} // saveListOrder saveOrder




//plugin
function viewPlugins( $option ) {
global $_CB_database, $_CB_framework;

$limit = (int) $_CB_framework->getCfg( 'list_limit' );
if ( $limit == 0 ) {
$limit = 10;
}
$limit = $_CB_framework->getUserStateFromRequest( "viewlistlimit", 'limit', $limit );
$lastCBlist = $_CB_framework->getUserState( "view{$option}lastCBlist", null );
if ($lastCBlist == 'showplugins') {
$limitstart = $_CB_framework->getUserStateFromRequest( "view{$option}limitstart", 'limitstart', 0 );
$lastSearch = $_CB_framework->getUserState( "search{$option}", null );
$search = $_CB_framework->getUserStateFromRequest( "search{$option}", 'search', '' );
if ($lastSearch != $search) {
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
}
$search = trim( strtolower( $search ) );
$filter_type = $_CB_framework->getUserStateFromRequest( "filter_type{$option}", 'filter_type', "0" );
} else {
clearSearchBox();
$search="";
$limitstart = 0;
$_CB_framework->setUserState( "view{$option}limitstart", $limitstart );
$_CB_framework->setUserState( "view{$option}lastCBlist", "showplugins" );
$filter_type = "0";
$_CB_framework->setUserState( "filter_type{$option}", $filter_type );
}
$where=array();

// used by filter
if ( $filter_type ) {
$where[] = "m.type = '$filter_type'";
}
if ( $search ) {
$search = cbEscapeSQLsearch( trim( strtolower( cbGetEscaped($search))));
$where[] = "LOWER( m.name ) LIKE '%$search%'";
}

if ( ! $_CB_framework->acl->amIaSuperAdmin() ) {
$viewAccessLevels = CBuser::getMyInstance()->getAuthorisedViewLevelsIds( true );
$viewAccessLevelsCleaned = implode( ',', cbArrayToInts( $viewAccessLevels ) );
$where[] = 'm.access IN ('. $viewAccessLevelsCleaned . ')';
}
// get the total number of records
$query = "SELECT COUNT(*) FROM #__comprofiler_plugin AS m ". ( count( $where ) ? "\n WHERE " . implode( ' AND ', $where ) : '' );
$_CB_database->setQuery( $query );
$total = $_CB_database->loadResult();
if ($total <= $limitstart) $limitstart = 0;

cbimport( 'cb.pagination' );
$pageNav = new cbPageNav( $total, $limitstart, $limit );

if ( checkJversion() == 2 ) {
$title = 'title';
} else {
$title = 'name';
}

$query = "SELECT m.*, u.name AS editor, g.$title AS groupname"
. "\n FROM #__comprofiler_plugin AS m"
. "\n LEFT JOIN #__users AS u ON u.id = m.checked_out";

if ( checkJversion() == 2 ) {
$query .= "\n LEFT JOIN #__viewlevels AS g ON g.id = m.access + IF(m.access <= 2, 1, 0)"; // fix J1.6's wrong access levels, same as g.id = IF( m.access = 0, 1, IF( m.access = 1, 2, IF( m.access = 2, 3, m.access ) ) )
} else {
$query .= "\n LEFT JOIN #__groups AS g ON g.id = m.access";
}

$query .= ( count( $where ) ? "\n WHERE " . implode( ' AND ', $where ) : '' )
. "\n GROUP BY m.id"
. "\n ORDER BY m.type ASC, m.ordering ASC, m.name ASC";
$_CB_database->setQuery( $query, (int) $pageNav->limitstart, (int) $pageNav->limit );
$rows = $_CB_database->loadObjectList();
if ($_CB_database->getErrorNum()) {
echo $_CB_database->stderr();
return false;
}

// get list of Positions for dropdown filter
$query = "SELECT type AS value, type AS text"
. "\n FROM #__comprofiler_plugin"
. "\n GROUP BY type"
. "\n ORDER BY type"
;
$types[] = moscomprofilerHTML::makeOption( '0', (!defined('_SEL_TYPE')) ? '- ' . CBTxt::T('Select Type') . ' -' : _SEL_TYPE ); // Mambo 4.5.1 Compatibility
$_CB_database->setQuery( $query );
$types = array_merge( $types, $_CB_database->loadObjectList() );
$lists['type'] = moscomprofilerHTML::selectList( $types, 'filter_type', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'value', 'text', $filter_type, 2 );

$canAdmin = CBuser::getMyInstance()->authoriseAction( 'core.admin' );
$canEdit = CBuser::getMyInstance()->authoriseAction( 'core.edit' );
$canEditState = CBuser::getMyInstance()->authoriseAction( 'core.edit.state' );
HTML_comprofiler::showPlugins( $rows, $pageNav, $option, $lists, $search, $canAdmin, $canEdit, $canEditState );
return true;
}


/**
* Deletes one or more plugins
*
* Also deletes associated entries in the #__comprofiler_plugin table.
* @param array An array of unique category id numbers
*/
function removePlugin( &$cid, $option ) {
if (count( $cid ) < 1) {
echo "<script type=\"text/javascript\"> alert('" . addslashes( CBTxt::T('Select a plugin to delete') ) . "'); window.history.go(-1);</script>\n";
exit;
}
$installer = new cbInstallerPlugin();
foreach($cid AS $id) {
$ret = $installer->uninstall($id,$option);
if ( ! $ret ) {
break;
}
}
if ( $ret ) {
HTML_comprofiler::showInstallMessage( $installer->getError(), CBTxt::T('Uninstall Plugin') . ' - '.($ret ? CBTxt::T('Success') : CBTxt::T('Failed')),
$installer->returnTo( $option, 'showPlugins' ) );
}
}

/**
* Publishes or Unpublishes one or more plugins
* @param array An array of unique category id numbers
* @param integer 0 if unpublishing, 1 if publishing
*/
function publishPlugin( $cid=null, $publish=1, $option ) {
global $_CB_database, $_CB_framework;

if (count( $cid ) < 1) {
$action = $publish ? CBTxt::T('publish') : CBTxt::T('unpublish');
echo "<script type=\"text/javascript\"> alert('" . addslashes( sprintf( CBTxt::T('Select a plugin to %s'), $action) ) . "'); window.history.go(-1);</script>\n";
exit;
}

cbArrayToInts($cid);

if ( $publish == 0 ) {
foreach ( $cid as $id ) {
$row = new moscomprofilerPlugin( $_CB_database );
if ( $row->load( (int) $id ) ) {
if ( ( $row->type == "language" ) && $row->published ) {
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), CBTxt::T('Language plugins cannot be unpublished, only uninstalled'), 'error' );
} elseif ( ( $row->id == 1 ) && $row->published ) {
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), CBTxt::T('Core plugin cannot be unpublished'), 'error' );
}
} else {
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), CBTxt::T('Plugin can not be found'), 'error' );
}
}
}
$cids = implode( ',', $cid );

$query = "UPDATE #__comprofiler_plugin SET published = " . (int) $publish
. "\n WHERE id IN ($cids)"
. "\n AND ((checked_out = 0) OR (checked_out = " . (int) $_CB_framework->myId() . "))"
;
$_CB_database->setQuery( $query );
if (!$_CB_database->query()) {
echo "<script type=\"text/javascript\"> alert('".$_CB_database->getErrorMsg()."'); window.history.go(-1); </script>\n";
exit();
}

if (count( $cid ) == 1) {
$row = new moscomprofilerPlugin( $_CB_database );
$row->checkin( $cid[0] );
}

cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
}

/**
* Cancels an edit operation
*/
function cancelPlugin( $option) {
global $_CB_framework, $_CB_database, $_POST;

$row = new moscomprofilerPlugin( $_CB_database );
$row->bind( $_POST );
$row->checkin();

cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
}

function cancelPluginAction( $option) {
global $_CB_framework, $_POST;

$pluginId = (int) cbGetParam( $_POST, 'cid' );
if ( $pluginId ) {
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=editPlugin&cid=$pluginId" ) );
} else {
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
}
}

/**
* Moves the order of a record
* @param integer The unique id of record
* @param integer The increment to reorder by
*/
function orderPlugin( $uid, $inc, $option ) {
global $_CB_framework, $_CB_database;

$row = new moscomprofilerPlugin( $_CB_database );
$row->load( (int) $uid );
$row->move( $inc, "type='$row->type' AND ordering > -10000 AND ordering < 10000 " );

cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
}

/**
* changes the access level of a record
* @param integer The increment to reorder by
*/
function accessMenu( $uid, $access, $option ) {
global $_CB_framework, $_CB_database;

switch ( $access ) {
case 'accesspublic':
$access = 0;
break;

case 'accessregistered':
$access = 1;
break;

case 'accessspecial':
$access = 2;
break;
}

$row = new moscomprofilerPlugin( $_CB_database );
$row->load( (int) $uid );
$row->access = $access;

if ( !$row->check() ) {
return $row->getError();
}
if ( !$row->store() ) {
return $row->getError();
}

cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ) );
return null;
}

function savePluginOrder( &$cid, $option ) {
global $_CB_framework, $_CB_database;
$row = new moscomprofilerPlugin( $_CB_database );
$msg = saveOrder( $cid, $row, "\$condition = \"type='\$row->type' AND ordering > -10000 AND ordering < 10000 \";" );
cbRedirect( $_CB_framework->backendUrl( "index.php?option=$option&task=showPlugins" ), $msg );
} // savePluginOrder

function installPluginUpload() {
global $_FILES;

// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

HTML_comprofiler::secureAboveForm('showPlugins');

outputCbTemplate( 2 );
outputCbJs( 2 );
initToolTip( 2 );

$option = "com_comprofiler";
$task = "showPlugins";
$client = 0;
//echo "installPluginUpload";

$installer = new cbInstallerPlugin();

// Check if file uploads are enabled
if ( ! (bool) ini_get( 'file_uploads' ) ) {
HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before file uploads are enabled. Please use the install from directory method.'),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
exit();
}

// Check that the zlib is available
if( ! extension_loaded( 'zlib' ) ) {
HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before zlib is installed'),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
exit();
}

$userfile = cbGetParam( $_FILES, 'userfile', null );

if ( ! $userfile || ( $userfile == null ) ) {
HTML_comprofiler::showInstallMessage( CBTxt::T('No file selected'), CBTxt::T('Upload new plugin - error'),
$installer->returnTo( $option, $task, $client ));
exit();
}

// $userfile['tmp_name'] = stripslashes( $userfile['tmp_name'] );
// $userfile['name'] = stripslashes( $userfile['name'] );

$msg = '';
$localName = $_FILES['userfile']['name'];
$resultdir = uploadFile( $_FILES['userfile']['tmp_name'], $localName , $msg ); // $localName is updated here

if ( $resultdir !== false ) {
if ( ! $installer->upload( $localName ) ) {
if ( $installer->unpackDir() ) {
$installer->cleanupInstall( $localName, $installer->unpackDir() );
}
HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf(CBTxt::T('Upload %s - Upload Failed'), $task),
$installer->returnTo( $option, $task, $client ) );
}
$ret = $installer->install();

$installer->cleanupInstall( $localName, $installer->unpackDir() );

HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf(CBTxt::T('Upload %s - '), $task) . ( $ret ? CBTxt::T('Success') : CBTxt::T('Failed') ),
$installer->returnTo( $option, $task, $client ) );
$installer->cleanupInstall( $localName, $installer->unpackDir() );
} else {
HTML_comprofiler::showInstallMessage( $msg, sprintf(CBTxt::T('Upload %s - Upload Error'), $task),
$installer->returnTo( $option, $task, $client ) );
}

}

function _cbAdmin_chmod( $filename ) {
global $_CB_framework;

cbimport( 'cb.adminfilesystem' );
$adminFS =& cbAdminFileSystem::getInstance();

$origmask = null;
if ( $_CB_framework->getCfg( 'dirperms' ) == '' ) {
// rely on umask
// $mode = 0777;
return true;
} else {
$origmask = @umask( 0 );
$mode = octdec( $_CB_framework->getCfg( 'dirperms' ) );
}

$ret = $adminFS->chmod( $filename, $mode );

if ( isset( $origmask ) ) {
@umask( $origmask );
}
return $ret;
}

function uploadFile( $filename, &$userfile_name, &$msg ) {
global $_CB_framework;

cbimport( 'cb.adminfilesystem' );
$adminFS =& cbAdminFileSystem::getInstance();

$baseDir = _cbPathName( $_CB_framework->getCfg('tmp_path') );
$userfile_name = $baseDir . $userfile_name; // WARNING: this parameter is returned !

if ( $adminFS->file_exists( $baseDir ) ) {
if ( $adminFS->is_writable( $baseDir ) ) {
if ( move_uploaded_file( $filename, $userfile_name ) ) {
// if ( _cbAdmin_chmod( $userfile_name ) ) {
return true;
// } else {
// $msg = CBTxt::T('Failed to change the permissions of the uploaded file.');
// }
} else {
$msg = sprintf( CBTxt::T('Failed to move uploaded file to %s directory.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
}
} else {
$msg = sprintf( CBTxt::T('Upload failed as %s directory is not writable.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
}
} else {
$msg = sprintf( CBTxt::T('Upload failed as %s directory does not exist.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
}
return false;
}

function installPluginDir() {
// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

HTML_comprofiler::secureAboveForm('showPlugins');

outputCbTemplate( 2 );
outputCbJs( 2 );
initToolTip( 2 );

$option="com_comprofiler";
$task="showPlugins";
$client=0;
// echo "installPluginDir";

$installer = new cbInstallerPlugin();

$userfile = cbGetParam( $_REQUEST, 'userfile', null );

// Check if file name exists
if (!$userfile) {
HTML_comprofiler::showInstallMessage( CBTxt::T('No file selected'), CBTxt::T('Install new plugin from directory - error'),
$installer->returnTo( $option, $task, $client ) );
exit();
}

$path = _cbPathName( $userfile );
if (!is_dir( $path )) {
$path = dirname( $path );
}

$ret = $installer->install( $path);

HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf( CBTxt::T('Install new plugin from directory %s'), $userfile ) . ' - ' . ( $ret ? CBTxt::T('Success') : CBTxt::T('Failed') ),
$installer->returnTo( $option, $task, $client ) );
}


function installPluginURL() {
global $_CB_framework;

// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

HTML_comprofiler::secureAboveForm('showPlugins');

outputCbTemplate( 2 );
outputCbJs( 2 );
initToolTip( 2 );

$option="com_comprofiler";
$task="showPlugins";
$client=0;
// echo "installPluginURL";

$installer = new cbInstallerPlugin();

// Check that the zlib is available
if(!extension_loaded('zlib')) {
HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before zlib is installed'),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
exit();
}

$userfileURL = cbGetParam( $_REQUEST, 'userfile', null );

if (!$userfileURL) {
HTML_comprofiler::showInstallMessage( CBTxt::T('No URL selected'), CBTxt::T('Upload new plugin - error'),
$installer->returnTo( $option, $task, $client ));
exit();
}


cbimport( 'cb.adminfilesystem' );
$adminFS =& cbAdminFileSystem::getInstance();

if ( $adminFS->isUsingStandardPHP() ) {
$baseDir = _cbPathName( $_CB_framework->getCfg('tmp_path') );
} else {
$baseDir = $_CB_framework->getCfg( 'absolute_path' ) . '/tmp/';
}
$userfileName = $baseDir . 'comprofiler_temp.zip';


$msg = '';
//echo "step-uploadfile<br />";
$resultdir = uploadFileURL( $userfileURL, $userfileName, $msg );

if ($resultdir !== false) {
//echo "step-upload<br />";
if (!$installer->upload( $userfileName )) {
HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf(CBTxt::T('Download %s - Upload Failed'), $userfileURL),
$installer->returnTo( $option, $task, $client ) );
}
//echo "step-install<br />";
$ret = $installer->install();

if ( $ret ) {
HTML_comprofiler::showInstallMessage( $installer->getError(), sprintf( CBTxt::T('Download %s'), $userfileURL ) . ' - ' . ( $ret ? CBTxt::T('Success') : CBTxt::T('Failed') ),
$installer->returnTo( $option, $task, $client ) );
}
$installer->cleanupInstall( $userfileName, $installer->unpackDir() );
} else {
HTML_comprofiler::showInstallMessage( $msg, sprintf(CBTxt::T('Download %s - Download Error'), $userfileURL),
$installer->returnTo( $option, $task, $client ) );
}

}

function uploadFileURL( $userfileURL, $userfile_name, &$msg ) {
global $_CB_framework;

cbimport( 'cb.snoopy' );
cbimport( 'cb.adminfilesystem' );
$adminFS =& cbAdminFileSystem::getInstance();

if ( $adminFS->isUsingStandardPHP() ) {
$baseDir = _cbPathName( $_CB_framework->getCfg('tmp_path') );
} else {
$baseDir = $_CB_framework->getCfg( 'absolute_path' ) . '/tmp';
}

if ( file_exists( $baseDir ) ) {
if ( $adminFS->is_writable( $baseDir ) || ! $adminFS->isUsingStandardPHP() ) {

$s = new CBSnoopy();
$fetchResult = @$s->fetch( $userfileURL );

if ( $fetchResult && ! $s->error && ( $s->status == 200 ) ) {
cbimport( 'cb.adminfilesystem' );
$adminFS =& cbAdminFileSystem::getInstance();
if ( $adminFS->file_put_contents( $baseDir . $userfile_name, $s->results ) ) {
if ( _cbAdmin_chmod( $baseDir . $userfile_name ) ) {
return true;
} else {
$msg = sprintf(CBTxt::T('Failed to change the permissions of the uploaded file %s'), $baseDir.$userfile_name);
}
} else {
$msg = sprintf(CBTxt::T('Failed to create and write uploaded file in %s'), $baseDir.$userfile_name);
}
} else {
$msg = ( $s->error ? sprintf( CBTxt::T('Failed to download package file from <code>%s</code> to webserver due to following error: %s'), $userfileURL, $s->error ) :
sprintf( CBTxt::T('Failed to download package file from <code>%s</code> to webserver due to following status: %s'), $userfileURL, $s->status . ': ' . $s->response_code ) );
}
} else {
$msg = sprintf( CBTxt::T('Upload failed as %s directory is not writable.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
}
} else {
$msg = sprintf( CBTxt::T('Upload failed as %s directory does not exist.'), '<code>' . htmlspecialchars( $baseDir ) . '</code>' );
}
return false;
}


// Ajax: administrator/index.php?option=com_comprofiler&task=latestVersion :
function latestVersion(){
global $_CB_framework, $ueConfig;

cbimport( 'cb.snoopy' );

$s = new CBSnoopy();
$s->read_timeout = 90;
$s->referer = $_CB_framework->getCfg( 'live_site' );
@$s->fetch('http://www.joomlapolis.com/versions/comprofilerversion.php?currentversion='.urlencode($ueConfig['version']));
$version_info = $s->results;
$version_info_pos = strpos($version_info, ":");
if ($version_info_pos === false) {
$version = $version_info;
$info = null;
} else {
$version = substr( $version_info, 0, $version_info_pos );
$info = substr( $version_info, $version_info_pos + 1 );
}
if($s->error || $s->status != 200){
echo '<font color="red">' . CBTxt::T('Connection to update server failed') . ': ' . CBTxt::T('ERROR') . ': ' . $s->error . ($s->status == -100 ? CBTxt::T('Timeout') : $s->status).'</font>';
} else if($version == $ueConfig['version']){
echo '<font color="green">' . $version . '</font>' . $info;
} else {
echo '<font color="red">' . $version . '</font>' . $info;
}
}

// NB for now duplicated in frontend and admin backend:
function tabClass( $option, $task, $uid ) {
global $_PLUGINS, $_REQUEST, $_POST;

if ( $uid ) {
$cbUser =& CBuser::getInstance( (int) $uid );
if ( $cbUser ) {
$user =& $cbUser->getUserData();
} else {
$cbUser =& CBuser::getInstance( null );
$user = null;
}
} else {
$cbUser =& CBuser::getInstance( null );
$user = null;
}

$unsecureChars = array( '/', '\\', ':', ';', '{', '}', '(', ')', "\"", "'", '.', ',', "\0", ' ', "\t", "\n", "\r", "\x0B" );
if ( $task == 'fieldclass' ) {
if ( $user && $user->id ) {
$uid = $user->id;
} else {
$uid = 0;
}

$msg = checkCBpermissions( array($uid), "edit", true );
if ( $msg ) {
echo $msg;
return;
}

$fieldName = trim( substr( str_replace( $unsecureChars, '', urldecode( stripslashes( cbGetParam( $_REQUEST, "field" ) ) ) ), 0, 50 ) );
if ( ! $fieldName ) {
echo CBTxt::T('no field');
return;
}
} elseif ( $task == 'tabclass' ) {
$tabClassName = urldecode( stripslashes( cbGetParam( $_REQUEST, "tab" ) ) );
if ( ! $tabClassName ) {
return;
}
$pluginName = null;
$tabClassName = substr( str_replace( $unsecureChars, '', $tabClassName ), 0, 32 );
$method = 'getTabComponent';
} elseif ( $task == 'pluginclass' ) {
$pluginName = urldecode( stripslashes( cbGetParam( $_REQUEST, "plugin" ) ) );
if ( ! $pluginName ) {
return;
}
$tabClassName = 'CBplug_' . strtolower( substr( str_replace( $unsecureChars, '', $pluginName ), 0, 32 ) );
$method = 'getCBpluginComponent';
}
$tabs = $cbUser->_getCbTabs( false );
if ( $task == 'fieldclass' ) {
$result = $tabs->fieldCall( $fieldName, $user, $_POST, 'edit' );
} else {
$result = $tabs->tabClassPluginTabs( $user, $_POST, $pluginName, $tabClassName, $method );
}
if ( $result === false ) {
if( $_PLUGINS->is_errors() ) {
echo "<script type=\"text/javascript\">alert(\"" . $_PLUGINS->getErrorMSG() . "\"); </script>\n";
}
} elseif ( $result !== null ) {
echo $result;
}
}

function finishInstallation( $option ) {
global $_CB_framework, $ueConfig, $task;

// Try extending time, as unziping/ftping took already quite some... :
@set_time_limit( 240 );

HTML_comprofiler::secureAboveForm('finishInstallation');

$tgzFile = $_CB_framework->getCfg( 'absolute_path' ) . '/administrator/components/com_comprofiler/pluginsfiles.tgz';
$installerFile = $_CB_framework->getCfg( 'absolute_path' ) . '/administrator/components/com_comprofiler/';
if ( file_exists( $installerFile . 'comprofiler.xml' ) ) {
$installerFile .= 'comprofiler.xml';
} elseif ( file_exists( $installerFile . 'comprofilej.xml' ) ) {
$installerFile .= 'comprofilej.xml';
} elseif ( file_exists( $installerFile . 'comprofileg.xml' ) ) {
$installerFile .= 'comprofileg.xml';
}

if ( ! file_exists( $tgzFile ) ) {
echo _UE_NOT_AUTHORIZED;
return;
}

$installer = new cbInstallerPlugin();
$client = 2;

// Check that the zlib is available
if(!extension_loaded('zlib')) {
HTML_comprofiler::showInstallMessage( CBTxt::T('The installer cannot continue before zlib is installed'),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, $task, $client ) );
exit();
}

if ( ! $installer->upload( $tgzFile, true, false ) ) {
HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T("Uncompressing %s failed."), $tgzFile),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
exit();
}

$installFrom = $installer->installDir();
$installTo = $_CB_framework->getCfg( 'absolute_path' ) . '/components/com_comprofiler/plugin';
$filesList = cbReadDirectory( $installFrom, '.', true );
// create directories and remove them from file list:
if ( ! $installer->mosMakePath( dirname( $installTo ) . '/', 'plugin' ) ) {
HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T('Failed to create directory "%s"'), $installTo . '/plugin' ),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
exit();
}
foreach ( $filesList as $k => $file ) {
if ( basename( $file ) != $file ) {
$newdir = dirname( $file );
if ( ! $installer->mosMakePath( $installTo . '/', $newdir ) ) {
HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T('Failed to create directory "%s"'), $installTo . '/' . $newdir ),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
exit();
}
}
if ( ! is_file( $installFrom . '/' . $file ) ) {
unset( $filesList[$k] );
}
}

$result = $installer->copyFiles( $installFrom, $installTo, $filesList, true );
if ( $result === false ) {
HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T("Copying plugin files failed with error: %s"), $installer->getError()),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
exit();
}

$adminFS =& cbAdminFileSystem::getInstance();
$result = $adminFS->deldir( _cbPathName( $installFrom . '/' ) );
if ( $result === false ) {
HTML_comprofiler::showInstallMessage( CBTxt::T('Deleting expanded tgz file directory failed with an error.'),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
}
$tgzFileOS = _cbPathName( $tgzFile, false );
$result = $adminFS->unlink( $tgzFileOS );
if ( $result === false ) {
HTML_comprofiler::showInstallMessage( sprintf(CBTxt::T("Deleting file %s failed with an error."),$tgzFileOS),
CBTxt::T('Installer - Error'), $installer->returnTo( $option, '', 2 ) );
}

// adapt published fields to global CB config (regarding name type)
_cbAdaptNameFieldsPublished( $ueConfig );

$htmlToDisplay = $_CB_framework->getUserState( 'com_comprofiler_install' );
// clears the session buffer memory after installaion done:
$_CB_framework->setUserState( 'com_comprofiler_install', '' );

cbimport( 'cb.xml.simplexml' );
$installerXml = new CBSimpleXMLElement( file_get_contents( $installerFile ) );
if ( is_object( $installerXml ) ) {
$description = $installerXml->getElementByPath( 'description' );
if ( $description !== false ) {
echo '<h2>' . $description->data() . '</h2>';
}
}
echo $htmlToDisplay;
?>
<div style="font-weight:bold;font-size:110%;background:#ffffe4;border:2px green solid;padding:5px;margin-bottom:20px;"><font color="green"><?php echo CBTxt::T('Second and last installation step of Community Builder Component (comprofiler) done successfully.') ?></font></div><br />
<div style="font-weight:bold;font-size:125%;background:#ffffe4;border:2px green solid;padding:5px;">
<font color="green"><b><?php echo CBTxt::T('Installation finished. Important: Please read README.TXT and installation manual for further settings.'); ?> <br /><br /><?php echo CBTxt::T('We also have a PDF installation guide as well as a complete documentation available on'); ?> <a href="http://www.joomlapolis.com">www.joomlapolis.com</a> <?php echo CBTxt::T('which will help you making the most out of your Community Builder installation, while supporting this project, as well as plugins and templates.'); ?></b></font>
</div>
<?php
$_CB_framework->setUserState( "com_comprofiler_install", '' );
}

?>
(5-5/7)