From 00a3e562dcda323d7226f1ea9df146f37bf01bb3 Mon Sep 17 00:00:00 2001 From: Ehren Kret Date: Fri, 20 Nov 2020 14:41:48 -0600 Subject: [PATCH] Force use of UCS-2 instead of GSM-7 for SMS to China (#297) --- .../textsecuregcm/sms/TwilioSmsSender.java | 21 +++++++++++++------ .../tests/sms/TwilioSmsSenderTest.java | 14 +++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java index 9d37c0e76..75c632091 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/sms/TwilioSmsSender.java @@ -22,6 +22,7 @@ import org.whispersystems.textsecuregcm.util.ExecutorUtils; import org.whispersystems.textsecuregcm.util.SystemMapper; import org.whispersystems.textsecuregcm.util.Util; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.net.URI; @@ -113,7 +114,7 @@ public class TwilioSmsSender { Map requestParameters = new HashMap<>(); requestParameters.put("To", destination); boolean usedSenderId = setOriginationRequestParameter(destination, requestParameters, enableSenderId); - requestParameters.put("Body", String.format(Locale.US, getBodyFormatString(clientType.orElse(null)), verificationCode)); + requestParameters.put("Body", String.format(Locale.US, getBodyFormatString(destination, clientType.orElse(null)), verificationCode)); HttpRequest request = HttpRequest.newBuilder() .uri(smsUri) @@ -129,15 +130,23 @@ public class TwilioSmsSender { .thenCompose(twilioResponse -> retrySendSmsVerificationIfApplicable(usedSenderId, twilioResponse, destination, clientType, verificationCode)); } - private String getBodyFormatString(@Nullable String clientType) { + private String getBodyFormatString(@Nonnull String destination, @Nullable String clientType) { + final String result; if ("ios".equals(clientType)) { - return iosVerificationText; + result = iosVerificationText; } else if ("android-ng".equals(clientType)) { - return androidNgVerificationText; + result = androidNgVerificationText; } else if ("android-2020-01".equals(clientType)) { - return android202001VerificationText; + result = android202001VerificationText; } else { - return genericVerificationText; + result = genericVerificationText; + } + if (destination.startsWith("+86")) { // is China + return result + "\u2008"; + // Twilio recommends adding this character to the end of strings delivered to China because some carriers in + // China are blocking GSM-7 encoding and this will force Twilio to send using UCS-2 instead. + } else { + return result; } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/sms/TwilioSmsSenderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/sms/TwilioSmsSenderTest.java index 258f7859a..d551e436b 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/sms/TwilioSmsSenderTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/sms/TwilioSmsSenderTest.java @@ -338,4 +338,18 @@ public class TwilioSmsSenderTest { .withHeader("Content-Type", equalTo("application/x-www-form-urlencoded")) .withRequestBody(equalTo("MessagingServiceSid=test_messaging_services_id&To=%2B14153333333&Body=%3C%23%3E+Verify+on+AndroidNg%3A+123-456%0A%0Acharacters"))); } + + @Test + public void testSendSmsChina() { + setupSuccessStubForSms(); + TwilioConfiguration configuration = createTwilioConfiguration(); + TwilioSmsSender sender = new TwilioSmsSender("http://localhost:" + wireMockRule.port(), configuration); + boolean success = sender.deliverSmsVerification("+861065529988", Optional.of("android-ng"), "123-456").join(); + + assertThat(success).isTrue(); + + verify(1, postRequestedFor(urlEqualTo("/2010-04-01/Accounts/" + ACCOUNT_ID + "/Messages.json")) + .withHeader("Content-Type", equalTo("application/x-www-form-urlencoded")) + .withRequestBody(equalTo("MessagingServiceSid=test_messaging_services_id&To=%2B861065529988&Body=%3C%23%3E+Verify+on+AndroidNg%3A+123-456%0A%0Acharacters%E2%80%88"))); + } }