diff options
author | Meik Sievertsen <acydburn@phpbb.com> | 2009-10-04 18:14:59 +0000 |
---|---|---|
committer | Meik Sievertsen <acydburn@phpbb.com> | 2009-10-04 18:14:59 +0000 |
commit | 2e17e448deed073f8614bb555a8ef20c57291c2a (patch) | |
tree | 533007e53d3584d0887b0f639d0e673b1e15ea7a /phpBB/develop/add_permissions.php | |
parent | bf8ac19eaa8d74f9dfd6d597190f5664e7339382 (diff) | |
download | forums-2e17e448deed073f8614bb555a8ef20c57291c2a.tar forums-2e17e448deed073f8614bb555a8ef20c57291c2a.tar.gz forums-2e17e448deed073f8614bb555a8ef20c57291c2a.tar.bz2 forums-2e17e448deed073f8614bb555a8ef20c57291c2a.tar.xz forums-2e17e448deed073f8614bb555a8ef20c57291c2a.zip |
Copy 3.0.x branch to trunk
git-svn-id: file:///svn/phpbb/trunk@10211 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/develop/add_permissions.php')
-rw-r--r-- | phpBB/develop/add_permissions.php | 417 |
1 files changed, 417 insertions, 0 deletions
diff --git a/phpBB/develop/add_permissions.php b/phpBB/develop/add_permissions.php new file mode 100644 index 0000000000..035c23f49c --- /dev/null +++ b/phpBB/develop/add_permissions.php @@ -0,0 +1,417 @@ +<?php +// ------------------------------------------------------------- +// +// $Id$ +// +// FILENAME : add_permissions.php +// STARTED : Sat Nov 06, 2004 +// COPYRIGHT : © 2004 phpBB Group +// WWW : http://www.phpbb.com/ +// LICENCE : GPL vs2.0 [ see /docs/COPYING ] +// +// ------------------------------------------------------------- + +// +// Security message: +// +// This script is potentially dangerous. +// Remove or comment the next line (die(".... ) to enable this script. +// Do NOT FORGET to either remove this script or disable it after you have used it. +// +die("Please read the first lines of this script for instructions on how to enable it"); + + +// This script adds missing permissions +$db = $dbhost = $dbuser = $dbpasswd = $dbport = $dbname = ''; + +define('IN_PHPBB', 1); +define('ANONYMOUS', 1); +$phpEx = substr(strrchr(__FILE__, '.'), 1); +$phpbb_root_path='./../'; +include($phpbb_root_path . 'config.'.$phpEx); +require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.'.$phpEx); +require($phpbb_root_path . 'includes/db/' . $dbms . '.'.$phpEx); +include($phpbb_root_path . 'includes/functions.'.$phpEx); + +define('ACL_NEVER', 0); +define('ACL_YES', 1); +define('ACL_NO', -1); + +define('ACL_GROUPS_TABLE', $table_prefix.'acl_groups'); +define('ACL_OPTIONS_TABLE', $table_prefix.'acl_options'); +define('ACL_USERS_TABLE', $table_prefix.'acl_users'); +define('GROUPS_TABLE', $table_prefix.'groups'); +define('USERS_TABLE', $table_prefix.'users'); + +$cache = new acm(); +$db = new sql_db(); + +// Connect to DB +$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false); + +// auth => is_local, is_global +$f_permissions = array( + 'f_' => array(1, 0), + 'f_list' => array(1, 0), + 'f_read' => array(1, 0), + 'f_post' => array(1, 0), + 'f_reply' => array(1, 0), + 'f_edit' => array(1, 0), + 'f_user_lock' => array(1, 0), + 'f_delete' => array(1, 0), + 'f_bump' => array(1, 0), + 'f_poll' => array(1, 0), + 'f_vote' => array(1, 0), + 'f_votechg' => array(1, 0), + 'f_announce'=> array(1, 0), + 'f_sticky' => array(1, 0), + 'f_attach' => array(1, 0), + 'f_download'=> array(1, 0), + 'f_icons' => array(1, 0), + 'f_bbcode' => array(1, 0), + 'f_smilies' => array(1, 0), + 'f_img' => array(1, 0), + 'f_flash' => array(1, 0), + 'f_sigs' => array(1, 0), + 'f_search' => array(1, 0), + 'f_email' => array(1, 0), + 'f_print' => array(1, 0), + 'f_ignoreflood' => array(1, 0), + 'f_postcount' => array(1, 0), + 'f_noapprove'=> array(1, 0), + 'f_report' => array(1, 0), + 'f_subscribe' => array(1, 0), +); + +$m_permissions = array( + 'm_' => array(1, 1), + 'm_edit' => array(1, 1), + 'm_delete' => array(1, 1), + 'm_move' => array(1, 1), + 'm_lock' => array(1, 1), + 'm_split' => array(1, 1), + 'm_merge' => array(1, 1), + 'm_approve' => array(1, 1), + 'm_unrate' => array(1, 1), + 'm_auth' => array(1, 1), + 'm_ip' => array(1, 1), + 'm_info' => array(1, 1), +); + +$a_permissions = array( + 'a_' => array(0, 1), + 'a_server' => array(0, 1), + 'a_board' => array(0, 1), + 'a_clearlogs' => array(0, 1), + 'a_words' => array(0, 1), + 'a_icons' => array(0, 1), + 'a_bbcode' => array(0, 1), + 'a_attach' => array(0, 1), + 'a_email' => array(0, 1), + 'a_styles' => array(0, 1), + 'a_user' => array(0, 1), + 'a_useradd' => array(0, 1), + 'a_userdel' => array(0, 1), + 'a_ranks' => array(0, 1), + 'a_ban' => array(0, 1), + 'a_names' => array(0, 1), + 'a_group' => array(0, 1), + 'a_groupadd'=> array(0, 1), + 'a_groupdel'=> array(0, 1), + 'a_forum' => array(0, 1), + 'a_forumadd'=> array(0, 1), + 'a_forumdel'=> array(0, 1), + 'a_prune' => array(0, 1), + 'a_auth' => array(0, 1), + 'a_authmods'=> array(0, 1), + 'a_authadmins' => array(0, 1), + 'a_authusers' => array(0, 1), + 'a_authgroups' => array(0, 1), + 'a_authdeps'=> array(0, 1), + 'a_backup' => array(0, 1), + 'a_restore' => array(0, 1), + 'a_search' => array(0, 1), + 'a_events' => array(0, 1), + 'a_cron' => array(0, 1), +); + +$u_permissions = array( + 'u_' => array(0, 1), + 'u_sendemail' => array(0, 1), + 'u_readpm' => array(0, 1), + 'u_sendpm' => array(0, 1), + 'u_sendim' => array(0, 1), + 'u_hideonline' => array(0, 1), + 'u_viewonline' => array(0, 1), + 'u_viewprofile' => array(0, 1), + 'u_chgavatar' => array(0, 1), + 'u_chggrp' => array(0, 1), + 'u_chgemail' => array(0, 1), + 'u_chgname' => array(0, 1), + 'u_chgpasswd' => array(0, 1), + 'u_chgcensors' => array(0, 1), + 'u_search' => array(0, 1), + 'u_savedrafts' => array(0, 1), + 'u_download' => array(0, 1), + 'u_attach' => array(0, 1), + 'u_sig' => array(0, 1), + 'u_pm_attach' => array(0, 1), + 'u_pm_bbcode' => array(0, 1), + 'u_pm_smilies' => array(0, 1), + 'u_pm_download' => array(0, 1), + 'u_pm_edit' => array(0, 1), + 'u_pm_printpm' => array(0, 1), + 'u_pm_emailpm' => array(0, 1), + 'u_pm_forward' => array(0, 1), + 'u_pm_delete' => array(0, 1), + 'u_pm_img' => array(0, 1), + 'u_pm_flash' => array(0, 1), +); + +echo "<p><b>Determining existing permissions</b></p>\n"; + +$sql = 'SELECT auth_option_id, auth_option FROM ' . ACL_OPTIONS_TABLE; +$result = $db->sql_query($sql); + +$remove_auth_options = array(); +while ($row = $db->sql_fetchrow($result)) +{ + if (!in_array($row['auth_option'], array_keys(${substr($row['auth_option'], 0, 2) . 'permissions'}))) + { + $remove_auth_options[$row['auth_option']] = $row['auth_option_id']; + } + unset(${substr($row['auth_option'], 0, 2) . 'permissions'}[$row['auth_option']]); +} +$db->sql_freeresult($result); + +if (sizeof($remove_auth_options)) +{ + $db->sql_query('DELETE FROM ' . ACL_USERS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); + $db->sql_query('DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); + $db->sql_query('DELETE FROM ' . ACL_OPTIONS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); + + echo '<p><b>Removed the following auth options... [<i>' . implode(', ', array_keys($remove_auth_options)) . "</i>]</b></p>\n\n"; +} + +$prefixes = array('f_', 'a_', 'm_', 'u_'); + +foreach ($prefixes as $prefix) +{ + $var = $prefix . 'permissions'; + if (sizeof($$var)) + { + foreach ($$var as $auth_option => $l_ary) + { + $sql_ary = array( + 'auth_option' => $auth_option, + 'is_local' => $l_ary[0], + 'is_global' => $l_ary[1] + ); + + $db->sql_query('INSERT INTO ' . ACL_OPTIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); + + echo "<p><b>Adding $auth_option...</b></p>\n"; + + mass_auth('group', 0, 'guests', $auth_option, ACL_NEVER); + mass_auth('group', 0, 'inactive', $auth_option, ACL_NEVER); + mass_auth('group', 0, 'inactive_coppa', $auth_option, ACL_NEVER); + mass_auth('group', 0, 'registered_coppa', $auth_option, ACL_NEVER); + mass_auth('group', 0, 'registered', $auth_option, (($prefix != 'm_' && $prefix != 'a_') ? ACL_YES : ACL_NEVER)); + mass_auth('group', 0, 'global_moderators', $auth_option, (($prefix != 'a_') ? ACL_YES : ACL_NEVER)); + mass_auth('group', 0, 'administrators', $auth_option, ACL_YES); + mass_auth('group', 0, 'bots', $auth_option, (($prefix != 'm_' && $prefix != 'a_') ? ACL_YES : ACL_NEVER)); + } + } +} + +$sql = 'UPDATE ' . USERS_TABLE . " SET user_permissions = ''"; +$db->sql_query($sql); + +$cache->destroy('_acl_options'); + +echo "<p><b>Done</b></p>\n"; + +/* + $ug_type = user|group + $forum_id = forum ids (array|int|0) -> 0 == all forums + $ug_id = [int] user_id|group_id : [string] usergroup name + $acl_list = [string] acl entry : [array] acl entries + $setting = ACL_YES|ACL_NEVER|ACL_NO +*/ +function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting) +{ + global $db; + static $acl_option_ids, $group_ids; + + if ($ug_type == 'group' && is_string($ug_id)) + { + if (!isset($group_ids[$ug_id])) + { + $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . " + WHERE group_name = '" . strtoupper($ug_id) . "'"; + $result = $db->sql_query_limit($sql, 1); + $id = (int) $db->sql_fetchfield('group_id', 0, $result); + $db->sql_freeresult($result); + + if (!$id) + { + return; + } + + $group_ids[$ug_id] = $id; + } + + $ug_id = (int) $group_ids[$ug_id]; + } + + // Build correct parameters + $auth = array(); + + if (!is_array($acl_list)) + { + $auth = array($acl_list => $setting); + } + else + { + foreach ($acl_list as $auth_option) + { + $auth[$auth_option] = $setting; + } + } + unset($acl_list); + + if (!is_array($forum_id)) + { + $forum_id = array($forum_id); + } + + // Set any flags as required + foreach ($auth as $auth_option => $acl_setting) + { + $flag = substr($auth_option, 0, strpos($auth_option, '_') + 1); + if (empty($auth[$flag])) + { + $auth[$flag] = $acl_setting; + } + } + + if (!is_array($acl_option_ids) || empty($acl_option_ids)) + { + $sql = 'SELECT auth_option_id, auth_option + FROM ' . ACL_OPTIONS_TABLE; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $acl_option_ids[$row['auth_option']] = $row['auth_option_id']; + } + $db->sql_freeresult($result); + } + + $sql_forum = 'AND a.forum_id IN (' . implode(', ', array_map('intval', $forum_id)) . ')'; + + $sql = ($ug_type == 'user') ? 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.user_id = $ug_id" : 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.group_id = $ug_id"; + $result = $db->sql_query($sql); + + $cur_auth = array(); + while ($row = $db->sql_fetchrow($result)) + { + $cur_auth[$row['forum_id']][$row['auth_option_id']] = $row['auth_setting']; + } + $db->sql_freeresult($result); + + $table = ($ug_type == 'user') ? ACL_USERS_TABLE : ACL_GROUPS_TABLE; + $id_field = $ug_type . '_id'; + + $sql_ary = array(); + foreach ($forum_id as $forum) + { + foreach ($auth as $auth_option => $setting) + { + $auth_option_id = $acl_option_ids[$auth_option]; + + if (!$auth_option_id) + { + continue; + } + + switch ($setting) + { + case ACL_NO: + if (isset($cur_auth[$forum][$auth_option_id])) + { + $sql_ary['delete'][] = "DELETE FROM $table + WHERE forum_id = $forum + AND auth_option_id = $auth_option_id + AND $id_field = $ug_id"; + } + break; + + default: + if (!isset($cur_auth[$forum][$auth_option_id])) + { + $sql_ary['insert'][] = "$ug_id, $forum, $auth_option_id, $setting"; + } + else if ($cur_auth[$forum][$auth_option_id] != $setting) + { + $sql_ary['update'][] = "UPDATE " . $table . " + SET auth_setting = $setting + WHERE $id_field = $ug_id + AND forum_id = $forum + AND auth_option_id = $auth_option_id"; + } + } + } + } + unset($cur_auth); + + $sql = ''; + foreach ($sql_ary as $sql_type => $sql_subary) + { + switch ($sql_type) + { + case 'insert': + switch ($db->sql_layer) + { + case 'mysql': + case 'mysql4': + $sql = 'VALUES ' . implode(', ', preg_replace('#^(.*?)$#', '(\1)', $sql_subary)); + break; + + case 'mssql': + case 'sqlite': + $sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary)); + break; + + default: + foreach ($sql_subary as $sql) + { + $sql = "INSERT INTO $table ($id_field, forum_id, auth_option_id, auth_setting) VALUES ($sql)"; + $result = $db->sql_query($sql); + $sql = ''; + } + } + + if ($sql != '') + { + $sql = "INSERT INTO $table ($id_field, forum_id, auth_option_id, auth_setting) $sql"; + $result = $db->sql_query($sql); + } + break; + + case 'update': + case 'delete': + foreach ($sql_subary as $sql) + { + $result = $db->sql_query($sql); + $sql = ''; + } + break; + } + unset($sql_ary[$sql_type]); + } + unset($sql_ary); + +} + +?>
\ No newline at end of file |