Adding Signal SMS verification strings.

- Changes the voice verification string.
- Keeps the TextSecure SMS String for matching in Signal for Android.
- Changes TextSecure to Signal for iOS, adding tap to verify link.
- Added test for iOS query parameter.
This commit is contained in:
Frederic Jacobs 2015-11-29 16:50:11 +01:00 committed by Moxie Marlinspike
parent 85509c6d8b
commit b31a88043e
7 changed files with 53 additions and 23 deletions

View File

@ -51,6 +51,7 @@ import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@ -103,7 +104,8 @@ public class AccountController {
@GET
@Path("/{transport}/code/{number}")
public Response createAccount(@PathParam("transport") String transport,
@PathParam("number") String number)
@PathParam("number") String number,
@QueryParam("client") String client)
throws IOException, RateLimitExceededException
{
if (!Util.isValidNumber(number)) {
@ -128,7 +130,7 @@ public class AccountController {
if (testDevices.containsKey(number)) {
// noop
} else if (transport.equals("sms")) {
smsSender.deliverSmsVerification(number, verificationCode.getVerificationCodeDisplay());
smsSender.deliverSmsVerification(number, client, verificationCode.getVerificationCodeDisplay());
} else if (transport.equals("voice")) {
smsSender.deliverVoxVerification(number, verificationCode.getVerificationCodeSpeech());
}

View File

@ -19,6 +19,7 @@ package org.whispersystems.textsecuregcm.sms;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.textsecuregcm.configuration.NexmoConfiguration;
@ -56,9 +57,17 @@ public class NexmoSmsSender {
this.number = config.getNumber();
}
public void deliverSmsVerification(String destination, String verificationCode) throws IOException {
public void deliverSmsVerification(String destination, String clientType, String verificationCode) throws IOException {
String verificationMsg;
if ("ios".equals(clientType)) {
verificationMsg = String.format(SmsSender.SMS_IOS_VERIFICATION_TEXT, verificationCode, verificationCode);
} else {
verificationMsg = String.format(SmsSender.SMS_VERIFICATION_TEXT, verificationCode);
}
URL url = new URL(String.format(NEXMO_SMS_URL, apiKey, apiSecret, number, destination,
URLEncoder.encode(SmsSender.SMS_VERIFICATION_TEXT + verificationCode, "UTF-8")));
URLEncoder.encode(verificationMsg, "UTF-8")));
URLConnection connection = url.openConnection();
connection.setDoInput(true);

View File

@ -25,9 +25,9 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
public class SmsSender {
static final String SMS_IOS_VERIFICATION_TEXT = "Your Signal verification code: %s\n\nOr tap: sgnl://verify/%s";
static final String SMS_VERIFICATION_TEXT = "Your TextSecure verification code: ";
static final String VOX_VERIFICATION_TEXT = "Your TextSecure verification code is: ";
static final String VOX_VERIFICATION_TEXT = "Your Signal verification code is: ";
private final Logger logger = LoggerFactory.getLogger(SmsSender.class);
@ -44,7 +44,7 @@ public class SmsSender {
this.nexmoSender = nexmoSender;
}
public void deliverSmsVerification(String destination, String verificationCode)
public void deliverSmsVerification(String destination, String clientType, String verificationCode)
throws IOException
{
// Fix up mexico numbers to 'mobile' format just for SMS delivery.
@ -53,14 +53,14 @@ public class SmsSender {
}
if (!isTwilioDestination(destination) && nexmoSender.isPresent()) {
nexmoSender.get().deliverSmsVerification(destination, verificationCode);
nexmoSender.get().deliverSmsVerification(destination, clientType, verificationCode);
} else {
try {
twilioSender.deliverSmsVerification(destination, verificationCode);
twilioSender.deliverSmsVerification(destination, clientType, verificationCode);
} catch (TwilioRestException e) {
logger.info("Twilio SMS Failed: " + e.getErrorMessage());
if (nexmoSender.isPresent()) {
nexmoSender.get().deliverSmsVerification(destination, verificationCode);
nexmoSender.get().deliverSmsVerification(destination, clientType, verificationCode);
}
}
}

View File

@ -63,7 +63,7 @@ public class TwilioSmsSender {
this.random = new Random(System.currentTimeMillis());
}
public void deliverSmsVerification(String destination, String verificationCode)
public void deliverSmsVerification(String destination, String clientType, String verificationCode)
throws IOException, TwilioRestException
{
TwilioRestClient client = new TwilioRestClient(accountId, accountToken);
@ -71,7 +71,12 @@ public class TwilioSmsSender {
List<NameValuePair> messageParams = new LinkedList<>();
messageParams.add(new BasicNameValuePair("To", destination));
messageParams.add(new BasicNameValuePair("From", getRandom(random, numbers)));
messageParams.add(new BasicNameValuePair("Body", SmsSender.SMS_VERIFICATION_TEXT + verificationCode));
if ("ios".equals(clientType)) {
messageParams.add(new BasicNameValuePair("Body", String.format(SmsSender.SMS_IOS_VERIFICATION_TEXT, verificationCode, verificationCode)));
} else {
messageParams.add(new BasicNameValuePair("Body", String.format(SmsSender.SMS_VERIFICATION_TEXT, verificationCode)));
}
try {
messageFactory.create(messageParams);

View File

@ -82,7 +82,21 @@ public class AccountControllerTest {
assertThat(response.getStatus()).isEqualTo(200);
verify(smsSender).deliverSmsVerification(eq(SENDER), anyString());
verify(smsSender).deliverSmsVerification(eq(SENDER), isNull(String.class), anyString());
}
@Test
public void testSendiOSCode() throws Exception {
Response response =
resources.getJerseyTest()
.target(String.format("/v1/accounts/sms/code/%s", SENDER))
.queryParam("client", "ios")
.request()
.get();
assertThat(response.getStatus()).isEqualTo(200);
verify(smsSender).deliverSmsVerification(eq(SENDER), eq("ios"), anyString());
}
@Test

View File

@ -21,16 +21,16 @@ public class DeliveryPreferenceTest extends TestCase {
public void testInternationalPreferenceOff() throws IOException, TwilioRestException {
SmsSender smsSender = new SmsSender(twilioSender, Optional.of(nexmoSender), false);
smsSender.deliverSmsVerification("+441112223333", "123-456");
verify(nexmoSender).deliverSmsVerification("+441112223333", "123-456");
smsSender.deliverSmsVerification("+441112223333", null, "123-456");
verify(nexmoSender).deliverSmsVerification("+441112223333", null, "123-456");
verifyNoMoreInteractions(twilioSender);
}
public void testInternationalPreferenceOn() throws IOException, TwilioRestException {
SmsSender smsSender = new SmsSender(twilioSender, Optional.of(nexmoSender), true);
smsSender.deliverSmsVerification("+441112223333", "123-456");
verify(twilioSender).deliverSmsVerification("+441112223333", "123-456");
smsSender.deliverSmsVerification("+441112223333", null, "123-456");
verify(twilioSender).deliverSmsVerification("+441112223333", null, "123-456");
verifyNoMoreInteractions(nexmoSender);
}
}

View File

@ -19,16 +19,16 @@ public class TwilioFallbackTest extends TestCase {
@Override
protected void setUp() throws IOException, TwilioRestException {
doThrow(new TwilioRestException("foo", 404)).when(twilioSender).deliverSmsVerification(anyString(), anyString());
doThrow(new TwilioRestException("foo", 404)).when(twilioSender).deliverSmsVerification(anyString(), anyString(), anyString());
doThrow(new TwilioRestException("bar", 405)).when(twilioSender).deliverVoxVerification(anyString(), anyString());
}
public void testNexmoSmsFallback() throws IOException, TwilioRestException {
SmsSender smsSender = new SmsSender(twilioSender, Optional.of(nexmoSender), true);
smsSender.deliverSmsVerification("+442223334444", "123-456");
smsSender.deliverSmsVerification("+442223334444", null, "123-456");
verify(nexmoSender).deliverSmsVerification("+442223334444", "123-456");
verify(twilioSender).deliverSmsVerification("+442223334444", "123-456");
verify(nexmoSender).deliverSmsVerification("+442223334444", null, "123-456");
verify(twilioSender).deliverSmsVerification("+442223334444", null, "123-456");
}
public void testNexmoVoxFallback() throws IOException, TwilioRestException {