Source code of HPW routine I255608

Server program that runs on Host

 

*********************************************************************
*
*                                I255608
*
*                        TCP/IP Password Server
*
*             Written by William van den Heuvel, 1998
*
*             Update: 1998-12-04
*
*********************************************************************
*
* This module calls RACF passing USERID, PASSWORD and NEWPASSWORD
* RACF is called using the RACROUTE macro
*
* The return code from RACROUTE will be translated in a 2-byte
* reply code that will be send back to the client:
*
* Reply code;
* 21 - ok, password is valid
* 22 - ok, password is changed
* 23 - user is unknown
* 24 - user is known but access is revoked
* 25 - password invalid
* 26 - password expired
* 27 - new password is invalid (not changed)
* 29 - unexpected return code from RACF
*
*********************************************************************
*
* on entry,
* register 1 points to the parameters passed by the caller (I255608)
* 1.- pointer to USERID       input L-string   (L is 1-8)
* 2.- pointer to PASSWORD     input L-string   (L is 1-8)
* 3.- pointer to NEWPASSWORD  input L-string   (L is 0-8)
* 4.- pointer to REPLY        output LL-string (LL will be 02)
*
*......................................................................
*
* on completion,
* register 15 will contain a return code (RC):
*
* RC=0 - normal completion (always)
*
***********************************************************************




**********************************************************************
*
I255608  CSECT
I255608  AMODE ANY
I255608  RMODE ANY
*
R0       EQU   0
R1       EQU   1
R2       EQU   2
R3       EQU   3
R4       EQU   4
R5       EQU   5
R6       EQU   6
R7       EQU   7
R8       EQU   8
R9       EQU   9
R10      EQU   10   PARM - address of pointer to parameters
R11      EQU   11   BASE - base register of this program
R12      EQU   12   CAA  - reserved for LE
R13      EQU   13   DSA  - Dynamic Storage Area
R14      EQU   14   return address
R15      EQU   15   entry point address
*
DSA      EQU   R13
CAA      EQU   R12
BASE     EQU   R11
*
PARM        EQU   R10        parameters passed caller
USERID      EQU   R9         USERID
PASSWORD    EQU   R8         PASSWORD
NEWPASSWORD EQU   R7         NEWPASSWORD
REPLY       EQU   R6         REPLY
*
            USING PARM_DSECT,PARM
            USING DSA_DSECT,DSA
            USING REPLY_DSECT,REPLY
*
SAF      EQU   R5         base register for RACROUTE parameter list
         USING SAFP,SAF      RACROUTE parameter list
*
**********************************************************************



**********************************************************************
*
         LEMENTRY BASE=BASE,LENGTH=DSA_DSECT_LENGTH,PARAM=PARM TRACE=0
*
* note:
*        PARM -> PARM_DSECT
*        DSA  -> DSA_DSECT
*
***********************************************************************


         LEMTRACE 0,'I255608: entry'


***********************************************************************
*
*        get parameters pased by caller
         L     USERID,PARM_USERID
         L     PASSWORD,PARM_PASSWORD
         L     NEWPASSWORD,PARM_NEWPASSWORD
         L     REPLY,PARM_REPLY
*
***********************************************************************



**********************************************************************
*
*        make parameter list for RACF
*
*        relocate parameter list for RACROUTE macro
         MVC   DSA_RACROUTE,RACROUTE
*
*        issue RACROUTE macro using relocated parameter list
         RACROUTE REQUEST=VERIFY,MF=(E,DSA_RACROUTE),                  X
               USERID=(USERID),                                        X
               PASSWRD=(PASSWORD),                                     X
               NEWPASS=(NEWPASSWORD),                                  X
               PASSCHK=YES,                                            X
               WORKA=DSA_RACF_WORK
*
*        check return code from RACROUTE
         ST   R15,DSA_SAF_RETURN
         LR   2,R15
         LEMTRACE 0,'I255608: return code from RACF: ',(2,B)
*
*        get RACROUTE parameters
         LA   SAF,DSA_RACROUTE
         L    2,SAFPRRET    RACF return code
         L    3,SAFPRREA    RACF reason code
         ST   2,DSA_RACF_RETURN
         ST   3,DSA_RACF_REASON
       LEMTRACE 0,'I255608: RACF return code ',(2,B),', reason ',(3,B)
*
***********************************************************************
*
*        if SAF return code = 0 (ok)
*        then reply = "21" or "22"
B110     EQU   *
         L     R15,DSA_SAF_RETURN
         C     R15,=F'0'
         BNE   B112
*
*        if password changed then "22", else "21"
         CLI   0(NEWPASSWORD),0
         BNE   B111
*
*        password not changed
         MVC   REPLY_LENGTH,=A(2)    length
         MVC   REPLY_MESSAGE(2),=C'21'     "ok, passwort g?ltig"
         B     X100
*
*        password changed
B111     EQU   *
         MVC   REPLY_LENGTH,=A(2)    length
         MVC   REPLY_MESSAGE(2),=C'22'     "ok, passwort ge„ndert"
         B     X100
*
*......................................................................
*
*        if SAF return code = 4  (user not defined)
*        then reply = "23"
B112     EQU   *
         L     R15,DSA_SAF_RETURN
         C     R15,=F'4'
         BNE   B120
         MVC   REPLY_LENGTH,=A(2)    length
         MVC   REPLY_MESSAGE(2),=C'23'      "Benutzer unbekannt"
         B     X100
*
*        SAF return code is 8
B120     EQU   *
*
*        check RACF return code
         L     R15,DSA_RACF_RETURN
         C     R15,=F'4'               "user profile not defined"
         BNE   B121
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'23' "Benutzer unbekannt"
         B     X100
*
*        check RACF return code
B121     EQU   *
         L     R15,DSA_RACF_RETURN
         C     R15,=F'20'              "user not defined to group"
         BNE   B122
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'23' "Benutzer unbekannt"
         B     X100
*
*        check RACF return code
B122     EQU   *
         L     R15,DSA_RACF_RETURN
         C     R15,=F'28'              "user access revoked"
         BNE   B123
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'24' "Benutzer gesperrt"
         B     X100
*
*        check RACF return code
B123     EQU   *
         L     R15,DSA_RACF_RETURN
         C     R15,=F'36'              "user access revoked from group"
         BNE   B124
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'24' "Benutzer gesperrt"
         B     X100
*
*        check RACF return code
B124     EQU   *
         L     R15,DSA_RACF_RETURN
         C     R15,=F'8'               "password not authorized"
         BNE   B125
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'25' "passwort ung?ltig"
         B     X100
*
*        check RACF return code
B125     EQU   *
         L     R15,DSA_RACF_RETURN
         C     R15,=F'12'              "password expired"
         BNE   B126
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'26' "passwort abgelaufen"
         B     X100
*
*        check RACF return code
B126     EQU   *
         L     R15,DSA_RACF_RETURN
         C     R15,=F'16'              "new password invalid"
         BNE   B127
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'27' "neues Passwort ung?ltig"
         B     X100
*
B127     EQU   *
         MVC   REPLY_LENGTH,=A(2)
         MVC   REPLY_MESSAGE(2),=C'29' "unbekannter Fehler"
*
***********************************************************************




**********************************************************************
*
*        return to caller
X100     EQU *
         LEMTRACE 0,'I255608: exit'
*
         LEMEXIT
*
*********************************************************************



*
             DS   0D   D-align what follows:
RACROUTE     RACROUTE REQUEST=VERIFY,MF=L
RACROUTE_END DS   0D
*




***********************************************************************
*
* DSA - Dynamic Storage Area (pointed to by register 13)
*
DSA_DSECT     LEMDSA
*
*......................................................................
*
*  relocated parameter list for RACROUTE macro
*
                 DS   0D   D-align what follows
DSA_RACROUTE     DS   XL(RACROUTE_END-RACROUTE)
*
DSA_RACF_WORK    DS  CL512
*
*......................................................................
*
DSA_SAF_RETURN   DS  F    return code from SAF
DSA_RACF_RETURN  DS  F    return code from RACF
DSA_RACF_REASON  DS  F    reason code from RACF
*
*......................................................................
*
                 DS   0D   D-align what follows
DSA_DSECT_LENGTH EQU  *-DSA_DSECT
*
***********************************************************************



***********************************************************************
*
* the following macro ICHSAFP generates dsect SAFP
* which maps the RACROUTE parameter list in DSA_RACROUTE
*
         ICHSAFP
*
***********************************************************************




***********************************************************************
*
* PARM - parameters passed by caller via register 1
*
PARM_DSECT       DSECT
PARM_USERID      DS  A  pointer to USERID
PARM_PASSWORD    DS  A  pointer to PASSWORD
PARM_NEWPASSWORD DS  A  pointer to NEWPASSWORD
PARM_REPLY       DS  A  pointer to REPLY
*
***********************************************************************
*
* REPLY - reply message pointed to by PARM_REPLY
*
REPLY_DSECT    DSECT
REPLY_LENGTH   DS  F       length of reply message (maximum 80)
REPLY_MESSAGE  DS  CL80    reply message
*
***********************************************************************
        END