XUSRB4 ;ISF/RWF - Build a temporary sign-on token ;01/29/14 14:56
;;8.0;KERNEL;**150,337,395,419,437,499,523,573,596,638,659**;Jul 10, 1995;Build 22
;Per VA Directive 6402, this routine should not be modified.
Q
;
ASH(RET) ;rpc. Auto Signon Handle
N HDL
;Do not give token to user with authentication Level Of Assurance = 1, as they then would
;have the ability to re-authenticate at a higher Level Of Assurance (spoofing).
S RET="NOT AUTHENTICATED"
I $G(DUZ)<1 Q ;Not an authenticated user
I $G(DUZ("LOA"))=1 Q ;Not an authenticated user
S HDL=$$HANDLE("XWBAS",1),RET="~1"_HDL
;Now place user info in it.
D TOK(HDL)
Q
;
CCOW(RET) ;rpc. CCOW Auto Signon Handle
N HDL,HDL2,X
S RET(0)="NO PROXY USER",RET(1)="ERROR"
I $$USERTYPE^XUSAP(DUZ,"APPLICATION PROXY") Q ;No Proxy
I $$USERTYPE^XUSAP(DUZ,"CONNECTOR PROXY") Q ;No Proxy
;Do not give token to user with authentication Level Of Assurance = 1, as they then would
;have the ability to re-authenticate at a higher Level Of Assurance (spoofing).
S RET(0)="NOT AUTHENTICATED",RET(1)="ERROR"
I $G(DUZ("LOA"))=1 Q ;Not an authenticated user
S X=$$ACTIVE^XUSER(DUZ) I 'X S RET(0)=X Q ;User must be active
S HDL=$$HANDLE("XWBCCW",1)
;Return RET(0) the CCOW token, RET(1) the domain name and the Station #
S RET(0)="~2"_$$LOW^XLFSTR(HDL),RET(1)=$G(^XMB("NETNAME"))_"^"_$$STA^XUAF4(DUZ(2))
;Now place user info in it.
D TOK(HDL)
S ^XUTL("XQ",$J,"HDL")=HDL ;Save handle with job
Q
;
HANDLE(NS,LT) ;Return a unique handle into ^XTMP (ef. sup)
;NS is the namespace, LT is the Handle Lifetime in days
N %H,A,J,HL
I $G(NS)="" Q "" ;Return null if no namespace
S LT=$G(LT,1) S:LT>7 LT=7 ;Default to 1
S %H=$H,J=NS_($J#2048)_"-"_(%H#7*86400+$P(%H,",",2))_"_",A=$R(10)
F S HL=J_A,A=A+1 L +^XTMP(HL):1 I $T Q:'$D(^XTMP(HL)) L -^XTMP(HL)
S ^XTMP(HL,0)=$$HTFM^XLFDT(%H+LT)_"^"_$$DT^XLFDT()
;L -^XTMP(HL) Leave the Unlock to the caller
Q HL
;
TOK(H) ;Store a Token
;H is handle into XTMP
N J,T,R,%
S T=$$H3^%ZTM($H)
S R=$J_"|"_T_"|"_$G(DUZ)_"|"_H
S ^XTMP(H,"D",0)="|"_$$ENCRYP^XUSRB1(R)_"|"
S ^XTMP(H,"D2")=$G(DUZ(2))
S %=$G(IO("IP")) I $L(%),'$$VALIDATE^XLFIPV(%) S %=$P($$ADDRESS^XLFNSLK(%),",") ;p638
S ^XTMP(H,"D3")=%
S ^XTMP(H,"CLNM")=$G(IO("CLNM"))
S ^XTMP(H,"JOB",$J)=$G(IO("IP"))
S ^XTMP(H,"STATUS")="0^New",^("CNT")=0
L -^XTMP(H) ;Clear Lock
Q
;
REMOVE(HL) ;Remove (kill) a Handle. p523
I $L($G(HL)) K ^XTMP(HL)
Q
;
CHKASH(HL) ;rpc. Check a Auto Signon Handle
N HDL,RET,FDA,IEN S HDL=$E(HL,3,999)
S RET=$$CHECK(HDL)
I RET>0 D
. S DUZ("ASH")=1,IEN=DUZ_","
. I $$GET1^DIQ(200,IEN,7,"I") S FDA(200,DUZ_",",7)=0 D FILE^DIE("K","FDA") ;p403
D REMOVE(HDL) ;Token only good for one try.
Q RET
;
CHKCCOW(HL) ;rpc. Check a CCOW Auto Signon Handle
N HDL,RET,T
S HDL=$$UP^XLFSTR($E(HL,3,999)),T=$P($G(^XTV(8989.3,1,30),5400),U)
S RET=$$CHECK(HDL,T)
I RET>0 D
. ;This CCOW Token good for more that one try.
. S ^XTMP(HDL,"JOB",$J)=$G(IO("IP"))
. S ^XTMP(HDL,"STATUS")=(^XTMP(HDL,"STATUS")+1)_"^Active"
. S ^XUTL("XQ",$J,"HDL")=HDL ;Save handle with job
. S DUZ("CCOW")=1 ;Flag a CCOW sign-on.
Q RET
;
CHECK(HL,TOUT) ;Check a Token
N %,J,D,L,M,S,T,CLNM
S S=$G(^XTMP(HL,0)) I '$L(S) Q "0^Bad Handle"
S S=$G(^XTMP(HL,"D",0)) I '$L(S) Q "0^Bad Handle" ;Now have real token
I $E(S)'="|" Q "0^Bad Token"
S S=$$DECRYP^XUSRB1($E(S,2,$L(S)-1)) I S="" Q "0^Bad Token"
S J=$P(S,"|"),T=$P(S,"|",2),D=$P(S,"|",3),M=$P(S,"|",4)
;Check token time
S %=$$H3^%ZTM($H),TOUT=$G(TOUT,90) ; P573 changed 20 to 90 JLI
I T+TOUT<% D REMOVE(HL) Q "0^Token Expired" ;Token good for TOUT or 90 seconds
;Check job
;Check that token has handle
I M'=HL Q "0^Bad Token"
;Check User
I $G(^VA(200,D,0))="" Q "0^Bad User"
;Do IP check
S %=$G(IO("IP")),T=0,CLNM=""
I $L(%),'$$VALIDATE^XLFIPV(%) S CLNM=%,%=$P($$ADDRESS^XLFNSLK(%),",") ;p638
S CLNM=$S($L($G(IO("CLNM"))):IO("CLNM"),$L(CLNM):CLNM,1:"") ;p499
I $L($G(^XTMP(HL,"D3"))),^XTMP(HL,"D3")=% S T=1
I 'T,$L(CLNM),$G(^XTMP(HL,"CLNM"))=IO("CLNM") S T=1
I 'T,$$LOW^XLFSTR($S($L($G(IO("ZIO"))):IO("ZIO"),1:$G(IO)))[$P($G(^XTMP(HL,"CLNM")),".") S T=1 ;ram p596
I 'T Q "0^Different IP" ;p499
I $D(^XTMP(HL,"D2")),D>0 S DUZ(2)=^XTMP(HL,"D2")
D USER^XUS(D)
Q D
;
;
CCOWPC(RET) ;Return ap
N I,XU4
S RET(0)="" I '$$BROKER^XWBLIB Q
D GETLST^XPAR(.XU4,"SYS","XUS CCOW VAULT PARAM","Q")
F I=0,1 S RET(I)=$P($G(XU4(I+1)),"^",2,99)
Q
;
;p500
CCOWIP(RET,CLIENTIP) ;rpc. CCOW Auto Signon Handle for middle tiered application servers
N %
S %=$G(IO("IP")) ; save original
; get actual ip address instead of localhost address if possible
S IO("IP")=$S($G(CLIENTIP)=$$CONVERT^XLFIPV("127.0.0.1"):%,$G(CLIENTIP)="":%,1:$G(CLIENTIP)) ;p638
D CCOW(.RET)
S IO("IP")=% ; revert to original
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HXUSRB4 4877 printed Dec 13, 2024@02:12:57 Page 2
XUSRB4 ;ISF/RWF - Build a temporary sign-on token ;01/29/14 14:56
+1 ;;8.0;KERNEL;**150,337,395,419,437,499,523,573,596,638,659**;Jul 10, 1995;Build 22
+2 ;Per VA Directive 6402, this routine should not be modified.
+3 QUIT
+4 ;
ASH(RET) ;rpc. Auto Signon Handle
+1 NEW HDL
+2 ;Do not give token to user with authentication Level Of Assurance = 1, as they then would
+3 ;have the ability to re-authenticate at a higher Level Of Assurance (spoofing).
+4 SET RET="NOT AUTHENTICATED"
+5 ;Not an authenticated user
IF $GET(DUZ)<1
QUIT
+6 ;Not an authenticated user
IF $GET(DUZ("LOA"))=1
QUIT
+7 SET HDL=$$HANDLE("XWBAS",1)
SET RET="~1"_HDL
+8 ;Now place user info in it.
+9 DO TOK(HDL)
+10 QUIT
+11 ;
CCOW(RET) ;rpc. CCOW Auto Signon Handle
+1 NEW HDL,HDL2,X
+2 SET RET(0)="NO PROXY USER"
SET RET(1)="ERROR"
+3 ;No Proxy
IF $$USERTYPE^XUSAP(DUZ,"APPLICATION PROXY")
QUIT
+4 ;No Proxy
IF $$USERTYPE^XUSAP(DUZ,"CONNECTOR PROXY")
QUIT
+5 ;Do not give token to user with authentication Level Of Assurance = 1, as they then would
+6 ;have the ability to re-authenticate at a higher Level Of Assurance (spoofing).
+7 SET RET(0)="NOT AUTHENTICATED"
SET RET(1)="ERROR"
+8 ;Not an authenticated user
IF $GET(DUZ("LOA"))=1
QUIT
+9 ;User must be active
SET X=$$ACTIVE^XUSER(DUZ)
IF 'X
SET RET(0)=X
QUIT
+10 SET HDL=$$HANDLE("XWBCCW",1)
+11 ;Return RET(0) the CCOW token, RET(1) the domain name and the Station #
+12 SET RET(0)="~2"_$$LOW^XLFSTR(HDL)
SET RET(1)=$GET(^XMB("NETNAME"))_"^"_$$STA^XUAF4(DUZ(2))
+13 ;Now place user info in it.
+14 DO TOK(HDL)
+15 ;Save handle with job
SET ^XUTL("XQ",$JOB,"HDL")=HDL
+16 QUIT
+17 ;
HANDLE(NS,LT) ;Return a unique handle into ^XTMP (ef. sup)
+1 ;NS is the namespace, LT is the Handle Lifetime in days
+2 NEW %H,A,J,HL
+3 ;Return null if no namespace
IF $GET(NS)=""
QUIT ""
+4 ;Default to 1
SET LT=$GET(LT,1)
if LT>7
SET LT=7
+5 SET %H=$HOROLOG
SET J=NS_($JOB#2048)_"-"_(%H#7*86400+$PIECE(%H,",",2))_"_"
SET A=$RANDOM(10)
+6 FOR
SET HL=J_A
SET A=A+1
LOCK +^XTMP(HL):1
IF $TEST
if '$DATA(^XTMP(HL))
QUIT
LOCK -^XTMP(HL)
+7 SET ^XTMP(HL,0)=$$HTFM^XLFDT(%H+LT)_"^"_$$DT^XLFDT()
+8 ;L -^XTMP(HL) Leave the Unlock to the caller
+9 QUIT HL
+10 ;
TOK(H) ;Store a Token
+1 ;H is handle into XTMP
+2 NEW J,T,R,%
+3 SET T=$$H3^%ZTM($HOROLOG)
+4 SET R=$JOB_"|"_T_"|"_$GET(DUZ)_"|"_H
+5 SET ^XTMP(H,"D",0)="|"_$$ENCRYP^XUSRB1(R)_"|"
+6 SET ^XTMP(H,"D2")=$GET(DUZ(2))
+7 ;p638
SET %=$GET(IO("IP"))
IF $LENGTH(%)
IF '$$VALIDATE^XLFIPV(%)
SET %=$PIECE($$ADDRESS^XLFNSLK(%),",")
+8 SET ^XTMP(H,"D3")=%
+9 SET ^XTMP(H,"CLNM")=$GET(IO("CLNM"))
+10 SET ^XTMP(H,"JOB",$JOB)=$GET(IO("IP"))
+11 SET ^XTMP(H,"STATUS")="0^New"
SET ^("CNT")=0
+12 ;Clear Lock
LOCK -^XTMP(H)
+13 QUIT
+14 ;
REMOVE(HL) ;Remove (kill) a Handle. p523
+1 IF $LENGTH($GET(HL))
KILL ^XTMP(HL)
+2 QUIT
+3 ;
CHKASH(HL) ;rpc. Check a Auto Signon Handle
+1 NEW HDL,RET,FDA,IEN
SET HDL=$EXTRACT(HL,3,999)
+2 SET RET=$$CHECK(HDL)
+3 IF RET>0
Begin DoDot:1
+4 SET DUZ("ASH")=1
SET IEN=DUZ_","
+5 ;p403
IF $$GET1^DIQ(200,IEN,7,"I")
SET FDA(200,DUZ_",",7)=0
DO FILE^DIE("K","FDA")
End DoDot:1
+6 ;Token only good for one try.
DO REMOVE(HDL)
+7 QUIT RET
+8 ;
CHKCCOW(HL) ;rpc. Check a CCOW Auto Signon Handle
+1 NEW HDL,RET,T
+2 SET HDL=$$UP^XLFSTR($EXTRACT(HL,3,999))
SET T=$PIECE($GET(^XTV(8989.3,1,30),5400),U)
+3 SET RET=$$CHECK(HDL,T)
+4 IF RET>0
Begin DoDot:1
+5 ;This CCOW Token good for more that one try.
+6 SET ^XTMP(HDL,"JOB",$JOB)=$GET(IO("IP"))
+7 SET ^XTMP(HDL,"STATUS")=(^XTMP(HDL,"STATUS")+1)_"^Active"
+8 ;Save handle with job
SET ^XUTL("XQ",$JOB,"HDL")=HDL
+9 ;Flag a CCOW sign-on.
SET DUZ("CCOW")=1
End DoDot:1
+10 QUIT RET
+11 ;
CHECK(HL,TOUT) ;Check a Token
+1 NEW %,J,D,L,M,S,T,CLNM
+2 SET S=$GET(^XTMP(HL,0))
IF '$LENGTH(S)
QUIT "0^Bad Handle"
+3 ;Now have real token
SET S=$GET(^XTMP(HL,"D",0))
IF '$LENGTH(S)
QUIT "0^Bad Handle"
+4 IF $EXTRACT(S)'="|"
QUIT "0^Bad Token"
+5 SET S=$$DECRYP^XUSRB1($EXTRACT(S,2,$LENGTH(S)-1))
IF S=""
QUIT "0^Bad Token"
+6 SET J=$PIECE(S,"|")
SET T=$PIECE(S,"|",2)
SET D=$PIECE(S,"|",3)
SET M=$PIECE(S,"|",4)
+7 ;Check token time
+8 ; P573 changed 20 to 90 JLI
SET %=$$H3^%ZTM($HOROLOG)
SET TOUT=$GET(TOUT,90)
+9 ;Token good for TOUT or 90 seconds
IF T+TOUT<%
DO REMOVE(HL)
QUIT "0^Token Expired"
+10 ;Check job
+11 ;Check that token has handle
+12 IF M'=HL
QUIT "0^Bad Token"
+13 ;Check User
+14 IF $GET(^VA(200,D,0))=""
QUIT "0^Bad User"
+15 ;Do IP check
+16 SET %=$GET(IO("IP"))
SET T=0
SET CLNM=""
+17 ;p638
IF $LENGTH(%)
IF '$$VALIDATE^XLFIPV(%)
SET CLNM=%
SET %=$PIECE($$ADDRESS^XLFNSLK(%),",")
+18 ;p499
SET CLNM=$SELECT($LENGTH($GET(IO("CLNM"))):IO("CLNM"),$LENGTH(CLNM):CLNM,1:"")
+19 IF $LENGTH($GET(^XTMP(HL,"D3")))
IF ^XTMP(HL,"D3")=%
SET T=1
+20 IF 'T
IF $LENGTH(CLNM)
IF $GET(^XTMP(HL,"CLNM"))=IO("CLNM")
SET T=1
+21 ;ram p596
IF 'T
IF $$LOW^XLFSTR($SELECT($LENGTH($GET(IO("ZIO"))):IO("ZIO"),1:$GET(IO)))[$PIECE($GET(^XTMP(HL,"CLNM")),".")
SET T=1
+22 ;p499
IF 'T
QUIT "0^Different IP"
+23 IF $DATA(^XTMP(HL,"D2"))
IF D>0
SET DUZ(2)=^XTMP(HL,"D2")
+24 DO USER^XUS(D)
+25 QUIT D
+26 ;
+27 ;
CCOWPC(RET) ;Return ap
+1 NEW I,XU4
+2 SET RET(0)=""
IF '$$BROKER^XWBLIB
QUIT
+3 DO GETLST^XPAR(.XU4,"SYS","XUS CCOW VAULT PARAM","Q")
+4 FOR I=0,1
SET RET(I)=$PIECE($GET(XU4(I+1)),"^",2,99)
+5 QUIT
+6 ;
+7 ;p500
CCOWIP(RET,CLIENTIP) ;rpc. CCOW Auto Signon Handle for middle tiered application servers
+1 NEW %
+2 ; save original
SET %=$GET(IO("IP"))
+3 ; get actual ip address instead of localhost address if possible
+4 ;p638
SET IO("IP")=$SELECT($GET(CLIENTIP)=$$CONVERT^XLFIPV("127.0.0.1"):%,$GET(CLIENTIP)="":%,1:$GET(CLIENTIP))
+5 DO CCOW(.RET)
+6 ; revert to original
SET IO("IP")=%
+7 QUIT
+8 ;