- if (&confirm_yn("Ok?", "yes")) {
- local($new_entry) =
- "$name::$u_id:$g_id::0:0:$fullname:$home/$name:$sh";
-
- &append_file($passwd, $new_entry);
-
- system("$pwd_mkdb $passwd");
- if ($?) {
- local($crash) = "$passwd.crash$$";
- warn "$pwd_mkdb failed, try to restore ...\n";
-
- open(R, "> $crash") || die "Sorry, give up\n";
- $j = join("\n", @passwd_backup);
- $j =~ s/\n//;
- print R $j . "\n";
- close R;
-
- system("$pwd_mkdb $crash");
- die "Sorry, give up\n" if $?;
- die "Successfully restore $passwd. Exit.\n";
- }
- # Add new group
- &append_file($group, "$name:*:$g_id:$name")
- unless $groupname{$name};
-
- # update passwd/group variables
- push(@passwd_backup, $new_entry);
- $username{$name} = $u_id;
- $uid{$u_id} = $name;
- $pwgid{$g_id} = $name;
- $groupname{$name} = $g_id;
- $gid{$g_id} = $name;
-
- print "Added user ``$name''\n";
- local($a) = &confirm_yn("Change password", $defaultpasswd);
- if (($a && $defaultpasswd) || (!$a && !$defaultpasswd)) {
- while(1) {
- system("passwd $name");
- last unless $?;
- last unless
- &confirm_yn("Passwd $name failed. Try again?", "yes");
+
+ return &confirm_yn("OK?", "yes");
+}
+
+# make password database
+sub new_users_pwdmkdb {
+ local($last) = shift;
+ local($name) = shift;
+
+ system(@pwd_mkdb, '-u', $name, $etc_passwd);
+ if ($?) {
+ warn "$last\n";
+ warn "``@pwd_mkdb'' failed\n";
+ exit($? >> 8);
+ }
+}
+
+# update group database
+sub new_users_group_update {
+ local($e, @a);
+
+ # Add *new* group
+ if (!defined($groupname{$group_login}) &&
+ !defined($gid{$groupname{$group_login}})) {
+ push(@group_backup, "$group_login:*:$g_id:");
+ $groupname{$group_login} = $g_id;
+ $gid{$g_id} = $group_login;
+ # $groupmembers{$g_id} = $group_login;
+ }
+
+ if ($new_groups || defined($groupname{$group_login}) ||
+ defined($gid{$groupname{$group_login}}) &&
+ $gid{$groupname{$group_login}} ne "+") {
+ # new user is member of some groups
+ # new login group is already in name space
+ rename($group, "$group.bak");
+ #warn "$group_login $groupname{$group_login} $groupmembers{$groupname{$group_login}}\n";
+
+ # Restore comments from the top of the group file
+ @a = @group_comments;
+ foreach $e (sort {$a <=> $b} (keys %gid)) {
+ push(@a, "$gid{$e}:*:$e:$groupmembers{$e}");
+ }
+ &append_file($group, @a);
+ } else {
+ &append_file($group, "$group_login:*:$g_id:");
+ }
+
+}
+
+sub new_users_passwd_update {
+ # update passwd/group variables
+ push(@passwd_backup, $new_entry);
+ $username{$name} = $u_id;
+ $uid{$u_id} = $name;
+ $pwgid{$g_id} = $name;
+}
+
+# send message to new user
+sub new_users_sendmessage {
+ return 1 if $send_message eq "no";
+
+ local($cc) =
+ &confirm_list("Send message to ``$name'' and:",
+ 1, "no", ("root", "second_mail_address", "no"));
+ local($e);
+ $cc = "" if $cc eq "no";
+
+ foreach $e (@message_buffer) {
+ print eval "\"$e\"";
+ }
+ print "\n";
+
+ local(@message_buffer_append) = ();
+ if (!&confirm_yn("Add anything to default message", "no")) {
+ print "Use ``.'' or ^D alone on a line to finish your message.\n";
+ push(@message_buffer_append, "\n");
+ while($read = <STDIN>) {
+ last if $read eq "\.\n";
+ push(@message_buffer_append, $read);
+ }
+ }
+
+ &sendmessage("$name $cc", (@message_buffer, @message_buffer_append))
+ if (&confirm_yn("Send message", "yes"));
+}
+
+sub sendmessage {
+ local($to, @message) = @_;
+ local($e);
+
+ if (!open(M, "| mail -s Welcome $to")) {
+ warn "Cannot send mail to: $to!\n";
+ return 0;
+ } else {
+ foreach $e (@message) {
+ print M eval "\"$e\"";
+ }
+ close M;
+ }
+}
+
+
+sub new_users_password {
+
+ local($password);
+
+ while(1) {
+ system("stty -echo");
+ $password = &confirm_list("Enter password", 1, "", "");
+ system("stty echo");
+ print "\n";
+ if ($password ne "") {
+ system("stty -echo");
+ $newpass = &confirm_list("Enter password again", 1, "", "");
+ system("stty echo");
+ print "\n";
+ last if $password eq $newpass;
+ print "They didn't match, please try again\n";
+ }
+ elsif (&confirm_yn("Use an empty password?", "yes")) {
+ last;
+ }
+ }
+
+ return $password;
+}
+
+sub new_users_use_password {
+ local ($p) = $defaultusepassword;
+ $p = &confirm_yn("Use password-based authentication", $defaultusepassword);
+ return "yes" if (($defaultusepassword eq "yes" && $p) ||
+ ($defaultusepassword eq "no" && !$p));
+ return "no"; # otherwise
+}
+
+sub new_users_enable_account {
+ local ($p) = $defaultenableaccount;
+ $p = &confirm_yn("Enable account password at creation", $defaultenableaccount);
+ return "yes" if (($defaultenableaccount eq "yes" && $p) ||
+ ($defaultenableaccount eq "no" && !$p));
+ return "no"; # otherwise
+}
+
+sub new_users_empty_password {
+ local ($p) = $defaultemptypassword;
+ $p = &confirm_yn("Use an empty password", $defaultemptypassword);
+ return "yes" if (($defaultemptypassword eq "yes" && $p) ||
+ ($defaultemptypassword eq "no" && !$p));
+ return "no"; # otherwise
+}
+
+sub new_users {
+
+ print "\n" if $verbose;
+ print "Ok, let's go.\n" .
+ "Don't worry about mistakes. I will give you the chance later to " .
+ "correct any input.\n" if $verbose;
+
+ # name: Username
+ # fullname: Full name
+ # sh: shell
+ # userhome: home path for user
+ # u_id: user id
+ # g_id: group id
+ # class: login class
+ # group_login: groupname of g_id
+ # new_groups: some other groups
+ local($name, $group_login, $fullname, $sh, $u_id, $g_id, $class, $new_groups);
+ local($userhome);
+ local($groupmembers_bak, $cryptpwd);
+ local($new_users_ok) = 1;
+
+
+ $new_groups = "no";
+ $new_groups = "no" unless $groupname{$new_groups};
+
+ while(1) {
+ $name = &new_users_name;
+ $fullname = &new_users_fullname($name);
+ $sh = &new_users_shell;
+ $userhome = &new_users_home($name);
+ ($u_id, $g_id) = &new_users_id($name);
+ $class = &new_users_class($defaultclass);
+ ($group_login, $defaultgroup) =
+ &new_users_grplogin($name, $defaultgroup, $new_users_ok);
+ # do not use uniq username and login group
+ $g_id = $groupname{$group_login} if (defined($groupname{$group_login}));
+
+
+ # The tricky logic:
+ # If $usepasswd is 0, we use a * as a password
+ # If $usepasswd is 1, then
+ # if $enableaccount is 0, we prepend * as a password
+ # else if $enableaccount is 1 we don't prepend anything
+ # if $useemptypassword is 0 we ask for a password,
+ # else we use a blank one
+ #
+ # The logic is tasty, I'll give you that, but its flexible and
+ # it'll stop people shooting themselves in the foot.
+
+ $new_groups = &new_users_groups($name, $new_groups);
+
+ $usepassword = &new_users_use_password;
+ if ($usepassword eq "no") {
+ # note that the assignments to enableaccount and
+ # useemptypassword functionally do the same as
+ # usepasswd == "no". Just for consistency.
+ $password = ""; # no password!
+ $enableaccount = "no"; # doesn't matter here
+ $useemptypassword = "yes"; # doesn't matter here
+ } else {
+ $useemptypassword = &new_users_empty_password;
+ if ($useemptypassword eq "no") {
+ $password = &new_users_password;