Import of revision 19971210+
[mspang/plceo1.git] / reset-ceo-passwd
1 #!/usr/bin/perl
2
3 require '/u/ceo/ceo/database.pl';
4
5 $HOME = "/u/ceo";
6 $CEODIR = "$HOME/ceo";
7 $MEMBERDB = "$CEODIR/memdb.new";
8
9 chdir $CEODIR || die $!;
10
11 $sockaddr = 'S n a4 x8';
12 $AF_INET = 2;
13 $SOCK_STREAM = 2;
14 $| = 1;
15
16 ## Find out who's connected to us
17 $remotesock = getpeername(STDIN);
18 die $! unless defined $remotesock;
19 ($remotefamily, $remoteport, $remoteaddr) = unpack($sockaddr, $remotesock);
20
21 ## And who are we?
22 $thissock = getsockname(STDIN);
23 die $! unless defined $thissock;
24 $thisport = (unpack($sockaddr, $thissock))[1];
25
26 ## Are they allowed to connect to us?
27 @ipaddr = unpack('CCCC', $remoteaddr);
28 exit unless ($ipaddr[0] == 129 && $ipaddr[1] == 97);
29 # FIXME: this is a poor check.  By far not all machines in the
30 # 129.97 cluster can be trusted with ident.  
31
32 ## They're OK.  Show the header.
33 print <<EOM;
34
35 *** CEO password reset ***
36 This port is used to reset your CEO password.
37 EOM
38 print "Are you sure you want to continue? ";
39 $reply = <STDIN>;
40 exit unless $reply =~ /^[yY]/;
41
42 $proto = (getprotobyname('tcp'))[2];
43 $port = (getservbyname('ident', 'tcp'))[2];
44 $addr = (gethostbyname($hostname))[4];
45
46 $ident = pack($sockaddr, $AF_INET, $port, $remoteaddr);
47
48 ## Make the ident socket
49 socket(IS, $AF_INET, $SOCK_STREAM, $proto) || die $!;
50 connect(IS, $ident) || do
51 {
52         print <<EOM;
53
54 I am unable to connect to the ident server on your host, and so I cannot
55 determine your userid.  Please try again from a host running ident
56 (almost all MFCF machines included).  If you cannot, please email ceo\@csclub.
57 EOM
58         exit;
59 };
60 select(IS); $| = 1; select(STDOUT);
61
62 ## Ask who that is
63 print IS "$remoteport,$thisport\n";
64 $reply = <IS>;
65 close(IS);
66
67 # this pattern doesn't strictly comply with RFC1413, mainly because
68 # certain servers, including calum don't comply either.
69 # (if it did comply, the last \s* would not be there, since the
70 # protocol allows for spaces in userids).  It's functional anyway
71
72 if ($reply =~ /:\s*UNIX\s*:\s*(\S{1,8})/)
73 {
74         $username = $1;
75 }
76 else
77 {
78         print <<EOM;
79
80 I am unable to determine your userid.  Your ident server may not be
81 functioning properly.  Please contact your sysadmin for help.  To reset
82 your password, email ceo\@csclub.
83 EOM
84         exit;
85 }
86
87 ## Ask for the member number
88 print "\nPlease enter your member number: ";
89 $reply = <STDIN>;
90 ($memnum) = $reply =~ /^(\d+)/;
91 if ($memnum == 0)
92 {
93         print <<EOM;
94
95 No member number entered - aborting.
96 EOM
97         exit;
98 }
99
100 ## Verify the user
101 #dbmopen(MEM, $MEMBERDB, 0600) || do
102 #eval { %MEM=&fakedbmopen($MEMBERDB) } || do
103 eval { dbmtie($MEMBERDB,\%MEM); } || do
104 {
105         print <<EOM;
106
107 AAAHHHHH!!!!!  I can't open the member database!!!
108 EOM
109         exit;
110 };
111
112 @fields = split(/;/,$MEM{$memnum});
113 $memuser = $fields[4];
114 $memuser =~ s/@.*//;
115 $memuser =~ y/A-Z/a-z/;
116 $memuser =~ s/(.{8}).*/$1/;
117 if ($memuser ne $username)
118 {
119         print <<EOM;
120
121 That member number does not match your username.
122
123 EOM
124         exit;
125 }
126
127 ## Reset the password
128 $fields[5] = '';
129
130 $MEM{$memnum} = join(';', @fields);
131
132 dbmuntie(\%MEM);
133
134 print <<EOM;
135
136 Your password has been reset.  Please go to the CSC and choose another.
137
138 EOM