diff --git a/SignalServiceKit/Messages/Attachments/V2/AttachmentStream.swift b/SignalServiceKit/Messages/Attachments/V2/AttachmentStream.swift index 4b5eefa34b..c4bf23af51 100644 --- a/SignalServiceKit/Messages/Attachments/V2/AttachmentStream.swift +++ b/SignalServiceKit/Messages/Attachments/V2/AttachmentStream.swift @@ -87,12 +87,19 @@ public class AttachmentStream { /// will instead be inferred from the file contents) and made url-safe AND user-friendly. If nil, a random file name is used. public func makeDecryptedCopy(filename: String?) throws -> URL { var pathExtension: String = { - if let pathExtension = MimeTypeUtil.fileExtensionForMimeType(mimeType) { + if + case .file = contentType, + // Generic file MIME types are often lossy (e.g. .srt -> text/plain -> .txt), + // so preserve the sender's filename extension when available. + let filename, + let pathExtension = (filename as NSString).pathExtension.nilIfEmpty + { + return pathExtension + } else if let pathExtension = MimeTypeUtil.fileExtensionForMimeType(mimeType) { return pathExtension } else if let filename, - let filenameUrl = URL(string: filename), - let pathExtension = filenameUrl.pathExtension.nilIfEmpty + let pathExtension = (filename as NSString).pathExtension.nilIfEmpty { return pathExtension } else {