[comp.os.vms] PASS difficulties

graham@DRCVAX.ARPA (09/28/87)

I tried to send this to Lisa Brosseau, but couldn't make contact via 
Arpanet on any of the three addresses she listed.  I'm posting it to the 
net because others may be having her difficulties.  Although I am offering 
a differnt source code for the program to force password changes, I do not 
intend this to in any denegrate the PASS program nor it's author, it's
simply a different approach to the same end.   --Dan
...........................................................................
Lisa,

I can't exactly explain why you are having this problem, but I have a 
little bit different way of doing the PASS work.

First, I wrote my own force-them-to-set-password program which tested for
both conditions of expired password, and a never used account. I execute
the SET PASSWORD command from within the program, avoiding the extra
commands of the command procedure.  I do it with the LIB$SPAWN command,
then recheck the status of the password.  If it's changed, I exit, if not,
I make it rerun...they can't get out without doing a valid change of their
password. 

The portion of code in the SYSLOGIN.COM that runs it for every user follows

$ SET NOCONTROL_Y
$ SET NOON
$ ASSIGN/NOLOG 'F$LOGICAL("TT") SYS$INPUT
$ RUN SYS$SYSTEM:NEWPASS
$ DEASSIGN SYS$INPUT
$ SET ON

I just tried it again on a test account I have, and you can't ctrl/y out of 
it for love nor money.

I'll include here the source of my NEWPWD.FOR program.  If you don't 
need/want it, just throw it away, won't hurt my feelings a bit.

I hope some of this helps.

Dan Graham
GRAHAM@DRCVAX.ARPA

..........................................................................
C This program checks to see if a user is logging in for the first time, or 
C if the password has expired, and they are logging in on the 'one shot grace 
C period.'  If either is true, the SET PASSWORD utility is run automatically, 
C ensuring that it is done and not forgotton.
C
	PROGRAM NEWPWD

	INTEGER*4 SYS$GETUAI,STATUS,LIB$BBSSI,SYS$GETJPI,LIB$SPAWN
	INCLUDE '($UAIDEF)'
	INCLUDE '($JPIDEF)'

	STRUCTURE /ITMLST/
	    UNION
		MAP
		    INTEGER*2 BUFLEN,ITMCOD
		    INTEGER*4 BUFADR,RETADR
		END MAP
		MAP
		    INTEGER*4 END_LIST
		END MAP
	    END UNION
	END STRUCTURE
	RECORD /ITMLST/ UAI_LIST(3)
	RECORD /ITMLST/ JPI_LIST(3)

	CHARACTER*12 USERNAME
	CHARACTER*12 COMMAND/'SET PASSWORD'/
	INTEGER*4 FLAG,PWDDATE(2),BIT/9/,PID/0/,MODE

	JPI_LIST(1).BUFLEN = 12
	JPI_LIST(1).ITMCOD = JPI$_USERNAME
	JPI_LIST(1).BUFADR = %LOC(USERNAME)
	JPI_LIST(1).RETADR = 0
	JPI_LIST(2).BUFLEN = 4
	JPI_LIST(2).ITMCOD = JPI$_MODE
	JPI_LIST(2).BUFADR = %LOC(MODE)
	JPI_LIST(2).RETADR = 0
	JPI_LIST(3).END_LIST = 0
	UAI_LIST(1).BUFLEN = 4
	UAI_LIST(1).ITMCOD = UAI$_FLAGS
	UAI_LIST(1).BUFADR = %LOC(FLAG)
	UAI_LIST(1).RETADR = 0
	UAI_LIST(2).BUFLEN = 8
	UAI_LIST(2).ITMCOD = UAI$_PWD_DATE
	UAI_LIST(2).BUFADR = %LOC(PWDDATE)
	UAI_LIST(2).RETADR = 0
	UAI_LIST(3).END_LIST = 0

C Get the username from $GETJPI
	STATUS = SYS$GETJPIW(,PID,,JPI_LIST,,,)
	IF (MODE .NE. JPI$K_INTERACTIVE) GOTO 999
C Get the password status and last login date from the UAF file
	STATUS = SYS$GETUAI(,,USERNAME,UAI_LIST,,,)
5	IF (LIB$BBSSI(BIT,FLAG) .OR. PWDDATE(1) .EQ. -1) THEN
	    PRINT 10
	    STATUS = LIB$SPAWN(COMMAND,,,,,,,,,,,)
C If password not set correctly, or user tries to abort, it will repeat
	    STATUS = SYS$GETUAI(,,USERNAME,UAI_LIST,,,)
	    GOTO 5
	ENDIF
10	FORMAT(/,1X,'SET PASSWORD is being run automatically for you',//)

999	END


------