~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/auth.php

  • Committer: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?php
2
 
/**
3
 
*
4
 
* @package phpBB3
5
 
* @version $Id: auth.php,v 1.88 2007/10/05 14:30:07 acydburn Exp $
6
 
* @copyright (c) 2005 phpBB Group
7
 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8
 
*
9
 
*/
10
 
 
11
 
/**
12
 
* @ignore
13
 
*/
14
 
if (!defined('IN_PHPBB'))
15
 
{
16
 
        exit;
17
 
}
18
 
 
19
 
/**
20
 
* Permission/Auth class
21
 
* @package phpBB3
22
 
*/
23
 
class auth
24
 
{
25
 
        var $acl = array();
26
 
        var $cache = array();
27
 
        var $acl_options = array();
28
 
        var $acl_forum_ids = false;
29
 
 
30
 
        /**
31
 
        * Init permissions
32
 
        */
33
 
        function acl(&$userdata)
34
 
        {
35
 
                global $db, $cache;
36
 
 
37
 
                $this->acl = $this->cache = $this->acl_options = array();
38
 
                $this->acl_forum_ids = false;
39
 
 
40
 
                if (($this->acl_options = $cache->get('_acl_options')) === false)
41
 
                {
42
 
                        $sql = 'SELECT auth_option, is_global, is_local
43
 
                                FROM ' . ACL_OPTIONS_TABLE . '
44
 
                                ORDER BY auth_option_id';
45
 
                        $result = $db->sql_query($sql);
46
 
 
47
 
                        $global = $local = 0;
48
 
                        $this->acl_options = array();
49
 
                        while ($row = $db->sql_fetchrow($result))
50
 
                        {
51
 
                                if ($row['is_global'])
52
 
                                {
53
 
                                        $this->acl_options['global'][$row['auth_option']] = $global++;
54
 
                                }
55
 
 
56
 
                                if ($row['is_local'])
57
 
                                {
58
 
                                        $this->acl_options['local'][$row['auth_option']] = $local++;
59
 
                                }
60
 
                        }
61
 
                        $db->sql_freeresult($result);
62
 
 
63
 
                        $cache->put('_acl_options', $this->acl_options);
64
 
                        $this->acl_cache($userdata);
65
 
                }
66
 
                else if (!trim($userdata['user_permissions']))
67
 
                {
68
 
                        $this->acl_cache($userdata);
69
 
                }
70
 
 
71
 
                $user_permissions = explode("\n", $userdata['user_permissions']);
72
 
 
73
 
                foreach ($user_permissions as $f => $seq)
74
 
                {
75
 
                        if ($seq)
76
 
                        {
77
 
                                $i = 0;
78
 
 
79
 
                                if (!isset($this->acl[$f]))
80
 
                                {
81
 
                                        $this->acl[$f] = '';
82
 
                                }
83
 
 
84
 
                                while ($subseq = substr($seq, $i, 6))
85
 
                                {
86
 
                                        // We put the original bitstring into the acl array
87
 
                                        $this->acl[$f] .= str_pad(base_convert($subseq, 36, 2), 31, 0, STR_PAD_LEFT);
88
 
                                        $i += 6;
89
 
                                }
90
 
                        }
91
 
                }
92
 
 
93
 
                return;
94
 
        }
95
 
 
96
 
        /**
97
 
        * Look up an option
98
 
        * if the option is prefixed with !, then the result becomes negated
99
 
        *
100
 
        * If a forum id is specified the local option will be combined with a global option if one exist.
101
 
        * If a forum id is not specified, only the global option will be checked.
102
 
        */
103
 
        function acl_get($opt, $f = 0)
104
 
        {
105
 
                $negate = false;
106
 
 
107
 
                if (strpos($opt, '!') === 0)
108
 
                {
109
 
                        $negate = true;
110
 
                        $opt = substr($opt, 1);
111
 
                }
112
 
 
113
 
                if (!isset($this->cache[$f][$opt]))
114
 
                {
115
 
                        // We combine the global/local option with an OR because some options are global and local.
116
 
                        // If the user has the global permission the local one is true too and vice versa
117
 
                        $this->cache[$f][$opt] = false;
118
 
 
119
 
                        // Is this option a global permission setting?
120
 
                        if (isset($this->acl_options['global'][$opt]))
121
 
                        {
122
 
                                if (isset($this->acl[0]))
123
 
                                {
124
 
                                        $this->cache[$f][$opt] = $this->acl[0][$this->acl_options['global'][$opt]];
125
 
                                }
126
 
                        }
127
 
 
128
 
                        // Is this option a local permission setting?
129
 
                        // But if we check for a global option only, we won't combine the options...
130
 
                        if ($f != 0 && isset($this->acl_options['local'][$opt]))
131
 
                        {
132
 
                                if (isset($this->acl[$f]) && isset($this->acl[$f][$this->acl_options['local'][$opt]]))
133
 
                                {
134
 
                                        $this->cache[$f][$opt] |= $this->acl[$f][$this->acl_options['local'][$opt]];
135
 
                                }
136
 
                        }
137
 
                }
138
 
 
139
 
                // Founder always has all global options set to true...
140
 
                return ($negate) ? !$this->cache[$f][$opt] : $this->cache[$f][$opt];
141
 
        }
142
 
 
143
 
        /**
144
 
        * Get forums with the specified permission setting
145
 
        * if the option is prefixed with !, then the result becomes nagated
146
 
        *
147
 
        * @param bool $clean set to true if only values needs to be returned which are set/unset
148
 
        */
149
 
        function acl_getf($opt, $clean = false)
150
 
        {
151
 
                $acl_f = array();
152
 
                $negate = false;
153
 
 
154
 
                if (strpos($opt, '!') === 0)
155
 
                {
156
 
                        $negate = true;
157
 
                        $opt = substr($opt, 1);
158
 
                }
159
 
 
160
 
                // If we retrieve a list of forums not having permissions in, we need to get every forum_id
161
 
                if ($negate)
162
 
                {
163
 
                        if ($this->acl_forum_ids === false)
164
 
                        {
165
 
                                global $db;
166
 
 
167
 
                                $sql = 'SELECT forum_id
168
 
                                        FROM ' . FORUMS_TABLE;
169
 
                                
170
 
                                if (sizeof($this->acl))
171
 
                                {
172
 
                                        $sql .= ' WHERE ' . $db->sql_in_set('forum_id', array_keys($this->acl), true);
173
 
                                }
174
 
                                $result = $db->sql_query($sql);
175
 
 
176
 
                                $this->acl_forum_ids = array();
177
 
                                while ($row = $db->sql_fetchrow($result))
178
 
                                {
179
 
                                        $this->acl_forum_ids[] = $row['forum_id'];
180
 
                                }
181
 
                                $db->sql_freeresult($result);
182
 
                        }
183
 
                }
184
 
                
185
 
                if (isset($this->acl_options['local'][$opt]))
186
 
                {
187
 
                        foreach ($this->acl as $f => $bitstring)
188
 
                        {
189
 
                                // Skip global settings
190
 
                                if (!$f)
191
 
                                {
192
 
                                        continue;
193
 
                                }
194
 
 
195
 
                                $allowed = (!isset($this->cache[$f][$opt])) ? $this->acl_get($opt, $f) : $this->cache[$f][$opt];
196
 
 
197
 
                                if (!$clean)
198
 
                                {
199
 
                                        $acl_f[$f][$opt] = ($negate) ? !$allowed : $allowed;
200
 
                                }
201
 
                                else
202
 
                                {
203
 
                                        if (($negate && !$allowed) || (!$negate && $allowed))
204
 
                                        {
205
 
                                                $acl_f[$f][$opt] = 1;
206
 
                                        }
207
 
                                }
208
 
                        }
209
 
                }
210
 
 
211
 
                // If we get forum_ids not having this permission, we need to fill the remaining parts
212
 
                if ($negate && sizeof($this->acl_forum_ids))
213
 
                {
214
 
                        foreach ($this->acl_forum_ids as $f)
215
 
                        {
216
 
                                $acl_f[$f][$opt] = 1;
217
 
                        }
218
 
                }
219
 
 
220
 
                return $acl_f;
221
 
        }
222
 
 
223
 
        /**
224
 
        * Get local permission state for any forum.
225
 
        *
226
 
        * Returns true if user has the permission in one or more forums, false if in no forum.
227
 
        * If global option is checked it returns the global state (same as acl_get($opt))
228
 
        * Local option has precedence...
229
 
        */
230
 
        function acl_getf_global($opt)
231
 
        {
232
 
                if (is_array($opt))
233
 
                {
234
 
                        // evaluates to true as soon as acl_getf_global is true for one option
235
 
                        foreach ($opt as $check_option)
236
 
                        {
237
 
                                if ($this->acl_getf_global($check_option))
238
 
                                {
239
 
                                        return true;
240
 
                                }
241
 
                        }
242
 
 
243
 
                        return false;
244
 
                }
245
 
 
246
 
                if (isset($this->acl_options['local'][$opt]))
247
 
                {
248
 
                        foreach ($this->acl as $f => $bitstring)
249
 
                        {
250
 
                                // Skip global settings
251
 
                                if (!$f)
252
 
                                {
253
 
                                        continue;
254
 
                                }
255
 
 
256
 
                                // as soon as the user has any permission we're done so return true
257
 
                                if ((!isset($this->cache[$f][$opt])) ? $this->acl_get($opt, $f) : $this->cache[$f][$opt])
258
 
                                {
259
 
                                        return true;
260
 
                                }
261
 
                        }
262
 
                }
263
 
                else if (isset($this->acl_options['global'][$opt]))
264
 
                {
265
 
                        return $this->acl_get($opt);
266
 
                }
267
 
 
268
 
                return false;
269
 
        }
270
 
 
271
 
        /**
272
 
        * Get permission settings (more than one)
273
 
        */
274
 
        function acl_gets()
275
 
        {
276
 
                $args = func_get_args();
277
 
                $f = array_pop($args);
278
 
 
279
 
                if (!is_numeric($f))
280
 
                {
281
 
                        $args[] = $f;
282
 
                        $f = 0;
283
 
                }
284
 
 
285
 
                // alternate syntax: acl_gets(array('m_', 'a_'), $forum_id)
286
 
                if (is_array($args[0]))
287
 
                {
288
 
                        $args = $args[0];
289
 
                }
290
 
 
291
 
                $acl = 0;
292
 
                foreach ($args as $opt)
293
 
                {
294
 
                        $acl |= $this->acl_get($opt, $f);
295
 
                }
296
 
 
297
 
                return $acl;
298
 
        }
299
 
 
300
 
        /**
301
 
        * Get permission listing based on user_id/options/forum_ids
302
 
        */
303
 
        function acl_get_list($user_id = false, $opts = false, $forum_id = false)
304
 
        {
305
 
                $hold_ary = $this->acl_raw_data($user_id, $opts, $forum_id);
306
 
 
307
 
                $auth_ary = array();
308
 
                foreach ($hold_ary as $user_id => $forum_ary)
309
 
                {
310
 
                        foreach ($forum_ary as $forum_id => $auth_option_ary)
311
 
                        {
312
 
                                foreach ($auth_option_ary as $auth_option => $auth_setting)
313
 
                                {
314
 
                                        if ($auth_setting)
315
 
                                        {
316
 
                                                $auth_ary[$forum_id][$auth_option][] = $user_id;
317
 
                                        }
318
 
                                }
319
 
                        }
320
 
                }
321
 
 
322
 
                return $auth_ary;
323
 
        }
324
 
 
325
 
        /**
326
 
        * Cache data to user_permissions row
327
 
        */
328
 
        function acl_cache(&$userdata)
329
 
        {
330
 
                global $db;
331
 
 
332
 
                // Empty user_permissions
333
 
                $userdata['user_permissions'] = '';
334
 
 
335
 
                $hold_ary = $this->acl_raw_data($userdata['user_id'], false, false);
336
 
 
337
 
                if (isset($hold_ary[$userdata['user_id']]))
338
 
                {
339
 
                        $hold_ary = $hold_ary[$userdata['user_id']];
340
 
                }
341
 
 
342
 
                // Key 0 in $hold_ary are global options, all others are forum_ids
343
 
 
344
 
                // If this user is founder we're going to force fill the admin options ...
345
 
                if ($userdata['user_type'] == USER_FOUNDER)
346
 
                {
347
 
                        foreach ($this->acl_options['global'] as $opt => $id)
348
 
                        {
349
 
                                if (strpos($opt, 'a_') === 0)
350
 
                                {
351
 
                                        $hold_ary[0][$opt] = ACL_YES;
352
 
                                }
353
 
                        }
354
 
                }
355
 
 
356
 
                // Sometimes, it can happen $hold_ary holding forums which do not exist.
357
 
                // Since this function is not called that often (we are caching the data) we check for this inconsistency.
358
 
                $sql = 'SELECT forum_id
359
 
                        FROM ' . FORUMS_TABLE . '
360
 
                        WHERE ' . $db->sql_in_set('forum_id', array_keys($hold_ary), false, true);
361
 
                $result = $db->sql_query($sql);
362
 
 
363
 
                $forum_ids = (isset($hold_ary[0])) ? array(0) : array();
364
 
                while ($row = $db->sql_fetchrow($result))
365
 
                {
366
 
                        $forum_ids[] = $row['forum_id'];
367
 
                }
368
 
                $db->sql_freeresult($result);
369
 
 
370
 
                // Now determine forums which do not exist and remove the unneeded information (for modding purposes it is clearly the wrong place. ;))
371
 
                $missing_forums = array_diff(array_keys($hold_ary), $forum_ids);
372
 
 
373
 
                if (sizeof($missing_forums))
374
 
                {
375
 
                        foreach ($missing_forums as $forum_id)
376
 
                        {
377
 
                                unset($hold_ary[$forum_id]);
378
 
                        }
379
 
 
380
 
                        $sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $missing_forums);
381
 
                        $db->sql_query($sql);
382
 
 
383
 
                        $sql = 'DELETE FROM ' . ACL_USERS_TABLE . ' WHERE ' . $db->sql_in_set('forum_id', $missing_forums);
384
 
                        $db->sql_query($sql);
385
 
                }
386
 
 
387
 
                $hold_str = $this->build_bitstring($hold_ary);
388
 
 
389
 
                if ($hold_str)
390
 
                {
391
 
                        $userdata['user_permissions'] = $hold_str;
392
 
 
393
 
                        $sql = 'UPDATE ' . USERS_TABLE . "
394
 
                                SET user_permissions = '" . $db->sql_escape($userdata['user_permissions']) . "',
395
 
                                        user_perm_from = 0
396
 
                                WHERE user_id = " . $userdata['user_id'];
397
 
                        $db->sql_query($sql);
398
 
                }
399
 
 
400
 
                return;
401
 
        }
402
 
 
403
 
        /**
404
 
        * Build bitstring from permission set
405
 
        */
406
 
        function build_bitstring(&$hold_ary)
407
 
        {
408
 
                $hold_str = '';
409
 
 
410
 
                if (sizeof($hold_ary))
411
 
                {
412
 
                        ksort($hold_ary);
413
 
 
414
 
                        $last_f = 0;
415
 
 
416
 
                        foreach ($hold_ary as $f => $auth_ary)
417
 
                        {
418
 
                                $ary_key = (!$f) ? 'global' : 'local';
419
 
 
420
 
                                $bitstring = array();
421
 
                                foreach ($this->acl_options[$ary_key] as $opt => $id)
422
 
                                {
423
 
                                        if (isset($auth_ary[$opt]))
424
 
                                        {
425
 
                                                $bitstring[$id] = $auth_ary[$opt];
426
 
 
427
 
                                                $option_key = substr($opt, 0, strpos($opt, '_') + 1);
428
 
 
429
 
                                                // If one option is allowed, the global permission for this option has to be allowed too
430
 
                                                // example: if the user has the a_ permission this means he has one or more a_* permissions
431
 
                                                if ($auth_ary[$opt] == ACL_YES && (!isset($bitstring[$this->acl_options[$ary_key][$option_key]]) || $bitstring[$this->acl_options[$ary_key][$option_key]] == ACL_NEVER))
432
 
                                                {
433
 
                                                        $bitstring[$this->acl_options[$ary_key][$option_key]] = ACL_YES;
434
 
                                                }
435
 
                                        }
436
 
                                        else
437
 
                                        {
438
 
                                                $bitstring[$id] = ACL_NEVER;
439
 
                                        }
440
 
                                }
441
 
 
442
 
                                // Now this bitstring defines the permission setting for the current forum $f (or global setting)
443
 
                                $bitstring = implode('', $bitstring);
444
 
 
445
 
                                // The line number indicates the id, therefore we have to add empty lines for those ids not present
446
 
                                $hold_str .= str_repeat("\n", $f - $last_f);
447
 
                        
448
 
                                // Convert bitstring for storage - we do not use binary/bytes because PHP's string functions are not fully binary safe
449
 
                                for ($i = 0, $bit_length = strlen($bitstring); $i < $bit_length; $i += 31)
450
 
                                {
451
 
                                        $hold_str .= str_pad(base_convert(str_pad(substr($bitstring, $i, 31), 31, 0, STR_PAD_RIGHT), 2, 36), 6, 0, STR_PAD_LEFT);
452
 
                                }
453
 
 
454
 
                                $last_f = $f;
455
 
                        }
456
 
                        unset($bitstring);
457
 
 
458
 
                        $hold_str = rtrim($hold_str);
459
 
                }
460
 
 
461
 
                return $hold_str;
462
 
        }
463
 
 
464
 
        /**
465
 
        * Clear one or all users cached permission settings
466
 
        */
467
 
        function acl_clear_prefetch($user_id = false)
468
 
        {
469
 
                global $db;
470
 
 
471
 
                $where_sql = '';
472
 
 
473
 
                if ($user_id !== false)
474
 
                {
475
 
                        $user_id = (!is_array($user_id)) ? $user_id = array((int) $user_id) : array_map('intval', $user_id);
476
 
                        $where_sql = ' WHERE ' . $db->sql_in_set('user_id', $user_id);
477
 
                }
478
 
 
479
 
                $sql = 'UPDATE ' . USERS_TABLE . "
480
 
                        SET user_permissions = '',
481
 
                                user_perm_from = 0
482
 
                        $where_sql";
483
 
                $db->sql_query($sql);
484
 
 
485
 
                return;
486
 
        }
487
 
 
488
 
        /**
489
 
        * Get assigned roles
490
 
        */
491
 
        function acl_role_data($user_type, $role_type, $ug_id = false, $forum_id = false)
492
 
        {
493
 
                global $db;
494
 
 
495
 
                $roles = array();
496
 
 
497
 
                $sql_id = ($user_type == 'user') ? 'user_id' : 'group_id';
498
 
 
499
 
                $sql_ug = ($ug_id !== false) ? ((!is_array($ug_id)) ? "AND a.$sql_id = $ug_id" : 'AND ' . $db->sql_in_set("a.$sql_id", $ug_id)) : '';
500
 
                $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? "AND a.forum_id = $forum_id" : 'AND ' . $db->sql_in_set('a.forum_id', $forum_id)) : '';
501
 
 
502
 
                // Grab assigned roles...
503
 
                $sql = 'SELECT a.auth_role_id, a.' . $sql_id . ', a.forum_id
504
 
                        FROM ' . (($user_type == 'user') ? ACL_USERS_TABLE : ACL_GROUPS_TABLE) . ' a, ' . ACL_ROLES_TABLE . " r
505
 
                        WHERE a.auth_role_id = r.role_id
506
 
                                AND r.role_type = '" . $db->sql_escape($role_type) . "'
507
 
                                $sql_ug
508
 
                                $sql_forum
509
 
                        ORDER BY r.role_order ASC";
510
 
                $result = $db->sql_query($sql);
511
 
 
512
 
                while ($row = $db->sql_fetchrow($result))
513
 
                {
514
 
                        $roles[$row[$sql_id]][$row['forum_id']] = $row['auth_role_id'];
515
 
                }
516
 
                $db->sql_freeresult($result);
517
 
 
518
 
                return $roles;
519
 
        }
520
 
 
521
 
        /**
522
 
        * Get raw acl data based on user/option/forum
523
 
        */
524
 
        function acl_raw_data($user_id = false, $opts = false, $forum_id = false)
525
 
        {
526
 
                global $db;
527
 
 
528
 
                $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? 'user_id = ' . (int) $user_id : $db->sql_in_set('user_id', array_map('intval', $user_id))) : '';
529
 
                $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : '';
530
 
 
531
 
                $sql_opts = '';
532
 
 
533
 
                if ($opts !== false)
534
 
                {
535
 
                        $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts);
536
 
                }
537
 
 
538
 
                $hold_ary = array();
539
 
 
540
 
                // First grab user settings ... each user has only one setting for each
541
 
                // option ... so we shouldn't need any ACL_NEVER checks ... he says ...
542
 
                // Grab assigned roles...
543
 
                $sql = $db->sql_build_query('SELECT', array(
544
 
                        'SELECT'        => 'ao.auth_option, a.auth_role_id, r.auth_setting as role_auth_setting, a.user_id, a.forum_id, a.auth_setting',
545
 
 
546
 
                        'FROM'          => array(
547
 
                                ACL_OPTIONS_TABLE       => 'ao',
548
 
                                ACL_USERS_TABLE         => 'a'
549
 
                        ),
550
 
 
551
 
                        'LEFT_JOIN'     => array(
552
 
                                array(
553
 
                                        'FROM'  => array(ACL_ROLES_DATA_TABLE => 'r'),
554
 
                                        'ON'    => 'a.auth_role_id = r.role_id'
555
 
                                )
556
 
                        ),
557
 
 
558
 
                        'WHERE'         => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)
559
 
                                ' . (($sql_user) ? 'AND a.' . $sql_user : '') . "
560
 
                                $sql_forum
561
 
                                $sql_opts",
562
 
                ));
563
 
                $result = $db->sql_query($sql);
564
 
 
565
 
                while ($row = $db->sql_fetchrow($result))
566
 
                {
567
 
                        $setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting'];
568
 
                        $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting;
569
 
                }
570
 
                $db->sql_freeresult($result);
571
 
 
572
 
                // Now grab group settings ... ACL_NEVER overrides ACL_YES so act appropriatley
573
 
                $sql_ary[] = $db->sql_build_query('SELECT', array(
574
 
                        'SELECT'        => 'ug.user_id, ao.auth_option, a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting',
575
 
 
576
 
                        'FROM'          => array(
577
 
                                USER_GROUP_TABLE        => 'ug',
578
 
                                ACL_OPTIONS_TABLE       => 'ao',
579
 
                                ACL_GROUPS_TABLE        => 'a'
580
 
                        ),
581
 
 
582
 
                        'LEFT_JOIN'     => array(
583
 
                                array(
584
 
                                        'FROM'  => array(ACL_ROLES_DATA_TABLE => 'r'),
585
 
                                        'ON'    => 'a.auth_role_id = r.role_id'
586
 
                                )
587
 
                        ),
588
 
 
589
 
                        'WHERE'         => 'ao.auth_option_id = a.auth_option_id
590
 
                                AND a.group_id = ug.group_id
591
 
                                AND ug.user_pending = 0
592
 
                                ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . "
593
 
                                $sql_forum
594
 
                                $sql_opts"
595
 
                ));
596
 
 
597
 
                $sql_ary[] = $db->sql_build_query('SELECT', array(
598
 
                        'SELECT'        => 'ug.user_id,  a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting, ao.auth_option' ,
599
 
 
600
 
                        'FROM'          => array(
601
 
                                ACL_OPTIONS_TABLE       => 'ao'
602
 
                                
603
 
                        ),
604
 
 
605
 
                        'LEFT_JOIN'     => array(
606
 
                                
607
 
                                array(
608
 
                                        'FROM'  => array(ACL_ROLES_DATA_TABLE => 'r'),
609
 
                                        'ON'    => 'r.auth_option_id = ao.auth_option_id'
610
 
                                ),
611
 
                                array(
612
 
                                        'FROM'  => array(ACL_GROUPS_TABLE       => 'a'),
613
 
                                        'ON'    => 'a.auth_role_id = r.role_id'
614
 
                                ),
615
 
                                array(
616
 
                                        'FROM'  => array(USER_GROUP_TABLE       => 'ug'),
617
 
                                        'ON'    => 'ug.group_id = a.group_id'
618
 
                                )
619
 
                                
620
 
                        ),
621
 
 
622
 
                        'WHERE'         => 'ug.user_pending = 0
623
 
                                ' . (($sql_user) ? 'AND ug.' . $sql_user : '') . "
624
 
                                $sql_forum
625
 
                                $sql_opts"
626
 
                ));
627
 
                
628
 
 
629
 
                foreach ($sql_ary as $sql)
630
 
                {
631
 
                        $result = $db->sql_query($sql);
632
 
 
633
 
                        while ($row = $db->sql_fetchrow($result))
634
 
                        {
635
 
                                if (!isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) || (isset($hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']]) && $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] != ACL_NEVER))
636
 
                                {
637
 
                                        $setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting'];
638
 
                                        $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting;
639
 
        
640
 
                                        // Check for existence of ACL_YES if an option got set to ACL_NEVER
641
 
                                        if ($setting == ACL_NEVER)
642
 
                                        {
643
 
                                                $flag = substr($row['auth_option'], 0, strpos($row['auth_option'], '_') + 1);
644
 
        
645
 
                                                if (isset($hold_ary[$row['user_id']][$row['forum_id']][$flag]) && $hold_ary[$row['user_id']][$row['forum_id']][$flag] == ACL_YES)
646
 
                                                {
647
 
                                                        unset($hold_ary[$row['user_id']][$row['forum_id']][$flag]);
648
 
        
649
 
                                                        if (in_array(ACL_YES, $hold_ary[$row['user_id']][$row['forum_id']]))
650
 
                                                        {
651
 
                                                                $hold_ary[$row['user_id']][$row['forum_id']][$flag] = ACL_YES;
652
 
                                                        }
653
 
                                                }
654
 
                                        }
655
 
                                }
656
 
                        }
657
 
                        $db->sql_freeresult($result);
658
 
                }
659
 
 
660
 
                return $hold_ary;
661
 
        }
662
 
 
663
 
        /**
664
 
        * Get raw user based permission settings
665
 
        */
666
 
        function acl_user_raw_data($user_id = false, $opts = false, $forum_id = false)
667
 
        {
668
 
                global $db;
669
 
 
670
 
                $sql_user = ($user_id !== false) ? ((!is_array($user_id)) ? 'user_id = ' . (int) $user_id : $db->sql_in_set('user_id', array_map('intval', $user_id))) : '';
671
 
                $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : '';
672
 
 
673
 
                $sql_opts = '';
674
 
 
675
 
                if ($opts !== false)
676
 
                {
677
 
                        $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts);
678
 
                }
679
 
 
680
 
                $hold_ary = array();
681
 
 
682
 
                // Grab user settings...
683
 
                $sql = $db->sql_build_query('SELECT', array(
684
 
                        'SELECT'        => 'ao.auth_option, a.auth_role_id, r.auth_setting as role_auth_setting, a.user_id, a.forum_id, a.auth_setting',
685
 
                        
686
 
                        'FROM'          => array(
687
 
                                ACL_OPTIONS_TABLE       => 'ao',
688
 
                                ACL_USERS_TABLE         => 'a'
689
 
                        ),
690
 
                        
691
 
                        'LEFT_JOIN'     => array(
692
 
                                array(
693
 
                                        'FROM'  => array(ACL_ROLES_DATA_TABLE => 'r'),
694
 
                                        'ON'    => 'a.auth_role_id = r.role_id'
695
 
                                ),
696
 
                        ),
697
 
 
698
 
                        'WHERE'         => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)
699
 
                                ' . (($sql_user) ? 'AND a.' . $sql_user : '') . "
700
 
                                $sql_forum
701
 
                                $sql_opts",
702
 
 
703
 
                        'ORDER_BY'      => 'a.forum_id, ao.auth_option'
704
 
                ));
705
 
                $result = $db->sql_query($sql);
706
 
 
707
 
                while ($row = $db->sql_fetchrow($result))
708
 
                {
709
 
                        $setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting'];
710
 
                        $hold_ary[$row['user_id']][$row['forum_id']][$row['auth_option']] = $setting;
711
 
                }
712
 
                $db->sql_freeresult($result);
713
 
 
714
 
                return $hold_ary;
715
 
        }
716
 
 
717
 
        /**
718
 
        * Get raw group based permission settings
719
 
        */
720
 
        function acl_group_raw_data($group_id = false, $opts = false, $forum_id = false)
721
 
        {
722
 
                global $db;
723
 
 
724
 
                $sql_group = ($group_id !== false) ? ((!is_array($group_id)) ? 'group_id = ' . (int) $group_id : $db->sql_in_set('group_id', array_map('intval', $group_id))) : '';
725
 
                $sql_forum = ($forum_id !== false) ? ((!is_array($forum_id)) ? 'AND a.forum_id = ' . (int) $forum_id : 'AND ' . $db->sql_in_set('a.forum_id', array_map('intval', $forum_id))) : '';
726
 
 
727
 
                $sql_opts = '';
728
 
 
729
 
                if ($opts !== false)
730
 
                {
731
 
                        $this->build_auth_option_statement('ao.auth_option', $opts, $sql_opts);
732
 
                }
733
 
 
734
 
                $hold_ary = array();
735
 
 
736
 
                // Grab group settings...
737
 
                $sql = $db->sql_build_query('SELECT', array(
738
 
                        'SELECT'        => 'a.group_id, ao.auth_option, a.forum_id, a.auth_setting, a.auth_role_id, r.auth_setting as role_auth_setting',
739
 
 
740
 
                        'FROM'          => array(
741
 
                                ACL_OPTIONS_TABLE       => 'ao',
742
 
                                ACL_GROUPS_TABLE        => 'a'
743
 
                        ),
744
 
 
745
 
                        'LEFT_JOIN'     => array(
746
 
                                array(
747
 
                                        'FROM'  => array(ACL_ROLES_DATA_TABLE => 'r'),
748
 
                                        'ON'    => 'a.auth_role_id = r.role_id'
749
 
                                ),
750
 
                        ),
751
 
 
752
 
                        'WHERE'         => '(ao.auth_option_id = a.auth_option_id OR ao.auth_option_id = r.auth_option_id)
753
 
                                ' . (($sql_group) ? 'AND a.' . $sql_group : '') . "
754
 
                                $sql_forum
755
 
                                $sql_opts",
756
 
 
757
 
                        'ORDER_BY'      => 'a.forum_id, ao.auth_option'
758
 
                ));
759
 
                $result = $db->sql_query($sql);
760
 
 
761
 
                while ($row = $db->sql_fetchrow($result))
762
 
                {
763
 
                        $setting = ($row['auth_role_id']) ? $row['role_auth_setting'] : $row['auth_setting'];
764
 
                        $hold_ary[$row['group_id']][$row['forum_id']][$row['auth_option']] = $setting;
765
 
                }
766
 
                $db->sql_freeresult($result);
767
 
 
768
 
                return $hold_ary;
769
 
        }
770
 
 
771
 
        /**
772
 
        * Authentication plug-ins is largely down to Sergey Kanareykin, our thanks to him.
773
 
        */
774
 
        function login($username, $password, $autologin = false, $viewonline = 1, $admin = 0)
775
 
        {
776
 
                global $config, $db, $user, $phpbb_root_path, $phpEx;
777
 
 
778
 
                $method = trim(basename($config['auth_method']));
779
 
                include_once($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx);
780
 
 
781
 
                $method = 'login_' . $method;
782
 
                if (function_exists($method))
783
 
                {
784
 
                        $login = $method($username, $password);
785
 
 
786
 
                        // If the auth module wants us to create an empty profile do so and then treat the status as LOGIN_SUCCESS
787
 
                        if ($login['status'] == LOGIN_SUCCESS_CREATE_PROFILE)
788
 
                        {
789
 
                                // we are going to use the user_add function so include functions_user.php if it wasn't defined yet
790
 
                                if (!function_exists('user_add'))
791
 
                                {
792
 
                                        include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
793
 
                                }
794
 
 
795
 
                                user_add($login['user_row'], (isset($login['cp_data'])) ? $login['cp_data'] : false);
796
 
 
797
 
                                $sql = 'SELECT user_id, username, user_password, user_passchg, user_email, user_type
798
 
                                        FROM ' . USERS_TABLE . "
799
 
                                        WHERE username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
800
 
                                $result = $db->sql_query($sql);
801
 
                                $row = $db->sql_fetchrow($result);
802
 
                                $db->sql_freeresult($result);
803
 
 
804
 
                                if (!$row)
805
 
                                {
806
 
                                        return array(
807
 
                                                'status'                => LOGIN_ERROR_EXTERNAL_AUTH,
808
 
                                                'error_msg'             => 'AUTH_NO_PROFILE_CREATED',
809
 
                                                'user_row'              => array('user_id' => ANONYMOUS),
810
 
                                        );
811
 
                                }
812
 
 
813
 
                                $login = array(
814
 
                                        'status'        => LOGIN_SUCCESS,
815
 
                                        'error_msg'     => false,
816
 
                                        'user_row'      => $row,
817
 
                                );
818
 
                        }
819
 
 
820
 
                        // If login succeeded, we will log the user in... else we pass the login array through...
821
 
                        if ($login['status'] == LOGIN_SUCCESS)
822
 
                        {
823
 
                                $old_session_id = $user->session_id;
824
 
 
825
 
                                if ($admin)
826
 
                                {
827
 
                                        global $SID, $_SID;
828
 
 
829
 
                                        $cookie_expire = time() - 31536000;
830
 
                                        $user->set_cookie('u', '', $cookie_expire);
831
 
                                        $user->set_cookie('sid', '', $cookie_expire);
832
 
                                        unset($cookie_expire);
833
 
 
834
 
                                        $SID = '?sid=';
835
 
                                        $user->session_id = $_SID = '';
836
 
                                }
837
 
 
838
 
                                $result = $user->session_create($login['user_row']['user_id'], $admin, $autologin, $viewonline);
839
 
 
840
 
                                // Successful session creation
841
 
                                if ($result === true)
842
 
                                {
843
 
                                        // If admin re-authentication we remove the old session entry because a new one has been created...
844
 
                                        if ($admin)
845
 
                                        {
846
 
                                                // the login array is used because the user ids do not differ for re-authentication
847
 
                                                $sql = 'DELETE FROM ' . SESSIONS_TABLE . "
848
 
                                                        WHERE session_id = '" . $db->sql_escape($old_session_id) . "'
849
 
                                                        AND session_user_id = {$login['user_row']['user_id']}";
850
 
                                                $db->sql_query($sql);
851
 
                                        }
852
 
 
853
 
                                        return array(
854
 
                                                'status'                => LOGIN_SUCCESS,
855
 
                                                'error_msg'             => false,
856
 
                                                'user_row'              => $login['user_row'],
857
 
                                        );
858
 
                                }
859
 
 
860
 
                                return array(
861
 
                                        'status'                => LOGIN_BREAK,
862
 
                                        'error_msg'             => $result,
863
 
                                        'user_row'              => $login['user_row'],
864
 
                                );
865
 
                        }
866
 
 
867
 
                        return $login;
868
 
                }
869
 
 
870
 
                trigger_error('Authentication method not found', E_USER_ERROR);
871
 
        }
872
 
 
873
 
        /**
874
 
        * Fill auth_option statement for later querying based on the supplied options
875
 
        */
876
 
        function build_auth_option_statement($key, $auth_options, &$sql_opts)
877
 
        {
878
 
                global $db;
879
 
 
880
 
                if (!is_array($auth_options))
881
 
                {
882
 
                        if (strpos($auth_options, '%') !== false)
883
 
                        {
884
 
                                $sql_opts = "AND $key " . $db->sql_like_expression(str_replace('%', $db->any_char, $auth_options));
885
 
                        }
886
 
                        else
887
 
                        {
888
 
                                $sql_opts = "AND $key = '" . $db->sql_escape($auth_options) . "'";
889
 
                        }
890
 
                }
891
 
                else
892
 
                {
893
 
                        $is_like_expression = false;
894
 
 
895
 
                        foreach ($auth_options as $option)
896
 
                        {
897
 
                                if (strpos($option, '%') !== false)
898
 
                                {
899
 
                                        $is_like_expression = true;
900
 
                                }
901
 
                        }
902
 
 
903
 
                        if (!$is_like_expression)
904
 
                        {
905
 
                                $sql_opts = 'AND ' . $db->sql_in_set($key, $auth_options);
906
 
                        }
907
 
                        else
908
 
                        {
909
 
                                $sql = array();
910
 
 
911
 
                                foreach ($auth_options as $option)
912
 
                                {
913
 
                                        if (strpos($option, '%') !== false)
914
 
                                        {
915
 
                                                $sql[] = $key . ' ' . $db->sql_like_expression(str_replace('%', $db->any_char, $option));
916
 
                                        }
917
 
                                        else
918
 
                                        {
919
 
                                                $sql[] = $key . " = '" . $db->sql_escape($option) . "'";
920
 
                                        }
921
 
                                }
922
 
 
923
 
                                $sql_opts = 'AND (' . implode(' OR ', $sql) . ')';
924
 
                        }
925
 
                }
926
 
        }
927
 
}
928
 
 
929
 
?>
 
 
b'\\ No newline at end of file'