From 5e30b219811d9fec24436815c92121fe9cc86211 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 22 Feb 2023 15:14:52 -0500 Subject: [PATCH] Send SIMS with hashes and filename --- .../siacs/conversations/entities/Message.java | 35 +++++++++++++++++++ .../persistance/FileBackend.java | 10 +++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index be3627bb2..40939cb4b 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -1100,6 +1100,9 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable fileParams.sims = this.fileParams.sims; } this.fileParams = fileParams; + if (fileParams != null && getSims().isEmpty()) { + addPayload(fileParams.toSims()); + } } public synchronized FileParams getFileParams() { @@ -1229,6 +1232,21 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable return file.findChildContent("name", file.getNamespace()); } + public void setName(final String name) { + if (sims == null) toSims(); + Element file = getFileElement(); + + for (Element child : file.getChildren()) { + if (child.getName().equals("name") && child.getNamespace().equals(file.getNamespace())) { + file.removeChild(child); + } + } + + if (name != null) { + file.addChild("name", file.getNamespace()).setContent(name); + } + } + public Element toSims() { if (sims == null) sims = new Element("reference", "urn:xmpp:reference:0"); sims.setAttribute("type", "data"); @@ -1277,6 +1295,23 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable return file; } + public void setCids(Iterable cids) throws NoSuchAlgorithmException { + if (sims == null) toSims(); + Element file = getFileElement(); + + for (Element child : file.getChildren()) { + if (child.getName().equals("hash") && child.getNamespace().equals("urn:xmpp:hashes:2")) { + file.removeChild(child); + } + } + + for (Cid cid : cids) { + file.addChild("hash", "urn:xmpp:hashes:2") + .setAttribute("algo", CryptoHelper.multihashAlgo(cid.getType())) + .setContent(Base64.encodeToString(cid.getHash(), Base64.NO_WRAP)); + } + } + public List getCids() { List cids = new ArrayList<>(); Element file = getFileElement(); diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index 46c91a44a..b2a368aa0 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -1739,10 +1739,6 @@ public class FileBackend { message.getEncryption() == Message.ENCRYPTION_PGP || message.getEncryption() == Message.ENCRYPTION_DECRYPTED; final DownloadableFile file = getFile(message); - Cid[] cids = new Cid[0]; - try { - cids = calculateCids(new FileInputStream(file)); - } catch (final IOException e) { } final String mime = file.getMimeType(); final boolean privateMessage = message.isPrivateMessage(); final boolean image = @@ -1750,6 +1746,11 @@ public class FileBackend { || (mime != null && mime.startsWith("image/")); Message.FileParams fileParams = message.getFileParams(); if (fileParams == null) fileParams = new Message.FileParams(); + Cid[] cids = new Cid[0]; + try { + cids = calculateCids(new FileInputStream(file)); + fileParams.setCids(List.of(cids)); + } catch (final IOException | NoSuchAlgorithmException e) { } if (url == null) { for (Cid cid : cids) { url = mXmppConnectionService.getUrlForCid(cid); @@ -1761,6 +1762,7 @@ public class FileBackend { } else { fileParams.url = url; } + fileParams.setName(file.getName()); if (encrypted && !file.exists()) { Log.d(Config.LOGTAG, "skipping updateFileParams because file is encrypted"); final DownloadableFile encryptedFile = getFile(message, false); -- 2.38.5