{$A+,B+,E+,F+,I+,L+,N-,O+,R-,S+,V-} unit common1; interface uses crt, dos, myio, tmpcom; function checkpw:boolean; procedure newcomptables; procedure cline(var s:string; dd:string); procedure pausescr; procedure wait(b:boolean); (*procedure fix_window;*) procedure inittrapfile; procedure chatfile(b:boolean); procedure local_input1(var i:string; ml:integer; tf:boolean); procedure local_input(var i:string; ml:integer); procedure local_inputl(var i:string; ml:integer); procedure local_onek(var c:char; ch:string); function chinkey:char; procedure inli1(var s:string); procedure chat; procedure sysopshell(takeuser:boolean); procedure globat(i:integer); procedure exiterrorlevel; procedure showsysfunc; procedure readinzscan; procedure savezscanr; procedure redrawforansi; implementation uses common, common2, common3; var chcfilter:array[1..2] of cfilterrec; chcfilteron:boolean; function checkpw:boolean; var s:string[20]; savsl,savdsl:integer; begin checkpw:=TRUE; prompt('SysOp Password: '); savsl:=thisuser.sl; savdsl:=thisuser.dsl; thisuser.sl:=realsl; thisuser.dsl:=realdsl; echo:=((aacs(systat.seepw)) and (not systat.localsec)); thisuser.sl:=savsl; thisuser.dsl:=savdsl; input(s,20); echo:=TRUE; if (s<>systat.sysoppw) then begin checkpw:=FALSE; if (incom) and (s<>'') then sysoplog('*** Wrong SysOp Password = '+s+' ***'); end; end; procedure newcomptables; var savuboard:ulrec; savboard:boardrec; savreaduboard,savreadboard,i,j:integer; bfo,ulfo,done:boolean; begin for i:=0 to 1 do for j:=0 to maxuboards do ccuboards[i][j]:=j; for i:=0 to 1 do for j:=1 to maxboards do ccboards[i][j]:=j; if (systat.compressbases) then begin savuboard:=memuboard; savreaduboard:=readuboard; savboard:=memboard; savreadboard:=readboard; bfo:=(filerec(bf).mode<>fmclosed); ulfo:=(filerec(ulf).mode<>fmclosed); if (not bfo) then reset(bf); if (not ulfo) then reset(ulf); seek(ulf,0); i:=0; j:=0; done:=FALSE; while ((not done) and (i<=maxuboards)) do begin {$I-} read(ulf,memuboard); {$I+} done:=(ioresult<>0); if (not done) then if (i>maxulb) then begin ccuboards[0][i]:=maxuboards+1; ccuboards[1][i]:=maxuboards+1; end else if (aacs(memuboard.acs)) then begin ccuboards[1][i]:=j; ccuboards[0][j]:=i; inc(j); end; inc(i); end; { seek(ulf,loaduboard); read(ulf,memuboard);} if (maxulb0); if (not done) then if (i>numboards) then begin ccboards[0][i]:=maxboards+1; ccboards[1][i]:=maxboards+1; end else if (mbaseac(i)) then begin ccboards[1][i]:=j; ccboards[0][j]:=i; inc(j); end; inc(i); end; { seek(bf,loadboard); read(bf,memboard);} if (numboardssystat.timeoutbell*60) and (c=#0)) then begin outkey(^G); delay(100); outkey(^G); end; if ((systat.timeout<>-1) and (dt2r(ddt)>systat.timeout*60)) then begin nl; nl; printf('timedout'); if (nofile) then print('Time out has occurred. Log off time was at '+time+'.'); nl; nl; hangup:=TRUE; sysoplog(#3#7+'!*!*! Time-out at '+time+' !*!*!'); exit; end; until ((c<>#0) or (hangup)); *) if ((okansi) and (not hangup)) then begin s:=cstr(x); if (outcom) then begin if (okavatar) then pr1(^Y^H+chr(x)+^Y+' '+chr(x)+^Y^H+chr(x)) else begin pr1(#27+'['+s+'D'); for i:=1 to x do pr1(' '); pr1(#27+'['+s+'D'); end; end; if (wantout) then begin for i:=1 to x do write(^H); for i:=1 to x do write(' '); for i:=1 to x do write(^H); end; end else begin for i:=1 to x do outkey(^H); for i:=1 to x do outkey(' '); for i:=1 to x do outkey(^H); if (trapping) then begin for i:=1 to x do write(trapfile,^H); for i:=1 to x do write(trapfile,' '); for i:=1 to x do write(trapfile,^H); end; end; if (not hangup) then setc(bb); end; procedure wait(b:boolean); const lastc:byte=0; var c,len:integer; begin if (b) then begin lastc:=curco; sprompt(fstring.wait) end else begin len:=lenn(fstring.wait); for c:=1 to len do prompt(^H); for c:=1 to len do prompt(' '); for c:=1 to len do prompt(^H); setc(lastc); end; end; (*procedure fix_window; var wind:windowrec; x,y,i,z:integer; begin if (useron) then begin x:=wherex; y:=wherey; if (not systat.istopwindow) then begin if (systat.bwindow) then begin window(1,1,80,25); gotoxy(1,25); if (y>=22) then for i:=1 to 4-(25-y) do writeln; if (y>=22) then dec(y,4-(25-y)); end; gotoxy(x,y); end else begin if (systat.bwindow) then begin window(1,1,80,25); savescreen(wind,1,1,80,y); if (y>=22) then z:=25-y else z:=5; if (z>=2) then movewindow(wind,1,z); if (z<=4) then y:=(y-z)+1; if (y>=22) then y:=21; if (y<=0) then y:=1; gotoxy(x,y); end; end; if (systat.bwindow) then topscr; end; end;*) procedure inittrapfile; begin if (systat.globaltrap) or (thisuser.trapactivity) then trapping:=TRUE else trapping:=FALSE; if (trapping) then begin if (thisuser.trapseperate) then assign(trapfile,systat.trappath+'trap'+cstr(usernum)+'.msg') else assign(trapfile,systat.trappath+'trap.msg'); {$I-} append(trapfile); {$I+} if (ioresult<>0) then begin rewrite(trapfile); writeln(trapfile); end; writeln(trapfile,'***** TeleGard-X User Audit - '+nam+' on at '+date+' '+time+' *****'); end; end; procedure chatfile(b:boolean); var bf:file of byte; s:string[91]; trimmedfile:string; cr:boolean; i, j: integer; begin s:='chat'; if (thisuser.chatseperate) then s:=s+cstr(usernum); s:=systat.trappath+s+'.msg'; if (not b) then begin if (cfo) then begin commandline('Chat Capture OFF (Recorded in "'+s+'")'); cfo:=FALSE; if (textrec(cf).mode<>fmclosed) then close(cf); end; end else begin cfo:=TRUE; if (textrec(cf).mode=fmoutput) then close(cf); assign(cf,s); assign(bf,s); cr:=FALSE; {$I-} reset(cf); {$I+} if (ioresult<>0) then rewrite(cf) else begin close(cf); append(cf); end; writeln(cf,^M^J^M^J+dat+^M^J+'Recorded with user: '+nam+^M^J+'------------------------------------'+^M^J); commandline('Chat Capture ON ("'+s+'")'); end; end; procedure local_input1(var i:string; ml:integer; tf:boolean); var r:real; cp:integer; cc:char; begin cp:=1; repeat cc:=readkey; if (not tf) then cc:=upcase(cc); if (cc in [#32..#255]) then if (cp<=ml) then begin i[cp]:=cc; inc(cp); write(cc); end else else case cc of ^H:if (cp>1) then begin cc:=^H; write(^H' '^H); dec(cp); end; ^U,^X:while (cp<>1) do begin dec(cp); write(^H' '^H); end; end; until (cc in [^M,^N]); i[0]:=chr(cp-1); if (wherey<=hi(windmax)-hi(windmin)) then writeln; end; procedure local_input(var i:string; ml:integer); (* Input uppercase only *) begin local_input1(i,ml,FALSE); end; procedure local_inputl(var i:string; ml:integer); (* Input lower & upper case *) begin local_input1(i,ml,TRUE); end; procedure local_onek(var c:char; ch:string); (* 1 key input *) begin repeat c:=upcase(readkey) until (pos(c,ch)>0); writeln(c); end; function chinkey:char; var c:char; begin c:=#0; chinkey:=#0; if (keypressed) then begin c:=readkey; if (chcfilteron) then setc(chcfilter[1][ord(c)]) else if (not wcolor) then cl(systat.sysopcolor); wcolor:=TRUE; if (c=#0) then if (keypressed) then begin c:=readkey; skey1(c); if (c=#68) then c:=#1 else c:=#0; if (buf<>'') then begin c:=buf[1]; buf:=copy(buf,2,length(buf)-1); end; end; chinkey:=c; end else if ((not com_rx_empty) and (incom) and (not trm)) then begin c:=cinkey; if (chcfilteron) then setc(chcfilter[2][ord(c)]) else if (wcolor) then cl(systat.usercolor); wcolor:=FALSE; chinkey:=c; end; end; procedure inli1(var s:string); (* Input routine for chat *) var cv,cc,cp,g,i,j:integer; c,c1:char; begin cp:=1; s:=''; if (ll<>'') then begin if (chcfilteron) then begin if (wcolor) then j:=1 else j:=2; for i:=1 to length(ll) do begin setc(chcfilter[j][ord(ll[i])]); outkey(ll[i]); if (trapping) then write(trapfile,ll[i]); end; end else prompt(ll); s:=ll; ll:=''; cp:=length(s)+1; end; repeat getkey(c); checkhangup; case ord(c) of 32..255:if (cp<79) then begin s[cp]:=c; pap:=cp; inc(cp); outkey(c); if (trapping) then write(trapfile,c); end; 16:if okansi then begin getkey(c1); cl(ord(c1)-48); end; 27:if (cp<79) then begin s[cp]:=c; inc(cp); outkey(c); if (trapping) then write(trapfile,c); end; 8:if (cp>1) then begin dec(cp); pap:=cp; prompt(^H' '^H); end; 24:begin for cv:=1 to cp-1 do prompt(^H' '^H); cp:=1; pap:=0; end; 7:if (outcom) then sendcom1(^G); 23:if cp>1 then repeat dec(cp); pap:=cp; prompt(^H' '^H); until (cp=1) or (s[cp]=' '); 9:begin cv:=5-(cp mod 5); if (cp+cv<79) then for cc:=1 to cv do begin s[cp]:=' '; inc(cp); pap:=cp; prompt(' '); end; end; end; until ((c=^M) or (cp=79) or (hangup) or (not ch)); if (not ch) then begin c:=#13; ch:=FALSE; end; s[0]:=chr(cp-1); if (c<>^M) then begin cv:=cp-1; while (cv>0) and (s[cv]<>' ') and (s[cv]<>^H) do dec(cv); if (cv>(cp div 2)) and (cv<>cp-1) then begin ll:=copy(s,cv+1,cp-cv); for cc:=cp-2 downto cv do prompt(^H); for cc:=cp-2 downto cv do prompt(' '); s[0]:=chr(cv-1); end; end; if (wcolor) then j:=1 else j:=2; if ((chcfilteron) and ((chcfilter[j][32] and 112)<>0)) then begin setc(chcfilter[j][32]); if (okavatar) then pr1(^V+^G) else pr1(^['[K'); clreol; setc(7); nl; setc(chcfilter[j][32]); end else nl; end; procedure loadchcfilter(i:integer); var chcfilterf:file of cfilterrec; s,os:string; ps:string[67]; ns:string[8]; es:string[4]; begin os:=s; if (i=1) then s:=systat.chatcfilter1 else s:=systat.chatcfilter2; if (s='') then begin sysoplog(aonoff((i=1),'SysOp','User')+' chat-filter set to NULL string'); exit; end; fsplit(s,ps,ns,es); if (exist(systat.afilepath+ns+es)) then s:=systat.afilepath+ns+es else if (exist(systat.gfilepath+ns+es)) then s:=systat.gfilepath+ns+es; assign(chcfilterf,s); {$I-} reset(chcfilterf); {$I+} if (ioresult=0) then begin {$I-} read(chcfilterf,chcfilter[i]); {$I+} if (ioresult=0) then chcfilteron:=TRUE; close(chcfilterf); end else sysoplog('Missing chat color filter: "'+os+'"'); end; procedure chat; var chatstart,chatend,tchatted:datetimerec; s,xx:string; t1:real; i,savpap:integer; c:char; savecho,savprintingfile:boolean; begin nosound; getdatetime(chatstart); dosansion:=FALSE; savprintingfile:=printingfile; savpap:=pap; ch:=TRUE; chatcall:=FALSE; savecho:=echo; echo:=TRUE; if (systat.autochatopen) then chatfile(TRUE) else if (thisuser.chatauto) then chatfile(TRUE); nl; nl; thisuser.ac:=thisuser.ac-[alert]; printf('chatinit'); if (nofile) then begin sprompt(#3#5+fstring.engage); nl; nl; end; cl(systat.sysopcolor); wcolor:=TRUE; chcfilteron:=FALSE; if (okansi) then if ((systat.chatcfilter1<>'') or (systat.chatcfilter2<>'')) then begin loadchcfilter(1); if (chcfilteron) then loadchcfilter(2); end; if (chatr<>'') then begin commandline(chatr); print(' '); chatr:=''; end; repeat inli1(xx); if (xx[1]='/') then xx:=allcaps(xx); if (copy(xx,1,6)='/TYPE ') then begin s:=copy(xx,7,length(xx)); if (s<>'') then begin printfile(s); if (nofile) then print('*File not found*'); end; end else if (xx='/SHELL') and (thisuser.sl=255) then begin print('Shelling to DOS...'); sysopshell(TRUE) end else if (xx='/CC') then begin print(syn(dosansion)); end else if (xx='/C') then begin print(syn(mtcolors)); end else if ((xx='/HELP') or (xx='/?')) then begin nl; {rcg11242000 DOSism.} {sprint('^5/TYPE d:\path\filename.ext^3: Type a file');} sprint('^5/TYPE /path/filename.ext^3: Type a file'); sprint('^5/BYE^3: Hang up'); sprint('^5/CLS^3: Clear the screen'); sprint('^5/PAGE^3: Page the SysOp and User'); {rcg11242000 DOSism} { if (thisuser.sl=255) then sprint('^5/SHELL^3: Shell to DOS with user (255 SL ^5ONLY^3)'); } if (thisuser.sl=255) then sprint('^5/SHELL^3: Shell to operating system with user (255 SL ^5ONLY^3)'); sprint('^5/Q^3: Exit chat mode'); nl; end else if (xx='/CLS') then cls else if (xx='/PAGE') then begin for i:=650 to 700 do begin sound(i); delay(4); nosound; end; repeat dec(i); sound(i); delay(2); nosound; until (i=200); prompt(^G^G); end else if (xx='/ACS') then begin prt('ACS:'); inputl(s,20); if (aacs(s)) then print('You have access to that!') else print('You DO NOT have access to that.'); end else if (xx='/BYE') then begin print('Hanging up...'); hangup:=TRUE; end else if (xx='/Q') then begin t1:=timer; while (abs(t1-timer)<0.6) and (empty) do; if (empty) then begin ch:=FALSE; print('Chat Aborted...'); end; end; if (cfo) then writeln(cf,xx); until ((not ch) or (hangup)); printf('chatend'); if (nofile) then begin nl; sprint(#3#5+fstring.endchat); end; getdatetime(chatend); timediff(tchatted,chatstart,chatend); freetime:=freetime+dt2r(tchatted); tleft; s:='Chatted for '+longtim(tchatted); if (cfo) then begin s:=s+' -{ Recorded in CHAT'; if (thisuser.chatseperate) then s:=s+cstr(usernum); s:=s+'.MSG }-'; end; sysoplog(s); ch:=FALSE; echo:=savecho; if ((hangup) and (cfo)) then begin writeln(cf); writeln(cf,'NO CARRIER'); writeln(cf); writeln(cf,'>> Carrier lost ...'); writeln(cf); end; pap:=savpap; printingfile:=savprintingfile; commandline(''); if (cfo) then chatfile(FALSE); end; procedure sysopshell(takeuser:boolean); var wind:windowrec; opath:string; t:real; sx,sy,ret:integer; bb:byte; procedure dosc; var s:string; i:integer; begin s:=^M^J+#27+'[0m'; for i:=1 to length(s) do dosansi(s[i]); end; begin bb:=curco; getdir(0,opath); t:=timer; if (useron) and (incom) then begin nl; nl; sprompt(fstring.shelldos1); end; sx:=wherex; sy:=wherey; setwindow(wind,1,1,80,25,7,0,0); clrscr; tc(11); writeln('[> Type "EXIT" to return to Project Coyote.'); dosc; dosansion:=FALSE; if (not takeuser) then shelldos(FALSE,'',ret) else shelldos(FALSE,'remote.bat',ret); getdatetime(tim); if (useron) then com_flush_rx; if (not trm) then chdir(opath); clrscr; removewindow(wind); gotoxy(sx,sy); if (useron) then begin freetime:=freetime+timer-t; topscr; sdc; if (incom) then begin nl; sprint(fstring.shelldos2); end; end; setc(bb); end; procedure globat(i:integer); var wind:windowrec; s:string; t:real; xx,yy,z,ret:integer; begin xx:=wherex; yy:=wherey; z:=textattr; getdir(0,s); chdir(start_dir); savescreen(wind,1,1,80,25); t:=timer; shelldos(FALSE,'globat'+chr(i+48),ret); getdatetime(tim); com_flush_rx; freetime:=freetime+timer-t; removewindow(wind); chdir(s); if (useron) then topscr; gotoxy(xx,yy); textattr:=z; end; procedure exiterrorlevel; var wind:windowrec; s:string; xx,yy,z,ee:integer; c:char; re:boolean; begin savescreen(wind,1,1,80,25); xx:=wherex; yy:=wherey; z:=textattr; clrscr; writeln('[> Exit at ERRORLEVEL '+cstr(exiterrors)+', correct? '); writeln; write('[A]bort [Y]es [O]ther : '); repeat c:=upcase(readkey) until (c in ['A','Y','O',^M]); if (c<>^M) then write(c); writeln; ee:=-1; case c of 'O':begin writeln; write('Enter ERRORLEVEL (-1 to abort) : '); readln(s); if (s<>'') then ee:=value(s); end; 'Y':ee:=exiterrors; end; if (ee<>-1) then begin writeln; write('Generate a run-time error? [Yes] : '); repeat c:=upcase(readkey) until (c in ['Y','N',^M]); re:=(c<>'N'); end; removewindow(wind); if (useron) then topscr; gotoxy(xx,yy); textattr:=z; if (ee<>-1) then begin exiterrors:=ee; if (re) then runerror(0) else halt(ee); end; end; procedure showsysfunc; var imagef:file of windowrec; wind,swind:windowrec; xx,yy,z:integer; c:char; badd:boolean; begin assign(imagef,systat.gfilepath+'sysfunc.dat'); {$I-} reset(imagef); {$I+} if (ioresult<>0) then commandline('"'+systat.gfilepath+'SYSFUNC.DAT" missing') else begin {$I-} read(imagef,wind); {$I+} badd:=(ioresult<>0); if (badd) then commandline('Errors reading image data from SYSFUNC.DAT'); close(imagef); if (not badd) then begin savescreen(swind,1,1,80,25); xx:=wherex; yy:=wherey; z:=textattr; removewindow(wind); cursoron(FALSE); c:=readkey; removewindow(swind); if (useron) then topscr; gotoxy(xx,yy); textattr:=z; cursoron(TRUE); end; end; end; procedure readinzscan; var zscanf:file of zscanrec; i,j:integer; begin assign(zscanf,systat.gfilepath+'zscan.dat'); {$I-} reset(zscanf); {$I+} if (ioresult<>0) then rewrite(zscanf); if (usernum=usernum+1); close(zscanf); end; procedure savezscanr; var zscanf:file of zscanrec; begin assign(zscanf,systat.gfilepath+'zscan.dat'); {$I-} reset(zscanf); {$I+} if (ioresult<>0) then rewrite(zscanf); if (usernum