1 | XMXSEC1 ;ISC-SF/GMB-Message security and restrictions (cont.) ;05/17/2002 13:26
|
---|
2 | ;;8.0;MailMan;;Jun 28, 2002
|
---|
3 | ; All entry points covered by DBIA 2732.
|
---|
4 | GETRESTR(XMDUZ,XMZ,XMZREC,XMINSTR,XMRESTR) ;
|
---|
5 | ; If a message is closed, it may not be forwarded to SHARED,MAIL, even by the sender
|
---|
6 | I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
|
---|
7 | I "^Y^y^"[(U_$P(XMZREC,U,9)_U) D
|
---|
8 | . S:$G(XMRESTR("FLAGS"))'["X" XMRESTR("FLAGS")=$G(XMRESTR("FLAGS"))_"X"
|
---|
9 | E I $G(XMRESTR("FLAGS"))["X" S XMRESTR("FLAGS")=$TR(XMRESTR("FLAGS"),"X")
|
---|
10 | ; If a message is confidential, it may not be forwarded to SHARED,MAIL
|
---|
11 | I "^Y^y^"[(U_$P(XMZREC,U,11)_U) D
|
---|
12 | . S:$G(XMRESTR("FLAGS"))'["C" XMRESTR("FLAGS")=$G(XMRESTR("FLAGS"))_"C"
|
---|
13 | E I $G(XMRESTR("FLAGS"))["C" S XMRESTR("FLAGS")=$TR(XMRESTR("FLAGS"),"C")
|
---|
14 | Q:$G(XMINSTR("ADDR FLAGS"))["R"
|
---|
15 | ; If a message is priority, it may not be forwarded to groups unless
|
---|
16 | ; the site has chosen to allow it, or if
|
---|
17 | ; the user is the originator or possesses the proper security key,
|
---|
18 | I $P(XMZREC,U,7)["P",'$P($G(^XMB(1,1,2)),U,1),'$$ORIGIN8R^XMXSEC(XMDUZ,XMZREC),'$D(^XUSEC("XM GROUP PRIORITY",XMDUZ)) S XMRESTR("NOFPG")=""
|
---|
19 | E K:$D(XMRESTR("NOFPG")) XMRESTR("NOFPG")
|
---|
20 | ; If a message has responses, it may not be broadcast. Users w/auto-
|
---|
21 | ; forward addresses would not see the responses.
|
---|
22 | I $O(^XMB(3.9,XMZ,3,0)) S XMRESTR("NOBCAST")=""
|
---|
23 | ; If a message is more lines than the limit,
|
---|
24 | ; then it may not be sent/forwarded to a remote site.
|
---|
25 | D CHKLINES(XMDUZ,XMZ,.XMRESTR)
|
---|
26 | Q
|
---|
27 | CHKLINES(XMDUZ,XMZ,XMRESTR) ; Replaces NO^XMA21A
|
---|
28 | N XMLIMIT
|
---|
29 | Q:$D(^XUSEC("XMMGR",XMDUZ))
|
---|
30 | S XMLIMIT=$P($G(^XMB(1,1,"NETWORK-LIMIT")),U)
|
---|
31 | I XMLIMIT,$P($G(^XMB(3.9,XMZ,2,0)),U,4)>XMLIMIT S XMRESTR("NONET")=XMLIMIT Q
|
---|
32 | K:$D(XMRESTR("NONET")) XMRESTR("NONET")
|
---|
33 | Q
|
---|
34 | CHKMSG(XMDUZ,XMK,XMKZ,XMZ,XMZREC) ; Is the message where the calling routine says it is,
|
---|
35 | ; and is the user authorized to access it?
|
---|
36 | I $G(XMK) D Q
|
---|
37 | . S XMZ=$O(^XMB(3.7,XMDUZ,2,XMK,1,"C",XMKZ,""))
|
---|
38 | . I 'XMZ D Q
|
---|
39 | . . N XMPARM
|
---|
40 | . . S XMPARM(1)=XMKZ,XMPARM(2)=XMK
|
---|
41 | . . D ERRSET^XMXUTIL(34351,.XMPARM) ; Message _XMKZ_ in basket _XMK_ does not exist.
|
---|
42 | . S XMZREC=$G(^XMB(3.9,XMZ,0))
|
---|
43 | . I XMZREC'="" D:XMDUZ'=DUZ Q
|
---|
44 | . . N X
|
---|
45 | . . S X=$$SURRACC^XMXSEC(XMDUZ,"",XMZ,XMZREC)
|
---|
46 | . N XMPARM
|
---|
47 | . S XMPARM(1)=XMZ,XMPARM(2)=XMKZ,XMPARM(3)=XMK
|
---|
48 | . D ERRSET^XMXUTIL(34352,.XMPARM) ; Message _XMZ_ (message _XMKZ_ in basket _XMK_) does not exist.
|
---|
49 | S XMZ=XMKZ
|
---|
50 | S XMZREC=$G(^XMB(3.9,XMZ,0))
|
---|
51 | I XMZREC="" D ERRSET^XMXUTIL(34354,XMZ) Q ; Message _XMZ_ does not exist.
|
---|
52 | Q:'$$ACCESS^XMXSEC(XMDUZ,XMZ,XMZREC)
|
---|
53 | S XMK=+$O(^XMB(3.7,"M",XMZ,XMDUZ,""))
|
---|
54 | Q:'XMK
|
---|
55 | S XMKZ=$P($G(^XMB(3.7,XMDUZ,2,XMK,1,XMZ,0)),U,2)
|
---|
56 | I 'XMKZ D ADDITM^XMUT4A(XMDUZ,XMK,XMZ,.XMKZ)
|
---|
57 | Q
|
---|
58 | PAKMAN(XMZ,XMZREC) ; Returns 1 if this is a packman msg; 0 if not.
|
---|
59 | ; Unfortunately, there isn't always an "X" in piece 7 of the zero node,
|
---|
60 | ; so we must go check out the first line of text.
|
---|
61 | N XMTYPE
|
---|
62 | I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
|
---|
63 | S XMTYPE=$P(XMZREC,U,7)
|
---|
64 | I "P"[XMTYPE D Q XMTYPE ; "P" means priority, and it exists along with
|
---|
65 | . ; message type in piece 7 in all MailMan versions thru 7.*
|
---|
66 | . N XMREC,XMI
|
---|
67 | . S XMTYPE=0
|
---|
68 | . S XMI=$O(^XMB(3.9,XMZ,2,.999999)) I 'XMI Q
|
---|
69 | . S XMREC=^XMB(3.9,XMZ,2,XMI,0)
|
---|
70 | . Q:$E(XMREC,1)'="$"
|
---|
71 | . I XMREC?1"$TXT Created by".E1" at ".E1" on ".E S XMTYPE=1 Q ; Unsecured PackMan
|
---|
72 | . I XMREC?1"$TXT PACKMAN BACKUP".E S XMTYPE=1 Q ; PackMan Backup
|
---|
73 | . I XMREC?1"$TXT ^Created by".E1" at ".E1" on ".E S XMTYPE=1 Q ; Secured PackMan
|
---|
74 | Q:XMTYPE="K"!(XMTYPE="X") 1 ; PackMan message (KIDS or regular)
|
---|
75 | Q 0
|
---|
76 | OPTGRP(XMDUZ,XMK,XMOPT,XMOX,XMQDNUM) ; What may the user do at the basket/message group level?
|
---|
77 | I XMK D
|
---|
78 | . I XMDUZ=.5,XMK>999 D OPTPOST(.XMOPT,.XMOX) Q
|
---|
79 | . D OPTUSER1(XMDUZ,.XMOPT,.XMOX)
|
---|
80 | . D OPTUSER2(XMK,.XMOPT,.XMOX)
|
---|
81 | E D
|
---|
82 | . I XMK="!" D OPTSS(XMDUZ,.XMOPT,.XMOX) Q
|
---|
83 | . D OPTUSER1(XMDUZ,.XMOPT,.XMOX)
|
---|
84 | Q
|
---|
85 | SET(XMCD,XMDN,XMOPT,XMOX) ;
|
---|
86 | N XMDREC
|
---|
87 | S XMDREC=$$EZBLD^DIALOG(XMDN)
|
---|
88 | S XMOPT(XMCD)=$P(XMDREC,":",2,99)
|
---|
89 | S XMOX("O",XMCD)=$P(XMDREC,":",1) ; "O"=original english to foreign
|
---|
90 | S XMOX("X",$P(XMDREC,":",1))=XMCD ; "X"=translate foreign to english
|
---|
91 | Q
|
---|
92 | Q(XMCD,XMDN) ;
|
---|
93 | I $G(XMQDNUM) S XMOPT(XMCD,"?")=XMDN Q
|
---|
94 | S XMOPT(XMCD,"?")=$$EZBLD^DIALOG(XMDN)
|
---|
95 | Q
|
---|
96 | OPTUSER1(XMDUZ,XMOPT,XMOX) ;
|
---|
97 | D SET("D",37202,.XMOPT,.XMOX) ; Delete messages
|
---|
98 | D SET("F",37203,.XMOPT,.XMOX) ; Forward messages
|
---|
99 | D SET("FI",37204,.XMOPT,.XMOX) ; Filter messages
|
---|
100 | D SET("H",37205,.XMOPT,.XMOX) ; Headerless Print messages
|
---|
101 | D SET("L",37206,.XMOPT,.XMOX) ; Later messages
|
---|
102 | D SET("NT",37208,.XMOPT,.XMOX) ; New Toggle messages
|
---|
103 | D SET("P",37209,.XMOPT,.XMOX) ; Print messages
|
---|
104 | D SET("S",37213,.XMOPT,.XMOX) ; Save messages to another basket
|
---|
105 | D SET("T",37214,.XMOPT,.XMOX) ; Terminate messages
|
---|
106 | I '$D(^XMB(3.7,XMDUZ,15,"AF")) D
|
---|
107 | . I XMDUZ=DUZ D Q("FI",37204.1) Q ; You have no message filters defined.
|
---|
108 | . S XMOPT("FI","?")=$$EZBLD^DIALOG(37204.2,XMV("NAME")) ; |1| has no message filters defined.
|
---|
109 | D SET("V",37216,.XMOPT,.XMOX) ; Vaporize date set messages
|
---|
110 | Q:XMDUZ'=.6
|
---|
111 | D Q("L",37462) ; You may not do this in SHARED,MAIL.
|
---|
112 | S XMOPT("NT","?")=XMOPT("L","?")
|
---|
113 | Q:$$ZPOSTPRV^XMXSEC()
|
---|
114 | ; You must hold the XMMGR key or be a POSTMASTER surrogate to do this in SHARED,MAIL.
|
---|
115 | I $G(XMQDNUM) D Q
|
---|
116 | . F I="D","F","FI","S","T","V" S XMOPT(I,"?")=37261
|
---|
117 | N DIR
|
---|
118 | D BLD^DIALOG(37261,"","","DIR(""?"")")
|
---|
119 | F I="D","F","FI","S","T","V" M XMOPT(I,"?")=DIR("?")
|
---|
120 | Q
|
---|
121 | OPTUSER2(XMK,XMOPT,XMOX) ;
|
---|
122 | D SET("C",37201,.XMOPT,.XMOX) ; Change the name of this basket
|
---|
123 | D SET("N",37207,.XMOPT,.XMOX) ; New message list
|
---|
124 | D SET("Q",37211,.XMOPT,.XMOX) ; Query (search for) messages in this basket
|
---|
125 | D SET("R",37212,.XMOPT,.XMOX) ; Resequence messages
|
---|
126 | I XMK'>1 D Q("C",37201.1) ; The name of this basket may not be changed.
|
---|
127 | ;"The name of "_$S(XMK=1:"the IN",XMK=.5:"the WASTE",1:"this")_" basket may not be changed."
|
---|
128 | Q:XMDUZ'=.6!$$ZPOSTPRV^XMXSEC()
|
---|
129 | ; You must hold the XMMGR key or be a POSTMASTER surrogate to do this in SHARED,MAIL.
|
---|
130 | I $G(XMQDNUM) S XMOPT("C","?")=37261 Q
|
---|
131 | N DIR
|
---|
132 | D BLD^DIALOG(37261,"","","DIR(""?"")")
|
---|
133 | M XMOPT("C","?")=DIR("?")
|
---|
134 | Q
|
---|
135 | OPTPOST(XMOPT,XMOX) ;
|
---|
136 | D SET("D",37202,.XMOPT,.XMOX) ; Delete messages
|
---|
137 | D SET("F",37203,.XMOPT,.XMOX) ; Forward messages (Added so that postmaster could reroute messages which for some reason were addressed to the wrong domain.)
|
---|
138 | D SET("Q",37211,.XMOPT,.XMOX) ; Query (search for) messages in this basket
|
---|
139 | D SET("R",37212,.XMOPT,.XMOX) ; Resequence messages
|
---|
140 | D SET("X",37219,.XMOPT,.XMOX) ; Xmit Priority toggle
|
---|
141 | Q
|
---|
142 | OPTSS(XMDUZ,XMOPT,XMOX) ; Super Search
|
---|
143 | D SET("H",37205,.XMOPT,.XMOX) ; Headerless Print messages
|
---|
144 | D SET("P",37209,.XMOPT,.XMOX) ; Print messages
|
---|
145 | Q
|
---|
146 | COPYAMT(XMZ,XMWHICH) ; Checks total number of lines to be copied and total number of responses to be copied.
|
---|
147 | ; Function returns 1 if OK; 0 if not OK.
|
---|
148 | ; XMWHICH string of which responses to copy (0=original msg).
|
---|
149 | ; Default = original msg and all responses.
|
---|
150 | N XMLIMIT,XMRESPS,XMABORT
|
---|
151 | S XMABORT=0
|
---|
152 | S XMLIMIT=$$COPYLIMS
|
---|
153 | S XMRESPS=+$P($G(^XMB(3.9,XMZ,3,0)),U,4)
|
---|
154 | I XMRESPS=0 D TOOMANY(+$P($G(^XMB(3.9,XMZ,2,0)),U,4),$P(XMLIMIT,U,3),37470,.XMABORT) Q 'XMABORT
|
---|
155 | N I,J,XMRANGE,XMLINES
|
---|
156 | S:'$D(XMWHICH) XMWHICH="0-"_XMRESPS
|
---|
157 | S (XMRESPS,XMLINES)=0
|
---|
158 | F I=1:1:$L(XMWHICH,",")-1 D
|
---|
159 | . S XMRANGE=$P(XMWHICH,",",I)
|
---|
160 | . F J=$P(XMRANGE,"-",1):1:$S(XMRANGE["-":$P(XMRANGE,"-",2),1:XMRANGE) D
|
---|
161 | . . S XMRESPS=XMRESPS+1
|
---|
162 | . . I J=0 S XMLINES=XMLINES+$P($G(^XMB(3.9,XMZ,2,0)),U,4) Q
|
---|
163 | . . S XMLINES=XMLINES+$P($G(^XMB(3.9,+$G(^XMB(3.9,XMZ,3,J,0)),2,0)),U,4)
|
---|
164 | D TOOMANY(XMLINES,$P(XMLIMIT,U,3),37470,.XMABORT) Q:XMABORT 0
|
---|
165 | D TOOMANY(XMRESPS,$P(XMLIMIT,U,2),37471,.XMABORT) Q:XMABORT 0
|
---|
166 | Q 1
|
---|
167 | TOOMANY(HOWMANY,XMLIMIT,XMDIALOG,XMABORT) ;
|
---|
168 | Q:HOWMANY'>XMLIMIT
|
---|
169 | S XMABORT=1
|
---|
170 | D ERRSET^XMXUTIL(XMDIALOG,XMLIMIT) ; You may not copy more than the site limit of _XMLIMIT_ lines / responses.
|
---|
171 | Q
|
---|
172 | COPYLIMS() ; Function returns copy limits string.
|
---|
173 | ; limits: # recipients^# responses^# lines
|
---|
174 | N I
|
---|
175 | S XMLIMIT=$G(^XMB(1,1,.11))
|
---|
176 | F I=1:1:3 I '$P(XMLIMIT,U,I) S $P(XMLIMIT,U,I)=$P("2999^99^3999",U,I)
|
---|
177 | Q XMLIMIT
|
---|
178 | COPYRECP(XMZ) ; Checks total number of recipients to see if it's OK to list them in the copy text and send the copy to them, too.
|
---|
179 | ; Function returns 1 if OK; 0 if not OK.
|
---|
180 | N XMLIMIT
|
---|
181 | S XMLIMIT=$$COPYLIMS
|
---|
182 | Q:$P($G(^XMB(3.9,XMZ,1,0)),U,4)'>$P(XMLIMIT,U,1) 1
|
---|
183 | D ERRSET^XMXUTIL(37472,$P(XMLIMIT,U,1))
|
---|
184 | ;Because this message has more than the site limit of _X_ recipients,
|
---|
185 | ;we will neither list them in the text of the copy,
|
---|
186 | ;nor will we deliver the copy to them.
|
---|
187 | Q 0
|
---|
188 | SSPRIV() ; Is the user authorized to conduct a super search?
|
---|
189 | Q:$$ZSSPRIV 1
|
---|
190 | D ERRSET^XMXUTIL(34413.5)
|
---|
191 | Q 0
|
---|
192 | ZSSPRIV() ; Is the user authorized to conduct a super search?
|
---|
193 | I DUZ'<1,$D(^XUSEC("XM SUPER SEARCH",DUZ)) Q 1
|
---|
194 | Q 0
|
---|
195 | ACCESS2(XMDUZ,XMZ,XMZREC) ; The user (XMDUZ) is not a recipient
|
---|
196 | N XMOK ; of the message, but did he send it?
|
---|
197 | I XMDUZ=$P(XMZREC,U,2)!(XMDUZ=$P(XMZREC,U,4)) D Q XMOK
|
---|
198 | . I XMDUZ='DUZ,'$$SURRACC^XMXSEC(XMDUZ,"",XMZ,XMZREC) S XMOK=0 Q
|
---|
199 | . ; The user sent the message, so add him to it.
|
---|
200 | . D ADDRECP^XMTDL(XMZ,$P(XMZREC,U,7)["P",XMDUZ)
|
---|
201 | . S XMOK=1
|
---|
202 | I XMDUZ'=DUZ D Q 0
|
---|
203 | . Q:'$$ACCESS^XMXSEC(DUZ,XMZ,XMZREC)
|
---|
204 | . D ERRSET^XMXUTIL(37103,XMV("NAME"),XMZ)
|
---|
205 | . ; You may not access this message as |1| unless you
|
---|
206 | . ; or someone else on the message forwards it to |1|.
|
---|
207 | D ERRSET^XMXUTIL(37102,"",XMZ)
|
---|
208 | ; You are neither a sender nor a recipient of this message.
|
---|
209 | ; If you need to see it, ask someone to forward it to you.
|
---|
210 | Q 0
|
---|