.TITLE LOGI .IDENT /V03.00/ .NLIST BEX .ENABL LC ; ; ********************** ; * [311,77]MAELOG.MAC * ; ********************** ; ; COPYRIGHT (C) 1979 ; METCALF & EDDY, INC., BOSTON, MASS 02114 ; ; WHILE METCALF & EDDY, INC. BELIEVES THAT THIS SOFTWARE ; IS SUBSTANTIALLY FREE OF BUGS AND DEFECTS, NO WARRANTY, ; EXPRESSED OR IMPLIED, IS PROVIDED. THE SOFTWARE IS SUPPLIED ; ON AN "AS IS" BASIS. ; ; THIS SOFTWARE MAY BE COPIED AT WILL WITH THE INCLUSION ; OF THE ABOVE COPYRIGHT NOTICE. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN METCALF & EDDY, INC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE ; WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT ; BY ANYONE. ; ; ; THIS MODULE CONTAINS THE "HOOKS" AND PATCHES TO "LOGI" ; (THE PDS LOGIN / LOGOUT PROCESSOR). ; ; THERE ARE THREE HOOKS PATCHED INTO LOGI. THEY ARE AS ; FOLLOWS: ; ; 1) LOGI+1722 -- PATCH TO PASSWORD VERIFICATION ; 2) LOGI+2652 -- PATCH TO LOGIN SECTION ; 3) LOGI+6734 -- PATCH TO LOGOUT SECTION ; ; ADDITIONALLY THE NEW CODE BRANCHES BACK TO TWO LOCATIONS ; IN LOGI. THESE LOCATIONS ARE: ; ; 1) LOGO+6700 -- FINAL LOGOUT PROCESSING (LOGO2) ; 2) LOGO+1736 -- PASSWORD VERIFICATION FAILURE (65$) ; ; NOTE: ALL THE ORIGINAL CODE LINES IN THE PATCHES ARE ; MARKED WITH A COMMENT ";++++ ORIGINAL CODE" ; ; LINK TO PDS TO LOGIN / LOGO ; .PSECT LOGI,RO,I ; .NLIST .SBTTL PATCH CODE .LIST .PAGE ; ; THIS IS THE PATCH CODE FOR LOGI ; CODE=. ; ; THIS IS THE FINAL LOGOUT PROCESSING THAT RESETS EVERYTHING ; TO ITS INTITIAL STATE. ; LOGO2=.+6700 ; ; THIS LOCATION IS IN THE LOGOUT PROCESSING CODE JUST AFTER ; THE UPF IS UPDATED. IT IS AT SYSMBOL "LOGO2+2". ; .=CODE+6734 CALL MAE02 ; LOGOUT PROCESSING NOP ; ORIGINAL CODE 3 WORDS ; ; THIS LOCATION IS WHERE THE PASSWORD IS CHECKED. ; .=CODE+1722 CALL MAEPAS ; REGULAR PASSWORD PROCESSING BCS 65$ ; PASSWORD FAILURE NOP ; ORIGINAL CODE LONGER ; ; THIS LOCATION IS THE PASSWORD FAILURE LOCATION ; .=CODE+1736 65$: ; ; THIS LOCATION IS THE SUCCESSFUL LOGIN SECTION. IT IS JUST ; AFTER THE OWNER STATUS LINE AND THE NOTICE ARE WRITTEN ; .=CODE+2652 CALL MAE01 ; LOGIN PROCESSING NOP ; ORIGINAL CODE 3 WORDS ; .NLIST .SBTTL (MAEPAS)--REGULAR PASSWORD PROCESSING .LIST ; ; CHECK FOR SPECIAL PASSWORD AND VERIFY REGULAR PASSWORD ; ; REGISTERS ON ENTRY: ; ; R2 = ADDRESS OF ENTERED PASSWORD ; R3 = ADDRESS OF UPF PASSWORD ; ; PASSWORD STORED AS THE COMPLIMENT OF RAD50 ; .PSECT MAEPAS,RO,I ; MAEPAS: CLR MAEFLG ; CLEAR SPECIAL ACCOUNTING FLAG TST (R3) ; NULL PASSWORD? BNE 5$ ; NO - DO REGULAR PASSWORD VERIFY BIS #MAEDO,MAEFLG ; SET TO SPECIAL ACCOUNTING BR 8$ ; SET TO PASSWORD GOOD ; ; VERIFY ORIGINAL PASSWORD ; 5$: CMP (R3)+,(R2)+ ;++++ ORIGINAL CODE BNE 10$ ;++++ ORIGINAL CODE CMP (R3)+,(R2)+ ;++++ ORIGINAL CODE BNE 10$ ; 8$: CLC ; GOOD PASSWORD RETURN ; 10$: SEC ; BAD PASSWORD RETURN ; ; .NLIST .SBTTL (MAE01)--LOGIN PROCESSING .LIST ; ; THIS ROUTINE PERFORMS THE LOGIN PROCESSING ; ; IF THE TERMINAL IS NOT THE SCI TERMINAL AND THE USERS ; NAME IS FLAGGED FOR SPECIAL ACCOUNTING (NULL UPF PASSWORD) ; THEN THE FOLLWING ROUTINES ARE CALLED: ; ; 1) MAELOG -- PERFORM PASSWORD VERIFICATION ; 2) MAEBEG -- INITIALIZE NO ACCOUNTING TASKS ; 3) MAEINT -- INITIALIZE ACCOUNTING RECORD ; .PSECT MAEPAS,RO,I ; MAE01: BIT #F2.SCI,FLAG2 ; SCI TERMINAL BNE 10$ ; YES GET OUT OF HERE BIT #MAEDO,MAEFLG ; SPECIAL ACCOUNTING? BEQ 10$ ; NO ; CALL MAELOG ; COMPLETE LOGIN VERIFICATION CALL MAEBEG ; INITIALIZE NO ACCOUNT TASKS CALL MAEINT ; INITIALIZE BUFFER BIS #MAELGI,MAEFLG ; SET TO LOGIN SUCCESSFUL ; 10$: BIT #FL.QTE,FLAGS ;++++ ORIGINAL CODE ; RETURN ; .NLIST .SBTTL (MAELOG)--REMAINDER OF LOGIN PROCESSING .LIST ; ; PROCESS REMAINDER OF LOGIN FOR SPECIAL USERS ; ; ; THIS ROUTINE VERIFIES PASSWORD FOR USER NAMES THAT HAVE ; A NULL UPF PASSWORD. THIS ROUTINE MAY BE MODIFIED TO ; VERIFY PASSWORDS IN ANY WAY THAT IS APPROPRIATE FOR A ; PARTICULAR INSTALLATION. ; ; IF THE PASSWORD VERIFICATION IS SUCCESSFULL THE ROUTINE ; SIMPLY RETURNS. ON A PASSWORD FAILURE THE ROUTINE JUMPS ; TO LOGO2 TO LOGOUT THE TERMINAL. ; .MCALL OPEN$R,PUT$,DIR$,GET$R,CLOSE$ ; .MACRO SAVREG JSR R5,SAVREG .ENDM SAVREG ; ; .NLIST .SBTTL (MAELOG/OPEN)--OPEN PASSWORD FILE .LIST ; ; THIS IS THE MAELOG FILE OPEN ROUTINE. IT IS USED TO ; OPEN THE PRIVILEGED UIC FILE (A FILE CONTAINING A LIST ; OF UIC GROUP NUMBERS THAT ARE CONSIDERED PRIVILEGED AND ; THEREFORE ACCESS A DIFFERENT PASSWORD FILE). THE ; PRIVILEGED UIC FILESPEC IS "LB0:[1,100]PDSPRIV.UIC". ; IT IS ALSO USED TO OPEN THE PASSWORD BIT MAP FILE. ; ONE OF TWO FILES IS OPENED; "LB0:[1,100]PDSPAS.PAS" ; FOR REGULAR USERS AND "LB0:[1,100]PDSPRIV.PAS" FOR ; PRIVILEGED USERS. ; ; THIS ROUTINE ALSO CONTAINS CODE TO PRINT FILE ERROR ; MESSAGES AND EXIT TO THE PDS LOGOUT PROCESSOR. ; .PSECT MAEPAS,RO,I ; OPEN: 10$: OPEN$R #PASFDB ; OPEN PASSWORD FILE BCC 50$ ; OPEN OK CMPB PASFDB+F.ERR,#IE.LCK ; "LOCKED FROM READ/WRITE"? BEQ 40$ ; YES WAIT A SECOND CMPB PASFDB+F.ERR,#IE.FOP ; "ALREADY OPEN"? BEQ 40$ ; YES WAIT A SECOND SEC ; ERROR RETURN RETURN ; ; 40$: DIR$ #WAIT1S ; WAIT A SECOND DIR$ #WAITFL ; WAIT FOR FLAG BR 10$ ; TRY AGAIN ; 50$: RETURN ; ; FERR: MOV ECODE,R0 ; GET ERROR CODE MOVB PASFDB+F.ERR,R1 ; CLR R2 ; CALL $CBDSG ; PUT$ #OUTFDB,ERRP,ERRPL ; PRINT ERROR MESSAGE MOV ERRP,OWDPB+14 ; TELL OPERATOR MOV ERRPL,OWDPB+16 ; MOV #40,OWDPB+20 ; DIR$ #OWDPB ; CLOSE$ #PASFDB ; CLOSE THE FILE ADD #24,SP ; RESET STACK 10$: JMP LOGO2 ; LOGO ; .NLIST .SBTTL (MAELOG)--VERIFY PASSWORD .LIST ; ; THIS ROUTINE FIRST READS THE PRIVILEGED UIC FILE TO ; DETERMINE IF THE CURRENT USER IS A PRIVILEGED ONE ; REQUIRING PASSWORD VERIFICATION FROM THE PRIVILEGED ; PASSWORD FILE. THEN THE PASSWORD (WHICH IS, IN THIS ; IMPLEMENTATION ASSUMED TO BE AN EMPLOYEE NUMBER) IS ; USED TO COMPUTE A LOCATION IN THE APPROPRIATE PASSWORD ; BIT MAP FILE TO VERIFY THE VALIDITY OF THE PASSWORD. ; SUCCESSFUL PASSWORDS RESULT IN A SIMPLE RETURN; ; PASSWORD FAILURE REULTS IN JUMPING TO LOGO2 FOR ; LOGOUT PROCESSING. ; .PSECT MAEPAS,RO,I ; MAELOG: SAVREG ; SAVE REGISTERS ; MOV #UCODE,ECODE ; SET UP FOR ERROR MESSAGES MOV #RRU,ERRP ; MOV #RRUL,ERRPL ; CALL OPEN ; OPEN PRIV UIC FILE BCC 5$ ; OK CMPB PASFDB+F.ERR,#IE.NSF ; NO SUCH FILE? BEQ 10$ ; YES THEN NO PRIV UIC'S JMP FERR ; ELSE EXIT ERROR 5$: GET$R #PASFDB ; READ THE RECORD BCS 30$ ; ERROR CMPB LGIUIC+1,PASS ; PRIVILEGED UIC? BEQ 20$ ; YES BR 5$ ; READ ANOTHER ; 10$: CLOSE$ #PASFDB ; CLOSE THE FILE MOV #FNSA,ACTDS+12 ; SET UP REGULAR USER MOV #FNSS,ACTDS+10 ; BR 40$ ; 20$: CLOSE$ #PASFDB ; CLOSE THE FILE MOV #SPSA,ACTDS+12 ; SET UP SPECIAL PASSWORD MOV #SPSS,ACTDS+10 ; FILE BR 40$ ; ; 30$: CMPB PASFDB+F.ERR,#IE.EOF ; ERROR - EOF BEQ 10$ ; YES THEN DONE JMP FERR ; ELSE REPORT IT ; 40$: MOV #PCODE,ECODE ; SET UP FOR ERROR MESSAGE MOV #RRP,ERRP ; MOV #RRPL,ERRPL ; CALL OPEN ; OPEN PASSWORD FILE BCC 50$ ; OK JMP FERR ; GO PROCESS ERROR ; .PAGE ; ; CONVERT PASSWORD TO EMPLOYEE NUMBER ; 50$: MOV #ABUFF,R0 ; CONVERT PASSWORD TO ASCII MOV PWDBUF,R1 ; COM R1 ; CALL C5TA ; DO CONVERT MOV PWDBUF+2,R1 ; COM R1 ; CALL C5TA ; CONVERT SECOND WORD ; MOV #6,R1 ; COMPUTE NO OF CHARACTERS IN PWD MOV #ABUFF,R0 ; CLR R4 ; 52$: TSTB (R0) ; NULL BYTE BEQ 55$ ; YES -- DONE CMPB #' ,(R0)+ ; A BLANK? BEQ 55$ ; YES THEN DONE INC R4 ; COUNT CHAR SOB R1,52$ ; LOOP 55$: MOV #EMPLY,R3 ; SET UP TO CONVERT EMPLOYEE ; NUMBER FROM ASCII TO MOV #ABUFF,R5 ; DOUBLE INTEGER CALL .DD2CT ; CONVERT BCS 70$ ; ERROR THEN BAD EMPLOYEE NO TST EMPLY ; VALUE IN WORD 1 BNE 70$ ; YES THEN BAD EMPLOYYE NO MOV EMPLY+2,R1 ; PUT NO IN REGISTER ; ; EMPLOYEE NUMBER NOW IN R1 ; ; COMPUTE PASSWORD FILE RECORD NUMBER: ; REC# = (EMPLY / 16) + 1 ; MOV R1,R2 ; SAVE EMPLOYEE NUMBER ASH #-4,R1 ; DIVIDE BY 16 INC R1 ; GET$R #PASFDB,,,R1,#0 ; GET PASSWORD BIT MAP BCC 60$ ; OK CMPB PASFDB+F.ERR,#IE.EOF ; EOF? BEQ 70$ ; YES -- INVALID PASSWORD JMP FERR ; ERROR 60$: BIC #177760,R2 ; COMPUTE BIT IN WORD MOV #1,R1 ; STORE A BIT ASH R2,R1 ; SHIFT THE BIT BIT R1,PASS ; LEGAL PASS WORD? BNE 100$ ; YES 70$: CLOSE$ #PASFDB ; CLOSE THE PASSWORD FILE DEC ATTNO ; DECREMENT ATTEMPTS BLE 90$ ; HE BLEW IT PUT$ #OUTFDB,#PMES,#PMESL ; TELL HIM ABOUT NEW PASSWORDS MOV #PWDBUF,R2 ; SET UP TO GET ANOTHER PASSWORD MOV #PASSWP,R3 ; MOV #PASSWS,R4 ; CALL GETPAS ; GET ANOTHER PASSWORD BCS 95$ ; PASSWORD N.G. BR 40$ ; SEE IF HE GOT IT RIGHT YET ; 90$: PUT$ #OUTFDB,#PIM,#PIS ; TELL HIM HE BLEW IT MOV #PASA,OWDPB+14 ; TELL OPERATOR MOV #PASL,OWDPB+16 ; MOV #40,OWDPB+20 ; MOV DEVTAB+4,TERM ; GET DEVICE TYPE MOV DEVTAB+6,TERM+2 ; GET UNIT NUMBER DIR$ #OWDPB ; TELL OPERATOR 95$: ADD #22,SP ; RESTORE STACK JMP LOGO2 ; BYE-BYE ; 100$: CLOSE$ #PASFDB ; CLOSE THE PASSWORD FILE RETURN ; BYE ; .NLIST .SBTTL (MAELOG)--DATA AREA .LIST ; ; LOGIN / LOGOUT PROCESSING READ/WRITE DATA AREA ; .PSECT MAEPAD,RW,D ; RRP: .ASCII /PASSWORD FILE FAILURE CODE = / PCODE: .ASCII / / RRPL=.-RRP RRU: .ASCII /PRIVILEGED UIC FILE FAILURE CODE = / ; UCODE: .ASCII / / RRUL=.-RRU ; .EVEN PASA: .ASCII /PASSWORD FAILURE ON / TERM: .ASCII / / PASL=.-PASA ; PMES: .ASCII /Enter your employee number as the password./ PMESL=.-PMES ; .EVEN PASS: .WORD 0 ; PASSWORD BIT MAP ABUFF: .WORD 0,0,0,0 ; BUFFER TO STORE ASCII PASSWORD ERRP: .WORD 0 ; ADDRESS OF ERROR MESSAGE ERRPL: .WORD 0 ; LENGTH OF ERROR MESSAGE ECODE: .WORD 0 ; ADDRESS TO STORE CODE EMPLY: .BLKW 2 ; EMPLOYEE NUMBER ; .NLIST .SBTTL (MAELOG)--PASSWORD FILE FDB .LIST ; .MCALL FDBDF$,FDOP$A,FDBF$A,FDRC$A,FDAT$A ; PASFDB: FDBDF$ FDAT$A R.FIX,FD.BLK,2,1 FDRC$A FD.RAN,PASS,2 FDOP$A 6,ACTDS,,,FA.ENB!FA.DLK FDBF$A 6,,1 ; ACTDS: .WORD DNSS ; DEVICE NAME SIZE .WORD DNSA ; DEVICE NAME ADDRESS .WORD DIRSS ; DIRECTORY SIZE .WORD DIRSA ; DIRECTORY ADDRESS .WORD UICSS ; FILE NAME SIZE .WORD UICSA ; FILE NAME ADDRESS DNSA: .ASCII /LB0:/ DNSS=.-DNSA DIRSA: .ASCII /[1,100]/ DIRSS=.-DIRSA FNSA: .ASCII /PDSPAS.PAS/ ; REGULAR PASSWORD FILE FNSS=.-FNSA SPSA: .ASCII /PDSPRIV.PAS/ ; PRIV PASSWORDS SPSS=.-SPSA UICSA: .ASCII /PDSPRIV.UIC/ ; PRIV UIC'S UICSS=.-UICSA ; .NLIST .SBTTL (MAE02)--LOGOUT PROCESSING .LIST ; ; THIS ROUTINE IS ENTERED JUST BEFORE THE COMPLETION OF ; LOGOUT. IF THE TERMINAL IS NOT THE SCI TERMINAL AND ; THE USER IS FLAGGED FOR SPECIAL ACCOUNTING A ROUTINE ; (MAEWRT) IS CALLED TO OUTPUT THE FINAL ACCOUNTING ; RECORD. ; .PSECT MAEPAS,RO,I ; MAE02: BIT #F2.SCI,FLAG2 ; SCI TERMINAL? BNE 10$ ; YES GET OUT OF HERE BIT #MAEDO,MAEFLG ; SPECIAL ACCOUNTING? BEQ 10$ ; NO BIT #MAELGI,MAEFLG ; LOGIN SUCCESSFUL? BEQ 10$ ; NO -- SKIP WRITE CALL MAEWRT ; OUTPUT LAST BUFFER 10$: BIT #FL.BAT,FLAGS ;++++ ORIGINAL CODE RETURN ; .END