allow email attachments with unicode
authorJon Goldberg <jon@megaphonetech.com>
Wed, 11 Oct 2023 22:21:15 +0000 (18:21 -0400)
committerJon Goldberg <jon@megaphonetech.com>
Wed, 11 Oct 2023 22:38:10 +0000 (18:38 -0400)
CRM/Core/QuickForm/Action/Upload.php
CRM/Utils/File.php
CRM/Utils/Mail.php

index c86d0b2f1602005de931f613b76a3d2d7440c538..9f7089893d2ff6bc4f874a2c91f09051d61bfbe8 100644 (file)
@@ -77,7 +77,7 @@ class CRM_Core_QuickForm_Action_Upload extends CRM_Core_QuickForm_Action {
         // rename the uploaded file with a unique number at the end
         $value = $element->getValue();
 
-        $newName = CRM_Utils_File::makeFileName($value['name']);
+        $newName = CRM_Utils_File::makeFileName($value['name'], TRUE);
         $status = $element->moveUploadedFile($this->_uploadDir, $newName);
         if (!$status) {
           CRM_Core_Error::statusBounce(ts('We could not move the uploaded file %1 to the upload directory %2. Please verify that the \'Temporary Files\' setting points to a valid path which is writable by your web server.', [
index 833204adbf58f0393213586c793faf63b5635213..e9d97505306ad5f482e982f6f9d176167019141b 100644 (file)
@@ -418,22 +418,29 @@ class CRM_Utils_File {
    * Make a valid file name.
    *
    * @param string $name
+   * @param bool $unicode
    *
    * @return string
    */
-  public static function makeFileName($name) {
+  public static function makeFileName($name, bool $unicode = FALSE) {
     $uniqID = md5(uniqid(rand(), TRUE));
     $info = pathinfo($name);
     $basename = substr($info['basename'],
       0, -(strlen($info['extension'] ?? '') + (($info['extension'] ?? '') == '' ? 0 : 1))
     );
     if (!self::isExtensionSafe($info['extension'] ?? '')) {
+      if ($unicode) {
+        return self::makeFilenameWithUnicode("{$basename}_" . ($info['extension'] ?? '') . "_{$uniqID}", '_', 240) . ".unknown";
+      }
       // munge extension so it cannot have an embbeded dot in it
       // The maximum length of a filename for most filesystems is 255 chars.
       // We'll truncate at 240 to give some room for the extension.
       return CRM_Utils_String::munge("{$basename}_" . ($info['extension'] ?? '') . "_{$uniqID}", '_', 240) . ".unknown";
     }
     else {
+      if ($unicode) {
+        return self::makeFilenameWithUnicode("{$basename}_{$uniqID}", '_', 240) . "." . ($info['extension'] ?? '');
+      }
       return CRM_Utils_String::munge("{$basename}_{$uniqID}", '_', 240) . "." . ($info['extension'] ?? '');
     }
   }
index 63e14b70009e715d4b2620b1f686b821f07bd920..3a21e9301fcbaaddfc7a270de8ee6d308ee21b23 100644 (file)
@@ -276,7 +276,13 @@ class CRM_Utils_Mail {
           TRUE,
           'base64',
           'attachment',
-          (isset($attach['charset']) ? $attach['charset'] : '')
+          (isset($attach['charset']) ? $attach['charset'] : ''),
+          '',
+          '',
+          NULL,
+          NULL,
+          '',
+          'utf-8'
         );
       }
     }