From 9c55a2e1fd39e16402561113cad6c09071684f6f Mon Sep 17 00:00:00 2001 From: jack Date: Thu, 25 Sep 2025 22:44:54 +0200 Subject: [PATCH] Hide absolute paths in media messages --- bitchat/Services/BLEService.swift | 7 ++++--- bitchat/ViewModels/ChatViewModel.swift | 6 +++--- bitchat/Views/ContentView.swift | 21 +++++++++------------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/bitchat/Services/BLEService.swift b/bitchat/Services/BLEService.swift index 4d67a3de..b917df6f 100644 --- a/bitchat/Services/BLEService.swift +++ b/bitchat/Services/BLEService.swift @@ -1649,13 +1649,14 @@ final class BLEService: NSObject { } let marker: String + let fileName = destination.lastPathComponent switch category { case .audio: - marker = "[voice] \(destination.path)" + marker = "[voice] \(fileName)" case .image: - marker = "[image] \(destination.path)" + marker = "[image] \(fileName)" case .other: - marker = "[file] \(destination.path)" + marker = "[file] \(fileName)" } let isPrivateMessage: Bool = { diff --git a/bitchat/ViewModels/ChatViewModel.swift b/bitchat/ViewModels/ChatViewModel.swift index 1d268d3f..cb2b31ae 100644 --- a/bitchat/ViewModels/ChatViewModel.swift +++ b/bitchat/ViewModels/ChatViewModel.swift @@ -2402,7 +2402,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate { @MainActor func sendVoiceNote(at url: URL) { let targetPeer = selectedPrivateChatPeer - let message = enqueueMediaMessage(content: "[voice] \(url.path)", targetPeer: targetPeer) + let message = enqueueMediaMessage(content: "[voice] \(url.lastPathComponent)", targetPeer: targetPeer) let messageID = message.id let transferId = makeTransferID(messageID: messageID) @@ -2469,7 +2469,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate { ) guard let payload = packet.encode() else { throw MediaSendError.encodingFailed } await MainActor.run { - let message = self.enqueueMediaMessage(content: "[image] \(outputURL.path)", targetPeer: targetPeer) + let message = self.enqueueMediaMessage(content: "[image] \(outputURL.lastPathComponent)", targetPeer: targetPeer) let messageID = message.id let transferId = self.makeTransferID(messageID: messageID) self.registerTransfer(transferId: transferId, messageID: messageID) @@ -2520,7 +2520,7 @@ final class ChatViewModel: ObservableObject, BitchatDelegate { } await MainActor.run { - let message = self.enqueueMediaMessage(content: "[file] \(destination.path)", targetPeer: targetPeer) + let message = self.enqueueMediaMessage(content: "[file] \(destination.lastPathComponent)", targetPeer: targetPeer) let messageID = message.id let transferId = self.makeTransferID(messageID: messageID) self.registerTransfer(transferId: transferId, messageID: messageID) diff --git a/bitchat/Views/ContentView.swift b/bitchat/Views/ContentView.swift index a67cd2d5..564c3ab4 100644 --- a/bitchat/Views/ContentView.swift +++ b/bitchat/Views/ContentView.swift @@ -1564,21 +1564,18 @@ private extension ContentView { guard let baseDirectory = applicationFilesDirectory() else { return nil } let basePath = baseDirectory.standardizedFileURL.path - func url(from prefix: String) -> URL? { + func url(from prefix: String, subdirectory: String) -> URL? { guard message.content.hasPrefix(prefix) else { return nil } - let rawPath = String(message.content.dropFirst(prefix.count)).trimmingCharacters(in: .whitespacesAndNewlines) - guard !rawPath.isEmpty else { return nil } - let url = URL(fileURLWithPath: rawPath) - guard url.isFileURL else { return nil } - let standardized = url.standardizedFileURL - let path = standardized.path - guard path == basePath || path.hasPrefix(basePath + "/") else { return nil } - return standardized + let filename = String(message.content.dropFirst(prefix.count)).trimmingCharacters(in: .whitespacesAndNewlines) + guard !filename.isEmpty else { return nil } + let directory = baseDirectory.appendingPathComponent(subdirectory, isDirectory: true) + let candidate = directory.appendingPathComponent(filename) + return FileManager.default.fileExists(atPath: candidate.path) ? candidate : nil } - if let url = url(from: "[voice] ") { return .voice(url) } - if let url = url(from: "[image] ") { return .image(url) } - if let url = url(from: "[file] ") { return .file(url) } + if let url = url(from: "[voice] ", subdirectory: "voicenotes") { return .voice(url) } + if let url = url(from: "[image] ", subdirectory: "images") { return .image(url) } + if let url = url(from: "[file] ", subdirectory: "files") { return .file(url) } return nil }