function loadPermissions() { global $user_info, $db_prefix, $board, $board_info, $modSettings; $user_info['permissions'] = array(); if ($user_info['is_admin']) { return; } if (!empty($modSettings['cache_enable'])) { $cache_groups = $user_info['groups']; asort($cache_groups); $cache_groups = implode(',', $cache_groups); if ($modSettings['cache_enable'] >= 2 && !empty($board) && ($temp = cache_get_data('permissions:' . $cache_groups . ':' . $board, 240)) != null) { list($user_info['permissions']) = $temp; banPermissions(); return; } elseif (($temp = cache_get_data('permissions:' . $cache_groups, 240)) != null) { list($user_info['permissions'], $removals) = $temp; } } if (empty($user_info['permissions'])) { // Get the general permissions. $request = db_query("\n\t\t\tSELECT permission, addDeny\n\t\t\tFROM {$db_prefix}permissions\n\t\t\tWHERE ID_GROUP IN (" . implode(', ', $user_info['groups']) . ')', __FILE__, __LINE__); $removals = array(); while ($row = mysql_fetch_assoc($request)) { if (empty($row['addDeny'])) { $removals[] = $row['permission']; } else { $user_info['permissions'][] = $row['permission']; } } mysql_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['use_local_permissions'])) { fatal_lang_error('smf232'); } $request = db_query("\n\t\t\tSELECT permission, addDeny\n\t\t\tFROM {$db_prefix}board_permissions\n\t\t\tWHERE ID_GROUP IN (" . implode(', ', $user_info['groups']) . ")\n\t\t\t\tAND ID_BOARD = " . ($board_info['use_local_permissions'] ? $board : '0'), __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { if (empty($row['addDeny'])) { $removals[] = $row['permission']; } else { $user_info['permissions'][] = $row['permission']; } } mysql_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); } // Remove some board permissions if the board is read-only or reply-only. if (empty($modSettings['permission_enable_by_board']) && !empty($board) && $board_info['permission_mode'] != 'normal' && !allowedTo('moderate_board')) { $permission_mode = array('read_only' => array('post_new', 'poll_post', 'post_reply_own', 'post_reply_any'), 'reply_only' => array('post_new', 'poll_post'), 'no_polls' => array('poll_post')); $user_info['permissions'] = array_diff($user_info['permissions'], $permission_mode[$board_info['permission_mode']]); } 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(); }
function loadPermissions() { global $user_info, $board, $board_info, $modSettings, $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 = CacheAPI::getCache('permissions:' . $cache_groups . ':' . $board, 240)) != null && time() - 240 > $modSettings['settings_updated']) { list($user_info['permissions']) = $temp; banPermissions(); return; } elseif (($temp = CacheAPI::getCache('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} && add_deny = 0)' : ''; if (empty($user_info['permissions'])) { // Get the general permissions. $request = smf_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 = mysql_fetch_assoc($request)) { if (empty($row['add_deny'])) { $removals[] = $row['permission']; } else { $user_info['permissions'][] = $row['permission']; } } mysql_free_result($request); if (isset($cache_groups)) { CacheAPI::putCache('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 = smf_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 = mysql_fetch_assoc($request)) { if (empty($row['add_deny'])) { $removals[] = $row['permission']; } else { $user_info['permissions'][] = $row['permission']; } } mysql_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) { CacheAPI::putCache('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 . '/lib/Subs-Auth.php'; rebuildModCache(); } else { $user_info['mod_cache'] = $_SESSION['mc']; } } }
function loadPermissions() { global $user_info, $board, $board_info, $modSettings, $smcFunc; 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} && 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(); }
function is_not_banned($forceCheck = false) { global $txt, $modSettings, $context, $user_info; global $sourcedir, $cookiename, $user_settings, $smcFunc; // You cannot be banned if you are an admin - doesn't help if you log out. if ($user_info['is_admin']) { return; } // Only check the ban every so often. (to reduce load.) if ($forceCheck || !isset($_SESSION['ban']) || empty($modSettings['banLastUpdated']) || $_SESSION['ban']['last_checked'] < $modSettings['banLastUpdated'] || $_SESSION['ban']['id_member'] != $user_info['id'] || $_SESSION['ban']['ip'] != $user_info['ip'] || $_SESSION['ban']['ip2'] != $user_info['ip2'] || isset($user_info['email'], $_SESSION['ban']['email']) && $_SESSION['ban']['email'] != $user_info['email']) { // Innocent until proven guilty. (but we know you are! :P) $_SESSION['ban'] = array('last_checked' => time(), 'id_member' => $user_info['id'], 'ip' => $user_info['ip'], 'ip2' => $user_info['ip2'], 'email' => $user_info['email']); $ban_query = array(); $ban_query_vars = array('current_time' => time()); $flag_is_activated = false; // Check both IP addresses. foreach (array('ip', 'ip2') as $ip_number) { // Check if we have a valid IP address. if (preg_match('/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/', $user_info[$ip_number], $ip_parts) == 1) { $ban_query[] = '((' . $ip_parts[1] . ' BETWEEN bi.ip_low1 AND bi.ip_high1) AND (' . $ip_parts[2] . ' BETWEEN bi.ip_low2 AND bi.ip_high2) AND (' . $ip_parts[3] . ' BETWEEN bi.ip_low3 AND bi.ip_high3) AND (' . $ip_parts[4] . ' BETWEEN bi.ip_low4 AND bi.ip_high4))'; // IP was valid, maybe there's also a hostname... if (empty($modSettings['disableHostnameLookup'])) { $hostname = host_from_ip($user_info[$ip_number]); if (strlen($hostname) > 0) { $ban_query[] = '({string:hostname} LIKE bi.hostname)'; $ban_query_vars['hostname'] = $hostname; } } } elseif ($user_info['ip'] == 'unknown') { $ban_query[] = '(bi.ip_low1 = 255 AND bi.ip_high1 = 255 AND bi.ip_low2 = 255 AND bi.ip_high2 = 255 AND bi.ip_low3 = 255 AND bi.ip_high3 = 255 AND bi.ip_low4 = 255 AND bi.ip_high4 = 255)'; } } // Is their email address banned? if (strlen($user_info['email']) != 0) { $ban_query[] = '({string:email} LIKE bi.email_address)'; $ban_query_vars['email'] = $user_info['email']; } // How about this user? if (!$user_info['is_guest'] && !empty($user_info['id'])) { $ban_query[] = 'bi.id_member = {int:id_member}'; $ban_query_vars['id_member'] = $user_info['id']; } // Check the ban, if there's information. if (!empty($ban_query)) { $restrictions = array('cannot_access', 'cannot_login', 'cannot_post', 'cannot_register'); $request = $smcFunc['db_query']('', ' SELECT bi.id_ban, bi.email_address, bi.id_member, bg.cannot_access, bg.cannot_register, bg.cannot_post, bg.cannot_login, bg.reason, IFNULL(bg.expire_time, 0) AS expire_time FROM {db_prefix}ban_items AS bi INNER JOIN {db_prefix}ban_groups AS bg ON (bg.id_ban_group = bi.id_ban_group AND (bg.expire_time IS NULL OR bg.expire_time > {int:current_time})) WHERE (' . implode(' OR ', $ban_query) . ')', $ban_query_vars); // Store every type of ban that applies to you in your session. while ($row = $smcFunc['db_fetch_assoc']($request)) { foreach ($restrictions as $restriction) { if (!empty($row[$restriction])) { $_SESSION['ban'][$restriction]['reason'] = $row['reason']; $_SESSION['ban'][$restriction]['ids'][] = $row['id_ban']; if (!isset($_SESSION['ban']['expire_time']) || $_SESSION['ban']['expire_time'] != 0 && ($row['expire_time'] == 0 || $row['expire_time'] > $_SESSION['ban']['expire_time'])) { $_SESSION['ban']['expire_time'] = $row['expire_time']; } if (!$user_info['is_guest'] && $restriction == 'cannot_access' && ($row['id_member'] == $user_info['id'] || $row['email_address'] == $user_info['email'])) { $flag_is_activated = true; } } } } $smcFunc['db_free_result']($request); } // Mark the cannot_access and cannot_post bans as being 'hit'. if (isset($_SESSION['ban']['cannot_access']) || isset($_SESSION['ban']['cannot_post']) || isset($_SESSION['ban']['cannot_login'])) { log_ban(array_merge(isset($_SESSION['ban']['cannot_access']) ? $_SESSION['ban']['cannot_access']['ids'] : array(), isset($_SESSION['ban']['cannot_post']) ? $_SESSION['ban']['cannot_post']['ids'] : array(), isset($_SESSION['ban']['cannot_login']) ? $_SESSION['ban']['cannot_login']['ids'] : array())); } // If for whatever reason the is_activated flag seems wrong, do a little work to clear it up. if ($user_info['id'] && ($user_settings['is_activated'] >= 10 && !$flag_is_activated || $user_settings['is_activated'] < 10 && $flag_is_activated)) { require_once $sourcedir . '/ManageBans.php'; updateBanMembers(); } } // Hey, I know you! You're ehm... if (!isset($_SESSION['ban']['cannot_access']) && !empty($_COOKIE[$cookiename . '_'])) { $bans = explode(',', $_COOKIE[$cookiename . '_']); foreach ($bans as $key => $value) { $bans[$key] = (int) $value; } $request = $smcFunc['db_query']('', ' SELECT bi.id_ban, bg.reason FROM {db_prefix}ban_items AS bi INNER JOIN {db_prefix}ban_groups AS bg ON (bg.id_ban_group = bi.id_ban_group) WHERE bi.id_ban IN ({array_int:ban_list}) AND (bg.expire_time IS NULL OR bg.expire_time > {int:current_time}) AND bg.cannot_access = {int:cannot_access} LIMIT ' . count($bans), array('cannot_access' => 1, 'ban_list' => $bans, 'current_time' => time())); while ($row = $smcFunc['db_fetch_assoc']($request)) { $_SESSION['ban']['cannot_access']['ids'][] = $row['id_ban']; $_SESSION['ban']['cannot_access']['reason'] = $row['reason']; } $smcFunc['db_free_result']($request); // My mistake. Next time better. if (!isset($_SESSION['ban']['cannot_access'])) { require_once $sourcedir . '/Subs-Auth.php'; $cookie_url = url_parts(!empty($modSettings['localCookies']), !empty($modSettings['globalCookies'])); setcookie($cookiename . '_', '', time() - 3600, $cookie_url[1], $cookie_url[0], 0); } } // If you're fully banned, it's end of the story for you. if (isset($_SESSION['ban']['cannot_access'])) { // We don't wanna see you! if (!$user_info['is_guest']) { $smcFunc['db_query']('', ' DELETE FROM {db_prefix}log_online WHERE id_member = {int:current_member}', array('current_member' => $user_info['id'])); } // 'Log' the user out. Can't have any funny business... (save the name!) $old_name = isset($user_info['name']) && $user_info['name'] != '' ? $user_info['name'] : $txt['guest_title']; $user_info['name'] = ''; $user_info['username'] = ''; $user_info['is_guest'] = true; $user_info['is_admin'] = false; $user_info['permissions'] = array(); $user_info['id'] = 0; $context['user'] = array('id' => 0, 'username' => '', 'name' => $txt['guest_title'], 'is_guest' => true, 'is_logged' => false, 'is_admin' => false, 'is_mod' => false, 'can_mod' => false, 'language' => $user_info['language']); // A goodbye present. require_once $sourcedir . '/Subs-Auth.php'; $cookie_url = url_parts(!empty($modSettings['localCookies']), !empty($modSettings['globalCookies'])); setcookie($cookiename . '_', implode(',', $_SESSION['ban']['cannot_access']['ids']), time() + 3153600, $cookie_url[1], $cookie_url[0], 0); // Don't scare anyone, now. $_GET['action'] = ''; $_GET['board'] = ''; $_GET['topic'] = ''; writeLog(true); // You banned, sucka! fatal_error(sprintf($txt['your_ban'], $old_name) . (empty($_SESSION['ban']['cannot_access']['reason']) ? '' : '<br />' . $_SESSION['ban']['cannot_access']['reason']) . '<br />' . (!empty($_SESSION['ban']['expire_time']) ? sprintf($txt['your_ban_expires'], timeformat($_SESSION['ban']['expire_time'], false)) : $txt['your_ban_expires_never']), 'user'); // If we get here, something's gone wrong.... but let's try anyway. trigger_error('Hacking attempt...', E_USER_ERROR); } elseif (isset($_SESSION['ban']['cannot_login']) && !$user_info['is_guest']) { // We don't wanna see you! $smcFunc['db_query']('', ' DELETE FROM {db_prefix}log_online WHERE id_member = {int:current_member}', array('current_member' => $user_info['id'])); // 'Log' the user out. Can't have any funny business... (save the name!) $old_name = isset($user_info['name']) && $user_info['name'] != '' ? $user_info['name'] : $txt['guest_title']; $user_info['name'] = ''; $user_info['username'] = ''; $user_info['is_guest'] = true; $user_info['is_admin'] = false; $user_info['permissions'] = array(); $user_info['id'] = 0; $context['user'] = array('id' => 0, 'username' => '', 'name' => $txt['guest_title'], 'is_guest' => true, 'is_logged' => false, 'is_admin' => false, 'is_mod' => false, 'can_mod' => false, 'language' => $user_info['language']); // SMF's Wipe 'n Clean(r) erases all traces. $_GET['action'] = ''; $_GET['board'] = ''; $_GET['topic'] = ''; writeLog(true); require_once $sourcedir . '/LogInOut.php'; Logout(true, false); fatal_error(sprintf($txt['your_ban'], $old_name) . (empty($_SESSION['ban']['cannot_login']['reason']) ? '' : '<br />' . $_SESSION['ban']['cannot_login']['reason']) . '<br />' . (!empty($_SESSION['ban']['expire_time']) ? sprintf($txt['your_ban_expires'], timeformat($_SESSION['ban']['expire_time'], false)) : $txt['your_ban_expires_never']) . '<br />' . $txt['ban_continue_browse'], 'user'); } // Fix up the banning permissions. if (isset($user_info['permissions'])) { banPermissions(); } }
function is_not_banned($forceCheck = false) { global $txt, $db_prefix, $ID_MEMBER, $modSettings, $context, $user_info; global $sourcedir, $cookiename, $user_settings; // You cannot be banned if you are an admin - doesn't help if you log out. if ($user_info['is_admin']) { return; } // Only check the ban every so often. (to reduce load.) if ($forceCheck || !isset($_SESSION['ban']) || empty($modSettings['banLastUpdated']) || $_SESSION['ban']['last_checked'] < $modSettings['banLastUpdated'] || $_SESSION['ban']['ID_MEMBER'] != $ID_MEMBER || $_SESSION['ban']['ip'] != $user_info['ip'] || $_SESSION['ban']['ip2'] != $user_info['ip2'] || isset($user_info['email'], $_SESSION['ban']['email']) && $_SESSION['ban']['email'] != $user_info['email']) { // Innocent until proven guilty. (but we know you are! :P) $_SESSION['ban'] = array('last_checked' => time(), 'ID_MEMBER' => $ID_MEMBER, 'ip' => $user_info['ip'], 'ip2' => $user_info['ip2'], 'email' => $user_info['email']); $ban_query = array(); $flag_is_activated = false; // Check both IP addresses. foreach (array('ip', 'ip2') as $ip_number) { // Check if we have a valid IP address. if (preg_match('/^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/', $user_info[$ip_number], $ip_parts) == 1) { $ban_query[] = "(({$ip_parts['1']} BETWEEN bi.ip_low1 AND bi.ip_high1)\n\t\t\t\t\t\t\tAND ({$ip_parts['2']} BETWEEN bi.ip_low2 AND bi.ip_high2)\n\t\t\t\t\t\t\tAND ({$ip_parts['3']} BETWEEN bi.ip_low3 AND bi.ip_high3)\n\t\t\t\t\t\t\tAND ({$ip_parts['4']} BETWEEN bi.ip_low4 AND bi.ip_high4))"; // IP was valid, maybe there's also a hostname... if (empty($modSettings['disableHostnameLookup'])) { $hostname = host_from_ip($user_info[$ip_number]); if (strlen($hostname) > 0) { $ban_query[] = "('" . addslashes($hostname) . "' LIKE bi.hostname)"; } } } elseif ($user_info[$ip_number] == 'unknown') { $ban_query[] = "(bi.ip_low1 = 255 AND bi.ip_high1 = 255\n\t\t\t\t\t\t\tAND bi.ip_low2 = 255 AND bi.ip_high2 = 255\n\t\t\t\t\t\t\tAND bi.ip_low3 = 255 AND bi.ip_high3 = 255\n\t\t\t\t\t\t\tAND bi.ip_low4 = 255 AND bi.ip_high4 = 255)"; } } // Is their email address banned? if (strlen($user_info['email']) != 0) { $ban_query[] = "('" . addslashes($user_info['email']) . "' LIKE bi.email_address)"; } // How about this user? if (!$user_info['is_guest'] && !empty($ID_MEMBER)) { $ban_query[] = "bi.ID_MEMBER = {$ID_MEMBER}"; } // Check the ban, if there's information. if (!empty($ban_query)) { $restrictions = array('cannot_access', 'cannot_login', 'cannot_post', 'cannot_register'); $request = db_query("\n\t\t\t\tSELECT bi.ID_BAN, bi.email_address, bi.ID_MEMBER, bg.cannot_access, bg.cannot_register,\n\t\t\t\t\tbg.cannot_post, bg.cannot_login, bg.reason\n\t\t\t\tFROM ({$db_prefix}ban_groups AS bg, {$db_prefix}ban_items AS bi)\n\t\t\t\tWHERE bg.ID_BAN_GROUP = bi.ID_BAN_GROUP\n\t\t\t\t\tAND (bg.expire_time IS NULL OR bg.expire_time > " . time() . ")\n\t\t\t\t\tAND (" . implode(' OR ', $ban_query) . ')', __FILE__, __LINE__); // Store every type of ban that applies to you in your session. while ($row = mysql_fetch_assoc($request)) { foreach ($restrictions as $restriction) { if (!empty($row[$restriction])) { $_SESSION['ban'][$restriction]['reason'] = $row['reason']; $_SESSION['ban'][$restriction]['ids'][] = $row['ID_BAN']; if (!$user_info['is_guest'] && $restriction == 'cannot_access' && ($row['ID_MEMBER'] == $ID_MEMBER || $row['email_address'] == $user_info['email'])) { $flag_is_activated = true; } } } } mysql_free_result($request); } // Mark the cannot_access and cannot_post bans as being 'hit'. if (isset($_SESSION['ban']['cannot_access']) || isset($_SESSION['ban']['cannot_post'])) { log_ban(array_merge(isset($_SESSION['ban']['cannot_access']) ? $_SESSION['ban']['cannot_access']['ids'] : array(), isset($_SESSION['ban']['cannot_post']) ? $_SESSION['ban']['cannot_post']['ids'] : array())); } // If for whatever reason the is_activated flag seems wrong, do a little work to clear it up. if ($ID_MEMBER && ($user_settings['is_activated'] >= 10 && !$flag_is_activated || $user_settings['is_activated'] < 10 && $flag_is_activated)) { require_once $sourcedir . '/ManageBans.php'; updateBanMembers(); } } // Hey, I know you! You're ehm... if (!isset($_SESSION['ban']['cannot_access']) && !empty($_COOKIE[$cookiename . '_'])) { $bans = explode(',', $_COOKIE[$cookiename . '_']); foreach ($bans as $key => $value) { $bans[$key] = (int) $value; } $request = db_query("\n\t\t\tSELECT bi.ID_BAN, bg.reason\n\t\t\tFROM ({$db_prefix}ban_items AS bi, {$db_prefix}ban_groups AS bg)\n\t\t\tWHERE bg.ID_BAN_GROUP = bi.ID_BAN_GROUP\n\t\t\t\tAND (bg.expire_time IS NULL OR bg.expire_time > " . time() . ")\n\t\t\t\tAND bg.cannot_access = 1\n\t\t\t\tAND bi.ID_BAN IN (" . implode(', ', $bans) . ")\n\t\t\tLIMIT " . count($bans), __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { $_SESSION['ban']['cannot_access']['ids'][] = $row['ID_BAN']; $_SESSION['ban']['cannot_access']['reason'] = $row['reason']; } mysql_free_result($request); // My mistake. Next time better. if (!isset($_SESSION['ban']['cannot_access'])) { require_once $sourcedir . '/Subs-Auth.php'; $cookie_url = url_parts(!empty($modSettings['localCookies']), !empty($modSettings['globalCookies'])); setcookie($cookiename . '_', '', time() - 3600, $cookie_url[1], $cookie_url[0], 0); } } // If you're fully banned, it's end of the story for you. if (isset($_SESSION['ban']['cannot_access'])) { // We don't wanna see you! if (!$user_info['is_guest']) { db_query("\n\t\t\t\tDELETE FROM {$db_prefix}log_online\n\t\t\t\tWHERE ID_MEMBER = {$ID_MEMBER}\n\t\t\t\tLIMIT 1", __FILE__, __LINE__); } // 'Log' the user out. Can't have any funny business... (save the name!) $old_name = isset($user_info['name']) && $user_info['name'] != '' ? $user_info['name'] : $txt[28]; $user_info['name'] = ''; $user_info['username'] = ''; $user_info['is_guest'] = true; $user_info['is_admin'] = false; $user_info['permissions'] = array(); $ID_MEMBER = 0; $context['user'] = array('id' => 0, 'username' => '', 'name' => $txt[28], 'is_guest' => true, 'is_logged' => false, 'is_admin' => false, 'is_mod' => false, 'language' => $user_info['language']); // A goodbye present. require_once $sourcedir . '/Subs-Auth.php'; $cookie_url = url_parts(!empty($modSettings['localCookies']), !empty($modSettings['globalCookies'])); setcookie($cookiename . '_', implode(',', $_SESSION['ban']['cannot_access']['ids']), time() + 3153600, $cookie_url[1], $cookie_url[0], 0); // Don't scare anyone, now. $_GET['action'] = ''; $_GET['board'] = ''; $_GET['topic'] = ''; writeLog(true); // You banned, sucka! fatal_error(sprintf($txt[430], $old_name) . (empty($_SESSION['ban']['cannot_access']['reason']) ? '' : '<br />' . $_SESSION['ban']['cannot_access']['reason'])); // If we get here, something's gone wrong.... but let's try anyway. trigger_error('Hacking attempt...', E_USER_ERROR); } elseif (isset($_SESSION['ban']['cannot_login']) && !$user_info['is_guest']) { // !!! Why doesn't this use the function made for logging bans? db_query("\n\t\t\tUPDATE {$db_prefix}ban_items\n\t\t\tSET hits = hits + 1\n\t\t\tWHERE ID_BAN IN (" . implode(', ', $_SESSION['ban']['cannot_login']['ids']) . ')', __FILE__, __LINE__); // Log this ban. db_query("\n\t\t\tINSERT INTO {$db_prefix}log_banned\n\t\t\t\t(ID_MEMBER, ip, email, logTime)\n\t\t\tVALUES ({$ID_MEMBER}, SUBSTRING('{$user_info['ip']}', 1, 16), SUBSTRING('{$user_info['email']}', 1, 255), " . time() . ')', __FILE__, __LINE__); // SMF's Wipe 'n Clean(r) erases all traces. $_GET['action'] = ''; $_GET['board'] = ''; $_GET['topic'] = ''; writeLog(true); // Logged in, but not for long... require_once $sourcedir . '/LogInOut.php'; Logout(true); } // Fix up the banning permissions. if (isset($user_info['permissions'])) { banPermissions(); } }