]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java
ecd5597d57519d9427f501f93331ad237a1bbabb
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / actions / SendRetryMessageRequestAction.java
1 package org.asamk.signal.manager.actions;
2
3 import org.asamk.signal.manager.groups.GroupId;
4 import org.asamk.signal.manager.jobs.Context;
5 import org.asamk.signal.manager.storage.recipients.RecipientId;
6 import org.signal.libsignal.metadata.ProtocolException;
7 import org.whispersystems.libsignal.protocol.CiphertextMessage;
8 import org.whispersystems.libsignal.protocol.DecryptionErrorMessage;
9 import org.whispersystems.libsignal.util.guava.Optional;
10 import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
11 import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
12
13 public class SendRetryMessageRequestAction implements HandleAction {
14
15 private final RecipientId recipientId;
16 private final ProtocolException protocolException;
17 private final SignalServiceEnvelope envelope;
18
19 public SendRetryMessageRequestAction(
20 final RecipientId recipientId,
21 final ProtocolException protocolException,
22 final SignalServiceEnvelope envelope
23 ) {
24 this.recipientId = recipientId;
25 this.protocolException = protocolException;
26 this.envelope = envelope;
27 }
28
29 @Override
30 public void execute(Context context) throws Throwable {
31 context.getAccount().getSessionStore().archiveSessions(recipientId);
32
33 int senderDevice = protocolException.getSenderDevice();
34 Optional<GroupId> groupId = protocolException.getGroupId().isPresent() ? Optional.of(GroupId.unknownVersion(
35 protocolException.getGroupId().get())) : Optional.absent();
36
37 byte[] originalContent;
38 int envelopeType;
39 if (protocolException.getUnidentifiedSenderMessageContent().isPresent()) {
40 final var messageContent = protocolException.getUnidentifiedSenderMessageContent().get();
41 originalContent = messageContent.getContent();
42 envelopeType = messageContent.getType();
43 } else {
44 originalContent = envelope.getContent();
45 envelopeType = envelopeTypeToCiphertextMessageType(envelope.getType());
46 }
47
48 DecryptionErrorMessage decryptionErrorMessage = DecryptionErrorMessage.forOriginalMessage(originalContent,
49 envelopeType,
50 envelope.getTimestamp(),
51 senderDevice);
52
53 context.getSendHelper().sendRetryReceipt(decryptionErrorMessage, recipientId, groupId);
54 }
55
56 private static int envelopeTypeToCiphertextMessageType(int envelopeType) {
57 switch (envelopeType) {
58 case SignalServiceProtos.Envelope.Type.PREKEY_BUNDLE_VALUE:
59 return CiphertextMessage.PREKEY_TYPE;
60 case SignalServiceProtos.Envelope.Type.UNIDENTIFIED_SENDER_VALUE:
61 return CiphertextMessage.SENDERKEY_TYPE;
62 case SignalServiceProtos.Envelope.Type.PLAINTEXT_CONTENT_VALUE:
63 return CiphertextMessage.PLAINTEXT_CONTENT_TYPE;
64 case SignalServiceProtos.Envelope.Type.CIPHERTEXT_VALUE:
65 default:
66 return CiphertextMessage.WHISPER_TYPE;
67 }
68 }
69
70 @Override
71 public boolean equals(final Object o) {
72 if (this == o) return true;
73 if (o == null || getClass() != o.getClass()) return false;
74
75 final SendRetryMessageRequestAction that = (SendRetryMessageRequestAction) o;
76
77 if (!recipientId.equals(that.recipientId)) return false;
78 if (!protocolException.equals(that.protocolException)) return false;
79 return envelope.equals(that.envelope);
80 }
81
82 @Override
83 public int hashCode() {
84 int result = recipientId.hashCode();
85 result = 31 * result + protocolException.hashCode();
86 result = 31 * result + envelope.hashCode();
87 return result;
88 }
89 }