]> nmode's Git Repositories - signal-cli/commitdiff
Allow using data URIs for updateGroup/updateProfile avatars
authorAsamK <asamk@gmx.de>
Mon, 14 Nov 2022 18:31:40 +0000 (19:31 +0100)
committerAsamK <asamk@gmx.de>
Mon, 14 Nov 2022 18:31:40 +0000 (19:31 +0100)
Fixes #1082

lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/api/UpdateGroup.java
lib/src/main/java/org/asamk/signal/manager/api/UpdateProfile.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupV2Helper.java
lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java
src/main/java/org/asamk/signal/commands/UpdateGroupCommand.java
src/main/java/org/asamk/signal/commands/UpdateProfileCommand.java
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index 75503790e0d7a8abae5fc3313953ab1dfc5d63d8..d4f8b76f9e47517210fa3c5bb0c987ff3fb6f01f 100644 (file)
@@ -102,7 +102,7 @@ public interface Manager extends Closeable {
     void deleteGroup(GroupId groupId) throws IOException;
 
     Pair<GroupId, SendGroupMessageResults> createGroup(
     void deleteGroup(GroupId groupId) throws IOException;
 
     Pair<GroupId, SendGroupMessageResults> createGroup(
-            String name, Set<RecipientIdentifier.Single> members, File avatarFile
+            String name, Set<RecipientIdentifier.Single> members, String avatarFile
     ) throws IOException, AttachmentInvalidException, UnregisteredRecipientException;
 
     SendGroupMessageResults updateGroup(
     ) throws IOException, AttachmentInvalidException, UnregisteredRecipientException;
 
     SendGroupMessageResults updateGroup(
index 652b4e76dee0e47ff12e4d03027c3994f4f2705a..5191e2d9d79c755c6fedf34defb2d6828597cf1a 100644 (file)
@@ -394,7 +394,7 @@ class ManagerImpl implements Manager {
 
     @Override
     public Pair<GroupId, SendGroupMessageResults> createGroup(
 
     @Override
     public Pair<GroupId, SendGroupMessageResults> createGroup(
-            String name, Set<RecipientIdentifier.Single> members, File avatarFile
+            String name, Set<RecipientIdentifier.Single> members, String avatarFile
     ) throws IOException, AttachmentInvalidException, UnregisteredRecipientException {
         return context.getGroupHelper()
                 .createGroup(name,
     ) throws IOException, AttachmentInvalidException, UnregisteredRecipientException {
         return context.getGroupHelper()
                 .createGroup(name,
index 71b18a676aa84d3d5c831d8fc3d8d29377df3ac6..0a2cb5eeec1b3a16c9a164004c6a42a352976de3 100644 (file)
@@ -3,7 +3,6 @@ package org.asamk.signal.manager.api;
 import org.asamk.signal.manager.groups.GroupLinkState;
 import org.asamk.signal.manager.groups.GroupPermission;
 
 import org.asamk.signal.manager.groups.GroupLinkState;
 import org.asamk.signal.manager.groups.GroupPermission;
 
-import java.io.File;
 import java.util.Set;
 
 public class UpdateGroup {
 import java.util.Set;
 
 public class UpdateGroup {
@@ -20,7 +19,7 @@ public class UpdateGroup {
     private final GroupLinkState groupLinkState;
     private final GroupPermission addMemberPermission;
     private final GroupPermission editDetailsPermission;
     private final GroupLinkState groupLinkState;
     private final GroupPermission addMemberPermission;
     private final GroupPermission editDetailsPermission;
-    private final File avatarFile;
+    private final String avatarFile;
     private final Integer expirationTimer;
     private final Boolean isAnnouncementGroup;
 
     private final Integer expirationTimer;
     private final Boolean isAnnouncementGroup;
 
@@ -77,7 +76,7 @@ public class UpdateGroup {
             final GroupLinkState groupLinkState,
             final GroupPermission addMemberPermission,
             final GroupPermission editDetailsPermission,
             final GroupLinkState groupLinkState,
             final GroupPermission addMemberPermission,
             final GroupPermission editDetailsPermission,
-            final File avatarFile,
+            final String avatarFile,
             final Integer expirationTimer,
             final Boolean isAnnouncementGroup
     ) {
             final Integer expirationTimer,
             final Boolean isAnnouncementGroup
     ) {
@@ -146,7 +145,7 @@ public class UpdateGroup {
         return editDetailsPermission;
     }
 
         return editDetailsPermission;
     }
 
-    public File getAvatarFile() {
+    public String getAvatarFile() {
         return avatarFile;
     }
 
         return avatarFile;
     }
 
@@ -172,7 +171,7 @@ public class UpdateGroup {
         private GroupLinkState groupLinkState;
         private GroupPermission addMemberPermission;
         private GroupPermission editDetailsPermission;
         private GroupLinkState groupLinkState;
         private GroupPermission addMemberPermission;
         private GroupPermission editDetailsPermission;
-        private File avatarFile;
+        private String avatarFile;
         private Integer expirationTimer;
         private Boolean isAnnouncementGroup;
 
         private Integer expirationTimer;
         private Boolean isAnnouncementGroup;
 
@@ -192,7 +191,7 @@ public class UpdateGroup {
                 final GroupLinkState groupLinkState,
                 final GroupPermission addMemberPermission,
                 final GroupPermission editDetailsPermission,
                 final GroupLinkState groupLinkState,
                 final GroupPermission addMemberPermission,
                 final GroupPermission editDetailsPermission,
-                final File avatarFile,
+                final String avatarFile,
                 final Integer expirationTimer,
                 final Boolean isAnnouncementGroup
         ) {
                 final Integer expirationTimer,
                 final Boolean isAnnouncementGroup
         ) {
@@ -273,7 +272,7 @@ public class UpdateGroup {
             return this;
         }
 
             return this;
         }
 
-        public Builder withAvatarFile(final File val) {
+        public Builder withAvatarFile(final String val) {
             avatarFile = val;
             return this;
         }
             avatarFile = val;
             return this;
         }
index d5de308e4bb37929701ad2f7475768d278229b06..3cfffe5f5e7f84fdca0e439337b6582145e7f32c 100644 (file)
@@ -1,14 +1,12 @@
 package org.asamk.signal.manager.api;
 
 package org.asamk.signal.manager.api;
 
-import java.io.File;
-
 public class UpdateProfile {
 
     private final String givenName;
     private final String familyName;
     private final String about;
     private final String aboutEmoji;
 public class UpdateProfile {
 
     private final String givenName;
     private final String familyName;
     private final String about;
     private final String aboutEmoji;
-    private final File avatar;
+    private final String avatar;
     private final boolean deleteAvatar;
     private final byte[] mobileCoinAddress;
 
     private final boolean deleteAvatar;
     private final byte[] mobileCoinAddress;
 
@@ -54,7 +52,7 @@ public class UpdateProfile {
         return aboutEmoji;
     }
 
         return aboutEmoji;
     }
 
-    public File getAvatar() {
+    public String getAvatar() {
         return avatar;
     }
 
         return avatar;
     }
 
@@ -72,7 +70,7 @@ public class UpdateProfile {
         private String familyName;
         private String about;
         private String aboutEmoji;
         private String familyName;
         private String about;
         private String aboutEmoji;
-        private File avatar;
+        private String avatar;
         private boolean deleteAvatar;
         private byte[] mobileCoinAddress;
 
         private boolean deleteAvatar;
         private byte[] mobileCoinAddress;
 
@@ -99,7 +97,7 @@ public class UpdateProfile {
             return this;
         }
 
             return this;
         }
 
-        public Builder withAvatar(final File val) {
+        public Builder withAvatar(final String val) {
             avatar = val;
             return this;
         }
             avatar = val;
             return this;
         }
index a342064ca506ab2cb42896e317f7d11b250f2c83..bb9a3ea41d16fc596bcc4373dfc11c02ba532697 100644 (file)
@@ -26,6 +26,7 @@ import org.asamk.signal.manager.storage.groups.GroupInfoV2;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.util.AttachmentUtils;
 import org.asamk.signal.manager.util.IOUtils;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.util.AttachmentUtils;
 import org.asamk.signal.manager.util.IOUtils;
+import org.asamk.signal.manager.util.Utils;
 import org.signal.libsignal.zkgroup.InvalidInputException;
 import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
 import org.signal.libsignal.zkgroup.groups.GroupSecretParams;
 import org.signal.libsignal.zkgroup.InvalidInputException;
 import org.signal.libsignal.zkgroup.groups.GroupMasterKey;
 import org.signal.libsignal.zkgroup.groups.GroupSecretParams;
@@ -47,7 +48,6 @@ import org.whispersystems.signalservice.api.push.DistributionId;
 import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.exceptions.ConflictException;
 
 import org.whispersystems.signalservice.api.push.ServiceId;
 import org.whispersystems.signalservice.api.push.exceptions.ConflictException;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -164,7 +164,7 @@ public class GroupHelper {
     }
 
     public Pair<GroupId, SendGroupMessageResults> createGroup(
     }
 
     public Pair<GroupId, SendGroupMessageResults> createGroup(
-            String name, Set<RecipientId> members, File avatarFile
+            String name, Set<RecipientId> members, String avatarFile
     ) throws IOException, AttachmentInvalidException {
         final var selfRecipientId = account.getSelfRecipientId();
         if (members != null && members.contains(selfRecipientId)) {
     ) throws IOException, AttachmentInvalidException {
         final var selfRecipientId = account.getSelfRecipientId();
         if (members != null && members.contains(selfRecipientId)) {
@@ -172,14 +172,15 @@ public class GroupHelper {
             members.remove(selfRecipientId);
         }
 
             members.remove(selfRecipientId);
         }
 
+        final var avatarBytes = readAvatarBytes(avatarFile);
         var gv2Pair = context.getGroupV2Helper()
         var gv2Pair = context.getGroupV2Helper()
-                .createGroup(name == null ? "" : name, members == null ? Set.of() : members, avatarFile);
+                .createGroup(name == null ? "" : name, members == null ? Set.of() : members, avatarBytes);
 
         if (gv2Pair == null) {
             // Failed to create v2 group, creating v1 group instead
             var gv1 = new GroupInfoV1(GroupIdV1.createRandom());
             gv1.addMembers(List.of(selfRecipientId));
 
         if (gv2Pair == null) {
             // Failed to create v2 group, creating v1 group instead
             var gv1 = new GroupInfoV1(GroupIdV1.createRandom());
             gv1.addMembers(List.of(selfRecipientId));
-            final var result = updateGroupV1(gv1, name, members, avatarFile);
+            final var result = updateGroupV1(gv1, name, members, avatarBytes);
             return new Pair<>(gv1.getGroupId(), result);
         }
 
             return new Pair<>(gv1.getGroupId(), result);
         }
 
@@ -187,10 +188,9 @@ public class GroupHelper {
         final var decryptedGroup = gv2Pair.second();
 
         gv2.setGroup(decryptedGroup);
         final var decryptedGroup = gv2Pair.second();
 
         gv2.setGroup(decryptedGroup);
-        if (avatarFile != null) {
+        if (avatarBytes != null) {
             context.getAvatarStore()
             context.getAvatarStore()
-                    .storeGroupAvatar(gv2.getGroupId(),
-                            outputStream -> IOUtils.copyFileToStream(avatarFile, outputStream));
+                    .storeGroupAvatar(gv2.getGroupId(), outputStream -> outputStream.write(avatarBytes));
         }
 
         account.getGroupStore().updateGroup(gv2);
         }
 
         account.getGroupStore().updateGroup(gv2);
@@ -217,11 +217,12 @@ public class GroupHelper {
             final GroupLinkState groupLinkState,
             final GroupPermission addMemberPermission,
             final GroupPermission editDetailsPermission,
             final GroupLinkState groupLinkState,
             final GroupPermission addMemberPermission,
             final GroupPermission editDetailsPermission,
-            final File avatarFile,
+            final String avatarFile,
             final Integer expirationTimer,
             final Boolean isAnnouncementGroup
     ) throws IOException, GroupNotFoundException, AttachmentInvalidException, NotAGroupMemberException, GroupSendingNotAllowedException {
         var group = getGroupForUpdating(groupId);
             final Integer expirationTimer,
             final Boolean isAnnouncementGroup
     ) throws IOException, GroupNotFoundException, AttachmentInvalidException, NotAGroupMemberException, GroupSendingNotAllowedException {
         var group = getGroupForUpdating(groupId);
+        final var avatarBytes = readAvatarBytes(avatarFile);
 
         if (group instanceof GroupInfoV2) {
             try {
 
         if (group instanceof GroupInfoV2) {
             try {
@@ -238,7 +239,7 @@ public class GroupHelper {
                         groupLinkState,
                         addMemberPermission,
                         editDetailsPermission,
                         groupLinkState,
                         addMemberPermission,
                         editDetailsPermission,
-                        avatarFile,
+                        avatarBytes,
                         expirationTimer,
                         isAnnouncementGroup);
             } catch (ConflictException e) {
                         expirationTimer,
                         isAnnouncementGroup);
             } catch (ConflictException e) {
@@ -257,14 +258,14 @@ public class GroupHelper {
                         groupLinkState,
                         addMemberPermission,
                         editDetailsPermission,
                         groupLinkState,
                         addMemberPermission,
                         editDetailsPermission,
-                        avatarFile,
+                        avatarBytes,
                         expirationTimer,
                         isAnnouncementGroup);
             }
         }
 
         final var gv1 = (GroupInfoV1) group;
                         expirationTimer,
                         isAnnouncementGroup);
             }
         }
 
         final var gv1 = (GroupInfoV1) group;
-        final var result = updateGroupV1(gv1, name, members, avatarFile);
+        final var result = updateGroupV1(gv1, name, members, avatarBytes);
         if (expirationTimer != null) {
             setExpirationTimer(gv1, expirationTimer);
         }
         if (expirationTimer != null) {
             setExpirationTimer(gv1, expirationTimer);
         }
@@ -521,7 +522,7 @@ public class GroupHelper {
     }
 
     private SendGroupMessageResults updateGroupV1(
     }
 
     private SendGroupMessageResults updateGroupV1(
-            final GroupInfoV1 gv1, final String name, final Set<RecipientId> members, final File avatarFile
+            final GroupInfoV1 gv1, final String name, final Set<RecipientId> members, final byte[] avatarFile
     ) throws IOException, AttachmentInvalidException {
         updateGroupV1Details(gv1, name, members, avatarFile);
 
     ) throws IOException, AttachmentInvalidException {
         updateGroupV1Details(gv1, name, members, avatarFile);
 
@@ -534,7 +535,7 @@ public class GroupHelper {
     }
 
     private void updateGroupV1Details(
     }
 
     private void updateGroupV1Details(
-            final GroupInfoV1 g, final String name, final Collection<RecipientId> members, final File avatarFile
+            final GroupInfoV1 g, final String name, final Collection<RecipientId> members, final byte[] avatarFile
     ) throws IOException {
         if (name != null) {
             g.name = name;
     ) throws IOException {
         if (name != null) {
             g.name = name;
@@ -545,9 +546,7 @@ public class GroupHelper {
         }
 
         if (avatarFile != null) {
         }
 
         if (avatarFile != null) {
-            context.getAvatarStore()
-                    .storeGroupAvatar(g.getGroupId(),
-                            outputStream -> IOUtils.copyFileToStream(avatarFile, outputStream));
+            context.getAvatarStore().storeGroupAvatar(g.getGroupId(), outputStream -> outputStream.write(avatarFile));
         }
     }
 
         }
     }
 
@@ -581,7 +580,7 @@ public class GroupHelper {
             final GroupLinkState groupLinkState,
             final GroupPermission addMemberPermission,
             final GroupPermission editDetailsPermission,
             final GroupLinkState groupLinkState,
             final GroupPermission addMemberPermission,
             final GroupPermission editDetailsPermission,
-            final File avatarFile,
+            final byte[] avatarFile,
             final Integer expirationTimer,
             final Boolean isAnnouncementGroup
     ) throws IOException {
             final Integer expirationTimer,
             final Boolean isAnnouncementGroup
     ) throws IOException {
@@ -716,8 +715,7 @@ public class GroupHelper {
             var groupGroupChangePair = groupV2Helper.updateGroup(group, name, description, avatarFile);
             if (avatarFile != null) {
                 context.getAvatarStore()
             var groupGroupChangePair = groupV2Helper.updateGroup(group, name, description, avatarFile);
             if (avatarFile != null) {
                 context.getAvatarStore()
-                        .storeGroupAvatar(group.getGroupId(),
-                                outputStream -> IOUtils.copyFileToStream(avatarFile, outputStream));
+                        .storeGroupAvatar(group.getGroupId(), outputStream -> outputStream.write(avatarFile));
             }
             result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
         }
             }
             result = sendUpdateGroupV2Message(group, groupGroupChangePair.first(), groupGroupChangePair.second());
         }
@@ -819,4 +817,13 @@ public class GroupHelper {
                                 account.getRecipientAddressResolver()))
                         .toList());
     }
                                 account.getRecipientAddressResolver()))
                         .toList());
     }
+
+    private byte[] readAvatarBytes(final String avatarFile) throws IOException {
+        if (avatarFile == null) {
+            return null;
+        }
+        try (final var avatar = Utils.createStreamDetails(avatarFile).first().getStream()) {
+            return IOUtils.readFully(avatar);
+        }
+    }
 }
 }
index 84747e9c3dc48f2a93e86e7494103c01de4ab862..e410d232d3507a1ccfff13549010b1749b1a525a 100644 (file)
@@ -12,7 +12,6 @@ import org.asamk.signal.manager.groups.GroupUtils;
 import org.asamk.signal.manager.groups.NotAGroupMemberException;
 import org.asamk.signal.manager.storage.groups.GroupInfoV2;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
 import org.asamk.signal.manager.groups.NotAGroupMemberException;
 import org.asamk.signal.manager.storage.groups.GroupInfoV2;
 import org.asamk.signal.manager.storage.recipients.RecipientId;
-import org.asamk.signal.manager.util.IOUtils;
 import org.asamk.signal.manager.util.Utils;
 import org.signal.libsignal.zkgroup.InvalidInputException;
 import org.signal.libsignal.zkgroup.VerificationFailedException;
 import org.asamk.signal.manager.util.Utils;
 import org.signal.libsignal.zkgroup.InvalidInputException;
 import org.signal.libsignal.zkgroup.VerificationFailedException;
@@ -47,10 +46,7 @@ import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -138,10 +134,9 @@ class GroupV2Helper {
     }
 
     Pair<GroupInfoV2, DecryptedGroup> createGroup(
     }
 
     Pair<GroupInfoV2, DecryptedGroup> createGroup(
-            String name, Set<RecipientId> members, File avatarFile
-    ) throws IOException {
-        final var avatarBytes = readAvatarBytes(avatarFile);
-        final var newGroup = buildNewGroup(name, members, avatarBytes);
+            String name, Set<RecipientId> members, byte[] avatarFile
+    ) {
+        final var newGroup = buildNewGroup(name, members, avatarFile);
         if (newGroup == null) {
             return null;
         }
         if (newGroup == null) {
             return null;
         }
@@ -170,14 +165,6 @@ class GroupV2Helper {
         return new Pair<>(g, decryptedGroup);
     }
 
         return new Pair<>(g, decryptedGroup);
     }
 
-    private byte[] readAvatarBytes(final File avatarFile) throws IOException {
-        final byte[] avatarBytes;
-        try (InputStream avatar = avatarFile == null ? null : new FileInputStream(avatarFile)) {
-            avatarBytes = avatar == null ? null : IOUtils.readFully(avatar);
-        }
-        return avatarBytes;
-    }
-
     private GroupsV2Operations.NewGroup buildNewGroup(
             String name, Set<RecipientId> members, byte[] avatar
     ) {
     private GroupsV2Operations.NewGroup buildNewGroup(
             String name, Set<RecipientId> members, byte[] avatar
     ) {
@@ -210,7 +197,7 @@ class GroupV2Helper {
     }
 
     Pair<DecryptedGroup, GroupChange> updateGroup(
     }
 
     Pair<DecryptedGroup, GroupChange> updateGroup(
-            GroupInfoV2 groupInfoV2, String name, String description, File avatarFile
+            GroupInfoV2 groupInfoV2, String name, String description, byte[] avatarFile
     ) throws IOException {
         final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey());
         var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams);
     ) throws IOException {
         final var groupSecretParams = GroupSecretParams.deriveFromMasterKey(groupInfoV2.getMasterKey());
         var groupOperations = dependencies.getGroupsV2Operations().forGroup(groupSecretParams);
@@ -222,9 +209,8 @@ class GroupV2Helper {
         }
 
         if (avatarFile != null) {
         }
 
         if (avatarFile != null) {
-            final var avatarBytes = readAvatarBytes(avatarFile);
             var avatarCdnKey = dependencies.getGroupsV2Api()
             var avatarCdnKey = dependencies.getGroupsV2Api()
-                    .uploadAvatar(avatarBytes, groupSecretParams, getGroupAuthForToday(groupSecretParams));
+                    .uploadAvatar(avatarFile, groupSecretParams, getGroupAuthForToday(groupSecretParams));
             change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder().setAvatar(avatarCdnKey));
         }
 
             change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder().setAvatar(avatarCdnKey));
         }
 
index 8113000b182912e365f4086d669e21a9e3e7c252..da7440ed4a4d5236167d0ea0c89e74f39902c5ea 100644 (file)
@@ -30,7 +30,6 @@ import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException
 import org.whispersystems.signalservice.api.services.ProfileService;
 import org.whispersystems.signalservice.api.util.ExpiringProfileCredentialUtil;
 
 import org.whispersystems.signalservice.api.services.ProfileService;
 import org.whispersystems.signalservice.api.util.ExpiringProfileCredentialUtil;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.file.Files;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.file.Files;
@@ -146,7 +145,7 @@ public final class ProfileHelper {
             final String familyName,
             String about,
             String aboutEmoji,
             final String familyName,
             String about,
             String aboutEmoji,
-            Optional<File> avatar,
+            Optional<String> avatar,
             byte[] mobileCoinAddress
     ) throws IOException {
         setProfile(true, false, givenName, familyName, about, aboutEmoji, avatar, mobileCoinAddress);
             byte[] mobileCoinAddress
     ) throws IOException {
         setProfile(true, false, givenName, familyName, about, aboutEmoji, avatar, mobileCoinAddress);
@@ -159,7 +158,7 @@ public final class ProfileHelper {
             final String familyName,
             String about,
             String aboutEmoji,
             final String familyName,
             String about,
             String aboutEmoji,
-            Optional<File> avatar,
+            Optional<String> avatar,
             byte[] mobileCoinAddress
     ) throws IOException {
         var profile = getSelfProfile();
             byte[] mobileCoinAddress
     ) throws IOException {
         var profile = getSelfProfile();
@@ -183,7 +182,8 @@ public final class ProfileHelper {
 
         if (uploadProfile) {
             final var streamDetails = avatar != null && avatar.isPresent()
 
         if (uploadProfile) {
             final var streamDetails = avatar != null && avatar.isPresent()
-                    ? Utils.createStreamDetailsFromFile(avatar.get())
+                    ? Utils.createStreamDetails(avatar.get())
+                    .first()
                     : forceUploadAvatar && avatar == null ? context.getAvatarStore()
                             .retrieveProfileAvatar(account.getSelfRecipientAddress()) : null;
             try (streamDetails) {
                     : forceUploadAvatar && avatar == null ? context.getAvatarStore()
                             .retrieveProfileAvatar(account.getSelfRecipientAddress()) : null;
             try (streamDetails) {
@@ -212,9 +212,10 @@ public final class ProfileHelper {
 
         if (avatar != null) {
             if (avatar.isPresent()) {
 
         if (avatar != null) {
             if (avatar.isPresent()) {
+                final var streamDetails = Utils.createStreamDetails(avatar.get()).first();
                 context.getAvatarStore()
                         .storeProfileAvatar(account.getSelfRecipientAddress(),
                 context.getAvatarStore()
                         .storeProfileAvatar(account.getSelfRecipientAddress(),
-                                outputStream -> IOUtils.copyFileToStream(avatar.get(), outputStream));
+                                outputStream -> IOUtils.copyStream(streamDetails.getStream(), outputStream));
             } else {
                 context.getAvatarStore().deleteProfileAvatar(account.getSelfRecipientAddress());
             }
             } else {
                 context.getAvatarStore().deleteProfileAvatar(account.getSelfRecipientAddress());
             }
index 411ae74762fbf84b1d130af4a35bd019297cad45..14ad14f8fe085929e10e34e2fe808b59d9ce782f 100644 (file)
@@ -26,7 +26,6 @@ import org.asamk.signal.util.SendMessageResultUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.stream.Stream;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.stream.Stream;
@@ -131,9 +130,7 @@ public class UpdateGroupCommand implements JsonRpcLocalCommand {
             SendGroupMessageResults groupMessageResults = null;
             if (groupId == null) {
                 isNewGroup = true;
             SendGroupMessageResults groupMessageResults = null;
             if (groupId == null) {
                 isNewGroup = true;
-                var results = m.createGroup(groupName,
-                        groupMembers,
-                        groupAvatar == null ? null : new File(groupAvatar));
+                var results = m.createGroup(groupName, groupMembers, groupAvatar);
                 groupMessageResults = results.second();
                 groupId = results.first();
                 groupName = null;
                 groupMessageResults = results.second();
                 groupId = results.first();
                 groupName = null;
@@ -155,7 +152,7 @@ public class UpdateGroupCommand implements JsonRpcLocalCommand {
                             .withGroupLinkState(groupLinkState)
                             .withAddMemberPermission(groupAddMemberPermission)
                             .withEditDetailsPermission(groupEditDetailsPermission)
                             .withGroupLinkState(groupLinkState)
                             .withAddMemberPermission(groupAddMemberPermission)
                             .withEditDetailsPermission(groupEditDetailsPermission)
-                            .withAvatarFile(groupAvatar == null ? null : new File(groupAvatar))
+                            .withAvatarFile(groupAvatar)
                             .withExpirationTimer(groupExpiration)
                             .withIsAnnouncementGroup(groupSendMessagesPermission == null
                                     ? null
                             .withExpirationTimer(groupExpiration)
                             .withIsAnnouncementGroup(groupSendMessagesPermission == null
                                     ? null
index d8e874302de747bd2f06a85c3f6a688a8a442627..cea2da0dfe0a449eeae0aa231e67fc0effd2f29d 100644 (file)
@@ -10,7 +10,6 @@ import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.api.UpdateProfile;
 import org.asamk.signal.output.OutputWriter;
 
 import org.asamk.signal.manager.api.UpdateProfile;
 import org.asamk.signal.output.OutputWriter;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Base64;
 
 import java.io.IOException;
 import java.util.Base64;
 
@@ -50,7 +49,7 @@ public class UpdateProfileCommand implements JsonRpcLocalCommand {
 
         var avatarPath = ns.getString("avatar");
         boolean removeAvatar = Boolean.TRUE.equals(ns.getBoolean("remove-avatar"));
 
         var avatarPath = ns.getString("avatar");
         boolean removeAvatar = Boolean.TRUE.equals(ns.getBoolean("remove-avatar"));
-        File avatarFile = removeAvatar || avatarPath == null ? null : new File(avatarPath);
+        String avatarFile = removeAvatar || avatarPath == null ? null : avatarPath;
 
         try {
             m.updateProfile(UpdateProfile.newBuilder()
 
         try {
             m.updateProfile(UpdateProfile.newBuilder()
index c0dc1cf832ac8e68f4b4b06ff050fc1dbbc276d2..d2a081310516e980b0f384d5bf362174bb0d3118 100644 (file)
@@ -147,7 +147,7 @@ public class DbusManagerImpl implements Manager {
                 emptyIfNull(updateProfile.getFamilyName()),
                 emptyIfNull(updateProfile.getAbout()),
                 emptyIfNull(updateProfile.getAboutEmoji()),
                 emptyIfNull(updateProfile.getFamilyName()),
                 emptyIfNull(updateProfile.getAbout()),
                 emptyIfNull(updateProfile.getAboutEmoji()),
-                updateProfile.getAvatar() == null ? "" : updateProfile.getAvatar().getPath(),
+                updateProfile.getAvatar() == null ? "" : updateProfile.getAvatar(),
                 updateProfile.isDeleteAvatar());
     }
 
                 updateProfile.isDeleteAvatar());
     }
 
@@ -231,11 +231,11 @@ public class DbusManagerImpl implements Manager {
 
     @Override
     public Pair<GroupId, SendGroupMessageResults> createGroup(
 
     @Override
     public Pair<GroupId, SendGroupMessageResults> createGroup(
-            final String name, final Set<RecipientIdentifier.Single> members, final File avatarFile
+            final String name, final Set<RecipientIdentifier.Single> members, final String avatarFile
     ) throws IOException, AttachmentInvalidException {
         final var newGroupId = signal.createGroup(emptyIfNull(name),
                 members.stream().map(RecipientIdentifier.Single::getIdentifier).toList(),
     ) throws IOException, AttachmentInvalidException {
         final var newGroupId = signal.createGroup(emptyIfNull(name),
                 members.stream().map(RecipientIdentifier.Single::getIdentifier).toList(),
-                avatarFile == null ? "" : avatarFile.getPath());
+                avatarFile == null ? "" : avatarFile);
         return new Pair<>(GroupId.unknownVersion(newGroupId), new SendGroupMessageResults(0, List.of()));
     }
 
         return new Pair<>(GroupId.unknownVersion(newGroupId), new SendGroupMessageResults(0, List.of()));
     }
 
@@ -253,7 +253,7 @@ public class DbusManagerImpl implements Manager {
         if (updateGroup.getAvatarFile() != null) {
             group.Set("org.asamk.Signal.Group",
                     "Avatar",
         if (updateGroup.getAvatarFile() != null) {
             group.Set("org.asamk.Signal.Group",
                     "Avatar",
-                    updateGroup.getAvatarFile() == null ? "" : updateGroup.getAvatarFile().getPath());
+                    updateGroup.getAvatarFile() == null ? "" : updateGroup.getAvatarFile());
         }
         if (updateGroup.getExpirationTimer() != null) {
             group.Set("org.asamk.Signal.Group", "MessageExpirationTimer", updateGroup.getExpirationTimer());
         }
         if (updateGroup.getExpirationTimer() != null) {
             group.Set("org.asamk.Signal.Group", "MessageExpirationTimer", updateGroup.getExpirationTimer());
index 1a9118be1f2065ce82134dca21908d81efa4fda1..2c0c30b21bd9a5a7b229a472f2e016e495cb49d3 100644 (file)
@@ -618,7 +618,7 @@ public class DbusSignalImpl implements Signal {
             avatar = nullIfEmpty(avatar);
             final var memberIdentifiers = getSingleRecipientIdentifiers(members, m.getSelfNumber());
             if (groupId == null) {
             avatar = nullIfEmpty(avatar);
             final var memberIdentifiers = getSingleRecipientIdentifiers(members, m.getSelfNumber());
             if (groupId == null) {
-                final var results = m.createGroup(name, memberIdentifiers, avatar == null ? null : new File(avatar));
+                final var results = m.createGroup(name, memberIdentifiers, avatar);
                 updateGroups();
                 checkGroupSendMessageResults(results.second().timestamp(), results.second().results());
                 return results.first().serialize();
                 updateGroups();
                 checkGroupSendMessageResults(results.second().timestamp(), results.second().results());
                 return results.first().serialize();
@@ -627,7 +627,7 @@ public class DbusSignalImpl implements Signal {
                         UpdateGroup.newBuilder()
                                 .withName(name)
                                 .withMembers(memberIdentifiers)
                         UpdateGroup.newBuilder()
                                 .withName(name)
                                 .withMembers(memberIdentifiers)
-                                .withAvatarFile(avatar == null ? null : new File(avatar))
+                                .withAvatarFile(avatar)
                                 .build());
                 if (results != null) {
                     checkGroupSendMessageResults(results.timestamp(), results.results());
                                 .build());
                 if (results != null) {
                     checkGroupSendMessageResults(results.timestamp(), results.results());
@@ -687,7 +687,7 @@ public class DbusSignalImpl implements Signal {
             about = nullIfEmpty(about);
             aboutEmoji = nullIfEmpty(aboutEmoji);
             avatarPath = nullIfEmpty(avatarPath);
             about = nullIfEmpty(about);
             aboutEmoji = nullIfEmpty(aboutEmoji);
             avatarPath = nullIfEmpty(avatarPath);
-            File avatarFile = removeAvatar || avatarPath == null ? null : new File(avatarPath);
+            final var avatarFile = removeAvatar || avatarPath == null ? null : avatarPath;
             m.updateProfile(UpdateProfile.newBuilder()
                     .withGivenName(givenName)
                     .withFamilyName(familyName)
             m.updateProfile(UpdateProfile.newBuilder()
                     .withGivenName(givenName)
                     .withFamilyName(familyName)
@@ -1270,7 +1270,7 @@ public class DbusSignalImpl implements Signal {
         }
 
         private void setGroupAvatar(final String avatar) {
         }
 
         private void setGroupAvatar(final String avatar) {
-            updateGroup(UpdateGroup.newBuilder().withAvatarFile(new File(avatar)).build());
+            updateGroup(UpdateGroup.newBuilder().withAvatarFile(avatar).build());
         }
 
         private void setMessageExpirationTime(final int expirationTime) {
         }
 
         private void setMessageExpirationTime(final int expirationTime) {