| 1 | XMXADDR3 ;ISC-SF/GMB-XMXADDR (cont.) ;04/15/2003  13:16 | 
|---|
| 2 | ;;8.0;MailMan;**18**;Jun 28, 2002 | 
|---|
| 3 | SERVER(XMADDR,XMSTRIKE,XMPREFIX,XMLATER,XMFULL) ; | 
|---|
| 4 | N XMG | 
|---|
| 5 | S XMADDR=$P(XMADDR,".",2,99) | 
|---|
| 6 | I $G(XMIA) D | 
|---|
| 7 | . N DIC,X | 
|---|
| 8 | . S X=XMADDR | 
|---|
| 9 | . S DIC="^DIC(19," | 
|---|
| 10 | . S DIC(0)="FEZ"_$S($D(XMGCIRCL):"O",1:"") | 
|---|
| 11 | . D ^DIC | 
|---|
| 12 | . I Y<0 D SETERR^XMXADDR4(1,"!",39060) Q  ;Invalid server name | 
|---|
| 13 | . S XMG=+Y | 
|---|
| 14 | E  D | 
|---|
| 15 | . S XMG=$$FIND1^DIC(19,"","O",XMADDR) I 'XMG D SETERR^XMXADDR4(0,"",$S($D(DIERR):39061,1:39062)) ; Server ambiguous / Server not found. | 
|---|
| 16 | Q:$D(XMERROR) | 
|---|
| 17 | S XMFULL="S."_$P(^DIC(19,XMG,0),U,1) | 
|---|
| 18 | D SETEXP^XMXADDR(XMFULL,XMG,XMSTRIKE,XMPREFIX,XMLATER) | 
|---|
| 19 | Q | 
|---|
| 20 | DEVICE(XMADDR,XMSTRIKE,XMPREFIX,XMLATER,XMFULL) ; | 
|---|
| 21 | N XMG | 
|---|
| 22 | S XMADDR1=$$UP^XLFSTR($E(XMADDR,1)) | 
|---|
| 23 | S XMADDR=$P(XMADDR,".",2,99) | 
|---|
| 24 | I $G(XMIA) D | 
|---|
| 25 | . N DIC,X | 
|---|
| 26 | . S X=XMADDR | 
|---|
| 27 | . S DIC="^%ZIS(1,"   ; file 3.5 | 
|---|
| 28 | . S DIC(0)="EF"_$S($D(XMGCIRCL):"O",1:"") | 
|---|
| 29 | . D ^DIC | 
|---|
| 30 | . I Y<0 D SETERR^XMXADDR4(1,"!",39063) Q  ;Invalid device name | 
|---|
| 31 | . S XMG=+Y | 
|---|
| 32 | . S XMADDR=$P(Y,U,2) | 
|---|
| 33 | E  D | 
|---|
| 34 | . S XMG=$$FIND1^DIC(3.5,"","O",XMADDR) I 'XMG D SETERR^XMXADDR4(0,"",$S($D(DIERR):39064,1:39065)) Q  ; Device ambiguous. / Device not found. | 
|---|
| 35 | . S XMADDR=$P(^%ZIS(1,XMG,0),U,1) | 
|---|
| 36 | Q:$D(XMERROR) | 
|---|
| 37 | I XMADDR["P-MESSAGE" D  Q  ;You may not use P-MESSAGE in an address. | 
|---|
| 38 | . D SETERR^XMXADDR4($G(XMIA),"!",39066) | 
|---|
| 39 | S XMFULL=XMADDR1_"."_XMADDR | 
|---|
| 40 | D SETEXP^XMXADDR(XMFULL,XMG,XMSTRIKE,XMPREFIX,XMLATER) | 
|---|
| 41 | Q | 
|---|
| 42 | REMOTE(XMDUZ,XMADDR,XMSTRIKE,XMPREFIX,XMLATER,XMFULL) ; | 
|---|
| 43 | ; XMVIA    IEN of domain in ^DIC(4.2 via which the msg will be sent | 
|---|
| 44 | ; XMVIAN   Name of domain via which the msg will be sent | 
|---|
| 45 | ; XMDOMAIN Domain of the addressee | 
|---|
| 46 | ; XMNAME   Name of the addressee | 
|---|
| 47 | N XMVIA,XMVIAN,XMDOMAIN,XMNAME | 
|---|
| 48 | S:XMADDR["<"!(XMADDR[" ") XMADDR=$$REMADDR(XMADDR) | 
|---|
| 49 | S XMNAME=$P(XMADDR,"@",1) | 
|---|
| 50 | I XMNAME="" D  Q | 
|---|
| 51 | . D SETERR^XMXADDR4($G(XMIA),"!",39010) ;Null addressee | 
|---|
| 52 | S XMDOMAIN=$P(XMADDR,"@",2,99) | 
|---|
| 53 | I XMDOMAIN="" D  Q | 
|---|
| 54 | . ; You must specify a reachable uunet host / Null domain | 
|---|
| 55 | . D SETERR^XMXADDR4($G(XMIA),"!",$S(XMNAME["!":39067,1:39068)) | 
|---|
| 56 | ; find out the full domain name, and | 
|---|
| 57 | ; whether the domain is valid, and if so, via which entry in DIC(4.2 | 
|---|
| 58 | D DNS^XMXADDRD(XMDUZ,.XMDOMAIN,.XMVIA,.XMVIAN) Q:$D(XMERROR) | 
|---|
| 59 | I XMDOMAIN=^XMB("NETNAME") D  ; the full domain name = the local domain | 
|---|
| 60 | . N XMQUOTED | 
|---|
| 61 | . I XMNAME?1""""1.E1"""" S XMNAME=$E(XMNAME,2,$L(XMNAME)-1),XMQUOTED=1 | 
|---|
| 62 | . I $E(XMNAME,1)=" "!($E(XMNAME,$L(XMNAME))=" ") S XMNAME=$$STRIP^XMXUTIL1(XMNAME) | 
|---|
| 63 | . D LOCAL^XMXADDR(XMDUZ,XMNAME,XMSTRIKE,XMPREFIX,.XMLATER,.XMFULL) | 
|---|
| 64 | . Q:'$D(XMERROR) | 
|---|
| 65 | . Q:$G(XMQUOTED) | 
|---|
| 66 | . N XMSAVE | 
|---|
| 67 | . S XMSAVE=XMNAME | 
|---|
| 68 | . I ".G.g.D.d.H.h.S.s."[("."_$E(XMNAME,1,2)) S XMNAME=$E(XMNAME,1,2)_$TR($E(XMNAME,3,99),"._+",", .") | 
|---|
| 69 | . E  S XMNAME=$TR(XMNAME,"._+",", .") | 
|---|
| 70 | . I XMSAVE'=XMNAME D  Q:'$D(XMERROR) | 
|---|
| 71 | . . K XMERROR | 
|---|
| 72 | . . I $G(XMIA) D EN^DDIOL($$EZBLD^DIALOG(39069,XMNAME)) ;Checking: |1| | 
|---|
| 73 | . . D LOCAL^XMXADDR(XMDUZ,XMNAME,XMSTRIKE,XMPREFIX,.XMLATER,.XMFULL) | 
|---|
| 74 | . Q:'$G(XMRESTR("NET RECEIVE")) | 
|---|
| 75 | . Q:"^39062^39065^39132^"'[(U_XMERROR_U) | 
|---|
| 76 | . ; Server, Device, or Group not found.  Try lower case. | 
|---|
| 77 | . ; (We do not need to try local user again.) | 
|---|
| 78 | . S XMSAVE=XMNAME,XMNAME=$$LOW^XLFSTR(XMNAME) Q:XMSAVE=XMNAME | 
|---|
| 79 | . K XMERROR | 
|---|
| 80 | . D LOCAL^XMXADDR(XMDUZ,XMNAME,XMSTRIKE,XMPREFIX,.XMLATER,.XMFULL) | 
|---|
| 81 | E  D | 
|---|
| 82 | . I $D(XMRESTR("NONET")) D  Q | 
|---|
| 83 | . . ;Messages longer than |1| lines may not be sent across the network. | 
|---|
| 84 | . . D SETERR^XMXADDR4($G(XMIA),"!",39001,XMRESTR("NONET")) | 
|---|
| 85 | . I $D(XMFWDADD),+$G(^XMB(1,1,3)) D  Q:$D(XMERROR) | 
|---|
| 86 | . . ; This is an auto-forward address, and we are limiting it. | 
|---|
| 87 | . . Q:$$FWDOK(3.1,XMDOMAIN)  ; Approved auto-forward site? | 
|---|
| 88 | . . I '$D(^XUSEC("XM AUTO-FORWARD WAIVER",+XMFWDADD)) D  Q | 
|---|
| 89 | . . . ;You can't have your mail forwarded to a non-VA site.  Waivers can | 
|---|
| 90 | . . . ;be requested through your site Information Security Officer (ISO) | 
|---|
| 91 | . . . D SETERR^XMXADDR4($G(XMIA),"P",38130.1) | 
|---|
| 92 | . . Q:$$FWDOK(3.2,XMDOMAIN)  ; Waiver auto-forward site? | 
|---|
| 93 | . . ;You have been granted a waiver to have your mail forwarded to a | 
|---|
| 94 | . . ;non-VA site, but this site is not one of the sites for which a | 
|---|
| 95 | . . ;waiver has been granted.  Please contact your site Information | 
|---|
| 96 | . . ;Security Officer (ISO) for further information. | 
|---|
| 97 | . . D SETERR^XMXADDR4($G(XMIA),"P",38130.2) | 
|---|
| 98 | . ; I XMDOMAIN?.E1".VA.GOV" D | 
|---|
| 99 | . ;. ; Check the address before the @ to find any obvious errors | 
|---|
| 100 | . ; Now transform spaces, commas, and periods in XMNAME | 
|---|
| 101 | . S XMFULL=XMNAME_"@"_XMDOMAIN | 
|---|
| 102 | . I XMSTRIKE D REMINUS(.XMFULL,XMNAME,XMDOMAIN) Q:$D(XMERROR) | 
|---|
| 103 | . I XMLATER="?" D QLATER^XMXADDR(XMFULL,.XMLATER) Q:$D(XMERROR) | 
|---|
| 104 | . D SETEXP^XMXADDR(XMFULL,XMVIA,XMSTRIKE,XMPREFIX,XMLATER) | 
|---|
| 105 | Q | 
|---|
| 106 | FWDOK(XMNODE,XMDOMAIN) ; Is the auto-forward domain OK? | 
|---|
| 107 | N I,XMOK | 
|---|
| 108 | S I="",XMOK=0 | 
|---|
| 109 | F  S I=$O(^XMB(1,1,XMNODE,"B",I)) Q:I=""!(I=$E(XMDOMAIN,$L(XMDOMAIN)-$L(I)+1,99)) | 
|---|
| 110 | Q I'="" | 
|---|
| 111 | REMINUS(XMFULL,XMNAME,XMDOMAIN) ; | 
|---|
| 112 | Q:$D(^TMP("XMY",$J,XMFULL)) | 
|---|
| 113 | I $O(^TMP("XMY",$J,":"))="" Q:'$G(XMIA)  D  Q | 
|---|
| 114 | . D SETERR^XMXADDR4($G(XMIA),"!",39015.1) ;Not a current recipient. | 
|---|
| 115 | N XMTRY,XMTO | 
|---|
| 116 | S XMTRY=$$LOW^XLFSTR(XMNAME)_"@"_XMDOMAIN | 
|---|
| 117 | I $D(^TMP("XMY",$J,XMTRY)) S XMFULL=XMTRY Q | 
|---|
| 118 | S XMTRY=$$UP^XLFSTR(XMNAME)_"@"_XMDOMAIN | 
|---|
| 119 | I $D(^TMP("XMY",$J,XMTRY)) S XMFULL=XMTRY Q | 
|---|
| 120 | S XMTO=":" | 
|---|
| 121 | F  S XMTO=$O(^TMP("XMY",$J,XMTO)) Q:XMTO=""  Q:$$UP^XLFSTR(XMTO)=XMTRY | 
|---|
| 122 | I XMTO="" Q:'$G(XMIA)  D SETERR^XMXADDR4($G(XMIA),"!",39015.1) Q  ;Not a current recipient. | 
|---|
| 123 | S XMFULL=XMTO | 
|---|
| 124 | Q | 
|---|
| 125 | REMADDR(XMADDR) ; | 
|---|
| 126 | I XMADDR["<" Q $TR($P($P(XMADDR,">",1),"<",2,99),"<")  ; handles <addr> and <<addr>> | 
|---|
| 127 | Q:XMADDR'[" " XMADDR | 
|---|
| 128 | I $E(XMADDR,1)=" "!($E(XMADDR,$L(XMADDR))=" ") S XMADDR=$$STRIP^XMXUTIL1(XMADDR) | 
|---|
| 129 | I XMADDR'["""",XMADDR'["(" Q XMADDR | 
|---|
| 130 | I XMADDR["""@" D  Q XMADDR | 
|---|
| 131 | . ; "first last"@domain | 
|---|
| 132 | . N I,J,XMDOM | 
|---|
| 133 | . S I=$F(XMADDR,"""@") | 
|---|
| 134 | . S XMDOM=$E(XMADDR,I,999) | 
|---|
| 135 | . S XMDOM=$P(XMDOM," ",1) | 
|---|
| 136 | . S J=$F(XMADDR,"""") | 
|---|
| 137 | . S XMADDR=$E(XMADDR,J-1,I-J)_"@"_XMDOM | 
|---|
| 138 | ; last.first@domain (first last) | 
|---|
| 139 | N I | 
|---|
| 140 | F I=1:1:$L(XMADDR," ") Q:$P(XMADDR," ",I)["@" | 
|---|
| 141 | S XMADDR=$P(XMADDR," ",1,I) | 
|---|
| 142 | Q XMADDR | 
|---|