| 1 | XOBSCAV ;; kec/oak - VistaLink Access/Verify Security ; 12/09/2002  17:00 | 
|---|
| 2 | ;;1.5;VistALink Security;;Sep 09, 2005 | 
|---|
| 3 | ;;Foundations Toolbox Release v1.5 [Build: 1.5.0.026] | 
|---|
| 4 | ;; | 
|---|
| 5 | QUIT | 
|---|
| 6 | ; | 
|---|
| 7 | ; --------------------------------------------------------------------- | 
|---|
| 8 | ;      Access/Verify Security: Security Message Request Handler | 
|---|
| 9 | ;             (main entry point; utilities; constants) | 
|---|
| 10 | ; --------------------------------------------------------------------- | 
|---|
| 11 | ; | 
|---|
| 12 | ; ==== main entry point ==== | 
|---|
| 13 | ; | 
|---|
| 14 | EN(XOBDATA) ; -- handle parsed messages request | 
|---|
| 15 | ; | 
|---|
| 16 | IF XOBDATA("XOB SECAV","SECURITYTYPE")'=$$MSGTYP^XOBSCAV("request") DO  QUIT | 
|---|
| 17 | .;this routine should never see a message not of this type. | 
|---|
| 18 | .NEW XOBSPAR SET XOBSPAR(1)=$$MSGTYP^XOBSCAV("request"),XOBSPAR(2)=XOBDATA("SECURITYTYPE") | 
|---|
| 19 | .DO ERROR(.XOBR,$PIECE($TEXT(FCLIENT),";;",2),"Unexpected Message Format",183001,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183001,.XOBSPAR))) | 
|---|
| 20 | ; | 
|---|
| 21 | ;---- now process each security message type ---- | 
|---|
| 22 | IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGSETUP),";;",2) DO SENDITXT^XOBSCAV1 QUIT | 
|---|
| 23 | IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGLGON),";;",2) DO LOGON^XOBSCAV1 QUIT | 
|---|
| 24 | IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGLGOUT),";;",2) DO LOGOUT^XOBSCAV1 QUIT | 
|---|
| 25 | IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGSELDV),";;",2) DO DIVSLCT^XOBSCAV1 QUIT | 
|---|
| 26 | IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGUPDVC),";;",2) DO SENDNVC^XOBSCAV2 QUIT | 
|---|
| 27 | IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGUSERD),";;",2) DO SENDDEM^XOBSCAV2 QUIT | 
|---|
| 28 | ; | 
|---|
| 29 | ; done processing all known message types | 
|---|
| 30 | NEW XOBSPAR SET XOBSPAR(1)=XOBDATA("XOB SECAV","SECURITYACTION") | 
|---|
| 31 | DO ERROR(.XOBR,$PIECE($TEXT(FCLIENT),";;",2),"Unexpected Message Format",183002,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183002,.XOBSPAR))) | 
|---|
| 32 | QUIT | 
|---|
| 33 | ; | 
|---|
| 34 | ; ==== utilities ==== | 
|---|
| 35 | ; | 
|---|
| 36 | SENDSEC(XOBR,XOBMSGTP,XOBRSTYP,XOBMSG,XOBSTAT,XOBSCHEM) ; -- stream XML security reply back | 
|---|
| 37 | ; | 
|---|
| 38 | ; XOBR: internal VistaLink variable | 
|---|
| 39 | ; XOBMSGTP: type of message (e.g., gov.va.med.foundations.security.response) | 
|---|
| 40 | ; XOBRSTYP: type of response (e.g., AV.SetupAndIntroText) | 
|---|
| 41 | ; XOBMSG: message lines to send inside standard wrapper | 
|---|
| 42 | ; XOBSTAT: type of result (e.g., success) | 
|---|
| 43 | ; XOBSCHEM: noNamespaceSchemaLocation | 
|---|
| 44 | ; | 
|---|
| 45 | NEW XOBFILL | 
|---|
| 46 | ; -- prepare socket for writing | 
|---|
| 47 | DO PRE^XOBVSKT | 
|---|
| 48 | ; -- write XML header tag and VistaLink tag | 
|---|
| 49 | DO WRITE^XOBVSKT($$ENVHDR^XOBVLIB(XOBMSGTP,XOBSCHEM)) | 
|---|
| 50 | ; -- write SecurityInfo tag | 
|---|
| 51 | DO WRITE^XOBVSKT("<SecurityInfo version="""_$PIECE($TEXT(VRSNSEC),";;",2)_""" />") | 
|---|
| 52 | ; -- write Response opening tag | 
|---|
| 53 | DO WRITE^XOBVSKT("<Response type="""_XOBRSTYP_""" status="""_XOBSTAT_""">") | 
|---|
| 54 | ; -- write lines of message passed in | 
|---|
| 55 | NEW XOBI SET XOBI=0 FOR  SET XOBI=$ORDER(XOBMSG(XOBI))  QUIT:'+XOBI  DO WRITE^XOBVSKT(XOBMSG(XOBI)) | 
|---|
| 56 | ; -- write closing Response tag, closing VistaLink tag | 
|---|
| 57 | DO WRITE^XOBVSKT("</Response>") | 
|---|
| 58 | DO WRITE^XOBVSKT($$ENVFTR^XOBVLIB()) | 
|---|
| 59 | ; -- send eot and flush buffer | 
|---|
| 60 | DO POST^XOBVSKT | 
|---|
| 61 | ; | 
|---|
| 62 | KILL XOBDATA("XOB SECAV") | 
|---|
| 63 | QUIT | 
|---|
| 64 | ; | 
|---|
| 65 | ERROR(XOBR,XOBFCODE,XOBFSTR,XOBCODE,XOBSTR) ; -- send security error back to client | 
|---|
| 66 | ; | 
|---|
| 67 | ; XOBR: internal VistaLink variable | 
|---|
| 68 | ; XOBFCODE: the fault code | 
|---|
| 69 | ; XOBFSTRING: the fault string | 
|---|
| 70 | ; XOBCODE: error code | 
|---|
| 71 | ; XOBSTR: error message | 
|---|
| 72 | ; | 
|---|
| 73 | NEW XOBFILL | 
|---|
| 74 | ; -- prepare socket for writing | 
|---|
| 75 | DO PRE^XOBVSKT | 
|---|
| 76 | ; -- write XML header tag and VistaLink tag | 
|---|
| 77 | DO WRITE^XOBVSKT($$ENVHDR^XOBVLIB($PIECE($TEXT(ERRTYPE^XOBSCAV),";;",2),$PIECE($TEXT(SCHERROR^XOBSCAV),";;",2))) | 
|---|
| 78 | ; -- write SecurityInfo tag | 
|---|
| 79 | DO WRITE^XOBVSKT("<SecurityInfo version="""_$PIECE($TEXT(VRSNSEC),";;",2)_""" />") | 
|---|
| 80 | ; -- write fault message | 
|---|
| 81 | DO WRITE^XOBVSKT("<Fault>") | 
|---|
| 82 | DO WRITE^XOBVSKT("<FaultCode>"_XOBFCODE_"</FaultCode>") | 
|---|
| 83 | DO WRITE^XOBVSKT("<FaultString>"_XOBFSTR_"</FaultString>") | 
|---|
| 84 | DO WRITE^XOBVSKT("<Detail>") | 
|---|
| 85 | DO WRITE^XOBVSKT("<Error code="""_XOBCODE_""">") | 
|---|
| 86 | DO WRITE^XOBVSKT("<Message>"_XOBSTR_"</Message>") | 
|---|
| 87 | DO WRITE^XOBVSKT("</Error>") | 
|---|
| 88 | DO WRITE^XOBVSKT("</Detail>") | 
|---|
| 89 | DO WRITE^XOBVSKT("</Fault>") | 
|---|
| 90 | DO WRITE^XOBVSKT($$ENVFTR^XOBVLIB()) | 
|---|
| 91 | ; -- send eot and flush buffer | 
|---|
| 92 | DO POST^XOBVSKT | 
|---|
| 93 | ; -- log the error/fault unless it's "too many invalid login attempts" | 
|---|
| 94 | IF XOBCODE'=183005 DO | 
|---|
| 95 | .DO ^%ZTER | 
|---|
| 96 | KILL XOBDATA("XOB SECAV") | 
|---|
| 97 | QUIT | 
|---|
| 98 | ; | 
|---|
| 99 | POSTTXT(XOBRET,XOBMSG) ; -- adds the post-sign-in-text to a message being prepared | 
|---|
| 100 | NEW XOBI,XOBLINE,XOBCNT | 
|---|
| 101 | SET XOBCNT="",XOBLINE=1 FOR  SET XOBCNT=$ORDER(XOBMSG(XOBCNT)) QUIT:XOBCNT']""  SET XOBLINE=XOBCNT | 
|---|
| 102 | SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="<PostSignInText>" | 
|---|
| 103 | ; only return post sign in text if the signon says that the text line count is > 0 | 
|---|
| 104 | ; (even if, past XOBRET(5), there are actually messages from the post-sign-in text) | 
|---|
| 105 | IF XOBRET(5)>0 DO | 
|---|
| 106 | .SET XOBI=5 FOR  SET XOBI=$ORDER(XOBRET(XOBI)) QUIT:XOBI']""  DO | 
|---|
| 107 | ..SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="<Line>"_$$CHARCHK^XOBVLIB(XOBRET(XOBI))_"</Line>" | 
|---|
| 108 | SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="</PostSignInText>" | 
|---|
| 109 | QUIT XOBLINE | 
|---|
| 110 | ; | 
|---|
| 111 | ADDDIVS(XOBRET,XOBMSG) ; -- adds division list to a message being prepared | 
|---|
| 112 | NEW XOBI,XOBLINE,XOBCNT,XOBDEF | 
|---|
| 113 | SET XOBCNT="",XOBLINE=1 FOR  SET XOBCNT=$ORDER(XOBMSG(XOBCNT)) QUIT:XOBCNT']""  SET XOBLINE=XOBCNT | 
|---|
| 114 | ; | 
|---|
| 115 | SET XOBDEF=$ORDER(^VA(200,DUZ,2,"AX1",1,"")) ; default division if any. Use of ^VA(200,,2,"AX1"): DBIA #4058 | 
|---|
| 116 | SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="<"_$PIECE($TEXT(PARTTAG),";;",2)_" needDivisionSelection=""true"">" | 
|---|
| 117 | SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="<Divisions>" | 
|---|
| 118 | SET XOBI=0 FOR  SET XOBI=$ORDER(XOBDIVS(XOBI)) QUIT:XOBI']""  DO | 
|---|
| 119 | .SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="<Division ien="""_$PIECE(XOBDIVS(XOBI),U)_""" divName="""_$$CHARCHK^XOBVLIB($PIECE(XOBDIVS(XOBI),U,2))_""" divNumber="""_$$CHARCHK^XOBVLIB($PIECE(XOBDIVS(XOBI),U,3))_"""" | 
|---|
| 120 | .SET:($PIECE(XOBDIVS(XOBI),U)=XOBDEF) XOBMSG(XOBLINE)=XOBMSG(XOBLINE)_" default=""true"" " | 
|---|
| 121 | .SET XOBMSG(XOBLINE)=XOBMSG(XOBLINE)_" />" | 
|---|
| 122 | SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="</Divisions>" | 
|---|
| 123 | SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="   </"_$PIECE($TEXT(PARTTAG),";;",2)_">" | 
|---|
| 124 | ; | 
|---|
| 125 | QUIT XOBLINE | 
|---|
| 126 | ; | 
|---|
| 127 | LOGGEDON() ; -- checks if the environment was previously properly set up, e.g., | 
|---|
| 128 | ; logon succeeded in some previous call | 
|---|
| 129 | QUIT +$GET(DUZ) | 
|---|
| 130 | ; | 
|---|
| 131 | CRCONTXT(XOBOPTNM) ; -- create the contxt if it doesn't already exist | 
|---|
| 132 | ; INPUT VALUE: XOBOPTNM encoded with Kernel encoding algorithm | 
|---|
| 133 | ; RETURN VALUE: +result will be 1 if successful, or 0 if unsuccessful | 
|---|
| 134 | ; if unsuccessful, result may (or may not) also contain the textual reason for failure | 
|---|
| 135 | ; | 
|---|
| 136 | ; Accessing, Setting and Killing of XQY and XQY0: DBIA #4059 | 
|---|
| 137 | ; | 
|---|
| 138 | NEW XOBRSLT,XOBOPTN1 | 
|---|
| 139 | ; | 
|---|
| 140 | SET XOBOPTN1=$$DECRYP^XUSRB1(XOBOPTNM) | 
|---|
| 141 | ; -- if context already set, quit 1 | 
|---|
| 142 | IF $LENGTH($GET(XQY0)),XQY0=XOBOPTN1 QUIT 1 | 
|---|
| 143 | ; -- if param is empty string, then kill off the context | 
|---|
| 144 | IF XOBOPTN1="" KILL XQY0,XQY QUIT 1 | 
|---|
| 145 | ; -- otherwise try to create the context | 
|---|
| 146 | DO CRCONTXT^XWBSEC(.XOBRSLT,XOBOPTNM) ; use of CRCONTXT^XWBSEC: DBIA #4053 | 
|---|
| 147 | ; -- return the result | 
|---|
| 148 | QUIT XOBRSLT | 
|---|
| 149 | ; | 
|---|
| 150 | CHKCTXT(XOBRPCNM) ; -- does user have access to RPC? | 
|---|
| 151 | NEW XWBSEC | 
|---|
| 152 | DO CHKPRMIT^XWBSEC(XOBRPCNM) ; use of CHKPRMIT^XWBSEC: DBIA # 4053 | 
|---|
| 153 | QUIT:'+$LENGTH($GET(XWBSEC)) 1 | 
|---|
| 154 | QUIT XWBSEC | 
|---|
| 155 | ; | 
|---|
| 156 | ; ==== Constants ==== | 
|---|
| 157 | ; | 
|---|
| 158 | MSGTYP(XOBRQRS) ; return request message type | 
|---|
| 159 | IF XOBRQRS="request" QUIT $PIECE($TEXT(REQTYPE),";;",2) | 
|---|
| 160 | IF XOBRQRS="response" QUIT $PIECE($TEXT(RESTYPE),";;",2) | 
|---|
| 161 | IF XOBRQRS="error" QUIT $PIECE($TEXT(ERRTYPE),";;",2) | 
|---|
| 162 | QUIT "" | 
|---|
| 163 | SUCCESS() ; resulttype | 
|---|
| 164 | QUIT $PIECE($TEXT(RESTYPES+1),";;",2) | 
|---|
| 165 | FAILURE() ; | 
|---|
| 166 | QUIT $PIECE($TEXT(RESTYPES+2),";;",2) | 
|---|
| 167 | PARTIAL() ; | 
|---|
| 168 | QUIT $PIECE($TEXT(RESTYPES+3),";;",2) | 
|---|
| 169 | ; | 
|---|
| 170 | RESTYPES ;Result types | 
|---|
| 171 | ;;success | 
|---|
| 172 | ;;failure | 
|---|
| 173 | ;;partialSuccess | 
|---|
| 174 | ; | 
|---|
| 175 | ;Message types | 
|---|
| 176 | REQTYPE ;;gov.va.med.foundations.security.request | 
|---|
| 177 | RESTYPE ;;gov.va.med.foundations.security.response | 
|---|
| 178 | ERRTYPE ;;gov.va.med.foundations.security.fault | 
|---|
| 179 | ; | 
|---|
| 180 | ;Message response types | 
|---|
| 181 | MSGSETUP ;;AV.SetupAndIntroText | 
|---|
| 182 | MSGLGON ;;AV.Logon | 
|---|
| 183 | MSGLGOUT ;;AV.Logout | 
|---|
| 184 | MSGSELDV ;;AV.SelectDivision | 
|---|
| 185 | MSGUPDVC ;;AV.UpdateVC | 
|---|
| 186 | MSGUSERD ;;AV.GetUserDemographics | 
|---|
| 187 | ; | 
|---|
| 188 | ;Attribute values for response XML messages | 
|---|
| 189 | VRSNSEC ;;1.0 | 
|---|
| 190 | ; | 
|---|
| 191 | ;XML Tag names | 
|---|
| 192 | PARTTAG ;;PartialSuccessData | 
|---|
| 193 | MSGTAG ;;Message | 
|---|
| 194 | ; | 
|---|
| 195 | ;XML Schemas | 
|---|
| 196 | SCHERROR ;;secFault.xsd | 
|---|
| 197 | SCHLGON ;;secLogonResponse.xsd | 
|---|
| 198 | SCHPARTS ;;secPartialSuccessResponse.xsd | 
|---|
| 199 | SCHSETUP ;;secSetupIntroResponse.xsd | 
|---|
| 200 | SCHSIMPL ;;secSimpleResponse.xsd | 
|---|
| 201 | SCHUSERD ;;secUserDemographicsResponse.xsd | 
|---|
| 202 | ; | 
|---|
| 203 | ;Faultcodes | 
|---|
| 204 | FSERVER ;;Server | 
|---|
| 205 | FCLIENT ;;Client | 
|---|
| 206 | FVERSION ;;VersionMismatch | 
|---|
| 207 | FUNDERST ;;MustUnderstand | 
|---|