ers']; } // Make the page title more descriptive. $context['page_title'] .= ' - ' . (isset($txt['gr_type_' . $context['report_type']]) ? $txt['gr_type_' . $context['report_type']] : $context['report_type']); // Now generate the data. $context['report_types'][$context['report_type']]['function'](); // Finish the tables before exiting - this is to help the templates a little more. finishTables(); } // Standard report about what settings the boards have. function BoardReport() { global $context, $db_prefix, $txt; // Get every moderator. $request = db_query(" SELECT mods.ID_BOARD, mods.ID_MEMBER, mem.realName FROM ({$db_prefix}moderators AS mods, {$db_prefix}members AS mem) WHERE mem.ID_MEMBER = mods.ID_MEMBER", __FILE__, __LINE__); $moderators = array(); while ($row = mysql_fetch_assoc($request)) $moderators[$row['ID_BOARD']][] = $row['realName']; mysql_free_result($request); // Get all the possible membergroups! $request = db_query(" SELECT ID_GROUP, groupName, onlineColor FROM {$db_prefix}membergroups", __FILE__, __LINE__); $groups = array(-1 => $txt[28], 0 => $txt['full_member']); while ($row = mysql_fetch_assoc($request)) $groups[$row['ID_GROUP']] = empty($row['onlineColor']) ? $row['groupName'] : '' . $row['groupName'] . ''; mysql_free_result($request); // All the fields we'll show. $boardSettings = array( 'category' => $txt['board_category'], 'parent' => $txt['board_parent'], 'num_topics' => $txt['board_num_topics'], 'num_posts' => $txt['board_num_posts'], 'count_posts' => $txt['board_count_posts'], 'theme' => $txt['board_theme'], 'override_theme' => $txt['board_override_theme'], 'moderators' => $txt['board_moderators'], 'groups' => $txt['board_groups'], ); // Do it in columns, it's just easier. setKeys('cols'); // Go through each board! $request = db_query(" SELECT b.ID_BOARD, b.name, b.numPosts, b.numTopics, b.countPosts, b.memberGroups, b.override_theme, b.permission_mode, c.name AS catName, IFNULL(par.name, '$txt[none]') AS parentName, IFNULL(th.value, '$txt[none]') AS themeName FROM {$db_prefix}boards AS b LEFT JOIN {$db_prefix}categories AS c ON (c.ID_CAT = b.ID_CAT) LEFT JOIN {$db_prefix}boards AS par ON (par.ID_BOARD = b.ID_PARENT) LEFT JOIN {$db_prefix}themes AS th ON (th.ID_THEME = b.ID_THEME AND variable = 'name')", __FILE__, __LINE__); $boards = array(0 => array('name' => $txt['global_boards'], 'local_perms' => 1)); while ($row = mysql_fetch_assoc($request)) { // Each board has it's own table. newTable($row['name'], '', 'left', 'auto', 'left', 200, 'left'); // First off, add in the side key. addData($boardSettings); // Create the main data array. $boardData = array( 'category' => $row['catName'], 'parent' => $row['parentName'], 'num_posts' => $row['numPosts'], 'num_topics' => $row['numTopics'], 'count_posts' => empty($row['countPosts']) ? $txt['yes'] : $txt['no'], 'theme' => $row['themeName'], 'override_theme' => $row['override_theme'] ? $txt['yes'] : $txt['no'], 'moderators' => empty($moderators[$row['ID_BOARD']]) ? $txt['none'] : implode(', ', $moderators[$row['ID_BOARD']]), ); // Work out the membergroups who can access it. $allowedGroups = explode(',', $row['memberGroups']); foreach ($allowedGroups as $key => $group) { if (isset($groups[$group])) $allowedGroups[$key] = $groups[$group]; else unset($allowedGroups[$key]); } $boardData['groups'] = implode(', ', $allowedGroups); // Next add the main data. addData($boardData); } mysql_free_result($request); } // Generate a report on the current permissions by board and membergroup. function BoardPermissionsReport() { global $context, $db_prefix, $txt, $modSettings; if (isset($_REQUEST['boards'])) { if (!is_array($_REQUEST['boards'])) $_REQUEST['boards'] = explode(',', $_REQUEST['boards']); foreach ($_REQUEST['boards'] as $k => $dummy) $_REQUEST['boards'][$k] = (int) $dummy; $board_clause = 'ID_BOARD IN (' . implode(', ', $_REQUEST['boards']) . ')'; } else $board_clause = '1'; if (isset($_REQUEST['groups'])) { if (!is_array($_REQUEST['groups'])) $_REQUEST['groups'] = explode(',', $_REQUEST['groups']); foreach ($_REQUEST['groups'] as $k => $dummy) $_REQUEST['groups'][$k] = (int) $dummy; $group_clause = 'ID_GROUP IN (' . implode(', ', $_REQUEST['groups']) . ')'; } else $group_clause = '1'; // Fetch all the board names. $request = db_query(" SELECT ID_BOARD, name, permission_mode FROM {$db_prefix}boards WHERE $board_clause", __FILE__, __LINE__); $boards = array(0 => array('name' => $txt['global_boards'], 'local_perms' => 1)); while ($row = mysql_fetch_assoc($request)) $boards[$row['ID_BOARD']] = array( 'name' => $row['name'], 'local_perms' => !empty($modSettings['permission_enable_by_board']) && $row['permission_mode'] == 1, 'permission_mode' => empty($modSettings['permission_enable_by_board']) ? (empty($row['permission_mode']) ? 'normal' : ($row['permission_mode'] == 2 ? 'no_polls' : ($row['permission_mode'] == 3 ? 'reply_only' : 'read_only'))) : 'normal', ); mysql_free_result($request); // Get all the possible membergroups, except for admin! $request = db_query(" SELECT ID_GROUP, groupName FROM {$db_prefix}membergroups WHERE $group_clause AND ID_GROUP != 1" . (empty($modSettings['permission_enable_postgroups']) ? " AND minPosts = -1" : '') . " ORDER BY minPosts, IF(ID_GROUP < 4, ID_GROUP, 4), groupName", __FILE__, __LINE__); if (!isset($_REQUEST['groups']) || in_array(-1, $_REQUEST['groups']) || in_array(0, $_REQUEST['groups'])) $memberGroups = array('col' => '', -1 => $txt['membergroups_guests'], 0 => $txt['membergroups_members']); else $memberGroups = array('col' => ''); while ($row = mysql_fetch_assoc($request)) $memberGroups[$row['ID_GROUP']] = $row['groupName']; mysql_free_result($request); // Make sure that every group is represented - plus in rows! setKeys('rows', $memberGroups); // Cache every permission setting, to make sure we don't miss any allows. $permissions = array(); $board_permissions = array(); $request = db_query(" SELECT ID_BOARD, ID_GROUP, addDeny, permission FROM {$db_prefix}board_permissions WHERE $board_clause AND $group_clause" . (empty($modSettings['permission_enable_deny']) ? " AND addDeny = 1" : '') . " ORDER BY ID_BOARD, permission", __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) { $board_permissions[$row['ID_BOARD']][$row['ID_GROUP']][$row['permission']] = $row['addDeny']; // Make sure we get every permission. if (!isset($permissions[$row['permission']])) { // This will be reused on other boards. $permissions[$row['permission']] = array( 'title' => isset($txt['board_perms_name_' . $row['permission']]) ? $txt['board_perms_name_' . $row['permission']] : $row['permission'], ); } } mysql_free_result($request); // Now cycle through the board permissions array... lots to do ;) foreach ($board_permissions as $board => $groups) { // If it's not using local permissions don't show any! if ($board != 0 && !$boards[$board]['local_perms']) continue; // Create the table for this board first. newTable($boards[$board]['name'], 'x', 'all', 100, 'center', 200, 'left'); // Add the header row - shows all the membergroups. addData($memberGroups); // Add the seperator. addSeperator($txt['board_perms_permission']); // Here cycle through all the detected permissions. foreach ($permissions as $ID_PERM => $perm_info) { // Is this identical to the global? $identicalGlobal = $board == 0 ? false : true; // Default data for this row. $curData = array('col' => $perm_info['title']); // Now cycle each membergroup in this set of permissions. foreach ($memberGroups as $ID_GROUP => $name) { // Don't overwrite the key column! if ($ID_GROUP === 'col') continue; $group_permissions = isset($groups[$ID_GROUP]) ? $groups[$ID_GROUP] : array(); // Do we have any data for this group? if (isset($group_permissions[$ID_PERM])) { // Set the data for this group to be the local permission. $curData[$ID_GROUP] = $group_permissions[$ID_PERM]; // If it's different than the global - then this permission needs to be shown in diff view. if (!isset($board_permissions[0][$ID_GROUP][$ID_PERM]) || $board_permissions[0][$ID_GROUP][$ID_PERM] != $group_permissions[$ID_PERM]) $identicalGlobal = false; } // Otherwise means it's set to disallow.. else { $curData[$ID_GROUP] = 'x'; if (isset($board_permissions[0][$ID_GROUP][$ID_PERM]) && $board_permissions[0][$ID_GROUP][$ID_PERM] != 'x') $identicalGlobal = false; } // Now actually make the data for the group look right. if (empty($curData[$ID_GROUP])) $curData[$ID_GROUP] = '' . $txt['board_perms_deny'] . ''; elseif ($curData[$ID_GROUP] == 1) $curData[$ID_GROUP] = '' . $txt['board_perms_allow'] . ''; else $curData[$ID_GROUP] = 'x'; // Embolden those permissions different from global (makes it a lot easier!) if (@$board_permissions[0][$ID_GROUP][$ID_PERM] != @$group_permissions[$ID_PERM]) $curData[$ID_GROUP] = '' . $curData[$ID_GROUP] . ''; } // Now add the data for this permission. //!!! Make an option for changing the view here! if (!$identicalGlobal || !isset($_REQUEST['show_differences'])) addData($curData); } } // We'll do a little bit of seperate stuff for boards using "simple" local permissions. setKeys('rows'); foreach ($boards as $id => $board) { if ($id != 0 && !empty($board['permission_mode']) && $board['permission_mode'] != 'normal') { newTable($board['name'], 'x', 'top'); // Just add a description of the permission type. addData(array('' . $txt['board_perms_group_' . $board['permission_mode']] . '')); } } } // Show what the membergroups are made of. function MemberGroupsReport() { global $context, $db_prefix, $txt, $settings, $modSettings; // Fetch all the board names. $request = db_query(" SELECT ID_BOARD, name, memberGroups, permission_mode FROM {$db_prefix}boards", __FILE__, __LINE__); while ($row = mysql_fetch_assoc($request)) $boards[$row['ID_BOARD']] = array( 'id' => $row['ID_BOARD'], 'name' => $row['name'], 'local_perms' => !empty($modSettings['permission_enable_by_board']) && $row['permission_mode'] == 1, 'permission_mode' => empty($modSettings['permission_enable_by_board']) ? (empty($row['permission_mode']) ? $txt['permission_mode_normal'] : ($row['permission_mode'] == 2 ? $txt['permission_mode_no_polls'] : ($row['permission_mode'] == 3 ? $txt['permission_mode_reply_only'] : $txt['permission_mode_read_only']))) : $txt['permission_mode_normal'], 'groups' => array_merge(array(1,3), explode(',', $row['memberGroups'])), ); mysql_free_result($request); // Standard settings. $mgSettings = array( 'name' => '', '#sep#1' => $txt['member_group_settings'], 'color' => $txt['member_group_color'], 'minPosts' => $txt['member_group_minPosts'], 'maxMessages' => $txt['member_group_maxMessages'], 'stars' => $txt['member_group_stars'], '#sep#2' => $txt['member_group_access'], ); // Add on the boards! foreach ($boards as $board) $mgSettings['board_' . $board['id']] = $board['name']; // Add all the membergroup settings, plus we'll be adding in columns! setKeys('cols', $mgSettings); // Only one table this time! newTable($txt['gr_type_member_groups'], '-', 'all', 100, 'center', 200, 'left'); // Get the shaded column in. addData($mgSettings); // Now start cycling the membergroups! $request = db_query(" SELECT mg.ID_GROUP, mg.groupName, mg.onlineColor, mg.minPosts, mg.maxMessages, mg.stars" . (empty($modSettings['permission_enable_by_board']) ? ", IF(bp.permission IS NOT NULL OR mg.ID_GROUP = 1, 1, 0) AS can_moderate" : '') . " FROM {$db_prefix}membergroups AS mg" . (empty($modSettings['permission_enable_by_board']) ? " LEFT JOIN {$db_prefix}board_permissions AS bp ON (bp.ID_GROUP = mg.ID_GROUP AND bp.ID_BOARD = 0 AND bp.permission = 'moderate_board')" : '') . " ORDER BY mg.minPosts, IF(mg.ID_GROUP < 4, mg.ID_GROUP, 4), mg.groupName", __FILE__, __LINE__); // Cache them so we get regular members too. $rows = array( array( 'ID_GROUP' => -1, 'groupName' => $txt['membergroups_guests'], 'onlineColor' => '-', 'minPosts' => -1, 'maxMessages' => null, 'stars' => '' ), array( 'ID_GROUP' => 0, 'groupName' => $txt['membergroups_members'], 'onlineColor' => '-', 'minPosts' => -1, 'maxMessages' =