| 1 | XMXSEC ;ISC-SF/GMB-Message security and restrictions ;05/17/2002  13:25
 | 
|---|
| 2 |  ;;8.0;MailMan;;Jun 28, 2002
 | 
|---|
| 3 |  ; All entry points covered by DBIA 2731.
 | 
|---|
| 4 | BCAST(XMZ) ; 0=msg was not broadcast; 1=msg was broadcast
 | 
|---|
| 5 |  N XMBCAST
 | 
|---|
| 6 |  S XMBCAST=$$EZBLD^DIALOG(39006) ; * (Broadcast to all local users)
 | 
|---|
| 7 |  Q:$D(^XMB(3.9,XMZ,1,"C",$E(XMBCAST,1,30))) 1
 | 
|---|
| 8 |  Q:$D(^XMB(3.9,XMZ,1,"C",XMBCAST)) 1
 | 
|---|
| 9 |  Q 0
 | 
|---|
| 10 | ZCLOSED(XMZ) ;
 | 
|---|
| 11 |  Q $$CLOSED($G(^XMB(3.9,XMZ,0)))
 | 
|---|
| 12 | CLOSED(XMZREC) ; 0=msg is not closed; 1=msg is closed
 | 
|---|
| 13 |  Q "^Y^y^"[(U_$P(XMZREC,U,9)_U)
 | 
|---|
| 14 | ZCONFID(XMZ) ;
 | 
|---|
| 15 |  Q $$CONFID($G(^XMB(3.9,XMZ,0)))
 | 
|---|
| 16 | CONFID(XMZREC) ; 0=msg is not confidential; 1=msg is confidential
 | 
|---|
| 17 |  Q "^Y^y^"[(U_$P(XMZREC,U,11)_U)
 | 
|---|
| 18 | ZCONFIRM(XMZ) ;
 | 
|---|
| 19 |  Q $$CONFIRM($G(^XMB(3.9,XMZ,0)))
 | 
|---|
| 20 | CONFIRM(XMZREC) ; 0=msg is not confirm receipt requested; 1=msg is confirm
 | 
|---|
| 21 |  Q "^Y^y^"[(U_$P(XMZREC,U,5)_U)
 | 
|---|
| 22 | ZINFO(XMZ) ;
 | 
|---|
| 23 |  Q $$INFO($G(^XMB(3.9,XMZ,0)))
 | 
|---|
| 24 | INFO(XMZREC) ; 0=msg is not information only; 1=msg is information only
 | 
|---|
| 25 |  Q "^Y^y^"[(U_$P(XMZREC,U,12)_U)
 | 
|---|
| 26 | ZORIGIN8(XMDUZ,XMZ) ;
 | 
|---|
| 27 |  Q $$ORIGIN8R(XMDUZ,$G(^XMB(3.9,XMZ,0)))
 | 
|---|
| 28 | ORIGIN8R(XMDUZ,XMZREC) ; Did the user send the message?
 | 
|---|
| 29 |  ; 1=user is the originator ; 0=user is NOT the originator
 | 
|---|
| 30 |  Q:XMDUZ=$P(XMZREC,U,2) 1
 | 
|---|
| 31 |  Q:XMDUZ=$P(XMZREC,U,4) 1
 | 
|---|
| 32 |  Q:XMDUZ=DUZ 0
 | 
|---|
| 33 |  Q:DUZ=$P(XMZREC,U,2) 1
 | 
|---|
| 34 |  Q:DUZ=$P(XMZREC,U,4) 1
 | 
|---|
| 35 |  Q 0
 | 
|---|
| 36 | ZPRI(XMZ) ;
 | 
|---|
| 37 |  Q $$PRIORITY($G(^XMB(3.9,XMZ,0)))
 | 
|---|
| 38 | PRIORITY(XMZREC) ; 0=msg is not priority; 1=msg is priority
 | 
|---|
| 39 |  Q $P(XMZREC,U,7)["P"
 | 
|---|
| 40 | SURRCONF(XMDUZ,XMZ) ; 0=msg is not confidential; 1=msg is confidential, and surrogate may not read it.
 | 
|---|
| 41 |  ; We already know that XMDUZ'=DUZ.
 | 
|---|
| 42 |  ; But the surrogate may read a confidential message if it was the
 | 
|---|
| 43 |  ; surrogate who sent it.
 | 
|---|
| 44 |  Q:"^Y^y^"'[(U_$P($G(^XMB(3.9,+XMZ,0)),U,11)_U) 0
 | 
|---|
| 45 |  Q:DUZ=$P(^(0),U,2) 0  ; naked ref from above
 | 
|---|
| 46 |  Q:DUZ=$P(^(0),U,4) 0  ; naked ref from above
 | 
|---|
| 47 |  Q 1
 | 
|---|
| 48 | ACCESS(XMDUZ,XMZ,XMZREC) ; Determines user access to a message.
 | 
|---|
| 49 |  ; 1=user may access; 0=user may not access
 | 
|---|
| 50 |  Q:$D(^XMB(3.7,"M",XMZ,XMDUZ)) $S(XMDUZ=DUZ:1,1:$$SURRACC(XMDUZ,"",XMZ,$G(XMZREC)))  ; Message is in user's mailbox
 | 
|---|
| 51 |  N XMPRE
 | 
|---|
| 52 |  S XMPRE=$P(^XMB(3.7,XMDUZ,0),U,7)
 | 
|---|
| 53 |  I XMPRE,$P($G(^XMB(3.9,XMZ,.6)),U,1)<XMPRE D  Q 0
 | 
|---|
| 54 |  . D ERRSET^XMXUTIL(37100,$$MMDT^XMXUTIL1(XMPRE),XMZ) ; You may not access any message prior to _X_ unless someone forwards it to you.
 | 
|---|
| 55 |  Q:$D(^XMB(3.9,XMZ,1,"C",XMDUZ)) $S(XMDUZ=DUZ:1,1:$$SURRACC(XMDUZ,"",XMZ,$G(XMZREC)))  ; User is recipient
 | 
|---|
| 56 |  ;Q:$D(^XMB(3.9,XMZ,1,"C",DUZ)) 1 ; Surrogate is a recipient.
 | 
|---|
| 57 |  ; We comment out the above line, because it's not enough that the
 | 
|---|
| 58 |  ; surrogate is a recipient of the message.  If the surrogate wants to
 | 
|---|
| 59 |  ; access the message as XMDUZ, and the message is not in the mailbox
 | 
|---|
| 60 |  ; of XMDUZ, then the message must have been sent by or to XMDUZ.
 | 
|---|
| 61 |  Q:$$BCAST(XMZ) 1
 | 
|---|
| 62 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 63 |  I $P(XMZREC,U,8) D  Q 0
 | 
|---|
| 64 |  . N XMPARM
 | 
|---|
| 65 |  . S XMPARM(1)=XMZ,XMPARM(2)=$P(XMZREC,U,8)
 | 
|---|
| 66 |  . D ERRSET^XMXUTIL(37101,.XMPARM,XMZ) ; Message _XMZ_ is a response to message _$P(XMZREC,U,8)_.
 | 
|---|
| 67 |  ; User (XMDUZ) is not a recipient.  Investigate further.
 | 
|---|
| 68 |  Q $$ACCESS2^XMXSEC1(XMDUZ,XMZ,XMZREC)
 | 
|---|
| 69 | SURRACC(XMDUZ,XMACCESS,XMZ,XMZREC) ; Determines surrogate access to a message.
 | 
|---|
| 70 |  ; Assumes that we already know that XMDUZ is authorized to see this
 | 
|---|
| 71 |  ; message, and that XMDUZ'=DUZ.  Now we want to know if DUZ may see it.
 | 
|---|
| 72 |  ; 1=surrogate may access; 0=surrogate may not access
 | 
|---|
| 73 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 74 |  Q:'$$CONFID(XMZREC) 1  ; Message isn't confidential.
 | 
|---|
| 75 |  Q:DUZ=$P(XMZREC,U,2) 1 ; Surrogate sent the message.
 | 
|---|
| 76 |  Q:DUZ=$P(XMZREC,U,4) 1 ; Surrogate sent the message.
 | 
|---|
| 77 |  ;Q:$D(^XMB(3.9,XMZ,1,"C",DUZ)) 1 ; Surrogate is a recipient.
 | 
|---|
| 78 |  I $G(XMACCESS)'="" D ERRSET^XMXUTIL(37452,XMACCESS,XMZ) Q 0  ; Surrogates may not _XMACCESS_ CONFIDENTIAL messages.
 | 
|---|
| 79 |  D ERRSET^XMXUTIL(37451,XMZ) ; Surrogates may not access or do anything to Confidential messages.
 | 
|---|
| 80 |  Q 0
 | 
|---|
| 81 | ANSWER(XMDUZ,XMZ,XMZREC) ; Answer (1=may, 0=may not)
 | 
|---|
| 82 |  I DUZ=.6!(XMDUZ=.6) D ERRSET^XMXUTIL(37462,"",XMZ) Q 0  ; You may not do this in SHARED,MAIL.
 | 
|---|
| 83 |  I XMDUZ'=DUZ Q:'$$WPRIV 0  Q:'$$SURRACC(XMDUZ,"",XMZ,.XMZREC) 0  ; "answer"
 | 
|---|
| 84 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 85 |  I $$PAKMAN^XMXSEC1(XMZ,XMZREC) D ERRSET^XMXUTIL(37401.4,"",XMZ) Q 0  ; May not answer a PackMan message.
 | 
|---|
| 86 |  I $D(^XMB(3.9,XMZ,"K")) D ERRSET^XMXUTIL(47401.2,"",XMZ) Q 0  ; May not answer a scrambled message.  Use Reply.
 | 
|---|
| 87 |  I '$$GOTNS^XMVVITA(XMDUZ) D ERRSET^XMXUTIL($S(XMDUZ=DUZ:37401.1,1:37401.3),XMV("NAME"),XMZ) Q 0  ; You / X must have a network signature in order to answer a message.
 | 
|---|
| 88 |  Q 1
 | 
|---|
| 89 | COPY(XMDUZ,XMZ,XMZREC) ; Copy (1=may, 0=may not)
 | 
|---|
| 90 |  I XMDUZ'=DUZ Q:'$$WPRIV 0  Q:'$$SURRACC(XMDUZ,"",XMZ,.XMZREC) 0  ; "copy"
 | 
|---|
| 91 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 92 |  I $$CLOSED(XMZREC),'$$ORIGIN8R(XMDUZ,XMZREC) D ERRSET^XMXUTIL(37403.1,"",XMZ) Q 0  ; Only the message originator may copy CLOSED messages.
 | 
|---|
| 93 |  I XMDUZ=.6,DUZ'=$P(XMZREC,U,2),DUZ'=$P(XMZREC,U,4) D ERRSET^XMXUTIL(37403.6,"",XMZ) Q 0  ; Only the originator may copy messages in SHARED,MAIL.
 | 
|---|
| 94 |  I $D(^XMB(3.9,XMZ,"K")) D ERRSET^XMXUTIL(37403.2,"",XMZ) Q 0  ; May not copy a scrambled message.
 | 
|---|
| 95 |  Q 1
 | 
|---|
| 96 | INCLUDE(XMDUZ,XMZ,XMZREC) ; Include message XMZ as part of another message (1=may, 0=may not)
 | 
|---|
| 97 |  ; If XMDUZ'=DUZ, assumes that surrogate has the privilege to
 | 
|---|
| 98 |  ; send a new message, or reply to a message.
 | 
|---|
| 99 |  Q:'$$ACCESS(XMDUZ,XMZ,.XMZREC) 0
 | 
|---|
| 100 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 101 |  I $$CLOSED(XMZREC),'$$ORIGIN8R(XMDUZ,XMZREC) D ERRSET^XMXUTIL(37403.1,"",XMZ) Q 0  ; Only the message originator may copy CLOSED messages.
 | 
|---|
| 102 |  I $D(^XMB(3.9,XMZ,"K")) D ERRSET^XMXUTIL(37403.2,"",XMZ) Q 0  ; May not copy a scrambled message.
 | 
|---|
| 103 |  Q 1
 | 
|---|
| 104 | DELETE(XMDUZ,XMK,XMZ,XMZREC) ; Delete, Terminate (1=may, 0=may not)
 | 
|---|
| 105 |  Q:XMDUZ=DUZ 1
 | 
|---|
| 106 |  Q:'$$RWPRIV 0
 | 
|---|
| 107 |  ;I XMDUZ=.5,$G(XMK,$O(^XMB(3.7,"M",XMZ,XMDUZ,"")))>999 Q 1
 | 
|---|
| 108 |  I XMDUZ=.5 Q 1
 | 
|---|
| 109 |  Q:'$$SURRACC(XMDUZ,"",XMZ,.XMZREC) 0  ; "delete"
 | 
|---|
| 110 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 111 |  I XMDUZ=.6,DUZ'=$P(XMZREC,U,2),DUZ'=$P(XMZREC,U,4),'$D(^XUSEC("XMMGR",DUZ)),'$D(^XMB(3.7,"AB",DUZ,.5,0)) D  Q 0
 | 
|---|
| 112 |  . D ERRSET^XMXUTIL(37461,"",XMZ) ; Only the originator, postmaster surrogate, or XMMGR key holder may do this in SHARED,MAIL.
 | 
|---|
| 113 |  Q 1
 | 
|---|
| 114 | FORWARD(XMDUZ,XMZ,XMZREC) ; Forward (1=may, 0=may not)
 | 
|---|
| 115 |  I XMDUZ'=DUZ Q:'$$RWPRIV 0  Q:'$$SURRACC(XMDUZ,"",XMZ,.XMZREC) 0  ; "forward"
 | 
|---|
| 116 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 117 |  I $$CLOSED(XMZREC),'$$ORIGIN8R(XMDUZ,XMZREC) D ERRSET^XMXUTIL(37406.1,"",XMZ) Q 0  ; Only the message originator may forward CLOSED messages.
 | 
|---|
| 118 |  I XMDUZ=.6,DUZ'=$P(XMZREC,U,2),DUZ'=$P(XMZREC,U,4) D ERRSET^XMXUTIL(37406.6,"",XMZ) Q 0  ; Only the originator may forward messages in SHARED,MAIL.
 | 
|---|
| 119 |  Q 1
 | 
|---|
| 120 | LATER(XMDUZ) ; Later or New Toggle (1=may, 0=may not)
 | 
|---|
| 121 |  I DUZ=.6!(XMDUZ=.6) D ERRSET^XMXUTIL(37462) Q 0  ; SHARED,MAIL may not 'later' or 'new toggle' a message.
 | 
|---|
| 122 |  Q:XMDUZ=DUZ 1
 | 
|---|
| 123 |  Q $$RWPRIV
 | 
|---|
| 124 | MOVE(XMDUZ,XMZ,XMZREC) ; Save or Filter (1=may, 0=may not)
 | 
|---|
| 125 |  Q:XMDUZ=DUZ 1
 | 
|---|
| 126 |  Q:'$$RWPRIV 0
 | 
|---|
| 127 |  ;Q:'$$SURRACC(XMDUZ,"",XMZ,.XMZREC) 0  ; "save"
 | 
|---|
| 128 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 129 |  I XMDUZ=.6,DUZ'=$P(XMZREC,U,2),DUZ'=$P(XMZREC,U,4),'$D(^XUSEC("XMMGR",DUZ)),'$D(^XMB(3.7,"AB",DUZ,.5,0)) D  Q 0
 | 
|---|
| 130 |  . D ERRSET^XMXUTIL(37461,"",XMZ) ; Only the originator, postmaster surrogate, or XMMGR key holder may do this in SHARED,MAIL.
 | 
|---|
| 131 |  Q 1
 | 
|---|
| 132 | READ(XMDUZ,XMZ,XMZREC) ; Read or Print (1=may, 0=may not)
 | 
|---|
| 133 |  Q:XMDUZ=DUZ 1
 | 
|---|
| 134 |  Q $$SURRACC(XMDUZ,"",XMZ,.XMZREC)  ; "access"
 | 
|---|
| 135 | REPLY(XMDUZ,XMZ,XMZREC) ; Reply (1=may, 0=may not)
 | 
|---|
| 136 |  ; Should we make sure XMZ is an original msg and not a reply?
 | 
|---|
| 137 |  ; Should we make sure the msg has recipients?
 | 
|---|
| 138 |  I DUZ=.6 D ERRSET^XMXUTIL(37422.6,"",XMZ) Q 0  ; May not reply to message as SHARED,MAIL.
 | 
|---|
| 139 |  I XMDUZ'=DUZ Q:'$$RWPRIV 0  Q:'$$SURRACC(XMDUZ,"",XMZ,.XMZREC) 0  ; "reply to"
 | 
|---|
| 140 |  I $G(XMZREC)="" S XMZREC=$G(^XMB(3.9,XMZ,0))
 | 
|---|
| 141 |  I $D(^XMB(3.9,XMZ,"K")),$$PAKMAN^XMXSEC1(XMZ,XMZREC) D ERRSET^XMXUTIL(37422.4,"",XMZ) Q 0  ; May not reply to secure PackMan message.
 | 
|---|
| 142 |  Q:$$ORIGIN8R(XMDUZ,XMZREC) 1
 | 
|---|
| 143 |  I $$INFO(XMZREC) D ERRSET^XMXUTIL(37422.1,"",XMZ) Q 0  ; Only originator may reply to 'INFORMATION ONLY' message.
 | 
|---|
| 144 |  I $P($G(^XMB(3.9,XMZ,1,+$O(^XMB(3.9,XMZ,1,"C",XMDUZ,0)),"T")),U,1)["I" D ERRSET^XMXUTIL(37422.2,"",XMZ) Q 0  ; 'INFORMATION ONLY' recipient may not reply to message.
 | 
|---|
| 145 |  I $P(XMZREC,U,2)["POSTMASTER@" D ERRSET^XMXUTIL(37422.5,"",XMZ) Q 0  ; You may not reply to a message from a remote Postmaster."
 | 
|---|
| 146 |  Q 1
 | 
|---|
| 147 | SEND(XMDUZ,XMINSTR) ; Send (1=may, 0=may not)
 | 
|---|
| 148 |  I DUZ=.6!(XMDUZ=.6) D ERRSET^XMXUTIL(37462) Q 0  ; You may not do this in SHARED,MAIL.
 | 
|---|
| 149 |  Q:XMDUZ=DUZ 1
 | 
|---|
| 150 |  Q:$D(XMINSTR("FROM")) 1
 | 
|---|
| 151 |  Q:XMDUZ=.5 1
 | 
|---|
| 152 |  Q $$WPRIV
 | 
|---|
| 153 | RWPRIV() ; Does the surrogate have 'read' or 'send' privilege? (1=yes, 0=no)
 | 
|---|
| 154 |  Q:$G(XMV("PRIV"))["R"!($G(XMV("PRIV"))["W") 1
 | 
|---|
| 155 |  D ERRSET^XMXUTIL(37457,XMV("NAME")) ; You do not have 'read' or 'send' privilege for "_XMV("NAME")
 | 
|---|
| 156 |  Q 0
 | 
|---|
| 157 | RPRIV() ; Does the surrogate have 'read' privilege? (1=yes, 0=no)
 | 
|---|
| 158 |  Q:$G(XMV("PRIV"))["R" 1
 | 
|---|
| 159 |  D ERRSET^XMXUTIL(37455,XMV("NAME")) ; You do not have 'read' privilege for "_XMV("NAME")
 | 
|---|
| 160 |  Q 0
 | 
|---|
| 161 | WPRIV() ; Does the surrogate have 'send' privilege? (1=yes, 0=no)
 | 
|---|
| 162 |  Q:$G(XMV("PRIV"))["W" 1
 | 
|---|
| 163 |  D ERRSET^XMXUTIL(37456,XMV("NAME")) ; You do not have 'send' privilege for "_XMV("NAME")
 | 
|---|
| 164 |  Q 0
 | 
|---|
| 165 | POSTPRIV() ; Perform postmaster actions (1=may, 0=may not)
 | 
|---|
| 166 |  ; This includes permission to perform group message actions in Shared,Mail.
 | 
|---|
| 167 |  I '$D(^XUSEC("XMMGR",DUZ)),'$D(^XMB(3.7,"AB",DUZ,.5)) D ERRSET^XMXUTIL(37458) Q 0  ; Only a POSTMASTER surrogate or XMMGR key holder may do this.
 | 
|---|
| 168 |  Q 1
 | 
|---|
| 169 | ZPOSTPRV() ; Perform postmaster actions (1=may, 0=may not)
 | 
|---|
| 170 |  ; This includes permission to perform group message actions in Shared,Mail.
 | 
|---|
| 171 |  Q:$D(^XUSEC("XMMGR",DUZ)) 1
 | 
|---|
| 172 |  Q:$D(^XMB(3.7,"AB",DUZ,.5)) 1
 | 
|---|
| 173 |  Q 0
 | 
|---|