10  REM:   PASWRD: Secondary password maintenance program
15  REM:
17  REM:   Written by David Shayer  SMHS
20  REM:   Overhauled by Brad Zaller  SMHS  9/81
30  DIM A$[100],B$[100],F$[100],P$[100],I$[100]
40  FILES *,*
41  REM:  The BREAK key must be disabled due to the sensitivity of
45  REM:  the security system.  An aborted secondary could be fatal.
50  REM b=brk(0)
55  O=0
60  REM:   In the next line, A$ must be set to the account in
70  REM:   which the LOG file resides.
80  A$="A101"
90  SYSTEM F$,"TIM"
110  IF POS("A0A1X0X1",F$[1,2]) <> 0 THEN 140
120  CHAIN B5,"$HELLO",350
130  STOP 
140  F$="LOG."
150  F$[LEN(F$)+1]=A$
160  ASSIGN F$,1,R,"HAN"
180  IF R=0 THEN 220
190  ASSIGN *,1
200  PRINT '7"Flag file assign error - Cannot continue."'7
205  SYSTEM X,"MES-"'7":::ASSIGN ERROR:::LOG FILE:::PASWRD:::"'7
210  STOP 
220  PRINT LIN(1);"*** Secondary Password ***"
240  REM
520  PRINT LIN(1);"Command: ";
530  LINPUT A$
540  IF LEN(A$)=0 THEN 520
545  A$=UOS$(A$)
547  IF A$[1,3]="//R" THEN 2920
550  IF A$[1,3]#"//S" THEN 570
560  STOP 
570  IF A$[1,3]#"//H" THEN 600
571  PRINT LIN(1);TAB(13);"Valid password commands:";LIN(1)
572  PRINT "   (A)dd      - Adds a secondary password into the system"
573  PRINT "   (M)odify   - Modifies a secondary password"
574  PRINT "   (D)ump     - Dumps all secondary passwords"
575  PRINT "   (E)cho     - Changes to half or full duplex"
576  PRINT "   (L)ist     - Lists a single password by port/account"
577  PRINT "   (K)ill     - Removes a secondary password from the system"
578  PRINT LIN(1);"   (//R)epgen - Transfers control to the REPGEN program"
579  PRINT "   (//S)top   - Exits this program"
580  ASSIGN "INFOP.A101",2,R,"CONTROL"
581  IF R THEN 520
582  IF  END #2 THEN 520
583  READ #2;B$
584  PRINT LIN(1);"Continue? ";
585  LINPUT A$
586  A$=UOS$(A$)
587  IF A$[1,1]#"Y" THEN 520
588  PRINT LIN(1);"Secondary password information file updated: ";B$
589  READ #2;I$
590  PRINT I$
591  GOTO 589
600  P=POS("AMKLDE",A$[1,1])
610  GOTO P OF 640,1110,1400,1630,1760,2980
620  PRINT "Invalid command"
630  GOTO 520
640  REM ***** Add a secondary password *****
650  PRINT "Account: ";
660  LINPUT A$
670  IF LEN(A$)=0 THEN 520
680  GOSUB 2470
690  IF R=1 THEN 650
700  PRINT "Password: ";
710  IF O=0 THEN 730
720  SYSTEM K,"ECH-OFF"
730  LINPUT P$
740  IF O=0 THEN 770
750  PRINT 
760  SYSTEM K,"ECH-ON"
770  IF LEN(P$)=0 THEN 520
780  GOSUB 2190
790  IF R=1 THEN 700
800  GOSUB 1930
810  IF  END #1 THEN 1080
820  GOTO R OF 860,1030
830  UNLOCK #1
840  PRINT A$;" already has a secondary password - Use the (C)hange option."
850  GOTO 520
860  FOR X=LEN(A$)+1 TO 25
870  A$[X,X]=" "
880  NEXT X
890  A$[8,7+LEN(P$)]=P$
900  READ #1,100;E
910  FOR X=1 TO E
920  READ #1;F$
930  IF F$[1,1]#" " THEN 980
940  F$=A$
950  READ #1,100
960  ADVANCE #1;X,R
970  GOTO 1040
980  NEXT X
990  PRINT #1;A$
1000  READ #1,100
1010  UPDATE #1;E+1
1020  GOTO 1050
1030  F$[8,7+LEN(P$)]=P$
1040  UPDATE #1;F$
1050  UNLOCK #1
1060  PRINT A$[1,6];": Password ready"
1070  GOTO 520
1080  UNLOCK #1
1090  PRINT '7"No room in flag file - Password NOT entered."'7
1100  GOTO 520
1110  REM ***** Change a Password *****
1120  PRINT "Account: ";
1130  LINPUT A$
1140  IF LEN(A$)=0 THEN 520
1150  GOSUB 2470
1160  IF R=1 THEN 1120
1170  PRINT "New Password: ";
1180  IF O=0 THEN 1200
1190  SYSTEM K,"ECH-OFF"
1200  LINPUT P$
1210  IF O=0 THEN 1240
1220  PRINT 
1230  SYSTEM K,"ECH-ON"
1240  IF LEN(P$)=0 THEN 520
1250  GOSUB 2190
1260  IF R=1 THEN 1170
1270  GOSUB 1930
1280  IF R=0 THEN 1320
1290  UNLOCK #1
1300  PRINT A$;" doesn't have a secondary - Use the (A)dd option."
1310  GOTO 520
1320  F$[8,7+LEN(P$)]=P$
1330  FOR X=8+LEN(P$) TO 14
1340  F$[X,X]=" "
1350  NEXT X
1360  UPDATE #1;F$
1370  UNLOCK #1
1380  PRINT A$;": Password changed"
1390  GOTO 520
1400  REM ***** Remove Password from System *****
1410  PRINT LIN(1);"Account: ";
1420  LINPUT A$
1430  IF LEN(A$)=0 THEN 520
1435  A$=UOS$(A$)
1440  GOSUB 2470
1450  IF R=1 THEN 1410
1460  GOSUB 1930
1470  IF R=0 THEN 1510
1480  UNLOCK #1
1490  PRINT A$;" doesn't have a secondary password."
1500  GOTO 520
1510  IF NUM(F$[7,7])#32 OR NUM(F$[15,15])#32 THEN 1560
1520  FOR X=1 TO 25
1530  F$[X,X]=" "
1540  NEXT X
1550  GOTO 1590
1560  FOR X=8 TO 14
1570  F$[X,X]=" "
1580  NEXT X
1590  UPDATE #1;F$
1600  UNLOCK #1
1610  PRINT A$;": Password Removed"
1620  GOTO 520
1630  REM ***** List a Password *****
1640  PRINT LIN(1);"Account: ";
1650  LINPUT A$
1660  IF LEN(A$)=0 THEN 520
1670  GOSUB 2470
1680  IF R=1 THEN 1640
1690  GOSUB 1930
1700  UNLOCK #1
1710  IF R=0 THEN 1740
1720  PRINT A$;": doesn't have a secondary password."
1730  GOTO 520
1740  PRINT A$;": ";F$[8,14]
1750  GOTO 520
1760  REM ***** Dump All Passwords *****
1770  PRINT LIN(2);"Account","Password"
1780  LOCK #1
1790  READ #1,100;E
1800  UNLOCK #1
1810  FOR X=1 TO E
1820  LOCK #1
1830  READ #1,100
1840  ADVANCE #1;X,R
1850  READ #1;F$
1860  UNLOCK #1
1870  IF F$[1,1]=" " THEN 1900
1880  IF F$[8,8]=" " THEN 1900
1890  PRINT F$[1,6],F$[8,14]
1900  NEXT X
1910  PRINT LIN(2)
1920  GOTO 520
1930  REM ***** Look for account in file *****
1940  REM:   A$ = Account to be checked
1950  REM:   R  = Return variable; 0=Good account, 1=Bad account,
1960  REM:        2=Account in file, but without secondary
1970  REM:
1980  REM:   File pointer will be positioned just before entry if
1990  REM:   good; If no good, at end of file.
1995  A$=UOS$(A$)
2000  LOCK #1
2010  IF  END #1 THEN 2160
2020  READ #1,100;E
2030  FOR X=1 TO E
2040  READ #1;F$
2050  IF A$=F$[1,POS(F$," ")-1 MIN 6] THEN 2090
2060  NEXT X
2070  R=1
2080  RETURN 
2090  R=0
2100  READ #1,100
2110  ADVANCE #1;X,R
2120  IF F$[8,8]=" " THEN 2140
2130  RETURN 
2140  R=2
2150  RETURN 
2160  UNLOCK #1
2170  PRINT '7"Data format error (Flag fil) - Cannot continue."'7
2180  STOP 
2190  REM ***** Check for valid password *****
2200  REM:   P$ = Password
2210  REM:   R  = Return variable; 0=good password, 1=bad password
2220  R=0
2225  P$=UOS$(P$)
2230  IF P$[1,3]#"//S" THEN 2250
2240  STOP 
2250  IF P$[1,3]#"//H" THEN 2290
2260  PRINT "Enter the secondary password for ";A$;".";
2280  GOTO 2440
2290  IF LEN(P$)>7 OR LEN(P$)<1 THEN 2390
2300  FOR X=1 TO LEN(P$)
2310  IF NUM(P$[X,X])<32 THEN 2430
2330  IF NUM(P$[X,X])>47 AND NUM(P$[X,X])<58 THEN 2370
2340  IF NUM(P$[X,X])>64 AND NUM(P$[X,X])<91 THEN 2370
2350  PRINT "Special characters not allowed"
2360  GOTO 2440
2370  NEXT X
2380  RETURN 
2390  PRINT "7 characters maximum"
2400  GOTO 2440
2430  PRINT "Control characters not allowed"
2440  R=1
2450  PRINT 
2460  RETURN 
2470  REM ***** Check port/account validity *****
2480  REM:   A$ = Account to be checked
2490  REM:   R  = Return variable; 0=good account, 1=bad account
2500  R=0
2510  A$=UOS$(A$)
2520  IF A$[1,3]#"//S" THEN 2540
2530  STOP 
2540  IF A$[1,3]#"//H" THEN 2580
2550  PRINT "Enter the port/account combination that you want to"
2560  PRINT "put the secondary password on."
2565  PRINT "Example: 09K123  14  Q100  ALL  MASTER"
2570  GOTO 2900
2580  IF LEN(A$)<1 OR LEN(A$)>6 THEN 2870
2590  IF A$="ALL" THEN 2670
2600  IF A$="MASTER" THEN 2670
2610  IF NUM(A$)>47 AND NUM(A$)<58 THEN 2680
2620  IF NUM(A$)<65 OR NUM(A$)>90 THEN 2890
2630  IF LEN(A$)>4 THEN 2890
2640  FOR X=2 TO LEN(A$)
2650  IF NUM(A$[X,X])<48 OR NUM(A$[X,X])>57 THEN 2890
2660  NEXT X
2670  RETURN 
2680  IF LEN(A$)=1 THEN 2830
2690  IF NUM(A$[2,2])<48 OR NUM(A$[2,2])>57 THEN 2770
2700  IF LEN(A$)=2 THEN 2760
2710  IF NUM(A$[3,3])<65 OR NUM(A$[3,3])>90 THEN 2890
2720  IF LEN(A$)=3 THEN 2760
2730  FOR X=4 TO LEN(A$)
2740  IF NUM(A$[X,X])<48 OR NUM(A$[X,X])>57 THEN 2890
2750  NEXT X
2760  RETURN 
2770  IF NUM(A$[2,2])<65 OR NUM(A$[2,2])>90 THEN 2890
2780  IF LEN(A$)=2 THEN 2830
2790  IF LEN(A$)>5 THEN 2890
2800  FOR X=3 TO LEN(A$)
2810  IF NUM(A$[X,X])<48 OR NUM(A$[X,X])>57 THEN 2890
2820  NEXT X
2830  F$=A$
2840  A$="0"
2850  A$[2]=F$
2860  RETURN 
2870  PRINT A$;": Illegal account (6 characters maximum)"
2880  GOTO 2900
2890  PRINT A$;": Illegal account"
2900  R=1
2910  RETURN 
2920  REM ***** Chain to $REPGEN *****
2930  PRINT LIN(1);"*** Repgen ***"
2940  CHAIN "$REPGEN"
2950  PRINT '7"Program $REPGEN not found."
2960  SYSTEM X,"mes-"'7":::CHAIN ERROR:::PASWRD TO $REPGEN:::"'7
2970  GOTO 520
2980  REM ***** Flip Duplex during "Password: " prompts *****
2990  IF O=0 THEN 3010
3000  O=0
3005  PRINT "Echo: ON"
3007  GOTO 520
3010  O=1
3020  PRINT "Echo: OFF"
3030  GOTO 520
9999  END 
