" . ANONYMOUS; $result = $db->sql_query($sql); return ( $row = $db->sql_fetchrow($result) ) ? $row : false; } function get_forum_branch($forum_id, $type = 'all', $order = 'descending', $include_forum = TRUE) { global $db; switch ($type) { case 'parents': $condition = 'f1.left_id BETWEEN f2.left_id AND f2.right_id'; break; case 'children': $condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id'; break; default: $condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id OR f1.left_id BETWEEN f2.left_id AND f2.right_id'; } $rows = array(); $sql = 'SELECT f2.* FROM ( ' . FORUMS_TABLE . ' f1 LEFT JOIN ' . FORUMS_TABLE . " f2 ON $condition ) WHERE f1.forum_id = $forum_id ORDER BY f2.left_id " . ( ($order == 'descending') ? 'ASC' : 'DESC' ); $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { if (!$include_forum && $row['forum_id'] == $forum_id) { continue; } $rows[] = $row; } return $rows; } function forum_nav_links(&$forum_id, &$forum_name) { global $SID, $template, $phpEx, $auth; $type = 'parent'; $forum_rows = array(); if (!($forum_branch = get_forum_branch($forum_id))) { trigger_error($user->lang['Forum_not_exist']); } $s_has_subforums = FALSE; foreach ($forum_branch as $row) { if ($type == 'parent') { $link = ($row['forum_status'] == ITEM_CATEGORY) ? 'index.' . $phpEx . $SID . '&c=' . $row['forum_id'] : 'viewforum.' . $phpEx . $SID . '&f=' . $row['forum_id']; $template->assign_block_vars('navlinks', array( 'FORUM_NAME' => $row['forum_name'], 'U_VIEW_FORUM' => $link )); if ($row['forum_id'] == $forum_id) { $branch_root_id = 0; $forum_data = $row; $type = 'child'; $forum_name = $row['forum_name']; } } else { if ($row['parent_id'] == $forum_data['forum_id']) { // Root-level forum $forum_rows[] = $row; $parent_id = $row['forum_id']; if ($row['forum_status'] == ITEM_CATEGORY) { $branch_root_id = $row['forum_id']; } else { $s_has_subforums = TRUE; } } elseif ($row['parent_id'] == $branch_root_id) { // Forum directly under a category $forum_rows[] = $row; $parent_id = $row['forum_id']; if ($row['forum_status'] != ITEM_CATEGORY) { $s_has_subforums = TRUE; } } elseif ($row['forum_status'] != ITEM_CATEGORY) { // Subforum if ($auth->acl_get('f_list', $row['forum_id'])) { $subforums[$parent_id][] = $row; } } } } return $s_has_subforums; } // Obtain list of moderators of each forum // First users, then groups ... broken into two queries // We could cache this ... certainly into a DB table. Would // better allow the admin to decide which moderators are // displayed(?) function cache_moderators($type = false, $id = false) { } function get_moderators(&$forum_moderators, $forum_id = false) { global $SID, $db, $acl_options, $phpEx; $forum_sql = ( $forum_id ) ? 'AND m.forum_id = ' . $forum_id : ''; /* $sql = "SELECT m.forum_id, u.user_id, u.username, g.group_id, g.group_name FROM phpbb_moderators m LEFT JOIN phpbb_users u ON u.user_id = m.user_id LEFT JOIN phpbb_groups g ON g.group_id = m.group_id WHERE m.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['group_name'] . ''; }*/ $sql = "SELECT au.forum_id, u.user_id, u.username FROM " . ACL_OPTIONS_TABLE . " o, " . ACL_USERS_TABLE . " au, " . USERS_TABLE . " u WHERE au.auth_option_id = o.auth_option_id AND au.user_id = u.user_id AND o.auth_value = 'm_' AND au.auth_allow_deny = 1 $forum_sql"; $result = $db->sql_query($sql); while ( $row = $db->sql_fetchrow($result) ) { $forum_moderators[$row['forum_id']][] = '' . $row['username'] . ''; } $sql = "SELECT ag.forum_id, g.group_name, g.group_id FROM " . ACL_OPTIONS_TABLE . " o, " . ACL_GROUPS_TABLE . " ag, " . GROUPS_TABLE . " g WHERE ag.auth_option_id = o.auth_option_id AND ag.group_id = g.group_id AND o.auth_value = 'm_' AND ag.auth_allow_deny = 1 AND g.group_type <> " . GROUP_HIDDEN . " $forum_sql"; $result = $db->sql_query($sql); while ( $row = $db->sql_fetchrow($result) ) { $forum_moderators[$row['forum_id']][] = '' . $row['group_name'] . ''; } return; } // // User authorisation levels output // function get_forum_rules($mode, &$rules, &$forum_id) { global $SID, $auth, $user; $rules .= ( ( $auth->acl_get('f_post', $forum_id) ) ? $user->lang['Rules_post_can'] : $user->lang['Rules_post_cannot'] ) . '
'; $rules .= ( ( $auth->acl_get('f_reply', $forum_id) ) ? $user->lang['Rules_reply_can'] : $user->lang['Rules_reply_cannot'] ) . '
'; $rules .= ( ( $auth->acl_get('f_edit', $forum_id) ) ? $user->lang['Rules_edit_can'] : $user->lang['Rules_edit_cannot'] ) . '
'; $rules .= ( ( $auth->acl_get('f_delete', $forum_id) || $auth->acl_get('m_delete', $forum_id) ) ? $user->lang['Rules_delete_can'] : $user->lang['Rules_delete_cannot'] ) . '
'; $rules .= ( ( $auth->acl_get('f_attach', $forum_id) ) ? $user->lang['Rules_attach_can'] : $user->lang['Rules_attach_cannot'] ) . '
'; return; } function make_jumpbox($action, $forum_id = false) { global $auth, $template, $user, $db, $nav_links, $phpEx; $boxstring = ''; $template->assign_vars(array( 'L_GO' => $user->lang['Go'], 'L_JUMP_TO' => $user->lang['Jump_to'], 'S_JUMPBOX_SELECT' => $boxstring, 'S_JUMPBOX_ACTION' => $action) ); return; } // Pick a language, any language ... function language_select($default, $select_name = "language", $dirname="language") { global $phpEx; $dir = @opendir($dirname); $user = array(); while ( $file = readdir($dir) ) { if ( file_exists($dirname . '/' . $file . '/iso.txt') ) { list($displayname) = file($dirname . '/' . $file . '/iso.txt'); $lang[$displayname] = $dirname . '/' . $file; } } @closedir($dir); @asort($lang); @reset($lang); $user_select = ''; return $user_select; } // Pick a template/theme combo, function style_select($default_style, $select_name = 'style', $dirname = 'templates') { global $db; $sql = "SELECT style_id, style_name FROM " . STYLES_TABLE . " ORDER BY style_name, style_id"; $result = $db->sql_query($sql); $style_select = '"; return $style_select; } // Pick a timezone function tz_select($default, $select_name = 'timezone') { global $sys_timezone, $user; $tz_select = ''; return $tz_select; } // Topic and forum watching common code function watch_topic_forum($mode, &$s_watching, &$s_watching_img, $user_id, $match_id) { global $template, $db, $user, $phpEx, $SID, $start; $table_sql = ( $mode == 'forum' ) ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE; $where_sql = ( $mode == 'forum' ) ? 'forum_id' : 'topic_id'; $u_url = ( $mode == 'forum' ) ? 'f' : 't'; // Is user watching this thread? if ( $user_id ) { $can_watch = TRUE; $sql = "SELECT notify_status FROM " . $table_sql . " WHERE $where_sql = $match_id AND user_id = $user_id"; $result = $db->sql_query($sql); if ( $row = $db->sql_fetchrow($result) ) { if ( isset($_GET['unwatch']) ) { if ( $_GET['unwatch'] == $mode ) { $is_watching = 0; $sql = "DELETE FROM " . $table_sql . " WHERE $where_sql = $match_id AND user_id = $user_id"; $db->sql_query($sql); } $template->assign_vars(array( 'META' => '') ); $message = $user->lang['No_longer_watching_' . $mode] . '

' . sprintf($user->lang['Click_return_' . $mode], '', ''); trigger_error($message); } else { $is_watching = TRUE; if ( $row['notify_status'] ) { $sql = "UPDATE " . $table_sql . " SET notify_status = 0 WHERE $where_sql = $match_id AND user_id = $user_id"; $db->sql_query($sql); } } } else { if ( isset($_GET['watch']) ) { if ( $_GET['watch'] == $mode ) { $is_watching = TRUE; $sql = "INSERT INTO " . $table_sql . " (user_id, $where_sql, notify_status) VALUES ($user_id, $match_id, 0)"; $db->sql_query($sql); } $template->assign_vars(array( 'META' => '') ); $message = $user->lang['You_are_watching_' . $mode] . '

' . sprintf($user->lang['Click_return_' . $mode], '', ''); trigger_error($message); } else { $is_watching = 0; } } } else { if ( isset($_GET['unwatch']) ) { if ( $_GET['unwatch'] == $mode ) { redirect("login.$phpEx$SID&redirect=view$mode.$phpEx&" . $u_url . "=$match_id&unwatch=forum"); } } else { $can_watch = 0; $is_watching = 0; } } if ( $can_watch ) { $s_watching = ( $is_watching ) ? '' . $user->lang['Stop_watching_' . $mode] . '' : '' . $user->lang['Start_watching_' . $mode] . ''; } return; } // Pagination routine, generates page number sequence function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = TRUE) { global $user; $total_pages = ceil($num_items/$per_page); if ( $total_pages == 1 || !$num_items ) { return ''; } $on_page = floor($start_item / $per_page) + 1; $page_string = ( $on_page == 1 ) ? '1' : '' . $user->lang['Previous'] . '  1'; if ( $total_pages > 5 ) { $start_cnt = min(max(1, $on_page - 4), $total_pages - 5); $end_cnt = max(min($total_pages, $on_page + 4), 6); $page_string .= ( $start_cnt > 1 ) ? ' ... ' : ', '; for($i = $start_cnt + 1; $i < $end_cnt; $i++) { $page_string .= ( $i == $on_page ) ? '' . $i . '' : '' . $i . ''; if ( $i < $end_cnt - 1 ) { $page_string .= ', '; } } $page_string .= ( $end_cnt < $total_pages ) ? ' ... ' : ', '; } else { $page_string .= ', '; for($i = 2; $i < $total_pages; $i++) { $page_string .= ( $i == $on_page ) ? '' . $i . '' : '' . $i . ''; if ( $i < $total_pages ) { $page_string .= ', '; } } } $page_string .= ( $on_page == $total_pages ) ? '' . $total_pages . '' : '' . $total_pages . '  ' . $user->lang['Next'] . ''; $page_string = $user->lang['Goto_page'] . ' ' . $page_string; return $page_string; } function on_page($num_items, $per_page, $start) { global $user; return sprintf($user->lang['Page_of'], floor( $start / $per_page ) + 1, max(ceil( $num_items / $per_page ), 1) ); } // Obtain list of naughty words and build preg style replacement arrays for use by the // calling script, note that the vars are passed as references this just makes it easier // to return both sets of arrays function obtain_word_list(&$orig_word, &$replacement_word) { global $db; $sql = "SELECT word, replacement FROM " . WORDS_TABLE; $result = $db->sql_query($sql); while ( $row = $db->sql_fetchrow($result) ) { $orig_word[] = '#\b(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')\b#i'; $replacement_word[] = $row['replacement']; } return true; } // Redirects the user to another page then exits the script nicely function redirect($location) { global $db; if (isset($db)) { $db->sql_close(); } $header_location = (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE'))) ? 'Refresh: 0; URL=' : 'Location: '; header($header_location . $location); exit; } // Check to see if the username has been taken, or if it is disallowed. // Also checks if it includes the " character, which we don't allow in usernames. // Used for registering, changing names, and posting anonymously with a username function validate_username($username) { global $db, $user; $username = sql_quote($username); $sql = "SELECT username FROM " . USERS_TABLE . " WHERE LOWER(username) = '" . strtolower($username) . "'"; $result = $db->sql_query($sql); if (($row = $db->sql_fetchrow($result)) && $row['username'] != $user->data['username']) { return $user->lang['Username_taken']; } $sql = "SELECT group_name FROM " . GROUPS_TABLE . " WHERE LOWER(group_name) = '" . strtolower($username) . "'"; $result = $db->sql_query($sql); if ($row = $db->sql_fetchrow($result)) { return $user->lang['Username_taken']; } $sql = "SELECT disallow_username FROM " . DISALLOW_TABLE; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { if (preg_match('#\b(' . str_replace('\*', '.*?', preg_quote($row['disallow_username'])) . ')\b#i', $username)) { return $user->lang['Username_disallowed']; } } $sql = "SELECT word FROM " . WORDS_TABLE; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { if (preg_match('#\b(' . str_replace('\*', '.*?', preg_quote($row['word'])) . ')\b#i', $username)) { return $user->lang['Username_disallowed']; } } // Don't allow " in username. if (strstr($username, '"')) { return $user->lang['Username_invalid']; } return false; } // Check to see if email address is banned or already present in the DB function validate_email($email) { global $db, $user; if ($email != '') { if (preg_match('/^[a-z0-9\.\-_\+]+@[a-z0-9\-_]+\.([a-z0-9\-_]+\.)*?[a-z]+$/is', $email)) { $sql = "SELECT ban_email FROM " . BANLIST_TABLE; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { if (preg_match('/^' . str_replace('*', '.*?', $row['ban_email']) . '$/is', $email)) { return $user->lang['Email_banned']; } } $sql = "SELECT user_email FROM " . USERS_TABLE . " WHERE user_email = '" . sql_quote($email) . "'"; $result = $db->sql_query($sql); if ($row = $db->sql_fetchrow($result)) { return $user->lang['Email_taken']; } return false; } } return $user->lang['Email_invalid']; } // Does supplementary validation of optional profile fields. This // expects common stuff like trim() and strip_tags() to have already // been run. Params are passed by-ref, so we can set them to the empty // string if they fail. function validate_optional_fields(&$icq, &$aim, &$msnm, &$yim, &$website, &$location, &$occupation, &$interests, &$sig) { $check_var_length = array('aim', 'msnm', 'yim', 'location', 'occupation', 'interests', 'sig'); for($i = 0; $i < count($check_var_length); $i++) { if ( strlen($$check_var_length[$i]) < 2 ) { $$check_var_length[$i] = ''; } } // ICQ number has to be only numbers. if ( !preg_match('/^[0-9]+$/', $icq) ) { $icq = ''; } // website has to start with http://, followed by something with length at least 3 that // contains at least one dot. if ( $website != '' ) { if ( !preg_match('#^http:\/\/#i', $website) ) { $website = 'http://' . $website; } if ( !preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $website) ) { $website = ''; } } return; } // This is general replacement for die(), allows templated output in users (or default) // language, etc. $msg_code can be one of these constants: // // -> MESSAGE : Use for any simple text message, eg. results of an operation, authorisation // failures, etc. // -> ERROR : Use for any error, a simple page will be output function message_die($msg_code, $msg_text = '', $msg_title = '') { global $db, $auth, $template, $config, $user, $nav_links; global $phpEx, $phpbb_root_path, $starttime; switch ( $msg_code ) { case MESSAGE: $msg_title = ( $msg_title == '' ) ? $user->lang['Information'] : $msg_title; $msg_text = ( !empty($user->lang[$msg_text]) ) ? $user->lang[$msg_text] : $msg_text; if ( !defined('HEADER_INC') ) { if ( empty($user->lang) ) { echo '' . $msg_title . '' . "\n"; echo '
' . $msg_title . '
' . $msg_text . '
'; $db->sql_close(); exit; } else if ( defined('IN_ADMIN') ) { page_header('', '', false); } else { include($phpbb_root_path . 'includes/page_header.' . $phpEx); } } if ( defined('IN_ADMIN') ) { page_message($msg_title, $msg_text, $display_header); page_footer(); } else { $template->set_filenames(array( 'body' => 'message_body.html') ); $template->assign_vars(array( 'MESSAGE_TITLE' => $msg_title, 'MESSAGE_TEXT' => $msg_text) ); include($phpbb_root_path . 'includes/page_tail.' . $phpEx); } break; case ERROR: $db->sql_close(); echo '' . $msg_title . '
» ' . $msg_title . '   

' . $msg_text . '

'; break; } exit; } // Error and message handler, call with trigger_error if reqd function msg_handler($errno, $msg_text, $errfile, $errline) { global $db, $auth, $template, $config, $user, $nav_links; global $phpEx, $phpbb_root_path, $starttime; switch ( $errno ) { case E_WARNING: // if (defined('DEBUG')) // { // echo "PHP Warning on line $errline in $errfile :: $msg_text"; // } break; case E_NOTICE: // if (defined('DEBUG_EXTRA')) // { // echo "PHP Notice on line $errline in $errfile :: $msg_text"; // } break; case E_USER_ERROR: if ( isset($db) ) { $db->sql_close(); } echo '' . $msg_title . ''; echo '
phpBB LogoGeneral Error      


' . $msg_text . '
Please notify the board administrator or webmaster : ' . $config['board_email'] . '

'; exit; break; case E_USER_NOTICE: $msg_text = ( !empty($user->lang[$msg_text]) ) ? $user->lang[$msg_text] : $msg_text; if ( !defined('HEADER_INC') ) { if ( defined('IN_ADMIN') ) { page_header('', '', false); } else { include($phpbb_root_path . 'includes/page_header.' . $phpEx); } } if ( defined('IN_ADMIN') ) { page_message($msg_title, $msg_text, $display_header); page_footer(); } else { $template->set_filenames(array( 'body' => 'message_body.html') ); $template->assign_vars(array( 'MESSAGE_TITLE' => $msg_title, 'MESSAGE_TEXT' => $msg_text) ); include($phpbb_root_path . 'includes/page_tail.' . $phpEx); } break; } } ?>