Import of revision 19971210+
[mspang/plceo1.git] / admin.pl
1 #
2 # Date                  Name                            Modification
3 # ----          ----                ------------
4 # 94/11/20              Alex Brodsky            Split off from main ceo file
5 # 94/12/10      Zygo Blaxell        Added 'will not share acct'
6 #                                   to CEO acct request message
7 # 95/08/08              Nikita Borisov      Added show member info option
8 # 96/09/17              Nikita Borisov      Updated user agreement date
9 # 96/10/23              Nikita Borisov          Use dbmtie instead of fakedbm
10 #
11
12
13
14 sub adminmenu
15 {
16     local($menu) = <<EOM;
17
18 Choose an option:
19   (P)assword change
20   Member (I)nfo change
21   S(H)ow Member Info
22   (L)ibrary log (NOT the outstanding books)
23   (S)ync gopher entries
24   (R)eset ceo
25   (A)ccount request
26   (M)ain menu
27
28 (P,I,L,S,R,M): 
29 EOM
30     @opts=('pdopwchange','idoupdatemember', 'hdomeminfoshow', 'ldoliblog',
31             'sdosyncgopher','rdoreset','adoaccount','mmainmenu');
32     $choice = &domenu($menu,@opts);
33     return $choice;
34 }
35
36 sub doaccount
37 {
38     local($memnum,$template,$forterm,$match);
39         local($init_passwd,$gcos,$username,$date,$thepw);
40     print "Enter CSC member number: ";
41     chop($memnum=<STDIN>);
42     $memnum =~ s/\D//g;
43     if ($memnum =~ /^\s*$/)
44     {
45         print "\n${beep}No member number supplied - aborting.\n";
46         return;
47     }
48
49     ## Get the info on this member
50     eval { dbmtie($MEMDB,\%MEM) } || do
51     {
52         print "\n${beep}Unable to open member database: $!\n";
53         return;
54     };
55     unless (defined $MEM{$memnum})
56     {
57         print "\n${beep}No such member number is on record - aborting\n";
58         dbmuntie(\%MEM);
59         return;
60     }
61         $forterm = $NEXTTERMMEMBER ? $NEXTTERM : $TERM;
62     $match = grep(/^$forterm/,split(/,/,(split(/;/,$MEM{$memnum}))[7]));
63     unless ($match)
64     {
65         print "\n${beep}This member has not paid for the current term.\n";
66         dbmuntie(\%MEM);
67         return;
68     }
69     $template = $MEM{$memnum};
70         $thepw = (split(/;/,$template))[5];
71     dbmuntie(\%MEM);
72
73         ## Check the password
74     if ($thepw ne "" && $ENV{'CALUM'} != 1)
75     {
76         print "Enter your CSC password: ";
77         if (crypt(&GetPass, $thepw) ne $thepw)
78         {
79             print "\n${beep}Incorrect password - aborting\n";
80             return;
81         }
82     }
83
84         print <<EOM;
85
86 You are about to request on account on calum.  You must agree to
87 the following:
88
89 o I am a member of the University of Waterloo community.
90
91 o I am a member of the University of Waterloo Computer Science Club.
92
93 o I have read, have signed, and will adhere to the CSC User Agreement
94   of 15 February, 1995
95
96 o I will not share my CSC account with anyone for any reason.
97
98 To agree to these terms, answer "yes" below.
99
100 EOM
101         print "I agree to the above terms: ";
102         $yes = <STDIN>;
103         if ($yes ne "yes\n")
104         {
105                 print "${beep}Aborting.\n\n";
106                 return;
107         }
108
109         ## Tell them about the password
110
111         print "\nYour initial password will be your CSC password, and you will\n";
112         print "be required to change it the first time you log in.\n\n";
113
114         $init_passwd = (split(/;/,$template))[5];
115
116         if ($init_passwd eq "")
117         {
118                 print "${beep}You do not have a CSC password.  Please choose one.\n\n";
119                 print "Aborting.\n\n";
120                 return;
121         }
122
123         $gcos = (split(/;/,$template))[0];
124
125         ## Okay, here's the hard part:  figure out an account name for them
126
127         ## Start with one they gave, if possible
128         $username = (split(/;/,$template))[4];
129
130         ## If it's not obvious, throw it away
131         $username = "" if $username =~ /\@/;
132
133         if ($username eq "")
134         {
135                 print "\n${beep}There is an error with the username you specified. \nEither you left it blank, or you specified a machine. \nChange this before re-applying\n\n";
136                 return;
137         }
138
139         ## Truncate the username
140         $usernane =~ y/A-Z/a-z/;
141         $username =~ s/[^a-z0-9-]//g;
142         $username =~ s/(^........).*/$1/;
143
144         print "\nYour userid will be $username.\n\n";
145
146     ## Make the gcos safe
147         $gcos =~ s/:/;/g;
148         $gcos =~ s/\s*$//;
149         $gcos =~ s/^\s*//;
150         $gcos =~ s/\W/\\$&/g;
151
152         ## Write the user log
153         open(LOG, ">>$USERLOG") || do
154         {
155         print "\n${beep}Unable to open user log: $!\n";
156                 print "Aborting.\n";
157         return;
158     };
159         chop($date = `date`);
160         print LOG "$date: $username $init_passwd $gcos\n";
161         close(LOG);
162
163         ## Write the todo file
164         open(TODO, ">>$USERTODO") || do
165         {
166                 print "\n${beep}Unable to open user todo file: $!\n";
167                 print "Aborting.\n";
168                 return;
169         };
170         print TODO "/opt/local/admin/bin/newuser $username $init_passwd $gcos\n";
171         close(TODO);
172
173 }
174
175 sub dopwchange
176 {
177     local($memnum,$thename,$thepw,$pw1,$pw2);
178     print "Enter CSC member number: ";
179     chop($memnum=<STDIN>);
180     $memnum =~ s/\D//g;
181     if ($memnum =~ /^\s*$/)
182     {
183         print "\n${beep}No member number supplied - aborting.\n";
184         return;
185     }
186
187     ## Get the info on this member
188     eval { dbmtie($MEMDB,\%MEM) } || do
189     {
190         print "\n${beep}Unable to open member database: $!\n";
191         return;
192     };
193     unless (defined $MEM{$memnum})
194     {
195         print "\n${beep}No such member number is on record - aborting\n";
196         dbmuntie(\%MEM);
197         return;
198     }
199     ($thename, $thepw) = (split(/;/,$MEM{$memnum}))[0,5];
200     dbmuntie(\%MEM);
201
202     print "Name: $thename\n";
203     if ($thepw ne "" && ($ENV{'CALUM'} != 1 || $memnum==0))
204     {
205         print "Enter old password: ";
206         if (crypt(&GetPass, $thepw) ne $thepw)
207         {
208             print "\n${beep}Incorrect password - aborting\n";
209             return;
210         }
211     }
212
213     while(1)
214     {
215         print "Enter new password: ";
216         $pw1 = &GetPass;
217         last if $pw1 eq "";
218         print "Enter it again: ";
219         $pw2 = &GetPass;
220         last if ($pw1 eq $pw2);
221         print "\n${beep}No match.\n\n";
222         return if $ENV{'CALUM'} == 1 && $memnum != 0;
223     }
224     if ($pw1 ne "")
225     {
226         $salt = "";
227         $salt .= sprintf("%c", int(rand(26))+ord('A'));
228         $salt .= sprintf("%c", int(rand(26))+ord('A'));
229         $pw1 = crypt($pw1,$salt);
230     } 
231     elsif ($memnum == 0)
232     {
233         print "\n${beep}You cannot make Calum's password empty!\n";
234         return;
235     }
236
237     eval { dbmtie($MEMDB,\%MEM) } || do
238     {
239         print "\n${beep}Unable to open member database: $!\n";
240         return;
241     };
242     @fields = split(/;/,$MEM{$memnum});
243     $fields[5] = $pw1;
244     $MEM{$memnum} = join(';',@fields);
245     dbmuntie(\%MEM);
246     &Backup("$MEMDB.dir");
247     &Backup("$MEMDB.pag");
248
249     print "\nChange completed.\n";
250 }
251
252 sub doliblog
253 {
254     &DisplayLibLog;
255 }
256
257 sub dosyncgopher
258 {
259     local($fn);
260     print "Syncing members file...\n";
261     &Gopher_Members;
262     print "Syncing quota log...\n";
263     &Gopher_Quota;
264     print "Syncing outstanding books file...\n";
265     &Gopher_Outstanding;
266     foreach $fn ($LIBRARYLOG, $CASHLOG, $NOVELTYLOG, $progname,
267                     $NEXTTERMQUOTA ? $NEXTQUOTALOG : $QUOTALOG)
268     {
269         print "Backing up $fn...\n";
270         &Backup($fn);
271     }
272     foreach $fn ($MEMDB, $QUOTADB, $LIBDB)
273     {
274         foreach $fe (".dir", ".pag")
275         {
276             print "Backing up $fn$fe...\n";
277             &Backup($fn.$fe);
278         }
279     }
280 }
281
282 sub doreset
283 {
284     exit(0);
285 }
286
287 sub doupdatemember
288 {
289     print "\nEnter member number: ";
290     local($memnum);
291     chop($memnum = <STDIN>);
292     $memnum =~ s/\D//g;
293     if ($memnum == 0)
294     {
295         print "\n${beep}No number entered - aborting.\n\n";
296         return;
297     }
298     eval { dbmtie($MEMDB,\%MEM) } || do
299     {
300         print "\n${beep}Unable to open members database: $!\n";
301         return;
302     };
303     unless (defined $MEM{$memnum})
304     {
305         print "\n${beep}There is no member number $memnum on record - aborting.\n\n";
306         return;
307     }
308     local($template) = $MEM{$memnum};
309     dbmuntie(\%MEM);
310
311     local($filled) = &memupdate($template);
312     if ($filled eq "")
313     {
314         return;
315     }
316
317     eval { dbmtie($MEMDB,\%MEM) } || do
318     {
319         print "\n${beep}Unable to open members database: $!\n";
320         return;
321     };
322     $MEM{$memnum} = $filled;
323     dbmuntie(\%MEM);
324     &Backup("$MEMDB.dir");
325     &Backup("$MEMDB.pag");
326     &Gopher_Members;
327 }
328
329 sub domeminfoshow
330 {
331     print "\nEnter member number: ";
332     local($memnum);
333     chop($memnum = <STDIN>);
334     $memnum =~ s/\D//g;
335     if ($memnum == 0)
336     {
337         print "\n${beep}No number entered - aborting.\n\n";
338         return;
339     }
340     eval { dbmtie($MEMDB,\%MEM) } || do
341     {
342         print "\n${beep}Unable to open members database: $!\n";
343         return;
344     };
345     unless (defined $MEM{$memnum})
346     {
347         print "\n${beep}There is no member number $memnum on record - aborting.\n\n";
348         return;
349     }
350     local($template) = $MEM{$memnum};
351     dbmuntie(\%MEM);
352
353         @tempfields = split(/;/,$template);
354
355     local($t5,$t7);
356     $t5 = $tempfields[5];
357     $t7 = $tempfields[7];
358         open(MEMNFO, ">$editfile");
359         print MEMNFO <<EOT;
360 Member Number   : $memnum
361 Name            : $tempfields[0]
362 Student ID      : $tempfields[1]
363 Year and Program: $tempfields[2]
364 Phone number    : $tempfields[3]
365
366 Userid          : $tempfields[4]
367
368 Currently a member for $t7
369 EOT
370         close(MEMNFO);
371     &MORE;
372 }
373
374 1;
375