diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index 14bfcffa20..4040acff04 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -136,7 +136,6 @@ public final class JobManagerFactories { put(MultiDeviceConfigurationUpdateJob.KEY, new MultiDeviceConfigurationUpdateJob.Factory()); put(MultiDeviceContactSyncJob.KEY, new MultiDeviceContactSyncJob.Factory()); put(MultiDeviceContactUpdateJob.KEY, new MultiDeviceContactUpdateJob.Factory()); - put(MultiDeviceGroupUpdateJob.KEY, new MultiDeviceGroupUpdateJob.Factory()); put(MultiDeviceKeysUpdateJob.KEY, new MultiDeviceKeysUpdateJob.Factory()); put(MultiDeviceMessageRequestResponseJob.KEY, new MultiDeviceMessageRequestResponseJob.Factory()); put(MultiDeviceOutgoingPaymentSyncJob.KEY, new MultiDeviceOutgoingPaymentSyncJob.Factory()); @@ -283,6 +282,7 @@ public final class JobManagerFactories { put("RecipientChangedNumberJob", new FailingJob.Factory()); put("PushTextSendJob", new IndividualSendJob.Factory()); put("MultiDevicePniIdentityUpdateJob", new FailingJob.Factory()); + put("MultiDeviceGroupUpdateJob", new FailingJob.Factory()); }}; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java deleted file mode 100644 index d4560ae7c7..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceGroupUpdateJob.java +++ /dev/null @@ -1,216 +0,0 @@ -package org.thoughtcrime.securesms.jobs; - -import android.net.Uri; -import android.os.ParcelFileDescriptor; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.conversation.colors.ChatColorsMapper; -import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil; -import org.thoughtcrime.securesms.database.GroupTable; -import org.thoughtcrime.securesms.database.SignalDatabase; -import org.thoughtcrime.securesms.database.model.GroupRecord; -import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; -import org.thoughtcrime.securesms.jobmanager.Job; -import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; -import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.net.NotPushRegisteredException; -import org.thoughtcrime.securesms.profiles.AvatarHelper; -import org.thoughtcrime.securesms.providers.BlobProvider; -import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.recipients.RecipientUtil; -import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.whispersystems.signalservice.api.SignalServiceMessageSender; -import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; -import org.whispersystems.signalservice.api.messages.SignalServiceAttachment; -import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream; -import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroup; -import org.whispersystems.signalservice.api.messages.multidevice.DeviceGroupsOutputStream; -import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; -import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException; -import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; - -public class MultiDeviceGroupUpdateJob extends BaseJob { - - public static final String KEY = "MultiDeviceGroupUpdateJob"; - - private static final String TAG = Log.tag(MultiDeviceGroupUpdateJob.class); - - public MultiDeviceGroupUpdateJob() { - this(new Job.Parameters.Builder() - .addConstraint(NetworkConstraint.KEY) - .setQueue("MultiDeviceGroupUpdateJob") - .setLifespan(TimeUnit.DAYS.toMillis(1)) - .setMaxAttempts(Parameters.UNLIMITED) - .build()); - } - - private MultiDeviceGroupUpdateJob(@NonNull Job.Parameters parameters) { - super(parameters); - } - - @Override - public @NonNull String getFactoryKey() { - return KEY; - } - - @Override - public @Nullable byte[] serialize() { - return null; - } - - @Override - public void onRun() throws Exception { - if (!Recipient.self().isRegistered()) { - throw new NotPushRegisteredException(); - } - - if (!TextSecurePreferences.isMultiDevice(context)) { - Log.i(TAG, "Not multi device, aborting..."); - return; - } - - if (SignalStore.account().isLinkedDevice()) { - Log.i(TAG, "Not primary device, aborting..."); - return; - } - - ParcelFileDescriptor[] pipe = ParcelFileDescriptor.createPipe(); - InputStream inputStream = new ParcelFileDescriptor.AutoCloseInputStream(pipe[0]); - Future futureUri = BlobProvider.getInstance() - .forData(inputStream, 0) - .withFileName("multidevice-group-update") - .createForSingleSessionOnDiskAsync(context); - - Uri blobUri = null; - - try (GroupTable.Reader reader = SignalDatabase.groups().getGroups()) { - DeviceGroupsOutputStream out = new DeviceGroupsOutputStream(new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1])); - boolean hasData = false; - - GroupRecord record; - - while ((record = reader.getNext()) != null) { - if (record.isV1Group()) { - List members = new LinkedList<>(); - List registeredMembers = RecipientUtil.getEligibleForSending(Recipient.resolvedList(record.getMembers())); - - for (Recipient member : registeredMembers) { - members.add(RecipientUtil.toSignalServiceAddress(context, member)); - } - - RecipientId recipientId = SignalDatabase.recipients().getOrInsertFromPossiblyMigratedGroupId(record.getId()); - Recipient recipient = Recipient.resolved(recipientId); - Optional expirationTimer = recipient.getExpiresInSeconds() > 0 ? Optional.of(recipient.getExpiresInSeconds()) : Optional.empty(); - Map inboxPositions = SignalDatabase.threads().getInboxPositions(); - Set archived = SignalDatabase.threads().getArchivedRecipients(); - - out.write(new DeviceGroup(record.getId().getDecodedId(), - Optional.ofNullable(record.getTitle()), - members, - getAvatar(record.getRecipientId()), - record.isActive(), - expirationTimer, - Optional.of(ChatColorsMapper.getMaterialColor(recipient.getChatColors()).serialize()), - recipient.isBlocked(), - Optional.ofNullable(inboxPositions.get(recipientId)), - archived.contains(recipientId))); - - hasData = true; - } - } - - out.close(); - - if (hasData) { - blobUri = futureUri.get(); - long length = BlobProvider.getInstance().calculateFileSize(context, blobUri); - - sendUpdate(ApplicationDependencies.getSignalServiceMessageSender(), - BlobProvider.getInstance().getStream(context, blobUri), - length); - } else { - Log.w(TAG, "No groups present for sync message. Sending an empty update."); - - sendUpdate(ApplicationDependencies.getSignalServiceMessageSender(), - null, - 0); - } - } finally { - if (blobUri != null) { - BlobProvider.getInstance().delete(context, blobUri); - } - } - } - - @Override - public boolean onShouldRetry(@NonNull Exception exception) { - if (exception instanceof ServerRejectedException) return false; - if (exception instanceof PushNetworkException) return true; - return false; - } - - @Override - public void onFailure() { - - } - - private void sendUpdate(SignalServiceMessageSender messageSender, InputStream stream, long length) - throws IOException, UntrustedIdentityException - { - SignalServiceAttachmentStream attachmentStream; - - if (length > 0) { - attachmentStream = SignalServiceAttachment.newStreamBuilder() - .withStream(stream) - .withContentType("application/octet-stream") - .withLength(length) - .build(); - } else { - attachmentStream = SignalServiceAttachment.emptyStream("application/octet-stream"); - } - - messageSender.sendSyncMessage(SignalServiceSyncMessage.forGroups(attachmentStream), - UnidentifiedAccessUtil.getAccessForSync(context)); - } - - - private Optional getAvatar(@NonNull RecipientId recipientId) throws IOException { - if (!AvatarHelper.hasAvatar(context, recipientId)) return Optional.empty(); - - return Optional.of(SignalServiceAttachment.newStreamBuilder() - .withStream(AvatarHelper.getAvatar(context, recipientId)) - .withContentType("image/*") - .withLength(AvatarHelper.getAvatarLength(context, recipientId)) - .build()); - } - - private File createTempFile(String prefix) throws IOException { - File file = File.createTempFile(prefix, "tmp", context.getCacheDir()); - file.deleteOnExit(); - - return file; - } - - public static final class Factory implements Job.Factory { - @Override - public @NonNull MultiDeviceGroupUpdateJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) { - return new MultiDeviceGroupUpdateJob(parameters); - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java index fe694c5bba..cba4db49ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.java @@ -85,7 +85,6 @@ import org.thoughtcrime.securesms.jobs.MultiDeviceBlockedUpdateJob; import org.thoughtcrime.securesms.jobs.MultiDeviceConfigurationUpdateJob; import org.thoughtcrime.securesms.jobs.MultiDeviceContactSyncJob; import org.thoughtcrime.securesms.jobs.MultiDeviceContactUpdateJob; -import org.thoughtcrime.securesms.jobs.MultiDeviceGroupUpdateJob; import org.thoughtcrime.securesms.jobs.MultiDeviceKeysUpdateJob; import org.thoughtcrime.securesms.jobs.MultiDeviceStickerPackSyncJob; import org.thoughtcrime.securesms.jobs.NullMessageSendJob; @@ -1509,10 +1508,6 @@ public class MessageContentProcessor { ApplicationDependencies.getJobManager().add(new MultiDeviceContactUpdateJob(true)); } - if (message.isGroupsRequest()) { - ApplicationDependencies.getJobManager().add(new MultiDeviceGroupUpdateJob()); - } - if (message.isBlockedListRequest()) { ApplicationDependencies.getJobManager().add(new MultiDeviceBlockedUpdateJob()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt index 4ada6a04bc..33b6f35533 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt @@ -46,7 +46,6 @@ import org.thoughtcrime.securesms.jobs.MultiDeviceBlockedUpdateJob import org.thoughtcrime.securesms.jobs.MultiDeviceConfigurationUpdateJob import org.thoughtcrime.securesms.jobs.MultiDeviceContactSyncJob import org.thoughtcrime.securesms.jobs.MultiDeviceContactUpdateJob -import org.thoughtcrime.securesms.jobs.MultiDeviceGroupUpdateJob import org.thoughtcrime.securesms.jobs.MultiDeviceKeysUpdateJob import org.thoughtcrime.securesms.jobs.MultiDeviceStickerPackSyncJob import org.thoughtcrime.securesms.jobs.PushProcessEarlyMessagesJob @@ -868,7 +867,6 @@ object SyncMessageProcessor { when (message.type) { Request.Type.CONTACTS -> ApplicationDependencies.getJobManager().add(MultiDeviceContactUpdateJob(true)) - Request.Type.GROUPS -> ApplicationDependencies.getJobManager().add(MultiDeviceGroupUpdateJob()) Request.Type.BLOCKED -> ApplicationDependencies.getJobManager().add(MultiDeviceBlockedUpdateJob()) Request.Type.CONFIGURATION -> { ApplicationDependencies.getJobManager().add( diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index 734c8c44f5..ceef56ac6c 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -658,8 +658,6 @@ public class SignalServiceMessageSender { if (message.getContacts().isPresent()) { content = createMultiDeviceContactsContent(message.getContacts().get().getContactsStream().asStream(), message.getContacts().get().isComplete()); - } else if (message.getGroups().isPresent()) { - content = createMultiDeviceGroupsContent(message.getGroups().get().asStream()); } else if (message.getRead().isPresent()) { content = createMultiDeviceReadContent(message.getRead().get()); urgent = true; @@ -1304,16 +1302,6 @@ public class SignalServiceMessageSender { return container.setSyncMessage(builder).build(); } - private Content createMultiDeviceGroupsContent(SignalServiceAttachmentStream groups) throws IOException { - Content.Builder container = Content.newBuilder(); - SyncMessage.Builder builder = createSyncMessageBuilder(); - - builder.setGroups(SyncMessage.Groups.newBuilder() - .setBlob(createAttachmentPointer(groups))); - - return container.setSyncMessage(builder).build(); - } - private Content createMultiDeviceSentTranscriptContent(SentTranscriptMessage transcript, boolean unidentifiedAccess) throws IOException { SignalServiceAddress address = transcript.getDestination().get(); Content content = createMessageContent(transcript); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/RequestMessage.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/RequestMessage.java index 2afb7e1a48..494ce43665 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/RequestMessage.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/RequestMessage.java @@ -28,10 +28,6 @@ public class RequestMessage { return request.getType() == Request.Type.CONTACTS; } - public boolean isGroupsRequest() { - return request.getType() == Request.Type.GROUPS; - } - public boolean isBlockedListRequest() { return request.getType() == Request.Type.BLOCKED; } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java index 0b530423f1..20aa1c932c 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/messages/multidevice/SignalServiceSyncMessage.java @@ -22,7 +22,6 @@ public class SignalServiceSyncMessage { private final Optional sent; private final Optional contacts; - private final Optional groups; private final Optional blockedList; private final Optional request; private final Optional> reads; @@ -40,7 +39,6 @@ public class SignalServiceSyncMessage { private SignalServiceSyncMessage(Optional sent, Optional contacts, - Optional groups, Optional blockedList, Optional request, Optional> reads, @@ -58,7 +56,6 @@ public class SignalServiceSyncMessage { { this.sent = sent; this.contacts = contacts; - this.groups = groups; this.blockedList = blockedList; this.request = request; this.reads = reads; @@ -91,7 +88,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.empty()); } @@ -111,33 +107,11 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), - Optional.empty()); - } - - public static SignalServiceSyncMessage forGroups(SignalServiceAttachment groups) { - return new SignalServiceSyncMessage(Optional.empty(), - Optional.empty(), - Optional.of(groups), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), - Optional.empty(), Optional.empty()); } public static SignalServiceSyncMessage forRequest(RequestMessage request) { return new SignalServiceSyncMessage(Optional.empty(), - Optional.empty(), Optional.empty(), Optional.empty(), Optional.of(request), @@ -160,7 +134,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(reads), Optional.empty(), Optional.empty(), @@ -189,7 +162,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(views), Optional.empty(), Optional.empty()); @@ -201,7 +173,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(timerRead), Optional.empty(), Optional.empty(), @@ -223,7 +194,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(reads), Optional.empty(), Optional.empty(), @@ -245,7 +215,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(verifiedMessage), Optional.empty(), Optional.empty(), @@ -260,7 +229,6 @@ public class SignalServiceSyncMessage { public static SignalServiceSyncMessage forBlocked(BlockedListMessage blocked) { return new SignalServiceSyncMessage(Optional.empty(), - Optional.empty(), Optional.empty(), Optional.of(blocked), Optional.empty(), @@ -286,7 +254,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(configuration), Optional.empty(), Optional.empty(), @@ -307,7 +274,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(stickerPackOperations), Optional.empty(), Optional.empty(), @@ -328,7 +294,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(fetchType), Optional.empty(), Optional.empty(), @@ -349,7 +314,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(keys), Optional.empty(), Optional.empty(), @@ -370,7 +334,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(messageRequestResponse), Optional.empty(), Optional.empty(), @@ -391,7 +354,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(outgoingPaymentMessage), Optional.empty(), Optional.empty(), @@ -413,7 +375,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(callEvent), Optional.empty()); } @@ -434,7 +395,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.of(callLinkUpdate)); } @@ -454,7 +414,6 @@ public class SignalServiceSyncMessage { Optional.empty(), Optional.empty(), Optional.empty(), - Optional.empty(), Optional.empty()); } @@ -462,10 +421,6 @@ public class SignalServiceSyncMessage { return sent; } - public Optional getGroups() { - return groups; - } - public Optional getContacts() { return contacts; } diff --git a/libsignal/service/src/main/proto/SignalService.proto b/libsignal/service/src/main/proto/SignalService.proto index 1948f4bdcf..a0bbbadc2b 100644 --- a/libsignal/service/src/main/proto/SignalService.proto +++ b/libsignal/service/src/main/proto/SignalService.proto @@ -479,10 +479,6 @@ message SyncMessage { optional bool complete = 2 [default = false]; } - message Groups { - optional AttachmentPointer blob = 1; - } - message Blocked { repeated string numbers = 1; repeated string uuids = 3; @@ -493,7 +489,7 @@ message SyncMessage { enum Type { UNKNOWN = 0; CONTACTS = 1; - GROUPS = 2; +// GROUPS = 2; BLOCKED = 3; CONFIGURATION = 4; KEYS = 5; @@ -636,7 +632,7 @@ message SyncMessage { optional Sent sent = 1; optional Contacts contacts = 2; - optional Groups groups = 3; + reserved /*groups*/ 3; optional Request request = 4; repeated Read read = 5; optional Blocked blocked = 6;