Enable TextSecure universal transport.

This commit is contained in:
Moxie Marlinspike
2013-07-12 17:40:41 -07:00
parent d7070e7ecf
commit 53803630d4
8 changed files with 126 additions and 149 deletions

View File

@@ -0,0 +1,32 @@
package org.thoughtcrime.securesms.transport;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import org.thoughtcrime.securesms.service.SendReceiveService;
import org.thoughtcrime.securesms.service.SmsListener;
public abstract class BaseTransport {
protected Intent constructSentIntent(Context context, long messageId, long type) {
Intent pending = new Intent(SendReceiveService.SENT_SMS_ACTION,
Uri.parse("custom://" + messageId + System.currentTimeMillis()),
context, SmsListener.class);
pending.putExtra("type", type);
pending.putExtra("message_id", messageId);
return pending;
}
protected Intent constructDeliveredIntent(Context context, long messageId, long type) {
Intent pending = new Intent(SendReceiveService.DELIVERED_SMS_ACTION,
Uri.parse("custom://" + messageId + System.currentTimeMillis()),
context, SmsListener.class);
pending.putExtra("type", type);
pending.putExtra("message_id", messageId);
return pending;
}
}

View File

@@ -1,24 +0,0 @@
package org.thoughtcrime.securesms.transport;
import android.content.Context;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
import java.io.IOException;
public class GcmTransport {
private final Context context;
private final MasterSecret masterSecret;
public GcmTransport(Context context, MasterSecret masterSecret) {
this.context = context.getApplicationContext();
this.masterSecret = masterSecret;
}
public void deliver(SmsMessageRecord message) throws IOException {
}
}

View File

@@ -0,0 +1,43 @@
package org.thoughtcrime.securesms.transport;
import android.content.Context;
import android.util.Log;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.textsecure.push.PushServiceSocket;
import org.whispersystems.textsecure.push.RateLimitException;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
import java.io.IOException;
public class PushTransport extends BaseTransport {
private final Context context;
private final MasterSecret masterSecret;
public PushTransport(Context context, MasterSecret masterSecret) {
this.context = context.getApplicationContext();
this.masterSecret = masterSecret;
}
public void deliver(SmsMessageRecord message) throws IOException {
try {
String localNumber = TextSecurePreferences.getLocalNumber(context);
String password = TextSecurePreferences.getPushServerPassword(context);
PushServiceSocket socket = new PushServiceSocket(context, localNumber, password);
String recipientNumber = message.getIndividualRecipient().getNumber();
String recipientCanonicalNumber = PhoneNumberFormatter.formatNumber(recipientNumber,
localNumber);
socket.sendMessage(recipientCanonicalNumber, message.getBody().getBody());
context.sendBroadcast(constructSentIntent(context, message.getId(), message.getType()));
} catch (RateLimitException e) {
Log.w("PushTransport", e);
throw new IOException("Rate limit exceeded.");
}
}
}

View File

@@ -20,7 +20,7 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.util.ArrayList;
public class SmsTransport {
public class SmsTransport extends BaseTransport {
private final Context context;
private final MasterSecret masterSecret;
@@ -114,11 +114,10 @@ public class SmsTransport {
private ArrayList<PendingIntent> constructSentIntents(long messageId, long type, ArrayList<String> messages) {
ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messages.size());
for (int i=0;i<messages.size();i++) {
Intent pending = new Intent(SendReceiveService.SENT_SMS_ACTION, Uri.parse("custom://" + messageId + System.currentTimeMillis()), context, SmsDeliveryListener.class);
pending.putExtra("type", type);
pending.putExtra("message_id", messageId);
sentIntents.add(PendingIntent.getBroadcast(context, 0, pending, 0));
for (String message : messages) {
sentIntents.add(PendingIntent.getBroadcast(context, 0,
constructSentIntent(context, messageId, type),
0));
}
return sentIntents;
@@ -131,11 +130,10 @@ public class SmsTransport {
ArrayList<PendingIntent> deliveredIntents = new ArrayList<PendingIntent>(messages.size());
for (int i=0;i<messages.size();i++) {
Intent pending = new Intent(SendReceiveService.DELIVERED_SMS_ACTION, Uri.parse("custom://" + messageId + System.currentTimeMillis()), context, SmsDeliveryListener.class);
pending.putExtra("type", type);
pending.putExtra("message_id", messageId);
deliveredIntents.add(PendingIntent.getBroadcast(context, 0, pending, 0));
for (String message : messages) {
deliveredIntents.add(PendingIntent.getBroadcast(context, 0,
constructDeliveredIntent(context, messageId, type),
0));
}
return deliveredIntents;

View File

@@ -1,38 +1,50 @@
package org.thoughtcrime.securesms.transport;
import android.content.Context;
import android.util.Log;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.textsecure.directory.NumberFilter;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
import java.io.IOException;
public class UniversalTransport {
private final Context context;
private final GcmTransport gcmTransport;
private final SmsTransport smsTransport;
private final Context context;
private final PushTransport pushTransport;
private final SmsTransport smsTransport;
public UniversalTransport(Context context, MasterSecret masterSecret) {
this.context = context;
this.gcmTransport = new GcmTransport(context, masterSecret);
this.smsTransport = new SmsTransport(context, masterSecret);
this.context = context;
this.pushTransport = new PushTransport(context, masterSecret);
this.smsTransport = new SmsTransport(context, masterSecret);
}
public void deliver(SmsMessageRecord message) throws UndeliverableMessageException {
smsTransport.deliver(message);
// Recipient recipient = message.getIndividualRecipient();
// String number = PhoneNumberFormatter.formatNumber(context, recipient.getNumber());
//
// if (NumberFilter.getInstance(context).containsNumber(number)) {
// try {
// Log.w("UniversalTransport", "Delivering with GCM...");
// gcmTransport.deliver(message);
// } catch (IOException ioe) {
// Log.w("UniversalTransport", ioe);
// smsTransport.deliver(message);
// }
// } else {
// Log.w("UniversalTransport", "Delivering with SMS...");
// smsTransport.deliver(message);
// }
if (!TextSecurePreferences.isPushRegistered(context)) {
smsTransport.deliver(message);
return;
}
Recipient recipient = message.getIndividualRecipient();
String localNumber = TextSecurePreferences.getLocalNumber(context);
String number = PhoneNumberFormatter.formatNumber(recipient.getNumber(), localNumber);
if (NumberFilter.getInstance(context).containsNumber(number)) {
try {
Log.w("UniversalTransport", "Delivering with GCM...");
pushTransport.deliver(message);
} catch (IOException ioe) {
Log.w("UniversalTransport", ioe);
smsTransport.deliver(message);
}
} else {
Log.w("UniversalTransport", "Delivering with SMS...");
smsTransport.deliver(message);
}
}
}