perm filename ACCCHK.FAI[S,NET]1 blob sn#561810 filedate 1983-05-30 generic text, type T, neo UTF8
;I was asked to take this code from ARPANet FTP server rather than writing
;my own.  If you think this is bad, look at what i didn't take.  If it does
;not work, don't complain to me.  I'm not sure even who to complain to.
;	--- TVR/14-Jan-81
;------------------------------------------------------------------------------

	DEFINE ACCIMP <
;Following are used by ACCCHK and GRPCHK.  They are NOT reentrant!
	OWNER:	BLOCK 1		;User has owner access to the file.
	UPPN:	BLOCK 1		;User's PPN
	PASSOK:	BLOCK 1		;Password was accepted.
	PRIVS:	0		;SAVE USER'S PRIVILEGES HERE
	PRVMTA:	SIXBIT /GODMOD/
		14
		IOWD 17,PRVBUF
	PRVBUF:	BLOCK 13
	PASWD:	0		;PASSWORD RETURNED HERE IF INF
	PRIVWD:	0		;PRIVILEGES RETURNED HERE
		0		;LAST LOGIN TIME RETURNED HERE
	GRPWD:	0		;GROUP ACCESS BITS RETURNED HERE
>;DEFINE ACCIMP

BEGIN	ACCROCK
;This makes the things work with ETHFTP
T←RET
D←RET2
B←TAC
A←TAC2
UFDC←PROCHN

;------------------------------------------------------------------------------
;	ACCCHK
;
;Call with protection from LOOKUP in RET, PPN of file on RET2, and access in TAC.
;Skips if it is accessible.
;------------------------------------------------------------------------------
;	GRPCHK
;
;Call with PPN of file in RET2.  Sets OWNER if user has owner access to that file.
;
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;
;	Access code to files.
;
;	(These are magic numbers which came from FTPSER)
;
;;		MOVEI TAC,1	(FOR DATA OUT TO  IMP, LOCAL LOOKUP)
;;			 ,5	(FOR STAT, LOCAL LOOKUP, NO DATA TRANSFER)
;;			 ,2∨6	(FOR DATA IN FROM IMP, LOCAL ENTER)
;;				(6 FOR MAIL OR MLFL, COPIES OLD FILE LATER)
;;			 ,3	(FOR DATA IN FROM IMP, LOCAL UPDATE)
;;			 ,10	(FOR RNTO OR DELE)
;;			 ,21	(FOR RNFR, DOES LOOKUP BUT CHECKS WRITE ACCESS)
;------------------------------------------------------------------------------
↑A.READ←←1	;For reading file
↑A.WRITE←←2	;For writing file
↑A.RMW←←3	;For updating or appending
↑A.STAT←←5	;For printing information in a UFD
↑A.DELET←←10	;For deleting a file

;==============================================================================
;GROUP ACCESS/PRIVILEGE BITS
;None of these symbols are actually used in the code except GROUPS and MASPRV.
;GROUPS is a fullword value but MASPRV must be right half.

REAPRV←←40000
WRTPRV←←20000
MASPRV←←1
SYSPRV←←2
SCYPRV←←4
DECPRV←←10
ACTPRV←←20
CSPPRV←←40

GROUPS←←47		;ALL OF THE ABOVE.

;ACCCHK OWNACC GRPCHK
↑ACCCHK:
;;;	MOVE T,ILDD+2		;GET PROTECTION
	TLZ T,600000		;FLUSH THESE LOSING BITS
	SKIPN OWNER		;IF USER HAS GROUP ACCESS PRIVS TO THIS UFD,
	CAMN D,UPPN		; OR IF FILE PPN IS USER'S PPN,
	JRST OWNACC		; USE OWNER ACCESS
	LSH T,3			;ELSE EITHER LOCAL OR GUEST ACCESS
;;;	TLNN FLG,(PASSBT)	; DEPENDING
	skipn passok		;Skip if password was given successfully
	LSH T,3
OWNACC:	TRNE B,36		;IF ANYTHING OTHER THAN STRAIGHT READ,
	LSH T,1			;  CHECK WRITE ACCESS
	TLNN T,200000		;THE MAGIC BIT SHOULD ALWAYS BE HERE NOW
	AOS (P)			;ACCESS OK
	POPJ P,

↑GRPCHK:
	SETZM OWNER		;THIS WILL FLAG OWNER ACCESS
;;;	AOS ERRTYP		;WE'VE FOUND THE UFD
	MTAPE UFDC,PRVMTA	;READ RETRIEVAL
	 POPJ P,		;CAN'T, NO GROUP ACCESS
	SETZM PASWD		;JUST IN CASE WE HAVE INF
	MOVE T,GRPWD		;GET FILE ACCESS GROUPS FOR THIS UFD
	AND T,[GROUPS]		;JUST THE RIGHT BITS PLEASE
;;;	HRRZ A,ILDD		;PRG OF TARGET UFD
;;;	CAME A,UPRG		;PRG OF OUR USER
	hrrz a,uppn		;Get programmer part of our user
	caie a,(d)		;Is it the same as the file (s)he asks for?
	TRZ T,MASPRV		;NOT THE SAME, NO MAS ACCESS
	TLO T,REAPRV!WRTPRV	;ALSO ALLOW REA AND WRT ACCESS
	TDNE T,PRIVS		;DOES USER HAVE ANY CORRESPONDING PRIVS?
	SETOM OWNER		;YES! ALLOW OWNER ACCESS
	POPJ P,

BEND	ACCROCK