Passed
Push — teampass_3.0 ( c09805...314ae6 )
by Nils
05:44
created

whatever()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 4
c 1
b 0
f 0
nc 3
nop 3
dl 0
loc 6
rs 10
1
<?php
2
3
/**
4
 * Teampass - a collaborative passwords manager.
5
 *
6
 * This library is distributed in the hope that it will be useful,
7
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9
 *
10
 * @category  Teampass
11
 *
12
 * @author    Nils Laumaillé <[email protected]>
13
 * @copyright 2009-2019 Nils Laumaillé
14
 * @license   https://spdx.org/licenses/GPL-3.0-only.html#licenseText GPL-3.0
15
 *
16
 * @version   GIT: <git_id>
17
 *
18
 * @see      http://www.teampass.net
19
 */
20
require_once 'SecureHandler.php';
21
session_name('teampass_session');
22
session_start();
23
if (
24
    isset($_SESSION['CPM']) === false
25
    || $_SESSION['CPM'] != 1
26
    || isset($_SESSION['user_id']) === false || empty($_SESSION['user_id'])
27
    || isset($_SESSION['key']) === false || empty($_SESSION['key'])
28
) {
29
    die('Hacking attempt...');
30
}
31
32
// Load config if $SETTINGS not defined
33
if (isset($SETTINGS['cpassman_dir']) === false || empty($SETTINGS['cpassman_dir'])) {
34
    if (file_exists('../includes/config/tp.config.php')) {
35
        include_once '../includes/config/tp.config.php';
36
    } elseif (file_exists('./includes/config/tp.config.php')) {
37
        include_once './includes/config/tp.config.php';
38
    } elseif (file_exists('../../includes/config/tp.config.php')) {
39
        include_once '../../includes/config/tp.config.php';
40
    } else {
41
        throw new Exception("Error file '/includes/config/tp.config.php' not exists", 1);
42
    }
43
}
44
45
/* do checks */
46
require_once $SETTINGS['cpassman_dir'] . '/includes/config/include.php';
47
require_once $SETTINGS['cpassman_dir'] . '/sources/checks.php';
48
$isprofileupdate = filter_input(INPUT_POST, 'isprofileupdate', FILTER_SANITIZE_STRING);
49
if (
50
    checkUser($_SESSION['user_id'], $_SESSION['key'], 'profile', $SETTINGS) === false
51
    || checkUser($_SESSION['user_id'], $_SESSION['key'], 'users', $SETTINGS) === false
52
) {
53
    if (
54
        null === $isprofileupdate
55
        || $isprofileupdate === false
56
    ) {
57
        $_SESSION['error']['code'] = ERR_NOT_ALLOWED; //not allowed page
58
        include $SETTINGS['cpassman_dir'] . '/error.php';
59
        exit();
60
    } else {
61
        // Do special check to allow user to change attributes of his profile
62
        if (
63
            empty($filtered_newvalue) === true
64
            || checkUser($_SESSION['user_id'], $_SESSION['key'], 'profile', $SETTINGS) === false
65
        ) {
66
            $_SESSION['error']['code'] = ERR_NOT_ALLOWED; //not allowed page
67
            include $SETTINGS['cpassman_dir'] . '/error.php';
68
            exit();
69
        }
70
    }
71
}
72
73
require_once $SETTINGS['cpassman_dir'] . '/includes/config/settings.php';
74
header('Content-type: text/html; charset=utf-8');
75
require_once $SETTINGS['cpassman_dir'] . '/includes/language/' . $_SESSION['user_language'] . '.php';
76
require_once $SETTINGS['cpassman_dir'] . '/sources/main.functions.php';
77
require_once $SETTINGS['cpassman_dir'] . '/sources/SplClassLoader.php';
78
79
// Connect to mysql server
80
require_once $SETTINGS['cpassman_dir'] . '/includes/libraries/Database/Meekrodb/db.class.php';
81
if (defined('DB_PASSWD_CLEAR') === false) {
82
    define('DB_PASSWD_CLEAR', defuseReturnDecrypted(DB_PASSWD, $SETTINGS));
0 ignored issues
show
Bug introduced by
The constant DB_PASSWD was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
83
}
84
DB::$host = DB_HOST;
0 ignored issues
show
Bug introduced by
The constant DB_HOST was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
85
DB::$user = DB_USER;
0 ignored issues
show
Bug introduced by
The constant DB_USER was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
86
DB::$password = DB_PASSWD_CLEAR;
87
DB::$dbName = DB_NAME;
0 ignored issues
show
Bug introduced by
The constant DB_NAME was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
88
DB::$port = DB_PORT;
0 ignored issues
show
Bug introduced by
The constant DB_PORT was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
89
DB::$encoding = DB_ENCODING;
90
//$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD_CLEAR, DB_NAME, DB_PORT);
91
//$link->set_charset(DB_ENCODING);
92
93
//Load Tree
94
$tree = new SplClassLoader('Tree\NestedTree', '../includes/libraries');
95
$tree->register();
96
$tree = new Tree\NestedTree\NestedTree(prefixTable('nested_tree'), 'id', 'parent_id', 'title');
97
98
// Prepare post variables
99
$post_key = filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING);
100
$post_type = filter_input(INPUT_POST, 'type', FILTER_SANITIZE_STRING);
101
$post_data = filter_input(INPUT_POST, 'data', FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
102
$password_do_not_change = 'do_not_change';
103
104
if (null !== $post_type) {
105
    switch ($post_type) {
106
            /*
107
         * ADD NEW USER
108
         */
109
        case 'add_new_user':
110
            // Check KEY
111
            if ($post_key !== $_SESSION['key']) {
112
                echo prepareExchangedData(
113
                    array(
114
                        'error' => true,
115
                        'message' => langHdl('key_is_not_correct'),
116
                    ),
117
                    'encode'
118
                );
119
                break;
120
            } elseif ($_SESSION['user_read_only'] === true) {
121
                echo prepareExchangedData(
122
                    array(
123
                        'error' => true,
124
                        'message' => langHdl('error_not_allowed_to'),
125
                    ),
126
                    'encode'
127
                );
128
                break;
129
            }
130
131
            // decrypt and retrieve data in JSON format
132
            $dataReceived = prepareExchangedData($post_data, 'decode');
133
134
            // Prepare variables
135
            $login = filter_var($dataReceived['login'], FILTER_SANITIZE_STRING);
136
            $email = filter_var($dataReceived['email'], FILTER_SANITIZE_EMAIL);
137
            $password = filter_var($dataReceived['pw'], FILTER_SANITIZE_STRING);
138
            $lastname = filter_var($dataReceived['lastname'], FILTER_SANITIZE_STRING);
139
            $name = filter_var($dataReceived['name'], FILTER_SANITIZE_STRING);
140
            $is_admin = filter_var($dataReceived['admin'], FILTER_SANITIZE_NUMBER_INT);
141
            $is_manager = filter_var($dataReceived['manager'], FILTER_SANITIZE_NUMBER_INT);
142
            $is_hr = filter_var($dataReceived['hr'], FILTER_SANITIZE_NUMBER_INT);
143
            $is_read_only = filter_var($dataReceived['read_only'], FILTER_SANITIZE_NUMBER_INT) || 0;
144
            $has_personal_folder = filter_var($dataReceived['personal_folder'], FILTER_SANITIZE_NUMBER_INT);
145
            $new_folder_role_domain = filter_var($dataReceived['new_folder_role_domain'], FILTER_SANITIZE_NUMBER_INT);
146
            $domain = filter_var($dataReceived['domain'], FILTER_SANITIZE_STRING);
147
            $is_administrated_by = filter_var($dataReceived['isAdministratedByRole'], FILTER_SANITIZE_STRING);
148
            $groups = filter_var_array($dataReceived['groups'], FILTER_SANITIZE_NUMBER_INT);
149
            $allowed_flds = filter_var_array($dataReceived['allowed_flds'], FILTER_SANITIZE_NUMBER_INT);
150
            $forbidden_flds = filter_var_array($dataReceived['forbidden_flds'], FILTER_SANITIZE_NUMBER_INT);
151
152
            // Empty user
153
            if (empty($login) === true) {
154
                echo prepareExchangedData(
155
                    array(
156
                        'error' => true,
157
                        'message' => langHdl('error_empty_data'),
158
                    ),
159
                    'encode'
160
                );
161
                break;
162
            }
163
            // Check if user already exists
164
            $data = DB::query(
165
                'SELECT id, fonction_id, groupes_interdits, groupes_visibles
166
                FROM ' . prefixTable('users') . '
167
                WHERE login = %s',
168
                $login
169
            );
170
171
            if (DB::count() === 0) {
172
                // check if admin role is set. If yes then check if originator is allowed
173
                if ($dataReceived['admin'] === 'true' && $_SESSION['user_admin'] !== '1') {
174
                    echo prepareExchangedData(
175
                        array(
176
                            'error' => true,
177
                            'message' => langHdl('error_empty_data'),
178
                        ),
179
                        'encode'
180
                    );
181
                    break;
182
                }
183
184
                // load passwordLib library
185
                $pwdlib = new SplClassLoader('PasswordLib', '../includes/libraries');
186
                $pwdlib->register();
187
                $pwdlib = new PasswordLib\PasswordLib();
188
189
                // Prepare variables
190
                $hashedPassword = $pwdlib->createPasswordHash($password);
191
                if ($pwdlib->verifyPasswordHash($password, $hashedPassword) === false) {
192
                    echo prepareExchangedData(
193
                        array(
194
                            'error' => true,
195
                            'message' => langHdl('pwd_hash_not_correct'),
196
                        ),
197
                        'encode'
198
                    );
199
                    break;
200
                }
201
202
                // Add user in DB
203
                DB::insert(
204
                    prefixTable('users'),
205
                    array(
206
                        'login' => $login,
207
                        'name' => $name,
208
                        'lastname' => $lastname,
209
                        'pw' => $hashedPassword,
210
                        'email' => $email,
211
                        'admin' => empty($is_admin) === true ? 0 : $is_admin,
212
                        'can_manage_all_users' => empty($is_hr) === true ? 0 : $is_hr,
213
                        'gestionnaire' => empty($is_manager) === true ? 0 : $is_manager,
214
                        'read_only' => empty($is_read_only) === true ? 0 : $is_read_only,
215
                        'personal_folder' => empty($has_personal_folder) === true ? 0 : $has_personal_folder,
216
                        'user_language' => $SETTINGS['default_language'],
217
                        'fonction_id' => implode(';', $groups),
218
                        'groupes_interdits' => implode(';', $forbidden_flds),
219
                        'groupes_visibles' => implode(';', $allowed_flds),
220
                        'isAdministratedByRole' => $is_administrated_by,
221
                        'encrypted_psk' => '',
222
                    )
223
                );
224
                $new_user_id = DB::insertId();
225
                // Create personnal folder
226
                if ($has_personal_folder === 1) {
227
                    DB::insert(
228
                        prefixTable('nested_tree'),
229
                        array(
230
                            'parent_id' => '0',
231
                            'title' => $new_user_id,
232
                            'bloquer_creation' => '0',
233
                            'bloquer_modification' => '0',
234
                            'personal_folder' => '1',
235
                        )
236
                    );
237
                    $tree->rebuild();
238
                }
239
                // Create folder and role for domain
240
                if ($new_folder_role_domain === 1) {
241
                    // create folder
242
                    DB::insert(
243
                        prefixTable('nested_tree'),
244
                        array(
245
                            'parent_id' => 0,
246
                            'title' => $domain,
247
                            'personal_folder' => 0,
248
                            'renewal_period' => 0,
249
                            'bloquer_creation' => '0',
250
                            'bloquer_modification' => '0',
251
                        )
252
                    );
253
                    $new_folder_id = DB::insertId();
254
                    // Add complexity
255
                    DB::insert(
256
                        prefixTable('misc'),
257
                        array(
258
                            'type' => 'complex',
259
                            'intitule' => $new_folder_id,
260
                            'valeur' => 50,
261
                        )
262
                    );
263
                    // Create role
264
                    DB::insert(
265
                        prefixTable('roles_title'),
266
                        array(
267
                            'title' => $domain,
268
                        )
269
                    );
270
                    $new_role_id = DB::insertId();
271
                    // Associate new role to new folder
272
                    DB::insert(
273
                        prefixTable('roles_values'),
274
                        array(
275
                            'folder_id' => $new_folder_id,
276
                            'role_id' => $new_role_id,
277
                        )
278
                    );
279
                    // Add the new user to this role
280
                    DB::update(
281
                        prefixTable('users'),
282
                        array(
283
                            'fonction_id' => is_int($new_role_id),
284
                        ),
285
                        'id=%i',
286
                        $new_user_id
287
                    );
288
                    // rebuild tree
289
                    $tree->rebuild();
290
                }
291
292
                // Create the API key
293
                DB::insert(
294
                    prefixTable('api'),
295
                    array(
296
                        'type' => 'user',
297
                        'label' => $new_user_id,
298
                        'value' => uniqidReal(39),
299
                        'timestamp' => time(),
300
                    )
301
                );
302
303
                // get links url
304
                if (empty($SETTINGS['email_server_url']) === true) {
305
                    $SETTINGS['email_server_url'] = $SETTINGS['cpassman_url'];
306
                }
307
                // Send email to new user
308
                sendEmail(
309
                    langHdl('email_subject_new_user'),
310
                    str_replace(array('#tp_login#', '#tp_pw#', '#tp_link#'), array(' ' . addslashes($login), addslashes($password), $SETTINGS['email_server_url']), langHdl('email_new_user_mail')),
311
                    $dataReceived['email'],
312
                    $SETTINGS
313
                );
314
                // update LOG
315
                logEvents(
316
                    'user_mngt',
317
                    'at_user_added',
318
                    $_SESSION['user_id'],
319
                    $_SESSION['login'],
320
                    $new_user_id
321
                );
322
323
                echo prepareExchangedData(
324
                    array(
325
                        'error' => 'no',
326
                        'message' => '',
327
                    ),
328
                    'encode'
329
                );
330
            } else {
331
                echo prepareExchangedData(
332
                    array(
333
                        'error' => true,
334
                        'message' => langHdl('error_user_exists'),
335
                    ),
336
                    'encode'
337
                );
338
            }
339
            break;
340
341
            /*
342
         * Delete the user
343
         */
344
        case 'delete_user':
345
            // Check KEY
346
            if ($post_key !== $_SESSION['key']) {
347
                echo prepareExchangedData(
348
                    array(
349
                        'error' => true,
350
                        'message' => langHdl('key_is_not_correct'),
351
                    ),
352
                    'encode'
353
                );
354
                break;
355
            } elseif ($_SESSION['user_read_only'] === true) {
356
                echo prepareExchangedData(
357
                    array(
358
                        'error' => true,
359
                        'message' => langHdl('error_not_allowed_to'),
360
                    ),
361
                    'encode'
362
                );
363
                break;
364
            }
365
366
            // decrypt and retrieve data in JSON format
367
            $dataReceived = prepareExchangedData($post_data, 'decode');
368
369
            // Prepare variables
370
            $post_id = filter_var($dataReceived['user_id'], FILTER_SANITIZE_NUMBER_INT);
371
372
            // Get info about user to delete
373
            $data_user = DB::queryfirstrow(
374
                'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
375
                WHERE id = %i',
376
                $post_id
377
            );
378
379
            // Is this user allowed to do this?
380
            if (
381
                (int) $_SESSION['is_admin'] === 1
382
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
383
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
384
            ) {
385
                // delete user in database
386
                DB::delete(
387
                    prefixTable('users'),
388
                    'id = %i',
389
                    $post_id
390
                );
391
                // delete personal folder and subfolders
392
                $data = DB::queryfirstrow(
393
                    'SELECT id FROM ' . prefixTable('nested_tree') . '
394
                    WHERE title = %s AND personal_folder = %i',
395
                    $post_id,
396
                    '1'
397
                );
398
                // Get through each subfolder
399
                if (!empty($data['id'])) {
400
                    $folders = $tree->getDescendants($data['id'], true);
401
                    foreach ($folders as $folder) {
402
                        // delete folder
403
                        DB::delete(prefixTable('nested_tree'), 'id = %i AND personal_folder = %i', $folder->id, '1');
404
                        // delete items & logs
405
                        $items = DB::query(
406
                            'SELECT id FROM ' . prefixTable('items') . '
407
                            WHERE id_tree=%i AND perso = %i',
408
                            $folder->id,
409
                            '1'
410
                        );
411
                        foreach ($items as $item) {
412
                            // Delete item
413
                            DB::delete(prefixTable('items'), 'id = %i', $item['id']);
414
                            // log
415
                            DB::delete(prefixTable('log_items'), 'id_item = %i', $item['id']);
416
                        }
417
                    }
418
                    // rebuild tree
419
                    $tree = new Tree\NestedTree\NestedTree(prefixTable('nested_tree'), 'id', 'parent_id', 'title');
420
                    $tree->rebuild();
421
                }
422
423
                // Delete objects keys
424
                deleteUserObjetsKeys($post_id, $SETTINGS);
425
426
                // update LOG
427
                logEvents('user_mngt', 'at_user_deleted', $_SESSION['user_id'], $_SESSION['login'], $post_id);
428
429
                //Send back
430
                echo prepareExchangedData(
431
                    array(
432
                        'error' => 'no',
433
                        'message' => '',
434
                    ),
435
                    'encode'
436
                );
437
            } else {
438
                //Send back
439
                echo prepareExchangedData(
440
                    array(
441
                        'error' => 'no',
442
                        'message' => langHdl('error_not_allowed_to'),
443
                    ),
444
                    'encode'
445
                );
446
            }
447
            break;
448
449
            /*
450
         * UPDATE CAN CREATE ROOT FOLDER RIGHT
451
         */
452
        case 'can_create_root_folder':
453
            // Check KEY
454
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
455
                echo prepareExchangedData(array('error' => 'not_allowed', 'error_text' => langHdl('error_not_allowed_to')), 'encode');
456
                break;
457
            }
458
459
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
460
461
            // Get info about user to delete
462
            $data_user = DB::queryfirstrow(
463
                'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
464
                WHERE id = %i',
465
                $post_id
466
            );
467
468
            // Is this user allowed to do this?
469
            if (
470
                (int) $_SESSION['is_admin'] === 1
471
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
472
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
473
            ) {
474
                DB::update(
475
                    prefixTable('users'),
476
                    array(
477
                        'can_create_root_folder' => filter_input(INPUT_POST, 'value', FILTER_SANITIZE_STRING),
478
                    ),
479
                    'id = %i',
480
                    $post_id
481
                );
482
                echo prepareExchangedData(array('error' => ''), 'encode');
483
            } else {
484
                echo prepareExchangedData(array('error' => 'not_allowed'), 'encode');
485
            }
486
            break;
487
            /*
488
         * UPDATE ADMIN RIGHTS FOR USER
489
         */
490
        case 'admin':
491
            // Check KEY
492
            if (
493
                filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)
494
                || $_SESSION['is_admin'] !== '1'
495
            ) {
496
                echo prepareExchangedData(array('error' => 'not_allowed', 'error_text' => langHdl('error_not_allowed_to')), 'encode');
497
                exit();
498
            }
499
500
            $post_value = filter_input(INPUT_POST, 'value', FILTER_SANITIZE_NUMBER_INT);
501
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
502
503
            // Get info about user to delete
504
            $data_user = DB::queryfirstrow(
505
                'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
506
                WHERE id = %i',
507
                $post_id
508
            );
509
510
            // Is this user allowed to do this?
511
            if (
512
                (int) $_SESSION['is_admin'] === 1
513
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
514
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
515
            ) {
516
                DB::update(
517
                    prefixTable('users'),
518
                    array(
519
                        'admin' => $post_value,
520
                        'gestionnaire' => $post_value === 1 ? '0' : '0',
521
                        'read_only' => $post_value === 1 ? '0' : '0',
522
                    ),
523
                    'id = %i',
524
                    $post_id
525
                );
526
527
                echo prepareExchangedData(array('error' => ''), 'encode');
528
            } else {
529
                echo prepareExchangedData(array('error' => 'not_allowed'), 'encode');
530
            }
531
            break;
532
            /*
533
         * UPDATE MANAGER RIGHTS FOR USER
534
         */
535
        case 'gestionnaire':
536
            // Check KEY
537
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
538
                echo prepareExchangedData(array('error' => 'not_allowed', 'error_text' => langHdl('error_not_allowed_to')), 'encode');
539
                break;
540
            }
541
542
            $post_value = filter_input(INPUT_POST, 'value', FILTER_SANITIZE_NUMBER_INT);
543
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
544
545
            // Get info about user to delete
546
            $data_user = DB::queryfirstrow(
547
                'SELECT admin, isAdministratedByRole, can_manage_all_users, gestionnaire
548
                FROM ' . prefixTable('users') . '
549
                WHERE id = %i',
550
                $post_id
551
            );
552
553
            // Is this user allowed to do this?
554
            if (
555
                (int) $_SESSION['is_admin'] === 1
556
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
557
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
558
            ) {
559
                DB::update(
560
                    prefixTable('users'),
561
                    array(
562
                        'gestionnaire' => $post_value,
563
                        'can_manage_all_users' => ($data_user['can_manage_all_users'] === '0' && $post_value === '1') ? '0' : (
564
                            ($data_user['can_manage_all_users'] === '0' && $post_value === '0') ? '0' : (
565
                                ($data_user['can_manage_all_users'] === '1' && $post_value === '0') ? '0' : '1')),
566
                        'admin' => $post_value === 1 ? '0' : '0',
567
                        'read_only' => $post_value === 1 ? '0' : '0',
568
                    ),
569
                    'id = %i',
570
                    $post_id
571
                );
572
                echo prepareExchangedData(array('error' => ''), 'encode');
573
            } else {
574
                echo prepareExchangedData(array('error' => 'not_allowed'), 'encode');
575
            }
576
            break;
577
            /*
578
         * UPDATE READ ONLY RIGHTS FOR USER
579
         */
580
        case 'read_only':
581
            // Check KEY
582
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
583
                echo prepareExchangedData(array('error' => 'not_allowed', 'error_text' => langHdl('error_not_allowed_to')), 'encode');
584
                break;
585
            }
586
587
            $post_value = filter_input(INPUT_POST, 'value', FILTER_SANITIZE_NUMBER_INT);
588
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
589
590
            // Get info about user to delete
591
            $data_user = DB::queryfirstrow(
592
                'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
593
                WHERE id = %i',
594
                $post_id
595
            );
596
597
            // Is this user allowed to do this?
598
            if (
599
                (int) $_SESSION['is_admin'] === 1
600
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
601
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
602
            ) {
603
                DB::update(
604
                    prefixTable('users'),
605
                    array(
606
                        'read_only' => $post_value,
607
                        'gestionnaire' => $post_value === 1 ? '0' : '0',
608
                        'admin' => $post_value === 1 ? 0 : '0',
609
                    ),
610
                    'id = %i',
611
                    $post_id
612
                );
613
                echo prepareExchangedData(array('error' => ''), 'encode');
614
            } else {
615
                echo prepareExchangedData(array('error' => 'not_allowed'), 'encode');
616
            }
617
            break;
618
            /*
619
         * UPDATE CAN MANAGE ALL USERS RIGHTS FOR USER
620
         * Notice that this role must be also Manager
621
         */
622
        case 'can_manage_all_users':
623
            // Check KEY
624
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
625
                echo prepareExchangedData(array('error' => 'not_allowed', 'error_text' => langHdl('error_not_allowed_to')), 'encode');
626
                break;
627
            }
628
629
            $post_value = filter_input(INPUT_POST, 'value', FILTER_SANITIZE_NUMBER_INT);
630
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
631
632
            // Get info about user to delete
633
            $data_user = DB::queryfirstrow(
634
                'SELECT admin, isAdministratedByRole, gestionnaire
635
                FROM ' . prefixTable('users') . '
636
                WHERE id = %i',
637
                $post_id
638
            );
639
640
            // Is this user allowed to do this?
641
            if (
642
                (int) $_SESSION['is_admin'] === 1
643
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
644
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
645
            ) {
646
                DB::update(
647
                    prefixTable('users'),
648
                    array(
649
                        'can_manage_all_users' => $post_value,
650
                        'gestionnaire' => ($data_user['gestionnaire'] === '0' && $post_value === 1) ? '1' : (($data_user['gestionnaire'] === '1' && $post_value === 1) ? '1' : (($data_user['gestionnaire'] === '1' && $post_value === 0) ? '1' : '0')),
651
                        'admin' => $post_value === 1 ? '1' : '0',
652
                        'read_only' => $post_value === 1 ? '1' : '0',
653
                    ),
654
                    'id = %i',
655
                    $post_id
656
                );
657
                echo prepareExchangedData(array('error' => ''), 'encode');
658
            } else {
659
                echo prepareExchangedData(array('error' => 'not_allowed'), 'encode');
660
            }
661
            break;
662
            /*
663
         * UPDATE PERSONNAL FOLDER FOR USER
664
         */
665
        case 'personal_folder':
666
            // Check KEY
667
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
668
                echo prepareExchangedData(array('error' => 'not_allowed', 'error_text' => langHdl('error_not_allowed_to')), 'encode');
669
                break;
670
            }
671
672
            $post_value = filter_input(INPUT_POST, 'value', FILTER_SANITIZE_NUMBER_INT);
673
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
674
675
            // Get info about user to delete
676
            $data_user = DB::queryfirstrow(
677
                'SELECT admin, isAdministratedByRole, gestionnaire
678
                FROM ' . prefixTable('users') . '
679
                WHERE id = %i',
680
                $post_id
681
            );
682
683
            // Is this user allowed to do this?
684
            if (
685
                (int) $_SESSION['is_admin'] === 1
686
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
687
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
688
            ) {
689
                DB::update(
690
                    prefixTable('users'),
691
                    array(
692
                        'personal_folder' => $post_value === '1' ? '1' : '0',
693
                    ),
694
                    'id = %i',
695
                    $post_id
696
                );
697
                echo prepareExchangedData(array('error' => ''), 'encode');
698
            } else {
699
                echo prepareExchangedData(array('error' => 'not_allowed'), 'encode');
700
            }
701
            break;
702
703
            /*
704
         * Unlock user
705
         */
706
        case 'unlock_account':
707
            // Check KEY
708
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
709
                echo '[ { "error" : "key_not_conform" } ]';
710
                break;
711
            }
712
713
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
714
715
            // Get info about user to delete
716
            $data_user = DB::queryfirstrow(
717
                'SELECT admin, isAdministratedByRole, gestionnaire
718
                FROM ' . prefixTable('users') . '
719
                WHERE id = %i',
720
                $post_id
721
            );
722
723
            // Is this user allowed to do this?
724
            if (
725
                (int) $_SESSION['is_admin'] === 1
726
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
727
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
728
            ) {
729
                DB::update(
730
                    prefixTable('users'),
731
                    array(
732
                        'disabled' => 0,
733
                        'no_bad_attempts' => 0,
734
                    ),
735
                    'id = %i',
736
                    $post_id
737
                );
738
                // update LOG
739
                logEvents(
740
                    'user_mngt',
741
                    'at_user_unlocked',
742
                    $_SESSION['user_id'],
743
                    $_SESSION['login'],
744
                    $post_id
745
                );
746
            }
747
            break;
748
749
            /*
750
        * Check the domain
751
        */
752
        case 'check_domain':
753
            $return = array();
754
            // Check if folder exists
755
            $data = DB::query(
756
                'SELECT * FROM ' . prefixTable('nested_tree') . '
757
                WHERE title = %s AND parent_id = %i',
758
                filter_input(INPUT_POST, 'domain', FILTER_SANITIZE_STRING),
759
                '0'
760
            );
761
            $counter = DB::count();
762
            if ($counter != 0) {
763
                $return['folder'] = 'exists';
764
            } else {
765
                $return['folder'] = 'not_exists';
766
            }
767
            // Check if role exists
768
            $data = DB::query(
769
                'SELECT * FROM ' . prefixTable('roles_title') . '
770
                WHERE title = %s',
771
                filter_input(INPUT_POST, 'domain', FILTER_SANITIZE_STRING)
772
            );
773
            $counter = DB::count();
774
            if ($counter != 0) {
775
                $return['role'] = 'exists';
776
            } else {
777
                $return['role'] = 'not_exists';
778
            }
779
780
            echo json_encode($return);
781
            break;
782
783
            /*
784
        * Get logs for a user
785
        */
786
        case 'user_log_items':
787
            $nb_pages = 1;
788
            $logs = $sql_filter = '';
789
            $pages = '<table style=\'border-top:1px solid #969696;\'><tr><td>' . langHdl('pages') . '&nbsp;:&nbsp;</td>';
790
791
            // Prepare POST variables
792
            $post_nb_items_by_page = filter_input(INPUT_POST, 'nb_items_by_page', FILTER_SANITIZE_NUMBER_INT);
793
            $post_scope = filter_input(INPUT_POST, 'scope', FILTER_SANITIZE_STRING);
794
795
            if (filter_input(INPUT_POST, 'scope', FILTER_SANITIZE_STRING) === 'user_activity') {
796
                if (
797
                    null !== filter_input(INPUT_POST, 'filter', FILTER_SANITIZE_STRING)
798
                    && !empty(filter_input(INPUT_POST, 'filter', FILTER_SANITIZE_STRING))
799
                    && filter_input(INPUT_POST, 'filter', FILTER_SANITIZE_STRING) !== 'all'
800
                ) {
801
                    $sql_filter = " AND l.action = '" . filter_input(INPUT_POST, 'filter', FILTER_SANITIZE_STRING) . "'";
802
                }
803
                // get number of pages
804
                DB::query(
805
                    'SELECT *
806
                    FROM ' . prefixTable('log_items') . ' as l
807
                    INNER JOIN ' . prefixTable('items') . ' as i ON (l.id_item=i.id)
808
                    INNER JOIN ' . prefixTable('users') . ' as u ON (l.id_user=u.id)
809
                    WHERE l.id_user = %i ' . $sql_filter,
810
                    filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT)
811
                );
812
                $counter = DB::count();
813
                // define query limits
814
                if (
815
                    null !== filter_input(INPUT_POST, 'page', FILTER_SANITIZE_NUMBER_INT)
816
                    && filter_input(INPUT_POST, 'page', FILTER_SANITIZE_NUMBER_INT) > 1
817
                ) {
818
                    $start = (intval($post_nb_items_by_page)
819
                        * (intval(filter_input(INPUT_POST, 'page', FILTER_SANITIZE_NUMBER_INT)) - 1)) + 1;
820
                } else {
821
                    $start = 0;
822
                }
823
                // launch query
824
                $rows = DB::query(
825
                    'SELECT l.date as date, u.login as login, i.label as label, l.action as action
826
                    FROM ' . prefixTable('log_items') . ' as l
827
                    INNER JOIN ' . prefixTable('items') . ' as i ON (l.id_item=i.id)
828
                    INNER JOIN ' . prefixTable('users') . ' as u ON (l.id_user=u.id)
829
                    WHERE l.id_user = %i ' . $sql_filter . '
830
                    ORDER BY date DESC
831
                    LIMIT ' . intval($start) . ',' . intval($post_nb_items_by_page),
832
                    filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT)
833
                );
834
            } else {
835
                // get number of pages
836
                DB::query(
837
                    'SELECT *
838
                    FROM ' . prefixTable('log_system') . '
839
                    WHERE type = %s AND field_1=%i',
840
                    'user_mngt',
841
                    filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT)
842
                );
843
                $counter = DB::count();
844
                // define query limits
845
                if (
846
                    null !== filter_input(INPUT_POST, 'page', FILTER_SANITIZE_NUMBER_INT)
847
                    && filter_input(INPUT_POST, 'page', FILTER_SANITIZE_NUMBER_INT) > 1
848
                ) {
849
                    $start = (intval($post_nb_items_by_page)
850
                        * (intval(filter_input(INPUT_POST, 'page', FILTER_SANITIZE_NUMBER_INT)) - 1)) + 1;
851
                } else {
852
                    $start = 0;
853
                }
854
                // launch query
855
                $rows = DB::query(
856
                    'SELECT *
857
                    FROM ' . prefixTable('log_system') . '
858
                    WHERE type = %s AND field_1 = %i
859
                    ORDER BY date DESC
860
                    LIMIT %i, %i',
861
                    'user_mngt',
862
                    filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT),
863
                    filter_var($start, FILTER_SANITIZE_NUMBER_INT),
864
                    $post_nb_items_by_page
865
                );
866
            }
867
            // generate data
868
            if (isset($counter) && $counter != 0) {
869
                $nb_pages = ceil($counter / intval($post_nb_items_by_page));
870
                for ($i = 1; $i <= $nb_pages; ++$i) {
871
                    $pages .= '<td onclick=\'displayLogs(' . $i . ',\"' . $post_scope . '\")\'><span style=\'cursor:pointer;' . (filter_input(INPUT_POST, 'page', FILTER_SANITIZE_NUMBER_INT) === $i ? 'font-weight:bold;font-size:18px;\'>' . $i : '\'>' . $i) . '</span></td>';
872
                }
873
            }
874
            $pages .= '</tr></table>';
875
            if (isset($rows)) {
876
                foreach ($rows as $record) {
877
                    if ($post_scope === 'user_mngt') {
878
                        $user = DB::queryfirstrow(
879
                            'SELECT login
880
                            from ' . prefixTable('users') . '
881
                            WHERE id=%i',
882
                            $record['qui']
883
                        );
884
                        $user_1 = DB::queryfirstrow(
885
                            'SELECT login
886
                            from ' . prefixTable('users') . '
887
                            WHERE id=%i',
888
                            filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT)
889
                        );
890
                        $tmp = explode(':', $record['label']);
891
                        // extract action done
892
                        $label = '';
893
                        if ($tmp[0] == 'at_user_initial_pwd_changed') {
894
                            $label = langHdl('log_user_initial_pwd_changed');
895
                        } elseif ($tmp[0] == 'at_user_email_changed') {
896
                            $label = langHdl('log_user_email_changed') . $tmp[1];
897
                        } elseif ($tmp[0] == 'at_user_added') {
898
                            $label = langHdl('log_user_created');
899
                        } elseif ($tmp[0] == 'at_user_locked') {
900
                            $label = langHdl('log_user_locked');
901
                        } elseif ($tmp[0] == 'at_user_unlocked') {
902
                            $label = langHdl('log_user_unlocked');
903
                        } elseif ($tmp[0] == 'at_user_pwd_changed') {
904
                            $label = langHdl('log_user_pwd_changed');
905
                        }
906
                        // prepare log
907
                        $logs .= '<tr><td>' . date($SETTINGS['date_format'] . ' ' . $SETTINGS['time_format'], $record['date']) . '</td><td align=\"center\">' . $label . '</td><td align=\"center\">' . $user['login'] . '</td><td align=\"center\"></td></tr>';
908
                    } else {
909
                        $logs .= '<tr><td>' . date($SETTINGS['date_format'] . ' ' . $SETTINGS['time_format'], $record['date']) . '</td><td align=\"center\">' . str_replace('"', '\"', $record['label']) . '</td><td align=\"center\">' . $record['login'] . '</td><td align=\"center\">' . langHdl($record['action']) . '</td></tr>';
910
                    }
911
                }
912
            }
913
914
            echo '[ { "table_logs": "' . ($logs) . '", "pages": "' . ($pages) . '", "error" : "no" } ]';
915
            break;
916
917
            /*
918
        * Migrate the Admin PF to User
919
        */
920
        case 'migrate_admin_pf':
921
            // decrypt and retreive data in JSON format
922
            $dataReceived = prepareExchangedData(
923
                filter_input(INPUT_POST, 'data', FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES),
924
                'decode'
925
            );
926
            // Prepare variables
927
            $user_id = htmlspecialchars_decode($data_received['user_id']);
928
            $salt_user = htmlspecialchars_decode($data_received['salt_user']);
929
930
            if (!isset($_SESSION['user_settings']['clear_psk']) || $_SESSION['user_settings']['clear_psk'] == '') {
931
                echo '[ { "error" : "no_sk" } ]';
932
            } elseif ($salt_user == '') {
933
                echo '[ { "error" : "no_sk_user" } ]';
934
            } elseif ($user_id == '') {
935
                echo '[ { "error" : "no_user_id" } ]';
936
            } else {
937
                // Get folder id for Admin
938
                $admin_folder = DB::queryFirstRow(
939
                    'SELECT id FROM ' . prefixTable('nested_tree') . '
940
                    WHERE title = %i AND personal_folder = %i',
941
                    intval($_SESSION['user_id']),
942
                    '1'
943
                );
944
                // Get folder id for User
945
                $user_folder = DB::queryFirstRow(
946
                    'SELECT id FROM ' . prefixTable('nested_tree') . '
947
                    WHERE title=%i AND personal_folder = %i',
948
                    intval($user_id),
949
                    '1'
950
                );
951
                // Get through each subfolder
952
                foreach ($tree->getDescendants($admin_folder['id'], true) as $folder) {
953
                    // Get each Items in PF
954
                    $rows = DB::query(
955
                        'SELECT i.pw, i.label, l.id_user
956
                        FROM ' . prefixTable('items') . ' as i
957
                        LEFT JOIN ' . prefixTable('log_items') . ' as l ON (l.id_item=i.id)
958
                        WHERE l.action = %s AND i.perso=%i AND i.id_tree=%i',
959
                        'at_creation',
960
                        '1',
961
                        intval($folder->id)
962
                    );
963
                    foreach ($rows as $record) {
964
                        echo $record['label'] . ' - ';
965
                        // Change user
966
                        DB::update(
967
                            prefixTable('log_items'),
968
                            array(
969
                                'id_user' => $user_id,
970
                            ),
971
                            'id_item = %i AND id_user $ %i AND action = %s',
972
                            $record['id'],
973
                            $user_id,
974
                            'at_creation'
975
                        );
976
                    }
977
                }
978
                $tree->rebuild();
979
                echo '[ { "error" : "no" } ]';
980
            }
981
982
            break;
983
984
            /*
985
         * delete the timestamp value for specified user => disconnect
986
         */
987
        case 'disconnect_user':
988
            // Check KEY
989
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
990
                echo '[ { "error" : "key_not_conform" } ]';
991
                break;
992
            }
993
994
            $post_user_id = filter_input(INPUT_POST, 'user_id', FILTER_SANITIZE_NUMBER_INT);
995
996
            // Get info about user to delete
997
            $data_user = DB::queryfirstrow(
998
                'SELECT admin, isAdministratedByRole, gestionnaire
999
                FROM ' . prefixTable('users') . '
1000
                WHERE id = %i',
1001
                $post_user_id
1002
            );
1003
1004
            // Is this user allowed to do this?
1005
            if (
1006
                (int) $_SESSION['is_admin'] === 1
1007
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
1008
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
1009
            ) {
1010
                // Do
1011
                DB::update(
1012
                    prefixTable('users'),
1013
                    array(
1014
                        'timestamp' => '',
1015
                        'key_tempo' => '',
1016
                        'session_end' => '',
1017
                    ),
1018
                    'id = %i',
1019
                    $post_user_id
1020
                );
1021
            }
1022
            break;
1023
1024
            /*
1025
         * delete the timestamp value for all users
1026
         */
1027
        case 'disconnect_all_users':
1028
            // Check KEY
1029
            if (filter_input(INPUT_POST, 'key', FILTER_SANITIZE_STRING) !== filter_var($_SESSION['key'], FILTER_SANITIZE_STRING)) {
1030
                echo '[ { "error" : "key_not_conform" } ]';
1031
                break;
1032
            }
1033
1034
            // Do
1035
            $rows = DB::query(
1036
                'SELECT id FROM ' . prefixTable('users') . '
1037
                WHERE timestamp != %s AND admin != %i',
1038
                '',
1039
                '1'
1040
            );
1041
            foreach ($rows as $record) {
1042
                // Get info about user to delete
1043
                $data_user = DB::queryfirstrow(
1044
                    'SELECT admin, isAdministratedByRole, gestionnaire
1045
                    FROM ' . prefixTable('users') . '
1046
                    WHERE id = %i',
1047
                    $record['id']
1048
                );
1049
1050
                // Is this user allowed to do this?
1051
                if (
1052
                    (int) $_SESSION['is_admin'] === 1
1053
                    || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
1054
                    || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
1055
                ) {
1056
                    DB::update(
1057
                        prefixTable('users'),
1058
                        array(
1059
                            'timestamp' => '',
1060
                            'key_tempo' => '',
1061
                            'session_end' => '',
1062
                        ),
1063
                        'id = %i',
1064
                        intval($record['id'])
1065
                    );
1066
                }
1067
            }
1068
            break;
1069
            /*
1070
         * Get user info
1071
         */
1072
        case 'get_user_info':
1073
            // Check KEY
1074
            if ($post_key !== $_SESSION['key']) {
1075
                echo prepareExchangedData(
1076
                    array(
1077
                        'error' => true,
1078
                        'message' => langHdl('key_is_not_correct'),
1079
                    ),
1080
                    'encode'
1081
                );
1082
                break;
1083
            } elseif ($_SESSION['user_read_only'] === true) {
1084
                echo prepareExchangedData(
1085
                    array(
1086
                        'error' => true,
1087
                        'message' => langHdl('error_not_allowed_to'),
1088
                    ),
1089
                    'encode'
1090
                );
1091
                break;
1092
            }
1093
1094
            $post_id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
1095
1096
            // Get info about user
1097
            $rowUser = DB::queryfirstrow(
1098
                'SELECT *
1099
                FROM ' . prefixTable('users') . '
1100
                WHERE id = %i',
1101
                $post_id
1102
            );
1103
1104
            // Is this user allowed to do this?
1105
            if (
1106
                (int) $_SESSION['is_admin'] === 1
1107
                || (in_array($rowUser['isAdministratedByRole'], $_SESSION['user_roles']) === true)
1108
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && $rowUser['admin'] !== '1')
1109
            ) {
1110
                $arrData = array();
1111
                $arrFunction = array();
1112
                $arrMngBy = array();
1113
                $arrFldForbidden = array();
1114
                $arrFldAllowed = array();
1115
1116
                //Build tree
1117
                $tree = new SplClassLoader('Tree\NestedTree', $SETTINGS['cpassman_dir'] . '/includes/libraries');
1118
                $tree->register();
1119
                $tree = new Tree\NestedTree\NestedTree(prefixTable('nested_tree'), 'id', 'parent_id', 'title');
1120
1121
                // get FUNCTIONS
1122
                $functionsList = array();
1123
                $selected = '';
1124
                $users_functions = explode(';', $rowUser['fonction_id']);
1125
                // array of roles for actual user
1126
                $my_functions = explode(';', $_SESSION['fonction_id']);
1127
1128
                $rows = DB::query('SELECT id,title,creator_id FROM ' . prefixTable('roles_title'));
1129
                foreach ($rows as $record) {
1130
                    if (
1131
                        (int) $_SESSION['is_admin'] === 1
1132
                        || (((int) $_SESSION['user_manager'] === 1 || (int) $_SESSION['user_can_manage_all_users'] === 1)
1133
                            && (in_array($record['id'], $my_functions) || $record['creator_id'] == $_SESSION['user_id']))
1134
                    ) {
1135
                        if (in_array($record['id'], $users_functions)) {
1136
                            $selected = 'selected';
1137
1138
                            array_push(
1139
                                $arrFunction,
1140
                                array(
1141
                                    'title' => $record['title'],
1142
                                    'id' => $record['id'],
1143
                                )
1144
                            );
1145
                        } else {
1146
                            $selected = '';
1147
                        }
1148
1149
                        array_push(
1150
                            $functionsList,
1151
                            array(
1152
                                'title' => $record['title'],
1153
                                'id' => $record['id'],
1154
                                'selected' => $selected,
1155
                            )
1156
                        );
1157
                    }
1158
                }
1159
1160
                // get MANAGEDBY
1161
                $rolesList = array();
1162
                $managedBy = array();
1163
                $selected = '';
1164
                $rows = DB::query('SELECT id,title FROM ' . prefixTable('roles_title') . ' ORDER BY title ASC');
1165
                foreach ($rows as $reccord) {
1166
                    $rolesList[$reccord['id']] = array('id' => $reccord['id'], 'title' => $reccord['title']);
1167
                }
1168
1169
                array_push(
1170
                    $managedBy,
1171
                    array(
1172
                        'title' => langHdl('administrators_only'),
1173
                        'id' => 0,
1174
                    )
1175
                );
1176
                foreach ($rolesList as $fonction) {
1177
                    if ($_SESSION['is_admin'] || in_array($fonction['id'], $_SESSION['user_roles'])) {
1178
                        if ($rowUser['isAdministratedByRole'] == $fonction['id']) {
1179
                            $selected = 'selected';
1180
1181
                            array_push(
1182
                                $arrMngBy,
1183
                                array(
1184
                                    'title' => $fonction['title'],
1185
                                    'id' => $fonction['id'],
1186
                                )
1187
                            );
1188
                        } else {
1189
                            $selected = '';
1190
                        }
1191
1192
                        array_push(
1193
                            $managedBy,
1194
                            array(
1195
                                'title' => langHdl('managers_of') . ' ' . $fonction['title'],
1196
                                'id' => $fonction['id'],
1197
                                'selected' => $selected,
1198
                            )
1199
                        );
1200
                    }
1201
                }
1202
1203
                if (count($arrMngBy) === 0) {
1204
                    array_push(
1205
                        $arrMngBy,
1206
                        array(
1207
                            'title' => langHdl('administrators_only'),
1208
                            'id' => '0',
1209
                        )
1210
                    );
1211
                }
1212
1213
                // get FOLDERS FORBIDDEN
1214
                $forbiddenFolders = array();
1215
                $userForbidFolders = explode(';', $rowUser['groupes_interdits']);
1216
                $tree_desc = $tree->getDescendants();
1217
                foreach ($tree_desc as $t) {
1218
                    if (in_array($t->id, $_SESSION['groupes_visibles']) && !in_array($t->id, $_SESSION['personal_visible_groups'])) {
1219
                        $selected = '';
1220
                        if (in_array($t->id, $userForbidFolders)) {
1221
                            $selected = 'selected';
1222
1223
                            array_push(
1224
                                $arrFldForbidden,
1225
                                array(
1226
                                    'title' => htmlspecialchars($t->title, ENT_COMPAT, 'UTF-8'),
1227
                                    'id' => $t->id,
1228
                                )
1229
                            );
1230
                        }
1231
                        array_push(
1232
                            $forbiddenFolders,
1233
                            array(
1234
                                'id' => $t->id,
1235
                                'selected' => $selected,
1236
                                'title' => @htmlspecialchars($t->title, ENT_COMPAT, 'UTF-8'),
1237
                            )
1238
                        );
1239
                    }
1240
                }
1241
1242
                // get FOLDERS ALLOWED
1243
                $allowedFolders = array();
1244
                $userAllowFolders = explode(';', $rowUser['groupes_visibles']);
1245
                $tree_desc = $tree->getDescendants();
1246
                foreach ($tree_desc as $t) {
1247
                    if (
1248
                        in_array($t->id, $_SESSION['groupes_visibles']) === true
1249
                        && in_array($t->id, $_SESSION['personal_visible_groups']) === false
1250
                    ) {
1251
                        $selected = '';
1252
                        if (in_array($t->id, $userAllowFolders)) {
1253
                            $selected = 'selected';
1254
1255
                            array_push(
1256
                                $arrFldAllowed,
1257
                                array(
1258
                                    'title' => htmlspecialchars($t->title, ENT_COMPAT, 'UTF-8'),
1259
                                    'id' => $t->id,
1260
                                )
1261
                            );
1262
                        }
1263
1264
                        array_push(
1265
                            $allowedFolders,
1266
                            array(
1267
                                'id' => $t->id,
1268
                                'selected' => $selected,
1269
                                'title' => @htmlspecialchars($t->title, ENT_COMPAT, 'UTF-8'),
1270
                            )
1271
                        );
1272
                    }
1273
                }
1274
1275
                // get USER STATUS
1276
                if ($rowUser['disabled'] == 1) {
1277
                    $arrData['info'] = langHdl('user_info_locked') . '<br><input type="checkbox" value="unlock" name="1" class="chk">&nbsp;<label for="1">' . langHdl('user_info_unlock_question') . '</label><br><input type="checkbox"  value="delete" id="account_delete" class="chk mr-2" name="2" onclick="confirmDeletion()">label for="2">' . langHdl('user_info_delete_question') . '</label>';
1278
                } else {
1279
                    $arrData['info'] = langHdl('user_info_active') . '<br><input type="checkbox" value="lock" class="chk">&nbsp;' . langHdl('user_info_lock_question');
1280
                }
1281
1282
                $arrData['error'] = false;
1283
                $arrData['login'] = $rowUser['login'];
1284
                $arrData['name'] = htmlspecialchars_decode($rowUser['name'], ENT_QUOTES);
1285
                $arrData['lastname'] = htmlspecialchars_decode($rowUser['lastname'], ENT_QUOTES);
1286
                $arrData['email'] = $rowUser['email'];
1287
                $arrData['function'] = $functionsList;
1288
                $arrData['managedby'] = $managedBy;
1289
                $arrData['foldersForbid'] = $forbiddenFolders;
1290
                $arrData['foldersAllow'] = $allowedFolders;
1291
                $arrData['share_function'] = $arrFunction;
1292
                $arrData['share_managedby'] = $arrMngBy;
1293
                $arrData['share_forbidden'] = $arrFldForbidden;
1294
                $arrData['share_allowed'] = $arrFldAllowed;
1295
                $arrData['disabled'] = (int) $rowUser['disabled'];
1296
                $arrData['gestionnaire'] = (int) $rowUser['gestionnaire'];
1297
                $arrData['read_only'] = (int) $rowUser['read_only'];
1298
                $arrData['can_create_root_folder'] = (int) $rowUser['can_create_root_folder'];
1299
                $arrData['personal_folder'] = (int) $rowUser['personal_folder'];
1300
                $arrData['can_manage_all_users'] = (int) $rowUser['can_manage_all_users'];
1301
                $arrData['admin'] = (int) $rowUser['admin'];
1302
                $arrData['password'] = $password_do_not_change;
1303
1304
                echo prepareExchangedData(
1305
                    $arrData,
1306
                    'encode'
1307
                );
1308
            } else {
1309
                echo prepareExchangedData(
1310
                    array(
1311
                        'error' => true,
1312
                        'message' => langHdl('error_not_allowed_to'),
1313
                    ),
1314
                    'encode'
1315
                );
1316
            }
1317
1318
            break;
1319
1320
            /*
1321
         * EDIT user
1322
         */
1323
        case 'store_user_changes':
1324
            // Check KEY
1325
            if ($post_key !== $_SESSION['key']) {
1326
                echo prepareExchangedData(
1327
                    array(
1328
                        'error' => true,
1329
                        'message' => langHdl('key_is_not_correct'),
1330
                    ),
1331
                    'encode'
1332
                );
1333
                break;
1334
            } elseif ($_SESSION['user_read_only'] === true) {
1335
                echo prepareExchangedData(
1336
                    array(
1337
                        'error' => true,
1338
                        'message' => langHdl('error_not_allowed_to'),
1339
                    ),
1340
                    'encode'
1341
                );
1342
                break;
1343
            }
1344
1345
            // decrypt and retrieve data in JSON format
1346
            $dataReceived = prepareExchangedData($post_data, 'decode');
1347
1348
            // Prepare variables
1349
            $post_id = filter_var($dataReceived['user_id'], FILTER_SANITIZE_STRING);
1350
            $post_login = filter_var($dataReceived['login'], FILTER_SANITIZE_STRING);
1351
            $post_email = filter_var($dataReceived['email'], FILTER_SANITIZE_EMAIL);
1352
            //$post_password = filter_var($dataReceived['pw'], FILTER_SANITIZE_STRING);
1353
            $post_lastname = filter_var($dataReceived['lastname'], FILTER_SANITIZE_STRING);
1354
            $post_name = filter_var($dataReceived['name'], FILTER_SANITIZE_STRING);
1355
            $post_is_admin = filter_var($dataReceived['admin'], FILTER_SANITIZE_NUMBER_INT);
1356
            $post_is_manager = filter_var($dataReceived['manager'], FILTER_SANITIZE_NUMBER_INT);
1357
            $post_is_hr = filter_var($dataReceived['hr'], FILTER_SANITIZE_NUMBER_INT);
1358
            $post_is_read_only = filter_var($dataReceived['read_only'], FILTER_SANITIZE_NUMBER_INT);
1359
            $post_has_personal_folder = filter_var($dataReceived['personal_folder'], FILTER_SANITIZE_NUMBER_INT);
1360
            $post_new_folder_role_domain = filter_var($dataReceived['new_folder_role_domain'], FILTER_SANITIZE_NUMBER_INT);
1361
            $post_domain = filter_var($dataReceived['domain'], FILTER_SANITIZE_STRING);
1362
            $post_is_administrated_by = filter_var($dataReceived['isAdministratedByRole'], FILTER_SANITIZE_STRING);
1363
            $post_groups = filter_var_array($dataReceived['groups'], FILTER_SANITIZE_NUMBER_INT);
1364
            $post_allowed_flds = filter_var_array($dataReceived['allowed_flds'], FILTER_SANITIZE_NUMBER_INT);
1365
            $post_forbidden_flds = filter_var_array($dataReceived['forbidden_flds'], FILTER_SANITIZE_NUMBER_INT);
1366
            $post_root_level = filter_var($dataReceived['form-create-root-folder'], FILTER_SANITIZE_NUMBER_INT);
1367
            $post_user_disabled = filter_var($dataReceived['form-user-disabled'], FILTER_SANITIZE_NUMBER_INT);
1368
1369
            // Init post variables
1370
            $post_action_to_perform = filter_var(htmlspecialchars_decode($dataReceived['action_on_user']), FILTER_SANITIZE_STRING);
1371
1372
            // Build array of update
1373
            $changeArray = array(
1374
                'login' => $post_login,
1375
                'name' => $post_name,
1376
                'lastname' => $post_lastname,
1377
                'email' => $post_email,
1378
                'disabled' => empty($post_user_disabled) === true ? 0 : $post_user_disabled,
1379
                'admin' => empty($post_is_admin) === true ? 0 : $post_is_admin,
1380
                'can_manage_all_users' => empty($post_is_hr) === true ? 0 : $post_is_hr,
1381
                'gestionnaire' => empty($post_is_manager) === true ? 0 : $post_is_manager,
1382
                'read_only' => empty($post_is_read_only) === true ? 0 : $post_is_read_only,
1383
                'personal_folder' => empty($post_has_personal_folder) === true ? 0 : $post_has_personal_folder,
1384
                'user_language' => $SETTINGS['default_language'],
1385
                'fonction_id' => implode(';', $post_groups),
1386
                'groupes_interdits' => implode(';', $post_forbidden_flds),
1387
                'groupes_visibles' => implode(';', $post_allowed_flds),
1388
                'isAdministratedByRole' => $post_is_administrated_by,
1389
                'can_create_root_folder' => empty($post_root_level) === true ? 0 : $post_root_level,
1390
            );
1391
1392
            // Manage user password change
1393
            // This can occur only if user changes his own password
1394
            // In other case, next condition must be wrong
1395
            if (
1396
                isset($post_password) === true
1397
                && $post_password !== $password_do_not_change
1398
                && $post_id === $_SESSION['user_id']
1399
            ) {
1400
                // load passwordLib library
1401
                $pwdlib = new SplClassLoader('PasswordLib', '../includes/libraries');
1402
                $pwdlib->register();
1403
                $pwdlib = new PasswordLib\PasswordLib();
1404
1405
                $changeArray['pw'] = $pwdlib->createPasswordHash($post_password);
1406
                $changeArray['key_tempo'] = '';
1407
1408
                // We need to adapt the private key with new password
1409
                $changeArray['private_key'] = encryptPrivateKey($post_password, $_SESSION['user']['private_key']);
1410
            }
1411
1412
            // Empty user
1413
            if (empty($post_login) === true) {
1414
                echo '[ { "error" : "' . langHdl('error_empty_data') . '" } ]';
1415
                break;
1416
            }
1417
1418
            // User has email?
1419
            if (empty($post_email) === true) {
1420
                echo '[ { "error" : "' . langHdl('error_no_email') . '" } ]';
1421
                break;
1422
            }
1423
1424
            // Get info about user to delete
1425
            $data_user = DB::queryfirstrow(
1426
                'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
1427
                WHERE id = %i',
1428
                $post_id
1429
            );
1430
1431
            // Is this user allowed to do this?
1432
            if (
1433
                (int) $_SESSION['is_admin'] === 1
1434
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
1435
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
1436
            ) {
1437
                // delete account
1438
                // delete user in database
1439
                if ($post_action_to_perform === 'delete') {
1440
                    DB::delete(
1441
                        prefixTable('users'),
1442
                        'id = %i',
1443
                        $post_id
1444
                    );
1445
                    // delete personal folder and subfolders
1446
                    $data = DB::queryfirstrow(
1447
                        'SELECT id FROM ' . prefixTable('nested_tree') . '
1448
                        WHERE title = %s AND personal_folder = %i',
1449
                        $post_id,
1450
                        '1'
1451
                    );
1452
                    // Get through each subfolder
1453
                    if (!empty($data['id'])) {
1454
                        $folders = $tree->getDescendants($data['id'], true);
1455
                        foreach ($folders as $folder) {
1456
                            // delete folder
1457
                            DB::delete(prefixTable('nested_tree'), 'id = %i AND personal_folder = %i', $folder->id, '1');
1458
                            // delete items & logs
1459
                            $items = DB::query(
1460
                                'SELECT id FROM ' . prefixTable('items') . '
1461
                                WHERE id_tree=%i AND perso = %i',
1462
                                $folder->id,
1463
                                '1'
1464
                            );
1465
                            foreach ($items as $item) {
1466
                                // Delete item
1467
                                DB::delete(prefixTable('items'), 'id = %i', $item['id']);
1468
                                // log
1469
                                DB::delete(prefixTable('log_items'), 'id_item = %i', $item['id']);
1470
                            }
1471
                        }
1472
                        // rebuild tree
1473
                        $tree = new Tree\NestedTree\NestedTree(prefixTable('nested_tree'), 'id', 'parent_id', 'title');
1474
                        $tree->rebuild();
1475
                    }
1476
                    // update LOG
1477
                    logEvents('user_mngt', 'at_user_deleted', $_SESSION['user_id'], $_SESSION['login'], $post_id);
1478
                } else {
1479
                    // Get old data about user
1480
                    $oldData = DB::queryfirstrow(
1481
                        'SELECT * FROM ' . prefixTable('users') . '
1482
                        WHERE id = %i',
1483
                        $post_id
1484
                    );
1485
1486
                    // manage account status
1487
                    if ($post_user_disabled === 1) {
1488
                        $logDisabledText = 'at_user_locked';
1489
                    } else {
1490
                        $logDisabledText = 'at_user_unlocked';
1491
                    }
1492
1493
                    // update user
1494
                    DB::update(
1495
                        prefixTable('users'),
1496
                        $changeArray,
1497
                        'id = %i',
1498
                        $post_id
1499
                    );
1500
1501
                    // update SESSION
1502
                    if ($_SESSION['user_id'] === $post_id) {
1503
                        $_SESSION['user_email'] = $post_email;
1504
                        $_SESSION['name'] = $post_name;
1505
                        $_SESSION['lastname'] = $post_lastname;
1506
                    }
1507
1508
                    // update LOG
1509
                    if ($oldData['email'] !== $post_email) {
1510
                        logEvents('user_mngt', 'at_user_email_changed:' . $oldData['email'], intval($_SESSION['user_id']), $_SESSION['login'], $post_id);
1511
                    }
1512
1513
                    if ((int) $oldData['disabled'] !== (int) $post_user_disabled) {
1514
                        // update LOG
1515
                        logEvents('user_mngt', $logDisabledText, $_SESSION['user_id'], $_SESSION['login'], $post_id);
1516
                    }
1517
                }
1518
                echo prepareExchangedData(
1519
                    array(
1520
                        'error' => false,
1521
                        'message' => '',
1522
                    ),
1523
                    'encode'
1524
                );
1525
            } else {
1526
                echo prepareExchangedData(
1527
                    array(
1528
                        'error' => true,
1529
                        'message' => langHdl('error_not_allowed_to'),
1530
                    ),
1531
                    'encode'
1532
                );
1533
            }
1534
            break;
1535
1536
            /*
1537
         * UPDATE CAN CREATE ROOT FOLDER RIGHT
1538
         */
1539
        case 'user_edit_login':
1540
            // Check KEY
1541
            if ($post_key !== $_SESSION['key']) {
1542
                echo prepareExchangedData(
1543
                    array(
1544
                        'error' => true,
1545
                        'message' => langHdl('key_is_not_correct'),
1546
                    ),
1547
                    'encode'
1548
                );
1549
                break;
1550
            } elseif ($_SESSION['user_read_only'] === true) {
1551
                echo prepareExchangedData(
1552
                    array(
1553
                        'error' => true,
1554
                        'message' => langHdl('error_not_allowed_to'),
1555
                    ),
1556
                    'encode'
1557
                );
1558
                break;
1559
            }
1560
1561
            // decrypt and retrieve data in JSON format
1562
            $dataReceived = prepareExchangedData($post_data, 'decode');
1563
1564
            // Prepare variables
1565
            $post_id = filter_var($dataReceived['user_id'], FILTER_SANITIZE_NUMBER_INT);
1566
1567
            // Get info about user to delete
1568
            $data_user = DB::queryfirstrow(
1569
                'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
1570
                WHERE id = %i',
1571
                $post_id
1572
            );
1573
1574
            // Is this user allowed to do this?
1575
            if (
1576
                (int) $_SESSION['is_admin'] === 1
1577
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
1578
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
1579
            ) {
1580
                DB::update(
1581
                    prefixTable('users'),
1582
                    array(
1583
                        'login' => filter_input(INPUT_POST, 'login', FILTER_SANITIZE_STRING),
1584
                        'name' => filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING),
1585
                        'lastname' => filter_input(INPUT_POST, 'lastname', FILTER_SANITIZE_STRING),
1586
                    ),
1587
                    'id = %i',
1588
                    $post_id
1589
                );
1590
            }
1591
            break;
1592
1593
            /*
1594
         * IS LOGIN AVAILABLE?
1595
         */
1596
        case 'is_login_available':
1597
            // Check KEY
1598
            if ($post_key !== $_SESSION['key']) {
1599
                echo prepareExchangedData(
1600
                    array(
1601
                        'error' => true,
1602
                        'message' => langHdl('key_is_not_correct'),
1603
                    ),
1604
                    'encode'
1605
                );
1606
                break;
1607
            } elseif ($_SESSION['user_read_only'] === true) {
1608
                echo prepareExchangedData(
1609
                    array(
1610
                        'error' => true,
1611
                        'message' => langHdl('error_not_allowed_to'),
1612
                    ),
1613
                    'encode'
1614
                );
1615
                break;
1616
            }
1617
1618
            DB::queryfirstrow(
1619
                'SELECT * FROM ' . prefixTable('users') . '
1620
                WHERE login = %s',
1621
                filter_input(INPUT_POST, 'login', FILTER_SANITIZE_STRING)
1622
            );
1623
1624
            echo prepareExchangedData(
1625
                array(
1626
                    'error' => false,
1627
                    'login_exists' => DB::count(),
1628
                ),
1629
                'encode'
1630
            );
1631
1632
            break;
1633
1634
            /*
1635
         * GET USER FOLDER RIGHT
1636
         */
1637
        case 'user_folders_rights':
1638
            // Check KEY
1639
            if ($post_key !== $_SESSION['key']) {
1640
                echo prepareExchangedData(
1641
                    array(
1642
                        'error' => true,
1643
                        'message' => langHdl('key_is_not_correct'),
1644
                    ),
1645
                    'encode'
1646
                );
1647
                break;
1648
            } elseif ($_SESSION['user_read_only'] === true) {
1649
                echo prepareExchangedData(
1650
                    array(
1651
                        'error' => true,
1652
                        'message' => langHdl('error_not_allowed_to'),
1653
                    ),
1654
                    'encode'
1655
                );
1656
                break;
1657
            }
1658
1659
            // decrypt and retrieve data in JSON format
1660
            $dataReceived = prepareExchangedData($post_data, 'decode');
1661
1662
            // Prepare variables
1663
            $post_id = filter_input(INPUT_POST, 'user_id', FILTER_SANITIZE_NUMBER_INT);
1664
1665
            $arrData = array();
1666
1667
            //Build tree
1668
            $tree = new SplClassLoader('Tree\NestedTree', $SETTINGS['cpassman_dir'] . '/includes/libraries');
1669
            $tree->register();
1670
            $tree = new Tree\NestedTree\NestedTree(prefixTable('nested_tree'), 'id', 'parent_id', 'title');
1671
1672
            // get User info
1673
            $rowUser = DB::queryFirstRow(
1674
                'SELECT login, name, lastname, email, disabled, fonction_id, groupes_interdits, groupes_visibles, isAdministratedByRole, avatar_thumb
1675
                FROM ' . prefixTable('users') . '
1676
                WHERE id = %i',
1677
                $post_id
1678
            );
1679
1680
            // get rights
1681
            $functionsList = '';
1682
            $arrFolders = [];
1683
            $html = '';
1684
1685
            $arrData['functions'] = array_filter(explode(';', $rowUser['fonction_id']));
1686
            $arrData['allowed_folders'] = array_filter(explode(';', $rowUser['groupes_visibles']));
1687
            $arrData['denied_folders'] = array_filter(explode(';', $rowUser['groupes_interdits']));
1688
1689
            // Exit if no roles
1690
            if (count($arrData['functions']) > 0) {
1691
                // refine folders based upon roles
1692
                $rows = DB::query(
1693
                    'SELECT folder_id, type
1694
                    FROM ' . prefixTable('roles_values') . '
1695
                    WHERE role_id IN %ls
1696
                    ORDER BY folder_id ASC',
1697
                    $arrData['functions']
1698
                );
1699
                foreach ($rows as $record) {
1700
                    $bFound = false;
1701
                    $x = 0;
1702
                    foreach ($arrFolders as $fld) {
1703
                        if ($fld['id'] === $record['folder_id']) {
1704
                            // get the level of access on the folder
1705
                            $arrFolders[$x]['type'] = evaluateFolderAccesLevel($record['type'], $arrFolders[$x]['type']);
1706
                            $bFound = true;
1707
                            break;
1708
                        }
1709
                        ++$x;
1710
                    }
1711
                    if ($bFound === false && !in_array($record['folder_id'], $arrData['denied_folders'])) {
1712
                        array_push($arrFolders, array('id' => $record['folder_id'], 'type' => $record['type']));
1713
                    }
1714
                }
1715
1716
                $tree_desc = $tree->getDescendants();
1717
                foreach ($tree_desc as $t) {
1718
                    foreach ($arrFolders as $fld) {
1719
                        if ($fld['id'] === $t->id) {
1720
                            // get folder name
1721
                            $row = DB::queryFirstRow(
1722
                                'SELECT title, nlevel, id
1723
                                FROM ' . prefixTable('nested_tree') . '
1724
                                WHERE id = %i',
1725
                                $fld['id']
1726
                            );
1727
1728
                            // manage indentation
1729
                            $ident = '';
1730
                            for ($y = 1; $y < $row['nlevel']; ++$y) {
1731
                                $ident .= '<i class="fas fa-long-arrow-alt-right mr-2"></i>';
1732
                            }
1733
1734
                            // manage right icon
1735
                            if ($fld['type'] == 'W') {
1736
                                $label = '<i class="fas fa-indent infotip text-success mr-2" title="' . langHdl('write') . '"></i>' .
1737
                                    '<i class="fas fa-edit infotip text-success mr-2" title="' . langHdl('edit') . '"></i>' .
1738
                                    '<i class="fas fa-eraser infotip text-success" title="' . langHdl('delete') . '"></i>';
1739
                            } elseif ($fld['type'] == 'ND') {
1740
                                $label = '<i class="fas fa-indent infotip text-warning mr-2" title="' . langHdl('write') . '"></i>' .
1741
                                    '<i class="fas fa-edit infotip text-success mr-2" title="' . langHdl('edit') . '"></i>' .
1742
                                    '<i class="fas fa-eraser infotip text-danger" title="' . langHdl('no_delete') . '"></i>';
1743
                            } elseif ($fld['type'] == 'NE') {
1744
                                $label = '<i class="fas fa-indent infotip text-warning mr-2" title="' . langHdl('write') . '"></i>' .
1745
                                    '<i class="fas fa-edit infotip text-danger mr-2" title="' . langHdl('no_edit') . '"></i>' .
1746
                                    '<i class="fas fa-eraser infotip text-success" title="' . langHdl('delete') . '"></i>';
1747
                            } elseif ($fld['type'] == 'NDNE') {
1748
                                $label = '<i class="fas fa-indent infotip text-warning mr-2" title="' . langHdl('write') . '"></i>' .
1749
                                    '<i class="fas fa-edit infotip text-danger mr-2" title="' . langHdl('no_edit') . '"></i>' .
1750
                                    '<i class="fas fa-eraser infotip text-danger" title="' . langHdl('no_delete') . '"></i>';
1751
                            } else {
1752
                                $color = '#FEBC11';
1753
                                $allowed = 'R';
1754
                                $title = langHdl('read');
1755
                                $label = '<i class="fas fa-eye infotip text-info mr-2" title="' . langHdl('read') . '"></i>';
1756
                            }
1757
1758
                            $html .= '<tr><td>' . $ident . $row['title'] .
1759
                                ' <small>[' . $row['id'] . ']</small></td><td>' . $label . '</td></tr>';
1760
                            break;
1761
                        }
1762
                    }
1763
                }
1764
1765
                $html_full = '<table id="table-folders" class="table table-bordered table-striped dt-responsive nowrap" style="width:100%"><tbody>' .
1766
                    $html . '</tbody></table>';
1767
            } else {
1768
                $html_full = '';
1769
            }
1770
1771
            echo prepareExchangedData(
1772
                array(
1773
                    'html' => $html_full,
1774
                    'error' => false,
1775
                    'login' => $rowUser['login'],
1776
                    'message' => '',
1777
                ),
1778
                'encode'
1779
            );
1780
            break;
1781
1782
            /*
1783
         * GET LIST OF USERS
1784
         */
1785
        case 'get_list_of_users_for_sharing':
1786
            // Check KEY
1787
            if ($post_key !== $_SESSION['key']) {
1788
                echo prepareExchangedData(
1789
                    array(
1790
                        'error' => true,
1791
                        'message' => langHdl('key_is_not_correct'),
1792
                    ),
1793
                    'encode'
1794
                );
1795
                break;
1796
            } elseif ($_SESSION['user_read_only'] === true) {
1797
                echo prepareExchangedData(
1798
                    array(
1799
                        'error' => true,
1800
                        'message' => langHdl('error_not_allowed_to'),
1801
                    ),
1802
                    'encode'
1803
                );
1804
                break;
1805
            }
1806
1807
            $arrUsers = [];
1808
1809
            if (!$_SESSION['is_admin'] && !$_SESSION['user_can_manage_all_users']) {
1810
                $rows = DB::query(
1811
                    'SELECT *
1812
                    FROM ' . prefixTable('users') . '
1813
                    WHERE admin = %i AND isAdministratedByRole IN %ls',
1814
                    '0',
1815
                    array_filter($_SESSION['user_roles'])
1816
                );
1817
            } else {
1818
                $rows = DB::query(
1819
                    'SELECT *
1820
                    FROM ' . prefixTable('users') . '
1821
                    WHERE admin = %i',
1822
                    '0'
1823
                );
1824
            }
1825
1826
            foreach ($rows as $record) {
1827
                // Get roles
1828
                $groups = [];
1829
                $groupIds = [];
1830
                foreach (explode(';', $record['fonction_id']) as $group) {
1831
                    $tmp = DB::queryfirstrow(
1832
                        'SELECT id, title FROM ' . prefixTable('roles_title') . '
1833
                        WHERE id = %i',
1834
                        $group
1835
                    );
1836
                    array_push($groups, $tmp['title']);
1837
                    array_push($groupIds, $tmp['id']);
1838
                }
1839
1840
                // Get managed_by
1841
                $managedBy = DB::queryfirstrow(
1842
                    'SELECT id, title FROM ' . prefixTable('roles_title') . '
1843
                    WHERE id = %i',
1844
                    $record['isAdministratedByRole']
1845
                );
1846
1847
                // Get Allowed folders
1848
                $foldersAllowed = [];
1849
                $foldersAllowedIds = [];
1850
                foreach (explode(';', $record['groupes_visibles']) as $role) {
1851
                    $tmp = DB::queryfirstrow(
1852
                        'SELECT id, title FROM ' . prefixTable('nested_tree') . '
1853
                        WHERE id = %i',
1854
                        $role
1855
                    );
1856
                    array_push($foldersAllowed, $tmp['title']);
1857
                    array_push($foldersAllowedIds, $tmp['id']);
1858
                }
1859
1860
                // Get denied folders
1861
                $foldersForbidden = [];
1862
                $foldersForbiddenIds = [];
1863
                foreach (explode(';', $record['groupes_interdits']) as $role) {
1864
                    $tmp = DB::queryfirstrow(
1865
                        'SELECT id, title FROM ' . prefixTable('nested_tree') . '
1866
                        WHERE id = %i',
1867
                        $role
1868
                    );
1869
                    array_push($foldersForbidden, $tmp['title']);
1870
                    array_push($foldersForbiddenIds, $tmp['id']);
1871
                }
1872
1873
                // Store
1874
                array_push(
1875
                    $arrUsers,
1876
                    array(
1877
                        'id' => $record['id'],
1878
                        'name' => $record['name'],
1879
                        'lastname' => $record['lastname'],
1880
                        'login' => $record['login'],
1881
                        'groups' => implode(', ', $groups),
1882
                        'groupIds' => $groupIds,
1883
                        'managedBy' => $managedBy['title'] === null ? langHdl('administrator') : $managedBy['title'],
1884
                        'managedById' => $managedBy['id'] === null ? 0 : $managedBy['id'],
1885
                        'foldersAllowed' => implode(', ', $foldersAllowed),
1886
                        'foldersAllowedIds' => $foldersAllowedIds,
1887
                        'foldersForbidden' => implode(', ', $foldersForbidden),
1888
                        'foldersForbiddenIds' => $foldersForbiddenIds,
1889
                        'admin' => $record['admin'],
1890
                        'manager' => $record['gestionnaire'],
1891
                        'hr' => $record['can_manage_all_users'],
1892
                        'readOnly' => $record['read_only'],
1893
                        'personalFolder' => $record['personal_folder'],
1894
                        'rootFolder' => $record['can_create_root_folder'],
1895
                    )
1896
                );
1897
            }
1898
1899
            echo prepareExchangedData(
1900
                array(
1901
                    'error' => false,
1902
                    'values' => $arrUsers,
1903
                ),
1904
                'encode'
1905
            );
1906
1907
            break;
1908
1909
            /*
1910
         * UPDATE USERS RIGHTS BY SHARING
1911
         */
1912
        case 'update_users_rights_sharing':
1913
            // Check KEY
1914
            if ($post_key !== $_SESSION['key']) {
1915
                echo prepareExchangedData(
1916
                    array(
1917
                        'error' => true,
1918
                        'message' => langHdl('key_is_not_correct'),
1919
                    ),
1920
                    'encode'
1921
                );
1922
                break;
1923
            } elseif ($_SESSION['user_read_only'] === true) {
1924
                echo prepareExchangedData(
1925
                    array(
1926
                        'error' => true,
1927
                        'message' => langHdl('error_not_allowed_to'),
1928
                    ),
1929
                    'encode'
1930
                );
1931
                break;
1932
            }
1933
1934
            // decrypt and retreive data in JSON format
1935
            $dataReceived = prepareExchangedData($post_data, 'decode');
1936
1937
            $post_source_id = filter_var(htmlspecialchars_decode($dataReceived['source_id']), FILTER_SANITIZE_NUMBER_INT);
1938
            $post_destination_ids = filter_var_array($dataReceived['destination_ids'], FILTER_SANITIZE_NUMBER_INT);
1939
            $post_user_functions = filter_var(htmlspecialchars_decode($dataReceived['user_functions']), FILTER_SANITIZE_STRING);
1940
            $post_user_managedby = filter_var(htmlspecialchars_decode($dataReceived['user_managedby']), FILTER_SANITIZE_STRING);
1941
            $post_user_fldallowed = filter_var(htmlspecialchars_decode($dataReceived['user_fldallowed']), FILTER_SANITIZE_STRING);
1942
            $post_user_fldforbid = filter_var(htmlspecialchars_decode($dataReceived['user_fldforbid']), FILTER_SANITIZE_STRING);
1943
            $post_user_admin = filter_var(htmlspecialchars_decode($dataReceived['user_admin']), FILTER_SANITIZE_NUMBER_INT);
1944
            $post_user_manager = filter_var(htmlspecialchars_decode($dataReceived['user_manager']), FILTER_SANITIZE_NUMBER_INT);
1945
            $post_user_hr = filter_var(htmlspecialchars_decode($dataReceived['user_hr']), FILTER_SANITIZE_NUMBER_INT);
1946
            $post_user_readonly = filter_var(htmlspecialchars_decode($dataReceived['user_readonly']), FILTER_SANITIZE_NUMBER_INT);
1947
            $post_user_personalfolder = filter_var(htmlspecialchars_decode($dataReceived['user_personalfolder']), FILTER_SANITIZE_NUMBER_INT);
1948
            $post_user_rootfolder = filter_var(htmlspecialchars_decode($dataReceived['user_rootfolder']), FILTER_SANITIZE_NUMBER_INT);
1949
1950
            // Check send values
1951
            if (
1952
                empty($post_source_id) === true
1953
                || $post_destination_ids === 0
1954
            ) {
1955
                // error
1956
                exit();
1957
            }
1958
1959
            // Get info about user
1960
            $data_user = DB::queryfirstrow(
1961
                'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
1962
                WHERE id = %i',
1963
                $post_source_id
1964
            );
1965
1966
            // Is this user allowed to do this?
1967
            if (
1968
                (int) $_SESSION['is_admin'] === 1
1969
                || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
1970
                || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
1971
            ) {
1972
                foreach ($post_destination_ids as $dest_user_id) {
1973
                    // Is this user allowed to do this?
1974
                    if (
1975
                        (int) $_SESSION['is_admin'] === 1
1976
                        || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
1977
                        || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
1978
                    ) {
1979
                        // update user
1980
                        DB::update(
1981
                            prefixTable('users'),
1982
                            array(
1983
                                'fonction_id' => $post_user_functions,
1984
                                'isAdministratedByRole' => $post_user_managedby,
1985
                                'groupes_visibles' => $post_user_fldallowed,
1986
                                'groupes_interdits' => $post_user_fldforbid,
1987
                                'gestionnaire' => $post_user_manager,
1988
                                'read_only' => $post_user_readonly,
1989
                                'can_create_root_folder' => $post_user_rootfolder,
1990
                                'personal_folder' => $post_user_personalfolder,
1991
                                'can_manage_all_users' => $post_user_hr,
1992
                                'admin' => $post_user_admin,
1993
                            ),
1994
                            'id = %i',
1995
                            $dest_user_id
1996
                        );
1997
                    }
1998
                }
1999
            }
2000
            break;
2001
2002
            /*
2003
         * UPDATE USER PROFILE
2004
         */
2005
        case 'user_profile_update':
2006
            // Check KEY
2007
            if ($post_key !== $_SESSION['key']) {
2008
                echo prepareExchangedData(
2009
                    array(
2010
                        'error' => true,
2011
                        'message' => langHdl('key_is_not_correct'),
2012
                    ),
2013
                    'encode'
2014
                );
2015
                break;
2016
            }
2017
2018
            // Check user
2019
            if (
2020
                isset($_SESSION['user_id']) === false
2021
                || empty($_SESSION['user_id']) === true
2022
            ) {
2023
                echo prepareExchangedData(
2024
                    array(
2025
                        'error' => true,
2026
                        'message' => langHdl('no_user'),
2027
                    ),
2028
                    'encode'
2029
                );
2030
                break;
2031
            }
2032
2033
            // decrypt and retreive data in JSON format
2034
            $dataReceived = prepareExchangedData(
2035
                $post_data,
2036
                'decode'
2037
            );
2038
2039
            if (empty($dataReceived) === false) {
2040
                // update user
2041
                DB::update(
2042
                    prefixTable('users'),
2043
                    array(
2044
                        'email' => filter_var(htmlspecialchars_decode($dataReceived['email']), FILTER_SANITIZE_EMAIL),
2045
                        'usertimezone' => filter_var(htmlspecialchars_decode($dataReceived['timezone']), FILTER_SANITIZE_STRING),
2046
                        'user_language' => filter_var(htmlspecialchars_decode($dataReceived['language']), FILTER_SANITIZE_STRING),
2047
                        'treeloadstrategy' => filter_var(htmlspecialchars_decode($dataReceived['treeloadstrategy']), FILTER_SANITIZE_STRING),
2048
                        'agses-usercardid' => filter_var(htmlspecialchars_decode($dataReceived['agsescardid']), FILTER_SANITIZE_NUMBER_INT),
2049
                    ),
2050
                    'id = %i',
2051
                    $_SESSION['user_id']
2052
                );
2053
            } else {
2054
                // An error appears on JSON format
2055
                echo prepareExchangedData(
2056
                    array(
2057
                        'error' => true,
2058
                        'message' => langHdl('json_error_format'),
2059
                    ),
2060
                    'encode'
2061
                );
2062
            }
2063
2064
            // Encrypt data to return
2065
            echo prepareExchangedData(
2066
                array(
2067
                    'error' => false,
2068
                    'message' => '',
2069
                ),
2070
                'encode'
2071
            );
2072
            break;
2073
2074
            //CASE where refreshing table
2075
        case 'save_user_change':
2076
            // Check KEY
2077
            if ($post_key !== $_SESSION['key']) {
2078
                echo prepareExchangedData(
2079
                    array(
2080
                        'error' => true,
2081
                        'message' => langHdl('key_is_not_correct'),
2082
                    ),
2083
                    'encode'
2084
                );
2085
                break;
2086
            } elseif ($_SESSION['user_read_only'] === true) {
2087
                echo prepareExchangedData(
2088
                    array(
2089
                        'error' => true,
2090
                        'message' => langHdl('error_not_allowed_to'),
2091
                    ),
2092
                    'encode'
2093
                );
2094
                break;
2095
            }
2096
2097
            // decrypt and retrieve data in JSON format
2098
            $dataReceived = prepareExchangedData($post_data, 'decode');
2099
2100
            // prepare variables
2101
            $post_user_id = filter_var($dataReceived['user_id'], FILTER_SANITIZE_NUMBER_INT);
2102
            $post_field = filter_var($dataReceived['field'], FILTER_SANITIZE_STRING);
2103
            $post_new_value = filter_var($dataReceived['value'], FILTER_SANITIZE_STRING);
2104
2105
            DB::update(
2106
                prefixTable('users'),
2107
                array(
2108
                    $post_field => $post_new_value,
2109
                ),
2110
                'id = %i',
2111
                $post_user_id
2112
            );
2113
            $return = '';
2114
2115
            $return = array(
2116
                'error' => false,
2117
                'message' => '',
2118
                'return' => $return,
2119
            );
2120
2121
            // send data
2122
            //echo prepareExchangedData($return, 'encode');
2123
            echo json_encode($return);
2124
2125
            break;
2126
2127
            /*
2128
         * STORE USER LOCATION
2129
         */
2130
        case 'save_user_location':
2131
            // Check KEY
2132
            if ($post_key !== $_SESSION['key']) {
2133
                echo prepareExchangedData(
2134
                    array(
2135
                        'error' => true,
2136
                        'message' => langHdl('key_is_not_correct'),
2137
                    ),
2138
                    'encode'
2139
                );
2140
                break;
2141
            }
2142
2143
            // Manage 1st step - is this needed?
2144
            if (filter_input(INPUT_POST, 'step', FILTER_SANITIZE_STRING) === 'refresh') {
2145
                $record = DB::queryFirstRow(
2146
                    'SELECT user_ip_lastdate
2147
                    FROM ' . prefixTable('users') . '
2148
                    WHERE id = %i',
2149
                    $_SESSION['user_id']
2150
                );
2151
2152
                if (
2153
                    empty($record['user_ip_lastdate']) === true
2154
                    || (time() - $record['user_ip_lastdate']) > $SETTINGS_EXT['one_day_seconds']
2155
                ) {
2156
                    echo prepareExchangedData(
2157
                        array(
2158
                            'refresh' => true,
2159
                            'error' => '',
2160
                        ),
2161
                        'encode'
2162
                    );
2163
                    break;
2164
                }
2165
            } elseif (filter_input(INPUT_POST, 'step', FILTER_SANITIZE_STRING) === 'perform') {
2166
                $post_location = filter_input(INPUT_POST, 'location', FILTER_SANITIZE_STRING);
2167
                if (empty($post_location) === false) {
2168
                    DB::update(
2169
                        prefixTable('users'),
2170
                        array(
2171
                            'user_ip' => $post_location,
2172
                            'user_ip_lastdate' => time(),
2173
                        ),
2174
                        'id = %i',
2175
                        $_SESSION['user_id']
2176
                    );
2177
2178
                    echo prepareExchangedData(
2179
                        array(
2180
                            'refresh' => false,
2181
                            'error' => '',
2182
                        ),
2183
                        'encode'
2184
                    );
2185
                    break;
2186
                }
2187
            } else { }
2188
2189
            echo prepareExchangedData(
2190
                array(
2191
                    'refresh' => '',
2192
                    'error' => false,
2193
                ),
2194
                'encode'
2195
            );
2196
2197
            break;
2198
2199
            /*
2200
            * STORE USER LOCATION
2201
            */
2202
        case 'get_list_of_users_in_ldap':
2203
            // Check KEY
2204
            if ($post_key !== $_SESSION['key']) {
2205
                echo prepareExchangedData(
2206
                    array(
2207
                        'error' => true,
2208
                        'message' => langHdl('key_is_not_correct'),
2209
                    ),
2210
                    'encode'
2211
                );
2212
                break;
2213
            }
2214
2215
            // decrypt and retreive data in JSON format
2216
            $dataReceived = prepareExchangedData($post_data, 'decode');
2217
2218
            $usersInfo = array();
2219
            $entries = array();
2220
            $teampassRoles = array();
2221
            $debug_ldap = $ldap_suffix = '';
2222
2223
            // Get list of existing Roles in Teampass
2224
            $rows = DB::query('SELECT id,title FROM ' . prefixTable('roles_title'));
2225
            foreach ($rows as $record) {
2226
                array_push(
2227
                    $teampassRoles,
2228
                    array(
2229
                        'id' => $record['id'],
2230
                        'title' => $record['title']
2231
                    )
2232
                );
2233
            }
2234
2235
            //Multiple Domain Names
2236
            if (strpos(html_entity_decode($dataReceived['username']), '\\') === true) {
2237
                $ldap_suffix = '@' . substr(html_entity_decode($dataReceived['username']), 0, strpos(html_entity_decode($dataReceived['username']), '\\'));
2238
                $dataReceived['username'] = substr(html_entity_decode($dataReceived['username']), strpos(html_entity_decode($dataReceived['username']), '\\') + 1);
2239
            }
2240
            if ($SETTINGS['ldap_type'] === 'posix-search') {
2241
                $ldapURIs = '';
2242
                foreach (explode(',', $SETTINGS['ldap_domain_controler']) as $domainControler) {
2243
                    if ((int) $SETTINGS['ldap_ssl'] === 1) {
2244
                        $ldapURIs .= 'ldaps://' . $domainControler . ':' . $SETTINGS['ldap_port'] . ' ';
2245
                    } else {
2246
                        $ldapURIs .= 'ldap://' . $domainControler . ':' . $SETTINGS['ldap_port'] . ' ';
2247
                    }
2248
                }
2249
2250
                $debug_ldap .= 'LDAP URIs : ' . $ldapURIs . '<br/>';
2251
                $ldapconn = ldap_connect($ldapURIs);
2252
2253
                if ($SETTINGS['ldap_ssl']) {
2254
                    ldap_start_tls($ldapconn);
2255
                }
2256
2257
                $debug_ldap .= 'LDAP connection : ' . ($ldapconn ? 'Connected' : 'Failed') . '<br/>';
2258
2259
                if ($ldapconn) {
2260
                    $debug_ldap .= 'DN : ' . $SETTINGS['ldap_bind_dn'] . ' -- ' . $SETTINGS['ldap_bind_passwd'] . '<br/>';
2261
                    ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
2262
                    ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
2263
                    $ldapbind = ldap_bind($ldapconn, $SETTINGS['ldap_bind_dn'], $SETTINGS['ldap_bind_passwd']);
2264
2265
                    $debug_ldap .= 'LDAP bind : ' . ($ldapbind ? 'Bound' : 'Failed') . '<br/>';
2266
2267
                    if ($ldapbind) {
2268
                        //$filter = '(&(' . $SETTINGS['ldap_user_attribute'] . '=' . $dataReceived['username'] . ')(objectClass=' . $SETTINGS['ldap_object_class'] . '))';
2269
                        //objectClass=user(objectCategory=person)
2270
                        $filter = '(&(objectClass=person)(sn=*))';
2271
                        //echo $filter;
2272
                        $result = ldap_search(
2273
                            $ldapconn,
2274
                            $SETTINGS['ldap_search_base'],
2275
                            $filter,
2276
                            array('dn', 'mail', 'givenname', 'samaccountname', 'sn', $SETTINGS['ldap_user_attribute'], 'memberOf', 'name', 'displayname', 'cn')
2277
                        );
2278
2279
                        if (false !== $result) {
2280
                            $entries = ldap_get_entries($ldapconn, $result);
2281
2282
                            // Loop in entries and for each user:
2283
                            // 1- check what are the roles they have in Teampass
2284
                            // 2- get the ID of the user if exists in Teampass
2285
                            for ($i = 0; $i < $entries['count']; ++$i) {
2286
                                $entry = $entries[$i][0];
2287
                                if (null !== $entry) { }
2288
                            }
2289
2290
2291
                            function whatever($array, $key, $val)
2292
                            {
2293
                                foreach ($array as $item)
2294
                                    if (isset($item[$key]) && $item[$key] == $val)
2295
                                        return true;
2296
                                return false;
2297
                            }
2298
2299
                            //
2300
                        }
2301
2302
                        // Check if users are in Teampass users table
2303
                        if ($entries['count'] > 0) {
2304
                            // Now check if group fits
2305
                            for ($i = 0; $i < $entries['count']; ++$i) {
2306
                                $user = DB::query(
2307
                                    'SELECT id FROM ' . prefixTable('users') . '
2308
                                    WHERE login = %s',
2309
                                    $entries[$i][$SETTINGS['ldap_user_attribute']][0]
2310
                                );
2311
                                if (DB::count() > 0) {
2312
                                    array_push(
2313
                                        $usersInfo,
2314
                                        array(
2315
                                            'login' => $entries[$i][$SETTINGS['ldap_user_attribute']][0],
2316
                                            'id' => $user[0]['id'],
2317
                                        )
2318
                                    );
2319
                                }
2320
                            }
2321
                        }
2322
2323
2324
2325
                        /*
2326
                        if (isset($SETTINGS['ldap_usergroup'])) {
2327
                            $GroupRestrictionEnabled = false;
2328
                            $filter_group = 'memberUid=' . $dataReceived['username'];
2329
                            $result_group = ldap_search(
2330
                                $ldapconn,
2331
                                $SETTINGS['ldap_search_base'],
2332
                                $filter_group,
2333
                                array('dn')
2334
                            );
2335
2336
                            $debug_ldap .= 'Search filter (group): ' . $filter_group . '<br/>' .
2337
                                'Results : ' . str_replace("\n", '<br>', print_r(ldap_get_entries($ldapconn, $result_group), true)) . '<br/>';
2338
2339
                            if ($result_group) {
2340
                                $entries = ldap_get_entries($ldapconn, $result_group);
2341
2342
                                if ($entries['count'] > 0) {
2343
                                    // Now check if group fits
2344
                                    for ($i = 0; $i < $entries['count']; ++$i) {
2345
                                        $parsr = ldap_explode_dn($entries[$i]['dn'], 0);
2346
                                        if (str_replace(array('CN=', 'cn='), '', $parsr[0]) === $SETTINGS['ldap_usergroup']) {
2347
                                            $GroupRestrictionEnabled = true;
2348
                                            break;
2349
                                        }
2350
                                    }
2351
                                }
2352
                            }
2353
2354
                            $debug_ldap .= 'Find user in Group: ' . $GroupRestrictionEnabled . '<br/>';
2355
                        }
2356
2357
                        $debug_ldap .= 'Search filter : ' . $filter . '<br/>' .
2358
                            'Results : ' . str_replace("\n", '<br>', print_r(ldap_get_entries($ldapconn, $result), true)) . '<br/>';
2359
2360
                        if (ldap_count_entries($ldapconn, $result)) {
2361
                            // try auth
2362
                            $result = ldap_get_entries($ldapconn, $result);
2363
                            $user_dn = $result[0]['dn'];
2364
                            $ldapbind = @ldap_bind($ldapconn, $user_dn, $dataReceived['password']);
2365
                            if ($ldapbind) {
2366
                                $debug_ldap .= 'Successfully connected';
2367
                            } else {
2368
                                $debug_ldap .= 'Error - Cannot connect user!';
2369
                            }
2370
                        }
2371
                        */
2372
                    } else {
2373
                        $debug_ldap .= 'Error - Could not bind server!';
2374
                    }
2375
                } else {
2376
                    $debug_ldap .= 'Error - Could not connect to server!';
2377
                }
2378
            } else {
2379
                $debug_ldap .= 'Get all ldap params: <br/>' .
2380
                    '  - base_dn : ' . $SETTINGS['ldap_domain_dn'] . '<br/>' .
2381
                    '  - account_suffix : ' . $SETTINGS['ldap_suffix'] . '<br/>' .
2382
                    '  - domain_controllers : ' . $SETTINGS['ldap_domain_controler'] . '<br/>' .
2383
                    '  - ad_port : ' . $SETTINGS['ldap_port'] . '<br/>' .
2384
                    '  - use_ssl : ' . $SETTINGS['ldap_ssl'] . '<br/>' .
2385
                    '  - use_tls : ' . $SETTINGS['ldap_tls'] . '<br/>*********<br/>';
2386
2387
                $adldap = new SplClassLoader('adLDAP', '../includes/libraries/LDAP');
2388
                $adldap->register();
2389
2390
                // Posix style LDAP handles user searches a bit differently
2391
                if ($SETTINGS['ldap_type'] === 'posix') {
2392
                    $ldap_suffix = ',' . $SETTINGS['ldap_suffix'] . ',' . $SETTINGS['ldap_domain_dn'];
2393
                } elseif ($SETTINGS['ldap_type'] === 'windows' && $ldap_suffix === '') { //Multiple Domain Names
2394
                    $ldap_suffix = $SETTINGS['ldap_suffix'];
2395
                }
2396
                $adldap = new adLDAP\adLDAP(
2397
                    array(
2398
                        'base_dn' => $SETTINGS['ldap_domain_dn'],
2399
                        'account_suffix' => $ldap_suffix,
2400
                        'domain_controllers' => explode(',', $SETTINGS['ldap_domain_controler']),
2401
                        'ad_port' => $SETTINGS['ldap_port'],
2402
                        'use_ssl' => $SETTINGS['ldap_ssl'],
2403
                        'use_tls' => $SETTINGS['ldap_tls'],
2404
                    )
2405
                );
2406
2407
                $debug_ldap .= 'Create new adldap object : ' . $adldap->getLastError() . '<br/><br/>';
2408
2409
                // openLDAP expects an attribute=value pair
2410
                if ($SETTINGS['ldap_type'] === 'posix') {
2411
                    $auth_username = $SETTINGS['ldap_user_attribute'] . '=' . $dataReceived['username'];
2412
                } else {
2413
                    $auth_username = $dataReceived['username'];
2414
                }
2415
2416
                // authenticate the user
2417
                if ($adldap->authenticate($auth_username, html_entity_decode($dataReceived['username_pwd']))) {
2418
                    $ldapConnection = 'Successfull';
2419
                } else {
2420
                    $ldapConnection = 'Not possible to get connected with this user';
2421
                }
2422
2423
                $debug_ldap .= 'After authenticate : ' . $adldap->getLastError() . '<br/><br/>' .
2424
                    'ldap status : ' . $ldapConnection; //Debug
2425
            }
2426
2427
            echo prepareExchangedData(
2428
                array(
2429
                    'error' => false,
2430
                    'message' => ($debug_ldap),
2431
                    'entries' => $entries,
2432
                    'users' => json_encode($usersInfo)
2433
                ),
2434
                'encode'
2435
            );
2436
2437
            break;
2438
    }
2439
    // # NEW LOGIN FOR USER HAS BEEN DEFINED ##
2440
} elseif (!empty(filter_input(INPUT_POST, 'newValue', FILTER_SANITIZE_STRING))) {
2441
    // Prepare POST variables
2442
    $value = explode('_', filter_input(INPUT_POST, 'id', FILTER_SANITIZE_STRING));
2443
    $post_newValue = filter_input(INPUT_POST, 'newValue', FILTER_SANITIZE_STRING);
2444
2445
    // Get info about user
2446
    $data_user = DB::queryfirstrow(
2447
        'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
2448
        WHERE id = %i',
2449
        $value[1]
2450
    );
2451
2452
    // Is this user allowed to do this?
2453
    if (
2454
        (int) $_SESSION['is_admin'] === 1
2455
        || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
2456
        || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
2457
        || ($_SESSION['user_id'] === $value[1])
2458
    ) {
2459
        if ($value[0] === 'userlanguage') {
2460
            $value[0] = 'user_language';
2461
            $post_newValue = strtolower($post_newValue);
2462
        }
2463
        // Check that operation is allowed
2464
        if (in_array(
2465
            $value[0],
2466
            array('login', 'pw', 'email', 'treeloadstrategy', 'usertimezone', 'user_api_key', 'yubico_user_key', 'yubico_user_id', 'agses-usercardid', 'user_language', 'psk')
2467
        )) {
2468
            DB::update(
2469
                prefixTable('users'),
2470
                array(
2471
                    $value[0] => $post_newValue,
2472
                ),
2473
                'id = %i',
2474
                $value[1]
2475
            );
2476
            // update LOG
2477
            logEvents(
2478
                'user_mngt',
2479
                'at_user_new_' . $value[0] . ':' . $value[1],
2480
                $_SESSION['user_id'],
2481
                $_SESSION['login'],
2482
                filter_input(INPUT_POST, 'id', FILTER_SANITIZE_STRING)
2483
            );
2484
            // refresh SESSION if requested
2485
            if ($value[0] === 'treeloadstrategy') {
2486
                $_SESSION['user_settings']['treeloadstrategy'] = $post_newValue;
2487
            } elseif ($value[0] === 'usertimezone') {
2488
                // special case for usertimezone where session needs to be updated
2489
                $_SESSION['user_settings']['usertimezone'] = $post_newValue;
2490
            } elseif ($value[0] === 'userlanguage') {
2491
                // special case for user_language where session needs to be updated
2492
                $_SESSION['user_settings']['user_language'] = $post_newValue;
2493
                $_SESSION['user_language'] = $post_newValue;
2494
            } elseif ($value[0] === 'agses-usercardid') {
2495
                // special case for agsescardid where session needs to be updated
2496
                $_SESSION['user_settings']['agses-usercardid'] = $post_newValue;
2497
            } elseif ($value[0] === 'email') {
2498
                // store email change in session
2499
                $_SESSION['user_email'] = $post_newValue;
2500
            }
2501
            // Display info
2502
            echo htmlentities($post_newValue, ENT_QUOTES);
2503
        }
2504
    }
2505
    // # ADMIN FOR USER HAS BEEN DEFINED ##
2506
} elseif (null !== filter_input(INPUT_POST, 'newadmin', FILTER_SANITIZE_NUMBER_INT)) {
2507
    $id = explode('_', filter_input(INPUT_POST, 'id', FILTER_SANITIZE_STRING));
2508
2509
    // Get info about user
2510
    $data_user = DB::queryfirstrow(
2511
        'SELECT admin, isAdministratedByRole FROM ' . prefixTable('users') . '
2512
        WHERE id = %i',
2513
        $value[1]
2514
    );
2515
2516
    // Is this user allowed to do this?
2517
    if (
2518
        (int) $_SESSION['is_admin'] === 1
2519
        || (in_array($data_user['isAdministratedByRole'], $_SESSION['user_roles']))
2520
        || ((int) $_SESSION['user_can_manage_all_users'] === 1 && (int) $data_user['admin'] !== 1)
2521
        || ($_SESSION['user_id'] === $value[1])
2522
    ) {
2523
        DB::update(
2524
            prefixTable('users'),
2525
            array(
2526
                'admin' => filter_input(INPUT_POST, 'newadmin', FILTER_SANITIZE_NUMBER_INT),
2527
            ),
2528
            'id = %i',
2529
            $id[1]
2530
        );
2531
        // Display info
2532
        if (filter_input(INPUT_POST, 'newadmin', FILTER_SANITIZE_NUMBER_INT) === 1) {
2533
            echo 'Oui';
2534
        } else {
2535
            echo 'Non';
2536
        }
2537
    }
2538
}
2539
2540
/**
2541
 * Return the level of access on a folder.
2542
 *
2543
 * @param string $new_val      New value
2544
 * @param string $existing_val Current value
2545
 *
2546
 * @return string Returned index
2547
 */
2548
function evaluateFolderAccesLevel($new_val, $existing_val)
2549
{
2550
    $levels = array(
2551
        'W' => 30,
2552
        'ND' => 20,
2553
        'NE' => 15,
2554
        'NDNE' => 10,
2555
        'R' => 10,
2556
    );
2557
2558
    $current_level_points = empty($existing_val) === true ? 0 : $levels[$existing_val];
2559
    $new_level_points = empty($new_val) === true ? 0 : $levels[$new_val];
2560
2561
    // check if new is > to current one (always keep the highest level)
2562
    if (($new_val === 'ND' && $existing_val === 'NE')
2563
        || ($new_val === 'NE' && $existing_val === 'ND')
2564
    ) {
2565
        return 'NDNE';
2566
    } else {
2567
        if ($current_level_points > $new_level_points) {
2568
            return  $existing_val;
2569
        } else {
2570
            return  $new_val;
2571
        }
2572
    }
2573
}
2574