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 | ;
|
---|