3 # Create or update the samba password file from the list of Unix users
5 require './samba-lib.pl';
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'};
13 &ui_print_header(undef, $text{'mkpass_title'}, "");
14 &error_setup($text{'mkpass_convfail'});
17 if ($config{'smb_passwd'} =~ /^(.*)\/([^\/]+)$/) {
20 &lock_file($config{'smb_passwd'});
21 @ulist = &list_users();
22 map { $suser{$_->{'name'}} = $_ } @ulist;
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";
28 while(@uinfo = getpwent()) {
29 # Get new and existing user details
31 local $huinfo = &html_escape($uinfo[0]);
32 $uexists{$uinfo[0]}++;
33 local $su = $suser{$uinfo[0]};
35 # Check if this user would be skipped
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);
52 $m = "$huinfo $text{'mkpass_skip'}";
55 elsif ($su && $in{"update"}) {
58 if ($uinfo[2] == $su->{'uid'}) {
59 $m = "$huinfo $text{'mkpass_same'}";
62 $su->{'uid'} = $uinfo[2];
63 $su->{'real'} = $uinfo[6];
65 $m = "$huinfo $text{'mkpass_update'}";
66 $c1 = "<i>"; $c2 = "</i>";
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'}";
79 $su->{'uid'} = $uinfo[2];
80 $su->{'real'} = $uinfo[6];
81 $su->{'home'} = $uinfo[7];
82 $su->{'shell'} = $uinfo[8];
84 $m = "$huinfo $text{'mkpass_update'}";
85 $c1 = "<i>"; $c2 = "</i>";
90 elsif ($in{"add"} && !$su) {
91 local $nu = { 'name' => $uinfo[0],
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'};
102 $nu->{'pass1'} = $nu->{'pass2'} = ("X" x 32);
103 if ($in{'newmode'} == 2) {
104 $setpass{$uinfo[0]} = $in{'newpass'};
106 else { push(@flags, "D"); }
108 if ($samba_version < 2) {
109 $nu->{'real'} = $uinfo[6];
110 $nu->{'home'} = $uinfo[7];
111 $nu->{'shell'} = $uinfo[8];
114 $nu->{'opts'} = \@flags;
119 if ($m) { printf "$c1%-40.40s$c2%s", $m, ++$c%2 ? "" : "\n"; }
121 endpwent() if ($gconfig{'os_type'} ne 'hpux');
123 # Delete missing users, if needed
125 foreach $u (@ulist) {
126 if (!$uexists{$u->{'name'}}) {
127 # delete this samba user..
128 $m = &html_escape($u->{'name'})." $text{'mkpass_del'}";
130 printf "<b><font color=#ff0000>%-40.40s</font></b>%s",
131 $m, ++$c%2 ? "" : "\n";
137 # Update the passwords of new users
138 foreach $u (keys %setpass) {
139 &set_password($u, $setpass{$u}) ||
140 &error($text{'mkpass_passfail'});
142 &unlock_file($config{'smb_passwd'});
143 &webmin_log("epass", undef, undef, { 'modified' => $modified,
144 'created' => $created,
145 'deleted' => $deleted } );
147 print "</pre></td></tr></table>\n";
148 &ui_print_footer("", $text{'index_sharelist'});