It isn't a workaround
[squirrelmail.git] / class / deliver / Deliver.class.php
index 093f5a273e15621bd27f6c88040554005001d297..9a9bce0596f9d6bde60f83d514851576dace36ac 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Deliver.class.php
  *
- * Copyright (c) 1999-2004 The SquirrelMail Project Team
+ * Copyright (c) 1999-2005 The SquirrelMail Project Team
  * Licensed under the GNU GPL. For full terms see the file COPYING.
  *
  * This contains all the functions needed to send messages through
@@ -76,8 +76,17 @@ class Deliver {
         if ($boundary && $message->entity_id && count($message->entities)) {
             if (strpos($boundary,'_part_')) {
                 $boundary = substr($boundary,0,strpos($boundary,'_part_'));
+
+            // the next four lines use strrev to reverse any nested boundaries
+            // because RFC 2046 (5.1.1) says that if a line starts with the outer
+            // boundary string (doesn't matter what the line ends with), that
+            // can be considered a match for the outer boundary; thus the nested
+            // boundary needs to be unique from the outer one
+            //
+            } else if (strpos($boundary,'_trap_')) {
+                $boundary = substr(strrev($boundary),0,strpos(strrev($boundary),'_part_'));
             }
-            $boundary_new = $boundary . '_part_'.$message->entity_id;
+            $boundary_new = strrev($boundary . '_part_'.$message->entity_id);
         } else {
             $boundary_new = $boundary;
         }
@@ -133,6 +142,8 @@ class Deliver {
         case 'message':
             if ($message->body_part) {
                 $body_part = $message->body_part;
+                // remove NUL characters
+                $body_part = str_replace("\0",'',$body_part);
                 $length += $this->clean_crlf($body_part);
                 if ($stream) {
                     $this->preWriteToStream($body_part);
@@ -290,7 +301,7 @@ class Deliver {
         $contenttype = 'Content-Type: '. $mime_header->type0 .'/'.
                         $mime_header->type1;
         if (count($message->entities)) {
-            $contenttype .= ";\r\n " . 'boundary="'.$boundary.'"';
+            $contenttype .= ';' . 'boundary="'.$boundary.'"';
         }
         if (isset($mime_header->parameters['name'])) {
             $contenttype .= '; name="'.
@@ -304,19 +315,19 @@ class Deliver {
 
         $header[] = $contenttype . $rn;
         if ($mime_header->description) {
-            $header[] .= 'Content-Description: ' . $mime_header->description . $rn;
+            $header[] = 'Content-Description: ' . $mime_header->description . $rn;
         }
         if ($mime_header->encoding) {
-            $header[] .= 'Content-Transfer-Encoding: ' . $mime_header->encoding . $rn;
+            $header[] = 'Content-Transfer-Encoding: ' . $mime_header->encoding . $rn;
         } else {
             if ($mime_header->type0 == 'text' || $mime_header->type0 == 'message') {
-                $header[] .= 'Content-Transfer-Encoding: 8bit' .  $rn;
+                $header[] = 'Content-Transfer-Encoding: 8bit' .  $rn;
             } else {
-                $header[] .= 'Content-Transfer-Encoding: base64' .  $rn;
+                $header[] = 'Content-Transfer-Encoding: base64' .  $rn;
             }
         }
         if ($mime_header->id) {
-            $header[] .= 'Content-ID: ' . $mime_header->id . $rn;
+            $header[] = 'Content-ID: ' . $mime_header->id . $rn;
         }
         if ($mime_header->disposition) {
             $disposition = $mime_header->disposition;
@@ -328,10 +339,10 @@ class Deliver {
             $header[] = $contentdisp . $rn;
         }
         if ($mime_header->md5) {
-            $header[] .= 'Content-MD5: ' . $mime_header->md5 . $rn;
+            $header[] = 'Content-MD5: ' . $mime_header->md5 . $rn;
         }
         if ($mime_header->language) {
-            $header[] .= 'Content-Language: ' . $mime_header->language . $rn;
+            $header[] = 'Content-Language: ' . $mime_header->language . $rn;
         }
 
         $cnt = count($header);
@@ -394,7 +405,7 @@ class Deliver {
         if ( !isset($skip_SM_header) || !$skip_SM_header )
         {
           $header[] = "Received: from $received_from" . $rn;
-          $header[] = "        (SquirrelMail authenticated user $username);" . $rn;
+          $header[] = "        (SquirrelMail authenticated user $username)" . $rn;
           $header[] = "        by $SERVER_NAME with HTTP;" . $rn;
           $header[] = "        $date" . $rn;
         }
@@ -452,7 +463,7 @@ class Deliver {
         }
         $header[] = $contenttype . $rn;
         if ($encoding = $rfc822_header->encoding) {
-            $header[] .= 'Content-Transfer-Encoding: ' . $encoding .  $rn;
+            $header[] = 'Content-Transfer-Encoding: ' . $encoding .  $rn;
         }
         if ($rfc822_header->dnt) {
             $dnt = $rfc822_header->getAddr_s('dnt');
@@ -465,14 +476,11 @@ class Deliver {
             switch($rfc822_header->priority)
             {
             case 1:
-               $header[] = 'X-Priority: 1 (Highest)'.$rn;
-               $header[] = 'Importance: High'. $rn; break;
-            case 3:
-               $header[] = 'X-Priority: 3 (Normal)'.$rn;
-               $header[] = 'Importance: Normal'. $rn; break;
+                $header[] = 'X-Priority: 1 (Highest)'.$rn;
+                $header[] = 'Importance: High'. $rn; break;
             case 5:
-               $header[] = 'X-Priority: 5 (Lowest)'.$rn;
-               $header[] = 'Importance: Low'. $rn; break;
+                $header[] = 'X-Priority: 5 (Lowest)'.$rn;
+                $header[] = 'Importance: Low'. $rn; break;
             default: break;
             }
         }