diff options
author | Paul S. Owen <psotfx@users.sourceforge.net> | 2003-04-13 18:01:30 +0000 |
---|---|---|
committer | Paul S. Owen <psotfx@users.sourceforge.net> | 2003-04-13 18:01:30 +0000 |
commit | c259434af4386c7e8501df9fc79ae30b0f72a058 (patch) | |
tree | c663709e790dcae871cc028a803be0ab9f3531e1 /phpBB/adm | |
parent | 2dc95a7e3e41e6318e5e5e8b00787f02986fb549 (diff) | |
download | forums-c259434af4386c7e8501df9fc79ae30b0f72a058.tar forums-c259434af4386c7e8501df9fc79ae30b0f72a058.tar.gz forums-c259434af4386c7e8501df9fc79ae30b0f72a058.tar.bz2 forums-c259434af4386c7e8501df9fc79ae30b0f72a058.tar.xz forums-c259434af4386c7e8501df9fc79ae30b0f72a058.zip |
Non (fully) working alternative to depedencies for admin, super mod and mod ... possibly
git-svn-id: file:///svn/phpbb/trunk@3827 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/adm')
-rw-r--r-- | phpBB/adm/admin_permissions.php | 721 |
1 files changed, 318 insertions, 403 deletions
diff --git a/phpBB/adm/admin_permissions.php b/phpBB/adm/admin_permissions.php index d0755d94d0..a6596dc854 100644 --- a/phpBB/adm/admin_permissions.php +++ b/phpBB/adm/admin_permissions.php @@ -42,10 +42,10 @@ require('pagestart.' . $phpEx); // Grab and set some basic parameters // // 'mode' determines what we're altering; administrators, users, deps, etc. -// 'type' is used primarily for deps and contains the original 'mode' // 'submit' is used to determine what we're doing ... special format $mode = (isset($_REQUEST['mode'])) ? htmlspecialchars($_REQUEST['mode']) : ''; -$type = (isset($_REQUEST['type'])) ? htmlspecialchars($_REQUEST['type']) : ''; +$submode= (isset($_REQUEST['submode'])) ? htmlspecialchars($_REQUEST['submode']) : ''; +$which_mode = (!empty($submode) && $submode != $mode) ? $submode : $mode; $submit = array_values(preg_grep('#^submit_(.*)$#i', array_keys($_POST))); $submit = (sizeof($submit)) ? substr($submit[0], strpos($submit[0], '_') + 1) : ''; @@ -54,12 +54,7 @@ $submit = (sizeof($submit)) ? substr($submit[0], strpos($submit[0], '_') + 1) : // // 'auth_settings' contains the submitted option settings assigned to options, should be an // associative array with integer values -// 'auth_setting' contains the value of the submitted 'auth_option', an integer value used -// mainly by deps mode -// 'auth_option' contains a single auth_option string, used mainly by deps mode -$auth_settings = (isset($_POST['settings'])) ? array_map('intval', $_POST['settings']) : ''; -$auth_option = (isset($_REQUEST['option'])) ? htmlspecialchars($_REQUEST['option']) : ''; -$auth_setting = (isset($_REQUEST['setting'])) ? intval($_REQUEST['setting']) : ''; +$auth_settings = (isset($_POST['settings'])) ? $_POST['settings'] : ''; // Forum, User or Group information @@ -69,7 +64,17 @@ $auth_setting = (isset($_REQUEST['setting'])) ? intval($_REQUEST['setting']) : ' // 'forum_id' contains the list of forums, 0 is used for "All forums", can be array or scalar $ug_type = (isset($_REQUEST['ug_type'])) ? htmlspecialchars($_REQUEST['ug_type']) : ''; $ug_data = (isset($_POST['ug_data'])) ? $_POST['ug_data'] : ''; -$forum_id = (isset($_REQUEST['f'])) ? ((is_array($_REQUEST['f'])) ? array_map('intval', $_REQUEST['f']) : intval($_REQUEST['f'])) : 0; + +if (isset($_REQUEST['f'])) +{ + $forum_id = (is_array($_REQUEST['f'])) ? $_REQUEST['f'] : intval($_REQUEST['f']); +} + +if (!isset($forum_id[$which_mode])) +{ + $forum_id[$which_mode][] = 0; +} +$sql_forum_id = implode(', ', array_map('intval', $forum_id[$which_mode])); // Instantiate a new auth admin object in readiness @@ -137,19 +142,26 @@ if (!$auth->acl_get($which_acl)) // Are we setting deps? If we are we need to re-run the mode match above for the // relevant 'new' mode -if ($mode == 'deps') +if (!empty($submode)) { - switch ($type) + switch ($submode) { + case 'forum': + $l_title_explain = $user->lang['PERMISSIONS_EXPLAIN']; + $which_acl = 'a_auth'; + $sql_option_mode = 'f'; + break; + case 'mod': - case 'supermod': + $l_title_explain = $user->lang['MODERATORS_EXPLAIN']; $which_acl = 'a_authmods'; $sql_option_mode = 'm'; break; - case 'admin': - $which_acl = 'a_authadmins'; - $sql_option_mode = 'a'; + case 'supermod': + $l_title_explain = $user->lang['SUPER_MODERATORS_EXPLAIN']; + $which_acl = 'a_authmods'; + $sql_option_mode = 'm'; break; } @@ -167,158 +179,88 @@ switch ($submit) { case 'update': - switch ($mode) - { - case 'deps': - $forum_id = (!is_array($forum_id)) ? array($forum_id) : $forum_id; - $auth_settings_ary = $db->sql_escape(serialize($auth_settings)); - - $sql = ''; - foreach ($forum_id as $id) - { - switch (SQL_LAYER) - { - case 'mysql': - case 'mysql4': - $sql .= (($sql != '') ? ', ' : '') . "('$option', $auth_setting, $id, '$auth_settings_ary')"; - break; - - case 'mssql': - $sql .= (($sql != '') ? ' UNION ALL ' : '') . " SELECT '$option', $auth_setting, $id, '$auth_settings_ary'"; - break; - - default: - $sql = "INSERT INTO " . ACL_DEPS_TABLE . " (auth_option, auth_setting, forum_id, auth_deps) - VALUES ('$option', $auth_setting, $id, '$auth_settings_ary')"; - $result = $db->sql_query($sql); - $sql = ''; - } - } - - if ($sql != '') - { - echo $sql = "INSERT INTO " . ACL_DEPS_TABLE . " (auth_option, auth_setting, forum_id, auth_deps) - VALUES $sql"; - $result = $db->sql_query($sql); - } - - unset($auth_settings_ary); - - exit; - break; - - default: - - // User wants to submit these changes ... before we allow this - // we first check to see if any dependencies exist. If they do - // we pull them, and give the user the option of applying them - // or skipping them - $sql_forum = (is_array($forum_id)) ? ' IN (' . implode(', ', $forum_id) . ')' : ' = ' . $forum_id; - - $sql_dep = $sql_global = array(); - foreach ($auth_settings as $option => $setting) - { - $sql_dep[$setting] .= (($sql_dep[$setting] != '') ? ', ' : '') . "'$option'"; - } - - $sql_options = ''; - foreach ($sql_dep as $setting => $options) - { - $sql_options .= (($sql_options != '') ? ' OR ' : '') . " (auth_option IN ($options) AND auth_setting = $setting)"; - } - - $sql = "SELECT auth_deps - FROM " . ACL_DEPS_TABLE . " - WHERE $sql_options"; -// AND forum_id $sql_forum"; - $result = $db->sql_query($sql); - - if ($row = $db->sql_fetchrow($result)) - { - do - { - $temp = unserialize($row['auth_deps']); - foreach ($temp as $option => $setting) - { - $auth_settings[$option] = (!isset($auth_settings[$option]) || $setting < $auth_settings[$option]) ? $setting : $auth_settings[$option]; - } - } - while ($row = $db->sql_fetchrow($result)); - - unset($temp); - unset($option); - unset($setting); - unset($sql_auth_option); + print_r($auth_settings); - $sql_option_mode = 'f'; + // Here we decide which depedencies we are looking for ... if all the submitted + // settings are the same we look for a dependency of "All options". This allows + // for situations where for example changing permissions for all options to the + // same setting (e.g. 'unset' or 'no') could lead to forum view permissions being + // changed to 'unset'. When all options do not have the same setting we lookup + // dependencies for the given range of options and settings and those where + // "Any option" has been specified for the current range of settings - } - $db->sql_freeresult($result); - - //print_r($auth_settings); + // No dependencies exist or we've already shown 'em ... so now + // we go ahead and update the permission sets + echo "DONE"; + exit; - //echo "HERE :: UPDATE ACLS"; -/* - // Admin wants subforums to inherit permissions ... so handle this - if (!empty($_POST['inherit'])) - { - array_push($_POST['inherit'], $forum_id); - $forum_id = $_POST['inherit']; - } + // If we are submitting with dependencies first we set the original options + if (isset($_POST['skipdeps'])) + { + foreach ($ug_data as $id) + { + $auth_admin->acl_set($ug_type, $forum_id_deps, $id, $auth_settings_deps); + } + } + unset($auth_settings_deps); + unset($forum_id_deps); - foreach ($ug_data as $id) - { - $auth_admin->acl_set($ug_type, $forum_id, $id, $auth_settings); - } + // Admin wants subforums to inherit permissions ... so handle this + if (!empty($_POST['inherit'])) + { + array_push($_POST['inherit'], $forum_id); + $forum_id = $_POST['inherit']; + } - cache_moderators(); + // This will be either the submitted dependencies or the "original" options + // dependending on whether any dependencies existed and were submitted + if (empty($_POST['skipdeps'])) + { + foreach ($ug_data as $id) + { + $auth_admin->acl_set($ug_type, $forum_id, $id, $auth_settings); + } + } - trigger_error($user->lang['AUTH_UPDATED']); -*/ + cache_moderators(); - } + trigger_error($user->lang['AUTH_UPDATED']); break; case 'delete': echo "HERE :: DELETE"; exit; - switch ($mode) +/* + $option_ids = false; + if (!empty($settings) { - case 'deps': - break; + $sql = "SELECT auth_option_id + FROM " . ACL_OPTIONS_TABLE . " + WHERE auth_option LIKE '" . $settings['option'] . "_%'"; + $result = $db->sql_query($sql); - default: -/* $option_ids = false; - if (!empty($settings) + if ($row = $db->sql_fetchrow($result)) + { + $option_ids = array(); + do { - $sql = "SELECT auth_option_id - FROM " . ACL_OPTIONS_TABLE . " - WHERE auth_option LIKE '" . $settings['option'] . "_%'"; - $result = $db->sql_query($sql); - - if ($row = $db->sql_fetchrow($result)) - { - $option_ids = array(); - do - { - $option_ids[] = $row['auth_option_id']; - } - while($row = $db->sql_fetchrow($result)); - } - $db->sql_freeresult($result); + $option_ids[] = $row['auth_option_id']; } + while($row = $db->sql_fetchrow($result)); + } + $db->sql_freeresult($result); + } - foreach ($_POST['ug_id'] as $id) - { - $auth_admin->acl_delete($_POST['type'], $forum_id, $id, $option_ids); - } + foreach ($_POST['ug_id'] as $id) + { + $auth_admin->acl_delete($_POST['type'], $forum_id, $id, $option_ids); + } - cache_moderators(); + cache_moderators(); - trigger_error($user->lang['AUTH_UPDATED']);*/ - break; - } + trigger_error($user->lang['AUTH_UPDATED']); +*/ break; case 'presetsave': @@ -379,7 +321,7 @@ page_header($l_title); // First potential form ... this is for selecting forums, users // or groups. -if (($mode == 'user' || $mode == 'group' || $mode == 'forum' || $mode == 'mod') && empty($submit)) +if (in_array($mode, array('user', 'group', 'forum', 'mod')) && empty($submit)) { ?> @@ -404,7 +346,7 @@ if (($mode == 'user' || $mode == 'group' || $mode == 'forum' || $mode == 'mod') <tr> <td class="row1" align="center"> <select name="f"><?php echo - make_forum_select(); + make_forum_select(); ?></select> <input type="submit" name="submit_usergroups" value="<?php echo $user->lang['LOOK_UP_FORUM']; ?>" class="mainoption" /><input type="hidden" name="ug_type" value="forum" /><input type="hidden" name="action" value="usergroups" /> </td> </tr> @@ -413,6 +355,7 @@ if (($mode == 'user' || $mode == 'group' || $mode == 'forum' || $mode == 'mod') break; case 'user': + ?> <tr> <th align="center"><?php echo $user->lang['LOOK_UP_USER']; ?></th> @@ -466,11 +409,20 @@ if (($mode == 'user' || $mode == 'group' || $mode == 'forum' || $mode == 'mod') // Second possible form, this lists the currently enabled // users/groups for the given mode -if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($submit) && in_array($mode, array('admin', 'supermod')))) +if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || ($submit != 'options' && empty($submode) && in_array($mode, array('admin', 'supermod')))) { - - // Define appropriate SQL for linking on forums - $sql_forum = (is_array($forum_id)) ? ' IN (' . implode(', ', $forum_id) . ') ' : ' = ' . $forum_id; + // Generate list of forum id's + $s_forum_id = ''; + foreach ($forum_id as $forum_submode => $forum_submode_ids) + { + foreach ($forum_submode_ids as $submode_forum_id) + { + $s_forum_id .= '<input type="hidden" name="f[' . $forum_submode . '][]" value="' . $submode_forum_id . '" />'; + } + } + unset($forum_submode_ids); + unset($forum_submode); + unset($submode_forum_id); ?> @@ -490,7 +442,7 @@ if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($subm FROM " . USERS_TABLE . " u, " . ACL_USERS_TABLE . " a, " . ACL_OPTIONS_TABLE . " o WHERE o.auth_option LIKE '" . $sql_option_mode . "_%' AND a.auth_option_id = o.auth_option_id - AND a.forum_id $sql_forum + AND a.forum_id IN ($sql_forum_id) AND u.user_id = a.user_id ORDER BY u.username, u.user_regdate ASC"; $result = $db->sql_query($sql); @@ -510,7 +462,7 @@ if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($subm <td class="row1" align="center"><select style="width:280px" name="ug_data[]" multiple="multiple" size="5"><?php echo $users; ?></select></td> </tr> <tr> - <td class="cat" align="center"><input class="liteoption" type="submit" name="submit_delete" value="<?php echo $user->lang['DELETE']; ?>" /> <input class="liteoption" type="submit" name="submit_options" value="<?php echo $user->lang['SET_OPTIONS']; ?>" /><input type="hidden" name="ug_type" value="user" /><input type="hidden" name="f" value="<?php echo $forum_id; ?>" /></td> + <td class="cat" align="center"><input class="liteoption" type="submit" name="submit_delete" value="<?php echo $user->lang['DELETE']; ?>" /> <input class="liteoption" type="submit" name="submit_options" value="<?php echo $user->lang['SET_OPTIONS']; ?>" /><input type="hidden" name="ug_type" value="user" /><?php echo $s_forum_id; ?></td> </tr> </table></form></td> @@ -520,7 +472,7 @@ if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($subm $sql = "SELECT DISTINCT g.group_id, g.group_name FROM " . GROUPS_TABLE . " g, " . ACL_GROUPS_TABLE . " a, " . ACL_OPTIONS_TABLE . " o WHERE o.auth_option LIKE '" . $sql_option_mode . "_%' - AND a.forum_id $sql_forum + AND a.forum_id IN ($sql_forum_id) AND a.auth_option_id = o.auth_option_id AND g.group_id = a.group_id ORDER BY g.group_type DESC, g.group_name ASC"; @@ -553,7 +505,7 @@ if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($subm <td class="row1" align="center"><select style="width:280px" name="ug_data[]" multiple="multiple" size="5"><?php echo $groups; ?></select></td> </tr> <tr> - <td class="cat" align="center"><input class="liteoption" type="submit" name="submit_delete" value="<?php echo $user->lang['DELETE']; ?>" /> <input class="liteoption" type="submit" name="submit_options" value="<?php echo $user->lang['SET_OPTIONS']; ?>" /><input type="hidden" name="ug_type" value="group" /><input type="hidden" name="f" value="<?php echo $forum_id; ?>" /></td> + <td class="cat" align="center"><input class="liteoption" type="submit" name="submit_delete" value="<?php echo $user->lang['DELETE']; ?>" /> <input class="liteoption" type="submit" name="submit_options" value="<?php echo $user->lang['SET_OPTIONS']; ?>" /><input type="hidden" name="ug_type" value="group" /><?php echo $s_forum_id; ?></td> </tr> </table></form></td> @@ -568,7 +520,7 @@ if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($subm <td class="row1" align="center"><textarea cols="40" rows="4" name="ug_data[]"></textarea></td> </tr> <tr> - <td class="cat" align="center"> <input type="submit" name="submit_options" value="<?php echo $user->lang['SUBMIT']; ?>" class="mainoption" /> <input type="reset" value="<?php echo $user->lang['RESET']; ?>" class="liteoption" /> <input type="submit" name="usersubmit" value="<?php echo $user->lang['FIND_USERNAME']; ?>" class="liteoption" onclick="window.open('<?php echo "../memberlist.$phpEx$SID"; ?>&mode=searchuser&form=2&field=entries', '_phpbbsearch', 'HEIGHT=500,resizable=yes,scrollbars=yes,WIDTH=740');return false;" /><input type="hidden" name="ug_type" value="user" /><input type="hidden" name="f" value="<?php echo $forum_id; ?>" /></td> + <td class="cat" align="center"> <input type="submit" name="submit_options" value="<?php echo $user->lang['SUBMIT']; ?>" class="mainoption" /> <input type="reset" value="<?php echo $user->lang['RESET']; ?>" class="liteoption" /> <input type="submit" name="usersubmit" value="<?php echo $user->lang['FIND_USERNAME']; ?>" class="liteoption" onclick="window.open('<?php echo "../memberlist.$phpEx$SID"; ?>&mode=searchuser&form=2&field=entries', '_phpbbsearch', 'HEIGHT=500,resizable=yes,scrollbars=yes,WIDTH=740');return false;" /><input type="hidden" name="ug_type" value="user" /><?php echo $s_forum_id; ?></td> </tr> </table></form></td> @@ -580,7 +532,7 @@ if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($subm <td class="row1" align="center"><select name="ug_data[]" multiple="multiple" size="4"><?php echo $group_list; ?></select></td> </tr> <tr> - <td class="cat" align="center"> <input type="submit" name="submit_options" value="<?php echo $user->lang['SUBMIT']; ?>" class="mainoption" /> <input type="reset" value="<?php echo $user->lang['RESET']; ?>" class="liteoption" /><input type="hidden" name="ug_type" value="group" /><input type="hidden" name="f" value="<?php echo $forum_id; ?>" /></td> + <td class="cat" align="center"> <input type="submit" name="submit_options" value="<?php echo $user->lang['SUBMIT']; ?>" class="mainoption" /> <input type="reset" value="<?php echo $user->lang['RESET']; ?>" class="liteoption" /><input type="hidden" name="ug_type" value="group" /><?php echo $s_forum_id; ?></td> </tr> </table></form></td> </tr> @@ -592,25 +544,28 @@ if ((in_array($submit, array('usergroups', 'delete', 'cancel'))) || (empty($subm // End user and group acl selections + + + + // Third possible form, this is the major section of this script. It // handles the entry of permission options for all situations -if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || $mode == 'deps') +if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || !empty($submode)) { - if (!isset($forum_id) && empty($ug_data) && $mode != 'deps') + if (!isset($forum_id) && empty($ug_data)) { trigger_error($user->lang['NO_MODE']); } // Grab the forum details if non-zero forum_id - if ($forum_id != 0) + if (!in_array(0, $forum_id[$which_mode])) { $forum_data = array(); $sql = 'SELECT forum_id, forum_name, parent_id - FROM ' . FORUMS_TABLE . ' - WHERE forum_id'; - $sql .= (is_array($forum_id)) ? ' IN (' . implode(', ', $forum_id) . ')' : ' = ' . $forum_id; + FROM ' . FORUMS_TABLE . " + WHERE forum_id IN ($sql_forum_id)"; $result = $db->sql_query($sql); if (!($forum_data = $db->sql_fetchrow($result))) @@ -623,54 +578,51 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || // Grab relevant user or group information $ug_ids = $ug_names = $ug_hidden = ''; - if ($mode != 'deps') + $l_no_error = ''; + switch ($ug_type) { - $l_no_error = ''; - switch ($ug_type) - { - case 'user': - $l_no_error = $user->lang['NO_USER']; - $sql = 'SELECT user_id AS id, username AS name - FROM ' . USERS_TABLE . ' - WHERE user_id'; - $sql .= (is_array($ug_data)) ? ' IN (' . implode(', ', $ug_data) . ')' : ' = ' . $ug_data; - break; + case 'user': + $l_no_error = $user->lang['NO_USER']; + $sql = 'SELECT user_id AS id, username AS name + FROM ' . USERS_TABLE . ' + WHERE user_id'; + $sql .= (is_array($ug_data)) ? ' IN (' . implode(', ', $ug_data) . ')' : ' = ' . $ug_data; + break; - case 'username': - $l_no_error = $user->lang['NO_USER']; - $sql = 'SELECT user_id AS id, username AS name - FROM ' . USERS_TABLE . ' - WHERE username'; - $sql .= (is_array($ug_data)) ? ' IN (' . implode(', ', preg_replace('#^[\s]*?(.*?)[\s]*?$#', "'\\1'", $ug_data)) . ')' : ' = ' . "'" . trim($ug_data) . "'"; - break; + case 'username': + $l_no_error = $user->lang['NO_USER']; + $sql = 'SELECT user_id AS id, username AS name + FROM ' . USERS_TABLE . ' + WHERE username'; + $sql .= (is_array($ug_data)) ? ' IN (' . implode(', ', preg_replace('#^[\s]*?(.*?)[\s]*?$#', "'\\1'", $ug_data)) . ')' : ' = ' . "'" . trim($ug_data) . "'"; + break; - case 'group': - $l_no_error = $user->lang['NO_GROUP']; - $sql = 'SELECT group_id AS id, group_name AS name - FROM ' . GROUPS_TABLE . ' - WHERE group_id'; - $sql .= (is_array($ug_data)) ? ' IN (' . implode(', ', $ug_data) . ')' : ' = ' . $ug_data; - break; - } - $result = $db->sql_query($sql); + case 'group': + $l_no_error = $user->lang['NO_GROUP']; + $sql = 'SELECT group_id AS id, group_name AS name + FROM ' . GROUPS_TABLE . ' + WHERE group_id'; + $sql .= (is_array($ug_data)) ? ' IN (' . implode(', ', $ug_data) . ')' : ' = ' . $ug_data; + break; + } + $result = $db->sql_query($sql); - if (!$row = $db->sql_fetchrow($result)) - { - trigger_error($l_no_error); - } - unset($l_no_error); - unset($ug_data); + if (!$row = $db->sql_fetchrow($result)) + { + trigger_error($l_no_error); + } + unset($l_no_error); + unset($ug_data); - // Store the user_ids and names for later use - do - { - $ug_names .= (($ug_names != '') ? ', ' : '') . $row['name']; - $ug_ids .= (($ug_ids != '') ? ', ' : '') . $row['id']; - $ug_hidden .= '<input type="hidden" name="ug_data[]" value="' . $row['id'] . '" />'; - } - while ($row = $db->sql_fetchrow($result)); - $db->sql_freeresult($result); + // Store the user_ids and names for later use + do + { + $ug_names .= (($ug_names != '') ? ', ' : '') . $row['name']; + $ug_ids .= (($ug_ids != '') ? ', ' : '') . $row['id']; + $ug_hidden .= '<input type="hidden" name="ug_data[]" value="' . $row['id'] . '" />'; } + while ($row = $db->sql_fetchrow($result)); + $db->sql_freeresult($result); // Grab the list of options ... if we're in deps mode we want all options, @@ -778,66 +730,77 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || // If we aren't looking @ deps then we try and grab existing sessions for // the given forum and user/group - if ($mode != 'deps' && $auth_settings == '') + if (empty($auth_settings[$which_mode])) { - switch ($ug_type) + if ($which_mode == $mode) { - case 'group': - $sql_table = ACL_GROUPS_TABLE . ' a '; - $sql_join = 'a.group_id'; - break; + switch ($ug_type) + { + case 'group': + $sql_table = ACL_GROUPS_TABLE . ' a '; + $sql_join = 'a.group_id'; + break; - case 'user': - $sql_table = ACL_USERS_TABLE . ' a, '; - $sql_join = 'a.user_id';; - break; - } - - $sql_forum = (is_array($forum_id)) ? ' IN (' . implode(', ', $forum_id) . ')' : ' = ' . $forum_id; - $sql = "SELECT o.auth_option, MIN(a.auth_setting) AS min_auth_setting - FROM $sql_table, " . ACL_OPTIONS_TABLE . " o - WHERE o.auth_option LIKE '" . $sql_option_mode . "_%' - AND a.auth_option_id = o.auth_option_id - AND a.forum_id $sql_forum - AND $sql_join IN ($ug_ids) - GROUP BY o.auth_option"; - $result = $db->sql_query($sql); + case 'user': + $sql_table = ACL_USERS_TABLE . ' a, '; + $sql_join = 'a.user_id';; + break; + } + + $sql = "SELECT o.auth_option, MIN(a.auth_setting) AS min_auth_setting + FROM $sql_table, " . ACL_OPTIONS_TABLE . " o + WHERE o.auth_option LIKE '" . $sql_option_mode . "_%' + AND a.auth_option_id = o.auth_option_id + AND a.forum_id IN ($sql_forum_id) + AND $sql_join IN ($ug_ids) + GROUP BY o.auth_option"; + $result = $db->sql_query($sql); - $auth_settings = array(); - while ($row = $db->sql_fetchrow($result)) + $auth_settings[$which_mode] = array(); + while ($row = $db->sql_fetchrow($result)) + { + $auth_settings[$which_mode][$row['auth_option']] = $row['min_auth_setting']; + } + $db->sql_freeresult($result); + } + else { - $auth_settings[$row['auth_option']] = $row['min_auth_setting']; + // We're looking at a view ... so we'll set all options to ignore + // We could be a little more clever here but the "safe side" looks + // better right now + $auth_settings[$which_mode] = array(); + foreach ($auth_options as $option) + { + $auth_settings[$which_mode][$option['auth_option']] = -1; + } } - $db->sql_freeresult($result); } - else if ($mode == 'deps') + + // Should we display a dropdown for views? + $view_options = ''; + if (in_array($mode, array('admin', 'supermod', 'mod'))) { - $sql_forum = (is_array($forum_id)) ? ' IN (' . implode(', ', $forum_id) . ')' : ' = ' . $forum_id; - $sql_auth_option = (preg_match('#^[a-z]_$#', $auth_option)) ? " LIKE '$auth_option%'" : " IN ('" . $auth_option . "', '$sql_option_mode')"; - $sql = "SELECT auth_deps - FROM " . ACL_DEPS_TABLE . " - WHERE auth_option $sql_auth_option - AND forum_id $sql_forum - AND auth_setting = $auth_setting"; - $result = $db->sql_query($sql); + $view_options .= '<option value="-1">Select view</option>'; + $view_options .= (!empty($submode) && $mode != $submode) ? '<option value="' . $mode . '">' . $user->lang['ACL_VIEW_' . strtoupper($mode)] . '</option>' : ''; + $view_ary = array( + 'admin' => array('forum' => 'a_auth', 'mod' => 'a_modauth', 'supermod' => 'a_modauth'), + 'supermod' => array('forum' => 'a_auth'), + 'mod' => array('forum' => 'a_auth') + ); - $auth_settings = (!isset($auth_settings)) ? array() : $auth_settings; - while ($row = $db->sql_fetchrow($result)) + foreach ($view_ary[$mode] as $which_submode => $which_acl) { - $temp = unserialize($row['auth_deps']); - foreach ($temp as $option => $setting) + if ($auth->acl_get($which_acl)) { - $auth_settings[$option] = (!isset($auth_settings[$option]) || $setting < $auth_settings[$option]) ? $setting : $auth_settings[$option]; + $view_options .= '<option value="' . $which_submode . '"' . (($which_submode == $submode) ? ' selected="selected"' : '') . '>' . $user->lang['ACL_VIEW_' . strtoupper($which_submode)] . '</option>'; } - } - $db->sql_freeresult($result); - unset($temp); - unset($option); - unset($setting); - unset($sql_auth_option); + } + unset($view_ary); } +// print_r($auth_settings); + ?> <script language="Javascript" type="text/javascript"> @@ -885,6 +848,11 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || elem.checked = true; break; + case 'all_ignore': + if (elem.value == -1) + elem.checked = true; + break; + default: option_name = elem.name.substr(9, elem.name.length - 10); @@ -919,118 +887,33 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || //--> </script> +<p><?php echo $user->lang['ACL_EXPLAIN']; ?></p> + <h1><?php echo $l_title; ?></h1> <p><?php echo $l_title_explain; ?></p> +<form method="post" name="acl" action="<?php echo "admin_permissions.$phpEx$SID&mode=$mode&submode=$submode"; ?>"><table cellspacing="2" cellpadding="0" border="0" align="center"> <?php - if ($submit == 'update') - { - -?> -<h1 style="color:red">Warning!</h1> - -<p>A number of dependencies have been set for the changes you have requested. You can skip setting these dependences if you wish by clicking the appropriate checkbox. You can also modify the dependencies as required. Clicking update will commit your previous setting changes and those listed below (unless you choose to skip them).</p> - -<?php - - } - -?> - -<form method="post" name="acl" action="<?php echo "admin_permissions.$phpEx$SID&mode=$mode"; ?>"><table cellspacing="2" cellpadding="0" border="0" align="center"> -<?php - - // The above query grabs the list of options for the required mode ... - // however for the deps system we need to grab the set of options for - // which dependencies are to be set + // This is the main listing of options // We output this for both deps and when update is requested where // deps exist - if ($mode == 'deps' || $submit == 'update') + if (($mode == 'admin' || $mode == 'supermod') && in_array($submode, array('forum', 'mod'))) { ?> <tr> - <td align="right"><form method="post" action="<?php echo "admin_permissions.$phpEx$SID&mode=$mode"; ?>"><table class="bg" width="100%" cellspacing="1" cellpadding="4" border="0"> + <td colspan="2" align="right"><table class="bg" width="100%" cellspacing="1" cellpadding="4" border="0"> <tr> <th colspan="2"> </th> </tr> -<?php - - } - - if ($mode == 'deps') - { - // Turn auth_options array above into the dep_auth_options list - $dep_auth_options = $dep_auth_values = $dep_auth_forums = ''; - foreach ($auth_options as $option) - { - $dep_auth_options .= '<option value="' . $option['auth_option'] . '"' . (($option['auth_option'] == $auth_option) ? ' selected="selected"' : '') . '>' . ((!empty($user->lang['acl_' . $option['auth_option']])) ? $user->lang['acl_' . $option['auth_option']] : (($option['auth_option'] == $sql_option_mode . '_') ? 'Any option' : ucfirst(preg_replace('#.*?_#', '', $option['auth_option'])))) . '</option>'; - } - unset($auth_options); - unset($option); - - - // Define the Yes, No, Unset selections - $values = array(ACL_NO => $user->lang['NO'], ACL_YES => $user->lang['YES'], ACL_UNSET => $user->lang['UNSET']); - foreach ($values as $value => $option) - { - $dep_auth_values .= '<option value="' . $value . '"' . (($value === $auth_setting) ? ' selected="selected"' : '') . '>' . $option . '</option>'; - } - unset($values); - unset($option); - - - // We've grabbed the list of options for this mode now we need to - // grab the list of options we can set dependencies for - $founder_sql = ($user->data['user_founder']) ? ' AND founder_only <> 1' : ''; - $sql = "SELECT auth_option - FROM " . ACL_OPTIONS_TABLE . " - WHERE auth_option LIKE 'f_%' - AND auth_option <> 'f_' - $founder_sql"; - $result = $db->sql_query($sql); - - $auth_options = array(); - while ($row = $db->sql_fetchrow($result)) - { - $auth_options[] = $row; - } - $db->sql_freeresult($result); - -?> - <tr> - <td class="row1" width="150">Changing option:</td> - <td class="row2"><select name="option" onchange="this.form.submit()"><?php echo $dep_auth_options; ?></select></td> - </tr> - <tr> - <td class="row1" width="150">To value:</td> - <td class="row2"><select name="setting" onchange="this.form.submit()"><option value="0"<?php - - echo ($dep_value == 0) ? ' selected="selected"' : ''; - -?>>Choose value</option><?php echo $dep_auth_values; ?></select></td> - </tr> -<?php - - unset($dep_auth_options); - unset($dep_auth_values); - - } - - // We output this for both deps and when update is requested where - // deps exist - if ($mode == 'deps' || $submit == 'update') - { - -?> <tr> <td class="row1" width="150">Will set options in: <br /><span class="gensmall"></span></td> - <td class="row2"><select name="f[]" multiple="4" onchange="this.form.submit()"><?php + <td class="row2"><select name="f[<?php echo $which_mode; ?>][]" multiple="4" onchange="this.form.submit()"><?php - echo make_forum_select($forum_id, false); + echo make_forum_select($forum_id[$which_mode], false); ?></select></td> </tr> @@ -1038,30 +921,52 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || </tr> <?php - unset($dep_forum_options); - } // End deps output - - // This is the main listing of options - ?> <tr> + <td align="left"><?php + + $colspan = 4; + if ($view_options != '') + { + $colspan = 5; + +?><select name="submode" onchange="if (this.options[this.selectedIndex].value != -1) this.form.submit();"><?php echo $view_options; ?></select><?php + + } + +?></td> <td align="right"><?php echo $user->lang['PRESETS']; ?>: <select name="set" onchange="use_preset(this.options[this.selectedIndex].value);"><option class="sep"><?php echo $user->lang['SELECT'] . ' ->'; ?></option><option value="all_yes"><?php echo $user->lang['ALL_YES']; ?></option><option value="all_no"><?php echo $user->lang['ALL_NO']; ?></option><option value="all_unset"><?php echo $user->lang['ALL_UNSET']; ?></option><?php + if ($which_mode != $mode) + { + echo '<option value="all_ignore">All Ignore</option>'; + } + echo ($preset_options) ? '<option class="sep">' . $user->lang['USER_PRESETS'] . ' ->' . '</option>' . $preset_options : ''; ?></select></td> - </tr> - <tr> - <td><table class="bg" width="100%" cellspacing="1" cellpadding="4" border="0" align="center"> - <tr> - <th> <?php echo $user->lang['OPTION']; ?> </th> - <th width="50"> <?php echo $user->lang['YES']; ?> </th> - <th width="50"> <?php echo $user->lang['NO']; ?> </th> - <th width="50"> <?php echo $user->lang['UNSET']; ?> </th> - </tr> + </tr> + <tr> + <td colspan="2"><table class="bg" width="100%" cellspacing="1" cellpadding="4" border="0" align="center"> + <tr> + <th> <?php echo $user->lang['OPTION']; ?> </th> + <th width="50"> <?php echo $user->lang['YES']; ?> </th> + <th width="50"> <?php echo $user->lang['UNSET']; ?> </th> + <th width="50"> <?php echo $user->lang['NO']; ?> </th><?php + + if ($which_mode != $mode) + { + +?> + <th width="50"> <?php echo 'Ignore';?> </th><?php + + } + +?> + </tr> <?php for($i = 0; $i < sizeof($auth_options); $i++) @@ -1070,44 +975,44 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || // Try and output correct language strings, else output prettyfied auth_option $l_auth_option = (!empty($user->lang['acl_' . $auth_options[$i]['auth_option']])) ? $user->lang['acl_' . $auth_options[$i]['auth_option']] : ucfirst(preg_replace('#.*?_#', '', $auth_options[$i]['auth_option'])); + $s_auth_option = '[' . $which_mode . '][' . $auth_options[$i]['auth_option'] . ']'; // Which option should we select? - $selected_yes = (isset($auth_settings[$auth_options[$i]['auth_option']]) && $auth_settings[$auth_options[$i]['auth_option']] == ACL_YES) ? ' checked="checked"' : ''; - $selected_no = (isset($auth_settings[$auth_options[$i]['auth_option']]) && $auth_settings[$auth_options[$i]['auth_option']] == ACL_NO) ? ' checked="checked"' : ''; - $selected_unset = (!isset($auth_settings[$auth_options[$i]['auth_option']]) || $auth_settings[$auth_options[$i]['auth_option']] == ACL_UNSET) ? ' checked="checked"' : ''; + $selected_yes = (isset($auth_settings[$which_mode][$auth_options[$i]['auth_option']]) && $auth_settings[$which_mode][$auth_options[$i]['auth_option']] == ACL_YES) ? ' checked="checked"' : ''; + $selected_no = (isset($auth_settings[$which_mode][$auth_options[$i]['auth_option']]) && $auth_settings[$which_mode][$auth_options[$i]['auth_option']] == ACL_NO) ? ' checked="checked"' : ''; + $selected_unset = (!isset($auth_settings[$which_mode][$auth_options[$i]['auth_option']]) || $auth_settings[$which_mode][$auth_options[$i]['auth_option']] == ACL_UNSET) ? ' checked="checked"' : ''; + $selected_ignore = (isset($auth_settings[$which_mode][$auth_options[$i]['auth_option']]) && $auth_settings[$which_mode][$auth_options[$i]['auth_option']] == -1) ? ' checked="checked"' : ''; +?> + <tr> + <td class="<?php echo $row_class; ?>" nowrap="nowrap"><?php echo $l_auth_option; ?> </td> - // Output dependency links? - $dep_x_yes = $dep_x_no = $dep_x_unset = $dep_x_open = $dep_x_close = ''; - if (in_array($mode, array('admin', 'supermod', 'mod')) && $auth->acl_get('a_deps') && $submit != 'update') - { - $dep_x_open = ' <a class="gensmall" style="vertical-align:top" href="javascript:open_win(\'' . "admin_permissions.$phpEx$SID&mode=deps&type=$mode&" . ((is_array($forum_id)) ? implode('&', preg_replace('#([0-9]+)#', 'f[]=\1', $forum_id)) : "f=$forum_id") . '&option=' . $auth_options[$i]['auth_option'] . "&setting="; - $dep_x_close = '\', 500, 500)" title="Set Dependency">X</a>'; + <td class="<?php echo $row_class; ?>" align="center"><input type="radio" name="settings<?php echo $s_auth_option ;?>" value="<?php echo ACL_YES; ?>"<?php echo $selected_yes; ?> /></td> - $dep_x_yes = $dep_x_open . ACL_YES . $dep_x_close; - $dep_x_no = $dep_x_open . ACL_NO . $dep_x_close; - $dep_x_unset = $dep_x_open . ACL_UNSET . $dep_x_close; - } + <td class="<?php echo $row_class; ?>" align="center"><input type="radio" name="settings<?php echo $s_auth_option ;?>" value="<?php echo ACL_UNSET; ?>"<?php echo $selected_unset; ?> /></td> + + <td class="<?php echo $row_class; ?>" align="center"><input type="radio" name="settings<?php echo $s_auth_option ;?>" value="<?php echo ACL_NO; ?>"<?php echo $selected_no; ?> /></td><?php + + if ($which_mode != $mode) + { ?> - <tr> - <td class="<?php echo $row_class; ?>" nowrap="nowrap"><?php echo $l_auth_option; ?> </td> + <td class="<?php echo $row_class; ?>" align="center"><input type="radio" name="settings<?php echo $s_auth_option ;?>" value="-1"<?php echo $selected_ignore; ?> /></td><?php - <td class="<?php echo $row_class; ?>" align="center"><input type="radio" name="settings[<?php echo $auth_options[$i]['auth_option']; ?>]" value="<?php echo ACL_YES; ?>"<?php echo $selected_yes; ?> /><?php echo $dep_x_yes; ?></td> + } - <td class="<?php echo $row_class; ?>" align="center"><input type="radio" name="settings[<?php echo $auth_options[$i]['auth_option']; ?>]" value="<?php echo ACL_NO; ?>"<?php echo $selected_no; ?> /><?php echo $dep_x_no; ?></td> +?> - <td class="<?php echo $row_class; ?>" align="center"><input type="radio" name="settings[<?php echo $auth_options[$i]['auth_option']; ?>]" value="<?php echo ACL_UNSET; ?>"<?php echo $selected_unset; ?> /><?php echo $dep_x_unset; ?></td> </tr> <?php } // Subforum inheritance - if (($sql_option_mode == 'f' || ($sql_option_mode == 'm' && $mode != 'supermod')) && $mode != 'deps' && $submit != 'update') + if (($sql_option_mode == 'f' || ($sql_option_mode == 'm' && $mode != 'supermod')) && empty($submode)) { - $children = get_forum_branch($forum_id, 'children', 'descending', false); + $children = get_forum_branch($forum_id[$which_mode], 'children', 'descending', false); if (!empty($children)) { @@ -1117,7 +1022,7 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || <th colspan="4"><?php echo $user->lang['ACL_SUBFORUMS']; ?></th> </tr> <tr> - <td class="row1" colspan="4"><table width="100%" cellspacing="1" cellpadding="0" border="0"> + <td class="row1" colspan="<?php echo $colspan; ?>"><table width="100%" cellspacing="1" cellpadding="0" border="0"> <tr> <td class="gensmall" colspan="4" height="16" align="center"><?php echo $user->lang['ACL_SUBFORUMS_EXPLAIN']; ?></td> </tr> @@ -1145,27 +1050,6 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || } } - - // Output "Skip dependencies" checkbox - if ($submit == 'update') - { - -?> - <tr> - <th colspan="4"><?php echo "Dependencies" ?></th> - </tr> - <tr> - <td class="row1" colspan="4"><table width="100%" cellspacing="1" cellpadding="0" border="0"> - <tr> - <td><input type="checkbox" name="skipdeps value="0" /> <?php echo "Skip these dependencies"; ?></td> - </tr> - </table></td> - </tr> -<?php - - } - - // Display event/cron radio buttons if ($auth->acl_gets('a_events', 'a_cron') && $mode != 'deps' && $submit != 'update') { @@ -1184,7 +1068,8 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || ?> <input type="radio" name="runas" value="evt" /> <?php echo $user->lang['RUN_AS_EVT']; - } + } + if ($auth->acl_get('a_cron')) { @@ -1202,7 +1087,37 @@ if (in_array($submit, array('options', 'presetsave', 'presetdel', 'update')) || ?> <tr> - <td class="cat" colspan="4" align="center"><input class="mainoption" type="submit" name="submit_update" value="<?php echo $user->lang['UPDATE']; ?>" /> <input class="liteoption" type="submit" name="submit_cancel" value="<?php echo $user->lang['CANCEL']; ?>" /><input type="hidden" name="ug_type" value="<?php echo $ug_type; ?>" /><?php echo $ug_hidden; ?><?php echo ($mode == 'deps') ? '<input type="hidden" name="type" value="' . $type . '" />' : '<input type="hidden" name="f" value="' . $forum_id . '" />'; ?></td> + <td class="cat" colspan="<?php echo $colspan; ?>" align="center"><input class="mainoption" type="submit" name="submit_update" value="<?php echo $user->lang['UPDATE']; ?>" /> <input class="liteoption" type="submit" name="submit_cancel" value="<?php echo $user->lang['CANCEL']; ?>" /><input type="hidden" name="ug_type" value="<?php echo $ug_type; ?>" /><?php echo $ug_hidden; ?><?php + + // Output list of forums + foreach ($forum_id as $forum_submode => $forum_submode_ids) + { + foreach ($forum_submode_ids as $submode_forum_id) + { + echo '<input type="hidden" name="f[' . $forum_submode . '][]" value="' . $submode_forum_id . '" />'; + } + } + unset($forum_submode_ids); + unset($forum_submode); + unset($submode_forum_id); + + // Output original settings ... needed when we jump views + foreach ($auth_settings as $auth_submode => $auth_submode_settings) + { + if ($auth_submode != $which_mode) + { + foreach ($auth_submode_settings as $submode_option => $submode_setting) + { + echo '<input type="hidden" name="settings[' . $auth_submode . '][' . $submode_option . ']" value="' . $submode_setting . '" />'; + } + } + } + unset($auth_submode); + unset($auth_submode_settings); + unset($auth_submode_option); + unset($auth_submode_setting); + +?></td> </tr> </table> |