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