Import of revision 19971210+
[mspang/plceo1.git] / ceo
1 #!/opt/bin/perl
2 #
3 #
4 # Date                  Name                            Modification
5 # ----          ----                ------------
6 #                                   Version 3.0
7 # 94/11/20              Alex Brodsky            split off most code intoseperate files,
8 #                                                                       placed old audit trail into notes.txt
9 #                                                                       use this type of audit trail from now on.
10 # 94/12/07              Alex Brodsky            Modified for Lynx 2.3.6
11 # 95/01/01              Alex Brodsky            Set to new term, w95
12 # 96/04/22              Alex Brodsky            Split of the term dependent stuff into a 
13 #                                                                       seperate file called configure.pl
14 # 96/06/05              Nikita Borisov          Hacks for FreeBSD console
15 # 96/10/23              Nikita Borisov          Use dbmtie instead of fakedbm
16
17
18 # load in required modules
19 require 'pwnam.pl';
20 require '/u/ceo/ceo/lib_sys.pl';
21 require '/u/ceo/ceo/cashbox.pl';
22 require '/u/ceo/ceo/admin.pl';
23 require '/u/ceo/ceo/novelty.pl';
24 require '/u/ceo/ceo/Gopher.pl';
25 require '/u/ceo/ceo/member.pl';
26 require '/u/ceo/ceo/quota.pl';
27 require '/u/ceo/ceo/stats.pl';
28 require '/u/ceo/ceo/database.pl';
29 require '/u/ceo/ceo/misc.pl';
30 require '/u/ceo/ceo/main.pl';
31 require '/u/ceo/ceo/libfmt.pl';
32 require '/u/ceo/ceo/forms.pl';
33
34
35 sub Configure
36 {
37     $SIG{'INT'} = 'IGNORE';
38     $SIG{'QUIT'} = 'IGNORE';
39     $SIG{'TSTP'} = 'IGNORE';
40
41     ## Some useful variables
42     $SHELL = "/opt/bin/tcsh";
43     $EDITOR = "/u/ceo/bin/rvi";
44     $HOME = "/u/ceo";
45     $PAGER = "rless -MCqe";
46     $PAGER = "less -cw" if $ENV{'CALUM'} == 1;
47
48     ## Programs we use
49     $HOSTNAME = "/usr/ucb/hostname";
50
51     $ENV{'PATH'} = "/opt/bin:/bin:/usr/bin:/usr/ucb:/usr/openwin/bin:/u/ceo/bin";
52     $ENV{'SHELL'} = $SHELL;
53     $ENV{'EDITOR'} = $EDITOR;
54     $ENV{'VISUAL'} = $EDITOR;
55     $ENV{'PAGER'} = $PAGER;
56     $ENV{'PAGER'} = "more -pw" if $ENV{'CALUM'} == 1;
57     $ENV{'HOME'} = $HOME;
58     umask 007;
59
60     srand;
61
62     $term = $ENV{'TERM'};
63
64     ## Defaults
65     $cls = "\e[2J\e[H";
66     $beep = "\a";
67     $csclogo = $cls;
68     $sleeptime = 600;
69     $SIG{'ALRM'} = 'timeout';
70
71     ## The directory all the files are in
72     $CEODIR = "$HOME/ceo";
73     $CEOBIN = "$HOME/bin";
74
75     chdir $CEODIR;
76     $CSCDISKHOME = "/u/csc_disk";
77     $GOPHERDIR = "/opt/gopher/data/office_info";
78     $CEOBACKUPDIR = "$CEODIR/backup";
79     $QUOTATODO = "$CSCDISKHOME/records/to/do";
80     $QUOTATODOOLD = "$CSCDISKHOME/records/to/do.old";
81     $QUOTAINFO = "$CSCDISKHOME/.project";
82
83     ## This term and next and other term depndent stuff loaded from configure.pl
84         require '/u/ceo/ceo/configure.pl';
85
86     $CAPTERM = $TERM;
87     $CAPTERM =~ tr/a-z/A-Z/;
88
89     ## List of people allowed to start ceo and use cash-box menu items
90     $OFFICESTAFF = "$HOME/OSlist";
91
92     ## The filenames
93     $MEMDB = "$CEODIR/memdb.new";
94     $QUOTADB = "$CEODIR/quotadb";
95     $LIBDB = "$CEODIR/libdb";
96     $LIBRARYLOG = "$CEODIR/librarylog.$TERM";
97     $CASHLOG = "$CEODIR/cashlog.$TERM";
98     $QUOTALOG = "$CEODIR/quotalog.$TERM";
99 # Log W96 special deals
100         $QUOTASPCLLOG = "$CEODIR/quotaspecial.$TERM";
101         if ($NEXTTERMQUOTA) {
102                 $QUOTASPCLLOG = "$CEODIR/quotaspecial.$NEXTTERM";
103         }
104     $NEXTQUOTALOG = "$CEODIR/quotalog.$NEXTTERM";
105     $NOVELTYLOG = "$CEODIR/noveltylog.$TERM";
106         $USERDIR = "/opt/local/admin/data/ceo";
107         $USERLOG = "$USERDIR/accountlog.";
108         $USERLOG .= $NEXTTERMMEMBER ? $NEXTTERM : $TERM;
109         $USERTODO = "$USERDIR/todo";
110         $USERTODOOLD = "$USERDIR/todo.old";
111     $editfile = "_editscreen";
112
113         ## The restrictions for the public lynx
114         $LYNX_RESTRICTIONS = "bookmark,bookmark_exec,disk_save,download,editor,".
115                                                  "exec,exec_frozen,inside_news,inside_rlogin,".
116                                                  "inside_telnet,news_post,option_save,outside_ftp,".
117                                                  "outside_news,outside_rlogin,outside_telnet,".
118                                                  "print,shell,suspend";
119     ## The initial page for the public lynx to start with
120         $LYNX_STARTPAGE = "http://www.csclub.uwaterloo.ca/u/offman/";
121
122     ## Costs
123     $MEMBERFEE = '2.00';
124     $COSTPERMEG = 1.00;
125         $COSTPERNUMMEG = '15.00';
126         $MEGNUMSPECIAL = 20;
127     $ADMINCHARGE = 0;
128     $NOADMINIFOVER = 0;   # Waive the admin fee if more than this is bought
129                           # at a time (0 means always charge admin fee)
130
131     system "echo `setterm` | $SHELL -t";
132
133     ## Figure out how many lines the terminal has
134     require 'sys/termios.ph';
135     $winsize_t = 'SSSS';
136     if(ioctl(STDIN, &TIOCGWINSZ, $winsize)) {
137         ($ROWS, $COLS, $XPIXELS, $YPIXELS) = unpack($winsize_t, $winsize);
138     } else {
139         $ROWS = 24;
140     }
141
142     if ($term eq "vt240")
143     {
144         print "\005";
145         <STDIN>;
146     }
147     elsif ($term eq "xterm")
148     {
149         #print "\e]51;\a";
150         #<STDIN>;
151     }
152
153         if ($term eq "vt240")
154         {
155         $csclogo = <<EOLOGO;
156 \eP1pS(E)P[120,60]V[]C(A-240)[180,60]P[60,60]C(A-300)[120,60]P[180,60]V[]C(A-240)[120,60]P[240,60]C(A-300)[180,60]\e\\\e[7H
157 EOLOGO
158         }
159         else
160         {
161                 $csclogo = $cls . <<'EOLOGO';
162    oo$$$$$ooo    o$$$$$oo$$$$$oo
163  o$$""  $$$"  o$$""  $$$$$$  ""$$o    C O M P U T E R
164 o$$    $$"    $$"   o$"  "$$    $$o
165 $$     $$    $$o    $$    $$o    $$   S C I E N C E
166 $$o   "$$    $$    o$$    $$     $$
167  $$o   "$o  $$"   o$$    o$$   o$$"   C L U B
168   "$$ooo$$$$$$ooo$$"   $$$$ooo$$$
169 EOLOGO
170         }
171
172     print $csclogo;
173 }
174
175 sub Login
176 {
177
178 ## There is no REMOTEUSER on calum so we always start ceo
179 ##    unless ($ENV{'REMOTEUSER'} eq ":bogus:" || $ENV{'HADSHELL'} == 1)
180 ##    {
181 ##        $ENV{'HADSHELL'} = 1;
182 ##        $SIG{'INT'} = 'DEFAULT';
183 ##        $SIG{'QUIT'} = 'DEFAULT';
184 ##        $SIG{'TSTP'} = 'DEFAULT';
185 ##        chdir $HOME;
186 ##        exec "$SHELL -c '$ARGV[1]'" if ($ARGV[0] eq "-c");
187 ##        exec $SHELL;
188 ##    }
189         if ($term =~ /ansi/) {
190                 $ENV{'TERM'} = "cons25";
191                 $term = "cons25";
192         }
193
194     system "echo `resize` | $SHELL -t" unless ($term =~ /cons/); 
195     system "stty echoprt echoctl erase \\^H";
196         system "stty rows 25" if ($term =~ /cons/);
197         print "My terminal is $term\n";
198
199     $SIG{'INT'} = 'IGNORE';
200     $SIG{'QUIT'} = 'IGNORE';
201     $SIG{'TSTP'} = 'IGNORE';
202
203     &Unsecure;
204     unless ($ENV{'CALUM'} == 1)
205     {
206     if(open(OS, $OFFICESTAFF))
207     {
208         $oslist = "";
209         while(<OS>)
210         {
211             $oslist .= $_;
212         }
213         close(OS);
214     }
215     else
216     {
217         $oslist = "0";
218     }
219     @oslist = split(/\D+/,$oslist);
220     print "Enter your CSC member number: ";
221     $cscmem = <STDIN>;
222     $cscmem =~ s/\D//g;
223     print "Enter your CSC password: ";
224     $cscpass = &GetPass;
225     $match = grep(/^$cscmem$/,@oslist);
226     unless (($match || $cscmem == 0) && $cscmem =~ /\d/)
227     {
228         print "Access denied.\n";
229         exit(42);
230     }
231     if (eval { dbmtie($MEMDB,\%MEM); })
232     {
233         unless (defined $MEM{$cscmem})
234         {
235             print "Access denied.\n";
236             exit(42);
237         }
238         $pw = (split(/;/,$MEM{$cscmem}))[5];
239                 dbmuntie(\%MEM);
240     }
241     else
242     {
243         print "Unable to read the members database.\n";
244         $pw = "CDa7jhHr2dXvY";
245     }
246     if ($pw eq "")
247     {
248         print "You cannot gain access with a blank password.\n";
249         print "Access denied.\n";
250         exit(42);
251     }
252     if (crypt($cscpass,$pw) ne $pw)
253     {
254         print "Access denied.\n";
255         exit(42);
256     }
257     if ($cscmem == 0)
258     {
259         $ENV{'CALUM'} = 1;
260         unless ($ENV{'HADSHELL'} == 1)
261         {
262             $SIG{'INT'} = 'DEFAULT';
263             $SIG{'QUIT'} = 'DEFAULT';
264             $SIG{'TSTP'} = 'DEFAULT';
265             chdir $HOME;
266             exec $SHELL;
267         }
268     }
269     }
270 }
271
272 &Configure;
273
274 if ($ARGV[0] ne "parent")
275 {
276     &Login;
277 }
278
279 $progname = $0;
280 $0 = "CSC Electronic Office";
281
282 if ($child = fork)
283 {
284     waitpid($child, 0);
285     exit if ($?>>8 == 42);
286     exec "$progname parent";
287 }
288
289 $0 .= " child";
290
291 &eventloop;
292