XOBSCAV ;; kec/oak - VistaLink Access/Verify Security ; 12/09/2002 17:00
;;1.5;VistALink Security;;Sep 09, 2005
;;Foundations Toolbox Release v1.5 [Build: 1.5.0.026]
;;
QUIT
;
; ---------------------------------------------------------------------
; Access/Verify Security: Security Message Request Handler
; (main entry point; utilities; constants)
; ---------------------------------------------------------------------
;
; ==== main entry point ====
;
EN(XOBDATA) ; -- handle parsed messages request
;
IF XOBDATA("XOB SECAV","SECURITYTYPE")'=$$MSGTYP^XOBSCAV("request") DO QUIT
.;this routine should never see a message not of this type.
.NEW XOBSPAR SET XOBSPAR(1)=$$MSGTYP^XOBSCAV("request"),XOBSPAR(2)=XOBDATA("SECURITYTYPE")
.DO ERROR(.XOBR,$PIECE($TEXT(FCLIENT),";;",2),"Unexpected Message Format",183001,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183001,.XOBSPAR)))
;
;---- now process each security message type ----
IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGSETUP),";;",2) DO SENDITXT^XOBSCAV1 QUIT
IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGLGON),";;",2) DO LOGON^XOBSCAV1 QUIT
IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGLGOUT),";;",2) DO LOGOUT^XOBSCAV1 QUIT
IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGSELDV),";;",2) DO DIVSLCT^XOBSCAV1 QUIT
IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGUPDVC),";;",2) DO SENDNVC^XOBSCAV2 QUIT
IF XOBDATA("XOB SECAV","SECURITYACTION")=$PIECE($TEXT(MSGUSERD),";;",2) DO SENDDEM^XOBSCAV2 QUIT
;
; done processing all known message types
NEW XOBSPAR SET XOBSPAR(1)=XOBDATA("XOB SECAV","SECURITYACTION")
DO ERROR(.XOBR,$PIECE($TEXT(FCLIENT),";;",2),"Unexpected Message Format",183002,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183002,.XOBSPAR)))
QUIT
;
; ==== utilities ====
;
SENDSEC(XOBR,XOBMSGTP,XOBRSTYP,XOBMSG,XOBSTAT,XOBSCHEM) ; -- stream XML security reply back
;
; XOBR: internal VistaLink variable
; XOBMSGTP: type of message (e.g., gov.va.med.foundations.security.response)
; XOBRSTYP: type of response (e.g., AV.SetupAndIntroText)
; XOBMSG: message lines to send inside standard wrapper
; XOBSTAT: type of result (e.g., success)
; XOBSCHEM: noNamespaceSchemaLocation
;
NEW XOBFILL
; -- prepare socket for writing
DO PRE^XOBVSKT
; -- write XML header tag and VistaLink tag
DO WRITE^XOBVSKT($$ENVHDR^XOBVLIB(XOBMSGTP,XOBSCHEM))
; -- write SecurityInfo tag
DO WRITE^XOBVSKT("")
; -- write Response opening tag
DO WRITE^XOBVSKT("")
; -- write lines of message passed in
NEW XOBI SET XOBI=0 FOR SET XOBI=$ORDER(XOBMSG(XOBI)) QUIT:'+XOBI DO WRITE^XOBVSKT(XOBMSG(XOBI))
; -- write closing Response tag, closing VistaLink tag
DO WRITE^XOBVSKT("")
DO WRITE^XOBVSKT($$ENVFTR^XOBVLIB())
; -- send eot and flush buffer
DO POST^XOBVSKT
;
KILL XOBDATA("XOB SECAV")
QUIT
;
ERROR(XOBR,XOBFCODE,XOBFSTR,XOBCODE,XOBSTR) ; -- send security error back to client
;
; XOBR: internal VistaLink variable
; XOBFCODE: the fault code
; XOBFSTRING: the fault string
; XOBCODE: error code
; XOBSTR: error message
;
NEW XOBFILL
; -- prepare socket for writing
DO PRE^XOBVSKT
; -- write XML header tag and VistaLink tag
DO WRITE^XOBVSKT($$ENVHDR^XOBVLIB($PIECE($TEXT(ERRTYPE^XOBSCAV),";;",2),$PIECE($TEXT(SCHERROR^XOBSCAV),";;",2)))
; -- write SecurityInfo tag
DO WRITE^XOBVSKT("")
; -- write fault message
DO WRITE^XOBVSKT("")
DO WRITE^XOBVSKT(""_XOBFCODE_"")
DO WRITE^XOBVSKT(""_XOBFSTR_"")
DO WRITE^XOBVSKT("")
DO WRITE^XOBVSKT("")
DO WRITE^XOBVSKT(""_XOBSTR_"")
DO WRITE^XOBVSKT("")
DO WRITE^XOBVSKT("")
DO WRITE^XOBVSKT("")
DO WRITE^XOBVSKT($$ENVFTR^XOBVLIB())
; -- send eot and flush buffer
DO POST^XOBVSKT
; -- log the error/fault unless it's "too many invalid login attempts"
IF XOBCODE'=183005 DO
.DO ^%ZTER
KILL XOBDATA("XOB SECAV")
QUIT
;
POSTTXT(XOBRET,XOBMSG) ; -- adds the post-sign-in-text to a message being prepared
NEW XOBI,XOBLINE,XOBCNT
SET XOBCNT="",XOBLINE=1 FOR SET XOBCNT=$ORDER(XOBMSG(XOBCNT)) QUIT:XOBCNT']"" SET XOBLINE=XOBCNT
SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)=""
; only return post sign in text if the signon says that the text line count is > 0
; (even if, past XOBRET(5), there are actually messages from the post-sign-in text)
IF XOBRET(5)>0 DO
.SET XOBI=5 FOR SET XOBI=$ORDER(XOBRET(XOBI)) QUIT:XOBI']"" DO
..SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)=""_$$CHARCHK^XOBVLIB(XOBRET(XOBI))_""
SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)=""
QUIT XOBLINE
;
ADDDIVS(XOBRET,XOBMSG) ; -- adds division list to a message being prepared
NEW XOBI,XOBLINE,XOBCNT,XOBDEF
SET XOBCNT="",XOBLINE=1 FOR SET XOBCNT=$ORDER(XOBMSG(XOBCNT)) QUIT:XOBCNT']"" SET XOBLINE=XOBCNT
;
SET XOBDEF=$ORDER(^VA(200,DUZ,2,"AX1",1,"")) ; default division if any. Use of ^VA(200,,2,"AX1"): DBIA #4058
SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)="<"_$PIECE($TEXT(PARTTAG),";;",2)_" needDivisionSelection=""true"">"
SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)=""
SET XOBI=0 FOR SET XOBI=$ORDER(XOBDIVS(XOBI)) QUIT:XOBI']"" DO
.SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)=""
SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)=""
SET XOBLINE=XOBLINE+1,XOBMSG(XOBLINE)=" "_$PIECE($TEXT(PARTTAG),";;",2)_">"
;
QUIT XOBLINE
;
LOGGEDON() ; -- checks if the environment was previously properly set up, e.g.,
; logon succeeded in some previous call
QUIT +$GET(DUZ)
;
CRCONTXT(XOBOPTNM) ; -- create the contxt if it doesn't already exist
; INPUT VALUE: XOBOPTNM encoded with Kernel encoding algorithm
; RETURN VALUE: +result will be 1 if successful, or 0 if unsuccessful
; if unsuccessful, result may (or may not) also contain the textual reason for failure
;
; Accessing, Setting and Killing of XQY and XQY0: DBIA #4059
;
NEW XOBRSLT,XOBOPTN1
;
SET XOBOPTN1=$$DECRYP^XUSRB1(XOBOPTNM)
; -- if context already set, quit 1
IF $LENGTH($GET(XQY0)),XQY0=XOBOPTN1 QUIT 1
; -- if param is empty string, then kill off the context
IF XOBOPTN1="" KILL XQY0,XQY QUIT 1
; -- otherwise try to create the context
DO CRCONTXT^XWBSEC(.XOBRSLT,XOBOPTNM) ; use of CRCONTXT^XWBSEC: DBIA #4053
; -- return the result
QUIT XOBRSLT
;
CHKCTXT(XOBRPCNM) ; -- does user have access to RPC?
NEW XWBSEC
DO CHKPRMIT^XWBSEC(XOBRPCNM) ; use of CHKPRMIT^XWBSEC: DBIA # 4053
QUIT:'+$LENGTH($GET(XWBSEC)) 1
QUIT XWBSEC
;
; ==== Constants ====
;
MSGTYP(XOBRQRS) ; return request message type
IF XOBRQRS="request" QUIT $PIECE($TEXT(REQTYPE),";;",2)
IF XOBRQRS="response" QUIT $PIECE($TEXT(RESTYPE),";;",2)
IF XOBRQRS="error" QUIT $PIECE($TEXT(ERRTYPE),";;",2)
QUIT ""
SUCCESS() ; resulttype
QUIT $PIECE($TEXT(RESTYPES+1),";;",2)
FAILURE() ;
QUIT $PIECE($TEXT(RESTYPES+2),";;",2)
PARTIAL() ;
QUIT $PIECE($TEXT(RESTYPES+3),";;",2)
;
RESTYPES ;Result types
;;success
;;failure
;;partialSuccess
;
;Message types
REQTYPE ;;gov.va.med.foundations.security.request
RESTYPE ;;gov.va.med.foundations.security.response
ERRTYPE ;;gov.va.med.foundations.security.fault
;
;Message response types
MSGSETUP ;;AV.SetupAndIntroText
MSGLGON ;;AV.Logon
MSGLGOUT ;;AV.Logout
MSGSELDV ;;AV.SelectDivision
MSGUPDVC ;;AV.UpdateVC
MSGUSERD ;;AV.GetUserDemographics
;
;Attribute values for response XML messages
VRSNSEC ;;1.0
;
;XML Tag names
PARTTAG ;;PartialSuccessData
MSGTAG ;;Message
;
;XML Schemas
SCHERROR ;;secFault.xsd
SCHLGON ;;secLogonResponse.xsd
SCHPARTS ;;secPartialSuccessResponse.xsd
SCHSETUP ;;secSetupIntroResponse.xsd
SCHSIMPL ;;secSimpleResponse.xsd
SCHUSERD ;;secUserDemographicsResponse.xsd
;
;Faultcodes
FSERVER ;;Server
FCLIENT ;;Client
FVERSION ;;VersionMismatch
FUNDERST ;;MustUnderstand