Handle hostnames with upper-case letters
[webmin.git] / useradmin / mass_delete_user.cgi
1 #!/usr/local/bin/perl
2 # mass_delete_user.cgi
3 # Delete multiple users, after asking for confirmation
4
5 require './user-lib.pl';
6 &ReadParse();
7 %ulist = map { $_->{'user'}, $_ } &list_users();
8 &error_setup($text{'umass_err'});
9 foreach $name (split(/\0/, $in{'d'})) {
10         $user = $ulist{$name};
11         if ($user) {
12                 &can_edit_user(\%access, $user) ||
13                         &error(&text('umass_euser', $name));
14                 push(@dlist, $user);
15                 $delete_sys = $user if ($user->{'uid'} < 10 &&
16                     (!$delete_sys || $user->{'uid'} < $delete_sys->{'uid'}));
17                 }
18         }
19 @dlist || &error($text{'umass_enone'});
20
21 if ($in{'disable'}) {
22         # Disabling a bunch of users
23         &ui_print_unbuffered_header(undef, $text{'dmass_title'}, "");
24
25         if ($in{'confirmed'}) {
26                 foreach $user (@dlist) {
27                         # Show username
28                         print "<b>",&text('dmass_doing', $user->{'user'}),"</b><br>\n";
29                         print "<ul>\n";
30
31                         # Run the before command
32                         local @secs;
33                         foreach $g (&list_groups()) {
34                                 @mems = split(/,/, $g->{'members'});
35                                 if (&indexof($user->{'user'}, @mems) >= 0) {
36                                         push(@secs, $g->{'gid'});
37                                         }
38                                 }
39                         &set_user_envs($user, 'MODIFY_USER', undef, \@secs);
40                         $merr = &making_changes();
41                         &error(&text('usave_emaking', "<tt>$merr</tt>"))
42                                 if (defined($merr));
43
44                         # Do it
45                         &lock_user_files();
46                         print "$text{'dmass_pass'}<br>\n";
47                         if ($user->{'pass'} !~ /^$disable_string/) {
48                                 $user->{'pass'} =
49                                         $disable_string.$user->{'pass'};
50                                 &modify_user($user, $user);
51                                 print "$text{'udel_done'}<p>\n";
52                                 }
53                         else {
54                                 print "$text{'dmass_already'}<p>\n";
55                                 }
56                         &unlock_user_files();
57
58                         &made_changes();
59                         print "</ul>\n";
60                         }
61
62                 &webmin_log("disable", "users", scalar(@dlist),
63                             { 'user' => [ map { $_->{'user'} } @dlist ] });
64
65                 &ui_print_footer("", $text{'index_return'});
66                 }
67         else {
68                 # Ask if the user is sure he wants to disable
69                 print &ui_confirmation_form("mass_delete_user.cgi",
70                         &text('dmass_sure', scalar(@dlist)),
71                         [ [ "confirmed", 1 ],
72                           [ "disable", 1 ],
73                           map { [ "d", $_->{'user'} ] } @dlist ],
74                         [ [ undef, $text{'dmass_dis'} ] ],
75                         );
76
77                 &ui_print_footer("", $text{'index_return'});
78                 }
79         }
80 elsif ($in{'enable'}) {
81         # Enabling a bunch of users
82         &ui_print_unbuffered_header(undef, $text{'emass_title'}, "");
83
84         foreach $user (@dlist) {
85                 # Show username
86                 print "<b>",&text('emass_doing', $user->{'user'}),"</b><br>\n";
87                 print "<ul>\n";
88
89                 # Run the before command
90                 local @secs;
91                 foreach $g (&list_groups()) {
92                         @mems = split(/,/, $g->{'members'});
93                         if (&indexof($user->{'user'}, @mems) >= 0) {
94                                 push(@secs, $g->{'gid'});
95                                 }
96                         }
97                 &set_user_envs($user, 'MODIFY_USER', undef, \@secs);
98                 $merr = &making_changes();
99                 &error(&text('usave_emaking', "<tt>$merr</tt>"))
100                         if (defined($merr));
101
102                 # Do it
103                 &lock_user_files();
104                 print "$text{'emass_pass'}<br>\n";
105                 if ($user->{'pass'} =~ s/^$disable_string//) {
106                         &modify_user($user, $user);
107                         print "$text{'udel_done'}<p>\n";
108                         }
109                 else {
110                         print "$text{'emass_already'}<p>\n";
111                         }
112                 &unlock_user_files();
113
114                 &made_changes();
115                 print "</ul>\n";
116                 }
117
118         &webmin_log("enable", "users", scalar(@dlist),
119                     { 'user' => [ map { $_->{'user'} } @dlist ] });
120
121         &ui_print_footer("", $text{'index_return'});
122         }
123 else {
124         # Deleting a bunch of users
125         $access{'udelete'} || &error($text{'udel_euser'});
126         &ui_print_unbuffered_header(undef, $text{'umass_title'}, "");
127
128         # Check for deletion of system user
129         if (!$config{'delete_root'} && $delete_sys) {
130                 print "<p> <b>",&text('umass_eroot',
131                                       $delete_root->{'user'}),"</b> <p>\n";
132                 &ui_print_footer("", $text{'index_return'});
133                 exit;
134                 }
135
136         if ($in{'confirmed'}) {
137                 foreach $user (@dlist) {
138                         # Show username
139                         print "<b>",&text('umass_doing', $user->{'user'}),"</b><br>\n";
140                         print "<ul>\n";
141
142                         # Run the before command
143                         local @secs;
144                         foreach $g (&list_groups()) {
145                                 @mems = split(/,/, $g->{'members'});
146                                 if (&indexof($user->{'user'}, @mems) >= 0) {
147                                         push(@secs, $g->{'gid'});
148                                         }
149                                 }
150                         &set_user_envs($user, 'DELETE_USER', undef, \@secs);
151                         $merr = &making_changes();
152                         &error(&text('usave_emaking', "<tt>$merr</tt>"))
153                                 if (defined($merr));
154
155                         # Go ahead and do it!
156                         $others = $in{'others'};
157                         $others = !$access{'dothers'}
158                                 if ($access{'dothers'} != 1);
159                         if ($others) {
160                                 print "$text{'udel_other'}<br>\n";
161                                 local $error_must_die = 1;
162                                 eval { &other_modules("useradmin_delete_user",$user); };
163                                 if ($@) {
164                                         print &text('udel_failed', $@),"<p>\n";
165                                         }
166                                 else {
167                                         print "$text{'udel_done'}<p>\n";
168                                         }
169                                 }
170                         
171                         &lock_user_files();
172                         print "$text{'udel_pass'}<br>\n";
173                         &delete_user($user);
174                         print "$text{'udel_done'}<p>\n";
175
176                         print "$text{'udel_groups'}<br>\n";
177                         foreach $g (&list_groups()) {
178                                 @mems = split(/,/, $g->{'members'});
179                                 $idx = &indexof($user->{'user'}, @mems);
180                                 if ($idx >= 0) {
181                                         splice(@mems, $idx, 1);
182                                         %newg = %$g;
183                                         $newg{'members'} = join(',', @mems);
184                                         &modify_group($g, \%newg);
185                                         }
186                                 $mygroup = $g if ($g->{'group'} eq $user->{'user'});
187                                 }
188                         print "$text{'udel_done'}<p>\n";
189
190                         if ($mygroup && !$mygroup->{'members'}) {
191                                 local $another;
192                                 foreach $ou (&list_users()) {
193                                         $another = $ou if ($ou->{'gid'} == $mygroup->{'gid'});
194                                         }
195                                 if (!$another) {
196                                         print "$text{'udel_ugroup'}<br>\n";
197                                         &delete_group($mygroup);
198                                         print "$text{'udel_done'}<p>\n";
199                                         }
200                                 }
201                         &unlock_user_files();
202
203                         if ($in{'delhome'} && $user->{'home'} !~ /^\/+$/) {
204                                 print "$text{'udel_home'}<br>\n";
205                                 &lock_file($user->{'home'});
206                                 &delete_home_directory($user);
207                                 &unlock_file($user->{'home'});
208                                 print "$text{'udel_done'}<p>\n";
209                                 }
210
211                         &made_changes();
212                         print "</ul>\n";
213                         }
214
215                 &webmin_log("delete", "users", scalar(@dlist),
216                             { 'user' => [ map { $_->{'user'} } @dlist ] });
217
218                 &ui_print_footer("", $text{'index_return'});
219                 }
220         else {
221                 # Ask if the user is sure
222                 @hids = ( [ "confirmed", 1 ] );
223                 foreach $user (@dlist) {
224                         push(@hids, [ "d", $user->{'user'} ]);
225                         }
226
227                 # Sum up home directories
228                 foreach $user (@dlist) {
229                         if ($user->{'home'} ne "/" && -d $user->{'home'}) {
230                                 $size += &disk_usage_kb($user->{'home'});
231                                 }
232                         }
233
234                 if ($access{'delhome'} == 1) {
235                         # Force home directory deletion
236                         push(@hids, [ "delhome", 1 ]);
237                         @buts = ( [ undef, $text{'umass_del2'} ] );
238                         }
239                 elsif ($access{'delhome'} == 0) {
240                         # Never allow home directory deletion
241                         @buts = ( [ undef, $text{'umass_del1'} ] );
242                         }
243                 else {
244                         # Give user a choice
245                         @buts = ( [ undef, $text{'umass_del1'} ],
246                                   [ "delhome", $text{'umass_del2'} ] );
247                         }
248
249                 # Show the warning
250                 print &ui_confirmation_form(
251                         "mass_delete_user.cgi",
252                         $size ? &text('umass_sure', scalar(@dlist),
253                                       &nice_size($size*1024)) :
254                                 &text('umass_sure2', scalar(@dlist)),
255                         \@hids, \@buts,
256                         $access{'dothers'} == 1 ?
257                                 &ui_checkbox("others", 1, $text{'udel_dothers'},
258                                              $config{'default_other'}) : "",
259                         $delete_sys && $delete_sys->{'user'} eq 'root' ?
260                            $text{'udel_root'} : "",
261                         );
262                                 
263
264                 &ui_print_footer("", $text{'index_return'});
265                 }
266         }
267