diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java index b75f01eb..afafeb24 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AttachmentHelper.java @@ -11,11 +11,14 @@ import org.signal.libsignal.protocol.InvalidMessageException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.crypto.AttachmentCipherInputStream; +import org.whispersystems.signalservice.api.crypto.AttachmentCipherStreamUtil; import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer; import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream; import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException; import org.whispersystems.signalservice.api.util.StreamDetails; +import org.whispersystems.signalservice.internal.crypto.PaddingInputStream; +import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec; import java.io.File; import java.io.IOException; @@ -89,12 +92,12 @@ public class AttachmentHelper { final boolean voiceNote ) throws AttachmentInvalidException { try { - final var streamDetails = Utils.createStreamDetails(attachment); - final var uploadSpec = dependencies.getMessageSender() - .getResumableUploadSpec(streamDetails.first().getLength()); + final var streamDetailsAndFileName = Utils.createStreamDetails(attachment); + final var streamDetails = streamDetailsAndFileName.first(); + final var uploadSpec = getResumableUploadSpec(streamDetails); - return AttachmentUtils.createAttachmentStream(streamDetails.first(), - streamDetails.second(), + return AttachmentUtils.createAttachmentStream(streamDetails, + streamDetailsAndFileName.second(), voiceNote, uploadSpec); } catch (IOException e) { @@ -102,6 +105,13 @@ public class AttachmentHelper { } } + public ResumableUploadSpec getResumableUploadSpec(final StreamDetails streamDetails) throws IOException { + final var streamLength = streamDetails.getLength(); + final var ciphertextLength = AttachmentCipherStreamUtil.getCiphertextLength(PaddingInputStream.getPaddedSize( + streamLength)); + return dependencies.getMessageSender().getResumableUploadSpec(ciphertextLength); + } + public SignalServiceAttachmentPointer uploadAttachment(String attachment) throws IOException, AttachmentInvalidException { final var attachmentStream = getAttachmentStream(attachment, false); return uploadAttachment(attachmentStream); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java index f7d67d79..024e84fc 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java @@ -123,7 +123,7 @@ public class GroupHelper { return Optional.empty(); } - final var uploadSpec = dependencies.getMessageSender().getResumableUploadSpec(streamDetails.getLength()); + final var uploadSpec = context.getAttachmentHelper().getResumableUploadSpec(streamDetails); return Optional.of(AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty(), uploadSpec)); } diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java index ba2ca388..53ab3fa4 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java @@ -38,6 +38,7 @@ import org.whispersystems.signalservice.api.messages.multidevice.StickerPackOper import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage; import org.whispersystems.signalservice.api.messages.multidevice.ViewedMessage; import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.util.StreamDetails; import org.whispersystems.signalservice.internal.push.SyncMessage; import java.io.FileInputStream; @@ -131,13 +132,14 @@ public class SyncHelper { if (groupsFile.exists() && groupsFile.length() > 0) { try (var groupsFileStream = new FileInputStream(groupsFile)) { - final var uploadSpec = context.getDependencies() - .getMessageSender() - .getResumableUploadSpec(groupsFile.length()); + final var streamDetails = new StreamDetails(groupsFileStream, + MimeUtils.OCTET_STREAM, + groupsFile.length()); + final var uploadSpec = context.getAttachmentHelper().getResumableUploadSpec(streamDetails); var attachmentStream = SignalServiceAttachment.newStreamBuilder() - .withStream(groupsFileStream) - .withContentType(MimeUtils.OCTET_STREAM) - .withLength(groupsFile.length()) + .withStream(streamDetails.getStream()) + .withContentType(streamDetails.getContentType()) + .withLength(streamDetails.getLength()) .withResumableUploadSpec(uploadSpec) .build(); @@ -192,13 +194,14 @@ public class SyncHelper { if (contactsFile.exists() && contactsFile.length() > 0) { try (var contactsFileStream = new FileInputStream(contactsFile)) { - final var uploadSpec = context.getDependencies() - .getMessageSender() - .getResumableUploadSpec(contactsFile.length()); + final var streamDetails = new StreamDetails(contactsFileStream, + MimeUtils.OCTET_STREAM, + contactsFile.length()); + final var uploadSpec = context.getAttachmentHelper().getResumableUploadSpec(streamDetails); var attachmentStream = SignalServiceAttachment.newStreamBuilder() - .withStream(contactsFileStream) - .withContentType(MimeUtils.OCTET_STREAM) - .withLength(contactsFile.length()) + .withStream(streamDetails.getStream()) + .withContentType(streamDetails.getContentType()) + .withLength(streamDetails.getLength()) .withResumableUploadSpec(uploadSpec) .build(); diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java index 45d2fc8e..08214d01 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java @@ -839,8 +839,7 @@ public class ManagerImpl implements Manager { final var streamDetails = new StreamDetails(new ByteArrayInputStream(messageBytes), MimeUtils.LONG_TEXT, messageBytes.length); - final var uploadSpec = dependencies.getMessageSender() - .getResumableUploadSpec(streamDetails.getLength()); + final var uploadSpec = context.getAttachmentHelper().getResumableUploadSpec(streamDetails); final var textAttachment = AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty(), uploadSpec); @@ -908,7 +907,7 @@ public class ManagerImpl implements Manager { if (streamDetails == null) { throw new InvalidStickerException("Missing local sticker file"); } - final var uploadSpec = dependencies.getMessageSender().getResumableUploadSpec(streamDetails.getLength()); + final var uploadSpec = context.getAttachmentHelper().getResumableUploadSpec(streamDetails); final var stickerAttachment = AttachmentUtils.createAttachmentStream(streamDetails, Optional.empty(), uploadSpec); diff --git a/src/main/resources/META-INF/native-image/org.asamk/signal-cli/reachability-metadata.json b/src/main/resources/META-INF/native-image/org.asamk/signal-cli/reachability-metadata.json index db19a986..f70e705d 100644 --- a/src/main/resources/META-INF/native-image/org.asamk/signal-cli/reachability-metadata.json +++ b/src/main/resources/META-INF/native-image/org.asamk/signal-cli/reachability-metadata.json @@ -1486,6 +1486,13 @@ "type": "kotlin.Pair", "jniAccessible": true, "methods": [ + { + "name": "", + "parameterTypes": [ + "java.lang.Object", + "java.lang.Object" + ] + }, { "name": "getFirst", "parameterTypes": [] @@ -1496,6 +1503,9 @@ } ] }, + { + "type": "kotlin.Pair[]" + }, { "type": "kotlin.SafePublicationLazyImpl", "fields": [ @@ -5821,6 +5831,21 @@ } ] }, + { + "type": "org.signal.libsignal.net.UploadForm", + "jniAccessible": true, + "methods": [ + { + "name": "fromNative", + "parameterTypes": [ + "int", + "java.lang.String", + "java.lang.Object[]", + "java.lang.String" + ] + } + ] + }, { "type": "org.signal.libsignal.net.internal.BridgeChatListener", "jniAccessible": true