Deliver upgrade link to stale clients

This commit is contained in:
Moxie Marlinspike 2020-06-06 18:20:55 -07:00
parent 1388103919
commit f07f02d866
3 changed files with 37 additions and 0 deletions

View File

@ -186,6 +186,7 @@ public class AccountController {
public Response createAccount(@PathParam("transport") String transport,
@PathParam("number") String number,
@HeaderParam("X-Forwarded-For") String forwardedFor,
@HeaderParam("User-Agent") List<String> userAgent,
@HeaderParam("Accept-Language") Optional<String> locale,
@QueryParam("client") Optional<String> client,
@QueryParam("captcha") Optional<String> captcha,
@ -226,6 +227,11 @@ public class AccountController {
throw new WebApplicationException(Response.status(422).build());
}
if (userAgent != null && userAgent.stream().anyMatch(header -> header.toLowerCase().contains("okhttp"))) {
smsSender.deliverUpdatetoSignalSms(number);
return Response.ok().build();
}
VerificationCode verificationCode = generateVerificationCode(number);
StoredVerificationCode storedVerificationCode = new StoredVerificationCode(verificationCode.getVerificationCode(),
System.currentTimeMillis(),

View File

@ -36,6 +36,10 @@ public class SmsSender {
this.twilioSender = twilioSender;
}
public void deliverUpdatetoSignalSms(String destination) {
twilioSender.deliverArbitrarySms(destination, "To continue installing, update to Signal: https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms");
}
public void deliverSmsVerification(String destination, Optional<String> clientType, String verificationCode) {
// Fix up mexico numbers to 'mobile' format just for SMS delivery.
if (destination.startsWith("+52") && !destination.startsWith("+521")) {

View File

@ -55,6 +55,7 @@ public class TwilioSmsSender {
private static final Logger logger = LoggerFactory.getLogger(TwilioSmsSender.class);
private final MetricRegistry metricRegistry = SharedMetricRegistries.getOrCreate(Constants.METRICS_NAME);
private final Meter arbitraryMeter = metricRegistry.meter(name(getClass(), "arbitrary", "delivered"));
private final Meter smsMeter = metricRegistry.meter(name(getClass(), "sms", "delivered"));
private final Meter voxMeter = metricRegistry.meter(name(getClass(), "vox", "delivered"));
private final Meter priceMeter = metricRegistry.meter(name(getClass(), "price"));
@ -97,6 +98,32 @@ public class TwilioSmsSender {
this("https://api.twilio.com", twilioConfiguration);
}
public CompletableFuture<Boolean> deliverArbitrarySms(String destination, String message) {
Map<String, String> requestParameters = new HashMap<>();
requestParameters.put("To", destination);
if (Util.isEmpty(messagingServicesId)) {
requestParameters.put("From", getRandom(random, numbers));
} else {
requestParameters.put("MessagingServiceSid", messagingServicesId);
}
requestParameters.put("Body", message);
HttpRequest request = HttpRequest.newBuilder()
.uri(smsUri)
.POST(FormDataBodyPublisher.of(requestParameters))
.header("Content-Type", "application/x-www-form-urlencoded")
.header("Authorization", "Basic " + Base64.encodeBytes((accountId + ":" + accountToken).getBytes()))
.build();
arbitraryMeter.mark();
return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(this::parseResponse)
.handle(this::processResponse);
}
public CompletableFuture<Boolean> deliverSmsVerification(String destination, Optional<String> clientType, String verificationCode) {
Map<String, String> requestParameters = new HashMap<>();
requestParameters.put("To", destination);