Better support for local storage with passphrase disabled.

1) Never get into a state where messages aren't displayed
   unencrypted.

2) Fix bug where locked DB required launching twice.
This commit is contained in:
Moxie Marlinspike 2014-02-28 15:58:30 -08:00
parent 81ee9e31c5
commit 8ea4db03db
3 changed files with 37 additions and 10 deletions

View File

@ -9,9 +9,6 @@ import org.thoughtcrime.securesms.recipients.RecipientFactory;
import org.thoughtcrime.securesms.recipients.RecipientFormattingException; import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
import org.thoughtcrime.securesms.recipients.Recipients; import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.service.ApplicationMigrationService; import org.thoughtcrime.securesms.service.ApplicationMigrationService;
import org.thoughtcrime.securesms.service.DirectoryRefreshListener;
import org.thoughtcrime.securesms.service.DirectoryRefreshService;
import org.thoughtcrime.securesms.util.DirectoryHelper;
import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.textsecure.crypto.MasterSecret; import org.whispersystems.textsecure.crypto.MasterSecret;
@ -24,18 +21,27 @@ public class RoutingActivity extends PassphraseRequiredSherlockActivity {
private static final int STATE_UPGRADE_DATABASE = 5; private static final int STATE_UPGRADE_DATABASE = 5;
private static final int STATE_PROMPT_PUSH_REGISTRATION = 6; private static final int STATE_PROMPT_PUSH_REGISTRATION = 6;
private MasterSecret masterSecret = null; private MasterSecret masterSecret = null;
private boolean isVisible = false; private boolean isVisible = false;
private boolean canceledResult = false;
private boolean newIntent = false;
@Override @Override
public void onNewIntent(Intent intent) { public void onNewIntent(Intent intent) {
super.onNewIntent(intent); super.onNewIntent(intent);
setIntent(intent); setIntent(intent);
this.newIntent = true;
} }
@Override @Override
public void onResume() { public void onResume() {
this.isVisible = true; if (this.canceledResult && !this.newIntent) {
finish();
}
this.newIntent = false;
this.canceledResult = false;
this.isVisible = true;
super.onResume(); super.onResume();
} }
@ -65,8 +71,9 @@ public class RoutingActivity extends PassphraseRequiredSherlockActivity {
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_CANCELED) if (resultCode == RESULT_CANCELED) {
finish(); canceledResult = true;
}
} }
private void routeApplicationState() { private void routeApplicationState() {

View File

@ -281,8 +281,8 @@ public class PushReceiver {
} }
private Pair<Long, Long> insertMessagePlaceholder(MasterSecret masterSecret, private Pair<Long, Long> insertMessagePlaceholder(MasterSecret masterSecret,
IncomingPushMessage message, IncomingPushMessage message,
boolean secure) boolean secure)
{ {
IncomingTextMessage placeholder = new IncomingTextMessage(message, "", null); IncomingTextMessage placeholder = new IncomingTextMessage(message, "", null);

View File

@ -29,7 +29,10 @@ import android.os.Message;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import org.thoughtcrime.securesms.crypto.InvalidPassphraseException;
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
import org.thoughtcrime.securesms.database.CanonicalSessionMigrator; import org.thoughtcrime.securesms.database.CanonicalSessionMigrator;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.WorkerThread; import org.thoughtcrime.securesms.util.WorkerThread;
import org.whispersystems.textsecure.crypto.MasterSecret; import org.whispersystems.textsecure.crypto.MasterSecret;
@ -185,6 +188,7 @@ public class SendReceiveService extends Service {
registerReceiver(clearKeyReceiver, clearKeyFilter, KeyCachingService.KEY_PERMISSION, null); registerReceiver(clearKeyReceiver, clearKeyFilter, KeyCachingService.KEY_PERMISSION, null);
Intent bindIntent = new Intent(this, KeyCachingService.class); Intent bindIntent = new Intent(this, KeyCachingService.class);
startService(bindIntent);
bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE); bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
} }
@ -242,6 +246,12 @@ public class SendReceiveService extends Service {
@Override @Override
public void run() { public void run() {
MasterSecret masterSecret = SendReceiveService.this.masterSecret;
if (masterSecret == null && TextSecurePreferences.isPasswordDisabled(SendReceiveService.this)) {
masterSecret = getPlaceholderSecret();
}
switch (what) { switch (what) {
case RECEIVE_SMS: smsReceiver.process(masterSecret, intent); return; case RECEIVE_SMS: smsReceiver.process(masterSecret, intent); return;
case SEND_SMS: smsSender.process(masterSecret, intent); return; case SEND_SMS: smsSender.process(masterSecret, intent); return;
@ -254,6 +264,16 @@ public class SendReceiveService extends Service {
case DOWNLOAD_AVATAR: avatarDownloader.process(masterSecret, intent); return; case DOWNLOAD_AVATAR: avatarDownloader.process(masterSecret, intent); return;
} }
} }
private MasterSecret getPlaceholderSecret() {
try {
return MasterSecretUtil.getMasterSecret(SendReceiveService.this,
MasterSecretUtil.UNENCRYPTED_PASSPHRASE);
} catch (InvalidPassphraseException e) {
Log.w("SendReceiveService", e);
return null;
}
}
} }
public class ToastHandler extends Handler { public class ToastHandler extends Handler {