Handle hostnames with upper-case letters
[webmin.git] / samba / make_epass.cgi
1 #!/usr/local/bin/perl
2 # make_epass.cgi
3 # Create or update the samba password file from the list of Unix users
4
5 require './samba-lib.pl';
6 &ReadParse();
7 # check acls
8
9 &error_setup("<blink><font color=red>$text{'eacl_aviol'}</font></blink>");
10 &error("$text{'eacl_np'} $text{'eacl_pmpass'}")
11                 unless $access{'maint_makepass'};
12 # make
13 &ui_print_header(undef, $text{'mkpass_title'}, "");
14 &error_setup($text{'mkpass_convfail'});
15 $| = 1;
16
17 if ($config{'smb_passwd'} =~ /^(.*)\/([^\/]+)$/) {
18         mkdir($1, 0700);
19         }
20 &lock_file($config{'smb_passwd'});
21 @ulist = &list_users();
22 map { $suser{$_->{'name'}} = $_ } @ulist;
23
24 print "$text{'mkpass_msg'}<p>\n";
25 @skip = split(/[ \t,]/ , $in{"skip_list"});
26 print "<table border width=100%><tr><td bgcolor=#c0c0c0><pre>\n";
27 setpwent();
28 while(@uinfo = getpwent()) {
29         # Get new and existing user details
30         local ($c1, $c2, $m);
31         local $huinfo = &html_escape($uinfo[0]);
32         $uexists{$uinfo[0]}++;
33         local $su = $suser{$uinfo[0]};
34
35         # Check if this user would be skipped
36         local $skipme;
37         foreach $s (@skip) {
38                 if ($s eq $uinfo[0]) { $skipme++; }
39                 elsif ($s =~ /^(\d+)$/ && $s == $uinfo[2]) { $skipme++; }
40                 elsif ($s =~ /^(\d+)\-(\d+)$/ &&
41                        $uinfo[2] >= $1 && $uinfo[2] <= $2) { $skipme++; }
42                 elsif ($s =~ /^(\d+)\-$/ && $uinfo[2] >= $1) { $skipme++; }
43                 elsif ($s =~ /^\-(\d+)$/ && $uinfo[2] <= $1) { $skipme++; }
44                 elsif ($s =~ /^\@(.*)$/) {
45                         local @ginfo = getgrnam($1);
46                         local @mems = split(/\s+/, $ginfo[3]);
47                         $skipme++ if ($uinfo[3] == $ginfo[2] ||
48                                       &indexof($uinfo[0], @mems) >= 0);
49                         }
50                 }
51         if ($skipme) {
52                 $m = "$huinfo $text{'mkpass_skip'}";
53                 }
54
55         elsif ($su && $in{"update"}) {
56                 if ($su->{'opts'}) {
57                         # new-style user
58                         if ($uinfo[2] == $su->{'uid'}) {
59                                 $m = "$huinfo $text{'mkpass_same'}";
60                                 }
61                         else {
62                                 $su->{'uid'} = $uinfo[2];
63                                 $su->{'real'} = $uinfo[6];
64                                 &modify_user($su);
65                                 $m = "$huinfo $text{'mkpass_update'}";
66                                 $c1 = "<i>"; $c2 = "</i>";
67                                 $modified++;
68                                 }
69                         }
70                 else {
71                         # old-style user
72                         if ($uinfo[2] == $su->{'uid'} &&
73                             $uinfo[6] eq $su->{'real'} &&
74                             $uinfo[7] eq $su->{'home'} &&
75                             $uinfo[8] eq $su->{'shell'}) {
76                                 $m = "$huinfo $text{'mkpass_same'}";
77                                 }
78                         else {
79                                 $su->{'uid'} = $uinfo[2];
80                                 $su->{'real'} = $uinfo[6];
81                                 $su->{'home'} = $uinfo[7];
82                                 $su->{'shell'} = $uinfo[8];
83                                 &modify_user($su);
84                                 $m = "$huinfo $text{'mkpass_update'}";
85                                 $c1 = "<i>"; $c2 = "</i>";
86                                 $modified++;
87                                 }
88                         }
89                 }
90         elsif ($in{"add"} && !$su) {
91                 local $nu = { 'name' => $uinfo[0],
92                               'uid' => $uinfo[2] };
93                 local @flags = ("U");
94                 $c1 = "<b>"; $c2 = "</b>";
95                 $m = "$huinfo being added";
96                 if ($in{'newmode'} == 0) {
97                         $nu->{'pass1'} = "NO PASSWORDXXXXXXXXXXXXXXXXXXXXX";
98                         $nu->{'pass2'} = $nu->{'pass1'};
99                         push(@flags, "N");
100                         }
101                 else {
102                         $nu->{'pass1'} = $nu->{'pass2'} = ("X" x 32);
103                         if ($in{'newmode'} == 2) {
104                                 $setpass{$uinfo[0]} = $in{'newpass'};
105                                 }
106                         else { push(@flags, "D"); }
107                         }
108                 if ($samba_version < 2) {
109                         $nu->{'real'} = $uinfo[6];
110                         $nu->{'home'} = $uinfo[7];
111                         $nu->{'shell'} = $uinfo[8];
112                         }
113                 else {
114                         $nu->{'opts'} = \@flags;
115                         }
116                 &create_user($nu);
117                 $created++;
118                 }
119         if ($m) { printf "$c1%-40.40s$c2%s", $m, ++$c%2 ? "" : "\n"; }
120         }
121 endpwent() if ($gconfig{'os_type'} ne 'hpux');
122
123 # Delete missing users, if needed
124 if ($in{"delete"}) {
125         foreach $u (@ulist) {
126                 if (!$uexists{$u->{'name'}}) {
127                         # delete this samba user..
128                         $m = &html_escape($u->{'name'})." $text{'mkpass_del'}";
129                         &delete_user($u);
130                         printf "<b><font color=#ff0000>%-40.40s</font></b>%s",
131                                 $m, ++$c%2 ? "" : "\n";
132                         $deleted++;
133                         }
134                 }
135         }
136
137 # Update the passwords of new users
138 foreach $u (keys %setpass) {
139         &set_password($u, $setpass{$u}) ||
140                 &error($text{'mkpass_passfail'});
141         }
142 &unlock_file($config{'smb_passwd'});
143 &webmin_log("epass", undef, undef, { 'modified' => $modified,
144                                      'created' => $created,
145                                      'deleted' => $deleted } );
146
147 print "</pre></td></tr></table>\n";
148 &ui_print_footer("", $text{'index_sharelist'});
149