From be72fb3597c21ca3aaa058adf41bb72d53d197c7 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Fri, 28 Dec 2012 06:40:57 -0500
Subject: [PATCH] Unified attachments filenames handling for message parts without a filename

---
 program/steps/mail/compose.inc          |   11 -----
 program/steps/mail/func.inc             |   30 ++++++++++++--
 program/lib/Roundcube/rcube_message.php |   21 ----------
 program/localization/en_US/labels.inc   |    1 
 program/steps/mail/show.inc             |    5 --
 program/steps/mail/get.inc              |   21 +---------
 6 files changed, 30 insertions(+), 59 deletions(-)

diff --git a/program/lib/Roundcube/rcube_message.php b/program/lib/Roundcube/rcube_message.php
index 9fea838..d450bb4 100644
--- a/program/lib/Roundcube/rcube_message.php
+++ b/program/lib/Roundcube/rcube_message.php
@@ -106,7 +106,6 @@
         if (!empty($this->headers->structure)) {
             $this->get_mime_numbers($this->headers->structure);
             $this->parse_structure($this->headers->structure);
-            $this->parse_attachments();
         }
         else {
             $this->body = $this->storage->get_body($uid);
@@ -646,26 +645,6 @@
         // message is a single part non-text (without filename)
         else if (preg_match('/application\//i', $mimetype)) {
             $this->attachments[] = $structure;
-        }
-    }
-
-
-    /**
-     * Parse attachment parts
-     */
-    private function parse_attachments()
-    {
-        // Attachment must have a name
-        foreach ($this->attachments as $attachment) {
-            if (!$attachment->filename) {
-                $ext = rcube_mime::get_mime_extensions($attachment->mimetype);
-                $ext = array_shift($ext);
-
-                $attachment->filename = 'Part_' . $attachment->mime_id;
-                if ($ext) {
-                    $attachment->filename .= '.' . $ext;
-                }
-            }
         }
     }
 
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 730e6af..fa8f33d 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -377,6 +377,7 @@
 $labels['preferhtml'] = 'Display HTML';
 $labels['defaultcharset'] = 'Default Character Set';
 $labels['htmlmessage'] = 'HTML Message';
+$labels['messagepart'] = 'Part';
 $labels['dateformat'] = 'Date format';
 $labels['timeformat'] = 'Time format';
 $labels['prettydate'] = 'Pretty dates';
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 379e920..74c6d5f 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -1154,16 +1154,7 @@
   }
 
   $mimetype = $part->ctype_primary . '/' . $part->ctype_secondary;
-  $filename = $part->filename;
-  if (!strlen($filename)) {
-    if ($mimetype == 'text/html') {
-      $filename = rcube_label('htmlmessage');
-    }
-    else {
-      $filename = 'Part_'.$pid;
-    }
-    $filename .= '.' . $part->ctype_secondary;
-  }
+  $filename = rcmail_attachment_name($part);
 
   $attachment = array(
     'group' => $COMPOSE['id'],
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 814adb6..bedd3e8 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -1598,10 +1598,7 @@
   $part  = $MESSAGE->mime_parts[$part];
   $table = new html_table(array('cols' => 3));
 
-  $filename = $part->filename;
-  if (empty($filename) && $attach_prop->mimetype == 'text/html') {
-    $filename = rcube_label('htmlmessage');
-  }
+  $filename = rcmail_attachment_name($part);
 
   if (!empty($filename)) {
     $table->add('title', Q(rcube_label('filename')));
@@ -1614,7 +1611,6 @@
 
   return $table->show($attrib);
 }
-
 
 
 function rcmail_message_part_frame($attrib)
@@ -1841,6 +1837,30 @@
   return $name;
 }
 
+// return attachment filename, handle empty filename case
+function rcmail_attachment_name($attachment)
+{
+    $filename = $attachment->filename;
+
+    if ($filename === null || $filename === '') {
+        if ($attachment->mimetype == 'text/html') {
+            $filename = rcube_label('htmlmessage');
+        }
+        else {
+            $ext      = rcube_mime::get_mime_extensions($attachment->mimetype);
+            $ext      = array_shift($ext);
+            $filename = rcube_label('messagepart') . ' ' . $attachment->mime_id;
+            if ($ext) {
+                $filename .= '.' . $ext;
+            }
+        }
+    }
+
+    $filename = preg_replace('[\r\n]', '', $filename);
+
+    return $filename;
+}
+
 function rcmail_search_filter($attrib)
 {
   global $OUTPUT, $CONFIG;
diff --git a/program/steps/mail/get.inc b/program/steps/mail/get.inc
index 803716d..37f728e 100644
--- a/program/steps/mail/get.inc
+++ b/program/steps/mail/get.inc
@@ -47,13 +47,7 @@
 // show part page
 if (!empty($_GET['_frame'])) {
   if (($part_id = get_input_value('_part', RCUBE_INPUT_GPC)) && ($part = $MESSAGE->mime_parts[$part_id])) {
-    $filename = $part->filename;
-    if (empty($filename) && $part->mimetype == 'text/html') {
-      $filename = rcube_label('htmlmessage');
-    }
-    if (!empty($filename)) {
-      $OUTPUT->set_pagetitle($filename);
-    }
+    $OUTPUT->set_pagetitle(rcmail_attachment_name($part));
   }
 
   $OUTPUT->send('messagepart');
@@ -236,18 +230,7 @@
       // don't kill the connection if download takes more than 30 sec.
       @set_time_limit(0);
 
-      if ($part->filename) {
-        $filename = $part->filename;
-      }
-      else if ($part->mimetype == 'text/html') {
-        $filename = rcube_label('htmlmessage');
-      }
-      else {
-        $ext = '.' . ($mimetype == 'text/plain' ? 'txt' : $ctype_secondary);
-        $filename = ($MESSAGE->subject ? $MESSAGE->subject : 'roundcube') . $ext;
-      }
-
-      $filename = preg_replace('[\r\n]', '', $filename);
+      $filename = rcmail_attachment_name($part);
 
       if ($browser->ie && $browser->ver < 7)
         $filename = rawurlencode(abbreviate_string($filename, 55));
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index 82594f3..22f4ff4 100644
--- a/program/steps/mail/show.inc
+++ b/program/steps/mail/show.inc
@@ -150,10 +150,7 @@
 
   if (sizeof($MESSAGE->attachments)) {
     foreach ($MESSAGE->attachments as $attach_prop) {
-      $filename = $attach_prop->filename;
-      if (empty($filename) && $attach_prop->mimetype == 'text/html') {
-        $filename = rcube_label('htmlmessage');
-      }
+      $filename = rcmail_attachment_name($attach_prop);
 
       if ($PRINT_MODE) {
         $size = $RCMAIL->message_part_size($attach_prop);

--
Gitblit v1.9.1