home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 April (DVD) / PCWorld_2008-04_DVD.iso / temadvd / phpbb / phpBB-2.0.22.exe / phpBB2 / admin / admin_ug_auth.php < prev    next >
Encoding:
PHP Script  |  2006-12-19  |  31.3 KB  |  999 lines

  1. <?php
  2. /***************************************************************************
  3.  *                            admin_ug_auth.php
  4.  *                            -------------------
  5.  *   begin                : Saturday, Feb 13, 2001
  6.  *   copyright            : (C) 2001 The phpBB Group
  7.  *   email                : support@phpbb.com
  8.  *
  9.  *   $Id: admin_ug_auth.php,v 1.13.2.10 2005/09/14 18:14:29 acydburn Exp $
  10.  *
  11.  *
  12.  ***************************************************************************/
  13.  
  14. /***************************************************************************
  15.  *
  16.  *   This program is free software; you can redistribute it and/or modify
  17.  *   it under the terms of the GNU General Public License as published by
  18.  *   the Free Software Foundation; either version 2 of the License, or
  19.  *   (at your option) any later version.
  20.  *
  21.  ***************************************************************************/
  22.  
  23. define('IN_PHPBB', 1);
  24.  
  25. if( !empty($setmodules) )
  26. {
  27.     $filename = basename(__FILE__);
  28.     $module['Users']['Permissions'] = $filename . "?mode=user";
  29.     $module['Groups']['Permissions'] = $filename . "?mode=group";
  30.  
  31.     return;
  32. }
  33.  
  34. //
  35. // Load default header
  36. //
  37. $no_page_header = TRUE;
  38.  
  39. $phpbb_root_path = "./../";
  40. require($phpbb_root_path . 'extension.inc');
  41. require('./pagestart.' . $phpEx);
  42.  
  43. $params = array('mode' => 'mode', 'user_id' => POST_USERS_URL, 'group_id' => POST_GROUPS_URL, 'adv' => 'adv');
  44.  
  45. while( list($var, $param) = @each($params) )
  46. {
  47.     if ( !empty($HTTP_POST_VARS[$param]) || !empty($HTTP_GET_VARS[$param]) )
  48.     {
  49.         $$var = ( !empty($HTTP_POST_VARS[$param]) ) ? $HTTP_POST_VARS[$param] : $HTTP_GET_VARS[$param];
  50.     }
  51.     else
  52.     {
  53.         $$var = "";
  54.     }
  55. }
  56.  
  57. $user_id = intval($user_id);
  58. $group_id = intval($group_id);
  59. $adv = intval($adv);
  60. $mode = htmlspecialchars($mode);
  61.  
  62. //
  63. // Start program - define vars
  64. //
  65. $forum_auth_fields = array('auth_view', 'auth_read', 'auth_post', 'auth_reply', 'auth_edit', 'auth_delete', 'auth_sticky', 'auth_announce', 'auth_vote', 'auth_pollcreate');
  66.  
  67. $auth_field_match = array(
  68.     'auth_view' => AUTH_VIEW,
  69.     'auth_read' => AUTH_READ,
  70.     'auth_post' => AUTH_POST,
  71.     'auth_reply' => AUTH_REPLY,
  72.     'auth_edit' => AUTH_EDIT,
  73.     'auth_delete' => AUTH_DELETE,
  74.     'auth_sticky' => AUTH_STICKY,
  75.     'auth_announce' => AUTH_ANNOUNCE, 
  76.     'auth_vote' => AUTH_VOTE, 
  77.     'auth_pollcreate' => AUTH_POLLCREATE);
  78.  
  79. $field_names = array(
  80.     'auth_view' => $lang['View'],
  81.     'auth_read' => $lang['Read'],
  82.     'auth_post' => $lang['Post'],
  83.     'auth_reply' => $lang['Reply'],
  84.     'auth_edit' => $lang['Edit'],
  85.     'auth_delete' => $lang['Delete'],
  86.     'auth_sticky' => $lang['Sticky'],
  87.     'auth_announce' => $lang['Announce'], 
  88.     'auth_vote' => $lang['Vote'], 
  89.     'auth_pollcreate' => $lang['Pollcreate']);
  90.  
  91. // ---------------
  92. // Start Functions
  93. //
  94. function check_auth($type, $key, $u_access, $is_admin)
  95. {
  96.     $auth_user = 0;
  97.  
  98.     if( count($u_access) )
  99.     {
  100.         for($j = 0; $j < count($u_access); $j++)
  101.         {
  102.             $result = 0;
  103.             switch($type)
  104.             {
  105.                 case AUTH_ACL:
  106.                     $result = $u_access[$j][$key];
  107.  
  108.                 case AUTH_MOD:
  109.                     $result = $result || $u_access[$j]['auth_mod'];
  110.  
  111.                 case AUTH_ADMIN:
  112.                     $result = $result || $is_admin;
  113.                     break;
  114.             }
  115.  
  116.             $auth_user = $auth_user || $result;
  117.         }
  118.     }
  119.     else
  120.     {
  121.         $auth_user = $is_admin;
  122.     }
  123.  
  124.     return $auth_user;
  125. }
  126. //
  127. // End Functions
  128. // -------------
  129.  
  130. if ( isset($HTTP_POST_VARS['submit']) && ( ( $mode == 'user' && $user_id ) || ( $mode == 'group' && $group_id ) ) )
  131. {
  132.     $user_level = '';
  133.     if ( $mode == 'user' )
  134.     {
  135.         //
  136.         // Get group_id for this user_id
  137.         //
  138.         $sql = "SELECT g.group_id, u.user_level
  139.             FROM " . USER_GROUP_TABLE . " ug, " . USERS_TABLE . " u, " . GROUPS_TABLE . " g
  140.             WHERE u.user_id = $user_id 
  141.                 AND ug.user_id = u.user_id 
  142.                 AND g.group_id = ug.group_id 
  143.                 AND g.group_single_user = " . TRUE;
  144.         if ( !($result = $db->sql_query($sql)) )
  145.         {
  146.             message_die(GENERAL_ERROR, 'Could not select info from user/user_group table', '', __LINE__, __FILE__, $sql);
  147.         }
  148.  
  149.         $row = $db->sql_fetchrow($result);
  150.  
  151.         $group_id = $row['group_id'];
  152.         $user_level = $row['user_level'];
  153.  
  154.         $db->sql_freeresult($result);
  155.     }
  156.  
  157.     //
  158.     // Carry out requests
  159.     //
  160.     if ( $mode == 'user' && $HTTP_POST_VARS['userlevel'] == 'admin' && $user_level != ADMIN )
  161.     {
  162.         //
  163.         // Make user an admin (if already user)
  164.         //
  165.         if ( $userdata['user_id'] != $user_id )
  166.         {
  167.             $sql = "UPDATE " . USERS_TABLE . "
  168.                 SET user_level = " . ADMIN . "
  169.                 WHERE user_id = $user_id";
  170.             if ( !($result = $db->sql_query($sql)) )
  171.             {
  172.                 message_die(GENERAL_ERROR, 'Could not update user level', '', __LINE__, __FILE__, $sql);
  173.             }
  174.  
  175.             $sql = "DELETE FROM " . AUTH_ACCESS_TABLE . "
  176.                 WHERE group_id = $group_id 
  177.                     AND auth_mod = 0";
  178.             if ( !($result = $db->sql_query($sql)) )
  179.             {
  180.                 message_die(GENERAL_ERROR, "Couldn't delete auth access info", "", __LINE__, __FILE__, $sql);
  181.             }
  182.  
  183.             //
  184.             // Delete any entries in auth_access, they are not required if user is becoming an
  185.             // admin
  186.             //
  187.             $sql = "UPDATE " . AUTH_ACCESS_TABLE . "
  188.                 SET auth_view = 0, auth_read = 0, auth_post = 0, auth_reply = 0, auth_edit = 0, auth_delete = 0, auth_sticky = 0, auth_announce = 0
  189.                 WHERE group_id = $group_id"; 
  190.             if ( !($result = $db->sql_query($sql)) )
  191.             {
  192.                 message_die(GENERAL_ERROR, "Couldn't update auth access", "", __LINE__, __FILE__, $sql);
  193.             }
  194.         }
  195.  
  196.         $message = $lang['Auth_updated'] . '<br /><br />' . sprintf($lang['Click_return_userauth'], '<a href="' . append_sid("admin_ug_auth.$phpEx?mode=$mode") . '">', '</a>') . '<br /><br />' . sprintf($lang['Click_return_admin_index'], '<a href="' . append_sid("index.$phpEx?pane=right") . '">', '</a>');
  197.         message_die(GENERAL_MESSAGE, $message);
  198.     }
  199.     else
  200.     {
  201.         if ( $mode == 'user' && $HTTP_POST_VARS['userlevel'] == 'user' && $user_level == ADMIN )
  202.         {
  203.             //
  204.             // Make admin a user (if already admin) ... ignore if you're trying
  205.             // to change yourself from an admin to user!
  206.             //
  207.             if ( $userdata['user_id'] != $user_id )
  208.             {
  209.                 $sql = "UPDATE " . AUTH_ACCESS_TABLE . "
  210.                     SET auth_view = 0, auth_read = 0, auth_post = 0, auth_reply = 0, auth_edit = 0, auth_delete = 0, auth_sticky = 0, auth_announce = 0
  211.                     WHERE group_id = $group_id";
  212.                 if ( !($result = $db->sql_query($sql)) )
  213.                 {
  214.                     message_die(GENERAL_ERROR, 'Could not update auth access', '', __LINE__, __FILE__, $sql);
  215.                 }
  216.  
  217.                 //
  218.                 // Update users level, reset to USER
  219.                 //
  220.                 $sql = "UPDATE " . USERS_TABLE . "
  221.                     SET user_level = " . USER . "
  222.                     WHERE user_id = $user_id";
  223.                 if ( !($result = $db->sql_query($sql)) )
  224.                 {
  225.                     message_die(GENERAL_ERROR, 'Could not update user level', '', __LINE__, __FILE__, $sql);
  226.                 }
  227.             }
  228.  
  229.             $message = $lang['Auth_updated'] . '<br /><br />' . sprintf($lang['Click_return_userauth'], '<a href="' . append_sid("admin_ug_auth.$phpEx?mode=$mode") . '">', '</a>') . '<br /><br />' . sprintf($lang['Click_return_admin_index'], '<a href="' . append_sid("index.$phpEx?pane=right") . '">', '</a>');
  230.         }
  231.         else
  232.         {
  233.     
  234.             $change_mod_list = ( isset($HTTP_POST_VARS['moderator']) ) ? $HTTP_POST_VARS['moderator'] : false;
  235.  
  236.             if ( empty($adv) )
  237.             {
  238.                 $change_acl_list = ( isset($HTTP_POST_VARS['private']) ) ? $HTTP_POST_VARS['private'] : false;
  239.             }
  240.             else
  241.             {
  242.                 $change_acl_list = array();
  243.                 for($j = 0; $j < count($forum_auth_fields); $j++)
  244.                 {
  245.                     $auth_field = $forum_auth_fields[$j];
  246.  
  247.                     while( list($forum_id, $value) = @each($HTTP_POST_VARS['private_' . $auth_field]) )
  248.                     {
  249.                         $change_acl_list[$forum_id][$auth_field] = $value;
  250.                     }
  251.                 }
  252.             }
  253.  
  254.             $sql = 'SELECT f.* 
  255.                 FROM ' . FORUMS_TABLE . ' f, ' . CATEGORIES_TABLE . ' c
  256.                 WHERE f.cat_id = c.cat_id
  257.                 ORDER BY c.cat_order, f.forum_order';
  258.             if ( !($result = $db->sql_query($sql)) )
  259.             {
  260.                 message_die(GENERAL_ERROR, "Couldn't obtain forum information", "", __LINE__, __FILE__, $sql);
  261.             }
  262.  
  263.             $forum_access = array();
  264.             while( $row = $db->sql_fetchrow($result) )
  265.             {
  266.                 $forum_access[] = $row;
  267.             }
  268.             $db->sql_freeresult($result);
  269.  
  270.             $sql = ( $mode == 'user' ) ? "SELECT aa.* FROM " . AUTH_ACCESS_TABLE . " aa, " . USER_GROUP_TABLE . " ug, " . GROUPS_TABLE. " g WHERE ug.user_id = $user_id AND g.group_id = ug.group_id AND aa.group_id = ug.group_id AND g.group_single_user = " . TRUE : "SELECT * FROM " . AUTH_ACCESS_TABLE . " WHERE group_id = $group_id";
  271.             if ( !($result = $db->sql_query($sql)) )
  272.             {
  273.                 message_die(GENERAL_ERROR, "Couldn't obtain user/group permissions", "", __LINE__, __FILE__, $sql);
  274.             }
  275.  
  276.             $auth_access = array();
  277.             while( $row = $db->sql_fetchrow($result) )
  278.             {
  279.                 $auth_access[$row['forum_id']] = $row;
  280.             }
  281.             $db->sql_freeresult($result);
  282.  
  283.             $forum_auth_action = array();
  284.             $update_acl_status = array();
  285.             $update_mod_status = array();
  286.  
  287.             for($i = 0; $i < count($forum_access); $i++)
  288.             {
  289.                 $forum_id = $forum_access[$i]['forum_id'];
  290.  
  291.                 if ( 
  292.                     ( isset($auth_access[$forum_id]['auth_mod']) && $change_mod_list[$forum_id]['auth_mod'] != $auth_access[$forum_id]['auth_mod'] ) || 
  293.                     ( !isset($auth_access[$forum_id]['auth_mod']) && !empty($change_mod_list[$forum_id]['auth_mod']) ) 
  294.                 )
  295.                 {
  296.                     $update_mod_status[$forum_id] = $change_mod_list[$forum_id]['auth_mod'];
  297.  
  298.                     if ( !$update_mod_status[$forum_id] )
  299.                     {
  300.                         $forum_auth_action[$forum_id] = 'delete';
  301.                     }
  302.                     else if ( !isset($auth_access[$forum_id]['auth_mod']) )
  303.                     {
  304.                         $forum_auth_action[$forum_id] = 'insert';
  305.                     }
  306.                     else
  307.                     {
  308.                         $forum_auth_action[$forum_id] = 'update';
  309.                     }
  310.                 }
  311.  
  312.                 for($j = 0; $j < count($forum_auth_fields); $j++)
  313.                 {
  314.                     $auth_field = $forum_auth_fields[$j];
  315.  
  316.                     if( $forum_access[$i][$auth_field] == AUTH_ACL && isset($change_acl_list[$forum_id][$auth_field]) )
  317.                     {
  318.                         if ( ( empty($auth_access[$forum_id]['auth_mod']) && 
  319.                             ( isset($auth_access[$forum_id][$auth_field]) && $change_acl_list[$forum_id][$auth_field] != $auth_access[$forum_id][$auth_field] ) || 
  320.                             ( !isset($auth_access[$forum_id][$auth_field]) && !empty($change_acl_list[$forum_id][$auth_field]) ) ) ||
  321.                             !empty($update_mod_status[$forum_id])
  322.                         )
  323.                         {
  324.                             $update_acl_status[$forum_id][$auth_field] = ( !empty($update_mod_status[$forum_id]) ) ? 0 :  $change_acl_list[$forum_id][$auth_field];
  325.  
  326.                             if ( isset($auth_access[$forum_id][$auth_field]) && empty($update_acl_status[$forum_id][$auth_field]) && $forum_auth_action[$forum_id] != 'insert' && $forum_auth_action[$forum_id] != 'update' )
  327.                             {
  328.                                 $forum_auth_action[$forum_id] = 'delete';
  329.                             }
  330.                             else if ( !isset($auth_access[$forum_id][$auth_field]) && !( $forum_auth_action[$forum_id] == 'delete' && empty($update_acl_status[$forum_id][$auth_field]) ) )
  331.                             {
  332.                                 $forum_auth_action[$forum_id] = 'insert';
  333.                             }
  334.                             else if ( isset($auth_access[$forum_id][$auth_field]) && !empty($update_acl_status[$forum_id][$auth_field]) ) 
  335.                             {
  336.                                 $forum_auth_action[$forum_id] = 'update';
  337.                             }
  338.                         }
  339.                         else if ( ( empty($auth_access[$forum_id]['auth_mod']) && 
  340.                             ( isset($auth_access[$forum_id][$auth_field]) && $change_acl_list[$forum_id][$auth_field] == $auth_access[$forum_id][$auth_field] ) ) && $forum_auth_action[$forum_id] == 'delete' )
  341.                         {
  342.                             $forum_auth_action[$forum_id] = 'update';
  343.                         }
  344.                     }
  345.                 }
  346.             }
  347.  
  348.             //
  349.             // Checks complete, make updates to DB
  350.             //
  351.             $delete_sql = '';
  352.             while( list($forum_id, $action) = @each($forum_auth_action) )
  353.             {
  354.                 if ( $action == 'delete' )
  355.                 {
  356.                     $delete_sql .= ( ( $delete_sql != '' ) ? ', ' : '' ) . $forum_id;
  357.                 }
  358.                 else
  359.                 {
  360.                     if ( $action == 'insert' )
  361.                     {
  362.                         $sql_field = '';
  363.                         $sql_value = '';
  364.                         while ( list($auth_type, $value) = @each($update_acl_status[$forum_id]) )
  365.                         {
  366.                             $sql_field .= ( ( $sql_field != '' ) ? ', ' : '' ) . $auth_type;
  367.                             $sql_value .= ( ( $sql_value != '' ) ? ', ' : '' ) . $value;
  368.                         }
  369.                         $sql_field .= ( ( $sql_field != '' ) ? ', ' : '' ) . 'auth_mod';
  370.                         $sql_value .= ( ( $sql_value != '' ) ? ', ' : '' ) . ( ( !isset($update_mod_status[$forum_id]) ) ? 0 : $update_mod_status[$forum_id]);
  371.  
  372.                         $sql = "INSERT INTO " . AUTH_ACCESS_TABLE . " (forum_id, group_id, $sql_field) 
  373.                             VALUES ($forum_id, $group_id, $sql_value)";
  374.                     }
  375.                     else
  376.                     {
  377.                         $sql_values = '';
  378.                         while ( list($auth_type, $value) = @each($update_acl_status[$forum_id]) )
  379.                         {
  380.                             $sql_values .= ( ( $sql_values != '' ) ? ', ' : '' ) . $auth_type . ' = ' . $value;
  381.                         }
  382.                         $sql_values .= ( ( $sql_values != '' ) ? ', ' : '' ) . 'auth_mod = ' . ( ( !isset($update_mod_status[$forum_id]) ) ? 0 : $update_mod_status[$forum_id]);
  383.  
  384.                         $sql = "UPDATE " . AUTH_ACCESS_TABLE . " 
  385.                             SET $sql_values 
  386.                             WHERE group_id = $group_id 
  387.                                 AND forum_id = $forum_id";
  388.                     }
  389.                     if( !($result = $db->sql_query($sql)) )
  390.                     {
  391.                         message_die(GENERAL_ERROR, "Couldn't update private forum permissions", "", __LINE__, __FILE__, $sql);
  392.                     }
  393.                 }
  394.             }
  395.  
  396.             if ( $delete_sql != '' )
  397.             {
  398.                 $sql = "DELETE FROM " . AUTH_ACCESS_TABLE . " 
  399.                     WHERE group_id = $group_id 
  400.                         AND forum_id IN ($delete_sql)";
  401.                 if( !($result = $db->sql_query($sql)) )
  402.                 {
  403.                     message_die(GENERAL_ERROR, "Couldn't delete permission entries", "", __LINE__, __FILE__, $sql);
  404.                 }
  405.             }
  406.  
  407.             $l_auth_return = ( $mode == 'user' ) ? $lang['Click_return_userauth'] : $lang['Click_return_groupauth'];
  408.             $message = $lang['Auth_updated'] . '<br /><br />' . sprintf($l_auth_return, '<a href="' . append_sid("admin_ug_auth.$phpEx?mode=$mode") . '">', '</a>') . '<br /><br />' . sprintf($lang['Click_return_admin_index'], '<a href="' . append_sid("index.$phpEx?pane=right") . '">', '</a>');
  409.         }
  410.  
  411.         //
  412.         // Update user level to mod for appropriate users
  413.         // 
  414.         $sql = "SELECT u.user_id 
  415.             FROM " . AUTH_ACCESS_TABLE . " aa, " . USER_GROUP_TABLE . " ug, " . USERS_TABLE . " u  
  416.             WHERE ug.group_id = aa.group_id 
  417.                 AND u.user_id = ug.user_id 
  418.                 AND ug.user_pending = 0
  419.                 AND u.user_level NOT IN (" . MOD . ", " . ADMIN . ") 
  420.             GROUP BY u.user_id 
  421.             HAVING SUM(aa.auth_mod) > 0";
  422.         if ( !($result = $db->sql_query($sql)) )
  423.         {
  424.             message_die(GENERAL_ERROR, "Couldn't obtain user/group permissions", "", __LINE__, __FILE__, $sql);
  425.         }
  426.  
  427.         $set_mod = '';
  428.         while( $row = $db->sql_fetchrow($result) )
  429.         {
  430.             $set_mod .= ( ( $set_mod != '' ) ? ', ' : '' ) . $row['user_id'];
  431.         }
  432.         $db->sql_freeresult($result);
  433.  
  434.         //
  435.         // Update user level to user for appropriate users
  436.         // 
  437.         switch ( SQL_LAYER )
  438.         {
  439.             case 'postgresql':
  440.                 $sql = "SELECT u.user_id 
  441.                     FROM " . USERS_TABLE . " u, " . USER_GROUP_TABLE . " ug, " . AUTH_ACCESS_TABLE . " aa
  442.                     WHERE ug.user_id = u.user_id 
  443.                         AND aa.group_id = ug.group_id 
  444.                         AND u.user_level NOT IN (" . USER . ", " . ADMIN . ")
  445.                     GROUP BY u.user_id 
  446.                     HAVING SUM(aa.auth_mod) = 0 
  447.                     UNION (
  448.                         SELECT u.user_id  
  449.                         FROM " . USERS_TABLE . " u 
  450.                         WHERE NOT EXISTS ( 
  451.                             SELECT aa.auth_mod 
  452.                             FROM " . USER_GROUP_TABLE . " ug, " . AUTH_ACCESS_TABLE . " aa 
  453.                             WHERE ug.user_id = u.user_id 
  454.                                 AND aa.group_id = ug.group_id
  455.                         )
  456.                         AND u.user_level NOT IN (" . USER . ", " . ADMIN . ")  
  457.                         GROUP BY u.user_id
  458.                     )";
  459.                 break;
  460.             case 'oracle':
  461.                 $sql = "SELECT u.user_id 
  462.                     FROM " . USERS_TABLE . " u, " . USER_GROUP_TABLE . " ug, " . AUTH_ACCESS_TABLE . " aa 
  463.                     WHERE ug.user_id = u.user_id(+)
  464.                         AND aa.group_id = ug.group_id(+) 
  465.                         AND u.user_level NOT IN (" . USER . ", " . ADMIN . ")
  466.                     GROUP BY u.user_id 
  467.                     HAVING SUM(aa.auth_mod) = 0";
  468.                 break;
  469.             default:
  470.                 $sql = "SELECT u.user_id 
  471.                     FROM ( ( " . USERS_TABLE . " u  
  472.                     LEFT JOIN " . USER_GROUP_TABLE . " ug ON ug.user_id = u.user_id ) 
  473.                     LEFT JOIN " . AUTH_ACCESS_TABLE . " aa ON aa.group_id = ug.group_id ) 
  474.                     WHERE u.user_level NOT IN (" . USER . ", " . ADMIN . ")
  475.                     GROUP BY u.user_id 
  476.                     HAVING SUM(aa.auth_mod) = 0";
  477.                 break;
  478.         }
  479.         if ( !($result = $db->sql_query($sql)) )
  480.         {
  481.             message_die(GENERAL_ERROR, "Couldn't obtain user/group permissions", "", __LINE__, __FILE__, $sql);
  482.         }
  483.  
  484.         $unset_mod = "";
  485.         while( $row = $db->sql_fetchrow($result) )
  486.         {
  487.             $unset_mod .= ( ( $unset_mod != '' ) ? ', ' : '' ) . $row['user_id'];
  488.         }
  489.         $db->sql_freeresult($result);
  490.  
  491.         if ( $set_mod != '' )
  492.         {
  493.             $sql = "UPDATE " . USERS_TABLE . " 
  494.                 SET user_level = " . MOD . " 
  495.                 WHERE user_id IN ($set_mod)";
  496.             if( !($result = $db->sql_query($sql)) )
  497.             {
  498.                 message_die(GENERAL_ERROR, "Couldn't update user level", "", __LINE__, __FILE__, $sql);
  499.             }
  500.         }
  501.  
  502.         if ( $unset_mod != '' )
  503.         {
  504.             $sql = "UPDATE " . USERS_TABLE . " 
  505.                 SET user_level = " . USER . " 
  506.                 WHERE user_id IN ($unset_mod)";
  507.             if( !($result = $db->sql_query($sql)) )
  508.             {
  509.                 message_die(GENERAL_ERROR, "Couldn't update user level", "", __LINE__, __FILE__, $sql);
  510.             }
  511.         }
  512.  
  513.         $sql = 'SELECT user_id FROM ' . USER_GROUP_TABLE . "
  514.             WHERE group_id = $group_id";
  515.         $result = $db->sql_query($sql);
  516.  
  517.         $group_user = array();
  518.         while ($row = $db->sql_fetchrow($result))
  519.         {
  520.             $group_user[$row['user_id']] = $row['user_id'];
  521.         }
  522.         $db->sql_freeresult($result);
  523.  
  524.         $sql = "SELECT ug.user_id, COUNT(auth_mod) AS is_auth_mod 
  525.             FROM " . AUTH_ACCESS_TABLE . " aa, " . USER_GROUP_TABLE . " ug 
  526.             WHERE ug.user_id IN (" . implode(', ', $group_user) . ") 
  527.                 AND aa.group_id = ug.group_id 
  528.                 AND aa.auth_mod = 1
  529.             GROUP BY ug.user_id";
  530.         if ( !($result = $db->sql_query($sql)) )
  531.         {
  532.             message_die(GENERAL_ERROR, 'Could not obtain moderator status', '', __LINE__, __FILE__, $sql);
  533.         }
  534.  
  535.         while ($row = $db->sql_fetchrow($result))
  536.         {
  537.             if ($row['is_auth_mod'])
  538.             {
  539.                 unset($group_user[$row['user_id']]);
  540.             }
  541.         }
  542.         $db->sql_freeresult($result);
  543.  
  544.         if (sizeof($group_user))
  545.         {
  546.             $sql = "UPDATE " . USERS_TABLE . " 
  547.                 SET user_level = " . USER . " 
  548.                 WHERE user_id IN (" . implode(', ', $group_user) . ") AND user_level = " . MOD;
  549.             if ( !($result = $db->sql_query($sql)) )
  550.             {
  551.                 message_die(GENERAL_ERROR, 'Could not update user level', '', __LINE__, __FILE__, $sql);
  552.             }
  553.         }
  554.  
  555.         message_die(GENERAL_MESSAGE, $message);
  556.     }
  557. }
  558. else if ( ( $mode == 'user' && ( isset($HTTP_POST_VARS['username']) || $user_id ) ) || ( $mode == 'group' && $group_id ) )
  559. {
  560.     if ( isset($HTTP_POST_VARS['username']) )
  561.     {
  562.         $this_userdata = get_userdata($HTTP_POST_VARS['username'], true);
  563.         if ( !is_array($this_userdata) )
  564.         {
  565.             message_die(GENERAL_MESSAGE, $lang['No_such_user']);
  566.         }
  567.         $user_id = $this_userdata['user_id'];
  568.     }
  569.  
  570.     //
  571.     // Front end
  572.     //
  573.     $sql = "SELECT f.* 
  574.         FROM " . FORUMS_TABLE . " f, " . CATEGORIES_TABLE . " c
  575.         WHERE f.cat_id = c.cat_id
  576.         ORDER BY c.cat_order, f.forum_order ASC";
  577.     if ( !($result = $db->sql_query($sql)) )
  578.     {
  579.         message_die(GENERAL_ERROR, "Couldn't obtain forum information", "", __LINE__, __FILE__, $sql);
  580.     }
  581.  
  582.     $forum_access = array();
  583.     while( $row = $db->sql_fetchrow($result) )
  584.     {
  585.         $forum_access[] = $row;
  586.     }
  587.     $db->sql_freeresult($result);
  588.  
  589.     if( empty($adv) )
  590.     {
  591.         for($i = 0; $i < count($forum_access); $i++)
  592.         {
  593.             $forum_id = $forum_access[$i]['forum_id'];
  594.  
  595.             $forum_auth_level[$forum_id] = AUTH_ALL;
  596.  
  597.             for($j = 0; $j < count($forum_auth_fields); $j++)
  598.             {
  599.                 $forum_access[$i][$forum_auth_fields[$j]] . ' :: ';
  600.                 if ( $forum_access[$i][$forum_auth_fields[$j]] == AUTH_ACL )
  601.                 {
  602.                     $forum_auth_level[$forum_id] = AUTH_ACL;
  603.                     $forum_auth_level_fields[$forum_id][] = $forum_auth_fields[$j];
  604.                 }
  605.             }
  606.         }
  607.     }
  608.  
  609.     $sql = "SELECT u.user_id, u.username, u.user_level, g.group_id, g.group_name, g.group_single_user, ug.user_pending FROM " . USERS_TABLE . " u, " . GROUPS_TABLE . " g, " . USER_GROUP_TABLE . " ug WHERE ";
  610.     $sql .= ( $mode == 'user' ) ? "u.user_id = $user_id AND ug.user_id = u.user_id AND g.group_id = ug.group_id" : "g.group_id = $group_id AND ug.group_id = g.group_id AND u.user_id = ug.user_id";
  611.     if ( !($result = $db->sql_query($sql)) )
  612.     {
  613.         message_die(GENERAL_ERROR, "Couldn't obtain user/group information", "", __LINE__, __FILE__, $sql);
  614.     }
  615.     $ug_info = array();
  616.     while( $row = $db->sql_fetchrow($result) )
  617.     {
  618.         $ug_info[] = $row;
  619.     }
  620.     $db->sql_freeresult($result);
  621.  
  622.     $sql = ( $mode == 'user' ) ? "SELECT aa.*, g.group_single_user FROM " . AUTH_ACCESS_TABLE . " aa, " . USER_GROUP_TABLE . " ug, " . GROUPS_TABLE. " g WHERE ug.user_id = $user_id AND g.group_id = ug.group_id AND aa.group_id = ug.group_id AND g.group_single_user = 1" : "SELECT * FROM " . AUTH_ACCESS_TABLE . " WHERE group_id = $group_id";
  623.     if ( !($result = $db->sql_query($sql)) )
  624.     {
  625.         message_die(GENERAL_ERROR, "Couldn't obtain user/group permissions", "", __LINE__, __FILE__, $sql);
  626.     }
  627.  
  628.     $auth_access = array();
  629.     $auth_access_count = array();
  630.     while( $row = $db->sql_fetchrow($result) )
  631.     {
  632.         $auth_access[$row['forum_id']][] = $row; 
  633.         $auth_access_count[$row['forum_id']]++;
  634.     }
  635.     $db->sql_freeresult($result);
  636.  
  637.     $is_admin = ( $mode == 'user' ) ? ( ( $ug_info[0]['user_level'] == ADMIN && $ug_info[0]['user_id'] != ANONYMOUS ) ? 1 : 0 ) : 0;
  638.  
  639.     for($i = 0; $i < count($forum_access); $i++)
  640.     {
  641.         $forum_id = $forum_access[$i]['forum_id'];
  642.  
  643.         unset($prev_acl_setting);
  644.         for($j = 0; $j < count($forum_auth_fields); $j++)
  645.         {
  646.             $key = $forum_auth_fields[$j];
  647.             $value = $forum_access[$i][$key];
  648.  
  649.             switch( $value )
  650.             {
  651.                 case AUTH_ALL:
  652.                 case AUTH_REG:
  653.                     $auth_ug[$forum_id][$key] = 1;
  654.                     break;
  655.  
  656.                 case AUTH_ACL:
  657.                     $auth_ug[$forum_id][$key] = ( !empty($auth_access_count[$forum_id]) ) ? check_auth(AUTH_ACL, $key, $auth_access[$forum_id], $is_admin) : 0;
  658.                     $auth_field_acl[$forum_id][$key] = $auth_ug[$forum_id][$key];
  659.  
  660.                     if ( isset($prev_acl_setting) )
  661.                     {
  662.                         if ( $prev_acl_setting != $auth_ug[$forum_id][$key] && empty($adv) )
  663.                         {
  664.                             $adv = 1;
  665.                         }
  666.                     }
  667.  
  668.                     $prev_acl_setting = $auth_ug[$forum_id][$key];
  669.  
  670.                     break;
  671.  
  672.                 case AUTH_MOD:
  673.                     $auth_ug[$forum_id][$key] = ( !empty($auth_access_count[$forum_id]) ) ? check_auth(AUTH_MOD, $key, $auth_access[$forum_id], $is_admin) : 0;
  674.                     break;
  675.  
  676.                 case AUTH_ADMIN:
  677.                     $auth_ug[$forum_id][$key] = $is_admin;
  678.                     break;
  679.  
  680.                 default:
  681.                     $auth_ug[$forum_id][$key] = 0;
  682.                     break;
  683.             }
  684.         }
  685.  
  686.         //
  687.         // Is user a moderator?
  688.         //
  689.         $auth_ug[$forum_id]['auth_mod'] = ( !empty($auth_access_count[$forum_id]) ) ? check_auth(AUTH_MOD, 'auth_mod', $auth_access[$forum_id], 0) : 0;
  690.     }
  691.     
  692.     $i = 0;
  693.     @reset($auth_ug);
  694.     while( list($forum_id, $user_ary) = @each($auth_ug) )
  695.     {
  696.         if ( empty($adv) )
  697.         {
  698.             if ( $forum_auth_level[$forum_id] == AUTH_ACL )
  699.             {
  700.                 $allowed = 1;
  701.  
  702.                 for($j = 0; $j < count($forum_auth_level_fields[$forum_id]); $j++)
  703.                 {
  704.                     if ( !$auth_ug[$forum_id][$forum_auth_level_fields[$forum_id][$j]] )
  705.                     {
  706.                         $allowed = 0;
  707.                     }
  708.                 }
  709.  
  710.                 $optionlist_acl = '<select name="private[' . $forum_id . ']">';
  711.  
  712.                 if ( $is_admin || $user_ary['auth_mod'] )
  713.                 {
  714.                     $optionlist_acl .= '<option value="1">' . $lang['Allowed_Access'] . '</option>';
  715.                 }
  716.                 else if ( $allowed )
  717.                 {
  718.                     $optionlist_acl .= '<option value="1" selected="selected">' . $lang['Allowed_Access'] . '</option><option value="0">'. $lang['Disallowed_Access'] . '</option>';
  719.                 }
  720.                 else
  721.                 {
  722.                     $optionlist_acl .= '<option value="1">' . $lang['Allowed_Access'] . '</option><option value="0" selected="selected">' . $lang['Disallowed_Access'] . '</option>';
  723.                 }
  724.  
  725.                 $optionlist_acl .= '</select>';
  726.             }
  727.             else
  728.             {
  729.                 $optionlist_acl = ' ';
  730.             }
  731.         }
  732.         else
  733.         {
  734.             for($j = 0; $j < count($forum_access); $j++)
  735.             {
  736.                 if ( $forum_access[$j]['forum_id'] == $forum_id )
  737.                 {
  738.                     for($k = 0; $k < count($forum_auth_fields); $k++)
  739.                     {
  740.                         $field_name = $forum_auth_fields[$k];
  741.  
  742.                         if( $forum_access[$j][$field_name] == AUTH_ACL )
  743.                         {
  744.                             $optionlist_acl_adv[$forum_id][$k] = '<select name="private_' . $field_name . '[' . $forum_id . ']">';
  745.  
  746.                             if( isset($auth_field_acl[$forum_id][$field_name]) && !($is_admin || $user_ary['auth_mod']) )
  747.                             {
  748.                                 if( !$auth_field_acl[$forum_id][$field_name] )
  749.                                 {
  750.                                     $optionlist_acl_adv[$forum_id][$k] .= '<option value="1">' . $lang['ON'] . '</option><option value="0" selected="selected">' . $lang['OFF'] . '</option>';
  751.                                 }
  752.                                 else
  753.                                 {
  754.                                     $optionlist_acl_adv[$forum_id][$k] .= '<option value="1" selected="selected">' . $lang['ON'] . '</option><option value="0">' . $lang['OFF'] . '</option>';
  755.                                 }
  756.                             }
  757.                             else
  758.                             {
  759.                                 if( $is_admin || $user_ary['auth_mod'] )
  760.                                 {
  761.                                     $optionlist_acl_adv[$forum_id][$k] .= '<option value="1">' . $lang['ON'] . '</option>';
  762.                                 }
  763.                                 else
  764.                                 {
  765.                                     $optionlist_acl_adv[$forum_id][$k] .= '<option value="1">' . $lang['ON'] . '</option><option value="0" selected="selected">' . $lang['OFF'] . '</option>';
  766.                                 }
  767.                             }
  768.  
  769.                             $optionlist_acl_adv[$forum_id][$k] .= '</select>';
  770.  
  771.                         }
  772.                     }
  773.                 }
  774.             }
  775.         }
  776.  
  777.         $optionlist_mod = '<select name="moderator[' . $forum_id . ']">';
  778.         $optionlist_mod .= ( $user_ary['auth_mod'] ) ? '<option value="1" selected="selected">' . $lang['Is_Moderator'] . '</option><option value="0">' . $lang['Not_Moderator'] . '</option>' : '<option value="1">' . $lang['Is_Moderator'] . '</option><option value="0" selected="selected">' . $lang['Not_Moderator'] . '</option>';
  779.         $optionlist_mod .= '</select>';
  780.  
  781.         $row_class = ( !( $i % 2 ) ) ? 'row2' : 'row1';
  782.         $row_color = ( !( $i % 2 ) ) ? $theme['td_color1'] : $theme['td_color2'];
  783.  
  784.         $template->assign_block_vars('forums', array(
  785.             'ROW_COLOR' => '#' . $row_color,
  786.             'ROW_CLASS' => $row_class,
  787.             'FORUM_NAME' => $forum_access[$i]['forum_name'],
  788.  
  789.             'U_FORUM_AUTH' => append_sid("admin_forumauth.$phpEx?f=" . $forum_access[$i]['forum_id']),
  790.  
  791.             'S_MOD_SELECT' => $optionlist_mod)
  792.         );
  793.  
  794.         if( !$adv )
  795.         {
  796.             $template->assign_block_vars('forums.aclvalues', array(
  797.                 'S_ACL_SELECT' => $optionlist_acl)
  798.             );
  799.         }
  800.         else
  801.         {
  802.             for($j = 0; $j < count($forum_auth_fields); $j++)
  803.             {
  804.                 $template->assign_block_vars('forums.aclvalues', array(
  805.                     'S_ACL_SELECT' => $optionlist_acl_adv[$forum_id][$j])
  806.                 );
  807.             }
  808.         }
  809.  
  810.         $i++;
  811.     }
  812. //    @reset($auth_user);
  813.     
  814.     if ( $mode == 'user' )
  815.     {
  816.         $t_username = $ug_info[0]['username'];
  817.         $s_user_type = ( $is_admin ) ? '<select name="userlevel"><option value="admin" selected="selected">' . $lang['Auth_Admin'] . '</option><option value="user">' . $lang['Auth_User'] . '</option></select>' : '<select name="userlevel"><option value="admin">' . $lang['Auth_Admin'] . '</option><option value="user" selected="selected">' . $lang['Auth_User'] . '</option></select>';
  818.     }
  819.     else
  820.     {
  821.         $t_groupname = $ug_info[0]['group_name'];
  822.     }
  823.  
  824.     $name = array();
  825.     $id = array();
  826.     for($i = 0; $i < count($ug_info); $i++)
  827.     {
  828.         if( ( $mode == 'user' && !$ug_info[$i]['group_single_user'] ) || $mode == 'group' )
  829.         {
  830.             $name[] = ( $mode == 'user' ) ? $ug_info[$i]['group_name'] :  $ug_info[$i]['username'];
  831.             $id[] = ( $mode == 'user' ) ? intval($ug_info[$i]['group_id']) : intval($ug_info[$i]['user_id']);
  832.         }
  833.     }
  834.  
  835.     $t_usergroup_list = $t_pending_list = '';
  836.     if( count($name) )
  837.     {
  838.         for($i = 0; $i < count($ug_info); $i++)
  839.         {
  840.             $ug = ( $mode == 'user' ) ? 'group&' . POST_GROUPS_URL : 'user&' . POST_USERS_URL;
  841.  
  842.             if (!$ug_info[$i]['user_pending'])
  843.             {
  844.                 $t_usergroup_list .= ( ( $t_usergroup_list != '' ) ? ', ' : '' ) . '<a href="' . append_sid("admin_ug_auth.$phpEx?mode=$ug=" . $id[$i]) . '">' . $name[$i] . '</a>';
  845.             }
  846.             else
  847.             {
  848.                 $t_pending_list .= ( ( $t_pending_list != '' ) ? ', ' : '' ) . '<a href="' . append_sid("admin_ug_auth.$phpEx?mode=$ug=" . $id[$i]) . '">' . $name[$i] . '</a>';
  849.             }
  850.         }
  851.     }
  852.  
  853.     $t_usergroup_list = ($t_usergroup_list == '') ? $lang['None'] : $t_usergroup_list;
  854.     $t_pending_list = ($t_pending_list == '') ? $lang['None'] : $t_pending_list;
  855.  
  856.     $s_column_span = 2; // Two columns always present
  857.     if( !$adv )
  858.     {
  859.         $template->assign_block_vars('acltype', array(
  860.             'L_UG_ACL_TYPE' => $lang['Simple_Permission'])
  861.         );
  862.         $s_column_span++;
  863.     }
  864.     else
  865.     {
  866.         for($i = 0; $i < count($forum_auth_fields); $i++)
  867.         {
  868.             $cell_title = $field_names[$forum_auth_fields[$i]];
  869.  
  870.             $template->assign_block_vars('acltype', array(
  871.                 'L_UG_ACL_TYPE' => $cell_title)
  872.             );
  873.             $s_column_span++;
  874.         }
  875.     }
  876.  
  877.     //
  878.     // Dump in the page header ...
  879.     //
  880.     include('./page_header_admin.'.$phpEx);
  881.  
  882.     $template->set_filenames(array(
  883.         "body" => 'admin/auth_ug_body.tpl')
  884.     );
  885.  
  886.     $adv_switch = ( empty($adv) ) ? 1 : 0;
  887.     $u_ug_switch = ( $mode == 'user' ) ? POST_USERS_URL . "=" . $user_id : POST_GROUPS_URL . "=" . $group_id;
  888.     $switch_mode = append_sid("admin_ug_auth.$phpEx?mode=$mode&" . $u_ug_switch . "&adv=$adv_switch");
  889.     $switch_mode_text = ( empty($adv) ) ? $lang['Advanced_mode'] : $lang['Simple_mode'];
  890.     $u_switch_mode = '<a href="' . $switch_mode . '">' . $switch_mode_text . '</a>';
  891.  
  892.     $s_hidden_fields = '<input type="hidden" name="mode" value="' . $mode . '" /><input type="hidden" name="adv" value="' . $adv . '" />';
  893.     $s_hidden_fields .= ( $mode == 'user' ) ? '<input type="hidden" name="' . POST_USERS_URL . '" value="' . $user_id . '" />' : '<input type="hidden" name="' . POST_GROUPS_URL . '" value="' . $group_id . '" />';
  894.  
  895.     if ( $mode == 'user' )
  896.     {
  897.         $template->assign_block_vars('switch_user_auth', array());
  898.  
  899.         $template->assign_vars(array(
  900.             'USERNAME' => $t_username,
  901.             'USER_LEVEL' => $lang['User_Level'] . " : " . $s_user_type,
  902.             'USER_GROUP_MEMBERSHIPS' => $lang['Group_memberships'] . ' : ' . $t_usergroup_list)
  903.         );
  904.     }
  905.     else
  906.     {
  907.         $template->assign_block_vars("switch_group_auth", array());
  908.  
  909.         $template->assign_vars(array(
  910.             'USERNAME' => $t_groupname,
  911.             'GROUP_MEMBERSHIP' => $lang['Usergroup_members'] . ' : ' . $t_usergroup_list . '<br />' . $lang['Pending_members'] . ' : ' . $t_pending_list)
  912.         );
  913.     }
  914.  
  915.     $template->assign_vars(array(
  916.         'L_USER_OR_GROUPNAME' => ( $mode == 'user' ) ? $lang['Username'] : $lang['Group_name'],
  917.  
  918.         'L_AUTH_TITLE' => ( $mode == 'user' ) ? $lang['Auth_Control_User'] : $lang['Auth_Control_Group'],
  919.         'L_AUTH_EXPLAIN' => ( $mode == 'user' ) ? $lang['User_auth_explain'] : $lang['Group_auth_explain'],
  920.         'L_MODERATOR_STATUS' => $lang['Moderator_status'],
  921.         'L_PERMISSIONS' => $lang['Permissions'],
  922.         'L_SUBMIT' => $lang['Submit'],
  923.         'L_RESET' => $lang['Reset'], 
  924.         'L_FORUM' => $lang['Forum'], 
  925.  
  926.         'U_USER_OR_GROUP' => append_sid("admin_ug_auth.$phpEx"),
  927.         'U_SWITCH_MODE' => $u_switch_mode,
  928.  
  929.         'S_COLUMN_SPAN' => $s_column_span,
  930.         'S_AUTH_ACTION' => append_sid("admin_ug_auth.$phpEx"), 
  931.         'S_HIDDEN_FIELDS' => $s_hidden_fields)
  932.     );
  933. }
  934. else
  935. {
  936.     //
  937.     // Select a user/group
  938.     //
  939.     include('./page_header_admin.'.$phpEx);
  940.  
  941.     $template->set_filenames(array(
  942.         'body' => ( $mode == 'user' ) ? 'admin/user_select_body.tpl' : 'admin/auth_select_body.tpl')
  943.     );
  944.  
  945.     if ( $mode == 'user' )
  946.     {
  947.         $template->assign_vars(array(
  948.             'L_FIND_USERNAME' => $lang['Find_username'],
  949.  
  950.             'U_SEARCH_USER' => append_sid("../search.$phpEx?mode=searchuser"))
  951.         );
  952.     }
  953.     else
  954.     {
  955.         $sql = "SELECT group_id, group_name
  956.             FROM " . GROUPS_TABLE . "
  957.             WHERE group_single_user <> " . TRUE;
  958.         if ( !($result = $db->sql_query($sql)) )
  959.         {
  960.             message_die(GENERAL_ERROR, "Couldn't get group list", "", __LINE__, __FILE__, $sql);
  961.         }
  962.  
  963.         if ( $row = $db->sql_fetchrow($result) )
  964.         {
  965.             $select_list = '<select name="' . POST_GROUPS_URL . '">';
  966.             do
  967.             {
  968.                 $select_list .= '<option value="' . $row['group_id'] . '">' . $row['group_name'] . '</option>';
  969.             }
  970.             while ( $row = $db->sql_fetchrow($result) );
  971.             $select_list .= '</select>';
  972.         }
  973.  
  974.         $template->assign_vars(array(
  975.             'S_AUTH_SELECT' => $select_list)
  976.         );
  977.     }
  978.  
  979.     $s_hidden_fields = '<input type="hidden" name="mode" value="' . $mode . '" />';
  980.  
  981.     $l_type = ( $mode == 'user' ) ? 'USER' : 'AUTH';
  982.  
  983.     $template->assign_vars(array(
  984.         'L_' . $l_type . '_TITLE' => ( $mode == 'user' ) ? $lang['Auth_Control_User'] : $lang['Auth_Control_Group'],
  985.         'L_' . $l_type . '_EXPLAIN' => ( $mode == 'user' ) ? $lang['User_auth_explain'] : $lang['Group_auth_explain'],
  986.         'L_' . $l_type . '_SELECT' => ( $mode == 'user' ) ? $lang['Select_a_User'] : $lang['Select_a_Group'],
  987.         'L_LOOK_UP' => ( $mode == 'user' ) ? $lang['Look_up_User'] : $lang['Look_up_Group'],
  988.  
  989.         'S_HIDDEN_FIELDS' => $s_hidden_fields, 
  990.         'S_' . $l_type . '_ACTION' => append_sid("admin_ug_auth.$phpEx"))
  991.     );
  992.  
  993. }
  994.  
  995. $template->pparse('body');
  996.  
  997. include('./page_footer_admin.'.$phpEx);
  998.  
  999. ?>