1 | XOBSCAV2 ;; 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 | ; (AV.GetUserDemographics req/resp pairs; XML parser callbacks)
|
---|
10 | ; --------------------------------------------------------------------
|
---|
11 | ;
|
---|
12 | ;==== AV.GetUserDemographics.Request message processing ====
|
---|
13 | SENDDEM ; respond to user demographics request
|
---|
14 | IF '$$LOGGEDON^XOBSCAV() DO SENDDEM0("User not logged on.")
|
---|
15 | DO SENDDEM1
|
---|
16 | QUIT
|
---|
17 | SENDDEM1 ; success
|
---|
18 | NEW XOBMSG,XOBI,XOBNC,XOBNC1,XOBDIV,XOBRET,XOBERR,XOBTXT
|
---|
19 | ; get ptr to Name Components file
|
---|
20 | DO GETS^DIQ(200,DUZ_",","10.1","I","XOBNC","XOBERR")
|
---|
21 | IF $DATA(XOBERR) DO QUIT
|
---|
22 | .SET XOBI=0,XOBTXT="FileMan Error: "
|
---|
23 | .FOR SET XOBI=$ORDER(XOBERR("DIERR",XOBI)) QUIT:'+XOBI SET XOBTXT=XOBTXT_XOBERR("DIERR",XOBI)_" "_XOBERR("DIERR",XOBI,"TEXT",1)
|
---|
24 | .DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Demographics failure",183006,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183006,.XOBTXT)))
|
---|
25 | SET XOBNC=XOBNC(200,DUZ_",",10.1,"I")
|
---|
26 | ; get name components -- read access to file 20: DBIA# 3041
|
---|
27 | DO GETS^DIQ(20,XOBNC_",","1:6","","XOBNC1","XOBERR")
|
---|
28 | IF $DATA(XOBERR) DO QUIT
|
---|
29 | .SET XOBI=0,XOBTXT="FileMan Error: "
|
---|
30 | .FOR SET XOBI=$ORDER(XOBERR("DIERR",XOBI)) QUIT:'+XOBI SET XOBTXT=XOBTXT_XOBERR("DIERR",XOBI)_" "_XOBERR("DIERR",XOBI,"TEXT",1)
|
---|
31 | .DO ERROR^XOBSCAV(.XOBR,$PIECE($TEXT(FSERVER^XOBSCAV),";;",2),"Demographics failure",183006,$$CHARCHK^XOBVLIB($$EZBLD^DIALOG(183006,.XOBTXT)))
|
---|
32 | ; get more userinfo from Kernel
|
---|
33 | DO USERINFO^XUSRB2(.XOBRET) ; use of USERINFO^XUSRB2: DBIA #4055
|
---|
34 | ; strip any illegal xml chars from data
|
---|
35 | FOR XOBI=1:1:7 SET XOBRET(XOBI)=$$CHARCHK^XOBVLIB(XOBRET(XOBI))
|
---|
36 | FOR XOBI=1:1:6 SET XOBNC1(20,XOBNC_",",XOBI)=$$CHARCHK^XOBVLIB(XOBNC1(20,XOBNC_",",XOBI))
|
---|
37 | ; format return message
|
---|
38 | SET XOBMSG(1)="<NameInfo prefix='"_XOBNC1(20,XOBNC_",",4)_"' givenFirst='"_XOBNC1(20,XOBNC_",",2)_"' middle='"_XOBNC1(20,XOBNC_",",3)
|
---|
39 | SET XOBMSG(1)=XOBMSG(1)_"' familyLast='"_XOBNC1(20,XOBNC_",",1)_"' suffix='"_XOBNC1(20,XOBNC_",",5)
|
---|
40 | SET XOBMSG(1)=XOBMSG(1)_"' degree='"_XOBNC1(20,XOBNC_",",6)_"' newPerson01Name='"_XOBRET(1)_"' standardConcatenated='"_XOBRET(2)_"' />"
|
---|
41 | SET XOBMSG(2)="<UserInfo duz='"_DUZ_"' title='"_$$CHARCHK^XOBVLIB(XOBRET(4))_"' serviceSection='"_$$CHARCHK^XOBVLIB(XOBRET(5))_"' language='"_$$CHARCHK^XOBVLIB(XOBRET(6))_"' timeout='"_$$CHARCHK^XOBVLIB(XOBRET(7))
|
---|
42 | SET XOBMSG(2)=XOBMSG(2)_"' vpid='"_$$CHARCHK^XOBVLIB($G(XOBRET(8)))_"' />"
|
---|
43 | SET XOBMSG(3)="<Division ien='"_$$CHARCHK^XOBVLIB($PIECE(XOBRET(3),U))_"' divName='"_$$CHARCHK^XOBVLIB($PIECE(XOBRET(3),U,2))_"' divNumber='"_$$CHARCHK^XOBVLIB($PIECE(XOBRET(3),U,3))_"' />"
|
---|
44 | SET XOBMSG(4)="<SiteInfo domainName='"_$$KSP^XUPARAM("WHERE")_"'/>"
|
---|
45 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGUSERD^XOBSCAV),";;",2),.XOBMSG,$$SUCCESS^XOBSCAV(),$PIECE($TEXT(SCHUSERD^XOBSCAV),";;",2))
|
---|
46 | QUIT
|
---|
47 | SENDDEM0(XOBTEXT) ; failure
|
---|
48 | NEW XOBMSG
|
---|
49 | SET XOBMSG(1)="<"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">"_$$CHARCHK^XOBVLIB(XOBTEXT)_"</"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">"
|
---|
50 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGUSERD^XOBSCAV),";;",2),.XOBMSG,$$FAILURE^XOBSCAV(),$PIECE($TEXT(SCHSIMPL^XOBSCAV),";;",2))
|
---|
51 | QUIT
|
---|
52 | ;
|
---|
53 | ; ==== SAX Parser Callbacks ====
|
---|
54 | ;
|
---|
55 | ELEST(ELE,ATR) ; -- element start event handler
|
---|
56 | ;
|
---|
57 | IF ELE="VistaLink" DO QUIT
|
---|
58 | . SET XOBDATA("MODE")=$GET(ATR("mode"),"singleton")
|
---|
59 | . SET XOBDATA("XOB SECAV","SECURITYTYPE")=$GET(ATR("messageType"),"unknown")
|
---|
60 | ;
|
---|
61 | IF ELE="SecurityInfo" DO QUIT
|
---|
62 | . SET XOBDATA("XOB SECAV","SECURITYVERSION")=$GET(ATR("version"),"unknown")
|
---|
63 | ;
|
---|
64 | IF ELE="Request" DO QUIT
|
---|
65 | . SET XOBDATA("XOB SECAV","SECURITYACTION")=$GET(ATR("type"),"unknown")
|
---|
66 | ;
|
---|
67 | IF XOBDATA("XOB SECAV","SECURITYTYPE")'=$$MSGTYP^XOBSCAV("request") DO QUIT
|
---|
68 | .;if not a security request, shouldn't be here
|
---|
69 | .;
|
---|
70 | IF '$DATA(XOBDATA("XOB SECAV","SECURITYACTION")) DO QUIT
|
---|
71 | .;if haven't processed the "action" yet, shouldn't be here
|
---|
72 | ;
|
---|
73 | IF XOBDATA("XOB SECAV","SECURITYACTION")="AV.SetupAndIntroText" DO QUIT
|
---|
74 | . IF ELE="productionInfo" DO
|
---|
75 | . . SET XOBDATA("CLIENTISPRODUCTION")=$GET(ATR("clientIsProduction"))
|
---|
76 | . . SET XOBDATA("CLIENTPRIMARYSTATION")=$GET(ATR("clientPrimaryStation"))
|
---|
77 | ;
|
---|
78 | IF XOBDATA("XOB SECAV","SECURITYACTION")="AV.GetUserDemographics" DO QUIT
|
---|
79 | .; nothing needed
|
---|
80 | .;
|
---|
81 | IF XOBDATA("XOB SECAV","SECURITYACTION")="AV.Logon" DO QUIT
|
---|
82 | .IF ELE="avCodes" SET XOBAVCOD=""
|
---|
83 | .SET XOBDATA("XOB SECAV","REQUESTCVC")=$GET(ATR("requestCvc"))
|
---|
84 | ;
|
---|
85 | IF XOBDATA("XOB SECAV","SECURITYACTION")="AV.Logout" DO QUIT
|
---|
86 | .; nothing needed
|
---|
87 | ;
|
---|
88 | IF XOBDATA("XOB SECAV","SECURITYACTION")="AV.SelectDivision" DO QUIT
|
---|
89 | .IF ELE="Division" SET XOBDATA("XOB SECAV","SELECTEDDIVISION")=$GET(ATR("ien"))
|
---|
90 | ;
|
---|
91 | IF XOBDATA("XOB SECAV","SECURITYACTION")="AV.UpdateVC" DO QUIT
|
---|
92 | .IF ELE="oldVc" SET XOBVCOLD="" QUIT
|
---|
93 | .IF ELE="newVc" SET XOBVCNEW="" QUIT
|
---|
94 | .IF ELE="confirmedVc" SET XOBVCCHK="" QUIT
|
---|
95 | ;
|
---|
96 | ;If got here -- an unknown type, ignore.
|
---|
97 | ;
|
---|
98 | QUIT
|
---|
99 | ;
|
---|
100 | ELEND(ELE) ; -- element end event handler
|
---|
101 | ;
|
---|
102 | IF ELE="VistaLink" KILL XOBAVCOD,XOBVCOLD,XOBVCNEW,XOBVCCHK QUIT
|
---|
103 | IF $GET(XOBDATA("XOB SECAV","SECURITYACTION"))="AV.Logon",ELE="avCodes" DO QUIT
|
---|
104 | .SET XOBDATA("XOB SECAV","AVCODE")=XOBAVCOD KILL XOBAVCOD
|
---|
105 | IF $GET(XOBDATA("XOB SECAV","SECURITYACTION"))="AV.UpdateVC" DO QUIT
|
---|
106 | .IF ELE="oldVc" SET XOBDATA("XOB SECAV","OLDVC")=XOBVCOLD KILL XOBVCOLD QUIT
|
---|
107 | .IF ELE="newVc" SET XOBDATA("XOB SECAV","NEWVC")=XOBVCNEW KILL XOBVCNEW QUIT
|
---|
108 | .IF ELE="confirmedVc" SET XOBDATA("XOB SECAV","NEWVCCHECK")=XOBVCCHK KILL XOBVCCHK QUIT
|
---|
109 | .;shouldn't get here.
|
---|
110 | QUIT
|
---|
111 | ;
|
---|
112 | CHR(TEXT) ; -- character value event handler <tag>TEXT</tag)
|
---|
113 | ; -- need to concatenate because MXML parses on ENTITY characters (<>& etc.) and
|
---|
114 | ; callback gets hit multiple times even though the tag text value is just one piece of data.
|
---|
115 | ; (Yes, this seems kludgie!)
|
---|
116 | IF $DATA(XOBAVCOD) SET XOBAVCOD=XOBAVCOD_TEXT QUIT
|
---|
117 | IF $DATA(XOBVCOLD) SET XOBVCOLD=XOBVCOLD_TEXT QUIT
|
---|
118 | IF $DATA(XOBVCNEW) SET XOBVCNEW=XOBVCNEW_TEXT QUIT
|
---|
119 | IF $DATA(XOBVCCHK) SET XOBVCCHK=XOBVCCHK_TEXT QUIT
|
---|
120 | QUIT
|
---|
121 | ;==== AV.UpdateVC.Request message processing ====
|
---|
122 | SENDNVC ; respond to "change verify code" request. Use of CVC^XUSRB per DBIA #4054
|
---|
123 | NEW XOBRET,XOBRETDV,XOBSDUZ
|
---|
124 | SET XOBSDUZ=DUZ ; save DUZ in case of failure - we need to restore
|
---|
125 | DO CVC^XUSRB(.XOBRET,XOBDATA("XOB SECAV","OLDVC")_U_XOBDATA("XOB SECAV","NEWVC")_U_XOBDATA("XOB SECAV","NEWVCCHECK"))
|
---|
126 | IF +$GET(DUZ) DO QUIT ; success changing verify code
|
---|
127 | .; check the divisions now
|
---|
128 | .DO DIVGET^XUSRB2(.XOBRETDV,DUZ) ; use of DIVGET^XUSRB2: DBIA #4055
|
---|
129 | .IF '+XOBRETDV(0) DO SENDNVC1 QUIT
|
---|
130 | .; otherwise this is a multidivisional user
|
---|
131 | .DO SENDNVCD(.XOBRETDV)
|
---|
132 | ; cvc failed
|
---|
133 | SET DUZ=XOBSDUZ ; restore DUZ
|
---|
134 | DO SENDNVC0 ; failure
|
---|
135 | QUIT
|
---|
136 | SENDNVC1 ; send verify code update success
|
---|
137 | ;update the vc/finish the logon
|
---|
138 | NEW XOBMSG
|
---|
139 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGUPDVC^XOBSCAV),";;",2),.XOBMSG,$$SUCCESS^XOBSCAV(),$PIECE($TEXT(SCHSIMPL^XOBSCAV),";;",2))
|
---|
140 | QUIT
|
---|
141 | SENDNVC0 ; send verify code update error
|
---|
142 | ;update the vc/finish the logon
|
---|
143 | NEW XOBMSG,XOBI
|
---|
144 | SET XOBMSG(1)="<"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">"_$$CHARCHK^XOBVLIB($GET(XOBRET(1)))_"</"_$PIECE($TEXT(MSGTAG^XOBSCAV),";;",2)_">"
|
---|
145 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGUPDVC^XOBSCAV),";;",2),.XOBMSG,$$FAILURE^XOBSCAV(),$PIECE($TEXT(SCHSIMPL^XOBSCAV),";;",2))
|
---|
146 | QUIT
|
---|
147 | SENDNVCD(XOBDIVS) ; send verify code partial success, need divisions
|
---|
148 | ;XOBDIVS is in format of output from DIVGET^XUSRB2
|
---|
149 | NEW XOBMSG,XOBI,XOBLINE
|
---|
150 | SET XOBLINE=$$ADDDIVS^XOBSCAV(.XOBDIVS,.XOBMSG)
|
---|
151 | DO SENDSEC^XOBSCAV(.XOBR,$PIECE($TEXT(RESTYPE^XOBSCAV),";;",2),$PIECE($TEXT(MSGUPDVC^XOBSCAV),";;",2),.XOBMSG,$$PARTIAL^XOBSCAV(),$PIECE($TEXT(SCHPARTS^XOBSCAV),";;",2))
|
---|
152 | QUIT
|
---|
153 | ;
|
---|
154 | ;==== utility functions ====
|
---|
155 | ;
|
---|
156 | GETINTRO(XOBSREF,XOBSCNTR) ;
|
---|
157 | ; XOBSREF: variable in which to store intro text (at one level descendant)
|
---|
158 | ; XOBSCNT: integer subscript counter value at which to start storing text
|
---|
159 | ; returns: XOBSREF containing <IntroText> element text with intro text lines in CDATA section
|
---|
160 | ; XOBSCNT incremented to last subscript at which text was stored (if passed as dot-arg)
|
---|
161 | ;
|
---|
162 | NEW XOBCCMSK,XOBI,XOBITINF,XOBTMP1
|
---|
163 | ; get intro text
|
---|
164 | DO INTRO^XUSRB(.XOBITINF) ; use of INTRO^XUSRB: DBIA #4054
|
---|
165 | ; set up control character mask
|
---|
166 | SET XOBCCMSK="" FOR XOBI=0:1:8,11,12,14:1:31 SET XOBCCMSK=XOBCCMSK_$CHAR(XOBI)
|
---|
167 | ; populate/format return value
|
---|
168 | SET @XOBSREF@(XOBSCNTR)="<IntroText><![CDATA["
|
---|
169 | SET XOBTMP1=-1 FOR SET XOBTMP1=$ORDER(XOBITINF(XOBTMP1)) QUIT:XOBTMP1']"" DO
|
---|
170 | .SET XOBSCNTR=XOBSCNTR+1,@XOBSREF@(XOBSCNTR)=$TRANSLATE(XOBITINF(XOBTMP1),XOBCCMSK,"")_"<BR>"
|
---|
171 | SET XOBSCNTR=XOBSCNTR+1,@XOBSREF@(XOBSCNTR)="]]></IntroText>"
|
---|
172 | QUIT
|
---|
173 | ;
|
---|