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

« back to all changes in this revision

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

Dispatch now generates an index for each plugin type, allowing plugins to
be written which are aware of other plugins, and other plugin types.

All view plugins now subclass from ivle.webapp.base.plugins.ViewPlugin,
as opposed to subclassing BasePlugin directly. This will allow us to
easily re-write console as an OverlayPlugin, and allow future new
plugins types to be created.

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'