/php/Sources/Load.php
PHP | 2750 lines | 2007 code | 334 blank | 409 comment | 676 complexity | d38355207cc36ae1d28e4d1df1e8f92b MD5 | raw file
Possible License(s): BSD-3-Clause
Large files files are truncated, but you can click here to view the full file
- <?php
- /**
- * Simple Machines Forum (SMF)
- *
- * @package SMF
- * @author Simple Machines http://www.simplemachines.org
- * @copyright 2011 Simple Machines
- * @license http://www.simplemachines.org/about/smf/license.php BSD
- *
- * @version 2.0.7
- */
- if (!defined('SMF'))
- die('Hacking attempt...');
- /* This file has the hefty job of loading information for the forum. It uses
- the following functions:
- void reloadSettings()
- - loads or reloads the $modSettings array.
- - loads any integration settings, SMF_INTEGRATION_SETTINGS, etc.
- void loadUserSettings()
- - sets up the $user_info array
- - assigns $user_info['query_wanna_see_board'] for what boards the user can see.
- - first checks for cookie or intergration validation.
- - uses the current session if no integration function or cookie is found.
- - checks password length, if member is activated and the login span isn't over.
- - if validation fails for the user, $id_member is set to 0.
- - updates the last visit time when needed.
- void loadBoard()
- - sets up the $board_info array for current board information.
- - if cache is enabled, the $board_info array is stored in cache.
- - redirects to appropriate post if only message id is requested.
- - is only used when inside a topic or board.
- - determines the local moderators for the board.
- - adds group id 3 if the user is a local moderator for the board they are in.
- - prevents access if user is not in proper group nor a local moderator of the board.
- void loadPermissions()
- // !!!
- array loadMemberData(array members, bool is_name = false, string set = 'normal')
- // !!!
- bool loadMemberContext(int id_member)
- // !!!
- void loadTheme(int id_theme = auto_detect)
- // !!!
- void loadTemplate(string template_name, array style_sheets = array(), bool fatal = true)
- - loads a template file with the name template_name from the current,
- default, or base theme.
- - uses the template_include() function to include the file.
- - detects a wrong default theme directory and tries to work around it.
- - if fatal is true, dies with an error message if the template cannot
- be found.
- void loadSubTemplate(string sub_template_name, bool fatal = false)
- - loads the sub template specified by sub_template_name, which must be
- in an already-loaded template.
- - if ?debug is in the query string, shows administrators a marker after
- every sub template for debugging purposes.
- string loadLanguage(string template_name, string language = default, bool fatal = true, bool force_reload = false)
- // !!!
- array getBoardParents(int id_parent)
- - finds all the parents of id_parent, and that board itself.
- - additionally detects the moderators of said boards.
- - returns an array of information about the boards found.
- string &censorText(string &text, bool force = false)
- - censors the passed string.
- - if the theme setting allow_no_censored is on, and the theme option
- show_no_censored is enabled, does not censor - unless force is set.
- - caches the list of censored words to reduce parsing.
- void template_include(string filename, bool only_once = false)
- - loads the template or language file specified by filename.
- - if once is true, only includes the file once (like include_once.)
- - uses eval unless disableTemplateEval is enabled.
- - outputs a parse error if the file did not exist or contained errors.
- - attempts to detect the error and line, and show detailed information.
- void loadSession()
- // !!!
- void loadDatabase()
- - takes care of mysql_set_mode, if set.
- // !!!
- bool sessionOpen(string session_save_path, string session_name)
- bool sessionClose()
- bool sessionRead(string session_id)
- bool sessionWrite(string session_id, string data)
- bool sessionDestroy(string session_id)
- bool sessionGC(int max_lifetime)
- - implementations of PHP's session API.
- - handle the session data in the database (more scalable.)
- - use the databaseSession_lifetime setting for garbage collection.
- - set by loadSession().
- void cache_put_data(string key, mixed value, int ttl = 120)
- - puts value in the cache under key for ttl seconds.
- - may "miss" so shouldn't be depended on, and may go to any of many
- various caching servers.
- - supports eAccelerator, Turck MMCache, ZPS, and memcached.
- mixed cache_get_data(string key, int ttl = 120)
- - gets the value from the cache specified by key, so long as it is not
- older than ttl seconds.
- - may often "miss", so shouldn't be depended on.
- - supports the same as cache_put_data().
- void get_memcached_server(int recursion_level = 3)
- - used by cache_get_data() and cache_put_data().
- - attempts to connect to a random server in the cache_memcached
- setting.
- - recursively calls itself up to recursion_level times.
- */
- // Load the $modSettings array.
- function reloadSettings()
- {
- global $modSettings, $boarddir, $smcFunc, $txt, $db_character_set, $context, $sourcedir;
- // Most database systems have not set UTF-8 as their default input charset.
- if (!empty($db_character_set))
- $smcFunc['db_query']('set_character_set', '
- SET NAMES ' . $db_character_set,
- array(
- )
- );
- // Try to load it from the cache first; it'll never get cached if the setting is off.
- if (($modSettings = cache_get_data('modSettings', 90)) == null)
- {
- $request = $smcFunc['db_query']('', '
- SELECT variable, value
- FROM {db_prefix}settings',
- array(
- )
- );
- $modSettings = array();
- if (!$request)
- db_fatal_error();
- while ($row = $smcFunc['db_fetch_row']($request))
- $modSettings[$row[0]] = $row[1];
- $smcFunc['db_free_result']($request);
- // Do a few things to protect against missing settings or settings with invalid values...
- if (empty($modSettings['defaultMaxTopics']) || $modSettings['defaultMaxTopics'] <= 0 || $modSettings['defaultMaxTopics'] > 999)
- $modSettings['defaultMaxTopics'] = 20;
- if (empty($modSettings['defaultMaxMessages']) || $modSettings['defaultMaxMessages'] <= 0 || $modSettings['defaultMaxMessages'] > 999)
- $modSettings['defaultMaxMessages'] = 15;
- if (empty($modSettings['defaultMaxMembers']) || $modSettings['defaultMaxMembers'] <= 0 || $modSettings['defaultMaxMembers'] > 999)
- $modSettings['defaultMaxMembers'] = 30;
- if (!empty($modSettings['cache_enable']))
- cache_put_data('modSettings', $modSettings, 90);
- }
- // UTF-8 in regular expressions is unsupported on PHP(win) versions < 4.2.3.
- $utf8 = (empty($modSettings['global_character_set']) ? $txt['lang_character_set'] : $modSettings['global_character_set']) === 'UTF-8' && (strpos(strtolower(PHP_OS), 'win') === false || @version_compare(PHP_VERSION, '4.2.3') != -1);
- // Set a list of common functions.
- $ent_list = empty($modSettings['disableEntityCheck']) ? '&(#\d{1,7}|quot|amp|lt|gt|nbsp);' : '&(#021|quot|amp|lt|gt|nbsp);';
- $ent_check = empty($modSettings['disableEntityCheck']) ? array('preg_replace_callback(\'~(&#(\d{1,7}|x[0-9a-fA-F]{1,6});)~\', \'entity_fix__callback\', ', ')') : array('', '');
- // Preg_replace can handle complex characters only for higher PHP versions.
- $space_chars = $utf8 ? (@version_compare(PHP_VERSION, '4.3.3') != -1 ? '\x{A0}\x{AD}\x{2000}-\x{200F}\x{201F}\x{202F}\x{3000}\x{FEFF}' : "\xC2\xA0\xC2\xAD\xE2\x80\x80-\xE2\x80\x8F\xE2\x80\x9F\xE2\x80\xAF\xE2\x80\x9F\xE3\x80\x80\xEF\xBB\xBF") : '\x00-\x08\x0B\x0C\x0E-\x19\xA0';
- $smcFunc += array(
- 'entity_fix' => create_function('$string', '
- $num = substr($string, 0, 1) === \'x\' ? hexdec(substr($string, 1)) : (int) $string;
- return $num < 0x20 || $num > 0x10FFFF || ($num >= 0xD800 && $num <= 0xDFFF) || $num === 0x202E || $num === 0x202D ? \'\' : \'&#\' . $num . \';\';'),
- 'htmlspecialchars' => create_function('$string, $quote_style = ENT_COMPAT, $charset = \'ISO-8859-1\'', '
- global $smcFunc;
- return ' . strtr($ent_check[0], array('&' => '&')) . 'htmlspecialchars($string, $quote_style, ' . ($utf8 ? '\'UTF-8\'' : '$charset') . ')' . $ent_check[1] . ';'),
- 'htmltrim' => create_function('$string', '
- global $smcFunc;
- return preg_replace(\'~^(?:[ \t\n\r\x0B\x00' . $space_chars . ']| )+|(?:[ \t\n\r\x0B\x00' . $space_chars . ']| )+$~' . ($utf8 ? 'u' : '') . '\', \'\', ' . implode('$string', $ent_check) . ');'),
- 'strlen' => create_function('$string', '
- global $smcFunc;
- return strlen(preg_replace(\'~' . $ent_list . ($utf8 ? '|.~u' : '~') . '\', \'_\', ' . implode('$string', $ent_check) . '));'),
- 'strpos' => create_function('$haystack, $needle, $offset = 0', '
- global $smcFunc;
- $haystack_arr = preg_split(\'~(&#' . (empty($modSettings['disableEntityCheck']) ? '\d{1,7}' : '021') . ';|"|&|<|>| |.)~' . ($utf8 ? 'u' : '') . '\', ' . implode('$haystack', $ent_check) . ', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
- $haystack_size = count($haystack_arr);
- if (strlen($needle) === 1)
- {
- $result = array_search($needle, array_slice($haystack_arr, $offset));
- return is_int($result) ? $result + $offset : false;
- }
- else
- {
- $needle_arr = preg_split(\'~(&#' . (empty($modSettings['disableEntityCheck']) ? '\d{1,7}' : '021') . ';|"|&|<|>| |.)~' . ($utf8 ? 'u' : '') . '\', ' . implode('$needle', $ent_check) . ', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
- $needle_size = count($needle_arr);
- $result = array_search($needle_arr[0], array_slice($haystack_arr, $offset));
- while (is_int($result))
- {
- $offset += $result;
- if (array_slice($haystack_arr, $offset, $needle_size) === $needle_arr)
- return $offset;
- $result = array_search($needle_arr[0], array_slice($haystack_arr, ++$offset));
- }
- return false;
- }'),
- 'substr' => create_function('$string, $start, $length = null', '
- global $smcFunc;
- $ent_arr = preg_split(\'~(&#' . (empty($modSettings['disableEntityCheck']) ? '\d{1,7}' : '021') . ';|"|&|<|>| |.)~' . ($utf8 ? 'u' : '') . '\', ' . implode('$string', $ent_check) . ', -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
- return $length === null ? implode(\'\', array_slice($ent_arr, $start)) : implode(\'\', array_slice($ent_arr, $start, $length));'),
- 'strtolower' => $utf8 ? (function_exists('mb_strtolower') ? create_function('$string', '
- return mb_strtolower($string, \'UTF-8\');') : create_function('$string', '
- global $sourcedir;
- require_once($sourcedir . \'/Subs-Charset.php\');
- return utf8_strtolower($string);')) : 'strtolower',
- 'strtoupper' => $utf8 ? (function_exists('mb_strtoupper') ? create_function('$string', '
- return mb_strtoupper($string, \'UTF-8\');') : create_function('$string', '
- global $sourcedir;
- require_once($sourcedir . \'/Subs-Charset.php\');
- return utf8_strtoupper($string);')) : 'strtoupper',
- 'truncate' => create_function('$string, $length', (empty($modSettings['disableEntityCheck']) ? '
- global $smcFunc;
- $string = ' . implode('$string', $ent_check) . ';' : '') . '
- preg_match(\'~^(' . $ent_list . '|.){\' . $smcFunc[\'strlen\'](substr($string, 0, $length)) . \'}~'. ($utf8 ? 'u' : '') . '\', $string, $matches);
- $string = $matches[0];
- while (strlen($string) > $length)
- $string = preg_replace(\'~(?:' . $ent_list . '|.)$~'. ($utf8 ? 'u' : '') . '\', \'\', $string);
- return $string;'),
- 'ucfirst' => $utf8 ? create_function('$string', '
- global $smcFunc;
- return $smcFunc[\'strtoupper\']($smcFunc[\'substr\']($string, 0, 1)) . $smcFunc[\'substr\']($string, 1);') : 'ucfirst',
- 'ucwords' => $utf8 ? create_function('$string', '
- global $smcFunc;
- $words = preg_split(\'~([\s\r\n\t]+)~\', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
- for ($i = 0, $n = count($words); $i < $n; $i += 2)
- $words[$i] = $smcFunc[\'ucfirst\']($words[$i]);
- return implode(\'\', $words);') : 'ucwords',
- );
- // Setting the timezone is a requirement for some functions in PHP >= 5.1.
- if (isset($modSettings['default_timezone']) && function_exists('date_default_timezone_set'))
- date_default_timezone_set($modSettings['default_timezone']);
- // Check the load averages?
- if (!empty($modSettings['loadavg_enable']))
- {
- if (($modSettings['load_average'] = cache_get_data('loadavg', 90)) == null)
- {
- $modSettings['load_average'] = @file_get_contents('/proc/loadavg');
- if (!empty($modSettings['load_average']) && preg_match('~^([^ ]+?) ([^ ]+?) ([^ ]+)~', $modSettings['load_average'], $matches) != 0)
- $modSettings['load_average'] = (float) $matches[1];
- elseif (($modSettings['load_average'] = @`uptime`) != null && preg_match('~load average[s]?: (\d+\.\d+), (\d+\.\d+), (\d+\.\d+)~i', $modSettings['load_average'], $matches) != 0)
- $modSettings['load_average'] = (float) $matches[1];
- else
- unset($modSettings['load_average']);
- if (!empty($modSettings['load_average']))
- cache_put_data('loadavg', $modSettings['load_average'], 90);
- }
- if (!empty($modSettings['loadavg_forum']) && !empty($modSettings['load_average']) && $modSettings['load_average'] >= $modSettings['loadavg_forum'])
- db_fatal_error(true);
- }
- // Is post moderation alive and well?
- $modSettings['postmod_active'] = isset($modSettings['admin_features']) ? in_array('pm', explode(',', $modSettings['admin_features'])) : true;
- // Integration is cool.
- if (defined('SMF_INTEGRATION_SETTINGS'))
- {
- $integration_settings = unserialize(SMF_INTEGRATION_SETTINGS);
- foreach ($integration_settings as $hook => $function)
- add_integration_function($hook, $function, false);
- }
- // Any files to pre include?
- if (!empty($modSettings['integrate_pre_include']))
- {
- $pre_includes = explode(',', $modSettings['integrate_pre_include']);
- foreach ($pre_includes as $include)
- {
- $include = strtr(trim($include), array('$boarddir' => $boarddir, '$sourcedir' => $sourcedir));
- if (file_exists($include))
- require_once($include);
- }
- }
- // Call pre load integration functions.
- call_integration_hook('integrate_pre_load');
- }
- // Load all the important user information...
- function loadUserSettings()
- {
- global $modSettings, $user_settings, $sourcedir, $smcFunc;
- global $cookiename, $user_info, $language;
- // Check first the integration, then the cookie, and last the session.
- if (count($integration_ids = call_integration_hook('integrate_verify_user')) > 0)
- {
- $id_member = 0;
- foreach ($integration_ids as $integration_id)
- {
- $integration_id = (int) $integration_id;
- if ($integration_id > 0)
- {
- $id_member = $integration_id;
- $already_verified = true;
- break;
- }
- }
- }
- else
- $id_member = 0;
- if (empty($id_member) && isset($_COOKIE[$cookiename]))
- {
- // Fix a security hole in PHP 4.3.9 and below...
- if (preg_match('~^a:[34]:\{i:0;(i:\d{1,6}|s:[1-8]:"\d{1,8}");i:1;s:(0|40):"([a-fA-F0-9]{40})?";i:2;[id]:\d{1,14};(i:3;i:\d;)?\}$~i', $_COOKIE[$cookiename]) == 1)
- {
- list ($id_member, $password) = @unserialize($_COOKIE[$cookiename]);
- $id_member = !empty($id_member) && strlen($password) > 0 ? (int) $id_member : 0;
- }
- else
- $id_member = 0;
- }
- elseif (empty($id_member) && isset($_SESSION['login_' . $cookiename]) && ($_SESSION['USER_AGENT'] == $_SERVER['HTTP_USER_AGENT'] || !empty($modSettings['disableCheckUA'])))
- {
- // !!! Perhaps we can do some more checking on this, such as on the first octet of the IP?
- list ($id_member, $password, $login_span) = @unserialize($_SESSION['login_' . $cookiename]);
- $id_member = !empty($id_member) && strlen($password) == 40 && $login_span > time() ? (int) $id_member : 0;
- }
- // Only load this stuff if the user isn't a guest.
- if ($id_member != 0)
- {
- // Is the member data cached?
- if (empty($modSettings['cache_enable']) || $modSettings['cache_enable'] < 2 || ($user_settings = cache_get_data('user_settings-' . $id_member, 60)) == null)
- {
- $request = $smcFunc['db_query']('', '
- SELECT mem.*, IFNULL(a.id_attach, 0) AS id_attach, a.filename, a.attachment_type
- FROM {db_prefix}members AS mem
- LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = {int:id_member})
- WHERE mem.id_member = {int:id_member}
- LIMIT 1',
- array(
- 'id_member' => $id_member,
- )
- );
- $user_settings = $smcFunc['db_fetch_assoc']($request);
- $smcFunc['db_free_result']($request);
- if (!empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 2)
- cache_put_data('user_settings-' . $id_member, $user_settings, 60);
- }
- // Did we find 'im? If not, junk it.
- if (!empty($user_settings))
- {
- // As much as the password should be right, we can assume the integration set things up.
- if (!empty($already_verified) && $already_verified === true)
- $check = true;
- // SHA-1 passwords should be 40 characters long.
- elseif (strlen($password) == 40)
- $check = sha1($user_settings['passwd'] . $user_settings['password_salt']) == $password;
- else
- $check = false;
- // Wrong password or not activated - either way, you're going nowhere.
- $id_member = $check && ($user_settings['is_activated'] == 1 || $user_settings['is_activated'] == 11) ? $user_settings['id_member'] : 0;
- }
- else
- $id_member = 0;
- // If we no longer have the member maybe they're being all hackey, stop brute force!
- if (!$id_member)
- {
- require_once($sourcedir . '/LogInOut.php');
- validatePasswordFlood(!empty($user_settings['id_member']) ? $user_settings['id_member'] : $id_member, !empty($user_settings['passwd_flood']) ? $user_settings['passwd_flood'] : false, $id_member != 0);
- }
- }
- // Found 'im, let's set up the variables.
- if ($id_member != 0)
- {
- // Let's not update the last visit time in these cases...
- // 1. SSI doesn't count as visiting the forum.
- // 2. RSS feeds and XMLHTTP requests don't count either.
- // 3. If it was set within this session, no need to set it again.
- // 4. New session, yet updated < five hours ago? Maybe cache can help.
- if (SMF != 'SSI' && !isset($_REQUEST['xml']) && (!isset($_REQUEST['action']) || $_REQUEST['action'] != '.xml') && empty($_SESSION['id_msg_last_visit']) && (empty($modSettings['cache_enable']) || ($_SESSION['id_msg_last_visit'] = cache_get_data('user_last_visit-' . $id_member, 5 * 3600)) === null))
- {
- // Do a quick query to make sure this isn't a mistake.
- $result = $smcFunc['db_query']('', '
- SELECT poster_time
- FROM {db_prefix}messages
- WHERE id_msg = {int:id_msg}
- LIMIT 1',
- array(
- 'id_msg' => $user_settings['id_msg_last_visit'],
- )
- );
- list ($visitTime) = $smcFunc['db_fetch_row']($result);
- $smcFunc['db_free_result']($result);
- $_SESSION['id_msg_last_visit'] = $user_settings['id_msg_last_visit'];
- // If it was *at least* five hours ago...
- if ($visitTime < time() - 5 * 3600)
- {
- updateMemberData($id_member, array('id_msg_last_visit' => (int) $modSettings['maxMsgID'], 'last_login' => time(), 'member_ip' => $_SERVER['REMOTE_ADDR'], 'member_ip2' => $_SERVER['BAN_CHECK_IP']));
- $user_settings['last_login'] = time();
- if (!empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 2)
- cache_put_data('user_settings-' . $id_member, $user_settings, 60);
- if (!empty($modSettings['cache_enable']))
- cache_put_data('user_last_visit-' . $id_member, $_SESSION['id_msg_last_visit'], 5 * 3600);
- }
- }
- elseif (empty($_SESSION['id_msg_last_visit']))
- $_SESSION['id_msg_last_visit'] = $user_settings['id_msg_last_visit'];
- $username = $user_settings['member_name'];
- if (empty($user_settings['additional_groups']))
- $user_info = array(
- 'groups' => array($user_settings['id_group'], $user_settings['id_post_group'])
- );
- else
- $user_info = array(
- 'groups' => array_merge(
- array($user_settings['id_group'], $user_settings['id_post_group']),
- explode(',', $user_settings['additional_groups'])
- )
- );
- // Because history has proven that it is possible for groups to go bad - clean up in case.
- foreach ($user_info['groups'] as $k => $v)
- $user_info['groups'][$k] = (int) $v;
- // This is a logged in user, so definitely not a spider.
- $user_info['possibly_robot'] = false;
- }
- // If the user is a guest, initialize all the critical user settings.
- else
- {
- // This is what a guest's variables should be.
- $username = '';
- $user_info = array('groups' => array(-1));
- $user_settings = array();
- if (isset($_COOKIE[$cookiename]))
- $_COOKIE[$cookiename] = '';
- // Do we perhaps think this is a search robot? Check every five minutes just in case...
- if ((!empty($modSettings['spider_mode']) || !empty($modSettings['spider_group'])) && (!isset($_SESSION['robot_check']) || $_SESSION['robot_check'] < time() - 300))
- {
- require_once($sourcedir . '/ManageSearchEngines.php');
- $user_info['possibly_robot'] = SpiderCheck();
- }
- elseif (!empty($modSettings['spider_mode']))
- $user_info['possibly_robot'] = isset($_SESSION['id_robot']) ? $_SESSION['id_robot'] : 0;
- // If we haven't turned on proper spider hunts then have a guess!
- else
- {
- $ci_user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);
- $user_info['possibly_robot'] = (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') === false && strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') === false) || strpos($ci_user_agent, 'googlebot') !== false || strpos($ci_user_agent, 'slurp') !== false || strpos($ci_user_agent, 'crawl') !== false;
- }
- }
- // Set up the $user_info array.
- $user_info += array(
- 'id' => $id_member,
- 'username' => $username,
- 'name' => isset($user_settings['real_name']) ? $user_settings['real_name'] : '',
- 'email' => isset($user_settings['email_address']) ? $user_settings['email_address'] : '',
- 'passwd' => isset($user_settings['passwd']) ? $user_settings['passwd'] : '',
- 'language' => empty($user_settings['lngfile']) || empty($modSettings['userLanguage']) ? $language : $user_settings['lngfile'],
- 'is_guest' => $id_member == 0,
- 'is_admin' => in_array(1, $user_info['groups']),
- 'theme' => empty($user_settings['id_theme']) ? 0 : $user_settings['id_theme'],
- 'last_login' => empty($user_settings['last_login']) ? 0 : $user_settings['last_login'],
- 'ip' => $_SERVER['REMOTE_ADDR'],
- 'ip2' => $_SERVER['BAN_CHECK_IP'],
- 'posts' => empty($user_settings['posts']) ? 0 : $user_settings['posts'],
- 'time_format' => empty($user_settings['time_format']) ? $modSettings['time_format'] : $user_settings['time_format'],
- 'time_offset' => empty($user_settings['time_offset']) ? 0 : $user_settings['time_offset'],
- 'avatar' => array(
- 'url' => isset($user_settings['avatar']) ? $user_settings['avatar'] : '',
- 'filename' => empty($user_settings['filename']) ? '' : $user_settings['filename'],
- 'custom_dir' => !empty($user_settings['attachment_type']) && $user_settings['attachment_type'] == 1,
- 'id_attach' => isset($user_settings['id_attach']) ? $user_settings['id_attach'] : 0
- ),
- 'smiley_set' => isset($user_settings['smiley_set']) ? $user_settings['smiley_set'] : '',
- 'messages' => empty($user_settings['instant_messages']) ? 0 : $user_settings['instant_messages'],
- 'unread_messages' => empty($user_settings['unread_messages']) ? 0 : $user_settings['unread_messages'],
- 'total_time_logged_in' => empty($user_settings['total_time_logged_in']) ? 0 : $user_settings['total_time_logged_in'],
- 'buddies' => !empty($modSettings['enable_buddylist']) && !empty($user_settings['buddy_list']) ? explode(',', $user_settings['buddy_list']) : array(),
- 'ignoreboards' => !empty($user_settings['ignore_boards']) && !empty($modSettings['allow_ignore_boards']) ? explode(',', $user_settings['ignore_boards']) : array(),
- 'ignoreusers' => !empty($user_settings['pm_ignore_list']) ? explode(',', $user_settings['pm_ignore_list']) : array(),
- 'warning' => isset($user_settings['warning']) ? $user_settings['warning'] : 0,
- 'permissions' => array(),
- );
- $user_info['groups'] = array_unique($user_info['groups']);
- // Make sure that the last item in the ignore boards array is valid. If the list was too long it could have an ending comma that could cause problems.
- if (!empty($user_info['ignoreboards']) && empty($user_info['ignoreboards'][$tmp = count($user_info['ignoreboards']) - 1]))
- unset($user_info['ignoreboards'][$tmp]);
- // Do we have any languages to validate this?
- if (!empty($modSettings['userLanguage']) && (!empty($_GET['language']) || !empty($_SESSION['language'])))
- $languages = getLanguages();
- // Allow the user to change their language if its valid.
- if (!empty($modSettings['userLanguage']) && !empty($_GET['language']) && isset($languages[strtr($_GET['language'], './\\:', '____')]))
- {
- $user_info['language'] = strtr($_GET['language'], './\\:', '____');
- $_SESSION['language'] = $user_info['language'];
- }
- elseif (!empty($modSettings['userLanguage']) && !empty($_SESSION['language']) && isset($languages[strtr($_SESSION['language'], './\\:', '____')]))
- $user_info['language'] = strtr($_SESSION['language'], './\\:', '____');
- // Just build this here, it makes it easier to change/use - administrators can see all boards.
- if ($user_info['is_admin'])
- $user_info['query_see_board'] = '1=1';
- // Otherwise just the groups in $user_info['groups'].
- else
- $user_info['query_see_board'] = '(FIND_IN_SET(' . implode(', b.member_groups) != 0 OR FIND_IN_SET(', $user_info['groups']) . ', b.member_groups) != 0' . (isset($user_info['mod_cache']) ? ' OR ' . $user_info['mod_cache']['mq'] : '') . ')';
- // Build the list of boards they WANT to see.
- // This will take the place of query_see_boards in certain spots, so it better include the boards they can see also
- // If they aren't ignoring any boards then they want to see all the boards they can see
- if (empty($user_info['ignoreboards']))
- $user_info['query_wanna_see_board'] = $user_info['query_see_board'];
- // Ok I guess they don't want to see all the boards
- else
- $user_info['query_wanna_see_board'] = '(' . $user_info['query_see_board'] . ' AND b.id_board NOT IN (' . implode(',', $user_info['ignoreboards']) . '))';
- }
- // Check for moderators and see if they have access to the board.
- function loadBoard()
- {
- global $txt, $scripturl, $context, $modSettings;
- global $board_info, $board, $topic, $user_info, $smcFunc;
- // Assume they are not a moderator.
- $user_info['is_mod'] = false;
- $context['user']['is_mod'] = &$user_info['is_mod'];
- // Start the linktree off empty..
- $context['linktree'] = array();
- // Have they by chance specified a message id but nothing else?
- if (empty($_REQUEST['action']) && empty($topic) && empty($board) && !empty($_REQUEST['msg']))
- {
- // Make sure the message id is really an int.
- $_REQUEST['msg'] = (int) $_REQUEST['msg'];
- // Looking through the message table can be slow, so try using the cache first.
- if (($topic = cache_get_data('msg_topic-' . $_REQUEST['msg'], 120)) === NULL)
- {
- $request = $smcFunc['db_query']('', '
- SELECT id_topic
- FROM {db_prefix}messages
- WHERE id_msg = {int:id_msg}
- LIMIT 1',
- array(
- 'id_msg' => $_REQUEST['msg'],
- )
- );
- // So did it find anything?
- if ($smcFunc['db_num_rows']($request))
- {
- list ($topic) = $smcFunc['db_fetch_row']($request);
- $smcFunc['db_free_result']($request);
- // Save save save.
- cache_put_data('msg_topic-' . $_REQUEST['msg'], $topic, 120);
- }
- }
- // Remember redirection is the key to avoiding fallout from your bosses.
- if (!empty($topic))
- redirectexit('topic=' . $topic . '.msg' . $_REQUEST['msg'] . '#msg' . $_REQUEST['msg']);
- else
- {
- loadPermissions();
- loadTheme();
- fatal_lang_error('topic_gone', false);
- }
- }
- // Load this board only if it is specified.
- if (empty($board) && empty($topic))
- {
- $board_info = array('moderators' => array());
- return;
- }
- if (!empty($modSettings['cache_enable']) && (empty($topic) || $modSettings['cache_enable'] >= 3))
- {
- // !!! SLOW?
- if (!empty($topic))
- $temp = cache_get_data('topic_board-' . $topic, 120);
- else
- $temp = cache_get_data('board-' . $board, 120);
- if (!empty($temp))
- {
- $board_info = $temp;
- $board = $board_info['id'];
- }
- }
- if (empty($temp))
- {
- $request = $smcFunc['db_query']('', '
- SELECT
- c.id_cat, b.name AS bname, b.description, b.num_topics, b.member_groups,
- b.id_parent, c.name AS cname, IFNULL(mem.id_member, 0) AS id_moderator,
- mem.real_name' . (!empty($topic) ? ', b.id_board' : '') . ', b.child_level,
- b.id_theme, b.override_theme, b.count_posts, b.id_profile, b.redirect,
- b.unapproved_topics, b.unapproved_posts' . (!empty($topic) ? ', t.approved, t.id_member_started' : '') . '
- FROM {db_prefix}boards AS b' . (!empty($topic) ? '
- INNER JOIN {db_prefix}topics AS t ON (t.id_topic = {int:current_topic})' : '') . '
- LEFT JOIN {db_prefix}categories AS c ON (c.id_cat = b.id_cat)
- LEFT JOIN {db_prefix}moderators AS mods ON (mods.id_board = {raw:board_link})
- LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = mods.id_member)
- WHERE b.id_board = {raw:board_link}',
- array(
- 'current_topic' => $topic,
- 'board_link' => empty($topic) ? $smcFunc['db_quote']('{int:current_board}', array('current_board' => $board)) : 't.id_board',
- )
- );
- // If there aren't any, skip.
- if ($smcFunc['db_num_rows']($request) > 0)
- {
- $row = $smcFunc['db_fetch_assoc']($request);
- // Set the current board.
- if (!empty($row['id_board']))
- $board = $row['id_board'];
- // Basic operating information. (globals... :/)
- $board_info = array(
- 'id' => $board,
- 'moderators' => array(),
- 'cat' => array(
- 'id' => $row['id_cat'],
- 'name' => $row['cname']
- ),
- 'name' => $row['bname'],
- 'description' => $row['description'],
- 'num_topics' => $row['num_topics'],
- 'unapproved_topics' => $row['unapproved_topics'],
- 'unapproved_posts' => $row['unapproved_posts'],
- 'unapproved_user_topics' => 0,
- 'parent_boards' => getBoardParents($row['id_parent']),
- 'parent' => $row['id_parent'],
- 'child_level' => $row['child_level'],
- 'theme' => $row['id_theme'],
- 'override_theme' => !empty($row['override_theme']),
- 'profile' => $row['id_profile'],
- 'redirect' => $row['redirect'],
- 'posts_count' => empty($row['count_posts']),
- 'cur_topic_approved' => empty($topic) || $row['approved'],
- 'cur_topic_starter' => empty($topic) ? 0 : $row['id_member_started'],
- );
- // Load the membergroups allowed, and check permissions.
- $board_info['groups'] = $row['member_groups'] == '' ? array() : explode(',', $row['member_groups']);
- do
- {
- if (!empty($row['id_moderator']))
- $board_info['moderators'][$row['id_moderator']] = array(
- 'id' => $row['id_moderator'],
- 'name' => $row['real_name'],
- 'href' => $scripturl . '?action=profile;u=' . $row['id_moderator'],
- 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $row['id_moderator'] . '">' . $row['real_name'] . '</a>'
- );
- }
- while ($row = $smcFunc['db_fetch_assoc']($request));
- // If the board only contains unapproved posts and the user isn't an approver then they can't see any topics.
- // If that is the case do an additional check to see if they have any topics waiting to be approved.
- if ($board_info['num_topics'] == 0 && $modSettings['postmod_active'] && !allowedTo('approve_posts'))
- {
- $smcFunc['db_free_result']($request); // Free the previous result
- $request = $smcFunc['db_query']('', '
- SELECT COUNT(id_topic)
- FROM {db_prefix}topics
- WHERE id_member_started={int:id_member}
- AND approved = {int:unapproved}
- AND id_board = {int:board}',
- array(
- 'id_member' => $user_info['id'],
- 'unapproved' => 0,
- 'board' => $board,
- )
- );
- list ($board_info['unapproved_user_topics']) = $smcFunc['db_fetch_row']($request);
- }
- if (!empty($modSettings['cache_enable']) && (empty($topic) || $modSettings['cache_enable'] >= 3))
- {
- // !!! SLOW?
- if (!empty($topic))
- cache_put_data('topic_board-' . $topic, $board_info, 120);
- cache_put_data('board-' . $board, $board_info, 120);
- }
- }
- else
- {
- // Otherwise the topic is invalid, there are no moderators, etc.
- $board_info = array(
- 'moderators' => array(),
- 'error' => 'exist'
- );
- $topic = null;
- $board = 0;
- }
- $smcFunc['db_free_result']($request);
- }
- if (!empty($topic))
- $_GET['board'] = (int) $board;
- if (!empty($board))
- {
- // Now check if the user is a moderator.
- $user_info['is_mod'] = isset($board_info['moderators'][$user_info['id']]);
- if (count(array_intersect($user_info['groups'], $board_info['groups'])) == 0 && !$user_info['is_admin'])
- $board_info['error'] = 'access';
- // Build up the linktree.
- $context['linktree'] = array_merge(
- $context['linktree'],
- array(array(
- 'url' => $scripturl . '#c' . $board_info['cat']['id'],
- 'name' => $board_info['cat']['name']
- )),
- array_reverse($board_info['parent_boards']),
- array(array(
- 'url' => $scripturl . '?board=' . $board . '.0',
- 'name' => $board_info['name']
- ))
- );
- }
- // Set the template contextual information.
- $context['user']['is_mod'] = &$user_info['is_mod'];
- $context['current_topic'] = $topic;
- $context['current_board'] = $board;
- // Hacker... you can't see this topic, I'll tell you that. (but moderators can!)
- if (!empty($board_info['error']) && ($board_info['error'] != 'access' || !$user_info['is_mod']))
- {
- // The permissions and theme need loading, just to make sure everything goes smoothly.
- loadPermissions();
- loadTheme();
- $_GET['board'] = '';
- $_GET['topic'] = '';
- // The linktree should not give the game away mate!
- $context['linktree'] = array(
- array(
- 'url' => $scripturl,
- 'name' => $context['forum_name_html_safe']
- )
- );
- // If it's a prefetching agent or we're requesting an attachment.
- if ((isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch') || (!empty($_REQUEST['action']) && $_REQUEST['action'] === 'dlattach'))
- {
- ob_end_clean();
- header('HTTP/1.1 403 Forbidden');
- die;
- }
- elseif ($user_info['is_guest'])
- {
- loadLanguage('Errors');
- is_not_guest($txt['topic_gone']);
- }
- else
- fatal_lang_error('topic_gone', false);
- }
- if ($user_info['is_mod'])
- $user_info['groups'][] = 3;
- }
- // Load this user's permissions.
- function loadPermissions()
- {
- global $user_info, $board, $board_info, $modSettings, $smcFunc, $sourcedir;
- if ($user_info['is_admin'])
- {
- banPermissions();
- return;
- }
- if (!empty($modSettings['cache_enable']))
- {
- $cache_groups = $user_info['groups'];
- asort($cache_groups);
- $cache_groups = implode(',', $cache_groups);
- // If it's a spider then cache it different.
- if ($user_info['possibly_robot'])
- $cache_groups .= '-spider';
- if ($modSettings['cache_enable'] >= 2 && !empty($board) && ($temp = cache_get_data('permissions:' . $cache_groups . ':' . $board, 240)) != null && time() - 240 > $modSettings['settings_updated'])
- {
- list ($user_info['permissions']) = $temp;
- banPermissions();
- return;
- }
- elseif (($temp = cache_get_data('permissions:' . $cache_groups, 240)) != null && time() - 240 > $modSettings['settings_updated'])
- list ($user_info['permissions'], $removals) = $temp;
- }
- // If it is detected as a robot, and we are restricting permissions as a special group - then implement this.
- $spider_restrict = $user_info['possibly_robot'] && !empty($modSettings['spider_group']) ? ' OR (id_group = {int:spider_group} AND add_deny = 0)' : '';
- if (empty($user_info['permissions']))
- {
- // Get the general permissions.
- $request = $smcFunc['db_query']('', '
- SELECT permission, add_deny
- FROM {db_prefix}permissions
- WHERE id_group IN ({array_int:member_groups})
- ' . $spider_restrict,
- array(
- 'member_groups' => $user_info['groups'],
- 'spider_group' => !empty($modSettings['spider_group']) ? $modSettings['spider_group'] : 0,
- )
- );
- $removals = array();
- while ($row = $smcFunc['db_fetch_assoc']($request))
- {
- if (empty($row['add_deny']))
- $removals[] = $row['permission'];
- else
- $user_info['permissions'][] = $row['permission'];
- }
- $smcFunc['db_free_result']($request);
- if (isset($cache_groups))
- cache_put_data('permissions:' . $cache_groups, array($user_info['permissions'], $removals), 240);
- }
- // Get the board permissions.
- if (!empty($board))
- {
- // Make sure the board (if any) has been loaded by loadBoard().
- if (!isset($board_info['profile']))
- fatal_lang_error('no_board');
- $request = $smcFunc['db_query']('', '
- SELECT permission, add_deny
- FROM {db_prefix}board_permissions
- WHERE (id_group IN ({array_int:member_groups})
- ' . $spider_restrict . ')
- AND id_profile = {int:id_profile}',
- array(
- 'member_groups' => $user_info['groups'],
- 'id_profile' => $board_info['profile'],
- 'spider_group' => !empty($modSettings['spider_group']) ? $modSettings['spider_group'] : 0,
- )
- );
- while ($row = $smcFunc['db_fetch_assoc']($request))
- {
- if (empty($row['add_deny']))
- $removals[] = $row['permission'];
- else
- $user_info['permissions'][] = $row['permission'];
- }
- $smcFunc['db_free_result']($request);
- }
- // Remove all the permissions they shouldn't have ;).
- if (!empty($modSettings['permission_enable_deny']))
- $user_info['permissions'] = array_diff($user_info['permissions'], $removals);
- if (isset($cache_groups) && !empty($board) && $modSettings['cache_enable'] >= 2)
- cache_put_data('permissions:' . $cache_groups . ':' . $board, array($user_info['permissions'], null), 240);
- // Banned? Watch, don't touch..
- banPermissions();
- // Load the mod cache so we can know what additional boards they should see, but no sense in doing it for guests
- if (!$user_info['is_guest'])
- {
- if (!isset($_SESSION['mc']) || $_SESSION['mc']['time'] <= $modSettings['settings_updated'])
- {
- require_once($sourcedir . '/Subs-Auth.php');
- rebuildModCache();
- }
- else
- $user_info['mod_cache'] = $_SESSION['mc'];
- }
- }
- // Loads an array of users' data by ID or member_name.
- function loadMemberData($users, $is_name = false, $set = 'normal')
- {
- global $user_profile, $modSettings, $board_info, $smcFunc;
- // Can't just look for no users :P.
- if (empty($users))
- return false;
- // Make sure it's an array.
- $users = !is_array($users) ? array($users) : array_unique($users);
- $loaded_ids = array();
- if (!$is_name && !empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 3)
- {
- $users = array_values($users);
- for ($i = 0, $n = count($users); $i < $n; $i++)
- {
- $data = cache_get_data('member_data-' . $set . '-' . $users[$i], 240);
- if ($data == null)
- continue;
- $loaded_ids[] = $data['id_member'];
- $user_profile[$data['id_member']] = $data;
- unset($users[$i]);
- }
- }
- if ($set == 'normal')
- {
- $select_columns = '
- IFNULL(lo.log_time, 0) AS is_online, IFNULL(a.id_attach, 0) AS id_attach, a.filename, a.attachment_type,
- mem.signature, mem.personal_text, mem.location, mem.gender, mem.avatar, mem.id_member, mem.member_name,
- mem.real_name, mem.email_address, mem.hide_email, mem.date_registered, mem.website_title, mem.website_url,
- mem.birthdate, mem.member_ip, mem.member_ip2, mem.icq, mem.aim, mem.yim, mem.msn, mem.posts, mem.last_login,
- mem.karma_good, mem.id_post_group, mem.karma_bad, mem.lngfile, mem.id_group, mem.time_offset, mem.show_online,
- mem.buddy_list, mg.online_color AS member_group_color, IFNULL(mg.group_name, {string:blank_string}) AS member_group,
- pg.online_color AS post_group_color, IFNULL(pg.group_name, {string:blank_string}) AS post_group, mem.is_activated, mem.warning,
- CASE WHEN mem.id_group = 0 OR mg.stars = {string:blank_string} THEN pg.stars ELSE mg.stars END AS stars' . (!empty($modSettings['titlesEnable']) ? ',
- mem.usertitle' : '');
- $select_tables = '
- LEFT JOIN {db_prefix}log_online AS lo ON (lo.id_member = mem.id_member)
- LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = mem.id_member)
- LEFT JOIN {db_prefix}membergroups AS pg ON (pg.id_group = mem.id_post_group)
- LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = mem.id_group)';
- }
- elseif ($set == 'profile')
- {
- $select_columns = '
- IFNULL(lo.log_time, 0) AS is_online, IFNULL(a.id_attach, 0) AS id_attach, a.filename, a.attachment_type,
- mem.signature, mem.personal_text, mem.location, mem.gender, mem.avatar, mem.id_member, mem.member_name,
- mem.real_name, mem.email_address, mem.hide_email, mem.date_registered, mem.website_title, mem.website_url,
- mem.openid_uri, mem.birthdate, mem.icq, mem.aim, mem.yim, mem.msn, mem.posts, mem.last_login, mem.karma_good,
- mem.karma_bad, mem.member_ip, mem.member_ip2, mem.lngfile, mem.id_group, mem.id_theme, mem.buddy_list,
- mem.pm_ignore_list, mem.pm_email_notify, mem.pm_receive_from, mem.time_offset' . (!empty($modSettings['titlesEnable']) ? ', mem.usertitle' : '') . ',
- mem.time_format, mem.secret_question, mem.is_activated, mem.additional_groups, mem.smiley_set, mem.show_online,
- mem.total_time_logged_in, mem.id_post_group, mem.notify_announcements, mem.notify_regularity, mem.notify_send_body,
- mem.notify_types, lo.url, mg.online_color AS member_group_color, IFNULL(mg.group_name, {string:blank_string}) AS member_group,
- pg.online_color AS post_group_color, IFNULL(pg.group_name, {string:blank_string}) AS post_group, mem.ignore_boards, mem.warning,
- CASE WHEN mem.id_group = 0 OR mg.stars = {string:blank_string} THEN pg.stars ELSE mg.stars END AS stars, mem.password_salt, mem.pm_prefs';
- $select_tables = '
- LEFT JOIN {db_prefix}log_online AS lo ON (lo.id_member = mem.id_member)
- LEFT JOIN {db_prefix}attachments AS a ON (a.id_member = mem.id_member)
- LEFT JOIN {db_prefix}membergroups AS pg ON (pg.id_group = mem.id_post_group)
- LEFT JOIN {db_prefix}membergroups AS mg ON (mg.id_group = mem.id_group)';
- }
- elseif ($set == 'minimal')
- {
- $select_columns = '
- mem.id_member, mem.member_name, mem.real_name, mem.email_address, mem.hide_email, mem.date_registered,
- mem.posts, mem.last_login, mem.member_ip, mem.member_ip2, mem.lngfile, mem.id_group';
- $select_tables = '';
- }
- else
- trigger_error('loadMemberData(): Invalid member data set \'' . $set . '\'', E_USER_WARNING);
- if (!empty($users))
- {
- // Load the member's data.
- $request = $smcFunc['db_query']('', '
- SELECT' . $select_columns . '
- FROM {db_prefix}members AS mem' . $select_tables . '
- WHERE mem.' . ($is_name ? 'member_name' : 'id_member') . (count($users) == 1 ? ' = {' . ($is_name ? 'string' : 'int') . ':users}' : ' IN ({' . ($is_name ? 'array_string' : 'array_int') . ':users})'),
- array(
- 'blank_string' => '',
- 'users' => count($users) == 1 ? current($users) : $users,
- )
- );
- $new_loaded_ids = array();
- while ($row = $smcFunc['db_fetch_assoc']($request))
- {
- $new_loaded_ids[] = $row['id_member'];
- $loaded_ids[] = $row['id_member'];
- $row['options'] = array();
- $user_profile[$row['id_member']] = $row;
- }
- $smcFunc['db_free_result']($request);
- }
- if (!empty($new_loaded_ids) && $set !== 'minimal')
- {
- $request = $smcFunc['db_query']('', '
- SELECT *
- FROM {db_prefix}themes
- WHERE id_member' . (count($new_loaded_ids) == 1 ? ' = {int:loaded_ids}' : ' IN ({array_int:loaded_ids})'),
- array(
- 'loaded_ids' => count($new_loaded_ids) == 1 ? $new_loaded_ids[0] : $new_loaded_ids,
- )
- );
- while ($row = $smcFunc['db_fetch_assoc']($request))
- $user_profile[$row['id_member']]['options'][$row['variable']] = $row['value'];
- $smcFunc['db_free_result']($request);
- }
- if (!empty($new_loaded_ids) && !empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 3)
- {
- for ($i = 0, $n = count($new_loaded_ids); $i < $n; $i++)
- cache_put_data('member_data-' . $set . '-' . $new_loaded_ids[$i], $user_profile[$new_loaded_ids[$i]], 240);
- }
- // Are we loading any moderators? If so, fix their group data...
- if (!empty($loaded_ids) && !empty($board_info['moderators']) && $set === 'normal' && count($temp_mods = array_intersect($loaded_ids, array_keys($board_info['moderators']))) !== 0)
- {
- if (($row = cache_get_data('moderator_group_info', 480)) == null)
- {
- $request = $smcFunc['db_query']('', '
- SELECT group_name AS member_group, online_color AS member_group_color, stars
- FROM {db_prefix}membergroups
- WHERE id_group = {int:moderator_group}
- LIMIT 1',
- array(
- 'moderator_group' => 3,
- )
- );
- $row = $smcFunc['db_fetch_assoc']($request);
- $smcFunc['db_free_result']($request);
- cache_put_data('moderator_group_info', $row, 480);
- }
- foreach ($temp_mods as $id)
- {
- // By popular demand, don't show admins or global moderators as moderators.
- if ($user_profile[$id]['id_group'] != 1 && $user_profile[$id]['id_group'] != 2)
- $user_profile[$id]['member_group'] = $row['member_group'];
- // If the Moderator group has no color or stars, but their group does... don't overwrite.
- if (!empty($row['stars']))
- $user_profile[$id]['stars'] = $row['stars'];
- if (!empty($row['member_group_color']))
- $user_profile[$id]['member_group_color'] = $row['member_group_color'];
- }
- }
- return empty($loaded_ids) ? false : $loaded_ids;
- }
- // Loads the user's basic values... meant for template/theme usage.
- function loadMemberContext($user, $display_custom_fields = false)
- {
- global $memberContext, $user_profile, $txt, $scripturl, $user_info;
- global $context, $modSettings, $board_info, $settings;
- global $smcFunc;
- static $dataLoaded = array();
- // If this person's data is already loaded, skip it.
- if (isset($dataLoaded[$user]))
- return true;
- // We can't load guests or members not loaded by loadMemberData()!
- if ($user == 0)
- return false;
- if (!isset($user_profile[$user]))
- {
- trigger_error('loadMemberContext(): member id ' . $user . ' not previously loaded by loadMemberData()', E_USER_WARNING);
- return false;
- }
- // Well, it's loaded now anyhow.
- $dataLoaded[$user] = true;
- $profile = $user_profile[$user];
- // Censor everything.
- censorText($profile['signature']);
- censorText($profile['personal_text']);
- censorText($profile['location']);
- // Set things up to be used before hand.
- $gendertxt = $profile['gender'] == 2 ? $txt['female'] : ($profile['gender'] == 1 ? $txt['male'] : '');
- $profile['signature'] = str_replace(array("\n", "\r"), array('<br />', ''), $profile['signature']);
- $profile['signature'] = parse_bbc($profile['signature'], true, 'sig' . $profile['id_member']);
- $profile['is_online'] = (!empty($profile['show_online']) || allowedTo('moderate_forum')) && $profile['is_online'] > 0;
- $profile['stars'] = empty($profile['stars']) ? array('', '') : explode('#', $profile['stars']);
- // Setup the buddy status here (One whole in_array call saved :P)
- $profile['buddy'] = in_array($profile['id_member'], $user_info['buddies']);
- $buddy_list = !empty($profile['buddy_list']) ? explode(',', $profile['buddy_list']) : array();
- // If we're always html resizing, assume it's too large.
- if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize')
- {
- $avatar_width = !empty($modSettings['avatar_max_width_external']) ? ' width="' . $modSettings['avatar_max_width_external'] . '"' : '';
- $avatar_height = !empty($modSettings['avatar_max_height_external']) ? ' height="' . $modSettings['avatar_max_height_external'] . '"' : '';
- }
- else
- {
- $avatar_width = '';
- $avatar_height = '';
- }
- // What a monstrous array...
- $memberContext[$user] = array(
- 'username' => $profile['member_name'],
- 'name' => $profile['real_name'],
- 'id' => $profile['id_member'],
- 'is_buddy' => $profile['buddy'],
- 'is_reverse_buddy' => in_array($user_info['id'], $buddy_list),
- 'buddies' => $buddy_list,
- 'title' => !empty($modSettings['titlesEnable']) ? $profile['usertitle'] : '',
- 'href' => $scripturl . '?action=profile;u=' . $profile['id_member'],
- 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $profile['id_member'] . '" title="' . $txt['profile_of'] . ' ' . $profile['real_name'] . '">' . $profile['real_name'] . '</a>',
- 'email' => $profile['email_address'],
- 'show_email' => showEmailAddress(!empty($profile['hide_email']), $profile['id_member']),
- 'registered' => empty($profile['date_registered']) ? $txt['not_applicable'] : timeformat($profile['date_registered']),
- 'registered_timestamp' => empty($profile['date_registered']) ? 0 : forum_time(true, $profile['date_registered']),
- 'blurb' => $profile['personal_text'],
- 'gender' => array(
- 'name' => $gendertxt,
- 'image' => !empty($profile['gender']) ? '<img class="gender" src="' . $settings['images_url'] . '/' . ($profile['gender'] == 1 ? 'Male' : 'Female') . '.gif" alt="' . $gendertxt . '" />' : ''
- ),
- 'website' => array(
- 'title' => $profile['website_title'],
- 'url' => $profile['website_url'],
- ),
- 'birth_date' => empty($profile['birthdate']) || $profile['birthdate'] === '0001-01-01' ? '0000-00-00' : (substr($profile['birthdate'], 0, 4) === '0004' ? '0000' . substr($profile['birthdate'], 4) : $profile['birthdate']),
- 'signature' => $profile['signature'],
- 'location' => $profile['location'],
- 'icq' => $profile['icq'] != '' && (empty($modSettings['guest_hideContacts']) || !$user_info['is_guest']) ? array(
- 'name' => $profile['icq'],
- 'href' => 'http://www.icq.com/whitepages/about_me.php?uin=' . $profile['icq'],
- 'link' => '<a class="icq new_win" href="http://www.icq.com/whitepages/about_me.php?uin=' . $profile['icq'] . '" target="_blank" title="' . $txt['icq_title'] . ' - ' . $profile['icq'] . '"><img src="http://status.icq.com/online.gif?img=5&icq=' . $profile['icq'] . '" alt="' . $txt['icq_title'] . ' - ' . $profile['icq'] . '" width="18" height="18" /></a>',
- 'link_text' => '<a class="icq extern" href="http://www.icq.com/whitepages/about_me.php?uin=' . $profile['icq'] . '" title="' . $txt['icq_title'] . ' - ' . $profile['icq'] . '">' . $profile['icq'] . '</a>',
- ) : array('name' => '', 'add' => '', 'href' => '', 'link' => '', 'link_text' => ''),
- 'aim' => $profile['aim'] != '' && (empty($modSettings['guest_hideContacts']) || !$user_info['is_guest']) ? array(
- 'name' => $profile['aim'],
- 'href' => 'aim:goim?screenname=' . urlencode(strtr($profile['aim'], array(' ' => '%20'))) . '&message=' . $txt['a…
Large files files are truncated, but you can click here to view the full file