]> scripts.mit.edu Git - autoinstallsdev/phpBB.git/blob - admin/admin_ug_auth.php
phpBB 2.0.19
[autoinstallsdev/phpBB.git] / admin / admin_ug_auth.php
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 = '&nbsp;';
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&amp;' . POST_GROUPS_URL : 'user&amp;' . 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&amp;" . $u_ug_switch . "&amp;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 ?>