3 # Delete multiple users, after asking for confirmation
5 require './ldap-useradmin-lib.pl';
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};
13 &can_edit_user($user) ||
14 &error(&text('umass_euser', $name));
16 $delete_sys = $user if ($user->{'uid'} < 10 &&
17 (!$delete_sys || $user->{'uid'} < $delete_sys->{'uid'}));
20 @dlist || &error($text{'umass_enone'});
23 # Disabling a bunch of users
24 &ui_print_unbuffered_header(undef, $text{'dmass_title'}, "");
26 if ($in{'confirmed'}) {
27 foreach $user (@dlist) {
29 print "<b>",&text('dmass_doing', $user->{'user'}),"</b><br>\n";
32 # Run the before command
34 foreach $g (&list_groups()) {
35 @mems = split(/,/, $g->{'members'});
36 if (&indexof($user->{'user'}, @mems) >= 0) {
37 push(@secs, $g->{'gid'});
40 &set_user_envs($user, 'MODIFY_USER', undef, \@secs);
41 $merr = &making_changes();
42 &error(&text('usave_emaking', "<tt>$merr</tt>"))
47 print "$text{'dmass_pass'}<br>\n";
48 if ($user->{'pass'} !~ /^$useradmin::disable_string/) {
50 $useradmin::disable_string.$user->{'pass'};
51 &modify_user($user, $user);
52 print "$text{'udel_done'}<p>\n";
55 print "$text{'dmass_already'}<p>\n";
63 &webmin_log("disable", "users", scalar(@dlist),
64 { 'user' => [ map { $_->{'user'} } @dlist ] });
66 &ui_print_footer("", $text{'index_return'});
69 # Ask if the user is sure
70 print &ui_confirmation_form(
71 "mass_delete_user.cgi",
72 &text('dmass_sure', scalar(@dlist)),
75 map { [ "d", $_->{'user'} ] } @dlist ],
76 [ [ undef, $text{'dmass_dis'} ] ],
79 &ui_print_footer("", $text{'index_return'});
82 elsif ($in{'enable'}) {
83 # Enabling a bunch of users
84 &ui_print_unbuffered_header(undef, $text{'emass_title'}, "");
86 foreach $user (@dlist) {
88 print "<b>",&text('emass_doing', $user->{'user'}),"</b><br>\n";
91 # Run the before command
93 foreach $g (&list_groups()) {
94 @mems = split(/,/, $g->{'members'});
95 if (&indexof($user->{'user'}, @mems) >= 0) {
96 push(@secs, $g->{'gid'});
99 &set_user_envs($user, 'MODIFY_USER', undef, \@secs);
100 $merr = &making_changes();
101 &error(&text('usave_emaking', "<tt>$merr</tt>"))
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";
112 print "$text{'emass_already'}<p>\n";
114 &unlock_user_files();
120 &webmin_log("enable", "users", scalar(@dlist),
121 { 'user' => [ map { $_->{'user'} } @dlist ] });
123 &ui_print_footer("", $text{'index_return'});
126 # Deleting a bunch of users
127 &ui_print_unbuffered_header(undef, $text{'umass_title'}, "");
129 if ($in{'confirmed'}) {
130 foreach $user (@dlist) {
132 print "<b>",&text('umass_doing', $user->{'user'}),"</b><br>\n";
135 # Run the before command
137 foreach $g (&list_groups()) {
138 @mems = split(/,/, $g->{'members'});
139 if (&indexof($user->{'user'}, @mems) >= 0) {
140 push(@secs, $g->{'gid'});
143 &set_user_envs($user, 'DELETE_USER', undef, \@secs);
144 $merr = &making_changes();
145 &error(&text('usave_emaking', "<tt>$merr</tt>"))
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); };
154 print &text('udel_failed', $@),"<p>\n";
157 print "$text{'udel_done'}<p>\n";
161 # Delete from the LDAP db
163 print "$text{'udel_pass'}<br>\n";
165 print "$text{'udel_done'}<p>\n";
168 print "$text{'udel_groups'}<br>\n";
169 foreach $g (&list_groups()) {
170 @mems = split(/,/, $g->{'members'});
171 $idx = &indexof($user->{'user'}, @mems);
173 splice(@mems, $idx, 1);
175 $newg{'members'} = join(',', @mems);
176 &modify_group($g, \%newg);
178 $mygroup = $g if ($g->{'group'} eq $user->{'user'});
180 print "$text{'udel_done'}<p>\n";
182 # Delete private group
183 if ($mygroup && !$mygroup->{'members'}) {
185 foreach $ou (&list_users()) {
186 $another = $ou if ($ou->{'gid'} == $mygroup->{'gid'});
189 print "$text{'udel_ugroup'}<br>\n";
190 &delete_group($mygroup);
191 print "$text{'udel_done'}<p>\n";
194 &unlock_user_files();
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'}");
201 print &text('udel_failed', $err),"<p>\n";
204 print "$text{'udel_done'}<p>\n";
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'});
219 &system_logged("rm -rf \"$user->{'home'}\" >/dev/null 2>&1");
221 print "$text{'udel_done'}<p>\n";
223 # Delete his IMAP mailbox only if home gets
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'}.
232 print "$text{'udel_done'}<p>\n";
240 &webmin_log("delete", "users", scalar(@dlist),
241 { 'user' => [ map { $_->{'user'} } @dlist ] });
243 &ui_print_footer("", $text{'index_return'});
246 # Sum up home directories
247 foreach $user (@dlist) {
248 if ($user->{'home'} ne "/" && -d $user->{'home'}) {
249 $size += &disk_usage_kb($user->{'home'});
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>"
269 &ui_print_footer("", $text{'index_return'});