2002-07-14 14:32:45 +00:00
< ? php
2007-06-09 11:11:20 +00:00
/**
2005-04-09 12:26:45 +00:00
*
* @ package phpBB3
2007-06-09 11:11:20 +00:00
* @ version $Id $
* @ copyright ( c ) 2005 phpBB Group
* @ license http :// opensource . org / licenses / gpl - license . php GNU Public License
2005-04-09 12:26:45 +00:00
*
*/
2007-10-04 12:03:05 +00:00
/**
* @ ignore
*/
if ( ! defined ( 'IN_PHPBB' ))
{
exit ;
}
2005-04-09 12:26:45 +00:00
/**
* Session class
2006-06-13 21:06:29 +00:00
* @ package phpBB3
2005-04-09 12:26:45 +00:00
*/
2002-10-20 19:19:07 +00:00
class session
{
2005-07-04 16:54:34 +00:00
var $cookie_data = array ();
2006-06-11 18:13:52 +00:00
var $page = array ();
var $data = array ();
2002-10-04 13:09:10 +00:00
var $browser = '' ;
2006-12-10 17:44:45 +00:00
var $forwarded_for = '' ;
2006-04-29 13:14:33 +00:00
var $host = '' ;
2006-06-11 18:13:52 +00:00
var $session_id = '' ;
2002-10-21 14:10:45 +00:00
var $ip = '' ;
2006-06-11 18:13:52 +00:00
var $load = 0 ;
2005-07-04 16:54:34 +00:00
var $time_now = 0 ;
2006-06-11 18:13:52 +00:00
var $update_session_page = true ;
2005-07-04 16:54:34 +00:00
2006-03-01 21:48:02 +00:00
/**
* Extract current session page
2006-06-11 18:13:52 +00:00
*
* @ param string $root_path current root path ( phpbb_root_path )
2006-03-01 21:48:02 +00:00
*/
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' );
2007-07-20 17:55:35 +00:00
$script_name = (( $pos = strpos ( $script_name , '?' )) !== false ) ? substr ( $script_name , 0 , $pos ) : $script_name ;
2006-06-11 18:13:52 +00:00
$page_array [ 'failover' ] = 1 ;
2006-03-01 21:48:02 +00:00
}
// 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...
2007-09-22 18:21:58 +00:00
$use_args = array ();
// Since some browser do not encode correctly we need to do this with some "special" characters...
// " -> %22, ' => %27, < -> %3C, > -> %3E
$find = array ( '"' , " ' " , '<' , '>' );
$replace = array ( '%22' , '%27' , '%3C' , '%3E' );
2006-03-01 21:48:02 +00:00
foreach ( $args as $key => $argument )
{
2008-05-04 14:44:48 +00:00
if ( strpos ( $argument , 'sid=' ) === 0 )
2006-03-01 21:48:02 +00:00
{
2007-09-22 18:21:58 +00:00
continue ;
2006-03-01 21:48:02 +00:00
}
2007-09-22 18:21:58 +00:00
2008-09-05 12:46:58 +00:00
$use_args [] = str_replace ( $find , $replace , $argument );
2006-03-01 21:48:02 +00:00
}
2007-09-22 18:21:58 +00:00
unset ( $args );
2006-03-01 21:48:02 +00:00
2006-06-01 13:47:42 +00:00
// The following examples given are for an request uri of {path to the phpbb directory}/adm/index.php?i=10&b=2
2006-03-01 21:48:02 +00:00
// The current query string
2007-09-22 18:21:58 +00:00
$query_string = trim ( implode ( '&' , $use_args ));
2006-03-01 21:48:02 +00:00
// basenamed page name (for example: index.php)
2010-03-07 10:00:15 -07:00
$page_name = ( substr ( $script_name , - 1 , 1 ) == '/' ) ? '' : basename ( $script_name );
2006-10-12 15:20:33 +00:00
$page_name = urlencode ( htmlspecialchars ( $page_name ));
2006-03-01 21:48:02 +00:00
// current directory within the phpBB root (for example: adm)
2006-06-24 13:27:04 +00:00
$root_dirs = explode ( '/' , str_replace ( '\\' , '/' , phpbb_realpath ( $root_path )));
$page_dirs = explode ( '/' , str_replace ( '\\' , '/' , phpbb_realpath ( './' )));
2006-06-01 13:47:42 +00:00
$intersection = array_intersect_assoc ( $root_dirs , $page_dirs );
$root_dirs = array_diff_assoc ( $root_dirs , $intersection );
$page_dirs = array_diff_assoc ( $page_dirs , $intersection );
$page_dir = str_repeat ( '../' , sizeof ( $root_dirs )) . implode ( '/' , $page_dirs );
2006-06-06 20:53:46 +00:00
if ( $page_dir && substr ( $page_dir , - 1 , 1 ) == '/' )
2006-06-01 13:47:42 +00:00
{
$page_dir = substr ( $page_dir , 0 , - 1 );
}
2006-03-01 21:48:02 +00:00
2006-06-01 13:47:42 +00:00
// Current page from phpBB root (for example: adm/index.php?i=10&b=2)
2006-06-22 15:14:03 +00:00
$page = (( $page_dir ) ? $page_dir . '/' : '' ) . $page_name . (( $query_string ) ? " ? $query_string " : '' );
2006-03-01 21:48:02 +00:00
2007-05-04 12:30:21 +00:00
// The script path from the webroot to the current directory (for example: /phpBB3/adm/) : always prefixed with / and ends in /
2006-03-01 21:48:02 +00:00
$script_path = trim ( str_replace ( '\\' , '/' , dirname ( $script_name )));
2007-05-04 12:30:21 +00:00
// The script path from the webroot to the phpBB root (for example: /phpBB3/)
2006-06-01 13:47:42 +00:00
$script_dirs = explode ( '/' , $script_path );
array_splice ( $script_dirs , - sizeof ( $page_dirs ));
2007-01-26 16:09:51 +00:00
$root_script_path = implode ( '/' , $script_dirs ) . ( sizeof ( $root_dirs ) ? '/' . implode ( '/' , $root_dirs ) : '' );
2006-03-01 21:48:02 +00:00
// We are on the base level (phpBB root == webroot), lets adjust the variables a bit...
if ( ! $root_script_path )
{
2006-05-28 15:42:06 +00:00
$root_script_path = ( $page_dir ) ? str_replace ( $page_dir , '' , $script_path ) : $script_path ;
2006-03-01 21:48:02 +00:00
}
2006-06-06 20:53:46 +00:00
$script_path .= ( substr ( $script_path , - 1 , 1 ) == '/' ) ? '' : '/' ;
$root_script_path .= ( substr ( $root_script_path , - 1 , 1 ) == '/' ) ? '' : '/' ;
2006-03-01 21:48:02 +00:00
$page_array += array (
2006-06-22 15:14:03 +00:00
'page_name' => $page_name ,
'page_dir' => $page_dir ,
2006-03-01 21:48:02 +00:00
'query_string' => $query_string ,
2006-06-22 15:14:03 +00:00
'script_path' => str_replace ( ' ' , '%20' , htmlspecialchars ( $script_path )),
'root_script_path' => str_replace ( ' ' , '%20' , htmlspecialchars ( $root_script_path )),
2006-03-01 21:48:02 +00:00
2008-03-17 16:25:07 +00:00
'page' => $page ,
2008-03-18 10:14:37 +00:00
'forum' => ( isset ( $_REQUEST [ 'f' ]) && $_REQUEST [ 'f' ] > 0 ) ? ( int ) $_REQUEST [ 'f' ] : 0 ,
2006-03-01 21:48:02 +00:00
);
return $page_array ;
}
2008-09-15 18:41:27 +00:00
/**
* Get valid hostname / port . HTTP_HOST is used , SERVER_NAME if HTTP_HOST not present .
*/
function extract_current_hostname ()
{
global $config ;
// Get hostname
$host = ( ! empty ( $_SERVER [ 'HTTP_HOST' ])) ? $_SERVER [ 'HTTP_HOST' ] : (( ! empty ( $_SERVER [ 'SERVER_NAME' ])) ? $_SERVER [ 'SERVER_NAME' ] : getenv ( 'SERVER_NAME' ));
// Should be a string and lowered
$host = ( string ) strtolower ( $host );
// If host is equal the cookie domain or the server name (if config is set), then we assume it is valid
if (( isset ( $config [ 'cookie_domain' ]) && $host === $config [ 'cookie_domain' ]) || ( isset ( $config [ 'server_name' ]) && $host === $config [ 'server_name' ]))
{
return $host ;
}
// Is the host actually a IP? If so, we use the IP... (IPv4)
if ( long2ip ( ip2long ( $host )) === $host )
{
return $host ;
}
// Now return the hostname (this also removes any port definition). The http:// is prepended to construct a valid URL, hosts never have a scheme assigned
$host = @ parse_url ( 'http://' . $host );
$host = ( ! empty ( $host [ 'host' ])) ? $host [ 'host' ] : '' ;
// Remove any portions not removed by parse_url (#)
$host = str_replace ( '#' , '' , $host );
// If, by any means, the host is now empty, we will use a "best approach" way to guess one
if ( empty ( $host ))
{
if ( ! empty ( $config [ 'server_name' ]))
{
$host = $config [ 'server_name' ];
}
else if ( ! empty ( $config [ 'cookie_domain' ]))
{
2008-09-16 11:41:00 +00:00
$host = ( strpos ( $config [ 'cookie_domain' ], '.' ) === 0 ) ? substr ( $config [ 'cookie_domain' ], 1 ) : $config [ 'cookie_domain' ];
2008-09-15 18:41:27 +00:00
}
else
{
// Set to OS hostname or localhost
2009-09-22 15:09:09 +00:00
$host = ( function_exists ( 'php_uname' )) ? php_uname ( 'n' ) : 'localhost' ;
2008-09-15 18:41:27 +00:00
}
}
// It may be still no valid host, but for sure only a hostname (we may further expand on the cookie domain... if set)
return $host ;
}
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
2007-07-15 20:53:27 +00:00
* exists . If it does , fine and dandy . If it doesn 't we' ll go on to create a
2005-07-04 16:54:34 +00:00
* 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 .
*
2006-06-11 18:13:52 +00:00
* @ param bool $update_session_page if true the session page gets updated .
* This can be set to circumvent certain scripts to update the users last visited page .
2005-07-04 16:54:34 +00:00
*/
2006-08-12 13:14:39 +00:00
function session_begin ( $update_session_page = true )
2002-07-14 14:32:45 +00:00
{
2007-07-10 15:14:25 +00:00
global $phpEx , $SID , $_SID , $_EXTRA_URL , $db , $config , $phpbb_root_path ;
2002-07-14 14:32:45 +00:00
2006-11-24 14:59:26 +00:00
// Give us some basic information
2006-06-11 18:13:52 +00:00
$this -> time_now = time ();
$this -> cookie_data = array ( 'u' => 0 , 'k' => '' );
$this -> update_session_page = $update_session_page ;
2007-03-06 11:34:38 +00:00
$this -> browser = ( ! empty ( $_SERVER [ 'HTTP_USER_AGENT' ])) ? htmlspecialchars (( string ) $_SERVER [ 'HTTP_USER_AGENT' ]) : '' ;
2008-05-15 13:29:14 +00:00
$this -> referer = ( ! empty ( $_SERVER [ 'HTTP_REFERER' ])) ? htmlspecialchars (( string ) $_SERVER [ 'HTTP_REFERER' ]) : '' ;
2009-08-20 08:37:06 +00:00
$this -> forwarded_for = ( ! empty ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])) ? htmlspecialchars (( string ) $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]) : '' ;
2008-06-09 17:05:52 +00:00
2008-09-15 18:41:27 +00:00
$this -> host = $this -> extract_current_hostname ();
2006-06-11 18:13:52 +00:00
$this -> page = $this -> extract_current_page ( $phpbb_root_path );
2006-01-25 21:01:52 +00:00
2006-12-10 17:44:45 +00:00
// if the forwarded for header shall be checked we have to validate its contents
if ( $config [ 'forwarded_for_check' ])
{
2009-08-20 08:37:06 +00:00
$this -> forwarded_for = preg_replace ( '#[ ]{2,}#' , ' ' , str_replace ( array ( ',' , ' ' ), ' ' , $this -> forwarded_for ));
2006-12-10 17:44:45 +00:00
// split the list of IPs
2009-08-20 08:37:06 +00:00
$ips = explode ( ' ' , $this -> forwarded_for );
2006-12-10 17:44:45 +00:00
foreach ( $ips as $ip )
{
// check IPv4 first, the IPv6 is hopefully only going to be used very seldomly
2007-09-21 15:00:40 +00:00
if ( ! empty ( $ip ) && ! preg_match ( get_preg_expression ( 'ipv4' ), $ip ) && ! preg_match ( get_preg_expression ( 'ipv6' ), $ip ))
2006-12-10 17:44:45 +00:00
{
2007-02-25 22:09:53 +00:00
// contains invalid data, don't use the forwarded for header
$this -> forwarded_for = '' ;
break ;
2006-12-10 17:44:45 +00:00
}
}
}
2008-02-04 12:10:25 +00:00
else
{
$this -> forwarded_for = '' ;
}
2006-12-10 17:44:45 +00:00
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
{
2006-10-01 11:10:15 +00:00
$this -> cookie_data [ 'u' ] = request_var ( $config [ 'cookie_name' ] . '_u' , 0 , false , true );
$this -> cookie_data [ 'k' ] = request_var ( $config [ 'cookie_name' ] . '_k' , '' , false , true );
$this -> session_id = request_var ( $config [ 'cookie_name' ] . '_sid' , '' , false , true );
2006-06-06 20:53:46 +00:00
2003-01-20 05:12:38 +00:00
$SID = ( defined ( 'NEED_SID' )) ? '?sid=' . $this -> session_id : '?sid=' ;
2006-06-06 20:53:46 +00:00
$_SID = ( defined ( 'NEED_SID' )) ? $this -> session_id : '' ;
2006-08-07 10:42:22 +00:00
if ( empty ( $this -> session_id ))
{
$this -> session_id = $_SID = request_var ( 'sid' , '' );
$SID = '?sid=' . $this -> session_id ;
$this -> cookie_data = array ( 'u' => 0 , 'k' => '' );
}
2002-07-14 14:32:45 +00:00
}
else
{
2006-06-06 20:53:46 +00:00
$this -> session_id = $_SID = request_var ( 'sid' , '' );
2002-08-06 16:56:14 +00:00
$SID = '?sid=' . $this -> session_id ;
2002-07-14 14:32:45 +00:00
}
2006-06-11 18:13:52 +00:00
2007-07-10 15:14:25 +00:00
$_EXTRA_URL = array ();
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.
2009-08-20 08:37:06 +00:00
$this -> ip = ( ! empty ( $_SERVER [ 'REMOTE_ADDR' ])) ? htmlspecialchars (( string ) $_SERVER [ 'REMOTE_ADDR' ]) : '' ;
2009-08-20 08:43:10 +00:00
$this -> ip = preg_replace ( '#[ ]{2,}#' , ' ' , str_replace ( array ( ',' , ' ' ), ' ' , $this -> ip ));
// split the list of IPs
$ips = explode ( ' ' , $this -> ip );
// Default IP if REMOTE_ADDR is invalid
$this -> ip = '127.0.0.1' ;
foreach ( $ips as $ip )
{
// check IPv4 first, the IPv6 is hopefully only going to be used very seldomly
if ( ! empty ( $ip ) && ! preg_match ( get_preg_expression ( 'ipv4' ), $ip ) && ! preg_match ( get_preg_expression ( 'ipv6' ), $ip ))
{
// Just break
break ;
}
2010-07-23 12:48:01 +02:00
// Quick check for IPv4-mapped address in IPv6
if ( stripos ( $ip , '::ffff:' ) === 0 )
{
$ipv4 = substr ( $ip , 7 );
if ( preg_match ( get_preg_expression ( 'ipv4' ), $ipv4 ))
{
$ip = $ipv4 ;
}
}
2009-08-20 08:43:10 +00:00
// Use the last in chain
$this -> ip = $ip ;
}
2006-05-12 20:52:58 +00:00
$this -> load = false ;
2002-07-14 14:32:45 +00:00
// Load limit check (if applicable)
2007-05-02 16:19:35 +00:00
if ( $config [ 'limit_load' ] || $config [ 'limit_search_load' ])
2002-07-14 14:32:45 +00:00
{
2008-04-20 05:13:34 +00:00
if (( function_exists ( 'sys_getloadavg' ) && $load = sys_getloadavg ()) || ( $load = explode ( ' ' , @ file_get_contents ( '/proc/loadavg' ))))
2002-07-14 14:32:45 +00:00
{
2008-04-20 05:13:34 +00:00
$this -> load = array_slice ( $load , 0 , 1 );
2006-08-02 15:53:19 +00:00
$this -> load = floatval ( $this -> load [ 0 ]);
2002-07-14 14:32:45 +00:00
}
2006-04-29 01:18:57 +00:00
else
{
set_config ( 'limit_load' , '0' );
2007-05-02 16:19:35 +00:00
set_config ( 'limit_search_load' , '0' );
2006-04-29 01:18:57 +00:00
}
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'];
2007-05-13 16:15:20 +00:00
if ( strpos ( $this -> ip , ':' ) !== false && strpos ( $this -> data [ 'session_ip' ], ':' ) !== false )
{
$s_ip = short_ipv6 ( $this -> data [ 'session_ip' ], $config [ 'ip_check' ]);
$u_ip = short_ipv6 ( $this -> ip , $config [ 'ip_check' ]);
}
else
{
$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
2008-01-29 14:23:02 +00:00
$s_browser = ( $config [ 'browser_check' ]) ? trim ( strtolower ( substr ( $this -> data [ 'session_browser' ], 0 , 149 ))) : '' ;
$u_browser = ( $config [ 'browser_check' ]) ? trim ( strtolower ( substr ( $this -> browser , 0 , 149 ))) : '' ;
2003-03-24 19:03:32 +00:00
2006-12-10 20:13:46 +00:00
$s_forwarded_for = ( $config [ 'forwarded_for_check' ]) ? substr ( $this -> data [ 'session_forwarded_for' ], 0 , 254 ) : '' ;
2006-12-10 17:44:45 +00:00
$u_forwarded_for = ( $config [ 'forwarded_for_check' ]) ? substr ( $this -> forwarded_for , 0 , 254 ) : '' ;
2008-05-18 20:06:15 +00:00
2008-05-15 13:29:14 +00:00
// referer checks
2008-05-18 20:06:15 +00:00
// The @ before $config['referer_validation'] suppresses notices present while running the updater
$check_referer_path = ( @ $config [ 'referer_validation' ] == REFERER_VALIDATE_PATH );
2008-05-15 13:29:14 +00:00
$referer_valid = true ;
2008-05-18 20:06:15 +00:00
2008-05-16 12:34:39 +00:00
// we assume HEAD and TRACE to be foul play and thus only whitelist GET
2008-05-18 20:06:15 +00:00
if ( @ $config [ 'referer_validation' ] && isset ( $_SERVER [ 'REQUEST_METHOD' ]) && strtolower ( $_SERVER [ 'REQUEST_METHOD' ]) !== 'get' )
2008-05-15 13:29:14 +00:00
{
$referer_valid = $this -> validate_referer ( $check_referer_path );
}
2006-12-10 17:44:45 +00:00
2008-05-15 13:29:14 +00:00
if ( $u_ip === $s_ip && $s_browser === $u_browser && $s_forwarded_for === $u_forwarded_for && $referer_valid )
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
2006-06-11 18:13:52 +00:00
$method = basename ( trim ( $config [ 'auth_method' ]));
2006-08-02 15:53:19 +00:00
include_once ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx );
2006-04-21 22:41:05 +00:00
2006-08-02 15:53:19 +00:00
$method = 'validate_session_' . $method ;
if ( function_exists ( $method ))
2002-07-14 14:32:45 +00:00
{
2006-08-02 15:53:19 +00:00
if ( ! $method ( $this -> data ))
2006-04-06 17:15:45 +00:00
{
2006-08-02 15:53:19 +00:00
$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
2006-06-11 18:13:52 +00:00
if ( $this -> time_now - $this -> data [ 'session_time' ] > 60 || ( $this -> update_session_page && $this -> data [ 'session_page' ] != $this -> page [ 'page' ]))
2006-04-06 17:15:45 +00:00
{
2006-06-11 18:13:52 +00:00
$sql_ary = array ( 'session_time' => $this -> time_now );
if ( $this -> update_session_page )
{
$sql_ary [ 'session_page' ] = substr ( $this -> page [ 'page' ], 0 , 199 );
2008-03-17 16:25:07 +00:00
$sql_ary [ 'session_forum_id' ] = $this -> page [ 'forum' ];
2006-06-11 18:13:52 +00:00
}
2008-03-27 16:17:54 +00:00
$db -> sql_return_on_error ( true );
2006-06-11 18:13:52 +00:00
$sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db -> sql_build_array ( 'UPDATE' , $sql_ary ) . "
2006-04-06 17:15:45 +00:00
WHERE session_id = '" . $db->sql_escape($this->session_id) . "' " ;
2008-03-27 16:17:54 +00:00
$result = $db -> sql_query ( $sql );
$db -> sql_return_on_error ( false );
// If the database is not yet updated, there will be an error due to the session_forum_id
// @todo REMOVE for 3.0.2
if ( $result === false )
{
unset ( $sql_ary [ 'session_forum_id' ]);
$sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db -> sql_build_array ( 'UPDATE' , $sql_ary ) . "
WHERE session_id = '" . $db->sql_escape($this->session_id) . "' " ;
$db -> sql_query ( $sql );
}
2009-06-20 18:45:16 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS && ! empty ( $config [ 'new_member_post_limit' ]) && $this -> data [ 'user_new' ] && $config [ 'new_member_post_limit' ] <= $this -> data [ 'user_posts' ])
{
$this -> leave_newly_registered ();
}
2006-04-06 17:15:45 +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 ;
2007-07-13 11:58:12 +00:00
$this -> data [ 'user_lang' ] = basename ( $this -> data [ 'user_lang' ]);
2007-07-15 20:53:27 +00:00
2006-04-06 17:15:45 +00:00
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...
2007-07-25 16:06:11 +00:00
if ( defined ( 'DEBUG_EXTRA' ) && $this -> data [ 'user_id' ] != ANONYMOUS )
2006-10-03 18:35:59 +00:00
{
2008-05-15 13:29:14 +00:00
if ( $referer_valid )
{
add_log ( 'critical' , 'LOG_IP_BROWSER_FORWARDED_CHECK' , $u_ip , $s_ip , $u_browser , $s_browser , htmlspecialchars ( $u_forwarded_for ), htmlspecialchars ( $s_forwarded_for ));
}
else
{
add_log ( 'critical' , 'LOG_REFERER_INVALID' , $this -> referer );
}
2006-10-03 18:35:59 +00:00
}
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
}
2007-07-15 20:53:27 +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-06-06 20:53:46 +00:00
global $SID , $_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-06-11 18:13:52 +00:00
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
} */
2006-06-11 18:13:52 +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
2007-07-15 20:53:27 +00:00
*/
2005-07-04 16:54:34 +00:00
$bot = false ;
2006-11-12 15:35:43 +00:00
$active_bots = $cache -> obtain_bots ();
2005-10-02 16:57:33 +00:00
2005-05-05 16:55:05 +00:00
foreach ( $active_bots as $row )
2003-10-15 17:43:07 +00:00
{
2007-10-04 12:03:05 +00:00
if ( $row [ 'bot_agent' ] && preg_match ( '#' . str_replace ( '\*' , '.*?' , preg_quote ( $row [ 'bot_agent' ], '#' )) . '#i' , $this -> browser ))
2003-10-15 17:43:07 +00:00
{
$bot = $row [ 'user_id' ];
}
2006-06-11 18:13:52 +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 )
{
2009-03-16 16:34:16 +00:00
$bot_ip = trim ( $bot_ip );
if ( ! $bot_ip )
{
continue ;
}
2003-10-15 17:43:07 +00:00
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
2006-06-11 18:13:52 +00:00
$method = basename ( trim ( $config [ 'auth_method' ]));
2006-08-02 15:53:19 +00:00
include_once ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx );
2006-04-21 22:41:05 +00:00
2006-08-02 15:53:19 +00:00
$method = 'autologin_' . $method ;
if ( function_exists ( $method ))
2006-04-21 22:41:05 +00:00
{
2006-08-02 15:53:19 +00:00
$this -> data = $method ();
2006-04-21 22:41:05 +00:00
2006-08-02 15:53:19 +00:00
if ( sizeof ( $this -> data ))
2006-04-21 22:41:05 +00:00
{
2006-08-02 15:53:19 +00:00
$this -> cookie_data [ 'k' ] = '' ;
$this -> cookie_data [ 'u' ] = $this -> data [ 'user_id' ];
2006-04-21 22:41:05 +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
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
{
2007-07-15 20:53:27 +00:00
$sql = ' SELECT u .*
2005-07-04 16:54:34 +00:00
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 '] . '
2006-10-03 18:35:59 +00:00
AND u . user_type IN ( ' . USER_NORMAL . ' , ' . USER_FOUNDER . " )
2005-07-04 16:54:34 +00:00
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 );
$this -> data = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
2007-06-20 14:24:02 +00:00
$bot = false ;
2005-07-04 16:54:34 +00:00
}
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 '] . '
2006-10-03 18:35:59 +00:00
AND user_type IN ( ' . USER_NORMAL . ' , ' . USER_FOUNDER . ' ) ' ;
2005-01-02 19:06:45 +00:00
$result = $db -> sql_query ( $sql );
$this -> data = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
2007-06-20 14:24:02 +00:00
$bot = false ;
2002-07-14 14:32:45 +00:00
}
2007-07-15 20:53:27 +00:00
2007-01-21 18:33:45 +00:00
// If no data was returned one or more of the following occurred:
2005-07-04 16:54:34 +00:00
// 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
2006-09-13 16:08:36 +00:00
if ( ! $bot )
{
$sql = ' SELECT *
FROM ' . USERS_TABLE . '
WHERE user_id = ' . (int) $this->cookie_data[' u ' ];
}
else
{
// We give bots always the same session if it is not yet expired.
$sql = ' SELECT u .* , s .*
FROM ' . USERS_TABLE . ' u
LEFT JOIN ' . SESSIONS_TABLE . ' s ON ( s . session_user_id = u . user_id )
WHERE u . user_id = ' . ( int ) $bot ;
}
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-07-06 16:46:53 +00:00
if ( $this -> data [ 'user_id' ] != ANONYMOUS && ! $bot )
2006-03-17 12:51:32 +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 ());
}
else
{
2010-03-13 01:54:04 +00:00
// Bot user, if they have a SID in the Request URI we need to get rid of it
// otherwise they'll index this page with the SID, duplicate content oh my!
if ( isset ( $_GET [ 'sid' ]))
{
redirect ( build_url ( array ( 'sid' )));
}
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
2006-10-10 13:59:02 +00:00
// Force user id to be integer...
$this -> data [ 'user_id' ] = ( int ) $this -> data [ 'user_id' ];
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
if ( $this -> data [ 'user_type' ] != USER_FOUNDER )
{
2006-12-10 17:44:45 +00:00
if ( ! $config [ 'forwarded_for_check' ])
{
$this -> check_ban ( $this -> data [ 'user_id' ], $this -> ip );
}
else
{
2009-08-20 08:37:06 +00:00
$ips = explode ( ' ' , $this -> forwarded_for );
2006-12-10 17:44:45 +00:00
$ips [] = $this -> ip ;
$this -> check_ban ( $this -> data [ 'user_id' ], $ips );
}
2003-01-07 18:39:24 +00:00
}
2006-06-11 18:13:52 +00:00
2006-10-03 18:35:59 +00:00
$this -> data [ 'is_registered' ] = ( ! $bot && $this -> data [ 'user_id' ] != ANONYMOUS && ( $this -> data [ 'user_type' ] == USER_NORMAL || $this -> data [ 'user_type' ] == USER_FOUNDER )) ? true : false ;
2005-04-10 18:07:12 +00:00
$this -> data [ 'is_bot' ] = ( $bot ) ? true : false ;
2006-04-06 17:15:45 +00:00
2006-09-13 16:08:36 +00:00
// If our friend is a bot, we re-assign a previously assigned session
2006-10-10 13:59:02 +00:00
if ( $this -> data [ 'is_bot' ] && $bot == $this -> data [ 'user_id' ] && $this -> data [ 'session_id' ])
2006-09-13 16:08:36 +00:00
{
2006-12-10 17:44:45 +00:00
// Only assign the current session if the ip, browser and forwarded_for match...
2007-05-13 16:15:20 +00:00
if ( strpos ( $this -> ip , ':' ) !== false && strpos ( $this -> data [ 'session_ip' ], ':' ) !== false )
{
$s_ip = short_ipv6 ( $this -> data [ 'session_ip' ], $config [ 'ip_check' ]);
$u_ip = short_ipv6 ( $this -> ip , $config [ 'ip_check' ]);
}
else
{
$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' ]));
}
2006-09-13 16:08:36 +00:00
2008-01-29 14:23:02 +00:00
$s_browser = ( $config [ 'browser_check' ]) ? trim ( strtolower ( substr ( $this -> data [ 'session_browser' ], 0 , 149 ))) : '' ;
$u_browser = ( $config [ 'browser_check' ]) ? trim ( strtolower ( substr ( $this -> browser , 0 , 149 ))) : '' ;
2006-09-13 16:08:36 +00:00
2006-12-10 17:44:45 +00:00
$s_forwarded_for = ( $config [ 'forwarded_for_check' ]) ? substr ( $this -> data [ 'session_forwarded_for' ], 0 , 254 ) : '' ;
$u_forwarded_for = ( $config [ 'forwarded_for_check' ]) ? substr ( $this -> forwarded_for , 0 , 254 ) : '' ;
if ( $u_ip === $s_ip && $s_browser === $u_browser && $s_forwarded_for === $u_forwarded_for )
2006-09-13 16:08:36 +00:00
{
$this -> session_id = $this -> data [ 'session_id' ];
// 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 -> update_session_page && $this -> data [ 'session_page' ] != $this -> page [ 'page' ]))
{
2006-11-15 15:35:50 +00:00
$this -> data [ 'session_time' ] = $this -> data [ 'session_last_visit' ] = $this -> time_now ;
2006-09-13 16:08:36 +00:00
$sql_ary = array ( 'session_time' => $this -> time_now , 'session_last_visit' => $this -> time_now , 'session_admin' => 0 );
if ( $this -> update_session_page )
{
$sql_ary [ 'session_page' ] = substr ( $this -> page [ 'page' ], 0 , 199 );
2008-03-17 16:25:07 +00:00
$sql_ary [ 'session_forum_id' ] = $this -> page [ 'forum' ];
2006-09-13 16:08:36 +00:00
}
$sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db -> sql_build_array ( 'UPDATE' , $sql_ary ) . "
WHERE session_id = '" . $db->sql_escape($this->session_id) . "' " ;
$db -> sql_query ( $sql );
2006-11-15 15:35:50 +00:00
// Update the last visit time
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_lastvisit = ' . (int) $this->data[' session_time '] . '
WHERE user_id = ' . (int) $this->data[' user_id ' ];
$db -> sql_query ( $sql );
2006-09-13 16:08:36 +00:00
}
$SID = '?sid=' ;
$_SID = '' ;
return true ;
}
else
{
// If the ip and browser does not match make sure we only have one bot assigned to one session
$db -> sql_query ( 'DELETE FROM ' . SESSIONS_TABLE . ' WHERE session_user_id = ' . $this -> data [ 'user_id' ]);
}
}
2006-04-06 17:15:45 +00:00
$session_autologin = (( $this -> cookie_data [ 'k' ] || $persist_login ) && $this -> data [ 'is_registered' ]) ? true : false ;
2006-10-03 18:35:59 +00:00
$set_admin = ( $set_admin && $this -> data [ 'is_registered' ]) ? true : false ;
2006-04-06 17:15:45 +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 ,
2008-01-29 14:23:02 +00:00
'session_browser' => ( string ) trim ( substr ( $this -> browser , 0 , 149 )),
2006-12-10 17:44:45 +00:00
'session_forwarded_for' => ( string ) $this -> forwarded_for ,
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
);
2006-06-11 18:13:52 +00:00
if ( $this -> update_session_page )
{
$sql_ary [ 'session_page' ] = ( string ) substr ( $this -> page [ 'page' ], 0 , 199 );
2008-03-17 16:25:07 +00:00
$sql_ary [ 'session_forum_id' ] = $this -> page [ 'forum' ];
2006-06-11 18:13:52 +00:00
}
2005-07-04 16:54:34 +00:00
$db -> sql_return_on_error ( true );
2006-08-10 13:33:06 +00:00
$sql = ' DELETE
FROM ' . SESSIONS_TABLE . '
WHERE session_id = \ '' . $db -> sql_escape ( $this -> session_id ) . ' \ '
AND session_user_id = ' . ANONYMOUS ;
2005-12-28 17:35:20 +00:00
2007-03-01 10:29:46 +00:00
if ( ! defined ( 'IN_ERROR_HANDLER' ) && ( ! $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)
2007-07-28 09:19:29 +00:00
if ( empty ( $this -> data [ 'session_time' ]) && $config [ 'active_sessions' ])
2005-07-04 16:54:34 +00:00
{
2008-03-18 11:11:16 +00:00
// $db->sql_return_on_error(false);
2008-03-18 10:14:37 +00:00
2006-06-11 18:13:52 +00:00
$sql = ' SELECT COUNT ( session_id ) AS sessions
2005-07-04 16:54:34 +00:00
FROM ' . SESSIONS_TABLE . '
WHERE session_time >= ' . ( $this -> time_now - 60 );
$result = $db -> sql_query ( $sql );
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
2006-06-11 18:13:52 +00:00
2005-07-04 16:54:34 +00:00
if (( int ) $row [ 'sessions' ] > ( int ) $config [ 'active_sessions' ])
{
2010-09-11 21:55:11 +02:00
send_status_line ( 503 , 'Service Unavailable' );
2005-07-04 16:54:34 +00:00
trigger_error ( 'BOARD_UNAVAILABLE' );
}
}
2006-08-10 13:33:06 +00:00
}
2006-06-11 18:13:52 +00:00
2008-03-18 10:14:37 +00:00
// Since we re-create the session id here, the inserted row must be unique. Therefore, we display potential errors.
2008-03-18 11:11:16 +00:00
// Commented out because it will not allow forums to update correctly
// $db->sql_return_on_error(false);
2008-03-18 10:14:37 +00:00
2009-03-28 18:34:09 +00:00
// Something quite important: session_page always holds the *last* page visited, except for the *first* visit.
// We are not able to simply have an empty session_page btw, therefore we need to tell phpBB how to detect this special case.
// If the session id is empty, we have a completely new one and will set an "identifier" here. This identifier is able to be checked later.
if ( empty ( $this -> data [ 'session_id' ]))
{
// This is a temporary variable, only set for the very first visit
$this -> data [ 'session_created' ] = true ;
}
2006-08-10 13:33:06 +00:00
$this -> session_id = $this -> data [ 'session_id' ] = md5 ( unique_id ());
2002-07-14 14:32:45 +00:00
2006-08-10 13:33:06 +00:00
$sql_ary [ 'session_id' ] = ( string ) $this -> session_id ;
$sql_ary [ 'session_page' ] = ( string ) substr ( $this -> page [ 'page' ], 0 , 199 );
2008-03-17 16:25:07 +00:00
$sql_ary [ 'session_forum_id' ] = $this -> page [ 'forum' ];
2006-08-10 13:33:06 +00:00
$sql = 'INSERT INTO ' . SESSIONS_TABLE . ' ' . $db -> sql_build_array ( 'INSERT' , $sql_ary );
$db -> sql_query ( $sql );
2004-09-01 15:47:46 +00:00
2008-03-18 11:11:16 +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 ();
}
2006-06-11 18:13:52 +00:00
2007-06-15 17:19:27 +00:00
// refresh data
2006-08-07 10:42:22 +00:00
$SID = '?sid=' . $this -> session_id ;
$_SID = $this -> session_id ;
2007-06-15 17:19:27 +00:00
$this -> data = array_merge ( $this -> data , $sql_ary );
2006-06-11 18:13:52 +00:00
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 );
2006-06-11 18:13:52 +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
2005-07-05 01:01:31 +00:00
unset ( $cookie_expire );
2008-01-29 15:49:15 +00:00
2007-10-03 15:05:54 +00:00
$sql = ' SELECT COUNT ( session_id ) AS sessions
FROM ' . SESSIONS_TABLE . '
2007-10-04 12:03:05 +00:00
WHERE session_user_id = ' . (int) $this->data[' user_id '] . '
2008-01-28 15:20:47 +00:00
AND session_time >= ' . (int) ($this->time_now - (max($config[' session_length '], $config[' form_token_lifetime ' ])));
2007-10-03 15:05:54 +00:00
$result = $db -> sql_query ( $sql );
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
if (( int ) $row [ 'sessions' ] <= 1 || empty ( $this -> data [ 'user_form_salt' ]))
{
$this -> data [ 'user_form_salt' ] = unique_id ();
// Update the form key
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_form_salt = \ '' . $db -> sql_escape ( $this -> data [ 'user_form_salt' ]) . ' \ '
WHERE user_id = ' . (int) $this->data[' user_id ' ];
$db -> sql_query ( $sql );
}
2003-10-15 17:43:07 +00:00
}
2006-09-13 16:08:36 +00:00
else
{
2006-12-10 17:44:45 +00:00
$this -> data [ 'session_time' ] = $this -> data [ 'session_last_visit' ] = $this -> time_now ;
// Update the last visit time
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_lastvisit = ' . (int) $this->data[' session_time '] . '
WHERE user_id = ' . (int) $this->data[' user_id ' ];
$db -> sql_query ( $sql );
2006-09-13 16:08:36 +00:00
$SID = '?sid=' ;
$_SID = '' ;
}
2007-07-15 20:53:27 +00:00
2002-10-20 19:19:07 +00:00
return true ;
2002-07-14 14:32:45 +00:00
}
2006-06-11 18:13:52 +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 .
*/
2006-12-24 13:11:54 +00:00
function session_kill ( $new_session = true )
2002-07-14 14:32:45 +00:00
{
2006-06-06 20:53:46 +00:00
global $SID , $_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
2006-06-11 18:13:52 +00:00
$method = basename ( trim ( $config [ 'auth_method' ]));
2006-08-02 15:53:19 +00:00
include_once ( $phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx );
2006-04-21 22:41:05 +00:00
2006-08-02 15:53:19 +00:00
$method = 'logout_' . $method ;
if ( function_exists ( $method ))
2006-04-21 22:41:05 +00:00
{
2007-07-28 14:14:03 +00:00
$method ( $this -> data , $new_session );
2006-04-21 22:41:05 +00:00
}
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 ();
}
2006-06-11 18:13:52 +00:00
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 );
}
2006-06-11 18:13:52 +00:00
2005-07-04 16:54:34 +00:00
// Reset the data array
2006-06-11 18:13:52 +00:00
$this -> data = array ();
2005-07-04 16:54:34 +00:00
$sql = ' SELECT *
FROM ' . USERS_TABLE . '
WHERE user_id = ' . ANONYMOUS ;
$result = $db -> sql_query ( $sql );
$this -> data = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
}
2006-06-11 18:13:52 +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 );
2006-06-11 18:13:52 +00:00
2005-07-04 16:54:34 +00:00
$SID = '?sid=' ;
2006-06-06 20:53:46 +00:00
$this -> session_id = $_SID = '' ;
2002-07-14 14:32:45 +00:00
2006-08-22 21:26:06 +00:00
// To make sure a valid session is created we create one for the anonymous user
2006-12-24 13:11:54 +00:00
if ( $new_session )
{
$this -> session_create ( ANONYMOUS );
}
2006-08-22 21:26:06 +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
{
2009-06-02 14:12:23 +00:00
global $db , $config , $phpbb_root_path , $phpEx ;
2002-07-14 14:32:45 +00:00
2007-09-13 15:15:27 +00:00
$batch_size = 10 ;
2008-01-29 15:49:15 +00:00
2005-10-19 18:00:10 +00:00
if ( ! $this -> time_now )
{
$this -> time_now = time ();
}
2006-06-11 18:13:52 +00:00
2006-09-25 14:32:05 +00:00
// Firstly, delete guest sessions
$sql = 'DELETE FROM ' . SESSIONS_TABLE . '
WHERE session_user_id = ' . ANONYMOUS . '
AND session_time < ' . (int) ($this->time_now - $config[' session_length ' ]);
$db -> sql_query ( $sql );
2003-11-16 23:16:02 +00:00
2006-09-25 14:32:05 +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 . '
WHERE session_time < ' . ($this->time_now - $config[' session_length ']) . '
GROUP BY session_user_id , session_page ' ;
2007-09-13 15:15:27 +00:00
$result = $db -> sql_query_limit ( $sql , $batch_size );
2004-01-30 12:14:48 +00:00
2006-09-25 14:32:05 +00:00
$del_user_id = array ();
$del_sessions = 0 ;
2006-08-12 13:14:39 +00:00
2006-10-26 10:58:58 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
2006-09-25 14:32:05 +00:00
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_lastvisit = ' . (int) $row[' recent_time '] . ", user_lastpage = ' " . $db->sql_escape ( $row['session_page'] ) . " '
WHERE user_id = " . (int) $row['session_user_id'] ;
$db -> sql_query ( $sql );
2006-08-12 13:14:39 +00:00
2006-09-25 14:32:05 +00:00
$del_user_id [] = ( int ) $row [ 'session_user_id' ];
$del_sessions ++ ;
}
$db -> sql_freeresult ( $result );
2002-07-14 14:32:45 +00:00
2006-09-25 14:32:05 +00:00
if ( sizeof ( $del_user_id ))
{
// Delete expired sessions
$sql = 'DELETE FROM ' . SESSIONS_TABLE . '
WHERE ' . $db->sql_in_set(' session_user_id ', $del_user_id) . '
AND session_time < ' . ($this->time_now - $config[' session_length ' ]);
$db -> sql_query ( $sql );
}
2002-07-14 14:32:45 +00:00
2007-09-13 15:15:27 +00:00
if ( $del_sessions < $batch_size )
2006-09-25 14:32:05 +00:00
{
2007-09-13 15:15:27 +00:00
// Less than 10 users, update gc timer ... else we want gc
2006-09-25 14:32:05 +00:00
// called again to delete other sessions
set_config ( 'session_last_gc' , $this -> time_now , true );
2008-01-29 15:49:15 +00:00
2007-09-13 15:15:27 +00:00
if ( $config [ 'max_autologin_time' ])
{
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
WHERE last_login < ' . (time() - (86400 * (int) $config[' max_autologin_time ' ]));
$db -> sql_query ( $sql );
}
2009-06-07 11:34:01 +00:00
2009-06-02 14:12:23 +00:00
// only called from CRON; should be a safe workaround until the infrastructure gets going
2010-03-28 14:37:31 +02:00
if ( ! class_exists ( 'phpbb_captcha_factory' ))
2007-09-13 15:15:27 +00:00
{
2009-06-02 14:12:23 +00:00
include ( $phpbb_root_path . " includes/captcha/captcha_factory. " . $phpEx );
2007-09-13 15:15:27 +00:00
}
2009-06-19 12:38:08 +00:00
phpbb_captcha_factory :: garbage_collect ( $config [ 'captcha_plugin' ]);
2007-09-13 15:15:27 +00:00
}
2009-06-02 14:12:23 +00:00
return ;
2007-09-13 15:15:27 +00:00
}
2008-01-29 15:49:15 +00:00
2005-07-04 16:54:34 +00:00
/**
* Sets a cookie
*
2008-01-06 17:00:09 +00:00
* Sets a cookie of the given name with the specified data for the given length of time . If no time is specified , a session cookie will be set .
*
* @ param string $name Name of the cookie , will be automatically prefixed with the phpBB cookie name . track becomes [ cookie_name ] _track then .
* @ param string $cookiedata The data to hold within the cookie
* @ param int $cookietime The expiration time as UNIX timestamp . If 0 is provided , a session cookie is set .
2005-07-04 16:54:34 +00:00
*/
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-10-03 18:35:59 +00:00
$name_data = rawurlencode ( $config [ 'cookie_name' ] . '_' . $name ) . '=' . rawurlencode ( $cookiedata );
$expire = gmdate ( 'D, d-M-Y H:i:s \\G\\M\\T' , $cookietime );
$domain = ( ! $config [ 'cookie_domain' ] || $config [ 'cookie_domain' ] == 'localhost' || $config [ 'cookie_domain' ] == '127.0.0.1' ) ? '' : '; domain=' . $config [ 'cookie_domain' ];
2006-03-21 19:23:34 +00:00
2008-01-06 17:00:09 +00:00
header ( 'Set-Cookie: ' . $name_data . (( $cookietime ) ? '; expires=' . $expire : '' ) . '; path=' . $config [ 'cookie_path' ] . $domain . (( ! $config [ 'cookie_secure' ]) ? '' : '; secure' ) . '; HttpOnly' , false );
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
2007-07-15 20:53:27 +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 .
2006-12-10 17:44:45 +00:00
*
* @ param string | array $user_ips Can contain a string with one IP or an array of multiple IPs
2005-07-04 16:54:34 +00:00
*/
2006-12-10 17:44:45 +00:00
function check_ban ( $user_id = false , $user_ips = false , $user_email = false , $return = false )
2005-07-04 16:54:34 +00:00
{
global $config , $db ;
2006-06-11 18:13:52 +00:00
2006-12-24 13:11:54 +00:00
if ( defined ( 'IN_CHECK_BAN' ))
{
return ;
}
2005-07-04 16:54:34 +00:00
$banned = false ;
2007-10-18 17:44:02 +00:00
$cache_ttl = 3600 ;
$where_sql = array ();
2005-07-04 16:54:34 +00:00
$sql = ' SELECT ban_ip , ban_userid , ban_email , ban_exclude , ban_give_reason , ban_end
FROM ' . BANLIST_TABLE . '
2007-10-18 17:44:02 +00:00
WHERE ' ;
2006-06-22 15:14:03 +00:00
// Determine which entries to check, only return those
if ( $user_email === false )
{
2007-10-18 17:44:02 +00:00
$where_sql [] = " ban_email = '' " ;
2006-06-22 15:14:03 +00:00
}
2006-12-10 17:44:45 +00:00
if ( $user_ips === false )
2006-06-22 15:14:03 +00:00
{
2007-10-18 17:44:02 +00:00
$where_sql [] = " (ban_ip = '' OR ban_exclude = 1) " ;
2006-06-22 15:14:03 +00:00
}
if ( $user_id === false )
{
2007-10-18 17:44:02 +00:00
$where_sql [] = '(ban_userid = 0 OR ban_exclude = 1)' ;
2006-06-22 15:14:03 +00:00
}
else
{
2007-10-18 17:44:02 +00:00
$cache_ttl = ( $user_id == ANONYMOUS ) ? 3600 : 0 ;
$_sql = '(ban_userid = ' . $user_id ;
2006-06-22 15:14:03 +00:00
if ( $user_email !== false )
{
2007-10-18 17:44:02 +00:00
$_sql .= " OR ban_email <> '' " ;
2006-06-22 15:14:03 +00:00
}
2006-12-10 17:44:45 +00:00
if ( $user_ips !== false )
2006-06-22 15:14:03 +00:00
{
2007-10-18 17:44:02 +00:00
$_sql .= " OR ban_ip <> '' " ;
2006-06-22 15:14:03 +00:00
}
2007-10-18 17:44:02 +00:00
$_sql .= ')' ;
$where_sql [] = $_sql ;
2006-06-22 15:14:03 +00:00
}
2007-10-18 17:44:02 +00:00
$sql .= ( sizeof ( $where_sql )) ? implode ( ' AND ' , $where_sql ) : '' ;
$result = $db -> sql_query ( $sql , $cache_ttl );
2005-07-04 16:54:34 +00:00
2006-10-06 18:43:55 +00:00
$ban_triggered_by = 'user' ;
2005-12-09 18:09:43 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
2005-01-02 19:06:45 +00:00
{
2007-10-18 17:44:02 +00:00
if ( $row [ 'ban_end' ] && $row [ 'ban_end' ] < time ())
{
continue ;
}
2006-12-10 20:13:46 +00:00
$ip_banned = false ;
if ( ! empty ( $row [ 'ban_ip' ]))
{
if ( ! is_array ( $user_ips ))
{
2007-06-29 13:00:54 +00:00
$ip_banned = preg_match ( '#^' . str_replace ( '\*' , '.*?' , preg_quote ( $row [ 'ban_ip' ], '#' )) . '$#i' , $user_ips );
2006-12-10 20:13:46 +00:00
}
else
{
foreach ( $user_ips as $user_ip )
{
2007-06-29 13:00:54 +00:00
if ( preg_match ( '#^' . str_replace ( '\*' , '.*?' , preg_quote ( $row [ 'ban_ip' ], '#' )) . '$#i' , $user_ip ))
2006-12-10 20:13:46 +00:00
{
$ip_banned = true ;
break ;
}
}
}
}
2005-12-09 18:09:43 +00:00
if (( ! empty ( $row [ 'ban_userid' ]) && intval ( $row [ 'ban_userid' ]) == $user_id ) ||
2006-12-10 20:13:46 +00:00
$ip_banned ||
2007-06-29 13:00:54 +00:00
( ! empty ( $row [ 'ban_email' ]) && preg_match ( '#^' . str_replace ( '\*' , '.*?' , preg_quote ( $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 ;
2006-10-06 18:43:55 +00:00
if ( ! empty ( $row [ 'ban_userid' ]) && intval ( $row [ 'ban_userid' ]) == $user_id )
{
$ban_triggered_by = 'user' ;
}
2007-10-09 15:11:06 +00:00
else if ( $ip_banned )
2006-10-06 18:43:55 +00:00
{
$ban_triggered_by = 'ip' ;
}
else
{
$ban_triggered_by = 'email' ;
}
2005-12-09 18:09:43 +00:00
// 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
{
2007-04-30 15:35:12 +00:00
global $template ;
2007-03-08 15:49:13 +00:00
// If the session is empty we need to create a valid one...
if ( empty ( $this -> session_id ))
{
2007-11-03 20:31:05 +00:00
// This seems to be no longer needed? - #14971
// $this->session_create(ANONYMOUS);
2007-03-08 15:49:13 +00:00
}
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
}
2006-06-11 18:13:52 +00:00
2006-12-24 13:11:54 +00:00
// We show a login box here to allow founders accessing the board if banned by IP
if ( defined ( 'IN_LOGIN' ) && $this -> data [ 'user_id' ] == ANONYMOUS )
{
global $phpEx ;
$this -> setup ( 'ucp' );
$this -> data [ 'is_registered' ] = $this -> data [ 'is_bot' ] = false ;
2007-04-30 15:35:12 +00:00
// Set as a precaution to allow login_box() handling this case correctly as well as this function not being executed again.
define ( 'IN_CHECK_BAN' , 1 );
2006-12-24 13:11:54 +00:00
login_box ( " index. $phpEx " );
// The false here is needed, else the user is able to circumvent the ban.
$this -> session_kill ( false );
}
2007-03-08 15:49:13 +00:00
// Ok, we catch the case of an empty session id for the anonymous user...
// This can happen if the user is logging in, banned by username and the login_box() being called "again".
2007-04-30 15:35:12 +00:00
if ( empty ( $this -> session_id ) && defined ( 'IN_CHECK_BAN' ))
2007-03-08 15:49:13 +00:00
{
$this -> session_create ( ANONYMOUS );
}
2007-04-30 15:35:12 +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' ]) : '' ;
2006-11-04 16:30:51 +00:00
$message .= '<br /><br /><em>' . $this -> lang [ 'BAN_TRIGGERED_BY_' . strtoupper ( $ban_triggered_by )] . '</em>' ;
2006-10-06 18:43:55 +00:00
2007-11-04 12:07:46 +00:00
// To circumvent session_begin returning a valid value and the check_ban() not called on second page view, we kill the session again
$this -> session_kill ( false );
2008-06-21 14:30:34 +00:00
// A very special case... we are within the cron script which is not supposed to print out the ban message... show blank page
if ( defined ( 'IN_CRON' ))
{
garbage_collection ();
exit_handler ();
exit ;
}
2005-07-04 16:54:34 +00:00
trigger_error ( $message );
}
2006-03-15 13:03:57 +00:00
2008-05-18 20:06:15 +00:00
return ( $banned && $ban_row [ 'ban_give_reason' ]) ? $ban_row [ 'ban_give_reason' ] : $banned ;
2005-07-04 16:54:34 +00:00
}
2006-06-11 18:13:52 +00:00
2006-09-28 15:04:59 +00:00
/**
* Check if ip is blacklisted
* This should be called only where absolutly necessary
*
* Only IPv4 ( rbldns does not support AAAA records / IPv6 lookups )
*
* @ author satmd ( from the php manual )
2006-12-02 13:19:40 +00:00
* @ param string $mode register / post - spamcop for example is ommitted for posting
2006-09-28 15:04:59 +00:00
* @ return false if ip is not blacklisted , else an array ([ checked server ], [ lookup ])
*/
2006-12-02 13:19:40 +00:00
function check_dnsbl ( $mode , $ip = false )
2006-09-28 15:04:59 +00:00
{
if ( $ip === false )
{
$ip = $this -> ip ;
}
$dnsbl_check = array (
2009-04-25 08:52:11 +00:00
'sbl.spamhaus.org' => 'http://www.spamhaus.org/query/bl?ip=' ,
2006-09-28 15:04:59 +00:00
);
2006-12-02 13:19:40 +00:00
if ( $mode == 'register' )
{
$dnsbl_check [ 'bl.spamcop.net' ] = 'http://spamcop.net/bl.shtml?' ;
}
2006-09-28 15:04:59 +00:00
if ( $ip )
{
$quads = explode ( '.' , $ip );
$reverse_ip = $quads [ 3 ] . '.' . $quads [ 2 ] . '.' . $quads [ 1 ] . '.' . $quads [ 0 ];
2006-12-06 22:13:11 +00:00
// Need to be listed on all servers...
$listed = true ;
$info = array ();
2006-09-28 15:04:59 +00:00
foreach ( $dnsbl_check as $dnsbl => $lookup )
{
if ( phpbb_checkdnsrr ( $reverse_ip . '.' . $dnsbl . '.' , 'A' ) === true )
{
2006-12-06 22:13:11 +00:00
$info = array ( $dnsbl , $lookup . $ip );
}
else
{
$listed = false ;
2006-09-28 15:04:59 +00:00
}
}
2006-12-06 22:13:11 +00:00
if ( $listed )
{
return $info ;
}
2006-09-28 15:04:59 +00:00
}
return false ;
}
2007-02-22 16:20:11 +00:00
/**
* Check if URI is blacklisted
* This should be called only where absolutly necessary , for example on the submitted website field
* This function is not in use at the moment and is only included for testing purposes , it may not work at all !
* This means it is untested at the moment and therefore commented out
*
* @ param string $uri URI to check
* @ return true if uri is on blacklist , else false . Only blacklist is checked ( ~ zero FP ), no grey lists
function check_uribl ( $uri )
{
// Normally parse_url() is not intended to parse uris
// We need to get the top-level domain name anyway... change.
$uri = parse_url ( $uri );
if ( $uri === false || empty ( $uri [ 'host' ]))
{
return false ;
}
$uri = trim ( $uri [ 'host' ]);
if ( $uri )
{
// One problem here... the return parameter for the "windows" method is different from what
// we expect... this may render this check useless...
if ( phpbb_checkdnsrr ( $uri . '.multi.uribl.com.' , 'A' ) === true )
{
return true ;
}
}
return false ;
}
*/
2005-07-04 16:54:34 +00:00
/**
* 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
2006-06-11 18:13:52 +00:00
* remains vulnerable to exploit .
2005-07-04 16:54:34 +00:00
*/
function set_login_key ( $user_id = false , $key = false , $user_ip = false )
{
global $config , $db ;
2006-06-11 18:13:52 +00:00
2005-07-04 16:54:34 +00:00
$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 ;
2006-06-11 18:13:52 +00:00
2005-11-03 20:53:47 +00:00
$key_id = unique_id ( hexdec ( substr ( $this -> session_id , 0 , 8 )));
2006-06-11 18:13:52 +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-06-11 18:13:52 +00:00
if ( $key )
{
$sql = '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)) . "' " ;
}
else
{
$sql = 'INSERT INTO ' . SESSIONS_KEYS_TABLE . ' ' . $db -> sql_build_array ( 'INSERT' , $sql_ary );
}
2005-07-04 16:54:34 +00:00
$db -> sql_query ( $sql );
2006-06-11 18:13:52 +00:00
2005-11-03 20:53:47 +00:00
$this -> cookie_data [ 'k' ] = $key_id ;
2006-06-11 18:13:52 +00:00
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 ;
2009-11-19 09:54:38 +00:00
$user_id = ( $user_id === false ) ? ( int ) $this -> data [ 'user_id' ] : ( int ) $user_id ;
2006-03-18 22:05:08 +00:00
2006-06-11 18:13:52 +00:00
$sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
WHERE user_id = ' . ( int ) $user_id ;
2006-03-18 22:05:08 +00:00
$db -> sql_query ( $sql );
2010-01-25 18:19:18 +00:00
// If the user is logged in, update last visit info first before deleting sessions
2009-09-04 14:53:35 +00:00
$sql = ' SELECT session_time , session_page
FROM ' . SESSIONS_TABLE . '
WHERE session_user_id = ' . (int) $user_id . '
ORDER BY session_time DESC ' ;
$result = $db -> sql_query_limit ( $sql , 1 );
$row = $db -> sql_fetchrow ( $result );
$db -> sql_freeresult ( $result );
2010-01-25 18:19:18 +00:00
if ( $row )
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_lastvisit = ' . (int) $row[' session_time '] . ", user_lastpage = ' " . $db->sql_escape ( $row['session_page'] ) . " '
WHERE user_id = " . (int) $user_id ;
$db -> sql_query ( $sql );
}
2009-09-04 14:53:35 +00:00
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 ;
2009-11-19 09:54:38 +00:00
$sql_where .= ( $user_id === ( int ) $this -> data [ 'user_id' ]) ? " AND session_id <> ' " . $db -> sql_escape ( $this -> session_id ) . " ' " : '' ;
2006-03-18 23:08:30 +00:00
2007-07-15 20:53:27 +00:00
$sql = 'DELETE FROM ' . SESSIONS_TABLE . "
2006-03-18 23:08:30 +00:00
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
2009-11-19 09:54:38 +00:00
if ( $user_id === ( int ) $this -> data [ 'user_id' ] && $this -> cookie_data [ 'k' ])
2006-03-18 22:05:08 +00:00
{
$this -> set_login_key ( $user_id );
}
}
2008-05-18 20:06:15 +00:00
2008-05-15 13:29:14 +00:00
/**
2008-05-18 20:06:15 +00:00
* Check if the request originated from the same page .
2008-05-15 13:29:14 +00:00
* @ param bool $check_script_path If true , the path will be checked as well
*/
function validate_referer ( $check_script_path = false )
{
2009-08-04 10:04:54 +00:00
global $config ;
2008-05-15 13:29:14 +00:00
// no referer - nothing to validate, user's fault for turning it off (we only check on POST; so meta can't be the reason)
2008-09-15 18:41:27 +00:00
if ( empty ( $this -> referer ) || empty ( $this -> host ))
2008-05-15 13:29:14 +00:00
{
return true ;
}
2008-06-09 17:05:52 +00:00
2008-05-15 13:29:14 +00:00
$host = htmlspecialchars ( $this -> host );
$ref = substr ( $this -> referer , strpos ( $this -> referer , '://' ) + 3 );
2009-04-22 13:09:41 +00:00
2009-08-04 10:04:54 +00:00
if ( ! ( stripos ( $ref , $host ) === 0 ) && ( ! $config [ 'force_server_vars' ] || ! ( stripos ( $ref , $config [ 'server_name' ]) === 0 )))
2008-05-15 13:29:14 +00:00
{
return false ;
}
2008-05-17 14:34:32 +00:00
else if ( $check_script_path && rtrim ( $this -> page [ 'root_script_path' ], '/' ) !== '' )
2008-05-15 13:29:14 +00:00
{
$ref = substr ( $ref , strlen ( $host ));
2008-05-17 14:34:32 +00:00
$server_port = ( ! empty ( $_SERVER [ 'SERVER_PORT' ])) ? ( int ) $_SERVER [ 'SERVER_PORT' ] : ( int ) getenv ( 'SERVER_PORT' );
2008-06-09 17:05:52 +00:00
2008-05-17 14:35:23 +00:00
if ( $server_port !== 80 && $server_port !== 443 && stripos ( $ref , " : $server_port " ) === 0 )
2008-05-17 14:34:32 +00:00
{
$ref = substr ( $ref , strlen ( " : $server_port " ));
}
2008-06-09 17:05:52 +00:00
2008-05-15 13:29:14 +00:00
if ( ! ( stripos ( rtrim ( $ref , '/' ), rtrim ( $this -> page [ 'root_script_path' ], '/' )) === 0 ))
{
return false ;
}
}
2008-06-09 17:05:52 +00:00
2008-05-15 13:29:14 +00:00
return true ;
}
2008-06-02 17:10:21 +00:00
function unset_admin ()
{
global $db ;
$sql = 'UPDATE ' . SESSIONS_TABLE . '
SET session_admin = 0
WHERE session_id = \ '' . $db -> sql_escape ( $this -> session_id ) . '\'' ;
$db -> sql_query ( $sql );
}
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 .
2006-06-13 21:06:29 +00:00
*
* @ package phpBB3
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 ;
2008-08-23 17:20:55 +00:00
var $lang_name = false ;
2007-08-06 14:41:37 +00:00
var $lang_id = false ;
2002-10-20 19:19:07 +00:00
var $lang_path ;
var $img_lang ;
2007-04-08 17:40:36 +00:00
var $img_array = array ();
2002-10-20 19:19:07 +00:00
2009-06-27 08:36:40 +00:00
// Able to add new options (up to id 31)
var $keyoptions = array ( 'viewimg' => 0 , 'viewflash' => 1 , 'viewsmilies' => 2 , 'viewsigs' => 3 , 'viewavatars' => 4 , 'viewcensors' => 5 , 'attachsig' => 6 , 'bbcode' => 8 , 'smilies' => 9 , 'popuppm' => 10 , 'sig_bbcode' => 15 , 'sig_smilies' => 16 , 'sig_links' => 17 );
2003-08-27 22:25:43 +00:00
var $keyvalues = array ();
2003-08-27 16:31:54 +00:00
2008-08-23 17:20:55 +00:00
/**
* Constructor to set the lang path
*/
function user ()
{
global $phpbb_root_path ;
$this -> lang_path = $phpbb_root_path . 'language/' ;
}
/**
* Function to set custom language path ( able to use directory outside of phpBB )
*
* @ param string $lang_path New language path used .
* @ access public
*/
function set_custom_lang_path ( $lang_path )
{
$this -> lang_path = $lang_path ;
if ( substr ( $this -> lang_path , - 1 ) != '/' )
{
$this -> lang_path .= '/' ;
}
}
2006-06-11 18:13:52 +00:00
/**
* Setup basic user - specific items ( style , language , ... )
*/
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
{
2008-08-23 17:20:55 +00:00
$this -> lang_name = ( file_exists ( $this -> lang_path . $this -> data [ 'user_lang' ] . " /common. $phpEx " )) ? $this -> data [ 'user_lang' ] : basename ( $config [ 'default_lang' ]);
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
{
2007-07-13 11:58:12 +00:00
$this -> lang_name = basename ( $config [ 'default_lang' ]);
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
2006-10-03 18:35:59 +00:00
/**
* If a guest user is surfing , we try to guess his / her language first by obtaining the browser language
2006-11-19 21:00:48 +00:00
* If re - enabled we need to make sure only those languages installed are checked
* Commented out so we do not loose the code .
2006-06-11 18:13:52 +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' ]);
2006-10-03 18:35:59 +00:00
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 ));
2006-10-03 18:35:59 +00:00
$accept_lang = basename ( $accept_lang );
2008-08-23 17:20:55 +00:00
if ( file_exists ( $this -> lang_path . $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-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 );
2006-10-03 18:35:59 +00:00
$accept_lang = basename ( $accept_lang );
2008-08-23 17:20:55 +00:00
if ( file_exists ( $this -> lang_path . $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
break ;
}
}
2002-10-04 13:09:10 +00:00
}
}
2006-10-03 18:35:59 +00:00
*/
2002-10-04 13:09:10 +00:00
}
2007-07-15 20:53:27 +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 ;
2007-07-13 11:58:12 +00:00
2009-03-17 12:02:48 +00:00
// Do not suppress error if in DEBUG_EXTRA mode
$include_result = ( defined ( 'DEBUG_EXTRA' )) ? ( include $this -> lang_path . $this -> lang_name . " /common. $phpEx " ) : ( @ include $this -> lang_path . $this -> lang_name . " /common. $phpEx " );
if ( $include_result === false )
2005-03-17 22:41:20 +00:00
{
2008-08-23 17:20:55 +00:00
die ( 'Language file ' . $this -> lang_path . $this -> lang_name . " /common. $phpEx " . " couldn't be opened. " );
2005-03-17 22:41:20 +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
2009-07-24 08:52:56 +00:00
if ( ! empty ( $_GET [ 'style' ]) && $auth -> acl_get ( 'a_styles' ) && ! defined ( 'ADMIN_START' ))
2003-07-13 21:40:03 +00:00
{
2006-06-06 20:53:46 +00:00
global $SID , $_EXTRA_URL ;
2003-09-07 13:46:51 +00:00
2005-01-15 18:50:22 +00:00
$style = request_var ( 'style' , 0 );
$SID .= '&style=' . $style ;
2006-06-06 20:53:46 +00:00
$_EXTRA_URL = array ( 'style=' . $style );
2003-07-13 21:40:03 +00:00
}
else
{
// Set up style
2007-09-02 17:24:56 +00:00
$style = ( $style ) ? $style : (( ! $config [ 'override_user_style' ]) ? $this -> data [ 'user_style' ] : $config [ 'default_style' ]);
2003-07-13 21:40:03 +00:00
}
2002-10-04 13:09:10 +00:00
2008-07-28 14:24:37 +00:00
$sql = ' SELECT s . style_id , t . template_storedb , t . template_path , t . template_id , t . bbcode_bitfield , t . template_inherits_id , t . template_inherit_path , c . theme_path , c . theme_name , c . theme_storedb , c . theme_id , i . imageset_path , i . imageset_id , i . imageset_name
2006-06-07 19:32:23 +00:00
FROM ' . STYLES_TABLE . ' s , ' . STYLES_TEMPLATE_TABLE . ' t , ' . STYLES_THEME_TABLE . ' c , ' . STYLES_IMAGESET_TABLE . " i
2005-12-22 16:28:27 +00:00
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 );
2006-06-11 18:13:52 +00:00
$db -> sql_freeresult ( $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' ];
2007-07-15 20:53:27 +00:00
$sql = 'UPDATE ' . USERS_TABLE . "
SET user_style = $style
2006-01-22 13:06:13 +00:00
WHERE user_id = { $this -> data [ 'user_id' ]} " ;
$db -> sql_query ( $sql );
2007-07-21 04:02:41 +00:00
$sql = ' SELECT s . style_id , t . template_storedb , t . template_path , t . template_id , t . bbcode_bitfield , c . theme_path , c . theme_name , c . theme_storedb , c . theme_id , i . imageset_path , i . imageset_id , i . imageset_name
2006-06-07 19:32:23 +00:00
FROM ' . STYLES_TABLE . ' s , ' . STYLES_TEMPLATE_TABLE . ' t , ' . STYLES_THEME_TABLE . ' c , ' . STYLES_IMAGESET_TABLE . " i
2006-01-22 13:06:13 +00:00
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
}
2006-06-11 18:13:52 +00:00
// If the style author specified the theme needs to be cached
// (because of the used paths and variables) than make sure it is the case.
// For example, if the theme uses language-specific images it needs to be stored in db.
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
2006-08-08 19:02:44 +00:00
$stylesheet = file_get_contents ( " { $phpbb_root_path } styles/ { $this -> theme [ 'theme_path' ] } /theme/stylesheet.css " );
// Match CSS imports
$matches = array ();
preg_match_all ( '/@import url\(["\'](.*)["\']\);/i' , $stylesheet , $matches );
2007-07-15 20:53:27 +00:00
2006-08-08 19:02:44 +00:00
if ( sizeof ( $matches ))
{
$content = '' ;
foreach ( $matches [ 0 ] as $idx => $match )
{
if ( $content = @ file_get_contents ( " { $phpbb_root_path } styles/ { $this -> theme [ 'theme_path' ] } /theme/ " . $matches [ 1 ][ $idx ]))
{
$content = trim ( $content );
}
else
{
$content = '' ;
}
$stylesheet = str_replace ( $match , $content , $stylesheet );
}
2007-01-20 17:58:27 +00:00
unset ( $content );
2006-08-08 19:02:44 +00:00
}
$stylesheet = str_replace ( './' , 'styles/' . $this -> theme [ 'theme_path' ] . '/theme/' , $stylesheet );
2005-01-20 20:57:45 +00:00
$sql_ary = array (
2006-08-08 19:02:44 +00:00
'theme_data' => $stylesheet ,
2005-01-20 20:57:45 +00:00
'theme_mtime' => time (),
'theme_storedb' => 1
);
2006-06-11 18:13:52 +00:00
$sql = 'UPDATE ' . STYLES_THEME_TABLE . '
SET ' . $db->sql_build_array(' UPDATE ', $sql_ary) . '
WHERE theme_id = ' . $this->theme[' theme_id ' ];
$db -> sql_query ( $sql );
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
2009-03-11 17:47:31 +00:00
// Same query in style.php
$sql = ' SELECT *
2007-04-08 17:40:36 +00:00
FROM ' . STYLES_IMAGESET_DATA_TABLE . '
WHERE imageset_id = ' . $this->theme[' imageset_id ' ] . "
2008-01-29 15:49:15 +00:00
AND image_filename <> ''
2007-08-19 10:39:27 +00:00
AND image_lang IN ( '" . $db->sql_escape($this->img_lang) . "' , '' ) " ;
2007-04-08 17:40:36 +00:00
$result = $db -> sql_query ( $sql , 3600 );
2007-05-20 14:32:23 +00:00
$localised_images = false ;
2007-04-08 17:40:36 +00:00
while ( $row = $db -> sql_fetchrow ( $result ))
{
2007-05-20 14:32:23 +00:00
if ( $row [ 'image_lang' ])
{
$localised_images = true ;
}
2007-07-16 22:03:49 +00:00
2008-06-23 14:07:24 +00:00
$row [ 'image_filename' ] = rawurlencode ( $row [ 'image_filename' ]);
2007-04-08 17:40:36 +00:00
$this -> img_array [ $row [ 'image_name' ]] = $row ;
}
2007-05-20 14:40:10 +00:00
$db -> sql_freeresult ( $result );
2007-04-08 17:40:36 +00:00
2007-05-20 14:32:23 +00:00
// there were no localised images, try to refresh the localised imageset for the user's language
if ( ! $localised_images )
{
// Attention: this code ignores the image definition list from acp_styles and just takes everything
// that the config file contains
$sql_ary = array ();
2007-07-15 20:53:27 +00:00
2007-05-20 14:32:23 +00:00
$db -> sql_transaction ( 'begin' );
2007-07-15 20:53:27 +00:00
2007-05-20 14:32:23 +00:00
$sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . '
WHERE imageset_id = ' . $this->theme[' imageset_id '] . '
AND image_lang = \ '' . $db -> sql_escape ( $this -> img_lang ) . '\'' ;
$result = $db -> sql_query ( $sql );
if ( @ file_exists ( " { $phpbb_root_path } styles/ { $this -> theme [ 'imageset_path' ] } /imageset/ { $this -> img_lang } /imageset.cfg " ))
{
$cfg_data_imageset_data = parse_cfg_file ( " { $phpbb_root_path } styles/ { $this -> theme [ 'imageset_path' ] } /imageset/ { $this -> img_lang } /imageset.cfg " );
foreach ( $cfg_data_imageset_data as $image_name => $value )
{
if ( strpos ( $value , '*' ) !== false )
{
if ( substr ( $value , - 1 , 1 ) === '*' )
{
list ( $image_filename , $image_height ) = explode ( '*' , $value );
$image_width = 0 ;
}
else
{
list ( $image_filename , $image_height , $image_width ) = explode ( '*' , $value );
}
}
else
{
$image_filename = $value ;
$image_height = $image_width = 0 ;
}
if ( strpos ( $image_name , 'img_' ) === 0 && $image_filename )
{
$image_name = substr ( $image_name , 4 );
$sql_ary [] = array (
2007-07-27 17:33:27 +00:00
'image_name' => ( string ) $image_name ,
'image_filename' => ( string ) $image_filename ,
'image_height' => ( int ) $image_height ,
'image_width' => ( int ) $image_width ,
'imageset_id' => ( int ) $this -> theme [ 'imageset_id' ],
'image_lang' => ( string ) $this -> img_lang ,
2007-05-20 14:32:23 +00:00
);
}
}
}
2007-07-15 20:53:27 +00:00
if ( sizeof ( $sql_ary ))
{
$db -> sql_multi_insert ( STYLES_IMAGESET_DATA_TABLE , $sql_ary );
$db -> sql_transaction ( 'commit' );
$cache -> destroy ( 'sql' , STYLES_IMAGESET_DATA_TABLE );
add_log ( 'admin' , 'LOG_IMAGESET_LANG_REFRESHED' , $this -> theme [ 'imageset_name' ], $this -> img_lang );
}
else
{
$db -> sql_transaction ( 'commit' );
add_log ( 'admin' , 'LOG_IMAGESET_LANG_MISSING' , $this -> theme [ 'imageset_name' ], $this -> img_lang );
}
2007-05-20 14:32:23 +00:00
}
2007-09-22 19:18:13 +00:00
// Call phpbb_user_session_handler() in case external application want to "bend" some variables or replace classes...
// After calling it we continue script execution...
phpbb_user_session_handler ();
2007-03-01 10:29:46 +00:00
// If this function got called from the error handler we are finished here.
if ( defined ( 'IN_ERROR_HANDLER' ))
{
return ;
}
2006-11-21 18:15:53 +00:00
// Disable board if the install/ directory is still present
// For the brave development army we do not care about this, else we need to comment out this everytime we develop locally
2009-06-22 16:16:04 +00:00
if ( ! defined ( 'DEBUG_EXTRA' ) && ! defined ( 'ADMIN_START' ) && ! defined ( 'IN_INSTALL' ) && ! defined ( 'IN_LOGIN' ) && file_exists ( $phpbb_root_path . 'install' ) && ! is_file ( $phpbb_root_path . 'install' ))
2006-11-21 18:15:53 +00:00
{
// Adjust the message slightly according to the permissions
2006-12-03 18:03:33 +00:00
if ( $auth -> acl_gets ( 'a_' , 'm_' ) || $auth -> acl_getf_global ( 'm_' ))
2006-11-21 18:15:53 +00:00
{
$message = 'REMOVE_INSTALL' ;
}
else
{
$message = ( ! empty ( $config [ 'board_disable_msg' ])) ? $config [ 'board_disable_msg' ] : 'BOARD_DISABLE' ;
}
trigger_error ( $message );
}
2004-08-02 14:32:04 +00:00
// Is board disabled and user not an admin or moderator?
2006-12-03 18:03:33 +00:00
if ( $config [ 'board_disable' ] && ! defined ( 'IN_LOGIN' ) && ! $auth -> acl_gets ( 'a_' , 'm_' ) && ! $auth -> acl_getf_global ( 'm_' ))
2004-08-02 14:32:04 +00:00
{
2009-04-28 08:34:30 +00:00
if ( $this -> data [ 'is_bot' ])
{
2010-09-11 21:55:11 +02:00
send_status_line ( 503 , 'Service Unavailable' );
2009-04-28 08:34:30 +00:00
}
2007-02-24 12:31:21 +00:00
2004-08-02 14:32:04 +00:00
$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 )
{
2010-08-20 13:41:06 -04:00
if ( $this -> load > floatval ( $config [ 'limit_load' ]) && ! defined ( 'IN_LOGIN' ) && ! defined ( 'IN_ADMIN' ))
2006-05-12 20:52:58 +00:00
{
2007-07-12 16:14:07 +00:00
// Set board disabled to true to let the admins/mods get the proper notification
$config [ 'board_disable' ] = '1' ;
if ( ! $auth -> acl_gets ( 'a_' , 'm_' ) && ! $auth -> acl_getf_global ( 'm_' ))
{
2009-04-28 08:34:30 +00:00
if ( $this -> data [ 'is_bot' ])
{
2010-09-11 21:55:11 +02:00
send_status_line ( 503 , 'Service Unavailable' );
2009-04-28 08:34:30 +00:00
}
2007-07-12 16:14:07 +00:00
trigger_error ( 'BOARD_UNAVAILABLE' );
}
2006-05-12 20:52:58 +00:00
}
}
2007-07-15 20:53:27 +00:00
2007-06-27 10:08:33 +00:00
if ( isset ( $this -> data [ 'session_viewonline' ]))
2007-06-14 15:03:52 +00:00
{
2007-06-27 10:08:33 +00:00
// Make sure the user is able to hide his session
if ( ! $this -> data [ 'session_viewonline' ])
2007-06-14 15:03:52 +00:00
{
2007-06-27 10:08:33 +00:00
// Reset online status if not allowed to hide the session...
if ( ! $auth -> acl_get ( 'u_hideonline' ))
{
$sql = 'UPDATE ' . SESSIONS_TABLE . '
SET session_viewonline = 1
WHERE session_user_id = ' . $this->data[' user_id ' ];
$db -> sql_query ( $sql );
$this -> data [ 'session_viewonline' ] = 1 ;
}
2007-06-14 15:03:52 +00:00
}
2007-06-27 10:08:33 +00:00
else if ( ! $this -> data [ 'user_allow_viewonline' ])
2007-06-14 15:03:52 +00:00
{
2007-06-27 10:08:33 +00:00
// the user wants to hide and is allowed to -> cloaking device on.
if ( $auth -> acl_get ( 'u_hideonline' ))
{
$sql = 'UPDATE ' . SESSIONS_TABLE . '
SET session_viewonline = 0
WHERE session_user_id = ' . $this->data[' user_id ' ];
$db -> sql_query ( $sql );
$this -> data [ 'session_viewonline' ] = 0 ;
}
2007-06-14 15:03:52 +00:00
}
}
2006-05-12 20:52:58 +00:00
2004-02-05 13:38:57 +00:00
// Does the user need to change their password? If so, redirect to the
2006-06-11 18:13:52 +00:00
// ucp profile reg_details page ... of course do not redirect if we're already in the ucp
2009-06-24 02:56:05 +00:00
if ( ! defined ( 'IN_ADMIN' ) && ! defined ( 'ADMIN_START' ) && $config [ 'chg_passforce' ] && ! empty ( $this -> data [ 'is_registered' ]) && $auth -> acl_get ( 'u_chgpasswd' ) && $this -> data [ 'user_passchg' ] < time () - ( $config [ 'chg_passforce' ] * 86400 ))
2004-02-05 13:38:57 +00:00
{
2006-07-11 22:09:56 +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
{
2006-06-06 20:53:46 +00:00
redirect ( append_sid ( " { $phpbb_root_path } ucp. $phpEx " , 'i=profile&mode=reg_details' ));
2004-02-05 13:38:57 +00:00
}
}
2002-10-04 13:09:10 +00:00
return ;
}
2008-08-31 21:47:26 +00:00
/**
* More advanced language substitution
* Function to mimic sprintf () with the possibility of using phpBB ' s language system to substitute nullar / singular / plural forms .
* Params are the language key and the parameters to be substituted .
* This function / functionality is inspired by SHS ` and Ashe .
*
* Example call : < samp > $user -> lang ( 'NUM_POSTS_IN_QUEUE' , 1 ); </ samp >
*/
function lang ()
{
$args = func_get_args ();
$key = $args [ 0 ];
2008-11-30 14:36:59 +00:00
if ( is_array ( $key ))
{
$lang = & $this -> lang [ array_shift ( $key )];
foreach ( $key as $_key )
{
$lang = & $lang [ $_key ];
}
}
else
{
$lang = & $this -> lang [ $key ];
}
2008-08-31 21:47:26 +00:00
// Return if language string does not exist
2008-11-30 14:36:59 +00:00
if ( ! isset ( $lang ) || ( ! is_string ( $lang ) && ! is_array ( $lang )))
2008-08-31 21:47:26 +00:00
{
return $key ;
}
// If the language entry is a string, we simply mimic sprintf() behaviour
2008-11-30 14:36:59 +00:00
if ( is_string ( $lang ))
2008-08-31 21:47:26 +00:00
{
if ( sizeof ( $args ) == 1 )
{
2008-11-30 14:36:59 +00:00
return $lang ;
2008-08-31 21:47:26 +00:00
}
// Replace key with language entry and simply pass along...
2008-11-30 14:36:59 +00:00
$args [ 0 ] = $lang ;
2008-08-31 21:47:26 +00:00
return call_user_func_array ( 'sprintf' , $args );
}
// It is an array... now handle different nullar/singular/plural forms
$key_found = false ;
// We now get the first number passed and will select the key based upon this number
for ( $i = 1 , $num_args = sizeof ( $args ); $i < $num_args ; $i ++ )
{
if ( is_int ( $args [ $i ]))
{
2008-11-30 14:36:59 +00:00
$numbers = array_keys ( $lang );
2008-08-31 21:47:26 +00:00
foreach ( $numbers as $num )
{
if ( $num > $args [ $i ])
{
break ;
}
$key_found = $num ;
}
}
}
// Ok, let's check if the key was found, else use the last entry (because it is mostly the plural form)
if ( $key_found === false )
{
2008-11-30 14:36:59 +00:00
$numbers = array_keys ( $lang );
2008-08-31 21:47:26 +00:00
$key_found = end ( $numbers );
}
// Use the language string we determined and pass it to sprintf()
2008-11-30 14:36:59 +00:00
$args [ 0 ] = $lang [ $key_found ];
2008-08-31 21:47:26 +00:00
return call_user_func_array ( 'sprintf' , $args );
}
2006-06-11 18:13:52 +00:00
/**
* Add Language Items - use_db and use_help are assigned where needed ( only use them to force inclusion )
*
* @ param mixed $lang_set specifies the language entries to include
* @ param bool $use_db internal variable for recursion , do not use
* @ param bool $use_help internal variable for recursion , do not use
*
* Examples :
* < code >
* $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' ))
* </ code >
*/
2004-02-28 21:16:15 +00:00
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
}
}
2006-06-11 18:13:52 +00:00
/**
* Set language entry ( called by add_lang )
2006-08-22 21:26:06 +00:00
* @ access private
2006-06-11 18:13:52 +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
2008-08-23 17:20:55 +00:00
// Make sure the language name is set (if the user setup did not happen it is not set)
if ( ! $this -> lang_name )
2006-01-25 21:01:52 +00:00
{
2008-08-23 17:39:31 +00:00
global $config ;
2008-08-23 17:20:55 +00:00
$this -> lang_name = basename ( $config [ 'default_lang' ]);
2006-01-25 21:01:52 +00:00
}
2004-08-15 12:06:05 +00:00
// $lang == $this->lang
// $help == $this->help
2007-01-21 18:33:45 +00:00
// - add appropriate variables here, name them as they are used within the language file...
2004-02-29 12:51:18 +00:00
if ( ! $use_db )
{
2007-06-28 14:55:48 +00:00
if ( $use_help && strpos ( $lang_file , '/' ) !== false )
2005-03-17 22:41:20 +00:00
{
2008-08-23 17:20:55 +00:00
$language_filename = $this -> lang_path . $this -> lang_name . '/' . substr ( $lang_file , 0 , stripos ( $lang_file , '/' ) + 1 ) . 'help_' . substr ( $lang_file , stripos ( $lang_file , '/' ) + 1 ) . '.' . $phpEx ;
2007-06-28 14:55:48 +00:00
}
else
{
2008-08-23 17:20:55 +00:00
$language_filename = $this -> lang_path . $this -> lang_name . '/' . (( $use_help ) ? 'help_' : '' ) . $lang_file . '.' . $phpEx ;
2007-06-28 14:55:48 +00:00
}
2009-08-01 11:01:18 +00:00
if ( ! file_exists ( $language_filename ))
{
global $config ;
if ( $this -> lang_name == 'en' )
{
// The user's selected language is missing the file, the board default's language is missing the file, and the file doesn't exist in /en.
$language_filename = str_replace ( $this -> lang_path . 'en' , $this -> lang_path . $this -> data [ 'user_lang' ], $language_filename );
trigger_error ( 'Language file ' . $language_filename . ' couldn\'t be opened.' , E_USER_ERROR );
}
else if ( $this -> lang_name == basename ( $config [ 'default_lang' ]))
{
// Fall back to the English Language
$this -> lang_name = 'en' ;
$this -> set_lang ( $lang , $help , $lang_file , $use_db , $use_help );
}
else if ( $this -> lang_name == $this -> data [ 'user_lang' ])
{
// Fall back to the board default language
$this -> lang_name = basename ( $config [ 'default_lang' ]);
$this -> set_lang ( $lang , $help , $lang_file , $use_db , $use_help );
}
// Reset the lang name
$this -> lang_name = ( file_exists ( $this -> lang_path . $this -> data [ 'user_lang' ] . " /common. $phpEx " )) ? $this -> data [ 'user_lang' ] : basename ( $config [ 'default_lang' ]);
return ;
}
2009-03-17 12:02:48 +00:00
// Do not suppress error if in DEBUG_EXTRA mode
$include_result = ( defined ( 'DEBUG_EXTRA' )) ? ( include $language_filename ) : ( @ include $language_filename );
if ( $include_result === false )
2007-06-28 14:55:48 +00:00
{
2008-07-28 13:26:20 +00:00
trigger_error ( 'Language file ' . $language_filename . ' couldn\'t be opened.' , E_USER_ERROR );
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
}
}
2006-06-11 18:13:52 +00:00
/**
* Format user date
2008-11-30 14:36:59 +00:00
*
* @ param int $gmepoch unix timestamp
* @ param string $format date format in date () notation . | used to indicate relative dates , for example | d m Y | , h : i is translated to Today , h : i .
* @ param bool $forcedate force non - relative date format .
*
* @ return mixed translated date
2006-06-11 18:13:52 +00:00
*/
2004-08-02 14:32:04 +00:00
function format_date ( $gmepoch , $format = false , $forcedate = false )
2002-10-04 13:09:10 +00:00
{
2006-06-22 15:14:03 +00:00
static $midnight ;
2008-11-30 14:36:59 +00:00
static $date_cache ;
2006-06-22 15:14:03 +00:00
$format = ( ! $format ) ? $this -> date_format : $format ;
2008-12-04 12:56:12 +00:00
$now = time ();
$delta = $now - $gmepoch ;
2002-10-04 13:09:10 +00:00
2008-11-30 14:36:59 +00:00
if ( ! isset ( $date_cache [ $format ]))
2002-10-04 13:09:10 +00:00
{
2008-11-30 14:36:59 +00:00
// Is the user requesting a friendly date format (i.e. 'Today 12:42')?
$date_cache [ $format ] = array (
'is_short' => strpos ( $format , '|' ),
'format_short' => substr ( $format , 0 , strpos ( $format , '|' )) . '||' . substr ( strrchr ( $format , '|' ), 1 ),
'format_long' => str_replace ( '|' , '' , $format ),
'lang' => $this -> lang [ 'datetime' ],
);
2004-01-11 00:46:46 +00:00
2008-11-30 14:36:59 +00:00
// Short representation of month in format? Some languages use different terms for the long and short format of May
if (( strpos ( $format , '\M' ) === false && strpos ( $format , 'M' ) !== false ) || ( strpos ( $format , '\r' ) === false && strpos ( $format , 'r' ) !== false ))
{
$date_cache [ $format ][ 'lang' ][ 'May' ] = $this -> lang [ 'datetime' ][ 'May_short' ];
}
2004-08-02 14:32:04 +00:00
}
2009-01-23 12:22:51 +00:00
// Zone offset
$zone_offset = $this -> timezone + $this -> dst ;
2010-07-07 23:04:46 +01:00
// Show date <= 1 hour ago as 'xx min ago' but not greater than 60 seconds in the future
2009-01-23 12:11:45 +00:00
// A small tolerence is given for times in the future but in the same minute are displayed as '< than a minute ago'
2010-07-07 23:04:46 +01:00
if ( $delta <= 3600 && $delta > - 60 && ( $delta >= - 5 || (( $now / 60 ) % 60 ) == (( $gmepoch / 60 ) % 60 )) && $date_cache [ $format ][ 'is_short' ] !== false && ! $forcedate && isset ( $this -> lang [ 'datetime' ][ 'AGO' ]))
2004-08-02 14:32:04 +00:00
{
2008-12-04 12:56:12 +00:00
return $this -> lang ( array ( 'datetime' , 'AGO' ), max ( 0 , ( int ) floor ( $delta / 60 )));
2004-08-02 14:32:04 +00:00
}
2005-07-04 16:54:34 +00:00
2008-11-30 14:36:59 +00:00
if ( ! $midnight )
2004-08-02 14:32:04 +00:00
{
2009-01-23 12:22:51 +00:00
list ( $d , $m , $y ) = explode ( ' ' , gmdate ( 'j n Y' , time () + $zone_offset ));
$midnight = gmmktime ( 0 , 0 , 0 , $m , $d , $y ) - $zone_offset ;
2004-08-02 14:32:04 +00:00
}
2008-11-30 14:36:59 +00:00
2009-01-23 12:11:45 +00:00
if ( $date_cache [ $format ][ 'is_short' ] !== false && ! $forcedate && ! ( $gmepoch < $midnight - 86400 || $gmepoch > $midnight + 172800 ))
2004-08-02 14:32:04 +00:00
{
2008-11-30 14:36:59 +00:00
$day = false ;
if ( $gmepoch > $midnight + 86400 )
{
$day = 'TOMORROW' ;
}
else if ( $gmepoch > $midnight )
{
$day = 'TODAY' ;
}
else if ( $gmepoch > $midnight - 86400 )
{
$day = 'YESTERDAY' ;
}
if ( $day !== false )
{
2009-01-23 12:22:51 +00:00
return str_replace ( '||' , $this -> lang [ 'datetime' ][ $day ], strtr ( @ gmdate ( $date_cache [ $format ][ 'format_short' ], $gmepoch + $zone_offset ), $date_cache [ $format ][ 'lang' ]));
2008-11-30 14:36:59 +00:00
}
2004-08-02 14:32:04 +00:00
}
2006-05-26 15:04:27 +00:00
2009-01-23 12:22:51 +00:00
return strtr ( @ gmdate ( $date_cache [ $format ][ 'format_long' ], $gmepoch + $zone_offset ), $date_cache [ $format ][ 'lang' ]);
2002-10-04 13:09:10 +00:00
}
2002-10-20 19:19:07 +00:00
2006-06-11 18:13:52 +00:00
/**
* Get language id currently used by the user
*/
2004-01-10 12:23:24 +00:00
function get_iso_lang_id ()
{
global $config , $db ;
2007-08-06 14:41:37 +00:00
if ( ! empty ( $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 );
2007-08-06 14:41:37 +00:00
$this -> lang_id = ( int ) $db -> sql_fetchfield ( 'lang_id' );
2006-03-22 17:30:20 +00:00
$db -> sql_freeresult ( $result );
2004-01-11 00:46:46 +00:00
2007-08-06 14:41:37 +00:00
return $this -> lang_id ;
2004-01-10 12:23:24 +00:00
}
2006-06-11 18:13:52 +00:00
/**
* Get users profile fields
*/
2004-01-10 12:23:24 +00:00
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 ;
}
2006-06-11 18:13:52 +00:00
$sql = ' SELECT *
FROM ' . PROFILE_FIELDS_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 );
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
}
2006-06-11 18:13:52 +00:00
/**
* Specify / Get image
2008-09-16 15:06:19 +00:00
* $suffix is no longer used - we know it . ;) It is there for backward compatibility .
2006-06-11 18:13:52 +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
2007-04-08 17:40:36 +00:00
$img_data = & $imgs [ $img ];
2006-08-28 17:20:21 +00:00
2007-05-26 16:38:33 +00:00
if ( empty ( $img_data ))
2002-10-20 19:19:07 +00:00
{
2007-04-08 17:40:36 +00:00
if ( ! isset ( $this -> img_array [ $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
2006-08-28 17:20:21 +00:00
$img_data = '' ;
return $img_data ;
2004-05-26 20:29:39 +00:00
}
2004-08-02 14:32:04 +00:00
2009-08-17 14:45:14 +00:00
// Use URL if told so
$root_path = ( defined ( 'PHPBB_USE_BOARD_URL_PATH' ) && PHPBB_USE_BOARD_URL_PATH ) ? generate_board_url () . '/' : $phpbb_root_path ;
$img_data [ 'src' ] = $root_path . 'styles/' . rawurlencode ( $this -> theme [ 'imageset_path' ]) . '/imageset/' . ( $this -> img_array [ $img ][ 'image_lang' ] ? $this -> img_array [ $img ][ 'image_lang' ] . '/' : '' ) . $this -> img_array [ $img ][ 'image_filename' ];
2007-04-08 17:40:36 +00:00
$img_data [ 'width' ] = $this -> img_array [ $img ][ 'image_width' ];
$img_data [ 'height' ] = $this -> img_array [ $img ][ 'image_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 ;
2006-06-11 18:13:52 +00:00
2005-04-20 19:59:59 +00:00
switch ( $type )
{
case 'src' :
2006-08-28 17:20:21 +00:00
return $img_data [ 'src' ];
2006-05-21 16:54:19 +00:00
break ;
2007-07-15 20:53:27 +00:00
2005-04-20 19:59:59 +00:00
case 'width' :
2007-05-26 16:38:33 +00:00
return ( $width === false ) ? $img_data [ 'width' ] : $width ;
2006-05-21 16:54:19 +00:00
break ;
2005-04-20 19:59:59 +00:00
case 'height' :
2006-08-28 17:20:21 +00:00
return $img_data [ 'height' ];
2006-05-21 16:54:19 +00:00
break ;
2005-04-20 19:59:59 +00:00
default :
2007-05-26 16:38:33 +00:00
$use_width = ( $width === false ) ? $img_data [ 'width' ] : $width ;
2008-01-29 15:49:15 +00:00
2007-05-26 16:38:33 +00:00
return '<img src="' . $img_data [ 'src' ] . '"' . (( $use_width ) ? ' width="' . $use_width . '"' : '' ) . (( $img_data [ 'height' ]) ? ' height="' . $img_data [ '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
2006-06-11 18:13:52 +00:00
/**
* Get option bit field from user options
*/
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
}
2006-06-11 18:13:52 +00:00
2003-08-27 22:25:43 +00:00
return $this -> keyvalues [ $key ];
}
2006-06-11 18:13:52 +00:00
/**
* Set option bit field for user options
*/
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
}
2009-06-20 18:45:16 +00:00
/**
* Funtion to make the user leave the NEWLY_REGISTERED system group .
* @ access public
*/
function leave_newly_registered ()
{
global $db ;
2009-06-21 11:13:20 +00:00
if ( empty ( $this -> data [ 'user_new' ]))
{
return false ;
}
2009-06-21 14:31:00 +00:00
if ( ! function_exists ( 'remove_newly_registered' ))
2009-06-20 18:45:16 +00:00
{
global $phpbb_root_path , $phpEx ;
include ( $phpbb_root_path . 'includes/functions_user.' . $phpEx );
}
2009-06-21 14:31:00 +00:00
if ( $group = remove_newly_registered ( $this -> data [ 'user_id' ], $this -> data ))
2009-06-20 18:45:16 +00:00
{
2009-06-21 14:31:00 +00:00
$this -> data [ 'group_id' ] = $group ;
2009-08-01 11:01:18 +00:00
2009-06-20 18:45:16 +00:00
}
$this -> data [ 'user_permissions' ] = '' ;
$this -> data [ 'user_new' ] = 0 ;
2009-08-01 11:01:18 +00:00
2009-06-20 18:45:16 +00:00
return true ;
}
2002-10-04 13:09:10 +00:00
}
2002-08-22 17:55:55 +00:00
2006-01-04 07:51:04 +00:00
?>