Handle hostnames with upper-case letters
[webmin.git] / acl / useradmin_update.pl
1
2 do "acl-lib.pl";
3
4 # useradmin_create_user(&details)
5 # Create a new webmin user in the group
6 sub useradmin_create_user
7 {
8 return if (!$config{'sync_create'});
9 my $group = &get_group($config{'sync_group'});
10 return if (!$group);
11 my $clash = &get_user($_[0]->{'user'}) || &get_group($_[0]->{'user'});
12 return if ($clash);
13 return if ($_[0]->{'user'} !~ /^[A-z0-9\-\_\.]+$/);
14 my $user = { 'name' => $_[0]->{'user'},
15              'pass' => $config{'sync_unix'} ? 'x' : $_[0]->{'pass'},
16              'sync' => 1,
17              'modules' => $group->{'modules'} };
18 &create_user($user);
19 push(@{$group->{'members'}}, $user->{'name'});
20 &modify_group($group->{'name'}, $group);
21
22 foreach my $m (@{$group->{'modules'}}, "") {
23         my %groupacl;
24         unlink("$config_directory/$m/$user->{'name'}.acl");
25         if (&read_file("$config_directory/$m/$group->{'name'}.gacl",
26                        \%groupacl)) {
27                 &write_file("$config_directory/$m/$user->{'name'}.acl",
28                             \%groupacl);
29                 }
30         }
31 &reload_miniserv();
32 }
33
34 # useradmin_delete_user(&details)
35 # Delete this webmin user if in sync
36 sub useradmin_delete_user
37 {
38 return if (!$config{'sync_delete'});
39 my $u = &get_user($_[0]->{'user'});
40 if ($u) {
41         &delete_user($u->{'name'});
42         &reload_miniserv();
43         }
44 foreach $g (&list_groups()) {
45         my @mems = @{$g->{'members'}};
46         my $i = &indexof($_[0]->{'user'}, @mems);
47         if ($i >= 0) {
48                 splice(@mems, $i, 1);
49                 $g->{'members'} = \@mems;
50                 &modify_group($g->{'name'}, $g);
51                 }
52         }
53 }
54
55 # useradmin_modify_user(&details)
56 # Update this users password if in sync
57 sub useradmin_modify_user
58 {
59 return if ($_[0]->{'passmode'} == 4 && $_[0]->{'olduser'} eq $_[0]->{'user'});
60 my $u = &get_user($_[0]->{'olduser'});
61 if ($u && $u->{'sync'}) {
62         if ($_[0]->{'user'} ne $_[0]->{'olduser'}) {
63                 # New name might clash (or be invalid)
64                 my $clash = &get_user($_[0]->{'user'}) ||
65                                &get_group($_[0]->{'user'});
66                 return if ($clash);
67                 return if ($_[0]->{'user'} !~ /^[A-z0-9\-\_\.]+$/);
68                 }
69         $u->{'name'} = $_[0]->{'user'};
70         if ($u->{'pass'} ne 'x') {
71                 $u->{'pass'} = $_[0]->{'passmode'} == 3 ?
72                    &encrypt_password($_[0]->{'plainpass'}) :
73                    $_[0]->{'pass'};
74                 }
75         &modify_user($_[0]->{'olduser'}, $u);
76         &reload_miniserv();
77         }
78
79
80 if ($_[0]->{'user'} ne $_[0]->{'olduser'}) {
81         # Check other users' acl module acls
82         foreach my $u (&list_users()) {
83                 my %uaccess = &get_module_acl($u->{'name'});
84                 my @au = split(/\s+/, $uaccess{'users'});
85                 my $idx = &indexof($_[0]->{'olduser'}, @au);
86                 if ($idx != -1) {
87                         $au[$idx] = $_[0]->{'user'};
88                         $uaccess{'users'} = join(" ", @au);
89                         &save_module_acl(\%uaccess, $u->{'name'});
90                         }
91                 }
92
93         # Rename the user in his group
94         foreach my $g (&list_groups()) {
95                 my @mems = @{$g->{'members'}};
96                 my $i = &indexof($_[0]->{'olduser'}, @mems);
97                 if ($i >= 0) {
98                         $mems[$i] = $_[0]->{'user'};
99                         $g->{'members'} = \@mems;
100                         &modify_group($g->{'name'}, $g);
101                         }
102                 }
103         }
104 }
105
106 1;
107