Initial revision
authornborisov <nborisov>
Fri, 27 Dec 1996 13:17:15 +0000 (13:17 +0000)
committernborisov <nborisov>
Fri, 27 Dec 1996 13:17:15 +0000 (13:17 +0000)
reset-ceo-passwd [new file with mode: 0755]

diff --git a/reset-ceo-passwd b/reset-ceo-passwd
new file mode 100755 (executable)
index 0000000..ebe153d
--- /dev/null
@@ -0,0 +1,138 @@
+#!/usr/bin/perl
+
+require '/u/ceo/ceo/database.pl';
+
+$HOME = "/u/ceo";
+$CEODIR = "$HOME/ceo";
+$MEMBERDB = "$CEODIR/memdb.new";
+
+chdir $CEODIR || die $!;
+
+$sockaddr = 'S n a4 x8';
+$AF_INET = 2;
+$SOCK_STREAM = 2;
+$| = 1;
+
+## Find out who's connected to us
+$remotesock = getpeername(STDIN);
+die $! unless defined $remotesock;
+($remotefamily, $remoteport, $remoteaddr) = unpack($sockaddr, $remotesock);
+
+## And who are we?
+$thissock = getsockname(STDIN);
+die $! unless defined $thissock;
+$thisport = (unpack($sockaddr, $thissock))[1];
+
+## Are they allowed to connect to us?
+@ipaddr = unpack('CCCC', $remoteaddr);
+exit unless ($ipaddr[0] == 129 && $ipaddr[1] == 97);
+# FIXME: this is a poor check.  By far not all machines in the
+# 129.97 cluster can be trusted with ident.  
+
+## They're OK.  Show the header.
+print <<EOM;
+
+*** CEO password reset ***
+This port is used to reset your CEO password.
+EOM
+print "Are you sure you want to continue? ";
+$reply = <STDIN>;
+exit unless $reply =~ /^[yY]/;
+
+$proto = (getprotobyname('tcp'))[2];
+$port = (getservbyname('ident', 'tcp'))[2];
+$addr = (gethostbyname($hostname))[4];
+
+$ident = pack($sockaddr, $AF_INET, $port, $remoteaddr);
+
+## Make the ident socket
+socket(IS, $AF_INET, $SOCK_STREAM, $proto) || die $!;
+connect(IS, $ident) || do
+{
+       print <<EOM;
+
+I am unable to connect to the ident server on your host, and so I cannot
+determine your userid.  Please try again from a host running ident
+(almost all MFCF machines included).  If you cannot, please email ceo\@csclub.
+EOM
+       exit;
+};
+select(IS); $| = 1; select(STDOUT);
+
+## Ask who that is
+print IS "$remoteport,$thisport\n";
+$reply = <IS>;
+close(IS);
+
+# this pattern doesn't strictly comply with RFC1413, mainly because
+# certain servers, including calum don't comply either.
+# (if it did comply, the last \s* would not be there, since the
+# protocol allows for spaces in userids).  It's functional anyway
+
+if ($reply =~ /:\s*UNIX\s*:\s*(\S{1,8})/)
+{
+       $username = $1;
+}
+else
+{
+       print <<EOM;
+
+I am unable to determine your userid.  Your ident server may not be
+functioning properly.  Please contact your sysadmin for help.  To reset
+your password, email ceo\@csclub.
+EOM
+       exit;
+}
+
+## Ask for the member number
+print "\nPlease enter your member number: ";
+$reply = <STDIN>;
+($memnum) = $reply =~ /^(\d+)/;
+if ($memnum == 0)
+{
+       print <<EOM;
+
+No member number entered - aborting.
+EOM
+       exit;
+}
+
+## Verify the user
+#dbmopen(MEM, $MEMBERDB, 0600) || do
+#eval { %MEM=&fakedbmopen($MEMBERDB) } || do
+eval { dbmtie($MEMBERDB,\%MEM); } || do
+{
+       print <<EOM;
+
+AAAHHHHH!!!!!  I can't open the member database!!!
+EOM
+       exit;
+};
+
+@fields = split(/;/,$MEM{$memnum});
+$memuser = $fields[4];
+$memuser =~ s/@.*//;
+$memuser =~ y/A-Z/a-z/;
+$memuser =~ s/(.{8}).*/$1/;
+if ($memuser ne $username)
+{
+       print <<EOM;
+
+That member number does not match your username.
+
+EOM
+       exit;
+}
+
+## Reset the password
+$fields[5] = '';
+
+$MEM{$memnum} = join(';', @fields);
+
+dbmuntie(\%MEM);
+
+print <<EOM;
+
+Your password has been reset.  Please go to the CSC and choose another.
+
+EOM