~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-01-13 01:36:15 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1123
Merge setup-refactor branch. This completely breaks existing installations;
every path (both filesystem and Python) has changed. Do not upgrade without
knowing what you are doing.

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'