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
*
*/
/**
2005-10-02 16:57:33 +00:00
* @ package phpBB3
2005-04-09 12:26:45 +00:00
* 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 = '' ;
2006-04-29 13:14:33 +00:00
var $host = '' ;
2002-10-21 14:10:45 +00:00
var $ip = '' ;
2006-03-01 21:48:02 +00:00
var $page = array ();
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 ;
2006-03-01 21:48:02 +00:00
/**
* Extract current session page
*/
function extract_current_page ( $root_path )
{
$page_array = array ();
// First of all, get the request uri...
$script_name = ( ! empty ( $_SERVER [ 'PHP_SELF' ])) ? $_SERVER [ 'PHP_SELF' ] : getenv ( 'PHP_SELF' );
$args = ( ! empty ( $_SERVER [ 'QUERY_STRING' ])) ? explode ( '&' , $_SERVER [ 'QUERY_STRING' ]) : explode ( '&' , getenv ( 'QUERY_STRING' ));
// If we are unable to get the script name we use REQUEST_URI as a failover and note it within the page array for easier support...
if ( ! $script_name )
{
$script_name = ( ! empty ( $_SERVER [ 'REQUEST_URI' ])) ? $_SERVER [ 'REQUEST_URI' ] : getenv ( 'REQUEST_URI' );
$page [ 'failover' ] = 1 ;
}
// Replace backslashes and doubled slashes (could happen on some proxy setups)
$script_name = str_replace ( array ( '\\' , '//' ), '/' , $script_name );
// Now, remove the sid and let us get a clean query string...
foreach ( $args as $key => $argument )
{
if ( strpos ( $argument , 'sid=' ) === 0 )
{
unset ( $args [ $key ]);
break ;
}
}
// The current query string
$query_string = trim ( implode ( '&' , $args ));
// basenamed page name (for example: index.php)
$page_name = htmlspecialchars ( basename ( $script_name ));
// current directory within the phpBB root (for example: adm)
$page_dir = substr ( str_replace ( str_replace ( '\\' , '/' , realpath ( $root_path )), '' , str_replace ( '\\' , '/' , realpath ( './' ))), 1 );
// Current page from phpBB root (for example: adm/index.php?i=10)
$page = (( $page_dir ) ? $page_dir . '/' : '' ) . $page_name . (( $query_string ) ? " ? $query_string " : '' );
// The script path from the webroot to the current directory (for example: /phpBB2/adm) : always prefixed with /
$script_path = trim ( str_replace ( '\\' , '/' , dirname ( $script_name )));
// The script path from the webroot to the phpBB root (for example: /phpBB2)
$root_script_path = ( $page_dir ) ? str_replace ( '/' . $page_dir , '' , $script_path ) : $script_path ;
// We are on the base level (phpBB root == webroot), lets adjust the variables a bit...
if ( ! $root_script_path )
{
$root_script_path = ( $page_dir ) ? str_replace ( $page_dir , '' , $script_path ) : $script_path ;;
}
$page_array += array (
'page_name' => $page_name ,
'page_dir' => $page_dir ,
'query_string' => $query_string ,
'script_path' => htmlspecialchars ( $script_path ),
'root_script_path' => htmlspecialchars ( $root_script_path ),
'page' => $page
);
return $page_array ;
}
2005-07-04 16:54:34 +00:00
/**
* 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
*/
2005-10-02 16:57:33 +00:00
function session_begin ()
2002-07-14 14:32:45 +00:00
{
2006-03-01 21:48:02 +00:00
global $phpEx , $SID , $db , $config , $phpbb_root_path ;
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' ] : '' ;
2006-04-29 13:14:33 +00:00
$this -> host = ( ! empty ( $_SERVER [ 'HTTP_HOST' ])) ? $_SERVER [ 'HTTP_HOST' ] : 'localhost' ;
2006-01-25 21:01:52 +00:00
2006-03-01 21:48:02 +00:00
$this -> page = $this -> extract_current_page ( $phpbb_root_path );
$this -> page [ 'page' ] .= ( isset ( $_POST [ 'f' ])) ? (( strpos ( $this -> page [ 'page' ], '?' ) !== false ) ? '&' : '?' ) . 'f=' . intval ( $_POST [ 'f' ]) : '' ;
2005-08-18 12:58:23 +00:00
2006-05-17 16:26:54 +00:00
$this -> cookie_data = array ( 'u' => 0 , 'k' => '' );
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' ]) : '' ;
2006-05-12 20:52:58 +00:00
$this -> load = false ;
2002-07-14 14:32:45 +00:00
// Load limit check (if applicable)
2006-04-29 01:18:57 +00:00
if ( $config [ 'limit_load' ])
2002-07-14 14:32:45 +00:00
{
2006-04-29 01:18:57 +00:00
if ( @ file_exists ( '/proc/loadavg' ) && @ is_readable ( '/proc/loadavg' ))
2002-07-14 14:32:45 +00:00
{
2006-04-29 01:18:57 +00:00
if ( $load = @ file_get_contents ( '/proc/loadavg' ))
{
$this -> load = array_slice ( explode ( ' ' , $load ), 0 , 1 );
$this -> load = floatval ( $this -> load [ 0 ]);
}
else
2002-07-14 14:32:45 +00:00
{
2006-04-29 01:18:57 +00:00
set_config ( 'limit_load' , '0' );
2002-07-14 14:32:45 +00:00
}
}
2006-04-29 01:18:57 +00:00
else
{
set_config ( 'limit_load' , '0' );
}
2002-07-14 14:32:45 +00:00
}
2006-04-21 22:41:05 +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
2005-10-02 16:57:33 +00:00
// $quadcheck = ($config['ip_check_bot'] && $this->data['user_type'] & USER_BOT) ? 4 : $config['ip_check'];
2006-04-21 22:41:05 +00:00
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
2005-12-28 17:35:20 +00:00
$s_browser = ( $config [ 'browser_check' ]) ? substr ( $this -> data [ 'session_browser' ], 0 , 149 ) : '' ;
$u_browser = ( $config [ 'browser_check' ]) ? substr ( $this -> browser , 0 , 149 ) : '' ;
2003-03-24 19:03:32 +00:00
2006-04-06 17:15:45 +00:00
if ( $u_ip === $s_ip && $s_browser === $u_browser )
2002-07-14 14:32:45 +00:00
{
2006-04-06 17:15:45 +00:00
$session_expired = false ;
2006-04-21 22:41:05 +00:00
// Check whether the session is still valid if we have one
$method = trim ( $config [ 'auth_method' ]);
if ( file_exists ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx ))
2002-07-14 14:32:45 +00:00
{
2006-04-21 22:41:05 +00:00
include_once ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx );
$method = 'validate_session_' . $method ;
if ( function_exists ( $method ))
2006-04-06 17:15:45 +00:00
{
2006-04-21 22:41:05 +00:00
if ( ! $method ( $this -> data ))
{
$session_expired = true ;
}
2006-04-06 17:15:45 +00:00
}
}
2006-04-21 22:41:05 +00:00
if ( ! $session_expired )
2006-04-06 17:15:45 +00:00
{
2006-04-21 22:41:05 +00:00
// Check the session length timeframe if autologin is not enabled.
// Else check the autologin length... and also removing those having autologin enabled but no longer allowed board-wide.
if ( ! $this -> data [ 'session_autologin' ])
{
if ( $this -> data [ 'session_time' ] < $this -> time_now - ( $config [ 'session_length' ] + 60 ))
{
$session_expired = true ;
}
}
else if ( ! $config [ 'allow_autologin' ] || ( $config [ 'max_autologin_time' ] && $this -> data [ 'session_time' ] < $this -> time_now - ( 86400 * ( int ) $config [ 'max_autologin_time' ]) + 60 ))
{
$session_expired = true ;
}
2006-04-06 17:15:45 +00:00
}
if ( ! $session_expired )
{
// Only update session DB a minute or so after last update or if page changes
if ( $this -> time_now - $this -> data [ 'session_time' ] > 60 || $this -> data [ 'session_page' ] != $this -> page [ 'page' ])
{
$sql = 'UPDATE ' . SESSIONS_TABLE . "
SET session_time = $this -> time_now , session_page = '" . $db->sql_escape(substr($this->page[' page '], 0, 199)) . "'
WHERE session_id = '" . $db->sql_escape($this->session_id) . "' " ;
$db -> sql_query ( $sql );
}
// Ultimately to be removed
$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 ;
return true ;
2002-07-14 14:32:45 +00:00
}
2006-04-06 17:15:45 +00:00
}
else
{
// Added logging temporarly to help debug bugs...
add_log ( 'critical' , 'LOG_IP_BROWSER_CHECK' , $u_ip , $s_ip , $u_browser , $s_browser );
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
{
2006-04-21 22:41:05 +00:00
global $SID , $db , $config , $cache , $phpbb_root_path , $phpEx ;
2002-07-14 14:32:45 +00:00
2005-07-04 16:54:34 +00:00
$this -> data = array ();
2006-05-18 18:18:32 +00:00
/* Garbage collection ... remove old sessions updating user information
2005-07-04 16:54:34 +00:00
// if necessary. It means (potentially) 11 queries but only infrequently
if ( $this -> time_now > $config [ 'session_last_gc' ] + $config [ 'session_gc' ])
{
$this -> session_gc ();
2006-05-18 18:18:32 +00:00
} */
2005-07-04 16:54:34 +00:00
// 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 ();
2005-10-02 16:57:33 +00:00
$cache -> obtain_bots ( $active_bots );
2005-05-05 16:55:05 +00:00
foreach ( $active_bots as $row )
2003-10-15 17:43:07 +00:00
{
2005-10-19 18:00:10 +00:00
if ( $row [ 'bot_agent' ] && strpos ( strtolower ( $this -> browser ), strtolower ( $row [ 'bot_agent' ])) !== false )
2003-10-15 17:43:07 +00:00
{
$bot = $row [ 'user_id' ];
}
2005-07-04 16:54:34 +00:00
2006-03-25 12:35:23 +00:00
// If ip is supplied, we will make sure the ip is matching too...
if ( $row [ 'bot_ip' ] && ( $bot || ! $row [ 'bot_agent' ]))
2003-10-15 17:43:07 +00:00
{
2006-03-25 12:35:23 +00:00
// Set bot to false, then we only have to set it to true if it is matching
$bot = false ;
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
}
2006-04-21 22:41:05 +00:00
$method = trim ( $config [ 'auth_method' ]);
if ( file_exists ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx ))
{
include_once ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx );
$method = 'autologin_' . $method ;
if ( function_exists ( $method ))
{
$this -> data = $method ();
if ( sizeof ( $this -> data ))
{
$this -> cookie_data [ 'k' ] = '' ;
$this -> cookie_data [ 'u' ] = $this -> data [ 'user_id' ];
}
}
}
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
2006-04-21 22:41:05 +00:00
if ( isset ( $this -> cookie_data [ 'k' ]) && $this -> cookie_data [ 'k' ] && $this -> cookie_data [ 'u' ] && ! sizeof ( $this -> data ))
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
2005-11-03 20:53:47 +00:00
AND k . key_id = '" . $db->sql_escape(md5($this->cookie_data[' k '])) . "' " ;
2005-07-04 16:54:34 +00:00
$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 );
}
2006-04-21 22:41:05 +00:00
else if ( $user_id !== false && ! sizeof ( $this -> data ))
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
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 );
}
2006-03-17 12:51:32 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS )
{
$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 ());
}
else
{
2006-04-06 17:15:45 +00:00
$this -> data [ 'session_last_visit' ] = $this -> time_now ;
2006-03-17 12:51:32 +00:00
}
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
//
//
2006-04-06 17:15:45 +00:00
// @todo Change this ... check for "... && user_type & USER_NORMAL" ?
$session_autologin = (( $this -> cookie_data [ 'k' ] || $persist_login ) && $this -> data [ 'is_registered' ]) ? true : false ;
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 ,
2006-03-25 12:07:13 +00:00
'session_page' => ( string ) substr ( $this -> page [ 'page' ], 0 , 199 ),
2004-09-02 20:54:09 +00:00
'session_ip' => ( string ) $this -> ip ,
2006-04-06 17:15:45 +00:00
'session_autologin' => ( $session_autologin ) ? 1 : 0 ,
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-12-28 17:35:20 +00:00
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
2006-04-06 17:15:45 +00:00
if ( $session_autologin )
2005-07-04 16:54:34 +00:00
{
$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-12-15 18:25:01 +00:00
$this -> set_cookie ( 'sid' , $this -> session_id , $cookie_expire );
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
{
2006-04-21 22:41:05 +00:00
global $SID , $db , $config , $phpbb_root_path , $phpEx ;
2002-07-14 14:32:45 +00:00
2003-05-08 01:14:14 +00:00
$sql = 'DELETE FROM ' . SESSIONS_TABLE . "
2006-01-06 07:48:51 +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 );
2006-04-21 22:41:05 +00:00
// Allow connecting logout with external auth method logout
$method = trim ( $config [ 'auth_method' ]);
if ( file_exists ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx ))
{
include_once ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx );
$method = 'logout_' . $method ;
if ( function_exists ( $method ))
{
$method ( $this -> data );
}
}
2005-07-04 16:54:34 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS )
{
// Delete existing session, update last visit info first!
2006-01-06 07:48:51 +00:00
if ( ! isset ( $this -> data [ 'session_time' ]))
2006-01-05 21:22:44 +00:00
{
$this -> data [ 'session_time' ] = time ();
}
2005-07-04 16:54:34 +00:00
$sql = 'UPDATE ' . USERS_TABLE . '
2006-01-06 07:48:51 +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-12-15 18:25:01 +00:00
if ( $this -> cookie_data [ 'k' ])
2005-07-05 01:26:23 +00:00
{
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
WHERE user_id = ' . (int) $this->data[' user_id ' ] . "
2005-12-15 18:25:01 +00:00
AND key_id = '" . $db->sql_escape(md5($this->cookie_data[' k '])) . "' " ;
2005-07-05 01:26:23 +00:00
$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
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 .
2005-10-19 18:00:10 +00:00
*
* @ todo add to cron
2005-07-04 16:54:34 +00:00
*/
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
2005-10-19 18:00:10 +00:00
if ( ! $this -> time_now )
{
$this -> time_now = time ();
}
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
2005-11-20 18:58:34 +00:00
$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
2005-11-20 18:58:34 +00:00
$db -> sql_return_on_error ( false );
2003-11-16 23:16:02 +00:00
// 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
2006-05-18 18:18:32 +00:00
set_config ( 'session_last_gc' , $this -> time_now , true );
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
2005-12-15 18:25:01 +00:00
if ( $config [ 'max_autologin_time' ])
2005-10-19 18:00:10 +00:00
{
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
WHERE last_login < ' . (time() - (86400 * (int) $config[' max_autologin_time ' ]));
$db -> sql_query ( $sql );
}
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
2006-03-21 19:23:34 +00:00
if ( ! $config [ 'cookie_domain' ] || $config [ 'cookie_domain' ] == 'localhost' || $config [ 'cookie_domain' ] == '127.0.0.1' )
2005-09-21 18:54:40 +00:00
{
setcookie ( $config [ 'cookie_name' ] . '_' . $name , $cookiedata , $cookietime , $config [ 'cookie_path' ]);
}
else
{
2006-03-21 19:23:34 +00:00
// Firefox does not allow setting cookies with a domain containing no periods.
if ( strpos ( $config [ 'cookie_domain' ], '.' ) === false )
{
$config [ 'cookie_domain' ] = '.' . $config [ 'cookie_domain' ];
}
2005-09-21 18:54:40 +00:00
setcookie ( $config [ 'cookie_name' ] . '_' . $name , $cookiedata , $cookietime , $config [ 'cookie_path' ], $config [ 'cookie_domain' ], $config [ 'cookie_secure' ]);
}
2005-07-04 16:54:34 +00:00
}
/**
* Check for banned user
*
* Checks whether the supplied user is banned by id , ip or email . If no parameters
2006-03-15 13:03:57 +00:00
* are passed to the method pre - existing session data is used . If $return is false
2006-05-04 06:54:43 +00:00
* this routine does not return on finding a banned user , it outputs a relevant
2006-03-15 13:03:57 +00:00
* message and stops execution .
2005-07-04 16:54:34 +00:00
*/
2006-03-15 13:03:57 +00:00
function check_ban ( $user_id = false , $user_ip = false , $user_email = false , $return = false )
2005-07-04 16:54:34 +00:00
{
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 );
2005-12-09 18:09:43 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
2005-01-02 19:06:45 +00:00
{
2005-12-09 18:09:43 +00:00
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 )))
2005-07-04 16:54:34 +00:00
{
2005-12-09 18:09:43 +00:00
if ( ! empty ( $row [ 'ban_exclude' ]))
2005-07-04 16:54:34 +00:00
{
2005-12-09 18:09:43 +00:00
$banned = false ;
break ;
}
else
{
$banned = true ;
$ban_row = $row ;
// Don't break. Check if there is an exclude rule for this user
2005-07-04 16:54:34 +00:00
}
}
2005-01-02 19:06:45 +00:00
}
2005-07-04 16:54:34 +00:00
$db -> sql_freeresult ( $result );
2006-03-15 13:03:57 +00:00
if ( $banned && ! $return )
2005-07-04 16:54:34 +00:00
{
// 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 )
2005-12-09 18:09:43 +00:00
{
2005-09-21 12:12:58 +00:00
$this -> session_kill ();
2005-10-19 18:00:10 +00:00
}
2005-07-04 16:54:34 +00:00
// Determine which message to output
2005-12-09 18:09:43 +00:00
$till_date = ( $ban_row [ 'ban_end' ]) ? $this -> format_date ( $ban_row [ 'ban_end' ]) : '' ;
$message = ( $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>' );
2005-12-09 18:09:43 +00:00
$message .= ( $ban_row [ 'ban_give_reason' ]) ? '<br /><br />' . sprintf ( $this -> lang [ 'BOARD_BAN_REASON' ], $ban_row [ 'ban_give_reason' ]) : '' ;
2005-07-04 16:54:34 +00:00
trigger_error ( $message );
}
2006-03-15 13:03:57 +00:00
if ( $banned )
{
return true ;
}
2005-07-04 16:54:34 +00:00
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-12-15 18:25:01 +00:00
$key = ( $key === false ) ? (( $this -> cookie_data [ 'k' ]) ? $this -> cookie_data [ 'k' ] : false ) : $key ;
2005-07-04 16:54:34 +00:00
2005-11-03 20:53:47 +00:00
$key_id = unique_id ( hexdec ( substr ( $this -> session_id , 0 , 8 )));
2005-12-15 18:25:01 +00:00
2005-07-04 16:54:34 +00:00
$sql_ary = array (
2005-11-03 20:53:47 +00:00
'key_id' => ( string ) md5 ( $key_id ),
2005-07-04 16:54:34 +00:00
'last_ip' => ( string ) $this -> ip ,
'last_login' => ( int ) time ()
);
2005-12-15 18:25:01 +00:00
2005-07-04 16:54:34 +00:00
if ( ! $key )
{
$sql_ary += array (
'user_id' => ( int ) $user_id
);
}
2006-03-23 01:59:14 +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 ( md5 ( $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 );
2005-11-03 20:53:47 +00:00
$this -> cookie_data [ 'k' ] = $key_id ;
2005-12-15 18:25:01 +00:00
unset ( $sql_ary , $key_id );
2005-07-04 16:54:34 +00:00
return false ;
}
2006-03-18 22:05:08 +00:00
/**
* Reset all login keys for the specified user
*
* This method removes all current login keys for a specified ( or the current )
* user . It will be called on password change to render old keys unusable
*/
function reset_login_keys ( $user_id = false )
{
global $config , $db ;
$user_id = ( $user_id === false ) ? $this -> data [ 'user_id' ] : $user_id ;
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . ' WHERE user_id = ' . ( int ) $user_id ;
$db -> sql_query ( $sql );
2006-03-18 23:08:30 +00:00
// Let's also clear any current sessions for the specified user_id
// If it's the current user then we'll leave this session intact
$sql_where = 'session_user_id = ' . ( int ) $user_id ;
$sql_where .= ( $user_id === $this -> data [ 'user_id' ]) ? " AND session_id <> ' " . $this -> session_id . " ' " : '' ;
$sql = 'DELETE FROM ' . SESSIONS_TABLE . "
WHERE $sql_where " ;
$db -> sql_query ( $sql );
2006-03-18 22:05:08 +00:00
// We're changing the password of the current user and they have a key
// Lets regenerate it to be safe
if ( $user_id === $this -> data [ 'user_id' ] && $this -> cookie_data [ 'k' ])
{
$this -> set_login_key ( $user_id );
}
}
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-10-02 16:57:33 +00:00
* @ package phpBB3
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 ;
2006-03-06 14:03:56 +00:00
// Able to add new option (id 7)
2006-03-12 23:19:55 +00:00
var $keyoptions = array ( 'viewimg' => 0 , 'viewflash' => 1 , 'viewsmilies' => 2 , 'viewsigs' => 3 , 'viewavatars' => 4 , 'viewcensors' => 5 , 'attachsig' => 6 , 'bbcode' => 8 , 'smilies' => 9 , 'popuppm' => 10 );
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
{
2005-12-22 16:28:27 +00:00
global $db , $template , $config , $auth , $phpEx , $phpbb_root_path , $cache ;
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 ;
2006-04-21 22:41:05 +00:00
if (( include $this -> lang_path . " common. $phpEx " ) === false )
2005-03-17 22:41:20 +00:00
{
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-12-22 16:28:27 +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 = $style
AND t . template_id = s . template_id
AND c . theme_id = s . theme_id
AND i . imageset_id = s . imageset_id " ;
2003-09-07 13:46:51 +00:00
$result = $db -> sql_query ( $sql , 3600 );
2005-12-22 16:28:27 +00:00
$this -> theme = $db -> sql_fetchrow ( $result );
2002-10-04 13:09:10 +00:00
2006-01-22 13:06:13 +00:00
// User has wrong style
if ( ! $this -> theme && $style == $this -> data [ 'user_style' ])
{
$style = $this -> data [ 'user_style' ] = $config [ 'default_style' ];
$sql = 'UPDATE ' . USERS_TABLE . "
SET user_style = $style
WHERE user_id = { $this -> data [ 'user_id' ]} " ;
$db -> sql_query ( $sql );
$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 = $style
AND t . template_id = s . template_id
AND c . theme_id = s . theme_id
AND i . imageset_id = s . imageset_id " ;
2006-03-17 12:51:32 +00:00
$result = $db -> sql_query ( $sql , 3600 );
2006-01-22 13:06:13 +00:00
$this -> theme = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
}
2005-12-22 16:28:27 +00:00
if ( ! $this -> theme )
2002-10-04 13:09:10 +00:00
{
2006-01-05 20:28:29 +00:00
trigger_error ( 'Could not get style data' , E_USER_ERROR );
2002-10-04 13:09:10 +00:00
}
2005-12-22 16:28:27 +00:00
// Now parse the cfg file and cache it
$parsed_items = $cache -> obtain_cfg_items ( $this -> theme );
2006-03-17 12:51:32 +00:00
2005-12-22 16:28:27 +00:00
// We are only interested in the theme configuration for now
$parsed_items = $parsed_items [ 'theme' ];
2004-08-02 14:32:04 +00:00
2005-12-22 16:28:27 +00:00
$check_for = array (
'parse_css_file' => ( int ) 0 ,
'pagination_sep' => ( string ) ', '
);
2002-10-04 13:09:10 +00:00
2005-12-22 16:28:27 +00:00
foreach ( $check_for as $key => $default_value )
2004-05-26 20:29:39 +00:00
{
2005-12-22 22:25:04 +00:00
$this -> theme [ $key ] = ( isset ( $parsed_items [ $key ])) ? $parsed_items [ $key ] : $default_value ;
2005-12-22 16:28:27 +00:00
settype ( $this -> theme [ $key ], gettype ( $default_value ));
if ( is_string ( $default_value ))
{
$this -> theme [ $key ] = htmlspecialchars ( $this -> theme [ $key ]);
}
2004-05-26 20:29:39 +00:00
}
2005-12-22 16:28:27 +00:00
if ( ! $this -> theme [ 'theme_storedb' ] && $this -> theme [ 'parse_css_file' ])
2005-01-20 20:57:45 +00:00
{
2005-12-22 16:28:27 +00:00
$this -> theme [ 'theme_storedb' ] = 1 ;
2005-07-04 16:54:34 +00:00
2005-01-20 20:57:45 +00:00
$sql_ary = array (
2005-12-22 16:28:27 +00:00
'theme_data' => implode ( '' , file ( " { $phpbb_root_path } styles/ " . $this -> theme [ 'theme_path' ] . '/theme/stylesheet.css' )),
2005-01-20 20:57:45 +00:00
'theme_mtime' => time (),
'theme_storedb' => 1
);
$db -> sql_query ( 'UPDATE ' . STYLES_CSS_TABLE . ' SET ' . $db -> sql_build_array ( 'UPDATE' , $sql_ary ) . '
2005-12-22 16:28:27 +00:00
WHERE theme_id = ' . $this->theme[' theme_id ' ]);
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 ();
2005-12-22 16:28:27 +00:00
$this -> img_lang = ( file_exists ( $phpbb_root_path . 'styles/' . $this -> theme [ '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?
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 );
}
2006-05-12 20:52:58 +00:00
// Is load exceeded?
if ( $config [ 'limit_load' ] && $this -> load !== false )
{
if ( $this -> load > floatval ( $config [ 'limit_load' ]) && ! defined ( 'IN_LOGIN' ) && ! $auth -> acl_gets ( 'a_' , 'm_' ))
{
trigger_error ( 'BOARD_UNAVAILABLE' );
}
}
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 ;
2006-04-29 01:18:57 +00:00
if ( strpos ( $this -> page [ 'query_string' ], 'mode=reg_details' ) !== false && $this -> page [ 'page_name' ] == " ucp. $phpEx " )
2004-02-05 13:38:57 +00:00
{
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
2006-01-25 21:01:52 +00:00
// Make sure the language path is set (if the user setup did not happen it is not set)
if ( ! $this -> lang_path )
{
global $phpbb_root_path , $config ;
$this -> lang_path = $phpbb_root_path . 'language/' . $config [ 'default_lang' ] . '/' ;
}
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-11-08 19:29:20 +00:00
if (( include ( $this -> lang_path . (( $use_help ) ? 'help_' : '' ) . " $lang_file . $phpEx " )) === false )
2005-03-17 22:41:20 +00:00
{
2005-11-08 19:29:20 +00:00
trigger_error ( " Language file { $this -> lang_path } " . (( $use_help ) ? 'help_' : '' ) . " $lang_file . $phpEx couldn't be opened. " );
2005-03-17 22:41:20 +00:00
}
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 . "
2006-03-22 17:30:20 +00:00
WHERE lang_iso = '" . $db->sql_escape($this->lang_name) . "' " ;
2004-01-11 00:46:46 +00:00
$result = $db -> sql_query ( $sql );
2006-03-22 17:30:20 +00:00
$lang_id = ( int ) $db -> sql_fetchfield ( 'lang_id' );
$db -> sql_freeresult ( $result );
2004-01-11 00:46:46 +00:00
2006-03-22 17:30:20 +00:00
return $lang_id ;
2004-01-10 12:23:24 +00:00
}
// Get profile fields for user
function get_profile_fields ( $user_id )
{
2005-10-02 16:57:33 +00:00
global $db ;
2004-08-02 14:32:04 +00:00
2005-10-02 16:57:33 +00:00
if ( isset ( $this -> profile_fields ))
2004-01-10 12:23:24 +00:00
{
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
2005-10-02 16:57:33 +00:00
$this -> 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
{
2005-12-22 16:28:27 +00:00
if ( ! isset ( $this -> theme [ $img ]) || ! $this -> theme [ $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
2006-05-21 16:54:19 +00:00
// Do not include dimensions?
if ( strpos ( $this -> theme [ $img ], '*' ) === false )
2004-01-08 12:49:05 +00:00
{
2006-05-21 16:54:19 +00:00
$imgsrc = trim ( $this -> theme [ $img ]);
$width = $height = false ;
2004-01-08 12:49:05 +00:00
}
else
{
2006-05-21 16:54:19 +00:00
if ( $width === false )
{
list ( $imgsrc , $height , $width ) = explode ( '*' , $this -> theme [ $img ]);
}
else
{
list ( $imgsrc , $height ) = explode ( '*' , $this -> theme [ $img ]);
}
2004-01-08 12:49:05 +00:00
}
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-12-22 16:28:27 +00:00
$imgs [ $img . $suffix ][ 'src' ] = $phpbb_root_path . 'styles/' . $this -> theme [ 'imageset_path' ] . '/imageset/' . str_replace ( '{LANG}' , $this -> img_lang , $imgsrc );
2005-04-20 19:59:59 +00:00
$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' ];
2006-05-21 16:54:19 +00:00
break ;
2005-04-20 19:59:59 +00:00
case 'width' :
return $imgs [ $img . $suffix ][ 'width' ];
2006-05-21 16:54:19 +00:00
break ;
2005-04-20 19:59:59 +00:00
case 'height' :
return $imgs [ $img . $suffix ][ 'height' ];
2006-05-21 16:54:19 +00:00
break ;
2005-04-20 19:59:59 +00:00
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 . '" />' ;
2006-05-21 16:54:19 +00:00
break ;
2005-04-20 19:59:59 +00:00
}
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
2006-01-04 07:51:04 +00:00
?>