3 # Delete multiple users, after asking for confirmation
5 require './user-lib.pl';
7 %ulist = map { $_->{'user'}, $_ } &list_users();
8 &error_setup($text{'umass_err'});
9 foreach $name (split(/\0/, $in{'d'})) {
10 $user = $ulist{$name};
12 &can_edit_user(\%access, $user) ||
13 &error(&text('umass_euser', $name));
15 $delete_sys = $user if ($user->{'uid'} < 10 &&
16 (!$delete_sys || $user->{'uid'} < $delete_sys->{'uid'}));
19 @dlist || &error($text{'umass_enone'});
22 # Disabling a bunch of users
23 &ui_print_unbuffered_header(undef, $text{'dmass_title'}, "");
25 if ($in{'confirmed'}) {
26 foreach $user (@dlist) {
28 print "<b>",&text('dmass_doing', $user->{'user'}),"</b><br>\n";
31 # Run the before command
33 foreach $g (&list_groups()) {
34 @mems = split(/,/, $g->{'members'});
35 if (&indexof($user->{'user'}, @mems) >= 0) {
36 push(@secs, $g->{'gid'});
39 &set_user_envs($user, 'MODIFY_USER', undef, \@secs);
40 $merr = &making_changes();
41 &error(&text('usave_emaking', "<tt>$merr</tt>"))
46 print "$text{'dmass_pass'}<br>\n";
47 if ($user->{'pass'} !~ /^$disable_string/) {
49 $disable_string.$user->{'pass'};
50 &modify_user($user, $user);
51 print "$text{'udel_done'}<p>\n";
54 print "$text{'dmass_already'}<p>\n";
62 &webmin_log("disable", "users", scalar(@dlist),
63 { 'user' => [ map { $_->{'user'} } @dlist ] });
65 &ui_print_footer("", $text{'index_return'});
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)),
73 map { [ "d", $_->{'user'} ] } @dlist ],
74 [ [ undef, $text{'dmass_dis'} ] ],
77 &ui_print_footer("", $text{'index_return'});
80 elsif ($in{'enable'}) {
81 # Enabling a bunch of users
82 &ui_print_unbuffered_header(undef, $text{'emass_title'}, "");
84 foreach $user (@dlist) {
86 print "<b>",&text('emass_doing', $user->{'user'}),"</b><br>\n";
89 # Run the before command
91 foreach $g (&list_groups()) {
92 @mems = split(/,/, $g->{'members'});
93 if (&indexof($user->{'user'}, @mems) >= 0) {
94 push(@secs, $g->{'gid'});
97 &set_user_envs($user, 'MODIFY_USER', undef, \@secs);
98 $merr = &making_changes();
99 &error(&text('usave_emaking', "<tt>$merr</tt>"))
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";
110 print "$text{'emass_already'}<p>\n";
112 &unlock_user_files();
118 &webmin_log("enable", "users", scalar(@dlist),
119 { 'user' => [ map { $_->{'user'} } @dlist ] });
121 &ui_print_footer("", $text{'index_return'});
124 # Deleting a bunch of users
125 $access{'udelete'} || &error($text{'udel_euser'});
126 &ui_print_unbuffered_header(undef, $text{'umass_title'}, "");
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'});
136 if ($in{'confirmed'}) {
137 foreach $user (@dlist) {
139 print "<b>",&text('umass_doing', $user->{'user'}),"</b><br>\n";
142 # Run the before command
144 foreach $g (&list_groups()) {
145 @mems = split(/,/, $g->{'members'});
146 if (&indexof($user->{'user'}, @mems) >= 0) {
147 push(@secs, $g->{'gid'});
150 &set_user_envs($user, 'DELETE_USER', undef, \@secs);
151 $merr = &making_changes();
152 &error(&text('usave_emaking', "<tt>$merr</tt>"))
155 # Go ahead and do it!
156 $others = $in{'others'};
157 $others = !$access{'dothers'}
158 if ($access{'dothers'} != 1);
160 print "$text{'udel_other'}<br>\n";
161 local $error_must_die = 1;
162 eval { &other_modules("useradmin_delete_user",$user); };
164 print &text('udel_failed', $@),"<p>\n";
167 print "$text{'udel_done'}<p>\n";
172 print "$text{'udel_pass'}<br>\n";
174 print "$text{'udel_done'}<p>\n";
176 print "$text{'udel_groups'}<br>\n";
177 foreach $g (&list_groups()) {
178 @mems = split(/,/, $g->{'members'});
179 $idx = &indexof($user->{'user'}, @mems);
181 splice(@mems, $idx, 1);
183 $newg{'members'} = join(',', @mems);
184 &modify_group($g, \%newg);
186 $mygroup = $g if ($g->{'group'} eq $user->{'user'});
188 print "$text{'udel_done'}<p>\n";
190 if ($mygroup && !$mygroup->{'members'}) {
192 foreach $ou (&list_users()) {
193 $another = $ou if ($ou->{'gid'} == $mygroup->{'gid'});
196 print "$text{'udel_ugroup'}<br>\n";
197 &delete_group($mygroup);
198 print "$text{'udel_done'}<p>\n";
201 &unlock_user_files();
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";
215 &webmin_log("delete", "users", scalar(@dlist),
216 { 'user' => [ map { $_->{'user'} } @dlist ] });
218 &ui_print_footer("", $text{'index_return'});
221 # Ask if the user is sure
222 @hids = ( [ "confirmed", 1 ] );
223 foreach $user (@dlist) {
224 push(@hids, [ "d", $user->{'user'} ]);
227 # Sum up home directories
228 foreach $user (@dlist) {
229 if ($user->{'home'} ne "/" && -d $user->{'home'}) {
230 $size += &disk_usage_kb($user->{'home'});
234 if ($access{'delhome'} == 1) {
235 # Force home directory deletion
236 push(@hids, [ "delhome", 1 ]);
237 @buts = ( [ undef, $text{'umass_del2'} ] );
239 elsif ($access{'delhome'} == 0) {
240 # Never allow home directory deletion
241 @buts = ( [ undef, $text{'umass_del1'} ] );
245 @buts = ( [ undef, $text{'umass_del1'} ],
246 [ "delhome", $text{'umass_del2'} ] );
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)),
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'} : "",
264 &ui_print_footer("", $text{'index_return'});