mirror of
				https://github.com/phpbb/phpbb.git
				synced 2025-10-26 13:16:14 +01:00 
			
		
		
		
	Closing tags converted using Oleg's script. remove-php-end-tags.py -a . Trailing newlines added using the following where $ext is file extension. find . -type f -name "*.$ext" -print | xargs printf "e %s\nw\n" | ed -s; Extensions: php, css, html, js, xml. PHPBB3-9556
		
			
				
	
	
		
			416 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			416 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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);
 | |
| 
 | |
| }
 |