diff --git a/phpBB/includes/acm/acm_main.php b/phpBB/includes/acm/acm_main.php index b174dab92b..bdb8189bd7 100644 --- a/phpBB/includes/acm/acm_main.php +++ b/phpBB/includes/acm/acm_main.php @@ -273,9 +273,24 @@ class cache extends acm } else { - $sql = 'SELECT user_id, bot_agent, bot_ip - FROM ' . BOTS_TABLE . ' - WHERE bot_active = 1'; + switch (SQL_LAYER) + { + case 'mssql': + case 'mssql_odbc': + $sql = 'SELECT user_id, bot_agent, bot_ip + FROM ' . BOTS_TABLE . ' + WHERE bot_active = 1 + ORDER BY LEN(bot_agent) DESC'; + break; + + // LENGTH supported by MySQL, IBM DB2 and Oracle for sure... + default: + $sql = 'SELECT user_id, bot_agent, bot_ip + FROM ' . BOTS_TABLE . ' + WHERE bot_active = 1 + ORDER BY LENGTH(bot_agent) DESC'; + break; + } $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 340c61f39c..06584636f5 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -9,7 +9,11 @@ */ /** +* set_var +* * Set variable, used by {@link request_var the request_var function} +* +* @private */ function set_var(&$result, $var, $type, $multibyte = false) { @@ -159,184 +163,6 @@ function get_userdata($user) return ($row = $db->sql_fetchrow($result)) ? $row : false; } -/** -* Create forum rules for given forum -*/ -function generate_forum_rules(&$forum_data) -{ - if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link']) - { - return; - } - - global $template, $phpbb_root_path, $phpEx; - - if ($forum_data['forum_rules']) - { - include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); - $bbcode = new bbcode($forum_data['forum_rules_bbcode_bitfield']); - - $bbcode->bbcode_second_pass($forum_data['forum_rules'], $forum_data['forum_rules_bbcode_uid']); - - $forum_data['forum_rules'] = smiley_text($forum_data['forum_rules'], !($forum_data['forum_rules_flags'] & 2)); - $forum_data['forum_rules'] = str_replace("\n", '
', censor_text($forum_data['forum_rules'])); - unset($bbcode); - } - - $template->assign_vars(array( - 'S_FORUM_RULES' => true, - 'U_FORUM_RULES' => $forum_data['forum_rules_link'], - 'FORUM_RULES' => $forum_data['forum_rules']) - ); -} - -/** -* Create forum navigation links for given forum, create parent -* list if currently null, assign basic forum info to template -*/ -function generate_forum_nav(&$forum_data) -{ - global $db, $user, $template, $phpEx, $SID, $phpbb_root_path; - - // Get forum parents - $forum_parents = get_forum_parents($forum_data); - - // Build navigation links - foreach ($forum_parents as $parent_forum_id => $parent_data) - { - list($parent_name, $parent_type) = array_values($parent_data); - - $template->assign_block_vars('navlinks', array( - 'S_IS_CAT' => ($parent_type == FORUM_CAT) ? true : false, - 'S_IS_LINK' => ($parent_type == FORUM_LINK) ? true : false, - 'S_IS_POST' => ($parent_type == FORUM_POST) ? true : false, - 'FORUM_NAME' => $parent_name, - 'FORUM_ID' => $parent_forum_id, - 'U_VIEW_FORUM' => "{$phpbb_root_path}viewforum.$phpEx$SID&f=$parent_forum_id") - ); - } - - $template->assign_block_vars('navlinks', array( - 'S_IS_CAT' => ($forum_data['forum_type'] == FORUM_CAT) ? true : false, - 'S_IS_LINK' => ($forum_data['forum_type'] == FORUM_LINK) ? true : false, - 'S_IS_POST' => ($forum_data['forum_type'] == FORUM_POST) ? true : false, - 'FORUM_NAME' => $forum_data['forum_name'], - 'FORUM_ID' => $forum_data['forum_id'], - 'U_VIEW_FORUM' => "{$phpbb_root_path}viewforum.$phpEx$SID&f=" . $forum_data['forum_id']) - ); - - $template->assign_vars(array( - 'FORUM_ID' => $forum_data['forum_id'], - 'FORUM_NAME' => $forum_data['forum_name'], - 'FORUM_DESC' => strip_tags($forum_data['forum_desc'])) - ); - - return; -} - -/** -* Returns forum parents as an array. Get them from forum_data if available, or update the database otherwise -*/ -function get_forum_parents(&$forum_data) -{ - global $db; - - $forum_parents = array(); - - if ($forum_data['parent_id'] > 0) - { - if ($forum_data['forum_parents'] == '') - { - $sql = 'SELECT forum_id, forum_name, forum_type - FROM ' . FORUMS_TABLE . ' - WHERE left_id < ' . $forum_data['left_id'] . ' - AND right_id > ' . $forum_data['right_id'] . ' - ORDER BY left_id ASC'; - $result = $db->sql_query($sql); - - while ($row = $db->sql_fetchrow($result)) - { - $forum_parents[$row['forum_id']] = array($row['forum_name'], (int) $row['forum_type']); - } - $db->sql_freeresult($result); - - $forum_data['forum_parents'] = serialize($forum_parents); - - $sql = 'UPDATE ' . FORUMS_TABLE . " - SET forum_parents = '" . $db->sql_escape($forum_data['forum_parents']) . "' - WHERE parent_id = " . $forum_data['parent_id']; - $db->sql_query($sql); - } - else - { - $forum_parents = unserialize($forum_data['forum_parents']); - } - } - - return $forum_parents; -} - -/** -* Obtain list of moderators of each forum -*/ -function get_moderators(&$forum_moderators, $forum_id = false) -{ - global $config, $template, $db, $phpEx, $SID; - - // Have we disabled the display of moderators? If so, then return - // from whence we came ... - if (empty($config['load_moderators'])) - { - return; - } - - if (!empty($forum_id) && is_array($forum_id)) - { - $forum_sql = 'AND forum_id IN (' . implode(', ', $forum_id) . ')'; - } - else - { - $forum_sql = ($forum_id) ? 'AND forum_id = ' . $forum_id : ''; - } - - $sql = 'SELECT * - FROM ' . MODERATOR_TABLE . " - WHERE display_on_index = 1 - $forum_sql"; - $result = $db->sql_query($sql); - - while ($row = $db->sql_fetchrow($result)) - { - $forum_moderators[$row['forum_id']][] = (!empty($row['user_id'])) ? '' . $row['username'] . '' : '' . $row['groupname'] . ''; - } - $db->sql_freeresult($result); - - return; -} - -/** -* User authorisation levels output -*/ -function gen_forum_auth_level($mode, $forum_id) -{ - global $SID, $template, $auth, $user; - - $rules = array( - ($auth->acl_get('f_post', $forum_id)) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'], - ($auth->acl_get('f_reply', $forum_id)) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'], - ($auth->acl_gets('f_edit', 'm_edit', $forum_id)) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'], - ($auth->acl_gets('f_delete', 'm_delete', $forum_id)) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'], - ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach', $forum_id)) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT'] - ); - - foreach ($rules as $rule) - { - $template->assign_block_vars('rules', array('RULE' => $rule)); - } - - return; -} - /** * Generate sort selection fields */ @@ -931,233 +757,6 @@ function on_page($num_items, $per_page, $start) return sprintf($user->lang['PAGE_OF'], $on_page, max(ceil($num_items / $per_page), 1)); } -/** -* Obtain list of naughty words and build preg style replacement arrays for use by the -* calling script -*/ -function obtain_word_list(&$censors) -{ - global $db, $cache, $user; - - if (!$user->optionget('viewcensors') && $config['allow_nocensors']) - { - return; - } - - if ($cache->exists('word_censors')) - { - $censors = $cache->get('word_censors'); - } - else - { - $sql = 'SELECT word, replacement - FROM ' . WORDS_TABLE; - $result = $db->sql_query($sql); - - $censors = array(); - while ($row = $db->sql_fetchrow($result)) - { - $censors['match'][] = '#\b(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')\b#i'; - $censors['replace'][] = $row['replacement']; - } - $db->sql_freeresult($result); - - $cache->put('word_censors', $censors); - } - - return true; -} - -/** -* Obtain currently listed icons -*/ -function obtain_icons(&$icons) -{ - global $db, $cache; - - if ($cache->exists('icons')) - { - $icons = $cache->get('icons'); - } - else - { - // Topic icons - $sql = 'SELECT * - FROM ' . ICONS_TABLE . ' - ORDER BY icons_order'; - $result = $db->sql_query($sql); - - $icons = array(); - while ($row = $db->sql_fetchrow($result)) - { - $icons[$row['icons_id']]['img'] = $row['icons_url']; - $icons[$row['icons_id']]['width'] = (int) $row['icons_width']; - $icons[$row['icons_id']]['height'] = (int) $row['icons_height']; - $icons[$row['icons_id']]['display'] = (bool) $row['display_on_posting']; - } - $db->sql_freeresult($result); - - $cache->put('icons', $icons); - } - - return; -} - -/** -* Obtain ranks -*/ -function obtain_ranks(&$ranks) -{ - global $db, $cache; - - if ($cache->exists('ranks')) - { - $ranks = $cache->get('ranks'); - } - else - { - $sql = 'SELECT * - FROM ' . RANKS_TABLE . ' - ORDER BY rank_min DESC'; - $result = $db->sql_query($sql); - - $ranks = array(); - while ($row = $db->sql_fetchrow($result)) - { - if ($row['rank_special']) - { - $ranks['special'][$row['rank_id']] = array( - 'rank_title' => $row['rank_title'], - 'rank_image' => $row['rank_image'] - ); - } - else - { - $ranks['normal'][] = array( - 'rank_title' => $row['rank_title'], - 'rank_min' => $row['rank_min'], - 'rank_image' => $row['rank_image'] - ); - } - } - $db->sql_freeresult($result); - - $cache->put('ranks', $ranks); - } -} - -/** -* Obtain allowed extensions -*/ -function obtain_attach_extensions(&$extensions, $forum_id = false) -{ - global $db, $cache; - - if ($cache->exists('extensions')) - { - $extensions = $cache->get('extensions'); - } - else - { - // The rule is to only allow those extensions defined. ;) - $sql = 'SELECT e.extension, g.* - FROM ' . EXTENSIONS_TABLE . ' e, ' . EXTENSION_GROUPS_TABLE . ' g - WHERE e.group_id = g.group_id - AND g.allow_group = 1'; - $result = $db->sql_query($sql); - - $extensions = array(); - while ($row = $db->sql_fetchrow($result)) - { - $extension = strtolower(trim($row['extension'])); - - $extensions[$extension]['display_cat'] = (int) $row['cat_id']; - $extensions[$extension]['download_mode'] = (int) $row['download_mode']; - $extensions[$extension]['upload_icon'] = trim($row['upload_icon']); - $extensions[$extension]['max_filesize'] = (int) $row['max_filesize']; - - $allowed_forums = ($row['allowed_forums']) ? unserialize(trim($row['allowed_forums'])) : array(); - - if ($row['allow_in_pm']) - { - $allowed_forums = array_merge($allowed_forums, array(0)); - } - - // Store allowed extensions forum wise - $extensions['_allowed_'][$extension] = (!sizeof($allowed_forums)) ? 0 : $allowed_forums; - } - $db->sql_freeresult($result); - - $cache->put('extensions', $extensions); - } - - if ($forum_id !== false) - { - $return = array(); - - foreach ($extensions['_allowed_'] as $extension => $check) - { - $allowed = false; - - if (is_array($check)) - { - // Check for private messaging - if (sizeof($check) == 1 && $check[0] == 0) - { - $allowed = true; - continue; - } - - $allowed = (!in_array($forum_id, $check)) ? false : true; - } - else - { - $allowed = ($forum_id == 0) ? false : true; - } - - if ($allowed) - { - $return['_allowed_'][$extension] = 0; - $return[$extension] = $extensions[$extension]; - } - } - - $extensions = $return; - } - - return; -} - -/** -* Obtain active bots -*/ -function obtain_bots(&$bots) -{ - global $db, $cache; - - if ($cache->exists('bots')) - { - $bots = $cache->get('bots'); - } - else - { - $sql = 'SELECT user_id, bot_agent, bot_ip - FROM ' . BOTS_TABLE . ' - WHERE bot_active = 1'; - $result = $db->sql_query($sql); - - while ($row = $db->sql_fetchrow($result)) - { - $bots[] = $row; - } - $db->sql_freeresult($result); - - $cache->put('bots', $bots); - } - - return; -} - /** * Generate board url */ @@ -1502,7 +1101,7 @@ function bump_topic_allowed($forum_id, $topic_bumped, $last_post_time, $topic_po */ function censor_text($text) { - global $censors, $user; + global $censors, $user, $cache; if (!isset($censors)) { @@ -1511,7 +1110,7 @@ function censor_text($text) // TODO: For ANONYMOUS, this option should be enabled by default if ($user->optionget('viewcensors')) { - obtain_word_list($censors); + $cache->obtain_word_list($censors); } } @@ -1574,8 +1173,10 @@ function extension_allowed($forum_id, $extension, &$extensions) { if (!sizeof($extensions)) { + global $cache; + $extensions = array(); - obtain_attach_extensions($extensions); + $cache->obtain_attach_extensions($extensions); } if (!isset($extensions['_allowed_'][$extension])) @@ -1674,9 +1275,12 @@ function msg_handler($errno, $msg_text, $errfile, $errline) break; case E_USER_NOTICE: + + define('IN_ERROR_HANDLER', true); + if (empty($user->data)) { - $user->start(); + $user->session_begin(); } if (empty($user->lang)) { @@ -1685,7 +1289,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline) if (!defined('HEADER_INC')) { - if (defined('IN_ADMIN') && $user->data['session_admin']) + if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin']) { adm_page_header('', '', false); } @@ -1699,7 +1303,7 @@ function msg_handler($errno, $msg_text, $errfile, $errline) $msg_title = (!isset($msg_title)) ? $user->lang['INFORMATION'] : ((!empty($user->lang[$msg_title])) ? $user->lang[$msg_title] : $msg_title); $display_header = (!isset($display_header)) ? false : (bool) $display_header; - if (defined('IN_ADMIN') && $user->data['session_admin']) + if (defined('IN_ADMIN') && isset($user->data['session_admin']) && $user->data['session_admin']) { adm_page_message($msg_title, $msg_text, $display_header); adm_page_footer(); @@ -1907,8 +1511,8 @@ function page_header($page_title = '') $l_privmsgs_text = $l_privmsgs_text_unread = ''; $s_privmsg_new = false; - // Obtain number of new private messages if user is logged in - if ($user->data['is_registered']) + // Obtain number of new private messages if user is logged in, not if in trigger_error + if (!defined('IN_ERROR_HANDLER') && $user->data['is_registered']) { if ($user->data['user_new_privmsg']) { @@ -1967,7 +1571,7 @@ function page_header($page_title = '') 'L_INDEX' => $user->lang['FORUM_INDEX'], 'L_ONLINE_EXPLAIN' => $l_online_time, - 'U_PRIVATEMSGS' => "{$phpbb_root_path}ucp.$phpEx$SID&i=pm&mode=" . (($user->data['user_new_privmsg'] || $l_privmsgs_text_unread) ? 'unread' : 'view_messages'), + 'U_PRIVATEMSGS' => "{$phpbb_root_path}ucp.$phpEx$SID&i=pm&mode=" . (($user->data['user_new_privmsg'] || $l_privmsgs_text_unread) ? 'unread' : 'view'), 'U_RETURN_INBOX' => "{$phpbb_root_path}ucp.$phpEx$SID&i=pm&folder=inbox", 'U_JS_RETURN_INBOX' => "{$phpbb_root_path}ucp.$phpEx$SID&i=pm&folder=inbox", 'U_POPUP_PM' => "{$phpbb_root_path}ucp.$phpEx$SID&i=pm&mode=popup", diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index 156a47f7d9..9622af8b26 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -336,6 +336,123 @@ function display_forums($root_data = '', $display_moderators = TRUE) return $active_forum_ary; } +/** +* Create forum rules for given forum +*/ +function generate_forum_rules(&$forum_data) +{ + if (!$forum_data['forum_rules'] && !$forum_data['forum_rules_link']) + { + return; + } + + global $template, $phpbb_root_path, $phpEx; + + if ($forum_data['forum_rules']) + { + include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); + $bbcode = new bbcode($forum_data['forum_rules_bbcode_bitfield']); + + $bbcode->bbcode_second_pass($forum_data['forum_rules'], $forum_data['forum_rules_bbcode_uid']); + + $forum_data['forum_rules'] = smiley_text($forum_data['forum_rules'], !($forum_data['forum_rules_flags'] & 2)); + $forum_data['forum_rules'] = str_replace("\n", '
', censor_text($forum_data['forum_rules'])); + unset($bbcode); + } + + $template->assign_vars(array( + 'S_FORUM_RULES' => true, + 'U_FORUM_RULES' => $forum_data['forum_rules_link'], + 'FORUM_RULES' => $forum_data['forum_rules']) + ); +} + +/** +* Create forum navigation links for given forum, create parent +* list if currently null, assign basic forum info to template +*/ +function generate_forum_nav(&$forum_data) +{ + global $db, $user, $template, $phpEx, $SID, $phpbb_root_path; + + // Get forum parents + $forum_parents = get_forum_parents($forum_data); + + // Build navigation links + foreach ($forum_parents as $parent_forum_id => $parent_data) + { + list($parent_name, $parent_type) = array_values($parent_data); + + $template->assign_block_vars('navlinks', array( + 'S_IS_CAT' => ($parent_type == FORUM_CAT) ? true : false, + 'S_IS_LINK' => ($parent_type == FORUM_LINK) ? true : false, + 'S_IS_POST' => ($parent_type == FORUM_POST) ? true : false, + 'FORUM_NAME' => $parent_name, + 'FORUM_ID' => $parent_forum_id, + 'U_VIEW_FORUM' => "{$phpbb_root_path}viewforum.$phpEx$SID&f=$parent_forum_id") + ); + } + + $template->assign_block_vars('navlinks', array( + 'S_IS_CAT' => ($forum_data['forum_type'] == FORUM_CAT) ? true : false, + 'S_IS_LINK' => ($forum_data['forum_type'] == FORUM_LINK) ? true : false, + 'S_IS_POST' => ($forum_data['forum_type'] == FORUM_POST) ? true : false, + 'FORUM_NAME' => $forum_data['forum_name'], + 'FORUM_ID' => $forum_data['forum_id'], + 'U_VIEW_FORUM' => "{$phpbb_root_path}viewforum.$phpEx$SID&f=" . $forum_data['forum_id']) + ); + + $template->assign_vars(array( + 'FORUM_ID' => $forum_data['forum_id'], + 'FORUM_NAME' => $forum_data['forum_name'], + 'FORUM_DESC' => strip_tags($forum_data['forum_desc'])) + ); + + return; +} + +/** +* Returns forum parents as an array. Get them from forum_data if available, or update the database otherwise +*/ +function get_forum_parents(&$forum_data) +{ + global $db; + + $forum_parents = array(); + + if ($forum_data['parent_id'] > 0) + { + if ($forum_data['forum_parents'] == '') + { + $sql = 'SELECT forum_id, forum_name, forum_type + FROM ' . FORUMS_TABLE . ' + WHERE left_id < ' . $forum_data['left_id'] . ' + AND right_id > ' . $forum_data['right_id'] . ' + ORDER BY left_id ASC'; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $forum_parents[$row['forum_id']] = array($row['forum_name'], (int) $row['forum_type']); + } + $db->sql_freeresult($result); + + $forum_data['forum_parents'] = serialize($forum_parents); + + $sql = 'UPDATE ' . FORUMS_TABLE . " + SET forum_parents = '" . $db->sql_escape($forum_data['forum_parents']) . "' + WHERE parent_id = " . $forum_data['parent_id']; + $db->sql_query($sql); + } + else + { + $forum_parents = unserialize($forum_data['forum_parents']); + } + } + + return $forum_parents; +} + /** * Get topic author */ @@ -387,6 +504,67 @@ function topic_generate_pagination($replies, $url) return $pagination; } +/** +* Obtain list of moderators of each forum +*/ +function get_moderators(&$forum_moderators, $forum_id = false) +{ + global $config, $template, $db, $phpEx, $SID; + + // Have we disabled the display of moderators? If so, then return + // from whence we came ... + if (empty($config['load_moderators'])) + { + return; + } + + if (!empty($forum_id) && is_array($forum_id)) + { + $forum_sql = 'AND forum_id IN (' . implode(', ', $forum_id) . ')'; + } + else + { + $forum_sql = ($forum_id) ? 'AND forum_id = ' . $forum_id : ''; + } + + $sql = 'SELECT * + FROM ' . MODERATOR_TABLE . " + WHERE display_on_index = 1 + $forum_sql"; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $forum_moderators[$row['forum_id']][] = (!empty($row['user_id'])) ? '' . $row['username'] . '' : '' . $row['groupname'] . ''; + } + $db->sql_freeresult($result); + + return; +} + +/** +* User authorisation levels output +*/ +function gen_forum_auth_level($mode, $forum_id) +{ + global $SID, $template, $auth, $user; + + $rules = array( + ($auth->acl_get('f_post', $forum_id)) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'], + ($auth->acl_get('f_reply', $forum_id)) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'], + ($auth->acl_gets('f_edit', 'm_edit', $forum_id)) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'], + ($auth->acl_gets('f_delete', 'm_delete', $forum_id)) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'], + ($auth->acl_get('f_attach', $forum_id) && $auth->acl_get('u_attach', $forum_id)) ? $user->lang['RULES_ATTACH_CAN'] : $user->lang['RULES_ATTACH_CANNOT'] + ); + + foreach ($rules as $rule) + { + $template->assign_block_vars('rules', array('RULE' => $rule)); + } + + return; +} + /** * Generate topic status */ @@ -487,8 +665,8 @@ function topic_status(&$topic_row, $replies, $mark_time_topic, $mark_time_forum, */ function display_attachments($forum_id, $blockname, &$attachment_data, &$update_count, $force_physical = false, $return = false) { - global $extensions, $template, $cache, $attachment_tpl; - global $config, $user, $phpbb_root_path, $phpEx, $SID; + global $template, $cache, $user; + global $attachment_tpl, $extensions, $config, $phpbb_root_path, $phpEx, $SID; // $starttime = explode(' ', microtime()); // $starttime = $starttime[1] + $starttime[0]; @@ -541,7 +719,7 @@ function display_attachments($forum_id, $blockname, &$attachment_data, &$update_ if (empty($extensions) || !is_array($extensions)) { $extensions = array(); - obtain_attach_extensions($extensions); + $cache->obtain_attach_extensions($extensions); } foreach ($attachment_data as $attachment)