2002-03-10 00:27:24 +00:00
< ? php
/***************************************************************************
* functions_admin . php
* -------------------
* begin : Saturday , Feb 13 , 2001
* copyright : ( C ) 2001 The phpBB Group
* email : support @ phpbb . com
*
* $Id $
*
***************************************************************************/
/***************************************************************************
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
***************************************************************************/
// Simple version of jumpbox, just lists authed forums
2002-10-08 21:01:25 +00:00
function make_forum_select ( $default_forum = false , $ignore_forum = false )
2002-03-10 00:27:24 +00:00
{
2002-10-08 20:06:55 +00:00
global $db , $userdata , $auth , $lang ;
2002-03-10 00:27:24 +00:00
2002-10-08 20:06:55 +00:00
$sql = " SELECT forum_id, forum_name, left_id, right_id
FROM " . FORUMS_TABLE . "
ORDER BY left_id ASC " ;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
2002-10-08 20:06:55 +00:00
$right = 0 ;
$subforum = '' ;
2002-03-10 00:27:24 +00:00
$forum_list = '' ;
2002-10-08 20:06:55 +00:00
while ( $row = $db -> sql_fetchrow ( $result ) )
2002-03-10 00:27:24 +00:00
{
2002-10-08 21:01:25 +00:00
if ( $row [ 'left_id' ] < $right )
2002-03-10 00:27:24 +00:00
{
2002-10-08 21:01:25 +00:00
$subforum .= ' ' ;
}
else if ( $row [ 'left_id' ] > $right + 1 )
{
$subforum = substr ( $subforum , 0 , - 18 * ( $row [ 'left_id' ] - $right + 1 ));
}
2002-10-08 20:06:55 +00:00
2002-10-08 21:01:25 +00:00
$right = $row [ 'right_id' ];
2002-10-08 20:06:55 +00:00
2002-10-08 21:01:25 +00:00
if ( ( $auth -> acl_get ( 'f_list' , $forum_id ) || $auth -> acl_get ( 'a_' ) ) && $ignore_forum != $row [ 'forum_id' ] )
{
$selected = ( $row [ 'forum_id' ] == $default_forum ) ? ' selected="selected"' : '' ;
$forum_list .= '<option value="' . $row [ 'forum_id' ] . '"' . $selected . '>' . $subforum . $row [ 'forum_name' ] . '</option>' ;
2002-03-10 00:27:24 +00:00
}
2002-10-08 20:06:55 +00:00
2002-03-10 00:27:24 +00:00
}
2002-10-08 20:06:55 +00:00
$db -> sql_freeresult ( $result );
2002-03-10 00:27:24 +00:00
2002-10-08 21:01:25 +00:00
return ( $forum_list == '' ) ? '<option value="-1">' . $lang [ 'No_forums' ] . '</option>' : $forum_list ;
2002-03-10 00:27:24 +00:00
}
// Synchronise functions for forums/topics
function sync ( $type , $id )
{
global $db ;
switch ( $type )
{
case 'all forums' :
$sql = " SELECT forum_id
FROM " . FORUMS_TABLE;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
while ( $row = $db -> sql_fetchrow ( $result ) )
{
2002-04-02 14:53:44 +00:00
sync ( 'forum' , $row [ 'forum_id' ]);
2002-03-10 00:27:24 +00:00
}
break ;
case 'all topics' :
$sql = " SELECT topic_id
FROM " . TOPICS_TABLE;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
while ( $row = $db -> sql_fetchrow ( $result ) )
{
2002-04-02 14:53:44 +00:00
sync ( 'topic' , $row [ 'topic_id' ]);
2002-03-10 00:27:24 +00:00
}
break ;
case 'forum' :
2002-10-08 20:06:55 +00:00
$sql = " SELECT MAX(p.post_id) AS last_post, COUNT(p.post_id) AS total
FROM " . POSTS_TABLE . " p , " . TOPICS_TABLE . " t
WHERE p . forum_id = $id
AND t . topic_id = p . topic_id
2002-09-16 15:22:52 +00:00
AND t . topic_status <> " . ITEM_MOVED;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
if ( $row = $db -> sql_fetchrow ( $result ) )
{
$last_post = ( $row [ 'last_post' ] ) ? $row [ 'last_post' ] : 0 ;
$total_posts = ( $row [ 'total' ]) ? $row [ 'total' ] : 0 ;
}
else
{
$last_post = 0 ;
$total_posts = 0 ;
}
$sql = " SELECT COUNT(topic_id) AS total
FROM " . TOPICS_TABLE . "
2002-10-08 20:06:55 +00:00
WHERE forum_id = $id
2002-09-16 15:22:52 +00:00
AND topic_status <> " . ITEM_MOVED;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
2002-04-02 14:04:18 +00:00
$total_topics = ( $row = $db -> sql_fetchrow ( $result ) ) ? ( ( $row [ 'total' ] ) ? $row [ 'total' ] : 0 ) : 0 ;
2002-03-10 00:27:24 +00:00
$sql = " UPDATE " . FORUMS_TABLE . "
SET forum_last_post_id = $last_post , forum_posts = $total_posts , forum_topics = $total_topics
WHERE forum_id = $id " ;
2002-07-14 14:34:34 +00:00
$db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
break ;
case 'topic' :
$sql = " SELECT MAX(post_id) AS last_post, MIN(post_id) AS first_post, COUNT(post_id) AS total_posts
FROM " . POSTS_TABLE . "
WHERE topic_id = $id " ;
2002-07-14 14:34:34 +00:00
$result = $db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
if ( $row = $db -> sql_fetchrow ( $result ) )
{
$sql = " UPDATE " . TOPICS_TABLE . "
2002-10-08 20:06:55 +00:00
SET topic_replies = " . ( $row['total_posts'] - 1 ) . " , topic_first_post_id = " . $row['first_post'] . " , topic_last_post_id = " . $row['last_post'] . "
2002-03-10 00:27:24 +00:00
WHERE topic_id = $id " ;
2002-07-14 14:34:34 +00:00
$db -> sql_query ( $sql );
2002-03-10 00:27:24 +00:00
}
2002-07-14 14:34:34 +00:00
case 'post' :
break ;
2002-03-10 00:27:24 +00:00
break ;
}
2002-10-08 20:06:55 +00:00
2002-03-10 00:27:24 +00:00
return true ;
}
2002-07-14 14:34:34 +00:00
function prune ( $forum_id , $prune_date )
{
global $db , $lang , $phpEx , $phpbb_root_path ;
// Those without polls ...
2002-10-08 20:06:55 +00:00
$sql = " SELECT t.topic_id
2002-07-14 14:34:34 +00:00
FROM " . POSTS_TABLE . " p , " . TOPICS_TABLE . " t
WHERE t . forum_id = $forum_id
2002-10-08 20:06:55 +00:00
AND t . topic_vote = 0
AND t . topic_type <> " . POST_ANNOUNCE . "
AND ( p . post_id = t . topic_last_post_id
2002-07-14 14:34:34 +00:00
OR t . topic_last_post_id = 0 ) " ;
if ( $prune_date != '' )
{
$sql .= " AND p.post_time < $prune_date " ;
}
$result = $db -> sql_query ( $sql );
$sql_topics = '' ;
while ( $row = $db -> sql_fetchrow ( $result ) )
{
$sql_topics .= ( ( $sql_topics != '' ) ? ', ' : '' ) . $row [ 'topic_id' ];
}
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
if ( $sql_topics != '' )
{
$sql = " SELECT post_id
2002-10-08 20:06:55 +00:00
FROM " . POSTS_TABLE . "
WHERE forum_id = $forum_id
2002-07-14 14:34:34 +00:00
AND topic_id IN ( $sql_topics ) " ;
$result = $db -> sql_query ( $sql );
$sql_post = '' ;
while ( $row = $db -> sql_fetchrow ( $result ) )
{
$sql_post .= ( ( $sql_post != '' ) ? ', ' : '' ) . $row [ 'post_id' ];
}
if ( $sql_post != '' )
{
$db -> sql_transaction ();
2002-10-08 20:06:55 +00:00
$sql = " DELETE FROM " . TOPICS_TABLE . "
2002-07-14 14:34:34 +00:00
WHERE topic_id IN ( $sql_topics ) " ;
$db -> sql_query ( $sql );
$pruned_topics = $db -> sql_affectedrows ();
2002-10-08 20:06:55 +00:00
$sql = " DELETE FROM " . POSTS_TABLE . "
2002-07-14 14:34:34 +00:00
WHERE post_id IN ( $sql_post ) " ;
$db -> sql_query ( $sql );
$pruned_posts = $db -> sql_affectedrows ();
2002-10-08 20:06:55 +00:00
$sql = " DELETE FROM " . POSTS_TEXT_TABLE . "
2002-07-14 14:34:34 +00:00
WHERE post_id IN ( $sql_post ) " ;
$db -> sql_query ( $sql );
2002-10-08 20:06:55 +00:00
$sql = " DELETE FROM " . SEARCH_MATCH_TABLE . "
2002-07-14 14:34:34 +00:00
WHERE post_id IN ( $sql_post ) " ;
$db -> sql_query ( $sql );
remove_search_post ( $sql_post );
$db -> sql_transaction ( 'commit' );
return array ( 'topics' => $pruned_topics , 'posts' => $pruned_posts );
}
}
return array ( 'topics' => 0 , 'posts' => 0 );
}
// Function auto_prune(), this function will read the configuration data from
// the auto_prune table and call the prune function with the necessary info.
function auto_prune ( $forum_id = 0 )
{
global $db , $lang ;
2002-10-08 20:06:55 +00:00
$sql = " SELECT prune_freq, prune_days
2002-07-14 14:34:34 +00:00
FROM " . FORUMS_TABLE . "
WHERE forum_id = $forum_id " ;
$result = $db -> sql_query ( $sql );
if ( $row = $db -> sql_fetchrow ( $result ) )
{
if ( $row [ 'prune_freq' ] && $row [ 'prune_days' ] )
{
$prune_date = time () - ( $row [ 'prune_days' ] * 86400 );
$next_prune = time () + ( $row [ 'prune_freq' ] * 86400 );
prune ( $forum_id , $prune_date );
sync ( 'forum' , $forum_id );
2002-10-08 20:06:55 +00:00
$sql = " UPDATE " . FORUMS_TABLE . "
SET prune_next = $next_prune
2002-07-14 14:34:34 +00:00
WHERE forum_id = $forum_id " ;
$db -> sql_query ( $sql );
}
}
return ;
}
// remove_comments will strip the sql comment lines out of an uploaded sql file
// specifically for mssql and postgres type files in the install....
function remove_comments ( & $output )
{
$lines = explode ( " \n " , $output );
$output = '' ;
// try to keep mem. use down
$linecount = count ( $lines );
$in_comment = false ;
for ( $i = 0 ; $i < $linecount ; $i ++ )
{
if ( preg_match ( '/^\/\*/' , preg_quote ( $lines [ $i ])) )
{
$in_comment = true ;
}
if ( ! $in_comment )
{
$output .= $lines [ $i ] . " \n " ;
}
if ( preg_match ( '/\*\/$/' , preg_quote ( $lines [ $i ])) )
{
$in_comment = false ;
}
}
unset ( $lines );
return $output ;
}
// remove_remarks will strip the sql comment lines out of an uploaded sql file
function remove_remarks ( $sql )
{
$lines = explode ( " \n " , $sql );
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// try to keep mem. use down
$sql = '' ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
$linecount = count ( $lines );
$output = '' ;
for ( $i = 0 ; $i < $linecount ; $i ++ )
{
if ( $i != $linecount - 1 || strlen ( $lines [ $i ]) > 0 )
{
$output .= ( $lines [ $i ][ 0 ] != '#' ) ? $lines [ $i ] . " \n " : " \n " ;
// Trading a bit of speed for lower mem. use here.
$lines [ $i ] = '' ;
}
}
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
return $output ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
}
// split_sql_file will split an uploaded sql file into single sql statements.
// Note: expects trim() to have already been run on $sql.
function split_sql_file ( $sql , $delimiter )
{
// Split up our string into "possible" SQL statements.
$tokens = explode ( $delimiter , $sql );
// try to save mem.
$sql = '' ;
$output = array ();
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// we don't actually care about the matches preg gives us.
$matches = array ();
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// this is faster than calling count($oktens) every time thru the loop.
$token_count = count ( $tokens );
for ( $i = 0 ; $i < $token_count ; $i ++ )
{
// Don't wanna add an empty string as the last thing in the array.
if ( $i != $token_count - 1 || strlen ( $tokens [ $i ] > 0 ) )
{
// This is the total number of single quotes in the token.
$total_quotes = preg_match_all ( " /'/ " , $tokens [ $i ], $matches );
2002-10-08 20:06:55 +00:00
// Counts single quotes that are preceded by an odd number of backslashes,
2002-07-14 14:34:34 +00:00
// which means they're escaped quotes.
$escaped_quotes = preg_match_all ( " /(?<! \\ \\ )( \\ \\ \\ \\ )* \\ \\ '/ " , $tokens [ $i ], $matches );
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
$unescaped_quotes = $total_quotes - $escaped_quotes ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// If the number of unescaped quotes is even, then the delimiter did NOT occur inside a string literal.
if ( ! ( $unescaped_quotes % 2 ) )
{
// It's a complete sql statement.
$output [] = $tokens [ $i ];
// save memory.
$tokens [ $i ] = '' ;
}
else
{
// incomplete sql statement. keep adding tokens until we have a complete one.
// $temp will hold what we have so far.
$temp = $tokens [ $i ] . $delimiter ;
// save memory..
$tokens [ $i ] = '' ;
2002-10-08 20:06:55 +00:00
// Do we have a complete statement yet?
2002-07-14 14:34:34 +00:00
$complete_stmt = false ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
for ( $j = $i + 1 ; ( ! $complete_stmt && ( $j < $token_count )); $j ++ )
{
// This is the total number of single quotes in the token.
$total_quotes = preg_match_all ( " /'/ " , $tokens [ $j ], $matches );
2002-10-08 20:06:55 +00:00
// Counts single quotes that are preceded by an odd number of backslashes,
2002-07-14 14:34:34 +00:00
// which means they're escaped quotes.
$escaped_quotes = preg_match_all ( " /(?<! \\ \\ )( \\ \\ \\ \\ )* \\ \\ '/ " , $tokens [ $j ], $matches );
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
$unescaped_quotes = $total_quotes - $escaped_quotes ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
if ( ( $unescaped_quotes % 2 ) == 1 )
{
// odd number of unescaped quotes. In combination with the previous incomplete
// statement(s), we now have a complete statement. (2 odds always make an even)
$output [] = $temp . $tokens [ $j ];
// save memory.
$tokens [ $j ] = '' ;
$temp = '' ;
2002-10-08 20:06:55 +00:00
2002-07-14 14:34:34 +00:00
// exit the loop.
$complete_stmt = true ;
// make sure the outer loop continues at the right point.
$i = $j ;
}
else
{
2002-10-08 20:06:55 +00:00
// even number of unescaped quotes. We still don't have a complete statement.
2002-07-14 14:34:34 +00:00
// (1 odd and 1 even always make an odd)
$temp .= $tokens [ $j ] . $delimiter ;
// save memory.
$tokens [ $j ] = '' ;
}
} // for..
} // else
}
}
return $output ;
}
2002-10-26 12:34:39 +00:00
// Rebuild board_config array in cache file
function config_config ( $config = false )
{
global $db , $phpbb_root_path , $phpEx ;
if ( ! $config )
{
$config = array ();
$sql = " SELECT *
FROM " . CONFIG_TABLE . "
WHERE is_dynamic <> 1 " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$config [ $row [ 'config_name' ]] = $row [ 'config_value' ];
}
}
$cache_str = " \$ board_config = array( \n " ;
foreach ( $config as $config_name => $config_value )
{
$cache_str .= " \t ' $config_name ' => " . ( ( is_numeric ( $config_value ) ) ? $config_value : '"' . addslashes ( $config_value ) . '"' ) . " , \n " ;
}
$cache_str .= " ); " ;
config_cache_write ( '\$board_config = array\(.*?\);' , $cache_str );
return $config ;
}
// Update config cache file
function config_cache_write ( $match , $data )
{
global $phpbb_root_path , $phpEx , $user ;
if ( ! is_writeable ( $phpbb_root_path . 'config_cache.' . $phpEx ))
{
trigger_error ( $user -> lang [ 'Cache_writeable' ]);
}
if ( ! ( $fp = @ fopen ( $phpbb_root_path . 'config_cache.' . $phpEx , 'r+' )))
{
trigger_error ( 'Failed opening config_cache. Please ensure the file exists' , E_USER_ERROR );
}
$config_file = fread ( $fp , filesize ( $phpbb_root_path . 'config_cache.' . $phpEx ));
fseek ( $fp , 0 );
@ flock ( $fp , LOCK_EX );
if ( ! fwrite ( $fp , preg_replace ( '#' . $match . '#s' , $data , $config_file )))
{
trigger_error ( 'Could not write out config data to cache' , E_USER_ERROR );
}
@ flock ( $fp , LOCK_UN );
fclose ( $fp );
return ;
}
2002-10-08 20:06:55 +00:00
// Extension of auth class for changing permissions
class auth_admin extends auth
{
2002-10-26 12:34:39 +00:00
// Set a user or group ACL record
2002-10-20 19:19:07 +00:00
function acl_set ( $mode , & $forum_id , & $ug_id , & $auth )
2002-10-08 20:06:55 +00:00
{
global $db ;
2002-10-26 12:34:39 +00:00
// Set any flags as required
foreach ( $auth as $auth_value => $allow )
{
$flag = substr ( $auth_value , 0 , strpos ( $auth_value , '_' ) + 1 );
if ( empty ( $auth [ $flag ]) )
{
$auth [ $flag ] = $allow ;
}
}
$sql = " SELECT auth_option_id, auth_value
FROM " . ACL_OPTIONS_TABLE;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$option_ids [ $row [ 'auth_value' ]] = $row [ 'auth_option_id' ];
}
$db -> sql_freeresult ( $result );
// One or more forums
2002-10-20 19:19:07 +00:00
if ( ! is_array ( $forum_id ) )
2002-10-08 20:06:55 +00:00
{
2002-10-20 19:19:07 +00:00
$forum_id = array ( $forum_id );
2002-10-08 20:06:55 +00:00
}
2002-10-20 19:19:07 +00:00
// NOTE THIS USED TO BE IN ($forum_id, 0) ...
$forum_sql = 'AND a.forum_id IN (' . implode ( ', ' , $forum_id ) . ')' ;
2002-10-08 20:06:55 +00:00
2002-10-20 19:19:07 +00:00
$sql = ( $mode == 'user' ) ? " SELECT o.auth_option_id, o.auth_value, a.forum_id, a.auth_allow_deny FROM " . ACL_USERS_TABLE . " a, " . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $forum_sql AND a.user_id = $ug_id " : " SELECT o.auth_option_id, o.auth_value, a.forum_id, a.auth_allow_deny FROM " . ACL_GROUPS_TABLE . " a, " . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $forum_sql AND a.group_id = $ug_id " ;
2002-10-08 20:06:55 +00:00
$result = $db -> sql_query ( $sql );
2002-10-20 19:19:07 +00:00
$cur_auth = array ();
while ( $row = $db -> sql_fetchrow ( $result ) )
2002-10-08 20:06:55 +00:00
{
2002-10-20 19:19:07 +00:00
$cur_auth [ $row [ 'forum_id' ]][ $row [ 'auth_option_id' ]] = $row [ 'auth_allow_deny' ];
2002-10-08 20:06:55 +00:00
}
$db -> sql_freeresult ( $result );
2002-10-20 19:19:07 +00:00
$table = ( $mode == 'user' ) ? ACL_USERS_TABLE : ACL_GROUPS_TABLE ;
$id_field = $mode . '_id' ;
foreach ( $forum_id as $forum )
2002-10-08 20:06:55 +00:00
{
2002-10-26 12:34:39 +00:00
foreach ( $auth as $auth_value => $allow )
2002-10-08 20:06:55 +00:00
{
2002-10-26 12:34:39 +00:00
$auth_option_id = $option_ids [ $auth_value ];
2002-10-20 19:19:07 +00:00
if ( ! empty ( $cur_auth [ $forum ]) )
2002-10-08 20:06:55 +00:00
{
2002-10-20 19:19:07 +00:00
$sql_ary [] = ( ! isset ( $cur_auth [ $forum ][ $auth_option_id ]) ) ? " INSERT INTO $table ( $id_field , forum_id, auth_option_id, auth_allow_deny) VALUES ( $ug_id , $forum , $auth_option_id , $allow ) " : ( ( $cur_auth [ $forum ][ $auth_option_id ] != $allow ) ? " UPDATE " . $table . " SET auth_allow_deny = $allow WHERE $id_field = $ug_id AND forum_id = $forum AND auth_option_id = $auth_option_id " : '' );
}
else
{
$sql_ary [] = " INSERT INTO $table ( $id_field , forum_id, auth_option_id, auth_allow_deny) VALUES ( $ug_id , $forum , $auth_option_id , $allow ) " ;
2002-10-08 20:06:55 +00:00
}
}
}
2002-10-20 19:19:07 +00:00
unset ( $forum_id );
unset ( $user_auth );
2002-10-08 20:06:55 +00:00
foreach ( $sql_ary as $sql )
{
2002-10-20 19:19:07 +00:00
if ( $sql != '' )
{
$result = $db -> sql_query ( $sql );
$db -> sql_freeresult ( $result );
}
2002-10-08 20:06:55 +00:00
}
unset ( $sql_ary );
$this -> acl_clear_prefetch ();
}
2002-10-20 19:19:07 +00:00
function acl_delete ( $mode , & $forum_id , & $ug_id , $auth_ids = false )
2002-10-08 20:06:55 +00:00
{
global $db ;
$auth_sql = '' ;
2002-10-26 12:34:39 +00:00
if ( $auth_ids )
2002-10-08 20:06:55 +00:00
{
for ( $i = 0 ; $i < count ( $auth_ids ); $i ++ )
{
$auth_sql .= ( ( $auth_sql != '' ) ? ', ' : '' ) . $auth_ids [ $i ];
}
$auth_sql = " AND auth_option_id IN ( $auth_sql ) " ;
}
2002-10-20 19:19:07 +00:00
$table = ( $mode == 'user' ) ? ACL_USERS_TABLE : ACL_GROUPS_TABLE ;
$id_field = $mode . '_id' ;
$sql = " DELETE FROM $table
WHERE $id_field = $ug_id
2002-10-08 20:06:55 +00:00
AND forum_id = $forum_id
$auth_sql " ;
$db -> sql_query ( $sql );
$this -> acl_clear_prefetch ();
}
2002-10-26 12:34:39 +00:00
function acl_clear_prefetch ( $user_id = false )
2002-10-08 20:06:55 +00:00
{
global $db ;
2002-10-26 12:34:39 +00:00
$where_sql = ( $user_id ) ? " WHERE user_id = $user_id " : '' ;
2002-10-20 19:19:07 +00:00
$sql = " UPDATE " . USERS_TABLE . "
2002-10-26 12:34:39 +00:00
SET user_permissions = ''
$where_sql " ;
2002-10-08 20:06:55 +00:00
$db -> sql_query ( $sql );
2002-10-20 19:19:07 +00:00
return ;
2002-10-08 20:06:55 +00:00
}
2002-10-28 00:08:18 +00:00
// Add a new option to the list ... $options is a hash of form ->
// $options = array(
// 'local' => array('option1', 'option2', ...),
// 'global' => array('optionA', 'optionB', ...)
// );
function acl_add_option ( $options )
2002-10-08 20:06:55 +00:00
{
global $db ;
2002-10-26 12:34:39 +00:00
if ( ! is_array ( $new_options ))
2002-10-20 19:19:07 +00:00
{
2002-10-26 12:34:39 +00:00
trigger_error ( 'Incorrect parameter for acl_add_option' , E_USER_ERROR );
2002-10-20 19:19:07 +00:00
}
2002-10-28 00:08:18 +00:00
$cur_options = array ();
2002-10-26 12:34:39 +00:00
$sql = " SELECT auth_value, is_global, is_local
FROM " . ACL_OPTIONS_TABLE . "
ORDER BY is_global , is_local , auth_value " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ) )
{
2002-10-28 00:08:18 +00:00
if ( ! empty ( $row [ 'is_global' ]) )
2002-10-26 12:34:39 +00:00
{
2002-10-28 00:08:18 +00:00
$cur_options [ 'global' ][] = $row [ 'auth_value' ];
2002-10-26 12:34:39 +00:00
}
2002-10-28 00:08:18 +00:00
if ( ! empty ( $row [ 'is_local' ]) )
2002-10-26 12:34:39 +00:00
{
2002-10-28 00:08:18 +00:00
$cur_options [ 'local' ][] = $row [ 'auth_value' ];
2002-10-26 12:34:39 +00:00
}
}
$db -> sql_freeresult ( $result );
if ( ! is_array ( $options ))
{
trigger_error ( 'Incorrect parameter for acl_add_option' , E_USER_ERROR );
}
// Here we need to insert new options ... this requires
// discovering whether an options is global, local or both
// and whether we need to add an option type flag (x_)
2002-10-28 00:08:18 +00:00
$new_options = array ();
foreach ( $options as $type => $option_ary )
2002-10-26 12:34:39 +00:00
{
2002-10-28 00:08:18 +00:00
$option_ary = array_unique ( $option_ary );
2002-10-26 12:34:39 +00:00
foreach ( $option_ary as $option_value )
{
2002-10-28 00:08:18 +00:00
if ( ! in_array ( $option_value , $cur_options [ $type ]))
{
$new_options [ $type ][] = $option_value ;
}
$flag = substr ( $option_value , 0 , strpos ( $option_value , '_' ) + 1 );
if ( ! in_array ( $flag , $cur_options [ $type ]) && ! in_array ( $flag , $new_options [ $type ]))
{
$new_options [ $type ][] = $flag ;
}
2002-10-26 12:34:39 +00:00
}
}
2002-10-28 00:08:18 +00:00
unset ( $options );
$options = array ();
$options [ 'local' ] = array_diff ( $new_options [ 'local' ], $new_options [ 'global' ]);
$options [ 'global' ] = array_diff ( $new_options [ 'global' ], $new_options [ 'local' ]);
$options [ 'local_global' ] = array_intersect ( $new_options [ 'local' ], $new_options [ 'global' ]);
$type_sql = array ( 'local' => '0, 1' , 'global' => '1, 0' , 'local_global' => '1, 1' );
$sql = '' ;
foreach ( $options as $type => $option_ary )
{
foreach ( $option_ary as $option )
{
switch ( SQL_LAYER )
{
case 'mysql' :
case 'mysql4' :
$sql .= ( ( $sql != '' ) ? ', ' : '' ) . " (' $option ', " . $type_sql [ $type ] . " ) " ;
break ;
case 'mssql' :
$sql .= ( ( $sql != '' ) ? ' UNION ALL ' : '' ) . " SELECT ' $option ', " . $type_sql [ $type ];
break ;
default :
$sql = " INSERT INTO " . ACL_OPTIONS_TABLE . " (auth_value, is_global, is_local)
VALUES ( $option , " . $type_sql[$type] . " ) " ;
$result = $db -> sql_query ( $sql );
$db -> sql_freeresult ( $result );
$sql = '' ;
}
}
}
if ( $sql != '' )
{
$sql = " INSERT INTO " . ACL_OPTIONS_TABLE . " (auth_value, is_global, is_local)
VALUES $sql " ;
$result = $db -> sql_query ( $sql );
}
2002-10-26 12:34:39 +00:00
2002-10-28 00:08:18 +00:00
$this -> acl_cache_options ( $options );
2002-10-26 12:34:39 +00:00
}
function acl_cache_options ( $options = false )
{
global $db ;
$options = array ();
if ( ! $options )
{
$sql = " SELECT auth_value, is_global, is_local
FROM " . ACL_OPTIONS_TABLE . "
ORDER BY is_global , is_local , auth_value " ;
$result = $db -> sql_query ( $sql );
$global = $local = 0 ;
while ( $row = $db -> sql_fetchrow ( $result ) )
{
if ( ! empty ( $row [ 'is_global' ]) )
{
$options [ 'global' ][ $row [ 'auth_value' ]] = $global ++ ;
}
if ( ! empty ( $row [ 'is_local' ]) )
{
$options [ 'local' ][ $row [ 'auth_value' ]] = $local ++ ;
}
}
$db -> sql_freeresult ( $result );
}
// Re-cache options
$cache_str = " \$ acl_options = array( \n " ;
foreach ( $options as $type => $options_ary )
{
$cache_str .= " \t ' $type ' => array( \n " ;
foreach ( $options_ary as $option_value => $option_id )
{
$cache_str .= " \t \t ' $option_value ' => " . $option_id . " , \n " ;
}
$cache_str .= " \t ), \n " ;
}
$cache_str .= " ); " ;
config_cache_write ( '\$acl_options = array\(.*?\);' , $cache_str );
$this -> acl_clear_prefetch ();
2002-10-08 20:06:55 +00:00
2002-10-26 12:34:39 +00:00
return $options ;
2002-10-08 20:06:55 +00:00
}
}
2002-03-10 00:27:24 +00:00
?>