Handle hostnames with upper-case letters
[webmin.git] / useradmin / delete_user.cgi
1 #!/usr/local/bin/perl
2 # delete_user.cgi
3 # Delete a user, after asking for confirmation
4
5 require './user-lib.pl';
6 &ReadParse();
7 &lock_user_files();
8 @ulist = &list_users();
9 ($user) = grep { $_->{'user'} eq $in{'user'} } @ulist;
10 $user || &error($text{'uedit_egone'});
11 &error_setup($text{'udel_err'});
12 &can_edit_user(\%access, $user) || &error($text{'udel_euser'});
13 $access{'udelete'} || &error($text{'udel_euser'});
14
15 $| = 1;
16 &ui_print_header(undef, $text{'udel_title'}, "");
17
18 if (!$config{'delete_root'} && $user->{'uid'} <= 10) {
19         print "<p> <b>$text{'udel_eroot'}</b> <p>\n";
20         print &ui_hr();
21         &footer("", $text{'index_return'});
22         exit;
23         }
24
25 # Check for repeat click
26 if ($user->{'user'} ne $in{'user'} || $in{'user'} eq '') {
27         print "<p> <b>$text{'udel_ealready'}</b> <p>\n";
28         print &ui_hr();
29         &footer("", $text{'index_return'});
30         exit;
31         }
32
33 if ($in{'confirmed'}) {
34         # Run the before command
35         local @secs;
36         foreach $g (&list_groups()) {
37                 @mems = split(/,/, $g->{'members'});
38                 if (&indexof($user->{'user'}, @mems) >= 0) {
39                         push(@secs, $g->{'gid'});
40                         }
41                 }
42
43         # Go ahead and do it!
44         &set_user_envs($user, 'DELETE_USER', undef, \@secs);
45         $merr = &making_changes();
46         &error(&text('usave_emaking', "<tt>$merr</tt>")) if (defined($merr));
47
48         # Delete in other modules first
49         $in{'others'} = !$access{'dothers'} if ($access{'dothers'} != 1);
50         if ($in{'others'}) {
51                 print "$text{'udel_other'}<br>\n";
52                 local $error_must_die = 1;
53                 eval { &other_modules("useradmin_delete_user", $user); };
54                 if ($@) {
55                         print &text('udel_failed', $@),"<p>\n";
56                         }
57                 else {
58                         print "$text{'udel_done'}<p>\n";
59                         }
60                 }
61         
62         # Delete the user
63         print "$text{'udel_pass'}<br>\n";
64         &delete_user($user);
65         print "$text{'udel_done'}<p>\n";
66
67         # Delete the user from other groups
68         print "$text{'udel_groups'}<br>\n";
69         foreach $g (&list_groups()) {
70                 @mems = split(/,/, $g->{'members'});
71                 $idx = &indexof($user->{'user'}, @mems);
72                 if ($idx >= 0) {
73                         splice(@mems, $idx, 1);
74                         %newg = %$g;
75                         $newg{'members'} = join(',', @mems);
76                         &modify_group($g, \%newg);
77                         }
78                 $mygroup = $g if ($g->{'group'} eq $user->{'user'});
79                 }
80         print "$text{'udel_done'}<p>\n";
81
82         # Delete the user's personal group, if it has no other members
83         if ($mygroup && !$mygroup->{'members'}) {
84                 local $another;
85                 foreach $ou (&list_users()) {
86                         $another = $ou if ($ou->{'gid'} == $mygroup->{'gid'});
87                         }
88                 if (!$another && $in{'others'}) {
89                         print "$text{'udel_ugroupother'}<br>\n";
90                         local $error_must_die = 1;
91                         eval { &other_modules("useradmin_delete_group",
92                                               $mygroup); };
93                         if ($@) {
94                                 print &text('udel_failed', $@),"<p>\n";
95                                 }
96                         else {
97                                 print "$text{'gdel_done'}<p>\n";
98                                 }
99                         }
100                 if (!$another) {
101                         print "$text{'udel_ugroup'}<br>\n";
102                         &delete_group($mygroup);
103                         print "$text{'udel_done'}<p>\n";
104                         }
105                 }
106         &unlock_user_files();
107
108         if ($in{'delhome'} && $user->{'home'} !~ /^\/+$/ &&
109             $access{'delhome'} != 0) {
110                 # Delete home directory
111                 print "$text{'udel_home'}<br>\n";
112                 &lock_file($user->{'home'});
113                 &delete_home_directory($user);
114                 &unlock_file($user->{'home'});
115                 print "$text{'udel_done'}<p>\n";
116                 }
117
118         &made_changes();
119
120         %p = ( %in, %$user );
121         delete($p{'pass'});
122         &webmin_log("delete", "user", $user->{'user'}, \%p);
123
124 done:
125         &ui_print_footer("", $text{'index_return'});
126         }
127 else {
128         # Check if something has changed
129         if ($user->{'user'} ne $in{'user'}) {
130                 print "<b>$text{'udel_echanged'}</b> <p>\n";
131                 &ui_print_footer("", $text{'index_return'});
132                 exit;
133                 }
134
135         # Ask if the user is sure
136         @buts = ( );
137         if ($user->{'home'} ne "/" && -d $user->{'home'} &&
138             $access{'delhome'} != 0) {
139                 # Has a home directory, so check for files owned by others
140                 $size = &disk_usage_kb($user->{'home'});
141                 $msg = &text('udel_sure', &html_escape($user->{'user'}),
142                            "<tt>".&html_escape($user->{'home'})."</tt>", &nice_size($size*1024));
143                 if ($access{'delhome'} != 1) {
144                         push(@buts, [ undef, $text{'udel_del1'} ]);
145                         }
146                 push(@buts, [ "delhome", $text{'udel_del2'} ]);
147
148                 # check for files owned by other users
149                 @others = &backquote_command("find ".quotemeta($user->{'home'}).
150                         " ! -user $user->{'uid'} 2>/dev/null", 1);
151                 }
152         else {
153                 # No home directory
154                 $msg = &text('udel_sure2',&html_escape($user->{'user'}));
155                 push(@buts, [ undef, $text{'udel_del1'} ]);
156                 }
157
158         print &ui_confirmation_form("delete_user.cgi", $msg,
159                 [ [ "user", $user->{'user'} ],
160                   [ "confirmed", 1 ] ],
161                 \@buts,
162                 $access{'dothers'} == 1 ?
163                         &ui_checkbox("others", 1, $text{'udel_dothers'},
164                                      $config{'default_other'}) : "",
165                 (@others ? &text('udel_others', "<tt>".&html_escape($user->{'home'})."</tt>",
166                                                    scalar(@others))."<p>" : "").
167                 ($user->{'user'} eq 'root' ? $text{'udel_root'} : ""),
168                 );
169
170         &ui_print_footer("", $text{'index_return'});
171         }