| 1 | XOBSCAV1 ;; kec/oak - VistaLink Access/Verify Security ; [6/28/06 2:26pm] | 
|---|
| 2 | ;;1.5;VistALink Security;**1**;Sep 09, 2005;Build 3 | 
|---|
| 3 | ;;Foundations Toolbox Release v1.5 [Build: 1.5.1.001] | 
|---|
| 4 | ;; | 
|---|
| 5 | QUIT | 
|---|
| 6 | ; | 
|---|
| 7 | ; Access/Verify Security: Security Message Request Handler | 
|---|
| 8 | ; specific message request/response pairs) | 
|---|
| 9 | ; | 
|---|
| 10 | ; ** Setting/Killing of DUZ covered by blanket SAC Kernel exemption for Foundations | 
|---|
| 11 | ; | 
|---|
| 12 | ; ::AV.SetupAndIntroText.Request message processing | 
|---|
| 13 | SENDITXT ; Do Setup and send Intro Text | 
|---|
| 14 | NEW XOBSTINF,XOBITINF,XOBMSG,XOBTMP,XOBTMP1,XOBCCMSK,XOBI,XOBPROD | 
|---|
| 15 | ; | 
|---|
| 16 | IF $$PRODMISM() DO  QUIT | 
|---|
| 17 | . NEW XOBSPAR SET XOBSPAR(1)=$GET(XOBDATA("CLIENTISPRODUCTION")),XOBSPAR(2)=$SELECT($$PROD^XUPROD(0):"true",1:"false") | 
|---|
| 18 | . DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Production-Test Mismatch",183007,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183007,.XOBSPAR))) | 
|---|
| 19 | ; | 
|---|
| 20 | IF $$STATMISM() DO  QUIT | 
|---|
| 21 | . NEW XOBSPAR SET XOBSPAR(1)=$GET(XOBDATA("CLIENTPRIMARYSTATION")),XOBSPAR(2)=XOBSYS("PRIMARY STATION#") | 
|---|
| 22 | . DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Primary Station Mismatch",183010,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183010,.XOBSPAR))) | 
|---|
| 23 | ; | 
|---|
| 24 | ; Do SETUP^XUSRB to setup, then INTRO^XUSRB to get intro text | 
|---|
| 25 | ; NOTE: $$GETPEER^%ZOSV fails for TCP_SERVICES listeners if COM file doesn't set up VISTA$IP logical | 
|---|
| 26 | SET XWBTIP=$$GETPEER^%ZOSV ; XWBTIP needed by SETUP^XUSRB. Use of GETPEER^%ZOSV: DBIA #4056 | 
|---|
| 27 | ; | 
|---|
| 28 | USE XOBNULL ; protect against direct writes to socket | 
|---|
| 29 | ; note: SETUP/INTRO^XUSRB set current IO to null device | 
|---|
| 30 | ; | 
|---|
| 31 | IF XOBSYS("ENV")="j2ee" DO | 
|---|
| 32 | . DO SETUP^XUSRB(.XOBSTINF,"") ; use of SETUP^XUSRB: DBIA #4054 | 
|---|
| 33 | ELSE  DO  QUIT:$GET(DUZ)>0 | 
|---|
| 34 | . SET XWBVER=1.1 ; to allow VistaLink to contact client agent | 
|---|
| 35 | . DO SETUP^XUSRB(.XOBSTINF,"") ; use of SETUP^XUSRB: DBIA #4054 | 
|---|
| 36 | . ; start of auto-signon support | 
|---|
| 37 | . SET DUZ=$$AUTOXWB^XUS1B() IF DUZ<1 KILL DUZ ; use of $$AUTOXWB^XUS1B: DBIA #4060 | 
|---|
| 38 | . IF $GET(DUZ)>0 DO NOW^XUSRB SET XUMSG=$$POST^XUSRB(0) IF XUMSG>0 KILL DUZ ; XUSRB calls: DBIA #4061 | 
|---|
| 39 | . ; do autosignon and quit if DUZ is set | 
|---|
| 40 | . IF $GET(DUZ)>0 DO  QUIT | 
|---|
| 41 | . .USE XOBPORT ; restore current IO (the TCP port) | 
|---|
| 42 | . .SET XOBRET(5)=0 DO LOGFIN | 
|---|
| 43 | . .QUIT | 
|---|
| 44 | . KILL XWBVER ; once auto-signon fails, don't need to contact client agent | 
|---|
| 45 | . ; end of autosignon support | 
|---|
| 46 | ; | 
|---|
| 47 | ;if failed autosignon, continue w/intro text | 
|---|
| 48 | DO INTRO^XUSRB(.XOBITINF) ; use of INTRO^XUSRB: DBIA #4054 | 
|---|
| 49 | ; ** use of USE command covered by blanket SAC Kernel exemption for Foundations | 
|---|
| 50 | USE XOBPORT ; restore current IO (the TCP port) | 
|---|
| 51 | ; | 
|---|
| 52 | SET XOBMSG(1)="<SetupInfo serverName='"_$$CHARCHK^XOBVLIB(XOBSTINF(0))_"' volume='" | 
|---|
| 53 | ; note: next line, "dtime" attribute value is not DTIME, but is the VistaLink heartbeat rate. | 
|---|
| 54 | ;       this is used by the J2SE client code to time out the client dialogs. | 
|---|
| 55 | ;       Value may be replaced w/a signon-specific site parameter later. | 
|---|
| 56 | SET XOBMSG(1)=XOBMSG(1)_$$CHARCHK^XOBVLIB(XOBSTINF(1))_"' uci='"_$$CHARCHK^XOBVLIB(XOBSTINF(2))_"' device='"_$$CHARCHK^XOBVLIB(XOBSTINF(3))_"' numberAttempts='"_$$CHARCHK^XOBVLIB(XOBSTINF(4))_"' dtime='"_$$GETRATE^XOBVLIB()_"'/>" | 
|---|
| 57 | ; add intro text | 
|---|
| 58 | DO GETINTRO^XOBSCAV2("XOBMSG",2) | 
|---|
| 59 | ; | 
|---|
| 60 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGSETUP^XOBSCAV),";;",2),.XOBMSG,$$SUCCESS^XOBSCAV(),$PIECE($TEXT(SCHSETUP^XOBSCAV),";;",2)) | 
|---|
| 61 | QUIT | 
|---|
| 62 | ; ::AV.Logon.Request message processing | 
|---|
| 63 | LOGON ; process login request | 
|---|
| 64 | NEW XOBAC,XOBVC,XOBRET,XOBRETDV | 
|---|
| 65 | ; | 
|---|
| 66 | IF $$LOGGEDON^XOBSCAV DO  QUIT | 
|---|
| 67 | .DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Server Partition State",183003,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183003))) | 
|---|
| 68 | ; | 
|---|
| 69 | KILL DUZ ; if DUZ is around, it shouldn't be. | 
|---|
| 70 | USE XOBNULL ; protect against direct writes to socket | 
|---|
| 71 | ; try to logon w/avcodes | 
|---|
| 72 | DO VALIDAV^XUSRB(.XOBRET,XOBDATA("XOB SECAV","AVCODE")) ; use of VALIDAV^XUSRB: DBIA#4054 | 
|---|
| 73 | USE XOBPORT ; restore current IO (the TCP port) | 
|---|
| 74 | ; | 
|---|
| 75 | ; if bad a/v code credentials | 
|---|
| 76 | IF '+XOBRET(0),'+XOBRET(1),'+XOBRET(2) DO  QUIT | 
|---|
| 77 | . IF XOBSYS("ENV")="j2ee" DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Connector Proxy User Error",183008,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183008,$GET(XOBRET(3))))) | 
|---|
| 78 | . ; look for particular error string which means IP is locked | 
|---|
| 79 | . IF $GET(XOBRET(3))["Device/IP address is locked due" DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Logon Failed",182306,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(182306,$GET(XOBRET(3))))) QUIT | 
|---|
| 80 | . ELSE  DO LOGBADCD | 
|---|
| 81 | ; | 
|---|
| 82 | ; if Kernel says user needs to change verify code | 
|---|
| 83 | IF '+XOBRET(0),'+XOBRET(1),XOBRET(2) DO LOGCVC QUIT | 
|---|
| 84 | ; | 
|---|
| 85 | IF '+XOBRET(0) DO  QUIT  ; there was an error | 
|---|
| 86 | .NEW XOBSPAR | 
|---|
| 87 | .SET XOBSPAR(1)=$GET(XOBRET(3)) | 
|---|
| 88 | .; look for particular error string which means too many invalid signon attempts | 
|---|
| 89 | .IF XOBSPAR(1)["too many invalid sign" DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Logon Failed",183005,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183005,.XOBSPAR))) QUIT | 
|---|
| 90 | .DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Logon Failed",183004,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183004,.XOBSPAR))) | 
|---|
| 91 | ; | 
|---|
| 92 | ; if user requested to change verify code | 
|---|
| 93 | IF XOBDATA("XOB SECAV","REQUESTCVC")="true" DO LOGCVC QUIT | 
|---|
| 94 | ; | 
|---|
| 95 | ; if j2ee, test for connector proxy user | 
|---|
| 96 | IF XOBSYS("ENV")="j2ee" QUIT:'$$ISCPROXY() | 
|---|
| 97 | ; | 
|---|
| 98 | ; at this point login was successful | 
|---|
| 99 | DO LOGFIN | 
|---|
| 100 | QUIT | 
|---|
| 101 | LOGFIN ; check the divisions, finish login now | 
|---|
| 102 | NEW XOBRETDV DO DIVGET^XUSRB2(.XOBRETDV,DUZ) ; use of DIVGET^XUSRB2: DBIA #4055 | 
|---|
| 103 | IF '+XOBRETDV(0) DO  QUIT | 
|---|
| 104 | . DO LOGOK | 
|---|
| 105 | . DO DUZSV^XOBVSYSI(.DUZ) | 
|---|
| 106 | ; otherwise this is a multidivisional user | 
|---|
| 107 | DO LOGSELDV(.XOBRETDV) | 
|---|
| 108 | QUIT | 
|---|
| 109 | LOGBADCD ; response if bad a/v code pair | 
|---|
| 110 | NEW XOBMSG | 
|---|
| 111 | SET XOBMSG(1)="<"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">"_$$CHARCHK^XOBVLIB(XOBRET(3))_"</"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">" | 
|---|
| 112 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGLGON^XOBSCAV),";;",2),.XOBMSG,$$FAILURE^XOBSCAV(),$PIECE($TEXT(SCHSIMPL^XOBSCAV),";;",2)) | 
|---|
| 113 | QUIT | 
|---|
| 114 | LOGCVC ; response if need to change vc | 
|---|
| 115 | NEW XOBMSG,XOBLINE | 
|---|
| 116 | SET XOBLINE=$$POSTTXT^XOBSCAV(.XOBRET,.XOBMSG) | 
|---|
| 117 | SET XOBMSG(XOBLINE+1)="<"_$PIECE($TEXT(PARTTAG^XOBSCAV),";;",2)_" changeVerify=""true"" cvcHelpText="""_$$CHARCHK^XOBVLIB($$AVHLPTXT^XUS2())_""" />" ; use of AVHLPTXT^XUS2: DBIA #4057 | 
|---|
| 118 | SET XOBMSG(XOBLINE+2)="<"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">"_$$CHARCHK^XOBVLIB(XOBRET(3))_"</"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">" | 
|---|
| 119 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGLGON^XOBSCAV),";;",2),.XOBMSG,$$PARTIAL^XOBSCAV(),$PIECE($TEXT(SCHPARTS^XOBSCAV),";;",2)) | 
|---|
| 120 | QUIT | 
|---|
| 121 | LOGSELDV(XOBDIVS) ; response if need to select division | 
|---|
| 122 | ;XOBDIVS is in format of output from DIVGET^XUSRB2 | 
|---|
| 123 | NEW XOBMSG,XOBLINE | 
|---|
| 124 | SET XOBLINE=$$POSTTXT^XOBSCAV(.XOBRET,.XOBMSG) | 
|---|
| 125 | SET XOBLINE=$$ADDDIVS^XOBSCAV(.XOBDIVS,.XOBMSG) | 
|---|
| 126 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGLGON^XOBSCAV),";;",2),.XOBMSG,$$PARTIAL^XOBSCAV(),$PIECE($TEXT(SCHPARTS^XOBSCAV),";;",2)) | 
|---|
| 127 | QUIT | 
|---|
| 128 | LOGOK ; response if everything's looking good | 
|---|
| 129 | NEW XOBMSG,XOBLINE | 
|---|
| 130 | SET XOBLINE=$$POSTTXT^XOBSCAV(.XOBRET,.XOBMSG) | 
|---|
| 131 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGLGON^XOBSCAV),";;",2),.XOBMSG,$$SUCCESS^XOBSCAV(),$PIECE($TEXT(SCHLGON^XOBSCAV),";;",2)) | 
|---|
| 132 | QUIT | 
|---|
| 133 | ; ::AV.Logout.Request message processing | 
|---|
| 134 | LOGOUT ; logout | 
|---|
| 135 | USE XOBNULL ; protect against direct writes to socket | 
|---|
| 136 | ; do the logout | 
|---|
| 137 | DO CLEAN | 
|---|
| 138 | USE XOBPORT ; restore current IO (the TCP port) | 
|---|
| 139 | NEW XOBMSG | 
|---|
| 140 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGLGOUT^XOBSCAV),";;",2),.XOBMSG,$$SUCCESS^XOBSCAV(),$PIECE($TEXT(SCHSIMPL^XOBSCAV),";;",2)) | 
|---|
| 141 | QUIT | 
|---|
| 142 | ; ::Logout to call if connection has timed out | 
|---|
| 143 | CLEAN ; logout | 
|---|
| 144 | DO LOGOUT^XUSRB ; use of LOGOUT^XUSRB: DBIA #4054 | 
|---|
| 145 | QUIT | 
|---|
| 146 | ; ::AV.SelectDivision.Request message processing | 
|---|
| 147 | DIVSLCT ; select division | 
|---|
| 148 | NEW XOBRET | 
|---|
| 149 | IF '+DUZ DO DIVSLCT0("User did not complete the access/verify code login process.") QUIT  ; need DUZ | 
|---|
| 150 | DO DIVSET^XUSRB2(.XOBRET,"`"_XOBDATA("XOB SECAV","SELECTEDDIVISION")) ; use of DIVSET^XUSRB2: DBIA #4055 | 
|---|
| 151 | IF +XOBRET DO  QUIT | 
|---|
| 152 | . DO DIVSLCT1 | 
|---|
| 153 | . DO DUZSV^XOBVSYSI(.DUZ) | 
|---|
| 154 | DO DIVSLCT0("division not found for this user.") | 
|---|
| 155 | QUIT | 
|---|
| 156 | ; | 
|---|
| 157 | DIVSLCT0(XOBTEXT) ; send | 
|---|
| 158 | NEW XOBMSG | 
|---|
| 159 | SET XOBMSG(1)="<"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">"_$$CHARCHK^XOBVLIB(XOBTEXT)_"</"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">" | 
|---|
| 160 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGSELDV^XOBSCAV),";;",2),.XOBMSG,$$FAILURE^XOBSCAV(),$PIECE($TEXT(SCHSIMPL^XOBSCAV),";;",2)) | 
|---|
| 161 | QUIT | 
|---|
| 162 | ; | 
|---|
| 163 | DIVSLCT1 ; success | 
|---|
| 164 | NEW XOBMSG | 
|---|
| 165 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGSELDV^XOBSCAV),";;",2),.XOBMSG,$$SUCCESS^XOBSCAV(),$PIECE($TEXT(SCHSIMPL^XOBSCAV),";;",2)) | 
|---|
| 166 | QUIT | 
|---|
| 167 | ; | 
|---|
| 168 | PRODMISM() ; returns 1 if production mismatch, 0 if not | 
|---|
| 169 | IF XOBSYS("ENV")'="j2ee" QUIT 0 ; skip in c/s mode | 
|---|
| 170 | SET XOBPROD=$SELECT($GET(XOBDATA("CLIENTISPRODUCTION"))="true":1,1:0) | 
|---|
| 171 | IF '(XOBPROD=$$PROD^XUPROD(0)) QUIT 1 | 
|---|
| 172 | QUIT 0 | 
|---|
| 173 | ; | 
|---|
| 174 | STATMISM() ; return 1 if primary station mismatch, 0 if not | 
|---|
| 175 | IF XOBSYS("ENV")'="j2ee" QUIT 0 ; no checking for c/s mode | 
|---|
| 176 | NEW XOBSTAT | 
|---|
| 177 | ; strip off suffix | 
|---|
| 178 | SET XOBSTAT=$$STRPSUFF($GET(XOBDATA("CLIENTPRIMARYSTATION"))) | 
|---|
| 179 | ; compare w/KSP value | 
|---|
| 180 | IF XOBSTAT'=XOBSYS("PRIMARY STATION#") QUIT 1 ;mismatch found | 
|---|
| 181 | QUIT 0 | 
|---|
| 182 | ; | 
|---|
| 183 | STRPSUFF(XOBSTAT) ; strip alpha suffix from sta# e.g. AAC "200M" | 
|---|
| 184 | SET XOBSTAT=+XOBSTAT | 
|---|
| 185 | ; nursing home, treat 9 as suffix | 
|---|
| 186 | IF $LENGTH(XOBSTAT)=4,$E(XOBSTAT,4)=9 SET XOBSTAT=$E(XOBSTAT,1,3) | 
|---|
| 187 | QUIT XOBSTAT | 
|---|
| 188 | ; | 
|---|
| 189 | ISCPROXY() ; c/proxy check | 
|---|
| 190 | ; returns 1 if c/proxy user, 0 if not | 
|---|
| 191 | NEW XOBCPCHK,XOBOK | 
|---|
| 192 | SET XOBOK=1 | 
|---|
| 193 | SET XOBCPCHK=$$CPCHK^XUSAP(+XOBRET(0)) | 
|---|
| 194 | IF 'XOBCPCHK DO  SET XOBOK=0 | 
|---|
| 195 | . DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Connector Proxy User Error",183008,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183008,$PIECE($GET(XOBCPCHK),U,2)))) | 
|---|
| 196 | QUIT XOBOK | 
|---|
| 197 | ; | 
|---|