$NetBSD: patch-au,v 1.2 1998/08/07 11:09:34 agc Exp $

diff -cr /nr/user/skr/lib/exmh2.0zeta/mime.tcl ./mime.tcl
*** /nr/user/skr/lib/exmh2.0zeta/mime.tcl	Fri Oct  3 21:56:34 1997
--- lib/mime.tcl	Wed Dec 10 12:57:57 1997
***************
*** 176,181 ****
--- 176,191 ----
  	{mime(mdnTo) dispositionNotificationTo {} {Disposition Notification To}
  "The address where you want MDN receipts to end up.  This normally your
  own email address."}
+ 	{mime(mdnSend) dispositionNotificationSend
+          {CHOICE never deny {ask user} auto/ask auto/ignore } 
+          {Send MDNs}
+ "This controls if and how to send MDNs.  The options are:
+   - Never generate MDN, always ignore requests.
+   - Automatically generate a \"denied\" MDN when a MDN is requested.
+   - Ask user whether to generate a MDN when displaying the message.
+   - Automatically when displaying the message, but ask user in 
+     certain cases where it may not be appropriate to generate MDNs.
+   - As above, but silently ignore potentially suspect MDN requests."}
      }
      set i 0
      foreach char {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \
***************
*** 1016,1029 ****
  	}
  	MimeShowHeaders $tkw $part=1 [MimeLabel $part part]
  	MimeInsertSeparator $tkw $part 6
!     	if {$part == 0 \
! 	    && ![info exists mimeHdr(0=1,hdr,x-exmhmdn)] \
! 	    && [info exists mimeHdr(0=1,hdr,disposition-notification-to)]} {
! 	    if [info exists mime(mdnDone)] {
! 		unset mime(mdnDone)
! 	    } else {
! 		MDNAsk $tkw $mimeHdr(0=1,hdr,disposition-notification-to)
! 	    }
          }
  
  	MimeShowPart $tkw $part=1 [MimeLabel $part part] 1
--- 1026,1033 ----
  	}
  	MimeShowHeaders $tkw $part=1 [MimeLabel $part part]
  	MimeInsertSeparator $tkw $part 6
!     	if {$part == 0} {
! 	    MDNCheck $tkw
          }
  
  	MimeShowPart $tkw $part=1 [MimeLabel $part part] 1
***************
*** 1811,1824 ****
  		MimeShowMinHeaders $tkw $part 1
  	    }
  	    MimeInsertSeparator $tkw $part 6
! 	    if {![info exists mimeHdr(0=1,hdr,x-exmhmdn)] && \
! 		   [info exists mimeHdr(0=1,hdr,disposition-notification-to)]} {
! 		if [info exists mime(mdnDone)] {
! 		    unset mime(mdnDone)
! 		} else {
! 		    MDNAsk $tkw $mimeHdr(0=1,hdr,disposition-notification-to)
! 		}
! 	    }
  	    if [info exists mimeHdr($part,param,charset)] {
  		set tag [MimeSetCharset $tkw $part]
  		$tkw tag remove noteTag "insert -1line"  end
--- 1815,1821 ----
  		MimeShowMinHeaders $tkw $part 1
  	    }
  	    MimeInsertSeparator $tkw $part 6
! 	    MDNCheck $tkw
  	    if [info exists mimeHdr($part,param,charset)] {
  		set tag [MimeSetCharset $tkw $part]
  		$tkw tag remove noteTag "insert -1line"  end

diff -cr /nr/user/skr/lib/exmh2.0zeta/receipt.tcl ./receipt.tcl
*** /nr/user/skr/lib/exmh2.0zeta/receipt.tcl	Thu Oct  2 17:01:22 1997
--- lib/receipt.tcl	Thu Dec 11 09:12:39 1997
***************
*** 46,57 ****
      $t insert 1.0 "Disposition-Notification-To: $mdnTo\n"
  }
  
! proc MDNGenerate { file address choice } {
      global exwin mimeHdr
  
      if {$choice != "ignored"} {
! 	set mdnfile [MDNBuildDraft $file $address $choice]
! 	exec send $mdnfile
      }
      MDNAddHeaderToDraft $file "X-ExmhMDN: $choice"
      MsgShowInText $exwin(mtext) $mimeHdr(0,rawfile)
--- 46,61 ----
      $t insert 1.0 "Disposition-Notification-To: $mdnTo\n"
  }
  
! proc MDNGenerate { file address choice mode } {
      global exwin mimeHdr
  
      if {$choice != "ignored"} {
! 	set mdnfile [MDNBuildDraft $file $address $choice $mode]
! 	if [catch {exec send $mdnfile} result] {
! 	    Exmh_Debug "send result: $result"
! 	    Exmh_Status "Could not send message disposition notification" error
! 	    return
! 	}
      }
      MDNAddHeaderToDraft $file "X-ExmhMDN: $choice"
      MsgShowInText $exwin(mtext) $mimeHdr(0,rawfile)
***************
*** 82,109 ****
      Mh_Rename $draft.new $draft
  }
  
! proc MDNAsk {tkw address} {
      global mimeHdr exmh
  
!     $tkw insert insert "  The sender wants you to acknowledge that you have \
! 	seen this mail.  Do you want to send a receipt to $address?\n"
!     $tkw insert insert "       "
!     TextButton $tkw "Confirm now" \
  	[list MDNGenerate $mimeHdr(0,rawfile) \
! 	$mimeHdr(0=1,hdr,disposition-notification-to) "displayed"]
      $tkw insert insert "    "
      TextButton $tkw "Send denial" \
  	[list MDNGenerate $mimeHdr(0,rawfile) \
! 	$mimeHdr(0=1,hdr,disposition-notification-to) "denied"]
      $tkw insert insert "    "
      TextButton $tkw "Ignore silently" \
  	[list MDNGenerate $mimeHdr(0,rawfile) \
! 	$mimeHdr(0=1,hdr,disposition-notification-to) "ignored"]
      $tkw insert insert "\n"
      MimeInsertSeparator $tkw 0 6
  }
  
  proc MDNReportDialog { tkw from date disp parts } {
      if {$parts == 2} {
  	$tkw insert insert "This mail contains a message disposition \
  		notification, regarding the message to $from.\n\n"
--- 86,238 ----
      Mh_Rename $draft.new $draft
  }
  
! proc MDNAsk {tkw address explain} {
      global mimeHdr exmh
  
!     $tkw insert insert "  The sender wants you to acknowledge that you have\
! 	seen this mail."
!     if {[string compare $explain {}] != 0} {
! 	$tkw insert insert "\n\n  NOTE! For the reason(s) listed below, it may\
!             be unsafe to send the disposition notification.  Please check the\
!             message carefully.  Unless you are sure that it is safe to send\
!             the notification, press \"Ignore silently\""
! 	$tkw insert insert $explain
!     }
! 
!     $tkw insert insert "\n\n  Do you want to send a disposition notification\
!         (receipt) to \n      $address?"
!     $tkw insert insert "\n\n       "
!     TextButton $tkw "Send confirmation" \
  	[list MDNGenerate $mimeHdr(0,rawfile) \
! 	     $mimeHdr(0=1,hdr,disposition-notification-to) \
! 	     "displayed" "manual-action/MDN-sent-manually"]
      $tkw insert insert "    "
      TextButton $tkw "Send denial" \
  	[list MDNGenerate $mimeHdr(0,rawfile) \
! 	     $mimeHdr(0=1,hdr,disposition-notification-to) \
! 	     "denied" "manual-action/MDN-sent-manually"]
      $tkw insert insert "    "
      TextButton $tkw "Ignore silently" \
  	[list MDNGenerate $mimeHdr(0,rawfile) \
! 	$mimeHdr(0=1,hdr,disposition-notification-to) \
! 	     "ignored" {}]
      $tkw insert insert "\n"
      MimeInsertSeparator $tkw 0 6
  }
  
+ proc MDNCheck { tkw } {
+     global mimeHdr mime
+ 
+     if {![info exists mimeHdr(0=1,hdr,x-exmhmdn)] && \
+ 	    [info exists mimeHdr(0=1,hdr,disposition-notification-to)]} {
+ 	if [info exists mime(mdnDone)] {
+ 	    unset mime(mdnDone)
+ 	} else {
+ 	    set dnt $mimeHdr(0=1,hdr,disposition-notification-to)
+ 
+ 	    switch $mime(mdnSend) {
+ 		"never" {
+ 		    set mdnAction1 "ignored"
+ 		    set mdnAction2 "ignored"
+ 		}
+ 		"deny" {
+ 		    set mdnAction1 "denied"
+ 		    set mdnAction2 "ignored"
+ 		}
+ 		"ask user" {
+ 		    set mdnAction1 "ask"
+ 		    set mdnAction2 "ask"
+ 		}
+ 		"auto/ask" {
+ 		    set mdnAction1 "displayed"
+ 		    set mdnAction2 "ask"
+ 		}
+ 		"auto/ignore" {
+ 		    set mdnAction1 "displayed"
+ 		    set mdnAction2 "ignored"
+ 		}
+ 		default {
+ 		    set mdnAction1 "ask"
+ 		    set mdnAction2 "ask"
+ 		}
+ 	    }
+ 
+ 	    set mdnExplain {}
+ 	    
+ 	    set line [string trim $dnt]
+ 	    if [regsub {\(.*\)} $line {} newline] {
+ 		set line $newline
+ 	    }
+ 
+ 	    if {[string first "|" $line] != -1} {
+ 		set mdnAction1 "ignore"
+ 		set mdnExplain "$mdnExplain 
+ 
+  * The address(es) for the disposition notification contains a pipe symbol (|)
+    *** THIS MAY BE A SERIOUS SECURITY HOLE."
+ 	    }
+ 
+ 	    if {[string first "," $line] != -1} {
+ 		set mdnAction1 $mdnAction2
+ 		set mdnExplain "$mdnExplain 
+ 
+  * The sender appears to have requested a disposition notification to be
+    sent to more than one address.  If you are not sure that there is a valid
+    reason to send disposition notifications to each of these addresses,
+    the request should be ignored and no disposition notifications sent."
+ 	    }
+ 
+ 	    if [info exists mimeHdr(0=1,hdr,return-path)] {
+ 		if {[string compare \
+ 			 [MsgParseFrom $mimeHdr(0=1,hdr,return-path) {}] \
+ 			 [MsgParseFrom $line {}]] != 0} {
+ 		    set mdnAction1 $mdnAction2
+ 		    set mdnExplain "$mdnExplain
+ 
+  * The disposition notification appears to be directed somewhere else than
+    to the sender of the message.  If you are not sure that there is a valid
+    reason for this, the request should be ignored and no disposition
+    notifications sent."
+ 		}
+ 	    } else {
+ 		set mdnAction1 $mdnAction2
+ 		set mdnExplain "$mdnExplain
+ 
+  * The message does not have a Return-path header field, and therefore it
+    is not possible to verify that the disposition notification address(es)
+    is valid."
+ 	    }
+ 
+ 	    if [info exists mimeHdr(0=1,hdr,disposition-notification-options)]\
+ 	    {
+ 		set mdnAction1 $mdnAction2
+ 		set mdnExplain "$mdnExplain
+ 
+  * The message has a Disposition-notification-options header requesting
+    some special processing which exmh does not know about."
+ 		if [regexp -nocase {=[ ]*required[ ]*,} \
+ 			$mimeHdr(0=1,hdr,disposition-notification-options)] {
+ 		    set mdnAction1 "ignored"
+ 		    set mdnExplain "$mdnExplain
+ 
+    Since one or more of the unknown options are required to be taken into
+    account for generating a proper disposition notification, no disposition
+    notification at all should be generated."
+ 		}
+ 	    }
+ 
+ 	    if {[string compare $mdnAction1 "ask"] == 0} {
+ 		MDNAsk $tkw $dnt $mdnExplain
+ 	    } else {
+ 		MDNGenerate $mimeHdr(0,rawfile) $dnt $mdnAction1 \
+ 		    "manual-action/MDN-sent-automatically"
+ 	    }
+ 	}
+     }
+ }
+ 
  proc MDNReportDialog { tkw from date disp parts } {
+ 
      if {$parts == 2} {
  	$tkw insert insert "This mail contains a message disposition \
  		notification, regarding the message to $from.\n\n"
***************
*** 111,163 ****
  	$tkw insert insert "This mail contains a message disposition \
  		notification, regarding the message to $from on $date.\n\n"
      }
!     switch [string tolower $disp] {
! 	"displayed" {
! 	    set jtext \
! "The mail was displayed by the user agent to someone reading the recipient's \
! mailbox.  This does not guarantee that it is read or understood."
! 	}
! 	"denied" {
! 	    set jtext \
! "The recipient does not wish you to be informed of the message's disposition."
! 	}
! 	"processed" {
! 	    set jtext \
! "The message has been processed in some manner (e.g. printed, faxed, \
! forwarded) in response to a user command, without being displayed to the \
! user.  The user may or may not see the message later."
! 	}
! 	"autoprocessed" {
! "The message has been processed automatically in some manner (e.g. printed, \
! faxed, forwarded, gatewayed) in response to some user request made in \
! advance, without being displayed to the user.  The user may or may not see the \
! message later."
! 	}
! 	"deleted" {
! "The message has manually been deleted.  The recipient may or may not have \
! seen the message."
! 	}
! 	"autodeleded" {
! "The message has been automatically deleted without being displayed to the \
! recipient."
! 	}
! 	"obsoleted" {
! "The message has been automatically rendered obsolete by another message \
! received.  The recipient may still access and read the message later."
! 	}
! 	"terminated" {
! "The recipient's mailbox has been terminated and all messagess in it \
! automatically deleted."
! 	}
! 	"autodenied" {
! "The recipient does not wish the sender to be informed of the message's \
! disposition, and has requested that this MDN be sent automatically."
  	}
! 	default {
! 	    set jtext "The reciept type is $disp."
  	}
      }
!     $tkw insert insert $jtext\n\n
      if {$parts != 2} {
  	$tkw insert insert "       "
  	TextButton $tkw "View requesting message" \
--- 240,336 ----
  	$tkw insert insert "This mail contains a message disposition \
  		notification, regarding the message to $from on $date.\n\n"
      }
! 
!     $tkw insert insert "The disposition of the message is: \n   $disp\n\n"
! 
!     if [regsub -all {(\(.*\))|([ 	]+)} $disp {} newline] {
! 	set disp $newline
!     }
! 
!     if [regexp -nocase {^([-a-z]+)/([-a-z]+);([-a-z]+)(/(.*))?$} $disp match \
! 	    action_mode sending_mode disp_type match2 disp_modifiers] {
! 
! 	$tkw insert insert "This means:\n"
! 
! 	switch [string tolower $action_mode] {
! 	    "manual-action" {
! 		$tkw insert insert "
!     A manual action happened to the message:\n"
! 	    }
! 	    "automatic-action" {
! 		$tkw insert insert "
!     An automatic action happened to the message:\n"
! 	    }
! 	    default {
! 		$tkw insert insert "
!     An action (described as $action_mode) happened to the message:\n"
! 	    }
  	}
! 
! 	switch [string tolower $disp_type] {
! 	    "displayed" {
! 		set jtext "
!         The mail was displayed by the user agent to someone reading the
!         recipient's mailbox.  (This does not guarantee that it is read
!         or understood.)"
! 	    }
! 	    "denied" {
! 		set jtext "
!         The recipient does not wish you to be informed of the message's
!         disposition."
! 	    }
! 	    "dispatched" {
! 	        set jtext "
!         The mail has been sent somewhere (e.g. printed, faxed, forwarded)
!         without being displayed to the user.  (The user may or may not see
!         the message later.)"
!             }
! 	    "processed" {
! 	        set jtext "
!         The message has been processed in some manner (i.e. by some sort of
!         rules or server) without being displayed to the user.  (The user may
!         or may not see the message later, or there may not even be a human
!         user associated with the mailbox.)"
!             }
!             "failed" {
! 	        set jtext "
!         A failure occurred that prevented the proper generation of an MDN."
!             }
! 	    "deleted" {
! 	        set jtext "
!         The message has been deleted.  (The recipient may or may not have
!         seen the message.  The recipient might \"undelete\" the message at a
!         later time and read the message.)"
!     	    }
!             default {
! 	        set jtext "
!         Unknown disposition type $disp_type."
!    	    }
!         }
!         $tkw insert insert $jtext\n
! 
! 	switch [string tolower $sending_mode] {
! 	    "mdn-sent-manually" {
! 		$tkw insert insert "
!     The recipient manually caused this MDN to be sent."
! 	    }
! 	    "mdn-sent-automatically" {
! 		$tkw insert insert "    \
!     This MDN was generated automatically."
! 	    }
! 	    default {
! 		$tkw insert insert "
!     The way the MDN was sent is described as: $sending_mode
!     (which is not a valid code)."
! 	    }
  	}
+     } else {
+ 	$tkw insert insert "
+ The format of the disposition string is not recognized, cannot
+ explain it further."
      }
! 
!     $tkw insert insert "\n\n\n"
      if {$parts != 2} {
  	$tkw insert insert "       "
  	TextButton $tkw "View requesting message" \
***************
*** 181,187 ****
      }
  }
  
! proc MDNBuildDraft { draft address doit } {
      global env mimeHdr faces exmh
      set host [exec hostname]
  
--- 354,360 ----
      }
  }
  
! proc MDNBuildDraft { draft address doit choice} {
      global env mimeHdr faces exmh
      set host [exec hostname]
  
***************
*** 226,232 ****
      if [info exists mimeHdr(0=1,hdr,message-id)] {
  	puts $out "Original-Message-ID: $mimeHdr(0=1,hdr,message-id)"
      }
!     puts $out "Disposition: $doit"
  
      FvMimeAddPart $out $bdry "message/rfc822\n"
  
--- 399,405 ----
      if [info exists mimeHdr(0=1,hdr,message-id)] {
  	puts $out "Original-Message-ID: $mimeHdr(0=1,hdr,message-id)"
      }
!     puts $out "Disposition: $choice; $doit"
  
      FvMimeAddPart $out $bdry "message/rfc822\n"
  
