diff --git a/classes/Components/MailClient/Data/MailAttachmentData.php b/classes/Components/MailClient/Data/MailAttachmentData.php index 7badf4ab..f5dfcfda 100644 --- a/classes/Components/MailClient/Data/MailAttachmentData.php +++ b/classes/Components/MailClient/Data/MailAttachmentData.php @@ -69,26 +69,63 @@ class MailAttachmentData implements MailAttachmentInterface if ($dispositionHeader === null) { throw new InvalidArgumentException('missing header: "Content-Disposition"'); } - $disposition = $dispositionHeader->getValue(); + $disposition = $dispositionHeader->getValue(); - if (!preg_match('/(.+);\s*filename="([^"]+)".*$/m', $disposition, $matches)) { + /* + Content-Disposition: inline + Content-Disposition: attachment + Content-Disposition: attachment; filename="filename.jpg" + + This is not correctly implemented -> only the first string is evaluated + Content-Disposition: attachment; filename*0="filename_that_is_" + Content-Disposition: attachment; filename*1="very_long.jpg" + + */ + + if (preg_match('/(.+);\s*filename(?:\*[0-9]){0,1}="([^"]+)".*$/m', $disposition, $matches)) { + $isInline = strtolower($matches[1]) === 'inline'; + $filename = $matches[2]; + } + else if ($disposition == 'attachment') { + // Filename is given in Content-Type e.g. + /* Content-Type: application/pdf; name="Filename.pdf" + Content-Transfer-Encoding: base64 + Content-Disposition: attachment + */ + + $contenttypeHeader = $part->getHeader('content-type'); + if ($contenttypeHeader === null) { + throw new InvalidArgumentException('missing header: "Content-Type"'); + } + $contenttype = $contenttypeHeader->getValue(); + + if (preg_match('/(.+);\s*name(?:\*[0-9]){0,1}="([^"]+)".*$/m', $contenttype, $matches)) { + $isInline = strtolower($matches[1]) === 'inline'; + $filename = $matches[2]; + } else { + throw new InvalidArgumentException( + sprintf('missing filename in header value "Content-Type" = "%s"', $contenttype) + ); + } + } + else if ($disposition == 'inline') { + $isInline = true; + $filename = ""; // This is questionable + } else { throw new InvalidArgumentException( - sprintf('unexpected header value "Content-Disposition" = %s', $disposition) + sprintf('unexpected header value "Content-Disposition" = "%s"', $disposition) ); } - $isInline = strtolower($matches[1]) === 'inline'; - $filename = $matches[2]; // Thunderbird UTF URL-Format $UTF_pos = strpos($filename,'UTF-8\'\''); - if ($UTF_pos !== false) { - + if ($UTF_pos !== false) { $wasUTF = "JA"; - $filename = substr($filename,$UTF_pos); $filename = rawurldecode($filename); } + $cid = null; $contentIdHeader = $part->getHeader('content-id'); if ($contentIdHeader !== null) { diff --git a/classes/Components/MailClient/Data/MailMessageData.php b/classes/Components/MailClient/Data/MailMessageData.php index ef9a3cd0..f0544ce6 100644 --- a/classes/Components/MailClient/Data/MailMessageData.php +++ b/classes/Components/MailClient/Data/MailMessageData.php @@ -308,10 +308,7 @@ final class MailMessageData implements MailMessageInterface, JsonSerializable if ($date === null) { return null; } - $dateTime = DateTime::createFromFormat(DateTimeInterface::RFC2822, $date->getValue()); - if ($dateTime === false) { - $dateTime = DateTime::createFromFormat(DateTimeInterface::RFC822, $date->getValue()); - } + $dateTime = date_create($date->getValue()); if ($dateTime === false) { return null; } diff --git a/classes/Modules/Ticket/Task/TicketImportHelper.php b/classes/Modules/Ticket/Task/TicketImportHelper.php index 44f9c115..deec6b49 100644 --- a/classes/Modules/Ticket/Task/TicketImportHelper.php +++ b/classes/Modules/Ticket/Task/TicketImportHelper.php @@ -337,7 +337,7 @@ class TicketImportHelper if (!empty($queue_id)) { $queue_label = $this->db->Select("SELECT label FROM warteschlangen WHERE id = ".$queue_id." LIMIT 1"); } - + $insertTicket = "INSERT INTO `ticket` ( `schluessel`, `zeit`, `projekt`, `quelle`, `status`, `kunde`, `mailadresse`, `prio`, `betreff`,`warteschlange`,`adresse` @@ -347,10 +347,10 @@ class TicketImportHelper '".$projectId."', '".$this->mailAccount->getEmailAddress()."', '".$status."', - '".$senderName."', - '".$senderAddress."', + '".$this->db->real_escape_string($senderName)."', + '".$this->db->real_escape_string($senderAddress)."', '".'3'."', - '".$subject."', + '".$this->db->real_escape_string($subject)."', '".$queue_label."', '".$AddressId."');"; @@ -383,14 +383,14 @@ class TicketImportHelper ) VALUES ( '".$ticketNumber."', '".date('Y-m-d H:i:s', $timestamp)."', - '".$message."', - '".$subject."', + '".$this->db->real_escape_string($message)."', + '".$this->db->real_escape_string($subject)."', '".'email'."', - '".$senderName."', - '".$senderAddress."', + '".$this->db->real_escape_string($senderName)."', + '".$this->db->real_escape_string($senderAddress)."', '".$status."', - '".$replyToName."', - '".$replyToAddress."');"; + '".$this->db->real_escape_string($replyToName)."', + '".$this->db->real_escape_string($replyToAddress)."');"; $this->logger->debug('database insert',['query' => $sql]); $this->db->Insert($sql); @@ -555,8 +555,8 @@ class TicketImportHelper // Import database emailbackup $date = $message->getDate(); if (is_null($date)) { // This should not be happening -> Todo check getDate function - $this->logger->debug('Null date',['subject' => $message->getSubject()]); - $frommd5 = md5($from . $subject); + $this->logger->debug('Null date',['subject' => $message->getSubject(), $message->getHeader('date')->getValue()]); + return(false); } else { $timestamp = $date->getTimestamp(); $frommd5 = md5($from . $subject . $timestamp);