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(
@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,
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 {
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;
final GroupLinkState groupLinkState,
final GroupPermission addMemberPermission,
final GroupPermission editDetailsPermission,
- final File avatarFile,
+ final String avatarFile,
final Integer expirationTimer,
final Boolean isAnnouncementGroup
) {
return editDetailsPermission;
}
- public File getAvatarFile() {
+ public String getAvatarFile() {
return avatarFile;
}
private GroupLinkState groupLinkState;
private GroupPermission addMemberPermission;
private GroupPermission editDetailsPermission;
- private File avatarFile;
+ private String avatarFile;
private Integer expirationTimer;
private Boolean isAnnouncementGroup;
final GroupLinkState groupLinkState,
final GroupPermission addMemberPermission,
final GroupPermission editDetailsPermission,
- final File avatarFile,
+ final String avatarFile,
final Integer expirationTimer,
final Boolean isAnnouncementGroup
) {
return this;
}
- public Builder withAvatarFile(final File val) {
+ public Builder withAvatarFile(final String val) {
avatarFile = val;
return this;
}
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;
- private final File avatar;
+ private final String avatar;
private final boolean deleteAvatar;
private final byte[] mobileCoinAddress;
return aboutEmoji;
}
- public File getAvatar() {
+ public String getAvatar() {
return avatar;
}
private String familyName;
private String about;
private String aboutEmoji;
- private File avatar;
+ private String avatar;
private boolean deleteAvatar;
private byte[] mobileCoinAddress;
return this;
}
- public Builder withAvatar(final File val) {
+ public Builder withAvatar(final String val) {
avatar = val;
return this;
}
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.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;
}
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)) {
members.remove(selfRecipientId);
}
+ final var avatarBytes = readAvatarBytes(avatarFile);
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));
- final var result = updateGroupV1(gv1, name, members, avatarFile);
+ final var result = updateGroupV1(gv1, name, members, avatarBytes);
return new Pair<>(gv1.getGroupId(), result);
}
final var decryptedGroup = gv2Pair.second();
gv2.setGroup(decryptedGroup);
- if (avatarFile != null) {
+ if (avatarBytes != null) {
context.getAvatarStore()
- .storeGroupAvatar(gv2.getGroupId(),
- outputStream -> IOUtils.copyFileToStream(avatarFile, outputStream));
+ .storeGroupAvatar(gv2.getGroupId(), outputStream -> outputStream.write(avatarBytes));
}
account.getGroupStore().updateGroup(gv2);
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 var avatarBytes = readAvatarBytes(avatarFile);
if (group instanceof GroupInfoV2) {
try {
groupLinkState,
addMemberPermission,
editDetailsPermission,
- avatarFile,
+ avatarBytes,
expirationTimer,
isAnnouncementGroup);
} catch (ConflictException e) {
groupLinkState,
addMemberPermission,
editDetailsPermission,
- avatarFile,
+ avatarBytes,
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);
}
}
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);
}
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;
}
if (avatarFile != null) {
- context.getAvatarStore()
- .storeGroupAvatar(g.getGroupId(),
- outputStream -> IOUtils.copyFileToStream(avatarFile, outputStream));
+ context.getAvatarStore().storeGroupAvatar(g.getGroupId(), outputStream -> outputStream.write(avatarFile));
}
}
final GroupLinkState groupLinkState,
final GroupPermission addMemberPermission,
final GroupPermission editDetailsPermission,
- final File avatarFile,
+ final byte[] avatarFile,
final Integer expirationTimer,
final Boolean isAnnouncementGroup
) throws IOException {
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());
}
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);
+ }
+ }
}
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.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.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
}
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;
}
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
) {
}
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);
}
if (avatarFile != null) {
- final var avatarBytes = readAvatarBytes(avatarFile);
var avatarCdnKey = dependencies.getGroupsV2Api()
- .uploadAvatar(avatarBytes, groupSecretParams, getGroupAuthForToday(groupSecretParams));
+ .uploadAvatar(avatarFile, groupSecretParams, getGroupAuthForToday(groupSecretParams));
change.setModifyAvatar(GroupChange.Actions.ModifyAvatarAction.newBuilder().setAvatar(avatarCdnKey));
}
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;
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);
final String familyName,
String about,
String aboutEmoji,
- Optional<File> avatar,
+ Optional<String> avatar,
byte[] mobileCoinAddress
) throws IOException {
var profile = getSelfProfile();
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) {
if (avatar != null) {
if (avatar.isPresent()) {
+ final var streamDetails = Utils.createStreamDetails(avatar.get()).first();
context.getAvatarStore()
.storeProfileAvatar(account.getSelfRecipientAddress(),
- outputStream -> IOUtils.copyFileToStream(avatar.get(), outputStream));
+ outputStream -> IOUtils.copyStream(streamDetails.getStream(), outputStream));
} else {
context.getAvatarStore().deleteProfileAvatar(account.getSelfRecipientAddress());
}
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;
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;
.withGroupLinkState(groupLinkState)
.withAddMemberPermission(groupAddMemberPermission)
.withEditDetailsPermission(groupEditDetailsPermission)
- .withAvatarFile(groupAvatar == null ? null : new File(groupAvatar))
+ .withAvatarFile(groupAvatar)
.withExpirationTimer(groupExpiration)
.withIsAnnouncementGroup(groupSendMessagesPermission == null
? null
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;
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()
emptyIfNull(updateProfile.getFamilyName()),
emptyIfNull(updateProfile.getAbout()),
emptyIfNull(updateProfile.getAboutEmoji()),
- updateProfile.getAvatar() == null ? "" : updateProfile.getAvatar().getPath(),
+ updateProfile.getAvatar() == null ? "" : updateProfile.getAvatar(),
updateProfile.isDeleteAvatar());
}
@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(),
- avatarFile == null ? "" : avatarFile.getPath());
+ avatarFile == null ? "" : avatarFile);
return new Pair<>(GroupId.unknownVersion(newGroupId), new SendGroupMessageResults(0, List.of()));
}
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());
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();
UpdateGroup.newBuilder()
.withName(name)
.withMembers(memberIdentifiers)
- .withAvatarFile(avatar == null ? null : new File(avatar))
+ .withAvatarFile(avatar)
.build());
if (results != null) {
checkGroupSendMessageResults(results.timestamp(), results.results());
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)
}
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) {