mirror of
https://github.com/oxen-io/session-android.git
synced 2025-10-24 08:58:45 +00:00
Move API around.
This commit is contained in:
@@ -5,8 +5,9 @@ import android.util.Log;
|
||||
import android.util.Pair;
|
||||
|
||||
import org.thoughtcrime.securesms.ApplicationContext;
|
||||
import org.thoughtcrime.securesms.crypto.SecurityEvent;
|
||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||
import org.thoughtcrime.securesms.crypto.SecurityEvent;
|
||||
import org.thoughtcrime.securesms.crypto.storage.TextSecureAxolotlStore;
|
||||
import org.thoughtcrime.securesms.crypto.storage.TextSecureSessionStore;
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||
import org.thoughtcrime.securesms.database.EncryptingSmsDatabase;
|
||||
@@ -16,8 +17,8 @@ import org.thoughtcrime.securesms.groups.GroupMessageProcessor;
|
||||
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
|
||||
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
||||
import org.thoughtcrime.securesms.push.TextSecureMessageReceiverFactory;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientFactory;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
|
||||
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||
import org.thoughtcrime.securesms.service.KeyCachingService;
|
||||
import org.thoughtcrime.securesms.sms.IncomingEncryptedMessage;
|
||||
@@ -34,12 +35,13 @@ import org.whispersystems.libaxolotl.InvalidVersionException;
|
||||
import org.whispersystems.libaxolotl.LegacyMessageException;
|
||||
import org.whispersystems.libaxolotl.NoSessionException;
|
||||
import org.whispersystems.libaxolotl.UntrustedIdentityException;
|
||||
import org.whispersystems.libaxolotl.state.AxolotlStore;
|
||||
import org.whispersystems.libaxolotl.state.SessionStore;
|
||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||
import org.whispersystems.textsecure.api.TextSecureMessageReceiver;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureMessage;
|
||||
import org.whispersystems.textsecure.push.IncomingPushMessage;
|
||||
import org.whispersystems.textsecure.crypto.TextSecureCipher;
|
||||
import org.whispersystems.textsecure.util.Base64;
|
||||
|
||||
import ws.com.google.android.mms.MmsException;
|
||||
@@ -68,11 +70,11 @@ public class PushDecryptJob extends MasterSecretJob {
|
||||
@Override
|
||||
public void onRun() throws RequirementNotMetException {
|
||||
try {
|
||||
MasterSecret masterSecret = getMasterSecret();
|
||||
PushDatabase database = DatabaseFactory.getPushDatabase(context);
|
||||
IncomingPushMessage push = database.get(messageId);
|
||||
MasterSecret masterSecret = getMasterSecret();
|
||||
PushDatabase database = DatabaseFactory.getPushDatabase(context);
|
||||
TextSecureEnvelope envelope = database.get(messageId);
|
||||
|
||||
handleMessage(masterSecret, push);
|
||||
handleMessage(masterSecret, envelope);
|
||||
database.delete(messageId);
|
||||
|
||||
} catch (PushDatabase.NoSuchMessageException e) {
|
||||
@@ -91,42 +93,46 @@ public class PushDecryptJob extends MasterSecretJob {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void handleMessage(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
private void handleMessage(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
try {
|
||||
Recipients recipients = RecipientFactory.getRecipientsFromMessage(context, push, false);
|
||||
long recipientId = recipients.getPrimaryRecipient().getRecipientId();
|
||||
TextSecureMessageReceiver messageReceiver = TextSecureMessageReceiverFactory.create(context, masterSecret);
|
||||
Recipients recipients = RecipientFactory.getRecipientsFromString(context, envelope.getSource(), false);
|
||||
long recipientId = recipients.getPrimaryRecipient().getRecipientId();
|
||||
int deviceId = envelope.getSourceDevice();
|
||||
AxolotlStore axolotlStore = new TextSecureAxolotlStore(context, masterSecret);
|
||||
TextSecureCipher cipher = new TextSecureCipher(axolotlStore, recipientId, deviceId);
|
||||
|
||||
TextSecureMessage message = messageReceiver.receiveMessage(recipientId, push);
|
||||
TextSecureMessage message = cipher.decrypt(envelope);
|
||||
|
||||
if (message.isEndSession()) handleEndSessionMessage(masterSecret, recipientId, push, message);
|
||||
else if (message.isGroupUpdate()) handleGroupMessage(masterSecret, push, message);
|
||||
else if (message.getAttachments().isPresent()) handleMediaMessage(masterSecret, push, message);
|
||||
else handleTextMessage(masterSecret, push, message);
|
||||
if (message.isEndSession()) handleEndSessionMessage(masterSecret, recipientId, envelope, message);
|
||||
else if (message.isGroupUpdate()) handleGroupMessage(masterSecret, envelope, message);
|
||||
else if (message.getAttachments().isPresent()) handleMediaMessage(masterSecret, envelope, message);
|
||||
else handleTextMessage(masterSecret, envelope, message);
|
||||
} catch (InvalidVersionException e) {
|
||||
Log.w(TAG, e);
|
||||
handleInvalidVersionMessage(masterSecret, push);
|
||||
} catch (InvalidMessageException | InvalidKeyIdException | InvalidKeyException | MmsException e) {
|
||||
handleInvalidVersionMessage(masterSecret, envelope);
|
||||
} catch (InvalidMessageException | InvalidKeyIdException | InvalidKeyException | MmsException | RecipientFormattingException e) {
|
||||
Log.w(TAG, e);
|
||||
handleCorruptMessage(masterSecret, push);
|
||||
handleCorruptMessage(masterSecret, envelope);
|
||||
} catch (NoSessionException e) {
|
||||
Log.w(TAG, e);
|
||||
handleNoSessionMessage(masterSecret, push);
|
||||
handleNoSessionMessage(masterSecret, envelope);
|
||||
} catch (LegacyMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
handleLegacyMessage(masterSecret, push);
|
||||
handleLegacyMessage(masterSecret, envelope);
|
||||
} catch (DuplicateMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
handleDuplicateMessage(masterSecret, push);
|
||||
handleDuplicateMessage(masterSecret, envelope);
|
||||
} catch (UntrustedIdentityException e) {
|
||||
Log.w(TAG, e);
|
||||
handleUntrustedIdentityMessage(masterSecret, push);
|
||||
handleUntrustedIdentityMessage(masterSecret, envelope);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleEndSessionMessage(MasterSecret masterSecret, long recipientId, IncomingPushMessage push, TextSecureMessage message) {
|
||||
IncomingTextMessage incomingTextMessage = new IncomingTextMessage(push.getSource(),
|
||||
push.getSourceDevice(),
|
||||
private void handleEndSessionMessage(MasterSecret masterSecret, long recipientId,
|
||||
TextSecureEnvelope envelope, TextSecureMessage message)
|
||||
{
|
||||
IncomingTextMessage incomingTextMessage = new IncomingTextMessage(envelope.getSource(),
|
||||
envelope.getSourceDevice(),
|
||||
message.getTimestamp(),
|
||||
"", Optional.<TextSecureGroup>absent());
|
||||
|
||||
@@ -141,18 +147,18 @@ public class PushDecryptJob extends MasterSecretJob {
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleGroupMessage(MasterSecret masterSecret, IncomingPushMessage push, TextSecureMessage message) {
|
||||
GroupMessageProcessor.process(context, masterSecret, push, message);
|
||||
private void handleGroupMessage(MasterSecret masterSecret, TextSecureEnvelope envelope, TextSecureMessage message) {
|
||||
GroupMessageProcessor.process(context, masterSecret, envelope, message);
|
||||
}
|
||||
|
||||
private void handleMediaMessage(MasterSecret masterSecret, IncomingPushMessage signal, TextSecureMessage message)
|
||||
private void handleMediaMessage(MasterSecret masterSecret, TextSecureEnvelope envelope, TextSecureMessage message)
|
||||
throws MmsException
|
||||
{
|
||||
String localNumber = TextSecurePreferences.getLocalNumber(context);
|
||||
MmsDatabase database = DatabaseFactory.getMmsDatabase(context);
|
||||
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(masterSecret, signal.getSource(),
|
||||
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(masterSecret, envelope.getSource(),
|
||||
localNumber, message.getTimestamp(),
|
||||
Optional.fromNullable(signal.getRelay()),
|
||||
Optional.fromNullable(envelope.getRelay()),
|
||||
message.getBody(),
|
||||
message.getGroupInfo(),
|
||||
message.getAttachments());
|
||||
@@ -172,11 +178,11 @@ public class PushDecryptJob extends MasterSecretJob {
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleTextMessage(MasterSecret masterSecret, IncomingPushMessage signal, TextSecureMessage message) {
|
||||
private void handleTextMessage(MasterSecret masterSecret, TextSecureEnvelope envelope, TextSecureMessage message) {
|
||||
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
||||
String body = message.getBody().isPresent() ? message.getBody().get() : "";
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(signal.getSource(),
|
||||
signal.getSourceDevice(),
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(),
|
||||
envelope.getSourceDevice(),
|
||||
message.getTimestamp(), body,
|
||||
message.getGroupInfo());
|
||||
|
||||
@@ -185,50 +191,48 @@ public class PushDecryptJob extends MasterSecretJob {
|
||||
}
|
||||
|
||||
Pair<Long, Long> messageAndThreadId = database.insertMessageInbox(masterSecret, textMessage);
|
||||
// database.updateMessageBody(masterSecret, messageAndThreadId.first, body);
|
||||
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleInvalidVersionMessage(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, push);
|
||||
private void handleInvalidVersionMessage(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, envelope);
|
||||
DatabaseFactory.getEncryptingSmsDatabase(context).markAsInvalidVersionKeyExchange(messageAndThreadId.first);
|
||||
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleCorruptMessage(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, push);
|
||||
private void handleCorruptMessage(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, envelope);
|
||||
DatabaseFactory.getEncryptingSmsDatabase(context).markAsDecryptFailed(messageAndThreadId.first);
|
||||
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleNoSessionMessage(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, push);
|
||||
private void handleNoSessionMessage(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, envelope);
|
||||
DatabaseFactory.getEncryptingSmsDatabase(context).markAsNoSession(messageAndThreadId.first);
|
||||
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleLegacyMessage(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, push);
|
||||
private void handleLegacyMessage(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, envelope);
|
||||
DatabaseFactory.getEncryptingSmsDatabase(context).markAsLegacyVersion(messageAndThreadId.first);
|
||||
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleDuplicateMessage(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, push);
|
||||
private void handleDuplicateMessage(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
Pair<Long, Long> messageAndThreadId = insertPlaceholder(masterSecret, envelope);
|
||||
DatabaseFactory.getEncryptingSmsDatabase(context).markAsDecryptDuplicate(messageAndThreadId.first);
|
||||
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private void handleUntrustedIdentityMessage(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
String encoded = Base64.encodeBytes(push.getBody());
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(push.getSource(), push.getSourceDevice(),
|
||||
push.getTimestampMillis(), encoded,
|
||||
private void handleUntrustedIdentityMessage(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
String encoded = Base64.encodeBytes(envelope.getMessage());
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(), envelope.getSourceDevice(),
|
||||
envelope.getTimestamp(), encoded,
|
||||
Optional.<TextSecureGroup>absent());
|
||||
|
||||
IncomingPreKeyBundleMessage bundleMessage = new IncomingPreKeyBundleMessage(textMessage, encoded);
|
||||
@@ -238,11 +242,11 @@ public class PushDecryptJob extends MasterSecretJob {
|
||||
MessageNotifier.updateNotification(context, masterSecret, messageAndThreadId.second);
|
||||
}
|
||||
|
||||
private Pair<Long, Long> insertPlaceholder(MasterSecret masterSecret, IncomingPushMessage push) {
|
||||
private Pair<Long, Long> insertPlaceholder(MasterSecret masterSecret, TextSecureEnvelope envelope) {
|
||||
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
||||
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(push.getSource(), push.getSourceDevice(),
|
||||
push.getTimestampMillis(), "",
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(envelope.getSource(), envelope.getSourceDevice(),
|
||||
envelope.getTimestamp(), "",
|
||||
Optional.<TextSecureGroup>absent());
|
||||
|
||||
textMessage = new IncomingEncryptedMessage(textMessage, "");
|
||||
|
||||
@@ -9,11 +9,10 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.whispersystems.jobqueue.JobManager;
|
||||
import org.whispersystems.jobqueue.JobParameters;
|
||||
import org.whispersystems.libaxolotl.InvalidVersionException;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
||||
import org.whispersystems.textsecure.directory.Directory;
|
||||
import org.whispersystems.textsecure.directory.NotInDirectoryException;
|
||||
import org.whispersystems.textsecure.push.ContactTokenDetails;
|
||||
import org.whispersystems.textsecure.push.IncomingEncryptedPushMessage;
|
||||
import org.whispersystems.textsecure.push.IncomingPushMessage;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -37,20 +36,19 @@ public class PushReceiveJob extends ContextJob {
|
||||
@Override
|
||||
public void onRun() {
|
||||
try {
|
||||
String sessionKey = TextSecurePreferences.getSignalingKey(context);
|
||||
IncomingEncryptedPushMessage encrypted = new IncomingEncryptedPushMessage(data, sessionKey);
|
||||
IncomingPushMessage message = encrypted.getIncomingPushMessage();
|
||||
String sessionKey = TextSecurePreferences.getSignalingKey(context);
|
||||
TextSecureEnvelope envelope = new TextSecureEnvelope(data, sessionKey);
|
||||
|
||||
if (!isActiveNumber(context, message.getSource())) {
|
||||
if (!isActiveNumber(context, envelope.getSource())) {
|
||||
Directory directory = Directory.getInstance(context);
|
||||
ContactTokenDetails contactTokenDetails = new ContactTokenDetails();
|
||||
contactTokenDetails.setNumber(message.getSource());
|
||||
contactTokenDetails.setNumber(envelope.getSource());
|
||||
|
||||
directory.setNumber(contactTokenDetails, true);
|
||||
}
|
||||
|
||||
if (message.isReceipt()) handleReceipt(message);
|
||||
else handleMessage(message);
|
||||
if (envelope.isReceipt()) handleReceipt(envelope);
|
||||
else handleMessage(envelope);
|
||||
} catch (IOException | InvalidVersionException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
@@ -66,21 +64,21 @@ public class PushReceiveJob extends ContextJob {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void handleMessage(IncomingPushMessage message) {
|
||||
private void handleMessage(TextSecureEnvelope envelope) {
|
||||
JobManager jobManager = ApplicationContext.getInstance(context).getJobManager();
|
||||
long messageId = DatabaseFactory.getPushDatabase(context).insert(message);
|
||||
long messageId = DatabaseFactory.getPushDatabase(context).insert(envelope);
|
||||
|
||||
jobManager.add(new DeliveryReceiptJob(context, message.getSource(),
|
||||
message.getTimestampMillis(),
|
||||
message.getRelay()));
|
||||
jobManager.add(new DeliveryReceiptJob(context, envelope.getSource(),
|
||||
envelope.getTimestamp(),
|
||||
envelope.getRelay()));
|
||||
|
||||
jobManager.add(new PushDecryptJob(context, messageId));
|
||||
}
|
||||
|
||||
private void handleReceipt(IncomingPushMessage message) {
|
||||
Log.w(TAG, String.format("Received receipt: (XXXXX, %d)", message.getTimestampMillis()));
|
||||
DatabaseFactory.getMmsSmsDatabase(context).incrementDeliveryReceiptCount(message.getSource(),
|
||||
message.getTimestampMillis());
|
||||
private void handleReceipt(TextSecureEnvelope envelope) {
|
||||
Log.w(TAG, String.format("Received receipt: (XXXXX, %d)", envelope.getTimestamp()));
|
||||
DatabaseFactory.getMmsSmsDatabase(context).incrementDeliveryReceiptCount(envelope.getSource(),
|
||||
envelope.getTimestamp());
|
||||
}
|
||||
|
||||
private boolean isActiveNumber(Context context, String e164number) {
|
||||
|
||||
Reference in New Issue
Block a user