! ----- REVOKE_IDENTIFIER.FUN ----- ! ! ----- FUNCTION TO REVOKE AN IDENTIFIER ON THE LOCAL NODE (AND ----- ! ----- ALL DUPLICATE NODES) ----- ! ! ---------- PASSED: ---------- ! ----- ENTERED_USERNAME = Username to revoke ident from ! ----- THE_IDENT = Identifier name to be revoked (or ! ----- * for all held identifiers) ! ! ----- Last Change 02/01/94 by Brian Lomasky ----- ! FUNCTION WORD REVOKE_IDENTIFIER %INCLUDE "NUSER.INC" DECLARE STRING A_NODE ! NODE TO GRANT IDENTIFIER ON DECLARE STRING DEFAULT_NODE ! NULL FOR DEFAULT NODE DECLARE WORD ERR_FLAG ! TRUE IF DONE READING RIGHTS DECLARE WORD FIRST_RECORD_WANTED! TRUE IF FIRST RECORD WANTED DECLARE WORD FOUND_IDENTIFIER ! CODE FOR MATCHING RECORD DECLARE LONG HELD_IDENT_INDEX ! HELD IDENTIFIER ARRAY INDEX DECLARE WORD ID_NAME_LEN ! LENGTH OF ID_NAME DECLARE WORD I_O_CHNL ! RIGHTSLIST I/O CHNL TO ACCESS DECLARE LONG LOCAL_STATUS ! LOCAL SYSTEM SERVICE EXIT STAT DECLARE WORD NODE_INDEX ! LIST OF NODES TO GRANT IDENT DECLARE STRING THE_ID ! IDENTIFIER NAME TO DISPLAY ! ----- MAPPED VARIABLE FOR SYS$IDTOASC SYSTEM SERVICE ----- MAP (IDNAME) STRING ID_NAME = 32% ! IDENTIFIER NAME BUFFER EXTERNAL WORD FUNCTION CALC_DUPL_NODES( & STRING) ! RETURN LIST OF DUPL NODES EXTERNAL WORD FUNCTION READ_RIGHTSLIST(WORD, & WORD) ! READ RIGHTSLIST RECORD EXTERNAL WORD FUNCTION SEARCH_RIGHTSLIST(WORD, WORD, & WORD) ! READ MATCHING RIGHTSLIST REC EXTERNAL LONG FUNCTION & SYS$IDTOASC ! CONVERT IDENTIFIER TO ASCII EXTERNAL WORD FUNCTION VALID_USER(STRING, & WORD, WORD) ! SEE IF VALID USERNAME IDENT REVOKE_IDENTIFIER = TRUE ! ASSUME ERROR STATUS IF DEBUG_MODE THEN PRINT "DEBUG>----- Call REVOKE_IDENTIFIER" PRINT "DEBUG>Revoke: ENTERED_USERNAME=" & + TRM$(ENTERED_USERNAME) + & ", THE_IDENT=" + TRM$(THE_IDENT) END IF ! ----- CALCULATE LIST OF DUPLICATE NODES TO REVOKE THE ----- ! ----- IDENTIFIER ON ----- DEFAULT_NODE = "" ! NULL FOR DEFAULT NODE EXIT FUNCTION IF CALC_DUPL_NODES(DEFAULT_NODE) ! ----- FOR EACH DUPLICATE NODE TO BE ACCESSED: ----- NODE_INDEX = 0% WHILE NODE_INDEX < NODES_IN_MEMORY NODE_INDEX = NODE_INDEX + 1% A_NODE = NODE_LISTS(NODE_INDEX) ! ----- FOR EACH POSSIBLE NODE: ----- I_O_CHNL = 0% ! ----- FOR EACH OPEN FILE: ----- WHILE I_O_CHNL < RIGHTSLIST_COUNTER I_O_CHNL = I_O_CHNL + 1% ! ----- SKIP IF RIGHTSLIST IS UNAVAILABLE ----- ITERATE IF TRM$(RIGHTSLIST_SPECS(I_O_CHNL)) = "" ! ----- SKIP IF UNDESIRED NODE ----- ITERATE IF A_NODE <> & TRM$(RIGHTSLIST_NODES(I_O_CHNL)) IF DEBUG_MODE THEN PRINT "DEBUG>Check node " + & TRM$(RIGHTSLIST_NODES(I_O_CHNL)) END IF ! ----- VALIDATE USERNAME ----- EXIT FUNCTION IF VALID_USER( & ENTERED_USERNAME, I_O_CHNL, FALSE) ! ----- IF REVOKING ALL IDENTIFIERS: ----- IF THE_IDENT = "*" THEN ! ----- DONE IF NO HELD ----- ! ----- IDENTIFIERS ----- IF HELD_IDENTS_CTR = 0% THEN ! ----- RETURN SUCCESS ----- ! ----- STATUS ----- REVOKE_IDENTIFIER = FALSE EXIT FUNCTION END IF ! ----- INIT INDEX TO THE FIRST ----- ! ----- HELD IDENT ----- HELD_IDENT_INDEX = 1% ! ----- STORE HELD IDENTIFIER ----- ! ----- VALUE TO BE NEXT REVOKED ----- SEARCH_IDENTIFIER = & HELD_IDENTS(HELD_IDENT_INDEX) ELSE ! IF NOT REVOKING ALL IDENTS: ! ----- SEE IF THE THE_IDENT ----- ! ----- ALREADY EXISTS ----- ! ----- SEARCH FIRST ----- ! ----- RIGHTSLIST.DAT FILE BY ----- ! ----- ITS ALTERNATE KEY #2 TO ----- ! ----- CHECK FOR A VALID ----- ! ----- IDENTIFIER ----- ! ----- STORE IDENTIFIER TO ----- ! ----- SEARCH FOR ----- KGB_NAME = THE_IDENT IF NOT SEARCH_RIGHTSLIST( & I_O_CHNL, 2%, FALSE) THEN ! ----- PRINT ERROR IF ----- ! ----- IDENTIFIER ----- ! ----- DOES NOT EXIST ----- PRINT "Error - " + & TRM$(THE_IDENT) & + " is not an" & + " existing" + & " identifier" + & " on node " + & TRM$( & RIGHTSLIST_NODES& (I_O_CHNL)) + BEL ITERATE END IF ! ----- ERROR IF IN UIC FORMAT ----- IF KGB_IDENTIFIER > 0% THEN ! ----- PRINT ERROR IF ----- ! ----- IDENTIFIER IN ----- ! ----- WRONG FORMAT ----- PRINT "Error - " + & TRM$(THE_IDENT) & + " is a" + & " UIC-format" + & " identifier" + BEL EXIT FUNCTION END IF ! ----- STORE IDENTIFIER VALUE ----- ! ----- TO SEARCH FOR ----- SEARCH_IDENTIFIER = KGB_IDENTIFIER END IF ! ----- LOCATE THIS SPECIFIC HOLDER ----- ! ----- RECORD, IF ANY ----- ERR_FLAG = FALSE FIRST_RECORD_WANTED = TRUE ! ----- ASSUME NO HOLDER FOUND ----- FOUND_IDENTIFIER = 0% WHILE NOT ERR_FLAG IF READ_RIGHTSLIST( & FIRST_RECORD_WANTED, I_O_CHNL) THEN ERR_FLAG = TRUE END IF IF NOT ERR_FLAG THEN FIRST_RECORD_WANTED = FALSE ! ----- SEE IF DONE WITH ----- ! ----- THIS IDENTIFIER ----- IF SEARCH_IDENTIFIER <> & KGB_IDENTIFIER THEN ERR_FLAG = TRUE END IF IF NOT ERR_FLAG THEN ! ----- SKIP IF ----- ! ----- NON-HOLDER ----- ! ----- RECORD ----- ITERATE IF REC_LEN > 16% ! ----- SKIP IF ----- ! ----- HOLDER UIC ----- ! ----- DOES NOT ----- ! ----- MATCH ----- ITERATE IF & SEARCH_HOLDER(0%) & <> KGB_HOLDER(0%) ! ----- DELETE ----- ! ----- THIS ----- ! ----- HOLDER ----- ! ----- RECORD ----- DELETE #I_O_CHNL ! ----- SET FLAG ----- ! ----- TO EXIT ----- ! ----- LOOP ----- ERR_FLAG = TRUE ! ----- IF ----- ! ----- REVOKING ----- ! ----- ALL ----- ! ----- IDENTS, ----- ! ----- CONVERT ----- ! ----- IDENT ----- ! ----- VALUE TO ----- ! ----- PRINTABLE ----- ! ----- STRING ----- IF THE_IDENT = "*" THEN LOCAL_STATUS = & SYS$IDTOASC( & KGB_IDENTIFIER& BY VALUE, & ID_NAME_LEN, & ID_NAME,,,) IF LOCAL_STATUS& <> SS$_NORMAL THEN ID_NAME="???" ID_NAME_LEN & = 3% END IF THE_ID = LEFT( & ID_NAME, & ID_NAME_LEN) ELSE THE_ID =& TRM$( & THE_IDENT) END IF PRINT "Revoked "& + THE_ID& + & " from "& + TRM$( & ENTERED_USERNAME) & + " on" + & " node "& + TRM$( & RIGHTSLIST_NODES& (I_O_CHNL)) & + "..." ! ----- SET FLAG ----- ! ----- IF HOLDER ----- ! ----- FOUND ----- FOUND_IDENTIFIER = 1% END IF END IF ! ----- SEE IF FLAG IS SET TO EXIT ----- ! ----- LOOP AND WE ARE REVOKING ----- ! ----- ALL IDENTS ----- IF ERR_FLAG AND THE_IDENT = "*" THEN ! ----- SEE IF NO HOLDER ----- ! ----- WAS FOUND ----- IF FOUND_IDENTIFIER = 0% THEN PRINT "Warning - " + & TRM$( & ENTERED_USERNAME)& + " on node " + & TRM$( & RIGHTSLIST_NODES& (I_O_CHNL)) + & " does not hold " & + TRM$(THE_IDENT) & + BEL END IF ! ----- INCREMENT ARRAY ----- ! ----- INDEX TO THE NEXT ----- ! ----- HELD IDENTIFIER ----- HELD_IDENT_INDEX = & HELD_IDENT_INDEX + 1% ! ----- DONE IF NO MORE ----- ! ----- HELD IDENTIFIERS ----- ITERATE IF & HELD_IDENT_INDEX& > HELD_IDENTS_CTR ! ----- STORE NEXT HELD ----- ! ----- IDENTIFIER VALUE ----- ! ----- TO BE NEXT REVOKED ----- SEARCH_IDENTIFIER = & HELD_IDENTS( & HELD_IDENT_INDEX) ! ----- SET TO FETCH FIRST ----- ! ----- RECORD FOR THIS ----- ! ----- IDENTIFIER ----- FIRST_RECORD_WANTED = TRUE ! ----- SET TO RE-EXECUTE ----- ! ----- LOOP ----- ERR_FLAG = FALSE ! ----- ASSUME NO HOLDER ----- ! ----- FOUND ----- FOUND_IDENTIFIER = 0% END IF NEXT UNLOCK #I_O_CHNL ! ----- SEE IF NO HOLDER WAS FOUND AND WE ----- ! ----- ARE NOT REVOKING ALL IDENTIFIERS ----- IF FOUND_IDENTIFIER = 0% AND THE_IDENT <> "*" THEN PRINT "Warning - " + & TRM$(ENTERED_USERNAME) & + " on " + TRM$( & RIGHTSLIST_NODES( & I_O_CHNL)) + & " does not hold " + & TRM$(THE_IDENT) + BEL END IF NEXT NEXT REVOKE_IDENTIFIER = FALSE ! RETURN SUCCESS STATUS END FUNCTION