1 | XOBSRA ;mjk,esd/alb - VistALink Reauthentication Code ; 05/22/2003 07: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 | ; RPC Server: Reauthentication based on VPID, DUZ, and AV
|
---|
9 | ; ------------------------------------------------------------------------
|
---|
10 | ;
|
---|
11 | SETUPDUZ() ; -- get DUZ context and division
|
---|
12 | ;
|
---|
13 | NEW XOBERR,XOBID,XOBTYPE
|
---|
14 | SET (XOBERR,XOBID)=0
|
---|
15 | ;
|
---|
16 | ; -- if already authenticated quit
|
---|
17 | IF $GET(XOBDATA("XOB RPC","SECURITY","STATE"))="authenticated" GOTO SUDQ
|
---|
18 | ;
|
---|
19 | ; -- switch to null device
|
---|
20 | DO NULL
|
---|
21 | ; -- initialize partition
|
---|
22 | DO INIT
|
---|
23 | ;
|
---|
24 | ; -- check if logons are enabled
|
---|
25 | SET XOBERR=$$LOGINH()
|
---|
26 | IF XOBERR DO SOCKET GOTO SUDQ
|
---|
27 | ;
|
---|
28 | ; -- reauthenticate user based on type
|
---|
29 | SET XOBTYPE=$GET(XOBDATA("XOB RPC","SECURITY","TYPE")),XOBTYPE=$$UP^XLFSTR(XOBTYPE)
|
---|
30 | IF XOBTYPE="DUZ"!(XOBTYPE="AV")!(XOBTYPE="VPID")!(XOBTYPE="CCOW")!(XOBTYPE="APPPROXY") DO
|
---|
31 | . DO @(XOBTYPE_"(.XOBID,.XOBERR)")
|
---|
32 | ELSE DO
|
---|
33 | . SET XOBERR=182301_U_XOBTYPE_U_" [Erroneous reauthentication type]"
|
---|
34 | ;
|
---|
35 | ; -- check division
|
---|
36 | IF XOBID SET XOBERR=$$DUZENV(XOBID,XOBTYPE)
|
---|
37 | ;
|
---|
38 | ; -- switch back to socket device
|
---|
39 | DO SOCKET
|
---|
40 | SUDQ ;
|
---|
41 | ;LOG:: Log error in trap or elsewhere if appropriate. May want to log 'no match' event for security reasons.
|
---|
42 | IF 'XOBERR DO FINAL
|
---|
43 | QUIT XOBERR
|
---|
44 | ;
|
---|
45 | NULL ; switch to null device
|
---|
46 | USE XOBNULL
|
---|
47 | QUIT
|
---|
48 | ;
|
---|
49 | SOCKET ; -- switch back to socket device
|
---|
50 | ; -- empty write buffer of null device
|
---|
51 | USE XOBNULL SET DX=0,DY=0 XECUTE ^%ZOSF("XY")
|
---|
52 | ; -- reset to use tcp port device to send results
|
---|
53 | USE XOBPORT
|
---|
54 | QUIT
|
---|
55 | ;
|
---|
56 | AV(XOBID,XOBERR) ; -- AV (SSO/UC KAAJEE) reauth type
|
---|
57 | ;
|
---|
58 | ; More checks performed here; assume this would be called ONCE when user authenticates
|
---|
59 | ; to application via KAAJEE or FatKAAT
|
---|
60 | ;
|
---|
61 | DO AV^XOBSRAKJ(.XOBID,.XOBERR)
|
---|
62 | QUIT
|
---|
63 | ;
|
---|
64 | DUZ(XOBID,XOBERR) ; -- DUZ reauth type
|
---|
65 | ;
|
---|
66 | NEW XOBCTYPE
|
---|
67 | SET XOBCTYPE="DUZ"
|
---|
68 | SET XOBID=$GET(XOBDATA("XOB RPC","SECURITY","TYPE","VALUE"))
|
---|
69 | ;
|
---|
70 | ; Active user status check performed here; assume heavier-duty checks done by application
|
---|
71 | ; when user authenticated to application via KAAJEE, FatKAAT or equivalent.
|
---|
72 | ;
|
---|
73 | DO ACTUSR(.XOBID,.XOBERR,XOBCTYPE)
|
---|
74 | QUIT
|
---|
75 | ;
|
---|
76 | VPID(XOBID,XOBERR) ; -- VPID reauth type
|
---|
77 | NEW VPID,XOBCTYPE
|
---|
78 | SET XOBID=0
|
---|
79 | SET XOBCTYPE="VPID"
|
---|
80 | ;
|
---|
81 | SET VPID=$GET(XOBDATA("XOB RPC","SECURITY","TYPE","VALUE"))
|
---|
82 | IF VPID]"" SET XOBID=$$IEN^XUPS(VPID)
|
---|
83 | ;
|
---|
84 | IF '+XOBID DO QUIT
|
---|
85 | . SET XOBERR=182301_U_XOBTYPE_U_"["_XOBCTYPE_" Value: '"_VPID_"']"
|
---|
86 | . SET XOBID=0
|
---|
87 | ;
|
---|
88 | ; Active user status check performed here; assume heavier-duty checks done by application
|
---|
89 | ; when user authenticated to application via KAAJEE, FatKAAT or equivalent.
|
---|
90 | ;
|
---|
91 | DO ACTUSR(.XOBID,.XOBERR,XOBCTYPE)
|
---|
92 | QUIT
|
---|
93 | ;
|
---|
94 | APPPROXY(XOBID,XOBERR) ; -- application proxy reauth type
|
---|
95 | ;
|
---|
96 | NEW XOBANAME,XOBCTYPE
|
---|
97 | SET XOBID=0,XOBCTYPE="APPPROXY"
|
---|
98 | SET XOBANAME=$GET(XOBDATA("XOB RPC","SECURITY","TYPE","VALUE"))
|
---|
99 | ;
|
---|
100 | ; APFIND^XUSAP(name) -> returns ien^vpid
|
---|
101 | IF XOBANAME]"" SET XOBID=$PIECE($$APFIND^XUSAP(XOBANAME),U)
|
---|
102 | ; file #200 division mult checking not necessary for app proxy user
|
---|
103 | IF (+XOBID)<1 DO
|
---|
104 | . SET XOBERR=182307_U_XOBANAME_U,XOBID=0
|
---|
105 | QUIT
|
---|
106 | ;
|
---|
107 | CCOW(XOBID,XOBERR) ; -- CCOW reauth type
|
---|
108 | ;
|
---|
109 | ; Very few checks performed here; assume heavier duty checks done by application when originally
|
---|
110 | ; authenticated and created Kernel CCOW token. User would need to be reauthenticated (and perform
|
---|
111 | ; heavier-duty checks) upon Kernel CCOW token expiration.
|
---|
112 | ;
|
---|
113 | DO CCOW^XOBSRAKJ(.XOBID,.XOBERR)
|
---|
114 | QUIT
|
---|
115 | ;
|
---|
116 | ACTUSR(XOBID,XOBERR,XOBCTYPE) ; -- user active status check & error processing
|
---|
117 | ;
|
---|
118 | NEW XOBACTIV
|
---|
119 | SET XOBACTIV=0
|
---|
120 | SET XOBID=$GET(XOBID),XOBCTYPE=$GET(XOBCTYPE)
|
---|
121 | ;
|
---|
122 | ;-- returns active status indicator of user
|
---|
123 | SET XOBACTIV=$$ACTIVE^XUSER(XOBID)
|
---|
124 | IF +XOBACTIV<1 DO
|
---|
125 | . ;
|
---|
126 | . ;-- get dialog entry for error
|
---|
127 | . SET XOBERR=$$GETERR(XOBACTIV,XOBID,XOBCTYPE)
|
---|
128 | . SET XOBID=0
|
---|
129 | QUIT
|
---|
130 | ;
|
---|
131 | DUZENV(XOBDUZ,XOBTYPE) ; -- build DUZ and check division
|
---|
132 | ;
|
---|
133 | ; QUIT 0 if OK, DialogErrorNumber^DialogErrorParameter1^... if bad
|
---|
134 | ;
|
---|
135 | NEW XOBDVARY,XOBDIV,XOBDIVEX,XOBDIVRQ,XOBDUZSV,XOBERR,XOBI,XOBOK
|
---|
136 | SET XOBOK=0,(XOBERR,XOBDIVEX)=""
|
---|
137 | ;
|
---|
138 | ; -- preserve previous DUZ value, restore if needed
|
---|
139 | MERGE XOBDUZSV=DUZ KILL DUZ
|
---|
140 | ;
|
---|
141 | ; -- set up info on passed in user
|
---|
142 | SET DUZ=XOBDUZ
|
---|
143 | SET XOBDIVRQ("STATIONNUMBER")=$GET(XOBDATA("XOB RPC","SECURITY","DIV"))
|
---|
144 | ;
|
---|
145 | DO ; checks
|
---|
146 | .;
|
---|
147 | .; -- if no division passed in
|
---|
148 | . IF XOBDIVRQ("STATIONNUMBER")']"" DO QUIT
|
---|
149 | . . SET XOBERR=182308_U_"no division passed"_U_XOBTYPE_U_XOBDUZ_U_"null"
|
---|
150 | . ;
|
---|
151 | . ; -- is division supported at the site?
|
---|
152 | . SET XOBDIVRQ("IEN")=$$SITECHK(XOBDIVRQ("STATIONNUMBER"))
|
---|
153 | . IF '+XOBDIVRQ("IEN") DO QUIT
|
---|
154 | . . SET XOBERR=182308_U_$P(XOBDIVRQ("IEN"),U,2)_U_XOBTYPE_U_XOBDUZ_U_XOBDIVRQ("STATIONNUMBER")
|
---|
155 | . . KILL XOBDIVRQ("IEN")
|
---|
156 | .;
|
---|
157 | .; -- build DUZ
|
---|
158 | . DO DUZ^XUP(DUZ)
|
---|
159 | .;
|
---|
160 | .; -- don't do user-based checks if reauth type is APPPROXY
|
---|
161 | .IF XOBTYPE="APPPROXY" SET XOBOK=1 QUIT
|
---|
162 | .;
|
---|
163 | .; -- do check for user-permitted divisions
|
---|
164 | . DO DIVGET^XUSRB2(.XOBDIV,DUZ)
|
---|
165 | .;
|
---|
166 | .; -- DIVGET^XUSRB2 return value: if no divisions or one (matching) division, it's good
|
---|
167 | . IF '$GET(XOBDIV(0)) DO QUIT
|
---|
168 | .. IF $GET(DUZ(2))=XOBDIVRQ("IEN") SET XOBOK=1 QUIT ; OK
|
---|
169 | ..;
|
---|
170 | ..; -- if got here, did not match division
|
---|
171 | .. SET XOBERR=182302_U_XOBTYPE_U_XOBDUZ_U_XOBDIVRQ("STATIONNUMBER")
|
---|
172 | .;
|
---|
173 | .; -- DIVGET^XUSRB2 return value: if >1 divisions to select, attempt to set DUZ(2) to div passed in
|
---|
174 | . DO DIVSET^XUSRB2(.XOBOK,"`"_XOBDIVRQ("IEN")) I 'XOBOK DO
|
---|
175 | .. SET XOBERR=182302_U_XOBTYPE_U_XOBDUZ_U_XOBDIVRQ("STATIONNUMBER")
|
---|
176 | ;
|
---|
177 | IF 'XOBOK DO ; A check failed. Clean up partition.
|
---|
178 | .;
|
---|
179 | .; -- reset DUZ
|
---|
180 | . KILL DUZ
|
---|
181 | . MERGE DUZ=XOBDUZSV
|
---|
182 | ;
|
---|
183 | ; -- send back error
|
---|
184 | QUIT $SELECT(XOBOK:0,1:XOBERR)
|
---|
185 | ;
|
---|
186 | LOGINH() ; -- Check if system is currently allowing logins
|
---|
187 | ; Return:
|
---|
188 | ; 181004 : if logins are disabled
|
---|
189 | ; 0 : if logins are allowed
|
---|
190 | ;
|
---|
191 | NEW XOBINH,XQVOL,XUCI,XUENV,XUVOL,X,Y
|
---|
192 | ;
|
---|
193 | ; -- Setup XUENV, XUCI,XQVOL,XUVOL
|
---|
194 | DO XUVOL^XUS
|
---|
195 | ;
|
---|
196 | ; -- Check whether logins are disabled
|
---|
197 | SET XOBINH=$$INHIBIT^XUSRB()
|
---|
198 | QUIT $SELECT(XOBINH:181004,1:0)
|
---|
199 | ;
|
---|
200 | NOACCESS(XOBID) ; -- Determine if user is allowed access via user active status & prohibited times checks
|
---|
201 | ;
|
---|
202 | NEW XOBERR,XOBNOACC,XOBRANGE
|
---|
203 | SET (XOBERR,XOBNOACC)=0
|
---|
204 | ;
|
---|
205 | ; -- user active status check & error processing
|
---|
206 | DO ACTUSR(.XOBID,.XOBERR)
|
---|
207 | ;
|
---|
208 | ; -- check if sign-on is attempted during prohibited times
|
---|
209 | IF 'XOBERR DO
|
---|
210 | . SET XOBRANGE=$$GET1^DIQ(200,XOBID,15)
|
---|
211 | . IF XOBRANGE DO
|
---|
212 | .. SET XOBNOACC=$$PROHIBIT^XUS1A($P($HOROLOG,",",2),XOBRANGE)
|
---|
213 | .. IF XOBNOACC SET XOBERR=182304_U_XOBID_U_"Prohibited time: "_$PIECE(XOBNOACC,U,2)
|
---|
214 | QUIT XOBERR
|
---|
215 | ;
|
---|
216 | VCHG(XOBID) ; -- Check if verify code needs to be changed
|
---|
217 | ; Return:
|
---|
218 | ; 182303^XOBID : if verify code is undefined or expired
|
---|
219 | ; 0 : verify code is current
|
---|
220 | NEW DUZ,I,VCHG,XOPT
|
---|
221 | SET DUZ=+$GET(XOBID),VCHG=0
|
---|
222 | ;
|
---|
223 | ; -- set up XOPT
|
---|
224 | DO XOPT^XUS
|
---|
225 | ;
|
---|
226 | ; -- check if verify code is current
|
---|
227 | IF $$VCVALID^XUSRB() DO
|
---|
228 | . SET VCHG=182303_U_DUZ
|
---|
229 | QUIT VCHG
|
---|
230 | ;
|
---|
231 | INIT ; -- VL-specific or general partition setup before reauthentication process starts
|
---|
232 | ;
|
---|
233 | LOCK
|
---|
234 | SET:$DATA(IO)[0 IO=$IO SET IO(0)=IO
|
---|
235 | KILL ^UTILITY($JOB),^TMP($JOB)
|
---|
236 | KILL ^XUTL("XQ",$JOB)
|
---|
237 | ; -- clean up partition's local symbol table
|
---|
238 | DO KILL^XOBSRA1
|
---|
239 | QUIT
|
---|
240 | ;
|
---|
241 | FINAL ; -- Final setup needed after a re-authentication is performed successfully.
|
---|
242 | ; -- Save DUZ and IO variables in ^XUTL("XQ",$JOB)
|
---|
243 | DO SAVE^XUS1
|
---|
244 | ;
|
---|
245 | ; Change in XUSRB: calls POST2^XUSRB calls CLRFAC^XUS3 to clear Failed Signon Attempts
|
---|
246 | ; file of entry with given IP. Need IO("IP") obtained from ZIO^%ZIS4.
|
---|
247 | ;
|
---|
248 | KILL XQY,XQYQ
|
---|
249 | QUIT
|
---|
250 | ;
|
---|
251 | GETERR(XOBACT,XOBID,XOBCONN) ;-- Get appropriate DIALOG file error
|
---|
252 | ;
|
---|
253 | NEW XOBERR
|
---|
254 | SET XOBERR=0
|
---|
255 | SET XOBACT=$GET(XOBACT),XOBID=$GET(XOBID),XOBCONN=$GET(XOBCONN)
|
---|
256 | ;
|
---|
257 | ;- error indicates that user can't sign on, is DISUSER'd, or is TERMINATED
|
---|
258 | IF $PIECE(XOBACT,U)=0 SET XOBERR=182304_U_XOBID_U_$SELECT($PIECE(XOBACT,U,2)'="":$PIECE(XOBACT,U,2),1:"Unable to Sign On")
|
---|
259 | ;
|
---|
260 | ;- error indicates no user record found
|
---|
261 | IF $PIECE(XOBACT,U)="" DO
|
---|
262 | . SET:XOBCONN="" XOBCONN="Unknown Reauthentication Type"
|
---|
263 | . SET XOBERR=182301_U_XOBCONN_U_" ["_XOBCONN_" reauthentication type, DUZ Value: '"_XOBID_"']"
|
---|
264 | QUIT XOBERR
|
---|
265 | ;
|
---|
266 | SITECHK(XOBSTATN) ; check if valid division for this site
|
---|
267 | ; input: station#
|
---|
268 | ; output: IEN of station# in institution file (if valid for this site)
|
---|
269 | ; 0^error message (if not valid for this site)
|
---|
270 | N XOBSTIEN,XOBSTRIP
|
---|
271 | SET XOBSTRIP=$$STRPSUFF^XOBSCAV1(XOBSTATN)
|
---|
272 | QUIT:((+XOBSTRIP)'=XOBSYS("PRIMARY STATION#")) "0^STATION '"_XOBSTATN_"' is not supported by this M system."
|
---|
273 | S XOBSTIEN=$$IEN^XUAF4(XOBSTATN)
|
---|
274 | QUIT:'+XOBSTIEN "0^STATION '"_XOBSTATN_"' is not a known station number."
|
---|
275 | QUIT:'$$ACTIVE^XUAF4(XOBSTIEN) "0^STATION '"_XOBSTATN_"' is not active on this M system."
|
---|
276 | QUIT XOBSTIEN
|
---|