Файл: apwa/stk/includes/database_cleaner/database_cleaner_controller.php
Строк: 814
<?php
/**
*
* @package Support Toolkit - Database Cleaner
* @version $Id$
* @copyright (c) 2009 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
exit;
}
/**
* Class that contains all methods that actuall perform the actions
*/
class database_cleaner_controller
{
/**
* @var database_cleaner_data The database cleaner data object
*/
var $db_cleaner = array();
function database_cleaner_controller($db_cleaner)
{
$this->db_cleaner = $db_cleaner;
}
/**
* Reset all bots
*/
function bots($error)
{
global $config, $db;
if (isset($_POST['yes']))
{
$sql = 'SELECT group_id, group_colour
FROM ' . GROUPS_TABLE . "
WHERE group_name = 'BOTS'";
$result = $db->sql_query($sql);
$group_id = (int) $db->sql_fetchfield('group_id', false, $result);
$group_colour = $db->sql_fetchfield('group_colour', 0, $result);
$db->sql_freeresult($result);
if (!$group_id)
{
// If we reach this point then something has gone very wrong
$error[] = 'NO_BOT_GROUP';
return $error;
}
else
{
if (!function_exists('user_add'))
{
include(PHPBB_ROOT_PATH . 'includes/functions_user.' . PHP_EXT);
}
// Remove existing bots
$uids = array();
$sql = 'SELECT user_id FROM ' . BOTS_TABLE;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$uids[] = $row['user_id'];
}
$db->sql_freeresult($result);
if (!empty($uids))
{
// Remove all the bots
foreach ($uids as $uid)
{
user_delete('remove', $uid);
}
// Clear out the bots table
$db->sql_query('DELETE FROM ' . BOTS_TABLE);
}
// Add the bots
foreach ($this->db_cleaner->data->bots as $bot_name => $bot_ary)
{
/* Clean the users table of any bots matching this...
* this is an issue if a default bot was removed from the bots group. */
$username_clean = utf8_clean_string($bot_name);
if (empty($username_clean))
{
// This shouldn't happen but we should handle it anyway...
continue;
}
$sql = 'DELETE FROM ' . USERS_TABLE . ' WHERE username_clean = '' . $db->sql_escape($username_clean) . ''';
$db->sql_query($sql);
// `$bot_ary` can be false, if a bot was removed in a certain phpBB version
if ($bot_ary === false)
{
continue;
}
$user_row = array(
'user_type' => USER_IGNORE,
'group_id' => $group_id,
'username' => $bot_name,
'user_regdate' => time(),
'user_password' => '',
'user_colour' => $group_colour,
'user_email' => '',
'user_lang' => $config['default_lang'],
'user_style' => 1,
'user_timezone' => 0,
'user_dateformat' => $config['default_dateformat'],
'user_allow_massemail' => 0,
);
$user_id = user_add($user_row);
if ($user_id)
{
$sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
'bot_active' => 1,
'bot_name' => (string) $bot_name,
'user_id' => (int) $user_id,
'bot_agent' => (string) $bot_ary[0],
'bot_ip' => (string) $bot_ary[1],
));
$result = $db->sql_query($sql);
}
}
}
}
}
/**
* Fix the database columns.
*
* - Add removed columns
* - Remove added columns
*/
function columns($error, $selected)
{
global $umil;
foreach ($this->db_cleaner->data->tables as $table_name => $data)
{
// Don't touch this table
if ($table_name == PROFILE_FIELDS_DATA_TABLE)
{
continue;
}
$existing_columns = get_columns($table_name);
if ($existing_columns === false)
{
// Table doesn't exist, don't handle here.
continue;
}
$columns = array_unique(array_merge(array_keys($data['COLUMNS']), $existing_columns));
foreach ($columns as $column)
{
if (isset($selected[$table_name . '_' . $column]))
{
if (!isset($data['COLUMNS'][$column]) && in_array($column, $existing_columns))
{
$result = $umil->table_column_remove($table_name, $column);
if (stripos($result, 'SQL ERROR'))
{
$error[] = $result;
}
}
else if (isset($data['COLUMNS'][$column]) && !in_array($column, $existing_columns))
{
// This can return an error under some circumstances, like when trying to add an auto-increment field (hope to hell nobody drops one of those)
$result = $umil->table_column_add($table_name, $column, $data['COLUMNS'][$column]);
if (stripos($result, 'SQL ERROR'))
{
$error[] = $result;
}
// We can re-add *some* keys
if (isset($data['KEYS']))
{
if (in_array($column, $data['KEYS']))
{
if ($data['KEYS'][$column][0] == 'INDEX' && $data['KEYS'][$column][1] == $column)
{
$result = $umil->table_index_add($table_name, $column, $column);
if (stripos($result, 'SQL ERROR'))
{
$error[] = $result;
}
}
}
}
}
}
}
}
return $error;
}
/**
* Fix the config items
*
* - Add removed entries
* - Remove added entries
*/
function config($error, $selected)
{
global $db;
$config_rows = $existing_config = array();
get_config_rows($this->db_cleaner->data->config, $config_rows, $existing_config);
foreach ($config_rows as $name)
{
if (isset($this->db_cleaner->data->config[$name]) && in_array($name, $existing_config))
{
continue;
}
if (isset($selected[$name]))
{
if (isset($this->db_cleaner->data->config[$name]) && !in_array($name, $existing_config))
{
// Add it with the default settings we've got...
set_config($name, $this->db_cleaner->data->config[$name]['config_value'], $this->db_cleaner->data->config[$name]['is_dynamic']);
}
else if (!isset($this->db_cleaner->data->config[$name]) && in_array($name, $existing_config))
{
// Remove it
$db->sql_query('DELETE FROM ' . CONFIG_TABLE . " WHERE config_name = '" . $db->sql_escape($name) . "'");
}
}
}
return $error;
}
/**
* Fix the extension groups
*/
function extension_groups($error, $selected)
{
global $db;
$extension_groups_rows = $existing_extension_groups = array();
get_extension_groups_rows($this->db_cleaner->data->extension_groups, $extension_groups_rows, $existing_extension_groups);
foreach ($extension_groups_rows as $name)
{
if (isset($this->db_cleaner->data->extension_groups[$name]) && in_array($name, $existing_extension_groups))
{
continue;
}
if (isset($selected[$name]))
{
if (isset($this->db_cleaner->data->extension_groups[$name]) && !in_array($name, $existing_extension_groups))
{
$insert = array(
'group_name' => $name,
'cat_id' => $this->db_cleaner->data->extension_groups[$name][0],
'allow_group' => $this->db_cleaner->data->extension_groups[$name][1],
'download_mode' => $this->db_cleaner->data->extension_groups[$name][2],
'upload_icon' => $this->db_cleaner->data->extension_groups[$name][3],
'max_filesize' => $this->db_cleaner->data->extension_groups[$name][4],
'allowed_forums' => $this->db_cleaner->data->extension_groups[$name][5],
);
// Add it
$db->sql_query('INSERT INTO ' . EXTENSION_GROUPS_TABLE . ' ' . $db->sql_build_array('INSERT', $insert));
}
else if (!isset($this->db_cleaner->data->extension_groups[$name]) && in_array($name, $existing_extension_groups))
{
// Remove it
$db->sql_query('DELETE FROM ' . EXTENSION_GROUPS_TABLE . " WHERE group_name = '" . $db->sql_escape($name) . "'");
}
}
}
return $error;
}
/**
* Fix teh extensions
*/
function extensions()
{
global $db;
foreach ($this->db_cleaner->data->extensions as $group => $data)
{
$group_id = 0;
$existing_extensions = get_extensions($group, $group_id);
$extensions = array_unique(array_merge($data, $existing_extensions));
sort($extensions);
foreach ($extensions as $extension)
{
if (!in_array($extension, $data) && in_array($extension, $existing_extensions))
{
// Delete
$db->sql_query('DELETE FROM ' . EXTENSIONS_TABLE . '
WHERE group_id = ' . (int) $group_id . "
AND extension = '" . $db->sql_escape($extension) . ''');
}
else if (in_array($extension, $data) && !in_array($extension, $existing_extensions))
{
$insert = array(
'group_id' => $group_id,
'extension' => $extension,
);
$db->sql_query('INSERT INTO ' . EXTENSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $insert));
}
}
}
}
/**
* Finish it up.
*
* - Purge all the cache
* - Enable the board
*/
function final_step()
{
global $umil;
$umil->cache_purge();
$umil->cache_purge('auth');
set_config('board_disable', 0);
set_config('board_disable_msg', '');
// Finished!
trigger_error('DATABASE_CLEANER_SUCCESS');
}
/**
* Correct the system groups
*/
function groups($error, $selected)
{
global $db;
$data = $group_rows = $existing_groups = array();
get_group_rows($data, $group_rows, $existing_groups);
foreach ($group_rows as $name)
{
// Skip ones that are in the default install and are in the existing permissions
if (isset($this->db_cleaner->data->groups[$name]) && in_array($name, $existing_groups))
{
continue;
}
if (isset($selected[$name]))
{
if (isset($this->db_cleaner->data->groups[$name]) && !in_array($name, $existing_groups))
{
// Add it with the default settings we've got...
$group_id = false;
group_create($group_id, $this->db_cleaner->data->groups[$name]['group_type'], $name, $this->db_cleaner->data->groups[$name]['group_desc'], array('group_colour' => $this->db_cleaner->data->groups[$name]['group_colour'], 'group_legend' => $this->db_cleaner->data->groups[$name]['group_legend'], 'group_avatar' => $this->db_cleaner->data->groups[$name]['group_avatar'], 'group_max_recipients' => $this->db_cleaner->data->groups[$name]['group_max_recipients']));
}
else if (!isset($this->db_cleaner->data->groups[$name]) && in_array($name, $existing_groups))
{
if (!function_exists('group_delete'))
{
include(PHPBB_ROOT_PATH . 'includes/functions_user.' . PHP_EXT);
}
// Remove it
$db->sql_query('SELECT group_id FROM ' . GROUPS_TABLE . ' WHERE group_name = '' . $db->sql_escape($name) . ''');
$group_id = $db->sql_fetchfield('group_id');
group_delete($group_id, $name);
}
}
}
return $error;
}
/**
* Start the cleaner
*/
function introduction()
{
global $user;
// Redirect if they selected quit
if (isset($_POST['quit']))
{
redirect(append_sid(STK_ROOT_PATH . 'index.' . PHP_EXT));
}
// Start by disabling the board
set_config('board_disable', 1);
set_config('board_disable_msg', user_lang('BOARD_DISABLE_REASON'));
}
/**
* If the user wants this, reset all modules
*
* This will remove all added modules and will re-add and re-enable all vanilla
* modules
*/
function modules($error)
{
global $db, $lang;
if (isset($_POST['yes']))
{
// Remove existing modules
$db->sql_query('DELETE FROM ' . MODULES_TABLE);
// Re-add the modules
if (!class_exists('acp_modules'))
{
include PHPBB_ROOT_PATH . 'includes/acp/acp_modules.' . PHP_EXT;
}
$_module = &new acp_modules();
$module_classes = array('acp', 'mcp', 'ucp');
// Add categories
foreach ($module_classes as $module_class)
{
$categories = array();
// Set the module class
$_module->module_class = $module_class;
foreach ($this->db_cleaner->data->module_categories[$module_class] as $cat_name => $subs)
{
$module_data = array(
'module_basename' => '',
'module_enabled' => 1,
'module_display' => 1,
'parent_id' => 0,
'module_class' => $module_class,
'module_langname' => $cat_name,
'module_mode' => '',
'module_auth' => '',
);
// Add category
$_module->update_module_data($module_data, true);
// Check for last sql error happened
if ($db->sql_error_triggered)
{
$error = $db->sql_error($db->sql_error_sql);
trigger_error($error);
}
$categories[$cat_name]['id'] = (int) $module_data['module_id'];
$categories[$cat_name]['parent_id'] = 0;
// Create sub-categories...
if (is_array($subs))
{
foreach ($subs as $level2_name)
{
$module_data = array(
'module_basename' => '',
'module_enabled' => 1,
'module_display' => 1,
'parent_id' => (int) $categories[$cat_name]['id'],
'module_class' => $module_class,
'module_langname' => $level2_name,
'module_mode' => '',
'module_auth' => '',
);
$_module->update_module_data($module_data, true);
// Check for last sql error happened
if ($db->sql_error_triggered)
{
$error = $db->sql_error($db->sql_error_sql);
trigger_error($error);
}
$categories[$level2_name]['id'] = (int) $module_data['module_id'];
$categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id'];
}
}
}
// Get the modules we want to add... returned sorted by name
$module_info = $_module->get_module_infos('', $module_class);
foreach ($module_info as $module_basename => $fileinfo)
{
if (empty($fileinfo['modes']))
{
// Apparently it is possible to have an empty "modules" array.
// #62958
continue;
}
foreach ($fileinfo['modes'] as $module_mode => $row)
{
foreach ($row['cat'] as $cat_name)
{
if (!isset($categories[$cat_name]))
{
continue;
}
$module_data = array(
'module_basename' => $module_basename,
'module_enabled' => 1,
'module_display' => (isset($row['display'])) ? (int) $row['display'] : 1,
'parent_id' => (int) $categories[$cat_name]['id'],
'module_class' => $module_class,
'module_langname' => $row['title'],
'module_mode' => $module_mode,
'module_auth' => $row['auth'],
);
$_module->update_module_data($module_data, true);
// Check for last sql error happened
if ($db->sql_error_triggered)
{
$error = $db->sql_error($db->sql_error_sql);
trigger_error($error);
}
}
}
}
// Move some of the modules around since the code above will put them in the wrong place
if ($module_class == 'acp')
{
// Move main module 4 up...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'main'
AND module_class = 'acp'
AND module_mode = 'main'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_up', 4);
// Move permissions intro screen module 4 up...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'permissions'
AND module_class = 'acp'
AND module_mode = 'intro'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_up', 4);
// Move manage users screen module 5 up...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'users'
AND module_class = 'acp'
AND module_mode = 'overview'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_up', 5);
}
if ($module_class == 'ucp')
{
// Move attachment module 4 down...
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_basename = 'attachments'
AND module_class = 'ucp'
AND module_mode = 'attachments'";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$_module->move_module_by($row, 'move_down', 4);
}
// And now for the special ones
// (these are modules which appear in multiple categories and thus get added manually to some for more control)
if (isset($this->db_cleaner->data->module_extras[$module_class]))
{
foreach ($this->db_cleaner->data->module_extras[$module_class] as $cat_name => $mods)
{
$sql = 'SELECT module_id, left_id, right_id
FROM ' . MODULES_TABLE . "
WHERE module_langname = '" . $db->sql_escape($cat_name) . "'
AND module_class = '" . $db->sql_escape($module_class) . "'";
$result = $db->sql_query_limit($sql, 1);
$row2 = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
foreach ($mods as $mod_name)
{
$sql = 'SELECT *
FROM ' . MODULES_TABLE . "
WHERE module_langname = '" . $db->sql_escape($mod_name) . "'
AND module_class = '" . $db->sql_escape($module_class) . "'
AND module_basename <> ''";
$result = $db->sql_query_limit($sql, 1);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$module_data = array(
'module_basename' => $row['module_basename'],
'module_enabled' => (int) $row['module_enabled'],
'module_display' => (int) $row['module_display'],
'parent_id' => (int) $row2['module_id'],
'module_class' => $row['module_class'],
'module_langname' => $row['module_langname'],
'module_mode' => $row['module_mode'],
'module_auth' => $row['module_auth'],
);
$_module->update_module_data($module_data, true);
// Check for last sql error happened
if ($db->sql_error_triggered)
{
$error = $db->sql_error($db->sql_error_sql);
trigger_error($error);
}
}
}
}
// In versions prior to 3.0.10, the ACP used a hardcoded module ID of 1 for the version check module
// So the main module (General) needs to have its ID manually set
if (version_compare(PHPBB_VERSION, '3.0.10', '<'))
{
$sql = 'SELECT module_id
FROM ' . MODULES_TABLE . "
WHERE module_langname = 'ACP_CAT_GENERAL'
AND module_class = 'acp'";
$result = $db->sql_query($sql);
$old_id = (int)$db->sql_fetchfield('module_id', false, $result);
$db->sql_freeresult($result);
// Update the GENERAL module first
$sql = 'UPDATE ' . MODULES_TABLE . " SET module_id = 1 WHERE module_id = $old_id";
$db->sql_query($sql);
// Update parent IDs
$sql = 'UPDATE ' . MODULES_TABLE . " SET parent_id = 1 WHERE parent_id = $old_id";
$db->sql_query($sql);
}
$_module->remove_cache_file();
}
}
return $error;
}
/**
* Fix permissions
*/
function permissions($error, $selected)
{
global $umil;
$data = $permission_rows = $existing_permissions = array();
get_permission_rows($data, $permission_rows, $existing_permissions);
foreach ($permission_rows as $name)
{
// Skip ones that are in the default install and are in the existing permissions
if (isset($this->db_cleaner->data->acl_options[$name]) && in_array($name, $existing_permissions))
{
continue;
}
if (isset($selected[$name]))
{
if (isset($this->db_cleaner->data->acl_options[$name]) && !in_array($name, $existing_permissions))
{
// Add it with the default settings we've got...
$umil->permission_add($name, (($this->db_cleaner->data->acl_options[$name]['is_global']) ? true : false));
}
else if (!isset($this->db_cleaner->data->acl_options[$name]) && in_array($name, $existing_permissions))
{
// Remove it
$umil->permission_remove($name, true);
$umil->permission_remove($name, false);
}
}
}
return $error;
}
/**
* Reset the report reasons
*/
function report_reasons($error)
{
global $db;
if (isset($_POST['yes']))
{
// First off all grep the ID of the `other`
$sql = 'SELECT reason_id
FROM ' . REPORTS_REASONS_TABLE . "
WHERE LOWER(reason_title) = 'other'";
$result = $db->sql_query($sql);
$other_reason_id = (int) $db->sql_fetchfield('reason_id');
$db->sql_freeresult($result);
// Select everything
$result = $db->sql_query('SELECT * FROM ' . REPORTS_REASONS_TABLE);
while ($row = $db->sql_fetchrow($result))
{
// This is a default one, unset from the data array
if (array_key_exists($row['reason_title'], $this->db_cleaner->data->report_reasons))
{
unset($this->db_cleaner->data->report_reasons[$row['reason_title']]);
continue;
}
// Delete, this is taken from "acp_reasons"
switch ($db->sql_layer)
{
// The ugly one!
case 'mysqli':
case 'mysql4':
case 'mysql':
// Change the reports using this reason to 'other'
$sql = 'UPDATE ' . REPORTS_TABLE . '
SET reason_id = ' . (int) $other_reason_id . ", report_text = CONCAT('" . $db->sql_escape($row['reason_description']) . "nn', report_text)
WHERE reason_id = " . (int) $row['reason_id'];
break;
// Standard? What's that?
case 'mssql':
case 'mssql_odbc':
case 'mssqlnative':
// Change the reports using this reason to 'other'
$sql = "DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(report_text)
FROM " . REPORTS_TABLE . '
WHERE reason_id = ' . (int) $row['reason_id'] . "
UPDATETEXT " . REPORTS_TABLE . ".report_text @ptrval 0 0 '" . $db->sql_escape($row['reason_description']) . "nn'
UPDATE " . REPORTS_TABLE . '
SET reason_id = ' . (int) $other_reason_id . '
WHERE reason_id = ' . (int) $reason_id;
break;
// Teh standard
case 'postgres':
case 'oracle':
case 'firebird':
case 'sqlite':
// Change the reports using this reason to 'other'
$sql = 'UPDATE ' . REPORTS_TABLE . '
SET reason_id = ' . (int) $other_reason_id . ", report_text = '" . $db->sql_escape($row['reason_description']) . "nn' || report_text
WHERE reason_id = " . (int) $row['reason_id'];
break;
}
$db->sql_query($sql);
$db->sql_query('DELETE FROM ' . REPORTS_REASONS_TABLE . ' WHERE reason_id = ' . (int) $row['reason_id']);
}
$db->sql_freeresult($result);
// Did the user remove any of the original reasons?
if (!empty($this->db_cleaner->data->report_reasons))
{
global $user;
$user->add_lang('install');
if (!function_exists('adjust_language_keys_callback'))
{
include PHPBB_ROOT_PATH . 'includes/functions_install.' . PHP_EXT;
}
// The highest next order
$sql = 'SELECT MAX(reason_order) as next
FROM ' . REPORTS_REASONS_TABLE;
$result = $db->sql_query($sql);
$order = $db->sql_fetchfield('next', false, $result);
$db->sql_freeresult($result);
$insert = array();
foreach ($this->db_cleaner->data->report_reasons as $deleted => $data)
{
$insert[] = array(
'reason_title' => $deleted,
'reason_description' => $user->lang[preg_replace_callback('#{L_([A-Z0-9-_]*)}#s', 'adjust_language_keys_callback', $data[0])],
'reason_order' => ++$order,
);
}
// Insert
$db->sql_multi_insert(REPORTS_REASONS_TABLE, $insert);
}
}
return $error;
}
/**
* Reset the phpBB system roles
*/
function role_data($error)
{
global $db;
if (isset($_POST['yes']))
{
$system_roles = $this->db_cleaner->data->acl_role_data;
$role_ids = array();
$sql_format = 'INSERT INTO ' . ACL_ROLES_DATA_TABLE . ' (role_id, auth_option_id, auth_setting)
SELECT %1$d, auth_option_id, %2$d
FROM ' . ACL_OPTIONS_TABLE . '
WHERE auth_option LIKE %3$s';
$sql_format_in = 'INSERT INTO ' . ACL_ROLES_DATA_TABLE . ' (role_id, auth_option_id, auth_setting)
SELECT %1$d, auth_option_id, %2$d
FROM ' . ACL_OPTIONS_TABLE . '
WHERE auth_option LIKE %3$s
AND %4$s';
// Fetch the role IDs
$sql = 'SELECT role_id, role_name
FROM ' . ACL_ROLES_TABLE . '
WHERE ' . $db->sql_in_set('role_name', array_keys($system_roles));
$result = $db->sql_query($sql);
while ($role = $db->sql_fetchrow($result))
{
$role_ids[$role['role_name']] = $role['role_id'];
}
$db->sql_freeresult($result);
// Clear the ACL_ROLES_DATA_TABLE table
$sql = 'DELETE FROM ' . ACL_ROLES_DATA_TABLE . '
WHERE ' . $db->sql_in_set('role_id', $role_ids);
$db->sql_query($sql);
// Now re-build the role data
foreach ($system_roles as $role_name => $role_data)
{
// Trim role name to allow multiple entries for the same role
$role_name = trim($role_name);
// Create the query
$query = '';
if (!empty($role_data['OPTION_IN']))
{
$like_negate = (empty($role_data['NEGATE'])) ? false : true;
$query = sprintf($sql_format_in, $role_ids[$role_name], $role_data['SETTING'], $role_data['OPTION_LIKE'], $db->sql_in_set('auth_option', $role_data['OPTION_IN'], $like_negate));
}
else
{
$query = sprintf($sql_format, $role_ids[$role_name], $role_data['SETTING'], $role_data['OPTION_LIKE']);
}
// Run, run, run
$db->sql_query($query);
}
}
return $error;
}
/**
* Fix system roles
*/
function roles($error, $selected)
{
global $umil;
$role_rows = $existing_roles = array();
get_role_rows($this->db_cleaner->data->acl_roles, $role_rows, $existing_roles);
foreach ($role_rows as $name)
{
if (isset($this->db_cleaner->data->acl_roles[$name]) && in_array($name, $existing_roles))
{
continue;
}
if (isset($selected[$name]))
{
if (isset($this->db_cleaner->data->acl_roles[$name]) && !in_array($name, $existing_roles))
{
// Add it with the default settings we've got...
$umil->permission_role_add($name, $this->db_cleaner->data->acl_roles[$name][1], $this->db_cleaner->data->acl_roles[$name][0]);
}
else if (!isset($this->db_cleaner->data->acl_roles[$name]) && in_array($name, $existing_roles))
{
// Remove it
$umil->permission_role_remove($name);
}
}
}
return $error;
}
/**
* Correct the database tables based upon the selection
* the user made before.
*
* - Add removed tables
* - Removed added tables
*/
function tables($error, $selected)
{
global $umil;
$found_tables = get_phpbb_tables();
$req_tables = $this->db_cleaner->data->tables;
$tables = array_unique(array_merge(array_keys($req_tables), $found_tables));
sort($tables);
// Loop through selected and fix them
foreach (array_keys($selected) as $table)
{
if (isset($req_tables[$table]) && !in_array($table, $found_tables))
{
$result = $umil->table_add($table, $req_tables[$table]);
if (stripos($result, 'SQL ERROR'))
{
$error[] = $result;
}
}
else if (!isset($req_tables[$table]) && in_array($table, $found_tables))
{
$result = $umil->table_remove($table);
if (stripos($result, 'SQL ERROR'))
{
$error[] = $result;
}
}
}
return $error;
}
}