1 | XOBSRAKJ ;kc/oak - VistALink Reauthentication Code, SSO/UC KAAJEE ; 03/02/2004 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 subroutines for SSO/UC KAAJEE
|
---|
9 | ; ------------------------------------------------------------------------
|
---|
10 | ;
|
---|
11 | CCOW(XOBID,XOBERR) ; -- CCOW connection type
|
---|
12 | NEW XOBOUT,T,HDL
|
---|
13 | SET XOBID=0
|
---|
14 | ;
|
---|
15 | ;get DUZ using Kernel CCOW Token xref
|
---|
16 | SET HDL=$GET(XOBDATA("XOB RPC","SECURITY","TYPE","CCOW"))
|
---|
17 | SET HDL=$$DECRYP^XUSRB1(HDL)
|
---|
18 | ;
|
---|
19 | IF $EXTRACT(HDL,1,2)'="~2" DO QUIT
|
---|
20 | . SET XOBERR=182301_U_"CCOW"_U_"[token does not match CCOW handle format.]"
|
---|
21 | . SET XOBID=0
|
---|
22 | ;
|
---|
23 | ; TODO: need IP address, then need to do $$IPLOCKED(IP)?
|
---|
24 | ;
|
---|
25 | ; since bypassing CHKCCOW^XUSRB4, need to extract true handle, expiry here
|
---|
26 | SET HDL=$$UP^XLFSTR($EXTRACT(HDL,3,99)),T=$PIECE($GET(^XTV(8989.3,1,30),5400),U)
|
---|
27 | ; call Kernel to resolve CCOW handle into user ID
|
---|
28 | SET XOBOUT=$$CHECK^XUSRB4(HDL,T)
|
---|
29 | IF (+XOBOUT)<1 DO QUIT
|
---|
30 | . SET XOBERR=182301_U_"CCOW"_U_"["_$PIECE(XOBOUT,U,2)_"]"
|
---|
31 | . SET XOBID=0
|
---|
32 | ;
|
---|
33 | ; need to get set XOBID=DUZ, save off DUZ(2) and anything else held in the token for XOBSRA
|
---|
34 | SET XOBID=+XOBOUT
|
---|
35 | ;
|
---|
36 | ; Save the division station# into $GET(XOBDATA("XOB RPC","SECURITY","DIV")) -- that
|
---|
37 | ; is where the XOBSRA division check is looking for it
|
---|
38 | SET:+DUZ(2) XOBDATA("XOB RPC","SECURITY","DIV")=$$STA^XUAF4(DUZ(2))
|
---|
39 | ;
|
---|
40 | IF XOBID<1 DO QUIT
|
---|
41 | . SET XOBERR=182305_U_"CCOW"
|
---|
42 | . SET XOBID=0
|
---|
43 | ;
|
---|
44 | ; probably can run MORECHKS as is?
|
---|
45 | ; SET XOBERR=$$MORECHKS(XOBID)
|
---|
46 | ;
|
---|
47 | IF XOBERR SET XOBID=0 QUIT
|
---|
48 | ;
|
---|
49 | ; TODO: POST(IP)
|
---|
50 | ;
|
---|
51 | QUIT
|
---|
52 | ;
|
---|
53 | AV(XOBID,XOBERR) ; -- AV connection type
|
---|
54 | NEW AC,AVCODE,VC,X,XOBCLIP,XOBTYPE
|
---|
55 | SET XOBID=0
|
---|
56 | ;
|
---|
57 | ; -- get DUZ using access and verify codes
|
---|
58 | SET AVCODE=$GET(XOBDATA("XOB RPC","SECURITY","TYPE","AVCODE"))
|
---|
59 | ;
|
---|
60 | SET AVCODE=$$DECRYP^XUSRB1(AVCODE)
|
---|
61 | SET AC=$PIECE(AVCODE,";",1),VC=$PIECE(AVCODE,";",2),XOBCLIP=$PIECE(AVCODE,";",3)
|
---|
62 | ;
|
---|
63 | ; -- convert AC, VC into hashed versions
|
---|
64 | SET X=AC,AC=$$EN^XUSHSH($$UP^XLFSTR(X))
|
---|
65 | SET X=VC,VC=$$EN^XUSHSH($$UP^XLFSTR(X))
|
---|
66 | ;
|
---|
67 | ; -- check if exceeded multiple signon attempts
|
---|
68 | SET XOBERR=$$IPLOCKED(XOBCLIP) IF XOBERR SET XOBID=0 QUIT
|
---|
69 | ;
|
---|
70 | ; -- look up AC
|
---|
71 | SET XOBID=+$ORDER(^VA(200,"A",AC,0))
|
---|
72 | IF XOBID<1 DO QUIT
|
---|
73 | . SET XOBERR=182305_U_"AV"
|
---|
74 | . SET XOBID=0
|
---|
75 | ;
|
---|
76 | ; -- check VC
|
---|
77 | IF $PIECE($GET(^VA(200,XOBID,.1)),U,2)'=VC DO QUIT
|
---|
78 | . SET XOBERR=182305_U_"AV"
|
---|
79 | . SET XOBID=0
|
---|
80 | ;
|
---|
81 | ; -- check user access and whether verify code needs changing
|
---|
82 | SET XOBERR=$$MORECHKS(XOBID)
|
---|
83 | IF XOBERR SET XOBID=0 QUIT
|
---|
84 | ;
|
---|
85 | ; login succeeded
|
---|
86 | DO POST(XOBCLIP)
|
---|
87 | ;
|
---|
88 | ; NOTE: AV doesn't need to check $$PERSON for AV because our source was file 200, not a separate index
|
---|
89 | ;
|
---|
90 | QUIT
|
---|
91 | ;
|
---|
92 | MORECHKS(XOBID) ; -- More separate checks
|
---|
93 | NEW XOBERR
|
---|
94 | SET XOBERR=0
|
---|
95 | ;
|
---|
96 | ; -- check user access
|
---|
97 | SET XOBERR=$$NOACCESS^XOBSRA(XOBID)
|
---|
98 | IF XOBERR SET XOBID=0 QUIT XOBERR
|
---|
99 | ;
|
---|
100 | ; -- check if verify code needs changing
|
---|
101 | SET XOBERR=$$VCHG^XOBSRA(XOBID)
|
---|
102 | IF XOBERR SET XOBID=0 QUIT XOBERR
|
---|
103 | ;
|
---|
104 | QUIT XOBERR
|
---|
105 | ;
|
---|
106 | IPLOCKED(XOBCLIP) ; -- check if IP address is locked, increment if not
|
---|
107 | ;
|
---|
108 | ; Implements the script-inhibiting lock-by-IP-address Kernel function.
|
---|
109 | ; Does not lock user out for long, but does slow down scripts.
|
---|
110 | ;
|
---|
111 | ; Return:
|
---|
112 | ; 182306^XOBID : if too many invalid login attempts
|
---|
113 | ; 0 : not too many login attempts
|
---|
114 | ;
|
---|
115 | IF $$LKCHECK^XUSTZIP(XOBCLIP) DO QUIT XOBERR
|
---|
116 | . SET XOBERR="182306^Too many invalid signon attempts."
|
---|
117 | ;
|
---|
118 | NEW XOBERR,XUFAC SET XOBERR=0
|
---|
119 | ;
|
---|
120 | IF $$FAIL^XUS3(XOBCLIP) SET XOBERR="182306^"_$$RA^XUSTZ(XOBCLIP)
|
---|
121 | QUIT XOBERR
|
---|
122 | ;
|
---|
123 | POST(XOBCLIP) ; post-successful tasks
|
---|
124 | DO CLRFAC^XUS3(XOBCLIP)
|
---|
125 | QUIT
|
---|