edit.php 18.9 KB
Newer Older
1
2
<?php
/**
3
 * Mahara: Electronic portfolio, weblog, resume builder and social networking
4
5
 * Copyright (C) 2006-2009 Catalyst IT Ltd and others; see:
 *                         http://wiki.mahara.org/Contributors
6
 *
7
8
9
10
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
11
 *
12
13
14
15
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
16
 *
17
18
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20
21
 *
 * @package    mahara
 * @subpackage admin
22
 * @author     Catalyst IT Ltd
23
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
24
 * @copyright  (C) 2006-2009 Catalyst IT Ltd http://catalyst.net.nz
25
26
27
28
 *
 */

define('INTERNAL', 1);
29
define('INSTITUTIONALADMIN', 1);
30
define('MENUITEM', 'configusers/usersearch');
31
require(dirname(dirname(dirname(__FILE__))) . '/init.php');
32
define('TITLE', get_string('accountsettings', 'admin'));
33
34
35
define('SECTION_PLUGINTYPE', 'core');
define('SECTION_PLUGINNAME', 'admin');
require_once('pieforms/pieform.php');
36
require_once('activity.php');
37
38

$id = param_integer('id');
39
40
$user = new User;
$user->find_by_id($id);
41

42
if (!$USER->is_admin_for_user($user)) {
43
44
    $SESSION->add_error_msg(get_string('youcannotadministerthisuser', 'admin'));
    redirect('/user/view.php?id=' . $id);
45
}
46
47
48


// Site-wide account settings
49
$currentdate = getdate();
Richard Mansfield's avatar
Richard Mansfield committed
50
$elements = array();
51
52
53
54
55
56
57
58
$elements['id'] = array(
    'type'    => 'hidden',
    'rules'   => array('integer' => true),
    'value'   => $id,
);
$elements['password'] = array(
    'type'         => 'text',
    'title'        => get_string('resetpassword','admin'),
59
    'description'  => get_string('resetpassworddescription','admin'),
60
61
62
63
);
$elements['passwordchange'] = array(
    'type'         => 'checkbox',
    'title'        => get_string('forcepasswordchange','admin'),
64
    'description'  => get_string('forcepasswordchangedescription','admin'),
65
66
    'defaultvalue' => $user->passwordchange,
);
67
68
69
70
71
if ($USER->get('admin')) {
    $elements['staff'] = array(
        'type'         => 'checkbox',
        'title'        => get_string('sitestaff','admin'),
        'defaultvalue' => $user->staff,
72
        'help'         => true,
73
74
75
76
77
    );
    $elements['admin'] = array(
        'type'         => 'checkbox',
        'title'        => get_string('siteadmin','admin'),
        'defaultvalue' => $user->admin,
78
        'help'         => true,
79
80
    );
}
81
82
83
84
85
86
87
88
89
90
91
$elements['maildisabled'] = array(
    'type' => 'radio',
    'defaultvalue' => get_account_preference($user->id, 'maildisabled'),
    'title' => get_string('email'),
    'separator' => '<br>',
    'options' => array(
        0 => get_string('enabled', 'account'),
        1 => get_string('disabled', 'account'),
    ),
    'help' => true,
);
92
93
94
95
96
97
98
99
$elements['expiry'] = array(
    'type'         => 'date',
    'title'        => get_string('accountexpiry', 'admin'),
    'description'  => get_string('accountexpirydescription', 'admin'),
    'minyear'      => $currentdate['year'] - 2,
    'maxyear'      => $currentdate['year'] + 20,
    'defaultvalue' => $user->expiry
);
100
$elements['quota'] = array(
101
    'type'         => 'bytes',
102
    'title'        => get_string('filequota','admin'),
103
    'description'  => get_string('filequotadescription','admin'),
104
    'rules'        => array('integer' => true),
105
    'defaultvalue' => $user->quota,
106
);
107
108
109
110
111

$authinstances = auth_get_auth_instances();
if (count($authinstances) > 1) {
    $options = array();

112
113
114
115
116
117
118
119
    // NOTE: This is a little broken at the moment. The "username in the remote 
    // system" setting is only actively used by the XMLRPC authentication 
    // plugin, and thus only makes sense when the user is authenticating in 
    // this manner.
    //
    // We hope to one day make it possible for users to get into accounts via 
    // multiple methods, at which time we can tie the username-in-remote-system 
    // setting to the XMLRPC plugin only, making the UI a bit more consistent
120
    $external = false;
121
    foreach ($authinstances as $authinstance) {
Richard Mansfield's avatar
Richard Mansfield committed
122
        if ($USER->can_edit_institution($authinstance->name)) {
123
            $options[$authinstance->id] = $authinstance->instancename . ' (' . $authinstance->displayname . ')';
124
125
126
            if ($authinstance->authname != 'internal') {
                $external = true;
            }
127
        }
128
129
    }

130
131
    if (isset($options[$user->authinstance])) {
        $elements['authinstance'] = array(
132
133
            'type'         => 'select',
            'title'        => get_string('authenticatedby', 'admin'),
134
            'description'  => get_string('authenticatedbydescription', 'admin'),
135
            'options'      => $options,
136
            'defaultvalue' => $user->authinstance,
137
            'help'         => true,
138
        );
139
140
141
        if ($external) {
            $un = get_field('auth_remote_user', 'remoteusername', 'authinstance', $user->authinstance, 'localusr', $user->id);
            $elements['remoteusername'] = array(
142
143
                'type'         => 'text',
                'title'        => get_string('remoteusername', 'admin'),
144
                'description'  => get_string('remoteusernamedescription', 'admin', hsc(get_config('sitename'))),
145
146
147
                'defaultvalue' => $un ? $un : $user->username,
            );
        }
148
    }
149

150
151
}

152
153
154
155
156
$elements['submit'] = array(
    'type'  => 'submit',
    'value' => get_string('savechanges','admin'),
);

Richard Mansfield's avatar
Richard Mansfield committed
157
158
$siteform = pieform(array(
    'name'       => 'edituser_site',
159
160
161
162
163
164
165
    'renderer'   => 'table',
    'plugintype' => 'core',
    'pluginname' => 'admin',
    'elements'   => $elements,
));


Richard Mansfield's avatar
Richard Mansfield committed
166
function edituser_site_submit(Pieform $form, $values) {
167
168
169
170
171
172
    if (!$user = get_record('usr', 'id', $values['id'])) {
        return false;
    }

    if (isset($values['password']) && $values['password'] !== '') {
        $user->password = $values['password'];
173
        $user->salt = '';
174
175
    }
    $user->passwordchange = (int) ($values['passwordchange'] == 'on');
176
    $user->quota = $values['quota'];
177
    $user->expiry = db_format_timestamp($values['expiry']);
178
179
180
181
182

    global $USER;
    if ($USER->get('admin')) {  // Not editable by institutional admins
        $user->staff = (int) ($values['staff'] == 'on');
        $user->admin = (int) ($values['admin'] == 'on');
183
184
185
        if ($user->admin) {
            activity_add_admin_defaults(array($user->id));
        }
186
187
    }

188
189
190
191
    if ($values['maildisabled'] == 0 && get_account_preference($user->id, 'maildisabled') == 1) {
        // Reset the sent and bounce counts otherwise mail will be disabled
        // on the next send attempt
        $u = new StdClass;
192
193
        $u->email = $user->email;
        $u->id = $user->id;
194
195
196
197
198
        update_bounce_count($u,true);
        update_send_count($u,true);
    }
    set_account_preference($user->id, 'maildisabled', $values['maildisabled']);

199
200
    // Authinstance can be changed by institutional admins if both the
    // old and new authinstances belong to the admin's institutions
201
202
203
204
    $remotename = get_field('auth_remote_user', 'remoteusername', 'authinstance', $user->authinstance, 'localusr', $user->id);
    if (!$remotename) {
        $remotename = $user->username;
    }
205
206
207
    if (isset($values['authinstance'])
        && ($values['authinstance'] != $user->authinstance
            || (isset($values['remoteusername']) && $values['remoteusername'] != $remotename))) {
208
209
210
211
212
213
214
        $authinst = get_records_select_assoc('auth_instance', 'id = ? OR id = ?', 
                                             array($values['authinstance'], $user->authinstance));
        if ($USER->get('admin') || 
            ($USER->is_institutional_admin($authinst[$values['authinstance']]->institution) &&
             $USER->is_institutional_admin($authinst[$user->authinstance]->institution))) {
            delete_records('auth_remote_user', 'authinstance', $user->authinstance, 'localusr', $user->id);
            if ($authinst[$values['authinstance']]->authname != 'internal') {
215
216
217
218
219
220
                if (isset($values['remoteusername']) && strlen($values['remoteusername']) > 0) {
                    $un = $values['remoteusername'];
                }
                else {
                    $un = $remotename;
                }
221
222
                insert_record('auth_remote_user', (object) array(
                    'authinstance'   => $values['authinstance'],
223
                    'remoteusername' => $un,
224
225
226
227
228
                    'localusr'       => $user->id,
                ));
            }
            $user->authinstance = $values['authinstance'];
        }
229
    }
230
231
232
233
234
235
236

    update_record('usr', $user);

    redirect('/admin/users/edit.php?id='.$user->id);
}


237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
// Suspension/deletion controls
$suspended = $user->get('suspendedcusr');
if (empty($suspended)) {
    $suspendform = pieform(array(
        'name'       => 'edituser_suspend',
        'plugintype' => 'core',
        'pluginname' => 'admin',
        'elements'   => array(
            'id' => array(
                 'type'    => 'hidden',
                 'value'   => $id,
            ),
            'reason' => array(
                'type'        => 'textarea',
                'rows'        => 5,
                'cols'        => 60,
                'title'       => get_string('reason'),
                'description' => get_string('suspendedreasondescription', 'admin'),
            ),
            'submit' => array(
                'type'  => 'submit',
                'value' => get_string('suspenduser','admin'),
            ),
        )
    ));
}
else {
    $suspendformdef = array(
        'name'       => 'edituser_unsuspend',
        'plugintype' => 'core',
        'pluginname' => 'admin',
        'renderer'   => 'oneline',
        'elements'   => array(
            'id' => array(
                 'type'    => 'hidden',
                 'value'   => $id,
            ),
            'submit' => array(
                'type'  => 'submit',
                'value' => get_string('unsuspenduser','admin'),
            ),
        )
    );

    // Create two forms for unsuspension - one in the suspend message and the 
    // other where the 'suspend' button normally goes. This keeps the HTML IDs 
    // unique
    $suspendform  = pieform($suspendformdef);
    $suspendformdef['name'] = 'edituser_suspend2';
    $suspendformdef['successcallback'] = 'edituser_unsuspend_submit';
    $suspendform2 = pieform($suspendformdef);

    $suspender = display_name(get_record('usr', 'id', $suspended));
}

function edituser_suspend_submit(Pieform $form, $values) {
293
294
295
296
297
298
299
300
301
    global $SESSION, $USER, $user;
    if (!$USER->get('admin') && ($user->get('admin') || $user->get('staff'))) {
        $SESSION->add_error_msg(get_string('errorwhilesuspending', 'admin'));
    }
    else {
        suspend_user($user->get('id'), $values['reason']);
        $SESSION->add_ok_msg(get_string('usersuspended', 'admin'));
    }
    redirect('/admin/users/edit.php?id=' . $user->get('id'));
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
}

function edituser_unsuspend_submit(Pieform $form, $values) {
    global $SESSION;
    unsuspend_user($values['id']);
    $SESSION->add_ok_msg(get_string('userunsuspended', 'admin'));
    redirect('/admin/users/edit.php?id=' . $values['id']);
}

$deleteform = pieform(array(
    'name' => 'edituser_delete',
    'plugintype' => 'core',
    'pluginname' => 'admin',
    'renderer' => 'oneline',
    'elements'   => array(
        'id' => array(
            'type' => 'hidden',
            'value' => $id,
        ),
        'submit' => array(
            'type' => 'submit',
            'value' => get_string('deleteuser', 'admin'),
            'confirm' => get_string('confirmdeleteuser', 'admin'),
        ),
    ),
));

329
330
331
332
333
334
335
336
function edituser_delete_validate(Pieform $form, $values) {
    global $USER, $SESSION;
    if (!$USER->get('admin')) {
        $form->set_error('submit', get_string('deletefailed', 'admin'));
        $SESSION->add_error_msg(get_string('deletefailed', 'admin'));
    }
}

337
function edituser_delete_submit(Pieform $form, $values) {
338
339
340
341
342
    global $SESSION, $USER;
    if ($USER->get('admin')) {
        delete_user($values['id']);
        $SESSION->add_ok_msg(get_string('userdeletedsuccessfully', 'admin'));
    }
343
344
345
    redirect('/admin/users/search.php');
}

Richard Mansfield's avatar
Richard Mansfield committed
346

347
// Institution settings form
Richard Mansfield's avatar
Richard Mansfield committed
348
349
350
351
352
353
354
$elements = array(
    'id' => array(
         'type'    => 'hidden',
         'value'   => $id,
     ),
);

355
356
357
358
359
360
361
362
$allinstitutions = get_records_assoc('institution');
foreach ($user->get('institutions') as $i) {
    $elements[$i->institution.'_settings'] = array(
        'type' => 'fieldset',
        'legend' => $allinstitutions[$i->institution]->displayname,
        'elements' => array(
            $i->institution.'_expiry' => array(
                'type'         => 'date',
363
364
                'title'        => get_string('membershipexpiry', 'admin'),
                'description'  => get_string('membershipexpirydescription', 'admin'),
365
366
                'minyear'      => $currentdate['year'],
                'maxyear'      => $currentdate['year'] + 20,
367
                'defaultvalue' => $i->membership_expiry
368
369
370
            ),
            $i->institution.'_studentid' => array(
                'type'         => 'text',
371
372
                'title'        => get_string('studentid', 'admin'),
                'description'  => get_string('institutionstudentiddescription', 'admin'),
373
374
                'defaultvalue' => $i->studentid,
            ),
375
            $i->institution.'_staff' => array(
376
377
378
                'type'         => 'checkbox',
                'title'        => get_string('institutionstaff','admin'),
                'defaultvalue' => $i->staff,
379
            ),
380
381
382
            $i->institution.'_admin' => array(
                'type'         => 'checkbox',
                'title'        => get_string('institutionadmin','admin'),
383
                'description'  => get_string('institutionadmindescription','admin'),
384
385
386
387
388
389
                'defaultvalue' => $i->admin,
            ),
            $i->institution.'_submit' => array(
                'type'  => 'submit',
                'value' => get_string('update'),
            ),
390
391
392
393
394
            $i->institution.'_remove' => array(
                'type'  => 'submit',
                'value' => get_string('removeuserfrominstitution', 'admin'),
                'confirm' => get_string('confirmremoveuserfrominstitution', 'admin'),
            ),
395
        ),
Richard Mansfield's avatar
Richard Mansfield committed
396
397
    );
}
398

399
400
401
402
403
404
405
406
407
408
// Only site admins can add institutions; institutional admins must invite
if ($USER->get('admin') 
    && (get_config('usersallowedmultipleinstitutions') || count($user->institutions) == 0)) {
    $options = array();
    foreach ($allinstitutions as $i) {
        if (!$user->in_institution($i->name) && $i->name != 'mahara') {
            $options[$i->name] = $i->displayname;
        }
    }
    if (!empty($options)) {
409
410
411
412
        $elements['addinstitutionheader'] = array(
            'type'  => 'markup',
            'value' => '<tr><td colspan="2"><h4>' . get_string('addusertoinstitution', 'admin') . '</h4></td></tr>',
        );
413
414
        $elements['addinstitution'] = array(
            'type'         => 'select',
415
            'title'        => get_string('institution'),
416
417
418
419
            'options'      => $options,
        );
        $elements['add'] = array(
            'type'  => 'submit',
420
            'value' => get_string('addusertoinstitution', 'admin'),
421
422
423
424
        );
    }
}

Richard Mansfield's avatar
Richard Mansfield committed
425
426
427
428
429
430
431
432
433
$institutionform = pieform(array(
    'name'       => 'edituser_institution',
    'renderer'   => 'table',
    'plugintype' => 'core',
    'pluginname' => 'admin',
    'elements'   => $elements,
));

function edituser_institution_submit(Pieform $form, $values) {
434
435
    $user = new User;
    if (!$user->find_by_id($values['id'])) {
Richard Mansfield's avatar
Richard Mansfield committed
436
437
        return false;
    }
438
    $userinstitutions = $user->get('institutions');
Richard Mansfield's avatar
Richard Mansfield committed
439

440
    global $USER;
441
    foreach ($userinstitutions as $i) {
Richard Mansfield's avatar
Richard Mansfield committed
442
        if ($USER->can_edit_institution($i->institution)) {
443
444
445
446
            if (isset($values[$i->institution.'_submit'])) {
                $newuser = (object) array(
                    'usr'         => $user->id,
                    'institution' => $i->institution,
447
                    'ctime'       => db_format_timestamp($i->ctime),
448
                    'studentid'   => $values[$i->institution . '_studentid'],
449
                    'staff'       => (int) ($values[$i->institution . '_staff'] == 'on'),
450
451
452
453
454
455
456
457
                    'admin'       => (int) ($values[$i->institution . '_admin'] == 'on'),
                );
                if ($values[$i->institution . '_expiry']) {
                    $newuser->expiry = db_format_timestamp($values[$i->institution . '_expiry']);
                }
                db_begin();
                delete_records('usr_institution', 'usr', $user->id, 'institution', $i->institution);
                insert_record('usr_institution', $newuser);
458
459
460
                if ($newuser->admin) {
                    activity_add_admin_defaults(array($user->id));
                }
461
462
463
464
                handle_event('updateuser', $user->id);
                db_commit();
                break;
            } else if (isset($values[$i->institution.'_remove'])) {
465
466
467
468
469
                if ($user->id == $USER->id) {
                    $USER->leave_institution($i->institution);
                } else {
                    $user->leave_institution($i->institution);
                }
470
471
472
473
                // Institutional admins can no longer access this page
                // if they remove the user from the institution, so
                // send them back to user search.
                if (!$USER->get('admin')) {
474
475
476
                    if (!$USER->is_institutional_admin()) {
                        redirect(get_config('wwwroot'));
                    }
477
478
479
480
481
                    redirect('/admin/users/search.php');
                }
                break;
            }
        }
482
483
    }

484
485
    if (isset($values['add']) && $USER->get('admin')
        && (empty($userinstitutions) || get_config('usersallowedmultipleinstitutions'))) {
486
487
488
489
490
491
492
        if ($user->id == $USER->id) {
            $USER->join_institution($values['addinstitution']);
            $USER->commit();
        }
        else {
            $user->join_institution($values['addinstitution']);
        }
Richard Mansfield's avatar
Richard Mansfield committed
493
494
495
496
    }

    redirect('/admin/users/edit.php?id='.$user->id);
}
497
498
499

$smarty = smarty();
$smarty->assign('user', $user);
500
501
502
503
$smarty->assign('suspended', $suspended);
if ($suspended) {
    $smarty->assign('suspendedby', get_string('suspendedby', 'admin', $suspender));
}
504
$smarty->assign('suspendform', $suspendform);
505
506
507
508
if (isset($suspendform2)) {
    $smarty->assign('suspendform2', $suspendform2);
}
$smarty->assign('deleteform', $deleteform);
Richard Mansfield's avatar
Richard Mansfield committed
509
$smarty->assign('siteform', $siteform);
510
$smarty->assign('institutions', count($allinstitutions) > 1);
Richard Mansfield's avatar
Richard Mansfield committed
511
$smarty->assign('institutionform', $institutionform);
Richard Mansfield's avatar
Richard Mansfield committed
512
513

if ($id != $USER->get('id') && is_null($USER->get('parentuser'))) {
514
    $loginas = get_string('loginasuser', 'admin', $user->username);
Richard Mansfield's avatar
Richard Mansfield committed
515
516
517
518
} else {
    $loginas = null;
}
$smarty->assign('loginas', $loginas);
519
$smarty->assign('PAGEHEADING', hsc(TITLE . ': ' . display_name($user)));
520
521
522
$smarty->display('admin/users/edit.tpl');

?>