| 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 | 
|---|