2002-07-14 14:32:45 +00:00
< ? php
2005-04-09 12:26:45 +00:00
/**
*
* @ package phpBB3
* @ version $Id $
* @ copyright ( c ) 2005 phpBB Group
* @ license http :// opensource . org / licenses / gpl - license . php GNU Public License
*
*/
/**
* Session class
*/
2002-10-20 19:19:07 +00:00
class session
{
2002-08-06 16:56:14 +00:00
var $session_id = '' ;
2005-07-04 16:54:34 +00:00
var $cookie_data = array ();
2002-10-04 13:09:10 +00:00
var $browser = '' ;
2002-10-21 14:10:45 +00:00
var $ip = '' ;
2002-10-04 13:09:10 +00:00
var $page = '' ;
2004-08-01 14:16:04 +00:00
var $current_page_filename = '' ;
2002-07-14 14:32:45 +00:00
var $load ;
2005-07-04 16:54:34 +00:00
var $time_now = 0 ;
/**
* Start session management
*
* This is where all session activity begins . We gather various pieces of
* information from the client and server . We test to see if a session already
* exists . If it does , fine and dandy . If it doesn 't we' ll go on to create a
* new one ... pretty logical heh ? We also examine the system load ( if we ' re
* running on a system which makes such information readily available ) and
* halt if it ' s above an admin definable limit .
*
* @ todo Introduce further user types , bot , guest
* @ todo Change user_type ( as above ) to a bitfield ? user_type & USER_FOUNDER for example
*/
//function session_begin()
2003-08-24 18:16:53 +00:00
function start ()
2002-07-14 14:32:45 +00:00
{
2003-02-26 19:18:09 +00:00
global $phpEx , $SID , $db , $config ;
2002-07-14 14:32:45 +00:00
2005-07-04 16:54:34 +00:00
$this -> time_now = time ();
2005-07-05 14:43:58 +00:00
$this -> browser = ( ! empty ( $_SERVER [ 'HTTP_USER_AGENT' ])) ? $_SERVER [ 'HTTP_USER_AGENT' ] : '' ;
2005-08-18 12:58:23 +00:00
$this -> page = ( ! empty ( $_SERVER [ 'REQUEST_URI' ])) ? preg_replace ( '#/?' . preg_quote ( $config [ 'script_path' ], '#' ) . '/?([a-z]+?\.' . $phpEx . '\?)sid=[a-z0-9]*(.*?)$#i' , '\1\2' , $_SERVER [ 'REQUEST_URI' ]) . (( isset ( $_POST [ 'f' ])) ? 'f=' . intval ( $_POST [ 'f' ]) : '' ) : '' ;
2005-07-04 16:54:34 +00:00
$this -> cookie_data = array ();
2005-07-05 01:53:34 +00:00
if ( isset ( $_COOKIE [ $config [ 'cookie_name' ] . '_sid' ]) || isset ( $_COOKIE [ $config [ 'cookie_name' ] . '_u' ]))
2002-07-14 14:32:45 +00:00
{
2005-07-05 01:53:34 +00:00
// Switch to request_var ... can this cause issues, can a _GET/_POST param
// be used to poison this? Not sure that it makes any difference in terms of
// the end result, be it a cookie or param.
$this -> cookie_data [ 'u' ] = request_var ( $config [ 'cookie_name' ] . '_u' , 0 );
$this -> cookie_data [ 'k' ] = request_var ( $config [ 'cookie_name' ] . '_k' , '' );
$this -> session_id = request_var ( $config [ 'cookie_name' ] . '_sid' , '' );
2005-07-05 01:01:31 +00:00
2003-01-20 05:12:38 +00:00
$SID = ( defined ( 'NEED_SID' )) ? '?sid=' . $this -> session_id : '?sid=' ;
2002-07-14 14:32:45 +00:00
}
else
{
2003-10-12 11:59:23 +00:00
$this -> session_id = request_var ( 'sid' , '' );
2002-08-06 16:56:14 +00:00
$SID = '?sid=' . $this -> session_id ;
2002-07-14 14:32:45 +00:00
}
2005-07-05 14:43:58 +00:00
// Why no forwarded_for et al? Well, too easily spoofed. With the results of my recent requests
// it's pretty clear that in the majority of cases you'll at least be left with a proxy/cache ip.
$this -> ip = ( ! empty ( $_SERVER [ 'REMOTE_ADDR' ])) ? htmlspecialchars ( $_SERVER [ 'REMOTE_ADDR' ]) : '' ;
2002-07-14 14:32:45 +00:00
// Load limit check (if applicable)
2003-08-27 16:31:54 +00:00
if ( @ file_exists ( '/proc/loadavg' ))
2002-07-14 14:32:45 +00:00
{
2003-10-12 11:59:23 +00:00
if ( $load = @ file ( '/proc/loadavg' ))
2002-07-14 14:32:45 +00:00
{
list ( $this -> load ) = explode ( ' ' , $load [ 0 ]);
2003-10-12 11:59:23 +00:00
if ( $config [ 'limit_load' ] && $this -> load > doubleval ( $config [ 'limit_load' ]))
2002-07-14 14:32:45 +00:00
{
2003-02-25 18:19:34 +00:00
trigger_error ( 'BOARD_UNAVAILABLE' );
2002-07-14 14:32:45 +00:00
}
}
}
2005-07-04 16:54:34 +00:00
// Is session_id is set or session_id is set and matches the url param if required
2005-08-18 12:58:23 +00:00
if ( ! empty ( $this -> session_id ) && ( ! defined ( 'NEED_SID' ) || ( isset ( $_GET [ 'sid' ]) && $this -> session_id === $_GET [ 'sid' ])))
2002-07-14 14:32:45 +00:00
{
2005-01-15 18:50:22 +00:00
$sql = ' SELECT u .* , s .*
FROM ' . SESSIONS_TABLE . ' s , ' . USERS_TABLE . " u
2003-08-24 18:16:53 +00:00
WHERE s . session_id = '" . $db->sql_escape($this->session_id) . "'
2005-01-15 18:50:22 +00:00
AND u . user_id = s . session_user_id " ;
2002-07-14 14:32:45 +00:00
$result = $db -> sql_query ( $sql );
2002-10-20 19:19:07 +00:00
$this -> data = $db -> sql_fetchrow ( $result );
2002-08-06 16:56:14 +00:00
$db -> sql_freeresult ( $result );
2002-07-14 14:32:45 +00:00
// Did the session exist in the DB?
2002-11-01 12:23:08 +00:00
if ( isset ( $this -> data [ 'user_id' ]))
2002-07-14 14:32:45 +00:00
{
2005-07-04 16:54:34 +00:00
// Validate IP length according to admin ... enforces an IP
// check on bots if admin requires this
// $quadcheck = ($config['ip_check_bot'] && $user->data['user_type'] & USER_BOT) ? 4 : $config['ip_check'];
2002-10-30 00:57:27 +00:00
$s_ip = implode ( '.' , array_slice ( explode ( '.' , $this -> data [ 'session_ip' ]), 0 , $config [ 'ip_check' ]));
$u_ip = implode ( '.' , array_slice ( explode ( '.' , $this -> ip ), 0 , $config [ 'ip_check' ]));
2002-10-04 13:09:10 +00:00
2003-03-24 19:03:32 +00:00
$s_browser = ( $config [ 'browser_check' ]) ? $this -> data [ 'session_browser' ] : '' ;
$u_browser = ( $config [ 'browser_check' ]) ? $this -> browser : '' ;
if ( $u_ip == $s_ip && $s_browser == $u_browser )
2002-07-14 14:32:45 +00:00
{
// Only update session DB a minute or so after last update or if page changes
2005-07-04 16:54:34 +00:00
if ( $this -> time_now - $this -> data [ 'session_time' ] > 60 || $this -> data [ 'session_page' ] != $this -> page )
2002-07-14 14:32:45 +00:00
{
2003-07-13 15:13:59 +00:00
$sql = 'UPDATE ' . SESSIONS_TABLE . "
2005-07-04 16:54:34 +00:00
SET session_time = $this -> time_now , session_page = '" . $db->sql_escape($this->page) . "'
2003-08-24 18:16:53 +00:00
WHERE session_id = '" . $db->sql_escape($this->session_id) . "' " ;
2002-07-14 14:32:45 +00:00
$db -> sql_query ( $sql );
}
2005-04-10 18:07:12 +00:00
2005-07-04 16:54:34 +00:00
// Ultimately to be removed
2005-04-10 18:07:12 +00:00
$this -> data [ 'is_registered' ] = ( $this -> data [ 'user_id' ] != ANONYMOUS && ( $this -> data [ 'user_type' ] == USER_NORMAL || $this -> data [ 'user_type' ] == USER_FOUNDER )) ? true : false ;
$this -> data [ 'is_bot' ] = ( ! $this -> data [ 'is_registered' ] && $this -> data [ 'user_id' ] != ANONYMOUS ) ? true : false ;
2005-07-04 16:54:34 +00:00
2002-10-20 19:19:07 +00:00
return true ;
2002-07-14 14:32:45 +00:00
}
}
}
2005-07-04 16:54:34 +00:00
// If we reach here then no (valid) session exists. So we'll create a new one
return $this -> session_create ();
2002-07-14 14:32:45 +00:00
}
2005-07-04 16:54:34 +00:00
/**
* Create a new session
*
* If upon trying to start a session we discover there is nothing existing we
* jump here . Additionally this method is called directly during login to regenerate
* the session for the specific user . In this method we carry out a number of tasks ;
* garbage collection , ( search ) bot checking , banned user comparison . Basically
* though this method will result in a new session for a specific user .
*/
function session_create ( $user_id = false , $set_admin = false , $persist_login = false , $viewonline = true )
2002-07-14 14:32:45 +00:00
{
2002-10-30 00:57:27 +00:00
global $SID , $db , $config ;
2002-07-14 14:32:45 +00:00
2005-07-04 16:54:34 +00:00
$this -> data = array ();
// Garbage collection ... remove old sessions updating user information
// if necessary. It means (potentially) 11 queries but only infrequently
if ( $this -> time_now > $config [ 'session_last_gc' ] + $config [ 'session_gc' ])
{
$this -> session_gc ();
}
// Do we allow autologin on this board? No? Then override anything
// that may be requested here
if ( ! $config [ 'allow_autologin' ])
{
$this -> cookie_data [ 'k' ] = $persist_login = false ;
}
2002-07-14 14:32:45 +00:00
2005-07-04 16:54:34 +00:00
/**
* Here we do a bot check , oh er saucy ! No , not that kind of bot
* check . We loop through the list of bots defined by the admin and
* see if we have any useragent and / or IP matches . If we do , this is a
* bot , act accordingly
*/
$bot = false ;
2005-05-05 16:55:05 +00:00
$active_bots = array ();
obtain_bots ( $active_bots );
foreach ( $active_bots as $row )
2003-10-15 17:43:07 +00:00
{
2003-11-20 12:49:42 +00:00
if ( $row [ 'bot_agent' ] && preg_match ( '#' . preg_quote ( $row [ 'bot_agent' ], '#' ) . '#i' , $this -> browser ))
2003-10-15 17:43:07 +00:00
{
$bot = $row [ 'user_id' ];
}
2005-07-04 16:54:34 +00:00
2005-04-10 18:07:12 +00:00
if ( $row [ 'bot_ip' ] && ( ! $row [ 'bot_agent' ] || ! $bot ))
2003-10-15 17:43:07 +00:00
{
foreach ( explode ( ',' , $row [ 'bot_ip' ]) as $bot_ip )
{
if ( strpos ( $this -> ip , $bot_ip ) === 0 )
{
2005-07-04 16:54:34 +00:00
$bot = ( int ) $row [ 'user_id' ];
2003-10-15 17:43:07 +00:00
break ;
}
}
}
2002-07-14 14:32:45 +00:00
2003-10-15 17:43:07 +00:00
if ( $bot )
2002-10-17 02:50:50 +00:00
{
2003-10-15 17:43:07 +00:00
break ;
2002-10-17 02:50:50 +00:00
}
2002-07-14 14:32:45 +00:00
}
2005-07-04 16:54:34 +00:00
// If we're presented with an autologin key we'll join against it.
// Else if we've been passed a user_id we'll grab data based on that
2005-08-18 12:58:23 +00:00
if ( isset ( $this -> cookie_data [ 'k' ]) && $this -> cookie_data [ 'k' ] && $this -> cookie_data [ 'u' ])
2002-10-04 13:09:10 +00:00
{
2005-07-04 16:54:34 +00:00
$sql = ' SELECT u .*
FROM ' . USERS_TABLE . ' u , ' . SESSIONS_KEYS_TABLE . ' k
2005-07-05 14:43:58 +00:00
WHERE u . user_id = ' . (int) $this->cookie_data[' u '] . '
2005-07-04 16:54:34 +00:00
AND u . user_type <> ' . USER_INACTIVE . "
AND k . user_id = u . user_id
AND k . key_id = '" . $db->sql_escape($this->cookie_data[' k ']) . "' " ;
$result = $db -> sql_query ( $sql );
2002-07-14 14:32:45 +00:00
2005-07-04 16:54:34 +00:00
$this -> data = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
}
else if ( $user_id !== false )
2002-07-14 14:32:45 +00:00
{
2005-07-04 16:54:34 +00:00
$this -> cookie_data [ 'k' ] = '' ;
$this -> cookie_data [ 'u' ] = $user_id ;
2005-01-02 19:06:45 +00:00
2005-01-15 18:50:22 +00:00
$sql = ' SELECT *
FROM ' . USERS_TABLE . '
2005-07-05 14:43:58 +00:00
WHERE user_id = ' . (int) $this->cookie_data[' u '] . '
2005-07-04 16:54:34 +00:00
AND user_type <> ' . USER_INACTIVE ;
2005-01-02 19:06:45 +00:00
$result = $db -> sql_query ( $sql );
2005-07-04 16:54:34 +00:00
2005-01-02 19:06:45 +00:00
$this -> data = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
2002-07-14 14:32:45 +00:00
}
2005-07-28 11:50:27 +00:00
/* echo " <br /> $sql " ;
echo " <br /> $user_id :: " . sizeof ( $this -> data ) . " :: " . ( int ) is_array ( $this -> data ) . " :: " . $db -> sql_numrows ();
print_r ( $this -> cookie_data );
print_r ( $this -> data ); */
2005-07-04 16:54:34 +00:00
// If no data was returned one or more of the following occured:
// Key didn't match one in the DB
// User does not exist
// User is inactive
// User is bot
2005-07-28 11:50:27 +00:00
if ( ! sizeof ( $this -> data ) || ! is_array ( $this -> data ))
2003-10-15 17:43:07 +00:00
{
2005-07-04 16:54:34 +00:00
$this -> cookie_data [ 'k' ] = '' ;
$this -> cookie_data [ 'u' ] = ( $bot ) ? $bot : ANONYMOUS ;
2003-10-15 17:43:07 +00:00
2005-07-04 16:54:34 +00:00
$sql = ' SELECT *
FROM ' . USERS_TABLE . '
2005-07-05 14:43:58 +00:00
WHERE user_id = ' . (int) $this->cookie_data[' u ' ];
2003-10-15 17:43:07 +00:00
$result = $db -> sql_query ( $sql );
2005-07-04 16:54:34 +00:00
$this -> data = $db -> sql_fetchrow ( $result );
2003-10-15 17:43:07 +00:00
$db -> sql_freeresult ( $result );
}
2005-07-28 11:50:27 +00:00
/* echo " <br /> $sql " ;
echo " <br /> $user_id :: " . sizeof ( $this -> data ) . " :: " . ( int ) is_array ( $this -> data ) . " :: " . $db -> sql_numrows ();
print_r ( $this -> cookie_data );
print_r ( $this -> data ); */
2005-07-04 16:54:34 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS )
2003-01-07 18:58:36 +00:00
{
2005-07-04 16:54:34 +00:00
$sql = ' SELECT session_time , session_id
FROM ' . SESSIONS_TABLE . '
2005-07-05 14:43:58 +00:00
WHERE session_user_id = ' . (int) $this->data[' user_id '] . '
2005-07-04 16:54:34 +00:00
ORDER BY session_time DESC ' ;
$result = $db -> sql_query_limit ( $sql , 1 );
2002-07-14 14:32:45 +00:00
2005-07-04 16:54:34 +00:00
if ( $sdata = $db -> sql_fetchrow ( $result ))
2002-07-14 14:32:45 +00:00
{
2005-07-04 16:54:34 +00:00
$this -> data = array_merge ( $sdata , $this -> data );
unset ( $sdata );
$this -> session_id = $this -> data [ 'session_id' ];
}
2003-01-07 18:58:36 +00:00
$db -> sql_freeresult ( $result );
2002-07-14 14:32:45 +00:00
2005-08-18 12:58:23 +00:00
$this -> data [ 'session_last_visit' ] = ( isset ( $this -> data [ 'session_time' ]) && $this -> data [ 'session_time' ]) ? $this -> data [ 'session_time' ] : (( $this -> data [ 'user_lastvisit' ]) ? $this -> data [ 'user_lastvisit' ] : time ());
2005-07-04 16:54:34 +00:00
}
else
{
$this -> data [ 'session_last_visit' ] = time ();
}
2003-04-09 22:41:25 +00:00
2005-07-04 16:54:34 +00:00
// At this stage we should have a filled data array, defined cookie u and k data.
// data array should contain recent session info if we're a real user and a recent
// session exists in which case session_id will also be set
2004-08-02 14:32:04 +00:00
2005-07-04 16:54:34 +00:00
// Is user banned? Are they excluded? Won't return on ban, exists within method
// @todo Change to !$this->data['user_type'] & USER_FOUNDER && !$this->data['user_type'] & USER_BOT in time
if ( $this -> data [ 'user_type' ] != USER_FOUNDER )
{
$this -> check_ban ();
2003-01-07 18:39:24 +00:00
}
2005-07-04 16:54:34 +00:00
//
// Do away with ultimately?
$this -> data [ 'is_registered' ] = ( ! $bot && $this -> data [ 'user_id' ] != ANONYMOUS ) ? true : false ;
2005-04-10 18:07:12 +00:00
$this -> data [ 'is_bot' ] = ( $bot ) ? true : false ;
2005-07-04 16:54:34 +00:00
//
//
2002-07-14 14:32:45 +00:00
// Create or update the session
2004-09-01 15:47:46 +00:00
$sql_ary = array (
2005-07-04 16:54:34 +00:00
'session_user_id' => ( int ) $this -> data [ 'user_id' ],
'session_start' => ( int ) $this -> time_now ,
2004-09-01 15:47:46 +00:00
'session_last_visit' => ( int ) $this -> data [ 'session_last_visit' ],
2005-07-04 16:54:34 +00:00
'session_time' => ( int ) $this -> time_now ,
2004-09-01 15:47:46 +00:00
'session_browser' => ( string ) $this -> browser ,
'session_page' => ( string ) $this -> page ,
2004-09-02 20:54:09 +00:00
'session_ip' => ( string ) $this -> ip ,
2005-08-18 12:58:23 +00:00
'session_admin' => ( $set_admin ) ? 1 : 0 ,
'session_viewonline' => ( $viewonline ) ? 1 : 0 ,
2004-09-01 15:47:46 +00:00
);
2005-07-04 16:54:34 +00:00
$db -> sql_return_on_error ( true );
2004-09-01 15:47:46 +00:00
$sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db -> sql_build_array ( 'UPDATE' , $sql_ary ) . "
2003-08-24 18:16:53 +00:00
WHERE session_id = '" . $db->sql_escape($this->session_id) . "' " ;
2005-07-04 16:54:34 +00:00
if ( ! $this -> session_id || ! $db -> sql_query ( $sql ) || ! $db -> sql_affectedrows ())
2002-07-14 14:32:45 +00:00
{
2005-07-04 16:54:34 +00:00
// Limit new sessions in 1 minute period (if required)
2005-08-18 12:58:23 +00:00
if (( ! isset ( $this -> data [ 'session_time' ]) || ! $this -> data [ 'session_time' ]) && $config [ 'active_sessions' ])
2005-07-04 16:54:34 +00:00
{
$sql = ' SELECT COUNT ( * ) AS sessions
FROM ' . SESSIONS_TABLE . '
WHERE session_time >= ' . ( $this -> time_now - 60 );
$result = $db -> sql_query ( $sql );
2005-04-30 14:24:13 +00:00
2005-07-04 16:54:34 +00:00
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
if (( int ) $row [ 'sessions' ] > ( int ) $config [ 'active_sessions' ])
{
trigger_error ( 'BOARD_UNAVAILABLE' );
}
}
$this -> session_id = $this -> data [ 'session_id' ] = md5 ( unique_id ());
2002-07-14 14:32:45 +00:00
2004-09-01 15:47:46 +00:00
$sql_ary [ 'session_id' ] = ( string ) $this -> session_id ;
$db -> sql_query ( 'INSERT INTO ' . SESSIONS_TABLE . ' ' . $db -> sql_build_array ( 'INSERT' , $sql_ary ));
2002-07-14 14:32:45 +00:00
}
$db -> sql_return_on_error ( false );
2005-07-04 16:54:34 +00:00
// Regenerate autologin/persistent login key
// @todo Change this ... check for "... && user_type & USER_NORMAL" ?
if (( ! empty ( $this -> cookie_data [ 'k' ]) || $persist_login ) && $this -> data [ 'user_id' ] != ANONYMOUS )
{
$this -> set_login_key ();
}
$SID = '?sid=' ;
2003-10-15 17:43:07 +00:00
if ( ! $bot )
{
2005-07-17 14:51:57 +00:00
$cookie_expire = $this -> time_now + (( $config [ 'max_autologin_time' ]) ? 86400 * ( int ) $config [ 'max_autologin_time' ] : 31536000 );
2005-07-05 01:01:31 +00:00
2005-07-17 14:51:57 +00:00
$this -> set_cookie ( 'u' , $this -> cookie_data [ 'u' ], $cookie_expire );
$this -> set_cookie ( 'k' , $this -> cookie_data [ 'k' ], $cookie_expire );
2005-07-04 16:54:34 +00:00
$this -> set_cookie ( 'sid' , $this -> session_id , 0 );
2002-07-14 14:32:45 +00:00
2003-10-15 17:43:07 +00:00
$SID = '?sid=' . $this -> session_id ;
2002-07-14 14:32:45 +00:00
2003-10-15 17:43:07 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS )
{
2005-07-04 16:54:34 +00:00
// global $evt;
// $evt->trigger(EVT_NEW_SESSION, $this->data);
2003-10-15 17:43:07 +00:00
}
2005-07-05 01:01:31 +00:00
unset ( $cookie_expire );
2003-10-15 17:43:07 +00:00
}
2005-07-04 16:54:34 +00:00
2002-10-20 19:19:07 +00:00
return true ;
2002-07-14 14:32:45 +00:00
}
2005-07-04 16:54:34 +00:00
/**
* Kills a session
*
* This method does what it says on the tin . It will delete a pre - existing session .
* It resets cookie information ( destroying any autologin key within that cookie data )
* and update the users information from the relevant session data . It will then
* grab guest user information .
*/
function session_kill ()
2002-07-14 14:32:45 +00:00
{
2002-10-30 00:57:27 +00:00
global $SID , $db , $config ;
2002-07-14 14:32:45 +00:00
2003-05-08 01:14:14 +00:00
$sql = 'DELETE FROM ' . SESSIONS_TABLE . "
2003-08-24 18:16:53 +00:00
WHERE session_id = '" . $db->sql_escape($this->session_id) . "'
2005-07-05 01:26:23 +00:00
AND session_user_id = " . (int) $this->data ['user_id'];
2002-07-14 14:32:45 +00:00
$db -> sql_query ( $sql );
2005-07-04 16:54:34 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS )
{
// Delete existing session, update last visit info first!
$sql = 'UPDATE ' . USERS_TABLE . '
2005-07-05 01:26:23 +00:00
SET user_lastvisit = ' . (int) $this->data[' session_time '] . '
WHERE user_id = ' . (int) $this->data[' user_id ' ];
2005-07-04 16:54:34 +00:00
$db -> sql_query ( $sql );
2005-04-10 18:07:12 +00:00
2005-07-05 01:26:23 +00:00
if ( ! empty ( $this -> cookie_data [ 'k' ]))
{
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
WHERE user_id = ' . (int) $this->data[' user_id ' ] . "
AND key_id = '" . $db->sql_escape($this->cookie_data[' k ']) . "' " ;
$db -> sql_query ( $sql );
}
2005-07-04 16:54:34 +00:00
// Reset the data array
$this -> data = array ();
$sql = ' SELECT *
FROM ' . USERS_TABLE . '
WHERE user_id = ' . ANONYMOUS ;
$result = $db -> sql_query ( $sql );
$this -> data = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
2005-07-05 01:26:23 +00:00
2005-07-04 16:54:34 +00:00
}
2005-07-17 14:51:57 +00:00
$cookie_expire = $this -> time_now - 31536000 ;
$this -> set_cookie ( 'u' , '' , $cookie_expire );
$this -> set_cookie ( 'k' , '' , $cookie_expire );
$this -> set_cookie ( 'sid' , '' , $cookie_expire );
unset ( $cookie_expire );
2005-07-04 16:54:34 +00:00
$SID = '?sid=' ;
$this -> session_id = '' ;
2002-07-14 14:32:45 +00:00
2004-09-01 15:47:46 +00:00
// Trigger EVENT_END_SESSION
2003-09-07 13:46:51 +00:00
2002-07-14 14:32:45 +00:00
return true ;
}
2005-07-04 16:54:34 +00:00
/**
* Session garbage collection
*
* This looks a lot more complex than it really is . Effectively we are
* deleting any sessions older than an admin definable limit . Due to the
* way in which we maintain session data we have to ensure we update user
* data before those sessions are destroyed . In addition this method
* removes autologin key information that is older than an admin defined
* limit .
*/
function session_gc ()
2002-07-14 14:32:45 +00:00
{
2002-10-30 00:57:27 +00:00
global $db , $config ;
2002-07-14 14:32:45 +00:00
2003-11-16 23:16:02 +00:00
switch ( SQL_LAYER )
2002-07-14 14:32:45 +00:00
{
2003-11-16 23:16:02 +00:00
case 'mysql4' :
2005-04-30 14:24:13 +00:00
case 'mysqli' :
2003-11-16 23:16:02 +00:00
// Firstly, delete guest sessions
$sql = 'DELETE FROM ' . SESSIONS_TABLE . '
WHERE session_user_id = ' . ANONYMOUS . '
2005-07-05 01:26:23 +00:00
AND session_time < ' . (int) ($this->time_now - $config[' session_length ' ]);
2003-11-16 23:16:02 +00:00
$db -> sql_query ( $sql );
// Keep only the most recent session for each user
// Note: if the user is currently browsing the board, his
// last_visit field won't be updated, which I believe should be
// the normal behavior anyway
$db -> sql_return_on_error ( TRUE );
2004-01-30 12:14:48 +00:00
2003-11-16 23:16:02 +00:00
$sql = 'DELETE FROM ' . SESSIONS_TABLE . '
USING ' . SESSIONS_TABLE . ' s1 , ' . SESSIONS_TABLE . ' s2
WHERE s1 . session_user_id = s2 . session_user_id
AND s1 . session_time < s2 . session_time ' ;
$db -> sql_query ( $sql );
2004-01-30 12:14:48 +00:00
2003-11-16 23:16:02 +00:00
$db -> sql_return_on_error ( FALSE );
// Update last visit time
$sql = 'UPDATE ' . USERS_TABLE . ' u, ' . SESSIONS_TABLE . ' s
SET u . user_lastvisit = s . session_time , u . user_lastpage = s . session_page
2005-07-05 01:26:23 +00:00
WHERE s . session_time < ' . (int) ($this->time_now - $config[' session_length ']) . '
2003-11-16 23:16:02 +00:00
AND u . user_id = s . session_user_id ' ;
$db -> sql_query ( $sql );
// Delete everything else now
$sql = 'DELETE FROM ' . SESSIONS_TABLE . '
2005-07-05 01:26:23 +00:00
WHERE session_time < ' . (int) ($this->time_now - $config[' session_length ' ]);
2003-11-16 23:16:02 +00:00
$db -> sql_query ( $sql );
2005-07-04 16:54:34 +00:00
set_config ( 'session_last_gc' , $this -> time_now );
2003-11-16 23:16:02 +00:00
break ;
2004-01-30 12:14:48 +00:00
default :
2003-11-16 23:16:02 +00:00
2004-01-30 12:14:48 +00:00
// Get expired sessions, only most recent for each user
$sql = ' SELECT session_user_id , session_page , MAX ( session_time ) AS recent_time
FROM ' . SESSIONS_TABLE . '
2005-07-04 16:54:34 +00:00
WHERE session_time < ' . ($this->time_now - $config[' session_length ']) . '
2004-01-30 12:14:48 +00:00
GROUP BY session_user_id , session_page ' ;
$result = $db -> sql_query_limit ( $sql , 5 );
$del_user_id = '' ;
$del_sessions = 0 ;
if ( $row = $db -> sql_fetchrow ( $result ))
2003-01-21 14:37:56 +00:00
{
2004-01-30 12:14:48 +00:00
do
2003-11-16 23:16:02 +00:00
{
2004-01-30 12:14:48 +00:00
if ( $row [ 'session_user_id' ] != ANONYMOUS )
{
$sql = 'UPDATE ' . USERS_TABLE . '
2004-08-02 14:32:04 +00:00
SET user_lastvisit = ' . $row[' recent_time '] . ", user_lastpage = ' " . $db->sql_escape ( $row['session_page'] ) . " '
2004-01-30 12:14:48 +00:00
WHERE user_id = " . $row['session_user_id'] ;
$db -> sql_query ( $sql );
}
2002-07-14 14:32:45 +00:00
2005-07-05 01:26:23 +00:00
$del_user_id .= (( $del_user_id != '' ) ? ', ' : '' ) . ( int ) $row [ 'session_user_id' ];
2004-01-30 12:14:48 +00:00
$del_sessions ++ ;
}
while ( $row = $db -> sql_fetchrow ( $result ));
2003-11-16 23:16:02 +00:00
}
2002-07-14 14:32:45 +00:00
2004-08-02 14:32:04 +00:00
if ( $del_user_id )
2004-01-30 12:14:48 +00:00
{
// Delete expired sessions
$sql = 'DELETE FROM ' . SESSIONS_TABLE . "
WHERE session_user_id IN ( $del_user_id )
2005-07-04 16:54:34 +00:00
AND session_time < " . ( $this->time_now - $config['session_length'] );
2004-01-30 12:14:48 +00:00
$db -> sql_query ( $sql );
}
2002-07-14 14:32:45 +00:00
2004-01-30 12:14:48 +00:00
if ( $del_sessions < 5 )
{
// Less than 5 sessions, update gc timer ... else we want gc
// called again to delete other sessions
2005-07-04 16:54:34 +00:00
set_config ( 'session_last_gc' , $this -> time_now );
2004-01-30 12:14:48 +00:00
}
break ;
2002-08-22 17:55:55 +00:00
}
2002-07-14 14:32:45 +00:00
return ;
}
2005-07-04 16:54:34 +00:00
/**
* Sets a cookie
*
* Sets a cookie of the given name with the specified data for the given length of time .
*/
2002-10-05 11:38:10 +00:00
function set_cookie ( $name , $cookiedata , $cookietime )
{
2002-10-30 00:57:27 +00:00
global $config ;
2002-10-05 11:38:10 +00:00
2005-07-04 16:54:34 +00:00
setcookie ( $config [ 'cookie_name' ] . '_' . $name , $cookiedata , $cookietime , $config [ 'cookie_path' ]);
}
/**
* Check for banned user
*
* Checks whether the supplied user is banned by id , ip or email . If no parameters
* are passed to the method pre - existing session data is used . This routine does
* not return on finding a banned user , it outputs a relevant message and stops
* execution .
*/
function check_ban ( $user_id = false , $user_ip = false , $user_email = false )
{
global $config , $db ;
$user_id = ( $user_id === false ) ? $this -> data [ 'user_id' ] : $user_id ;
$user_ip = ( $user_ip === false ) ? $this -> ip : $user_ip ;
$user_email = ( $user_email === false ) ? $this -> data [ 'user_email' ] : $user_email ;
$banned = false ;
$sql = ' SELECT ban_ip , ban_userid , ban_email , ban_exclude , ban_give_reason , ban_end
FROM ' . BANLIST_TABLE . '
WHERE ban_end >= ' . time() . '
OR ban_end = 0 ' ;
$result = $db -> sql_query ( $sql );
if ( $row = $db -> sql_fetchrow ( $result ))
2005-01-02 19:06:45 +00:00
{
2005-07-04 16:54:34 +00:00
do
{
if (( ! empty ( $row [ 'ban_userid' ]) && intval ( $row [ 'ban_userid' ]) == $user_id ) ||
( ! empty ( $row [ 'ban_ip' ]) && preg_match ( '#^' . str_replace ( '*' , '.*?' , $row [ 'ban_ip' ]) . '$#i' , $user_ip )) ||
( ! empty ( $row [ 'ban_email' ]) && preg_match ( '#^' . str_replace ( '*' , '.*?' , $row [ 'ban_email' ]) . '$#i' , $user_email )))
{
if ( ! empty ( $row [ 'ban_exclude' ]))
{
$banned = false ;
break ;
}
else
{
$banned = true ;
2005-09-21 11:07:20 +00:00
$ban_row = $row ;
// Don't break. Check if there is an exclude rule for this user
2005-07-04 16:54:34 +00:00
}
}
}
while ( $row = $db -> sql_fetchrow ( $result ));
2005-01-02 19:06:45 +00:00
}
2005-07-04 16:54:34 +00:00
$db -> sql_freeresult ( $result );
if ( $banned )
{
// Initiate environment ... since it won't be set at this stage
$this -> setup ();
2005-09-21 12:12:58 +00:00
// Logout the user, banned users are unable to use the normal 'logout' link
if ( $this -> data [ 'user_id' ] != ANONYMOUS )
{
$this -> session_kill ();
}
2005-07-04 16:54:34 +00:00
// Determine which message to output
2005-09-21 11:07:20 +00:00
$till_date = ( ! empty ( $ban_row [ 'ban_end' ])) ? $this -> format_date ( $ban_row [ 'ban_end' ]) : '' ;
$message = ( ! empty ( $ban_row [ 'ban_end' ])) ? 'BOARD_BAN_TIME' : 'BOARD_BAN_PERM' ;
2005-07-04 16:54:34 +00:00
$message = sprintf ( $this -> lang [ $message ], $till_date , '<a href="mailto:' . $config [ 'board_contact' ] . '">' , '</a>' );
// More internal HTML ...
2005-09-21 11:07:20 +00:00
// TODO: 'ban_show_reason' isn't used in the admin yet.
$message .= ( ! empty ( $ban_row [ 'ban_show_reason' ])) ? '<br /><br />' . sprintf ( $this -> lang [ 'BOARD_BAN_REASON' ], $ban_row [ 'ban_show_reason' ]) : '' ;
2005-07-04 16:54:34 +00:00
trigger_error ( $message );
}
return false ;
}
/**
* Set / Update a persistent login key
*
* This method creates or updates a persistent session key . When a user makes
* use of persistent ( formerly auto - ) logins a key is generated and stored in the
* DB . When they revisit with the same key it ' s automatically updated in both the
* DB and cookie . Multiple keys may exist for each user representing different
* browsers or locations . As with _any_ non - secure - socket no passphrase login this
* remains vulnerable to exploit . However , by rotating the keys and seperating them
* from the password hash it 's more secure than 2.0.x. Don' t be surprised to see
* this backported !
*/
function set_login_key ( $user_id = false , $key = false , $user_ip = false )
{
global $config , $db ;
$user_id = ( $user_id === false ) ? $this -> data [ 'user_id' ] : $user_id ;
$user_ip = ( $user_ip === false ) ? $this -> ip : $user_ip ;
2005-07-28 11:50:27 +00:00
$key = ( $key === false ) ? (( ! empty ( $this -> cookie_data [ 'k' ])) ? $this -> cookie_data [ 'k' ] : false ) : $key ;
2005-07-04 16:54:34 +00:00
$sql_ary = array (
'key_id' => ( string ) md5 ( unique_id ()),
'last_ip' => ( string ) $this -> ip ,
'last_login' => ( int ) time ()
);
if ( ! $key )
{
$sql_ary += array (
'user_id' => ( int ) $user_id
);
}
2005-07-28 11:50:27 +00:00
$sql = ( $key ) ? 'UPDATE ' . SESSIONS_KEYS_TABLE . ' SET ' . $db -> sql_build_array ( 'UPDATE' , $sql_ary ) . ' WHERE user_id = ' . ( int ) $user_id . ' AND key_id = "' . $db -> sql_escape ( $key ) . '"' : 'INSERT INTO ' . SESSIONS_KEYS_TABLE . ' ' . $db -> sql_build_array ( 'INSERT' , $sql_ary );
2005-07-04 16:54:34 +00:00
$db -> sql_query ( $sql );
$this -> cookie_data [ 'k' ] = $sql_ary [ 'key_id' ];
unset ( $sql_ary );
return false ;
}
/**
* Remove stale login keys
*
* @ private
*/
function tidy_login_keys ()
{
global $config , $db ;
if ( ! empty ( $config [ 'max_autologin_time' ]))
2005-01-02 19:06:45 +00:00
{
2005-07-04 16:54:34 +00:00
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
WHERE last_login < ' . (time() - (86400 * (int) $config[' max_autologin_time ' ]));
$db -> sql_query ( $sql );
2005-01-02 19:06:45 +00:00
}
2005-07-04 16:54:34 +00:00
return false ;
2002-10-05 11:38:10 +00:00
}
2002-07-14 14:32:45 +00:00
}
2005-07-05 01:01:31 +00:00
2005-04-09 12:26:45 +00:00
/**
2005-07-04 16:54:34 +00:00
* Base user class
*
* This is the overarching class which contains ( through session extend )
* all methods utilised for user functionality during a session .
2005-04-09 12:26:45 +00:00
*/
2002-10-20 19:19:07 +00:00
class user extends session
2002-10-04 13:09:10 +00:00
{
2002-10-20 19:19:07 +00:00
var $lang = array ();
2004-02-28 21:16:15 +00:00
var $help = array ();
2002-10-20 19:19:07 +00:00
var $theme = array ();
2002-10-04 13:09:10 +00:00
var $date_format ;
var $timezone ;
var $dst ;
2002-10-20 19:19:07 +00:00
var $lang_name ;
var $lang_path ;
var $img_lang ;
2005-03-21 23:10:11 +00:00
var $keyoptions = array ( 'viewimg' => 0 , 'viewflash' => 1 , 'viewsmilies' => 2 , 'viewsigs' => 3 , 'viewavatars' => 4 , 'viewcensors' => 5 , 'attachsig' => 6 , 'html' => 7 , 'bbcode' => 8 , 'smilies' => 9 , 'popuppm' => 10 , 'report_pm_notify' => 11 );
2003-08-27 22:25:43 +00:00
var $keyvalues = array ();
2003-08-27 16:31:54 +00:00
2002-10-20 19:19:07 +00:00
function setup ( $lang_set = false , $style = false )
2002-10-04 13:09:10 +00:00
{
2004-02-28 21:24:52 +00:00
global $db , $template , $config , $auth , $phpEx , $phpbb_root_path ;
2002-10-04 13:09:10 +00:00
2002-11-01 12:23:08 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS )
2002-10-04 13:09:10 +00:00
{
2004-05-26 20:29:39 +00:00
$this -> lang_name = ( file_exists ( $phpbb_root_path . 'language/' . $this -> data [ 'user_lang' ] . " /common. $phpEx " )) ? $this -> data [ 'user_lang' ] : $config [ 'default_lang' ];
2002-10-08 20:06:55 +00:00
$this -> lang_path = $phpbb_root_path . 'language/' . $this -> lang_name . '/' ;
2002-10-04 13:09:10 +00:00
2002-10-20 19:19:07 +00:00
$this -> date_format = $this -> data [ 'user_dateformat' ];
$this -> timezone = $this -> data [ 'user_timezone' ] * 3600 ;
$this -> dst = $this -> data [ 'user_dst' ] * 3600 ;
2002-10-04 13:09:10 +00:00
}
2002-10-20 19:19:07 +00:00
else
2002-10-04 13:09:10 +00:00
{
2002-10-30 00:57:27 +00:00
$this -> lang_name = $config [ 'default_lang' ];
2002-10-08 20:06:55 +00:00
$this -> lang_path = $phpbb_root_path . 'language/' . $this -> lang_name . '/' ;
2002-10-30 00:57:27 +00:00
$this -> date_format = $config [ 'default_dateformat' ];
$this -> timezone = $config [ 'board_timezone' ] * 3600 ;
2003-04-09 22:41:25 +00:00
$this -> dst = $config [ 'board_dst' ] * 3600 ;
2002-10-08 20:06:55 +00:00
2002-11-01 12:23:08 +00:00
if ( isset ( $_SERVER [ 'HTTP_ACCEPT_LANGUAGE' ]))
2002-10-04 13:09:10 +00:00
{
2002-10-20 19:19:07 +00:00
$accept_lang_ary = explode ( ',' , $_SERVER [ 'HTTP_ACCEPT_LANGUAGE' ]);
2002-11-01 12:23:08 +00:00
foreach ( $accept_lang_ary as $accept_lang )
2002-10-04 13:09:10 +00:00
{
2002-10-20 19:19:07 +00:00
// Set correct format ... guess full xx_YY form
$accept_lang = substr ( $accept_lang , 0 , 2 ) . '_' . strtoupper ( substr ( $accept_lang , 3 , 2 ));
2004-05-26 20:29:39 +00:00
if ( file_exists ( $phpbb_root_path . 'language/' . $accept_lang . " /common. $phpEx " ))
2002-10-04 13:09:10 +00:00
{
2005-01-23 23:02:10 +00:00
$this -> lang_name = $config [ 'default_lang' ] = $accept_lang ;
2002-10-08 20:06:55 +00:00
$this -> lang_path = $phpbb_root_path . 'language/' . $accept_lang . '/' ;
2002-10-04 13:09:10 +00:00
break ;
}
2002-10-20 19:19:07 +00:00
else
{
// No match on xx_YY so try xx
$accept_lang = substr ( $accept_lang , 0 , 2 );
2004-05-26 20:29:39 +00:00
if ( file_exists ( $phpbb_root_path . 'language/' . $accept_lang . " /common. $phpEx " ))
2002-10-20 19:19:07 +00:00
{
2005-01-23 23:02:10 +00:00
$this -> lang_name = $config [ 'default_lang' ] = $accept_lang ;
2002-10-20 19:19:07 +00:00
$this -> lang_path = $phpbb_root_path . 'language/' . $accept_lang . '/' ;
break ;
}
}
2002-10-04 13:09:10 +00:00
}
}
}
2004-08-15 12:06:05 +00:00
// We include common language file here to not load it every time a custom language file is included
$lang = & $this -> lang ;
2005-03-17 22:41:20 +00:00
if (( @ include $this -> lang_path . " common. $phpEx " ) === FALSE )
{
die ( " Language file " . $this -> lang_path . " common. $phpEx " . " couldn't be opened. " );
}
2004-08-15 12:06:05 +00:00
2004-02-28 21:16:15 +00:00
$this -> add_lang ( $lang_set );
unset ( $lang_set );
2004-09-01 15:47:46 +00:00
2003-07-13 21:40:03 +00:00
if ( ! empty ( $_GET [ 'style' ]) && $auth -> acl_get ( 'a_styles' ))
{
global $SID ;
2003-09-07 13:46:51 +00:00
2005-01-15 18:50:22 +00:00
$style = request_var ( 'style' , 0 );
$SID .= '&style=' . $style ;
2003-07-13 21:40:03 +00:00
}
else
{
// Set up style
$style = ( $style ) ? $style : (( ! $config [ 'override_user_style' ] && $this -> data [ 'user_id' ] != ANONYMOUS ) ? $this -> data [ 'user_style' ] : $config [ 'default_style' ]);
}
2002-10-04 13:09:10 +00:00
2005-05-05 16:55:05 +00:00
// TODO: DISTINCT making problems with DBMS not able to distinct TEXT fields, test grouping
2005-04-30 14:24:13 +00:00
switch ( SQL_LAYER )
{
case 'mssql' :
2005-08-18 12:58:23 +00:00
case 'mssql_odbc' :
2005-04-30 14:24:13 +00:00
$sql = ' SELECT s . style_id , t .* , c .* , i .*
FROM ' . STYLES_TABLE . ' s , ' . STYLES_TPL_TABLE . ' t , ' . STYLES_CSS_TABLE . ' c , ' . STYLES_IMAGE_TABLE . " i
WHERE s . style_id IN ( $style , " . $config['default_style'] . ')
AND t . template_id = s . template_id
AND c . theme_id = s . theme_id
2005-05-05 16:55:05 +00:00
AND i . imageset_id = s . imageset_id
GROUP BY s . style_id ' ;
2005-04-30 14:24:13 +00:00
break ;
default :
2005-05-05 16:55:05 +00:00
$sql = ' SELECT s . style_id , t .* , c .* , i .*
2005-04-30 14:24:13 +00:00
FROM ' . STYLES_TABLE . ' s , ' . STYLES_TPL_TABLE . ' t , ' . STYLES_CSS_TABLE . ' c , ' . STYLES_IMAGE_TABLE . " i
WHERE s . style_id IN ( $style , " . $config['default_style'] . ')
AND t . template_id = s . template_id
AND c . theme_id = s . theme_id
2005-05-05 16:55:05 +00:00
AND i . imageset_id = s . imageset_id
GROUP BY s . style_id ' ;
2005-04-30 14:24:13 +00:00
break ;
}
2003-09-07 13:46:51 +00:00
$result = $db -> sql_query ( $sql , 3600 );
2002-10-04 13:09:10 +00:00
2003-07-13 15:13:59 +00:00
if ( ! ( $row = $db -> sql_fetchrow ( $result )))
2002-10-04 13:09:10 +00:00
{
2003-01-20 05:12:38 +00:00
trigger_error ( 'Could not get style data' );
2002-10-04 13:09:10 +00:00
}
2003-07-13 15:13:59 +00:00
$this -> theme = ( $row2 = $db -> sql_fetchrow ( $result )) ? array (
2004-08-02 14:32:04 +00:00
( $style == $row [ 'style_id' ]) ? 'primary' : 'secondary' => $row ,
2003-07-13 15:13:59 +00:00
( $style == $row2 [ 'style_id' ]) ? 'primary' : 'secondary' => $row2 ) : array ( 'primary' => $row );
$db -> sql_freeresult ( $result );
2004-08-02 14:32:04 +00:00
2003-07-13 15:13:59 +00:00
unset ( $row );
unset ( $row2 );
2002-10-04 13:09:10 +00:00
2004-09-04 19:32:23 +00:00
// Add to template database
foreach ( array_keys ( $this -> theme ) as $style_priority )
2004-05-26 20:29:39 +00:00
{
2004-09-04 19:32:23 +00:00
$this -> theme [ $style_priority ][ 'pagination_sep' ] = ', ' ;
2004-05-26 20:29:39 +00:00
}
2005-01-20 20:57:45 +00:00
// TEMP
$this -> theme [ 'primary' ][ 'parse_css_file' ] = false ;
if ( ! $this -> theme [ 'primary' ][ 'theme_storedb' ] && $this -> theme [ 'primary' ][ 'parse_css_file' ])
{
$this -> theme [ 'primary' ][ 'theme_storedb' ] = 1 ;
2005-07-04 16:54:34 +00:00
2005-01-20 20:57:45 +00:00
$sql_ary = array (
'theme_data' => implode ( '' , file ( " { $phpbb_root_path } styles/ " . $this -> theme [ 'primary' ][ 'theme_path' ] . '/theme/stylesheet.css' )),
'theme_mtime' => time (),
'theme_storedb' => 1
);
$db -> sql_query ( 'UPDATE ' . STYLES_CSS_TABLE . ' SET ' . $db -> sql_build_array ( 'UPDATE' , $sql_ary ) . '
WHERE theme_id = ' . $style );
2005-07-04 16:54:34 +00:00
2005-01-20 20:57:45 +00:00
unset ( $sql_ary );
}
2003-07-13 15:13:59 +00:00
$template -> set_template ();
2004-01-08 12:49:05 +00:00
$this -> img_lang = ( file_exists ( $phpbb_root_path . 'styles/' . $this -> theme [ 'primary' ][ 'imageset_path' ] . '/imageset/' . $this -> lang_name )) ? $this -> lang_name : $config [ 'default_lang' ];
2002-10-04 13:09:10 +00:00
2004-08-02 14:32:04 +00:00
// Is board disabled and user not an admin or moderator?
// TODO
// New ACL enabling board access while offline?
if ( $config [ 'board_disable' ] && ! defined ( 'IN_LOGIN' ) && ! $auth -> acl_gets ( 'a_' , 'm_' ))
{
$message = ( ! empty ( $config [ 'board_disable_msg' ])) ? $config [ 'board_disable_msg' ] : 'BOARD_DISABLE' ;
trigger_error ( $message );
}
2004-02-05 13:38:57 +00:00
// Does the user need to change their password? If so, redirect to the
// ucp profile reg_details page ... of course do not redirect if we're
// already in the ucp
if ( ! defined ( 'IN_ADMIN' ) && $config [ 'chg_passforce' ] && $this -> data [ 'user_passchg' ] < time () - ( $config [ 'chg_passforce' ] * 86400 ))
{
global $SID ;
if ( ! preg_match ( '#' . preg_quote ( " ucp. $phpEx $SID " ) . '&i\=[a-z0-9]+?&mode\=reg_details#' , $_SERVER [ 'REQUEST_URI' ]))
{
redirect ( " ucp. $phpEx $SID &i=profile&mode=reg_details " );
}
}
2002-10-04 13:09:10 +00:00
return ;
}
2004-02-28 21:16:15 +00:00
// Add Language Items - use_db and use_help are assigned where needed (only use them to force inclusion)
//
// $lang_set = array('posting', 'help' => 'faq');
// $lang_set = array('posting', 'viewtopic', 'help' => array('bbcode', 'faq'))
// $lang_set = array(array('posting', 'viewtopic'), 'help' => array('bbcode', 'faq'))
// $lang_set = 'posting'
// $lang_set = array('help' => 'faq', 'db' => array('help:faq', 'posting'))
function add_lang ( $lang_set , $use_db = false , $use_help = false )
{
2004-08-15 12:06:05 +00:00
global $phpEx ;
2004-02-29 12:51:18 +00:00
2004-02-28 21:16:15 +00:00
if ( is_array ( $lang_set ))
{
foreach ( $lang_set as $key => $lang_file )
{
2004-08-02 14:32:04 +00:00
// Please do not delete this line.
2004-03-06 16:58:34 +00:00
// We have to force the type here, else [array] language inclusion will not work
$key = ( string ) $key ;
2004-02-28 21:16:15 +00:00
if ( $key == 'db' )
{
$this -> add_lang ( $lang_file , true , $use_help );
}
else if ( $key == 'help' )
{
$this -> add_lang ( $lang_file , $use_db , true );
}
else if ( ! is_array ( $lang_file ))
{
2004-08-15 12:06:05 +00:00
$this -> set_lang ( $this -> lang , $this -> help , $lang_file , $use_db , $use_help );
2004-02-28 21:16:15 +00:00
}
else
{
$this -> add_lang ( $lang_file , $use_db , $use_help );
}
}
unset ( $lang_set );
}
else if ( $lang_set )
{
2004-08-15 12:06:05 +00:00
$this -> set_lang ( $this -> lang , $this -> help , $lang_set , $use_db , $use_help );
2004-02-28 21:16:15 +00:00
}
}
2004-08-15 12:06:05 +00:00
function set_lang ( & $lang , & $help , $lang_file , $use_db = false , $use_help = false )
2004-02-29 12:51:18 +00:00
{
2004-08-15 12:06:05 +00:00
global $phpEx ;
2004-02-29 12:51:18 +00:00
2004-08-15 12:06:05 +00:00
// $lang == $this->lang
// $help == $this->help
// - add appropiate variables here, name them as they are used within the language file...
2004-02-29 12:51:18 +00:00
if ( ! $use_db )
{
2005-03-17 22:41:20 +00:00
if ( ( @ include $this -> lang_path . (( $use_help ) ? 'help_' : '' ) . " $lang_file . $phpEx " ) === FALSE )
{
trigger_error ( " Language file " . $this -> lang_path . (( $use_help ) ? 'help_' : '' ) . " $lang_file . $phpEx " . " couldn't be opened. " );
}
2004-02-29 12:51:18 +00:00
}
else if ( $use_db )
{
// Get Database Language Strings
// Put them into $lang if nothing is prefixed, put them into $help if help: is prefixed
// For example: help:faq, posting
}
}
2004-08-02 14:32:04 +00:00
function format_date ( $gmepoch , $format = false , $forcedate = false )
2002-10-04 13:09:10 +00:00
{
2004-08-02 14:32:04 +00:00
static $lang_dates , $midnight ;
2002-10-04 13:09:10 +00:00
2002-11-01 12:23:08 +00:00
if ( empty ( $lang_dates ))
2002-10-04 13:09:10 +00:00
{
2002-11-01 12:23:08 +00:00
foreach ( $this -> lang [ 'datetime' ] as $match => $replace )
2002-10-04 13:09:10 +00:00
{
$lang_dates [ $match ] = $replace ;
}
}
2004-01-11 00:46:46 +00:00
2002-11-01 12:23:08 +00:00
$format = ( ! $format ) ? $this -> date_format : $format ;
2004-01-11 00:46:46 +00:00
2004-08-02 14:32:04 +00:00
if ( ! $midnight )
{
list ( $d , $m , $y ) = explode ( ' ' , gmdate ( 'j n Y' , time () + $this -> timezone + $this -> dst ));
$midnight = gmmktime ( 0 , 0 , 0 , $m , $d , $y ) - $this -> timezone - $this -> dst ;
}
2005-01-20 20:57:45 +00:00
if ( strpos ( $format , '|' ) === false || ( ! ( $gmepoch > $midnight && ! $forcedate ) && ! ( $gmepoch > $midnight - 86400 && ! $forcedate )))
2004-08-02 14:32:04 +00:00
{
2005-01-20 20:57:45 +00:00
return strtr ( @ gmdate ( str_replace ( '|' , '' , $format ), $gmepoch + $this -> timezone + $this -> dst ), $lang_dates );
2004-08-02 14:32:04 +00:00
}
2005-07-04 16:54:34 +00:00
2005-01-20 20:57:45 +00:00
if ( $gmepoch > $midnight && ! $forcedate )
2004-08-02 14:32:04 +00:00
{
2005-01-20 20:57:45 +00:00
$format = substr ( $format , 0 , strpos ( $format , '|' )) . '||' . substr ( strrchr ( $format , '|' ), 1 );
return str_replace ( '||' , $this -> lang [ 'datetime' ][ 'TODAY' ], strtr ( @ gmdate ( $format , $gmepoch + $this -> timezone + $this -> dst ), $lang_dates ));
2004-08-02 14:32:04 +00:00
}
2005-01-20 20:57:45 +00:00
else if ( $gmepoch > $midnight - 86400 && ! $forcedate )
2004-08-02 14:32:04 +00:00
{
2005-01-20 20:57:45 +00:00
$format = substr ( $format , 0 , strpos ( $format , '|' )) . '||' . substr ( strrchr ( $format , '|' ), 1 );
return str_replace ( '||' , $this -> lang [ 'datetime' ][ 'YESTERDAY' ], strtr ( @ gmdate ( $format , $gmepoch + $this -> timezone + $this -> dst ), $lang_dates ));
2004-08-02 14:32:04 +00:00
}
2002-10-04 13:09:10 +00:00
}
2002-10-20 19:19:07 +00:00
2004-01-10 12:23:24 +00:00
function get_iso_lang_id ()
{
global $config , $db ;
2004-05-26 20:29:39 +00:00
if ( isset ( $this -> lang_id ))
2004-01-10 12:23:24 +00:00
{
return $this -> lang_id ;
}
2004-01-11 00:46:46 +00:00
if ( ! $this -> lang_name )
2004-01-10 12:23:24 +00:00
{
$this -> lang_name = $config [ 'default_lang' ];
}
2004-08-02 14:32:04 +00:00
$sql = ' SELECT lang_id
2004-02-21 12:47:35 +00:00
FROM ' . LANG_TABLE . "
WHERE lang_iso = '{$this->lang_name}' " ;
2004-01-11 00:46:46 +00:00
$result = $db -> sql_query ( $sql );
2004-01-10 12:23:24 +00:00
return ( int ) $db -> sql_fetchfield ( 'lang_id' , 0 , $result );
}
// Get profile fields for user
function get_profile_fields ( $user_id )
{
global $user , $db ;
2004-08-02 14:32:04 +00:00
2004-01-10 12:23:24 +00:00
if ( isset ( $user -> profile_fields ))
{
return ;
}
2004-05-31 18:00:10 +00:00
$sql = 'SELECT * FROM ' . PROFILE_DATA_TABLE . "
2004-02-21 12:47:35 +00:00
WHERE user_id = $user_id " ;
2004-08-02 14:32:04 +00:00
$result = $db -> sql_query_limit ( $sql , 1 );
2004-01-10 12:23:24 +00:00
$user -> profile_fields = ( ! ( $row = $db -> sql_fetchrow ( $result ))) ? array () : $row ;
2004-05-31 18:00:10 +00:00
$db -> sql_freeresult ( $result );
2004-01-10 12:23:24 +00:00
}
2005-04-20 19:59:59 +00:00
function img ( $img , $alt = '' , $width = false , $suffix = '' , $type = 'full_tag' )
2002-10-20 19:19:07 +00:00
{
2004-08-04 19:10:15 +00:00
static $imgs ;
global $phpbb_root_path ;
2002-10-20 19:19:07 +00:00
2004-09-05 15:45:50 +00:00
if ( empty ( $imgs [ $img . $suffix ]) || $width !== false )
2002-10-20 19:19:07 +00:00
{
2004-09-04 19:32:23 +00:00
if ( ! isset ( $this -> theme [ 'primary' ][ $img ]) || ! $this -> theme [ 'primary' ][ $img ])
2004-05-26 20:29:39 +00:00
{
2004-06-02 18:07:40 +00:00
// Do not fill the image to let designers decide what to do if the image is empty
$imgs [ $img . $suffix ] = '' ;
2004-05-26 20:29:39 +00:00
return $imgs [ $img . $suffix ];
}
2004-08-02 14:32:04 +00:00
2004-09-05 15:45:50 +00:00
if ( $width === false )
2004-01-08 12:49:05 +00:00
{
list ( $imgsrc , $height , $width ) = explode ( '*' , $this -> theme [ 'primary' ][ $img ]);
}
else
{
list ( $imgsrc , $height ) = explode ( '*' , $this -> theme [ 'primary' ][ $img ]);
}
2003-02-17 06:20:41 +00:00
2004-01-11 00:46:46 +00:00
if ( $suffix !== '' )
{
$imgsrc = str_replace ( '{SUFFIX}' , $suffix , $imgsrc );
}
2005-04-20 19:59:59 +00:00
$imgs [ $img . $suffix ][ 'src' ] = $phpbb_root_path . 'styles/' . $this -> theme [ 'primary' ][ 'imageset_path' ] . '/imageset/' . str_replace ( '{LANG}' , $this -> img_lang , $imgsrc );
$imgs [ $img . $suffix ][ 'width' ] = $width ;
2005-04-21 19:27:03 +00:00
$imgs [ $img . $suffix ][ 'height' ] = $height ;
2002-10-20 19:19:07 +00:00
}
2004-01-08 12:49:05 +00:00
2004-10-13 20:41:55 +00:00
$alt = ( ! empty ( $this -> lang [ $alt ])) ? $this -> lang [ $alt ] : $alt ;
2005-04-20 19:59:59 +00:00
switch ( $type )
{
case 'src' :
return $imgs [ $img . $suffix ][ 'src' ];
break ;
case 'width' :
return $imgs [ $img . $suffix ][ 'width' ];
break ;
case 'height' :
return $imgs [ $img . $suffix ][ 'height' ];
break ;
default :
return '<img src="' . $imgs [ $img . $suffix ][ 'src' ] . '"' . (( $imgs [ $img . $suffix ][ 'width' ]) ? ' width="' . $imgs [ $img . $suffix ][ 'width' ] . '"' : '' ) . (( $imgs [ $img . $suffix ][ 'height' ]) ? ' height="' . $imgs [ $img . $suffix ][ 'height' ] . '"' : '' ) . ' alt="' . $alt . '" title="' . $alt . '" />' ;
break ;
}
2002-10-20 19:19:07 +00:00
}
2003-08-27 16:31:54 +00:00
2004-10-08 11:01:30 +00:00
// Start code for checking/setting option bit field for user table
2004-02-10 01:16:48 +00:00
function optionget ( $key , $data = false )
2003-08-27 16:31:54 +00:00
{
2003-08-27 22:25:43 +00:00
if ( ! isset ( $this -> keyvalues [ $key ]))
2003-08-27 16:31:54 +00:00
{
2004-02-10 01:16:48 +00:00
$var = ( $data ) ? $data : $this -> data [ 'user_options' ];
$this -> keyvalues [ $key ] = ( $var & 1 << $this -> keyoptions [ $key ]) ? true : false ;
2003-08-27 16:31:54 +00:00
}
2003-08-27 22:25:43 +00:00
return $this -> keyvalues [ $key ];
}
2004-02-10 01:16:48 +00:00
function optionset ( $key , $value , $data = false )
2003-08-27 22:25:43 +00:00
{
2004-02-10 01:16:48 +00:00
$var = ( $data ) ? $data : $this -> data [ 'user_options' ];
if ( $value && ! ( $var & 1 << $this -> keyoptions [ $key ]))
2003-10-12 00:00:03 +00:00
{
2004-02-10 01:16:48 +00:00
$var += 1 << $this -> keyoptions [ $key ];
2003-10-12 00:00:03 +00:00
}
2004-02-10 01:16:48 +00:00
else if ( ! $value && ( $var & 1 << $this -> keyoptions [ $key ]))
2003-10-12 00:00:03 +00:00
{
2004-02-10 01:16:48 +00:00
$var -= 1 << $this -> keyoptions [ $key ];
2003-10-12 00:00:03 +00:00
}
else
{
2004-02-10 01:16:48 +00:00
return ( $data ) ? $var : false ;
2003-10-12 00:00:03 +00:00
}
2004-02-10 01:16:48 +00:00
if ( ! $data )
{
$this -> data [ 'user_options' ] = $var ;
2004-08-02 14:32:04 +00:00
return true ;
2004-02-10 01:16:48 +00:00
}
else
{
return $var ;
}
2003-08-27 16:31:54 +00:00
}
2002-10-04 13:09:10 +00:00
}
2002-08-22 17:55:55 +00:00
2005-07-04 16:54:34 +00:00
2002-10-04 13:09:10 +00:00
class auth
2002-08-13 16:34:17 +00:00
{
2002-08-15 15:45:22 +00:00
var $founder = false ;
2003-07-04 17:17:37 +00:00
var $acl = array ();
2003-01-29 16:12:21 +00:00
var $option = array ();
2003-03-29 18:25:41 +00:00
var $acl_options = array ();
2002-08-15 15:45:22 +00:00
2002-11-01 12:23:08 +00:00
function acl ( & $userdata )
2002-07-14 14:32:45 +00:00
{
2003-03-29 18:25:41 +00:00
global $db , $cache ;
2005-07-28 11:50:27 +00:00
2003-03-29 18:25:41 +00:00
if ( ! ( $this -> acl_options = $cache -> get ( 'acl_options' )))
2002-07-14 14:32:45 +00:00
{
2004-08-02 14:32:04 +00:00
$sql = ' SELECT auth_option , is_global , is_local
FROM ' . ACL_OPTIONS_TABLE . '
2003-07-04 17:17:37 +00:00
ORDER BY auth_option_id ' ;
2003-03-29 18:25:41 +00:00
$result = $db -> sql_query ( $sql );
$global = $local = 0 ;
while ( $row = $db -> sql_fetchrow ( $result ))
2002-10-20 19:19:07 +00:00
{
2003-03-29 18:25:41 +00:00
if ( ! empty ( $row [ 'is_global' ]))
{
2003-04-12 20:01:57 +00:00
$this -> acl_options [ 'global' ][ $row [ 'auth_option' ]] = $global ++ ;
2003-03-29 18:25:41 +00:00
}
if ( ! empty ( $row [ 'is_local' ]))
{
2003-04-12 20:01:57 +00:00
$this -> acl_options [ 'local' ][ $row [ 'auth_option' ]] = $local ++ ;
2003-03-29 18:25:41 +00:00
}
2002-10-20 19:19:07 +00:00
}
2003-03-29 18:25:41 +00:00
$db -> sql_freeresult ( $result );
2002-10-20 19:19:07 +00:00
2003-03-29 18:25:41 +00:00
$cache -> put ( 'acl_options' , $this -> acl_options );
2003-03-30 14:22:34 +00:00
$this -> acl_clear_prefetch ();
2003-03-29 18:25:41 +00:00
$this -> acl_cache ( $userdata );
}
2005-04-30 14:24:13 +00:00
else if ( ! trim ( $userdata [ 'user_permissions' ]))
2003-03-29 18:25:41 +00:00
{
$this -> acl_cache ( $userdata );
}
2002-10-20 19:19:07 +00:00
2003-07-04 17:17:37 +00:00
foreach ( explode ( " \n " , $userdata [ 'user_permissions' ]) as $f => $seq )
2003-03-29 18:25:41 +00:00
{
2003-07-04 17:17:37 +00:00
if ( $seq )
2002-10-20 19:19:07 +00:00
{
2003-07-04 17:17:37 +00:00
$i = 0 ;
while ( $subseq = substr ( $seq , $i , 6 ))
{
2004-05-26 20:29:39 +00:00
if ( ! isset ( $this -> acl [ $f ]))
{
$this -> acl [ $f ] = '' ;
}
2003-07-04 17:17:37 +00:00
$this -> acl [ $f ] .= str_pad ( base_convert ( $subseq , 36 , 2 ), 31 , 0 , STR_PAD_LEFT );
$i += 6 ;
}
2002-10-20 19:19:07 +00:00
}
2003-01-29 16:12:21 +00:00
}
2002-10-06 11:57:45 +00:00
return ;
}
2002-07-14 14:32:45 +00:00
2002-10-06 11:57:45 +00:00
// Look up an option
2003-01-29 16:12:21 +00:00
function acl_get ( $opt , $f = 0 )
2002-10-06 11:57:45 +00:00
{
2003-01-29 16:12:21 +00:00
static $cache ;
2002-10-26 12:34:39 +00:00
2003-03-29 18:25:41 +00:00
if ( ! isset ( $cache [ $f ][ $opt ]))
2002-10-20 19:19:07 +00:00
{
2003-07-04 17:17:37 +00:00
$cache [ $f ][ $opt ] = false ;
2003-03-29 18:25:41 +00:00
if ( isset ( $this -> acl_options [ 'global' ][ $opt ]))
2002-10-20 19:19:07 +00:00
{
2004-05-26 20:29:39 +00:00
if ( isset ( $this -> acl [ 0 ]))
{
$cache [ $f ][ $opt ] = $this -> acl [ 0 ]{ $this -> acl_options [ 'global' ][ $opt ]};
}
2002-10-20 19:19:07 +00:00
}
2003-03-29 18:25:41 +00:00
if ( isset ( $this -> acl_options [ 'local' ][ $opt ]))
2002-10-20 19:19:07 +00:00
{
2004-05-26 20:29:39 +00:00
if ( isset ( $this -> acl [ $f ]))
{
$cache [ $f ][ $opt ] |= $this -> acl [ $f ]{ $this -> acl_options [ 'local' ][ $opt ]};
}
2002-10-20 19:19:07 +00:00
}
}
2003-01-29 18:36:26 +00:00
2003-06-19 13:19:39 +00:00
// Needs to change ... check founder status when updating cache?
2003-07-04 17:17:37 +00:00
return $cache [ $f ][ $opt ];
2002-11-01 12:23:08 +00:00
}
2003-06-19 13:19:39 +00:00
function acl_getf ( $opt )
{
static $cache ;
if ( isset ( $this -> acl_options [ 'local' ][ $opt ]))
{
2003-10-12 00:00:03 +00:00
foreach ( $this -> acl as $f => $bitstring )
2003-06-19 13:19:39 +00:00
{
2003-10-12 00:00:03 +00:00
if ( ! isset ( $cache [ $f ][ $opt ]))
2003-06-19 13:19:39 +00:00
{
2003-10-12 00:00:03 +00:00
$cache [ $f ][ $opt ] = false ;
2003-06-19 13:19:39 +00:00
2003-10-12 00:00:03 +00:00
$cache [ $f ][ $opt ] = $bitstring { $this -> acl_options [ 'local' ][ $opt ]};
2003-06-19 13:19:39 +00:00
if ( isset ( $this -> acl_options [ 'global' ][ $opt ]))
{
2003-10-12 00:00:03 +00:00
$cache [ $f ][ $opt ] |= $this -> acl [ 0 ]{ $this -> acl_options [ 'global' ][ $opt ]};
2003-06-19 13:19:39 +00:00
}
}
}
}
2003-10-12 00:00:03 +00:00
return $cache ;
2003-06-19 13:19:39 +00:00
}
2002-11-01 12:23:08 +00:00
function acl_gets ()
{
2003-01-29 16:12:21 +00:00
$args = func_get_args ();
$f = array_pop ( $args );
2002-11-01 12:23:08 +00:00
2003-02-27 16:14:25 +00:00
if ( ! is_numeric ( $f ))
2002-11-01 12:23:08 +00:00
{
2003-01-29 16:12:21 +00:00
$args [] = $f ;
$f = 0 ;
2002-11-01 12:23:08 +00:00
}
2003-02-27 03:22:27 +00:00
// alternate syntax: acl_gets(array('m_', 'a_'), $forum_id)
if ( is_array ( $args [ 0 ]))
{
$args = $args [ 0 ];
}
2002-11-01 12:23:08 +00:00
$acl = 0 ;
2003-01-29 16:12:21 +00:00
foreach ( $args as $opt )
2002-11-01 12:23:08 +00:00
{
2003-01-29 16:12:21 +00:00
$acl |= $this -> acl_get ( $opt , $f );
2002-11-01 12:23:08 +00:00
}
2002-10-20 19:19:07 +00:00
2002-11-01 12:23:08 +00:00
return $acl ;
2002-10-06 11:57:45 +00:00
}
2003-11-17 23:36:43 +00:00
function acl_get_list ( $user_id = false , $opts = false , $forum_id = false )
2002-10-06 11:57:45 +00:00
{
2003-11-17 23:36:43 +00:00
$hold_ary = $this -> acl_raw_data ( $user_id , $opts , $forum_id );
2002-08-17 22:08:34 +00:00
2003-11-17 23:36:43 +00:00
$auth_ary = array ();
foreach ( $hold_ary as $user_id => $forum_ary )
2002-10-20 19:19:07 +00:00
{
2003-11-17 23:36:43 +00:00
foreach ( $forum_ary as $forum_id => $auth_option_ary )
2003-04-15 17:33:35 +00:00
{
2003-11-17 23:36:43 +00:00
foreach ( $auth_option_ary as $auth_option => $auth_setting )
{
if ( $auth_setting == ACL_YES )
{
$auth_ary [ $forum_id ][ $auth_option ][] = $user_id ;
}
}
2003-04-15 17:33:35 +00:00
}
2002-10-20 19:19:07 +00:00
}
2003-11-17 23:36:43 +00:00
return $auth_ary ;
}
// Cache data
function acl_cache ( & $userdata )
{
global $db ;
2005-07-04 16:54:34 +00:00
2003-11-17 23:36:43 +00:00
$hold_ary = $this -> acl_raw_data ( $userdata [ 'user_id' ], false , false );
$hold_ary = $hold_ary [ $userdata [ 'user_id' ]];
2004-08-02 14:32:04 +00:00
2003-07-04 17:17:37 +00:00
// If this user is founder we're going to force fill the admin options ...
2003-10-15 17:43:07 +00:00
if ( $userdata [ 'user_type' ] == USER_FOUNDER )
2002-10-06 11:57:45 +00:00
{
2003-07-04 17:17:37 +00:00
foreach ( $this -> acl_options [ 'global' ] as $opt => $id )
2002-10-20 19:19:07 +00:00
{
2004-09-16 18:33:22 +00:00
if ( strpos ( $opt , 'a_' ) !== false )
2003-04-24 18:23:35 +00:00
{
2003-07-04 17:17:37 +00:00
$hold_ary [ 0 ][ $opt ] = 1 ;
2003-04-24 18:23:35 +00:00
}
2003-07-04 17:17:37 +00:00
}
}
2003-04-24 18:23:35 +00:00
2005-04-17 09:30:22 +00:00
$hold_str = '' ;
2003-07-04 17:17:37 +00:00
if ( is_array ( $hold_ary ))
{
ksort ( $hold_ary );
2002-10-20 19:19:07 +00:00
2003-07-04 17:17:37 +00:00
$last_f = 0 ;
foreach ( $hold_ary as $f => $auth_ary )
{
$ary_key = ( ! $f ) ? 'global' : 'local' ;
2003-04-24 18:23:35 +00:00
2003-07-04 17:17:37 +00:00
$bitstring = array ();
2003-03-29 18:25:41 +00:00
foreach ( $this -> acl_options [ $ary_key ] as $opt => $id )
2002-10-20 19:19:07 +00:00
{
2003-01-29 16:12:21 +00:00
if ( ! empty ( $auth_ary [ $opt ]))
2002-10-20 19:19:07 +00:00
{
2003-07-04 17:17:37 +00:00
$bitstring [ $id ] = 1 ;
2002-10-26 12:34:39 +00:00
2003-01-29 16:12:21 +00:00
$option_key = substr ( $opt , 0 , strpos ( $opt , '_' ) + 1 );
2003-03-29 18:25:41 +00:00
if ( empty ( $holding [ $this -> acl_options [ $ary_key ][ $option_key ]]))
2002-10-26 12:34:39 +00:00
{
2003-07-04 17:17:37 +00:00
$bitstring [ $this -> acl_options [ $ary_key ][ $option_key ]] = 1 ;
2002-10-26 12:34:39 +00:00
}
2002-10-20 19:19:07 +00:00
}
2003-01-29 16:12:21 +00:00
else
{
2003-07-04 17:17:37 +00:00
$bitstring [ $id ] = 0 ;
2003-01-29 16:12:21 +00:00
}
2002-10-20 19:19:07 +00:00
}
2003-07-04 17:17:37 +00:00
$bitstring = implode ( '' , $bitstring );
2003-03-29 18:25:41 +00:00
2003-07-04 17:17:37 +00:00
$hold_str .= str_repeat ( " \n " , $f - $last_f );
2002-08-15 15:45:22 +00:00
2003-07-04 17:17:37 +00:00
for ( $i = 0 ; $i < strlen ( $bitstring ); $i += 31 )
2003-01-29 18:36:26 +00:00
{
2003-08-24 18:16:53 +00:00
$hold_str .= str_pad ( base_convert ( str_pad ( substr ( $bitstring , $i , 31 ), 31 , 0 , STR_PAD_RIGHT ), 2 , 36 ), 6 , 0 , STR_PAD_LEFT );
2003-01-29 18:36:26 +00:00
}
2003-07-04 17:17:37 +00:00
$last_f = $f ;
2003-01-29 18:36:26 +00:00
}
2003-07-04 17:17:37 +00:00
unset ( $bitstring );
2003-01-29 18:36:26 +00:00
2003-11-17 23:36:43 +00:00
$userdata [ 'user_permissions' ] = rtrim ( $hold_str );
2002-10-20 19:19:07 +00:00
2003-07-04 17:17:37 +00:00
$sql = 'UPDATE ' . USERS_TABLE . "
2003-11-17 23:36:43 +00:00
SET user_permissions = '" . $db->sql_escape($userdata[' user_permissions ']) . "'
2002-10-09 20:53:42 +00:00
WHERE user_id = " . $userdata['user_id'] ;
$db -> sql_query ( $sql );
2002-08-18 17:36:01 +00:00
}
2003-07-04 17:17:37 +00:00
unset ( $hold_ary );
2002-08-15 15:45:22 +00:00
2002-10-08 20:06:55 +00:00
return ;
2002-07-14 14:32:45 +00:00
}
2003-11-17 23:36:43 +00:00
function acl_raw_data ( $user_id = false , $opts = false , $forum_id = false )
2003-11-10 15:03:47 +00:00
{
global $db ;
2005-06-10 19:03:38 +00:00
$sql_user = ( $user_id !== false ) ? (( ! is_array ( $user_id )) ? " user_id = $user_id " : 'user_id IN (' . implode ( ', ' , $user_id ) . ')' ) : '' ;
$sql_forum = ( $forum_id !== false ) ? (( ! is_array ( $forum_id )) ? " AND a.forum_id = $forum_id " : 'AND a.forum_id IN (' . implode ( ', ' , $forum_id ) . ')' ) : '' ;
$sql_opts = ( $opts !== false ) ? (( ! is_array ( $opts )) ? " AND ao.auth_option = ' $opts ' " : 'AND ao.auth_option IN (' . implode ( ', ' , preg_replace ( '#^[\s]*?(.*?)[\s]*?$#e' , " \" ' \" . \$ db->sql_escape(' \\ 1') . \" ' \" " , $opts )) . ')' ) : '' ;
2003-11-10 15:03:47 +00:00
$hold_ary = array ();
// First grab user settings ... each user has only one setting for each
// option ... so we shouldn't need any ACL_NO checks ... he says ...
$sql = ' SELECT ao . auth_option , a . user_id , a . forum_id , a . auth_setting
2004-08-02 14:32:04 +00:00
FROM ' . ACL_OPTIONS_TABLE . ' ao , ' . ACL_USERS_TABLE . ' a
WHERE ao . auth_option_id = a . auth_option_id
2003-11-10 15:03:47 +00:00
' . (($sql_user) ? ' AND a . ' . $sql_user : ' ' ) . "
2004-08-02 14:32:04 +00:00
$sql_forum
$sql_opts
2003-11-10 15:03:47 +00:00
ORDER BY a . forum_id , ao . auth_option " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
2004-08-02 14:32:04 +00:00
$hold_ary [ $row [ 'user_id' ]][ $row [ 'forum_id' ]][ $row [ 'auth_option' ]] = $row [ 'auth_setting' ];
2003-11-10 15:03:47 +00:00
}
$db -> sql_freeresult ( $result );
// Now grab group settings ... ACL_NO overrides ACL_YES so act appropriatley
2004-08-02 14:32:04 +00:00
$sql = ' SELECT ug . user_id , ao . auth_option , a . forum_id , a . auth_setting
FROM ' . USER_GROUP_TABLE . ' ug , ' . ACL_OPTIONS_TABLE . ' ao , ' . ACL_GROUPS_TABLE . ' a
WHERE ao . auth_option_id = a . auth_option_id
2003-11-10 15:03:47 +00:00
AND a . group_id = ug . group_id
' . (($sql_user) ? ' AND ug . ' . $sql_user : ' ' ) . "
2004-08-02 14:32:04 +00:00
$sql_forum
$sql_opts
2003-11-10 15:03:47 +00:00
ORDER BY a . forum_id , ao . auth_option " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
if ( ! isset ( $hold_ary [ $row [ 'user_id' ]][ $row [ 'forum_id' ]][ $row [ 'auth_option' ]]) || ( isset ( $hold_ary [ $row [ 'user_id' ]][ $row [ 'forum_id' ]][ $row [ 'auth_option' ]]) && $hold_ary [ $row [ 'user_id' ]][ $row [ 'forum_id' ]][ $row [ 'auth_option' ]] != ACL_NO ))
{
2004-08-02 14:32:04 +00:00
$hold_ary [ $row [ 'user_id' ]][ $row [ 'forum_id' ]][ $row [ 'auth_option' ]] = $row [ 'auth_setting' ];
2003-11-10 15:03:47 +00:00
}
}
$db -> sql_freeresult ( $result );
2003-11-17 23:36:43 +00:00
return $hold_ary ;
2003-11-10 15:03:47 +00:00
}
2005-01-02 19:06:45 +00:00
function acl_group_raw_data ( $group_id = false , $opts = false , $forum_id = false )
{
global $db ;
2005-07-04 16:54:34 +00:00
$sql_group = ( $group_id !== false ) ? (( ! is_array ( $group_id )) ? " group_id = $group_id " : 'group_id IN (' . implode ( ', ' , $group_id ) . ')' ) : '' ;
$sql_forum = ( $forum_id !== false ) ? (( ! is_array ( $forum_id )) ? " AND a.forum_id = $forum_id " : 'AND a.forum_id IN (' . implode ( ', ' , $forum_id ) . ')' ) : '' ;
$sql_opts = ( $opts !== false ) ? (( ! is_array ( $opts )) ? " AND ao.auth_option = ' $opts ' " : 'AND ao.auth_option IN (' . implode ( ', ' , preg_replace ( '#^[\s]*?(.*?)[\s]*?$#e' , " \" ' \" . \$ db->sql_escape(' \\ 1') . \" ' \" " , $opts )) . ')' ) : '' ;
2005-01-02 19:06:45 +00:00
$hold_ary = array ();
// Grab group settings ... ACL_NO overrides ACL_YES so act appropriatley
$sql = ' SELECT a . group_id , ao . auth_option , a . forum_id , a . auth_setting
FROM ' . ACL_OPTIONS_TABLE . ' ao , ' . ACL_GROUPS_TABLE . ' a
WHERE ao . auth_option_id = a . auth_option_id
' . (($sql_group) ? ' AND a . ' . $sql_group : ' ' ) . "
$sql_forum
$sql_opts
ORDER BY a . forum_id , ao . auth_option " ;
$result = $db -> sql_query ( $sql );
while ( $row = $db -> sql_fetchrow ( $result ))
{
$hold_ary [ $row [ 'group_id' ]][ $row [ 'forum_id' ]][ $row [ 'auth_option' ]] = $row [ 'auth_setting' ];
}
$db -> sql_freeresult ( $result );
return $hold_ary ;
}
2003-01-21 14:37:56 +00:00
// Clear one or all users cached permission settings
function acl_clear_prefetch ( $user_id = false )
{
global $db ;
2005-07-04 16:54:34 +00:00
$where_sql = ( $user_id !== false ) ? ' WHERE user_id ' . (( is_array ( $user_id )) ? ' IN (' . implode ( ', ' , array_map ( 'intval' , $user_id )) . ')' : " = $user_id " ) : '' ;
2003-01-21 14:37:56 +00:00
2003-07-04 17:17:37 +00:00
$sql = 'UPDATE ' . USERS_TABLE . "
2003-01-21 14:37:56 +00:00
SET user_permissions = ''
$where_sql " ;
$db -> sql_query ( $sql );
return ;
}
2005-07-05 01:01:31 +00:00
// @todo replace this with a new system
2002-10-04 13:09:10 +00:00
// Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him.
2004-09-01 15:47:46 +00:00
function login ( $username , $password , $autologin = false , $viewonline = 1 , $admin = 0 )
2002-08-06 16:56:14 +00:00
{
2004-09-01 15:47:46 +00:00
global $config , $db , $user , $phpbb_root_path , $phpEx ;
2002-07-14 14:32:45 +00:00
2002-10-30 00:57:27 +00:00
$method = trim ( $config [ 'auth_method' ]);
2002-07-14 14:32:45 +00:00
2003-01-31 02:14:48 +00:00
if ( file_exists ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx ))
2002-07-14 14:32:45 +00:00
{
2003-01-31 02:14:48 +00:00
include_once ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx );
2002-08-06 16:56:14 +00:00
$method = 'login_' . $method ;
2002-11-01 12:23:08 +00:00
if ( function_exists ( $method ))
2002-07-14 14:32:45 +00:00
{
2003-03-09 16:11:08 +00:00
$login = $method ( $username , $password );
// If login returned anything other than an array there was an error
if ( ! is_array ( $login ))
2002-08-06 16:56:14 +00:00
{
2005-04-10 11:21:01 +00:00
// TODO: Login Attempt++
2003-03-09 16:11:08 +00:00
return $login ;
2002-08-06 16:56:14 +00:00
}
2005-07-28 11:50:27 +00:00
2005-07-04 16:54:34 +00:00
return $user -> session_create ( $login [ 'user_id' ], $admin , $autologin , $viewonline );
2002-07-14 14:32:45 +00:00
}
}
2002-10-20 19:19:07 +00:00
trigger_error ( 'Authentication method not found' , E_USER_ERROR );
2002-08-06 16:56:14 +00:00
}
2002-07-14 14:32:45 +00:00
}
2005-04-17 09:30:22 +00:00
?>