From 81ee9e31c5170bd4c0ceb7381b5d2b3b969e27bc Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Fri, 28 Feb 2014 13:36:47 -0800 Subject: [PATCH] Update behavior for incoming SMS path. 1) On KitKat, unencrypted SMS messages are never stored in TextSecure unless it is set as the system-wide default. 2) On KitKat, if TextSecure is set as the system-wide default, provide an option to change the default to a different app. 3) Don't store the TextSecure challenge on KitKat+ devices. --- res/values/strings.xml | 4 ++++ .../ApplicationPreferencesActivity.java | 19 ++++++++++----- .../securesms/service/MmsListener.java | 8 ++++--- .../securesms/service/SmsListener.java | 23 +++++++++---------- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9098ce86b..94b9bd364 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -27,6 +27,10 @@ You are not registered with the push service... Updating directory Updating push directory... + SMS Enabled + Touch to change your default SMS app + SMS Disabled + Touch to make TextSecure your default SMS app diff --git a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java index df271f6b3..0091adbaa 100644 --- a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java +++ b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java @@ -38,6 +38,7 @@ import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.preference.RingtonePreference; import android.provider.ContactsContract; +import android.provider.Settings; import android.provider.Telephony; import android.text.TextUtils; import android.util.Log; @@ -101,7 +102,6 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredSherlockPr addPreferencesFromResource(R.xml.preferences); initializeIdentitySelection(); - initializePlatformSpecificOptions(); initializeSmsFallbackOption(); initializePushMessagingToggle(); @@ -142,6 +142,8 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredSherlockPr super.onResume(); dynamicTheme.onResume(this); dynamicLanguage.onResume(this); + + initializePlatformSpecificOptions(); } @Override @@ -187,21 +189,26 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredSherlockPr private void initializePlatformSpecificOptions() { PreferenceGroup generalCategory = (PreferenceGroup) findPreference("general_category"); Preference defaultPreference = findPreference(KITKAT_DEFAULT_PREF); + Preference allSmsPreference = findPreference(TextSecurePreferences.ALL_SMS_PREF); + Preference allMmsPreference = findPreference(TextSecurePreferences.ALL_MMS_PREF); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - generalCategory.removePreference(findPreference(TextSecurePreferences.ALL_SMS_PREF)); - generalCategory.removePreference(findPreference(TextSecurePreferences.ALL_MMS_PREF)); + if (allSmsPreference != null) generalCategory.removePreference(allSmsPreference); + if (allMmsPreference != null) generalCategory.removePreference(allMmsPreference); if (Util.isDefaultSmsProvider(this)) { - generalCategory.removePreference(defaultPreference); + defaultPreference.setIntent(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); + defaultPreference.setTitle(getString(R.string.ApplicationPreferencesActivity_sms_enabled)); + defaultPreference.setSummary(getString(R.string.ApplicationPreferencesActivity_touch_to_change_your_default_sms_app)); } else { Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT); intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, getPackageName()); - defaultPreference.setIntent(intent); + defaultPreference.setTitle(getString(R.string.ApplicationPreferencesActivity_sms_disabled)); + defaultPreference.setSummary(getString(R.string.ApplicationPreferencesActivity_touch_to_make_textsecure_your_default_sms_app)); } } else { - generalCategory.removePreference(defaultPreference); + if (defaultPreference != null) generalCategory.removePreference(defaultPreference); } } diff --git a/src/org/thoughtcrime/securesms/service/MmsListener.java b/src/org/thoughtcrime/securesms/service/MmsListener.java index 2de7ed702..4ee08d7f7 100644 --- a/src/org/thoughtcrime/securesms/service/MmsListener.java +++ b/src/org/thoughtcrime/securesms/service/MmsListener.java @@ -50,8 +50,7 @@ public class MmsListener extends BroadcastReceiver { return false; } - if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && - TextSecurePreferences.isSmsFallbackEnabled(context)) || + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT && TextSecurePreferences.isInterceptAllMmsEnabled(context)) { return true; @@ -76,7 +75,10 @@ public class MmsListener extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.w("MmsListener", "Got MMS broadcast..." + intent.getAction()); - if (isRelevant(context, intent)) { + if (Telephony.Sms.Intents.WAP_PUSH_DELIVER_ACTION.equals(intent.getAction()) || + (Telephony.Sms.Intents.WAP_PUSH_RECEIVED_ACTION.equals(intent.getAction()) && + isRelevant(context, intent))) + { Log.w("MmsListener", "Relevant!"); intent.setAction(SendReceiveService.RECEIVE_MMS_ACTION); intent.putExtra("ResultCode", this.getResultCode()); diff --git a/src/org/thoughtcrime/securesms/service/SmsListener.java b/src/org/thoughtcrime/securesms/service/SmsListener.java index 5f0c65b43..cc21f1105 100644 --- a/src/org/thoughtcrime/securesms/service/SmsListener.java +++ b/src/org/thoughtcrime/securesms/service/SmsListener.java @@ -19,25 +19,23 @@ package org.thoughtcrime.securesms.service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; import android.os.Build; -import android.preference.PreferenceManager; +import android.os.Bundle; +import android.provider.Telephony; import android.telephony.SmsMessage; import android.util.Log; -import org.thoughtcrime.securesms.ApplicationPreferencesActivity; import org.thoughtcrime.securesms.protocol.WirePrefix; import org.thoughtcrime.securesms.sms.IncomingTextMessage; -import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.TextSecurePreferences; +import org.thoughtcrime.securesms.util.Util; import java.util.ArrayList; public class SmsListener extends BroadcastReceiver { - private static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"; - private static final String SMS_DELIVERED_ACTION = "android.provider.Telephony.SMS_DELIVER"; + private static final String SMS_RECEIVED_ACTION = Telephony.Sms.Intents.SMS_RECEIVED_ACTION; + private static final String SMS_DELIVERED_ACTION = Telephony.Sms.Intents.SMS_DELIVER_ACTION; private boolean isExemption(SmsMessage message, String messageBody) { @@ -103,6 +101,9 @@ public class SmsListener extends BroadcastReceiver { if (!ApplicationMigrationService.isDatabaseImported(context)) return false; + if (isChallenge(context, intent)) + return false; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && SMS_RECEIVED_ACTION.equals(intent.getAction()) && Util.isDefaultSmsProvider(context)) @@ -110,8 +111,7 @@ public class SmsListener extends BroadcastReceiver { return false; } - if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && - TextSecurePreferences.isSmsFallbackEnabled(context)) || + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT && TextSecurePreferences.isInterceptAllSmsEnabled(context)) { return true; @@ -154,9 +154,8 @@ public class SmsListener extends BroadcastReceiver { context.sendBroadcast(challengeIntent); abortBroadcast(); - } else if ((intent.getAction().equals(SMS_RECEIVED_ACTION) || - intent.getAction().equals(SMS_DELIVERED_ACTION)) && - isRelevant(context, intent)) + } else if ((intent.getAction().equals(SMS_DELIVERED_ACTION)) || + (intent.getAction().equals(SMS_RECEIVED_ACTION)) && isRelevant(context, intent)) { Intent receivedIntent = new Intent(context, SendReceiveService.class); receivedIntent.setAction(SendReceiveService.RECEIVE_SMS_ACTION);