#!/usr/bin/perl -Tw # # fs_passwd # # portions of this script are copied from the `passwd' script in the original # (perl 4) camel book, now archived at # http://www.perl.com/CPAN/scripts/nutshell/ch6/passwd # # ivan@sisd.com 98-mar-8 # # password lengths 0,255 instead of 6,8 - we'll let the server process # check the data ivan@sisd.com 98-jul-17 use strict; use Getopt::Std; use Socket; use IO::Handle; use vars qw($opt_f $opt_s); my($fs_passwdd_socket)="/usr/local/freeside/fs_passwdd_socket"; my($freeside_uid)=scalar(getpwnam('freeside')); $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin'; $ENV{'SHELL'} = '/bin/sh'; $ENV{'IFS'} = " \t\n"; $ENV{'CDPATH'} = ''; $ENV{'ENV'} = ''; $ENV{'BASH_ENV'} = ''; $SIG{__DIE__}= sub { system '/bin/stty', 'echo'; }; die "passwd program isn't running setuid to freeside\n" if $> != $freeside_uid; unshift @ARGV, "-f" if $0 =~ /chfn$/; unshift @ARGV, "-s" if $0 =~ /chsh$/; getopts('fs'); my($me)=''; if ( $_ = shift(@ARGV) ) { /^(\w{2,8})$/; $me = $1; } die "You can't change the password for $me." if $me && $<; $me = (getpwuid($<))[0] unless $me; my($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell)= getpwnam $me; my($old_password,$new_password,$new_gecos,$new_shell); if ( $opt_f || $opt_s ) { system '/bin/stty', '-echo'; print "Password:"; $old_password=; system '/bin/stty', 'echo'; chop($old_password); #$old_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; $old_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; $old_password = $1; $new_password = ''; if ( $opt_f ) { print "\nChanging gecos for $me.\n"; print "Gecos [", $gcos, "]: "; $new_gecos=; chop($new_gecos); $new_gecos ||= $gcos; $new_gecos =~ /^(.{0,255})$/ or die "\nIllegal gecos.\n"; } else { $new_gecos = ''; } if ( $opt_s ) { print "\nChanging shell for $me.\n"; print "Shell [", $shell, "]: "; $new_shell=; chop($new_shell); $new_shell ||= $shell; $new_shell =~ /^(.{0,255})$/ or die "\nIllegal shell.\n"; } else { $new_shell = ''; } } else { print "Changing password for $me.\n"; print "Old password:"; system '/bin/stty', '-echo'; $old_password=; chop $old_password; #$old_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; $old_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; $old_password = $1; print "\nEnter the new password (minimum of 6, maximum of 8 characters)\n"; print "Please use a combination of upper and lowercase letters and numbers.\n"; print "New password:"; $new_password=; chop($new_password); #$new_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; $new_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; $new_password = $1; print "\nRe-enter new password:"; my($check_new_password); $check_new_password=; chop($check_new_password); die "\nThey don't match; try again.\n" unless $check_new_password eq $new_password; $new_gecos=''; $new_shell=''; } print "\n"; system '/bin/stty', 'echo'; socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; connect(SOCK, sockaddr_un($fs_passwdd_socket)) or die "connect: $!"; print SOCK join("\n",$me,$old_password,$new_password,$new_gecos,$new_shell),"\n"; SOCK->flush; my($error); $error = ; chop $error; if ($error) { print "\nUpdate error: $error\n"; } else { print "\nUpdate sucessful.\n"; }