Parse locale strings when sending voice verification codes.

This commit is contained in:
Jon Chambers
2021-03-10 17:52:40 -05:00
committed by Jon Chambers
parent 3ea535a412
commit ca2f7d2eed
5 changed files with 79 additions and 11 deletions

View File

@@ -16,6 +16,7 @@ import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
@@ -184,7 +185,7 @@ public class AccountController {
@PathParam("number") String number,
@HeaderParam("X-Forwarded-For") String forwardedFor,
@HeaderParam("User-Agent") List<String> userAgent,
@HeaderParam("Accept-Language") Optional<String> locale,
@HeaderParam("Accept-Language") Optional<String> acceptLanguage,
@QueryParam("client") Optional<String> client,
@QueryParam("captcha") Optional<String> captcha,
@QueryParam("challenge") Optional<String> pushChallenge)
@@ -247,7 +248,11 @@ public class AccountController {
} else if (transport.equals("sms")) {
smsSender.deliverSmsVerification(number, client, verificationCode.getVerificationCodeDisplay());
} else if (transport.equals("voice")) {
smsSender.deliverVoxVerification(number, verificationCode.getVerificationCode(), locale);
final Optional<Locale> maybeLocale = acceptLanguage.map(Locale.LanguageRange::parse)
.flatMap(ranges -> ranges.stream().findFirst())
.map(range -> Locale.forLanguageTag(range.getRange()));
smsSender.deliverVoxVerification(number, verificationCode.getVerificationCode(), maybeLocale);
}
metricRegistry.meter(name(AccountController.class, "create", Util.getCountryCode(number))).mark();

View File

@@ -5,6 +5,7 @@
package org.whispersystems.textsecuregcm.sms;
import java.util.Locale;
import java.util.Optional;
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@@ -24,7 +25,7 @@ public class SmsSender {
twilioSender.deliverSmsVerification(destination, clientType, verificationCode);
}
public void deliverVoxVerification(String destination, String verificationCode, Optional<String> locale) {
twilioSender.deliverVoxVerification(destination, verificationCode, locale);
public void deliverVoxVerification(String destination, String verificationCode, Optional<Locale> maybeLocale) {
twilioSender.deliverVoxVerification(destination, verificationCode, maybeLocale);
}
}

View File

@@ -30,6 +30,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.textsecuregcm.configuration.TwilioConfiguration;
@@ -143,11 +144,19 @@ public class TwilioSmsSender {
}
}
public CompletableFuture<Boolean> deliverVoxVerification(String destination, String verificationCode, Optional<String> locale) {
public CompletableFuture<Boolean> deliverVoxVerification(String destination, String verificationCode, Optional<Locale> maybeLocale) {
String url = "https://" + localDomain + "/v1/voice/description/" + verificationCode;
if (locale.isPresent()) {
url += "?l=" + locale.get();
if (maybeLocale.isPresent()) {
final String localeString = maybeLocale.map(locale -> {
if (StringUtils.isNotBlank(locale.getCountry())) {
return locale.getLanguage().toLowerCase() + "-" + locale.getCountry().toUpperCase();
} else {
return locale.getLanguage().toLowerCase();
}
}).get();
url += "?l=" + localeString;
}
Map<String, String> requestParameters = new HashMap<>();