| [613] | 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 | 
|---|