mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-19 08:09:12 +01:00
Remove encrypted SMS transport, simplify transport options.
Closes #2647 // FREEBIE
This commit is contained in:
@@ -7,32 +7,16 @@ import org.thoughtcrime.securesms.crypto.AsymmetricMasterCipher;
|
||||
import org.thoughtcrime.securesms.crypto.AsymmetricMasterSecret;
|
||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
|
||||
import org.thoughtcrime.securesms.crypto.SecurityEvent;
|
||||
import org.thoughtcrime.securesms.crypto.SmsCipher;
|
||||
import org.thoughtcrime.securesms.crypto.storage.TextSecureAxolotlStore;
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||
import org.thoughtcrime.securesms.database.EncryptingSmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.NoSuchMessageException;
|
||||
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
|
||||
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
||||
import org.thoughtcrime.securesms.service.KeyCachingService;
|
||||
import org.thoughtcrime.securesms.sms.IncomingEncryptedMessage;
|
||||
import org.thoughtcrime.securesms.sms.IncomingEndSessionMessage;
|
||||
import org.thoughtcrime.securesms.sms.IncomingKeyExchangeMessage;
|
||||
import org.thoughtcrime.securesms.sms.IncomingPreKeyBundleMessage;
|
||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||
import org.thoughtcrime.securesms.sms.MessageSender;
|
||||
import org.thoughtcrime.securesms.sms.OutgoingKeyExchangeMessage;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.whispersystems.jobqueue.JobParameters;
|
||||
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||
import org.whispersystems.libaxolotl.InvalidVersionException;
|
||||
import org.whispersystems.libaxolotl.LegacyMessageException;
|
||||
import org.whispersystems.libaxolotl.NoSessionException;
|
||||
import org.whispersystems.libaxolotl.StaleKeyExchangeException;
|
||||
import org.whispersystems.libaxolotl.UntrustedIdentityException;
|
||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureGroup;
|
||||
|
||||
@@ -54,11 +38,7 @@ public class SmsDecryptJob extends MasterSecretJob {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdded() {
|
||||
if (KeyCachingService.getMasterSecret(context) == null) {
|
||||
MessageNotifier.updateNotification(context, null, -2);
|
||||
}
|
||||
}
|
||||
public void onAdded() {}
|
||||
|
||||
@Override
|
||||
public void onRun(MasterSecret masterSecret) throws NoSuchMessageException {
|
||||
@@ -68,27 +48,17 @@ public class SmsDecryptJob extends MasterSecretJob {
|
||||
SmsMessageRecord record = database.getMessage(masterSecret, messageId);
|
||||
IncomingTextMessage message = createIncomingTextMessage(masterSecret, record);
|
||||
long messageId = record.getId();
|
||||
long threadId = record.getThreadId();
|
||||
|
||||
if (message.isSecureMessage()) handleSecureMessage(masterSecret, messageId, threadId, message);
|
||||
else if (message.isPreKeyBundle()) handlePreKeyWhisperMessage(masterSecret, messageId, threadId, (IncomingPreKeyBundleMessage) message);
|
||||
else if (message.isKeyExchange()) handleKeyExchangeMessage(masterSecret, messageId, threadId, (IncomingKeyExchangeMessage) message);
|
||||
else if (message.isEndSession()) handleSecureMessage(masterSecret, messageId, threadId, message);
|
||||
else database.updateMessageBody(masterSecret, messageId, message.getMessageBody());
|
||||
if (message.isSecureMessage()) {
|
||||
database.markAsLegacyVersion(messageId);
|
||||
} else {
|
||||
database.updateMessageBody(masterSecret, messageId, message.getMessageBody());
|
||||
}
|
||||
|
||||
MessageNotifier.updateNotification(context, masterSecret);
|
||||
} catch (LegacyMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsLegacyVersion(messageId);
|
||||
} catch (InvalidMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsDecryptFailed(messageId);
|
||||
} catch (DuplicateMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsDecryptDuplicate(messageId);
|
||||
} catch (NoSessionException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsNoSession(messageId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,77 +72,6 @@ public class SmsDecryptJob extends MasterSecretJob {
|
||||
// TODO
|
||||
}
|
||||
|
||||
private void handleSecureMessage(MasterSecret masterSecret, long messageId, long threadId,
|
||||
IncomingTextMessage message)
|
||||
throws NoSessionException, DuplicateMessageException,
|
||||
InvalidMessageException, LegacyMessageException
|
||||
{
|
||||
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
||||
SmsCipher cipher = new SmsCipher(new TextSecureAxolotlStore(context, masterSecret));
|
||||
IncomingTextMessage plaintext = cipher.decrypt(context, message);
|
||||
|
||||
database.updateMessageBody(masterSecret, messageId, plaintext.getMessageBody());
|
||||
|
||||
if (message.isEndSession()) SecurityEvent.broadcastSecurityUpdateEvent(context, threadId);
|
||||
}
|
||||
|
||||
private void handlePreKeyWhisperMessage(MasterSecret masterSecret, long messageId, long threadId,
|
||||
IncomingPreKeyBundleMessage message)
|
||||
throws NoSessionException, DuplicateMessageException,
|
||||
InvalidMessageException, LegacyMessageException
|
||||
{
|
||||
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
||||
|
||||
try {
|
||||
SmsCipher smsCipher = new SmsCipher(new TextSecureAxolotlStore(context, masterSecret));
|
||||
IncomingEncryptedMessage plaintext = smsCipher.decrypt(context, message);
|
||||
|
||||
database.updateBundleMessageBody(masterSecret, messageId, plaintext.getMessageBody());
|
||||
|
||||
SecurityEvent.broadcastSecurityUpdateEvent(context, threadId);
|
||||
} catch (InvalidVersionException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsInvalidVersionKeyExchange(messageId);
|
||||
} catch (UntrustedIdentityException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleKeyExchangeMessage(MasterSecret masterSecret, long messageId, long threadId,
|
||||
IncomingKeyExchangeMessage message)
|
||||
{
|
||||
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
||||
|
||||
if (TextSecurePreferences.isAutoRespondKeyExchangeEnabled(context)) {
|
||||
try {
|
||||
SmsCipher cipher = new SmsCipher(new TextSecureAxolotlStore(context, masterSecret));
|
||||
OutgoingKeyExchangeMessage response = cipher.process(context, message);
|
||||
|
||||
database.markAsProcessedKeyExchange(messageId);
|
||||
|
||||
SecurityEvent.broadcastSecurityUpdateEvent(context, threadId);
|
||||
|
||||
if (response != null) {
|
||||
MessageSender.send(context, masterSecret, response, threadId, true);
|
||||
}
|
||||
} catch (InvalidVersionException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsInvalidVersionKeyExchange(messageId);
|
||||
} catch (InvalidMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsCorruptKeyExchange(messageId);
|
||||
} catch (LegacyMessageException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsLegacyVersion(messageId);
|
||||
} catch (StaleKeyExchangeException e) {
|
||||
Log.w(TAG, e);
|
||||
database.markAsStaleKeyExchange(messageId);
|
||||
} catch (UntrustedIdentityException e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String getAsymmetricDecryptedBody(MasterSecret masterSecret, String body)
|
||||
throws InvalidMessageException
|
||||
{
|
||||
@@ -189,28 +88,17 @@ public class SmsDecryptJob extends MasterSecretJob {
|
||||
private IncomingTextMessage createIncomingTextMessage(MasterSecret masterSecret, SmsMessageRecord record)
|
||||
throws InvalidMessageException
|
||||
{
|
||||
String plaintextBody = record.getBody().getBody();
|
||||
|
||||
if (record.isAsymmetricEncryption()) {
|
||||
plaintextBody = getAsymmetricDecryptedBody(masterSecret, record.getBody().getBody());
|
||||
}
|
||||
|
||||
IncomingTextMessage message = new IncomingTextMessage(record.getRecipients().getPrimaryRecipient().getNumber(),
|
||||
record.getRecipientDeviceId(),
|
||||
record.getDateSent(),
|
||||
plaintextBody,
|
||||
record.getBody().getBody(),
|
||||
Optional.<TextSecureGroup>absent());
|
||||
|
||||
if (record.isEndSession()) {
|
||||
return new IncomingEndSessionMessage(message);
|
||||
} else if (record.isBundleKeyExchange()) {
|
||||
return new IncomingPreKeyBundleMessage(message, message.getMessageBody());
|
||||
} else if (record.isKeyExchange()) {
|
||||
return new IncomingKeyExchangeMessage(message, message.getMessageBody());
|
||||
} else if (record.isSecure()) {
|
||||
if (record.isAsymmetricEncryption()) {
|
||||
String plaintextBody = getAsymmetricDecryptedBody(masterSecret, record.getBody().getBody());
|
||||
return new IncomingTextMessage(message, plaintextBody);
|
||||
} else {
|
||||
return new IncomingEncryptedMessage(message, message.getMessageBody());
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user