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