X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/e2b7bda65ba728a0a747bb0bac6fbe1e56fd2de8..997b3c6a2a1f2e9a50fe579ac726677ea0d57d0c:/src/main/java/org/asamk/signal/util/ErrorUtils.java diff --git a/src/main/java/org/asamk/signal/util/ErrorUtils.java b/src/main/java/org/asamk/signal/util/ErrorUtils.java index 44d98cd2..8e824d34 100644 --- a/src/main/java/org/asamk/signal/util/ErrorUtils.java +++ b/src/main/java/org/asamk/signal/util/ErrorUtils.java @@ -1,69 +1,103 @@ package org.asamk.signal.util; -import org.asamk.signal.GroupIdFormatException; -import org.asamk.signal.GroupNotFoundException; -import org.asamk.signal.NotAGroupMemberException; -import org.freedesktop.dbus.exceptions.DBusExecutionException; -import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; -import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; -import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException; -import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; -import org.whispersystems.signalservice.api.util.InvalidNumberException; +import org.asamk.signal.commands.exceptions.CommandException; +import org.asamk.signal.commands.exceptions.IOErrorException; +import org.asamk.signal.manager.api.RecipientIdentifier; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.whispersystems.signalservice.api.messages.SendMessageResult; +import org.whispersystems.signalservice.api.push.exceptions.ProofRequiredException; -import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.asamk.signal.util.Util.getLegacyIdentifier; public class ErrorUtils { - private ErrorUtils() { - } + private final static Logger logger = LoggerFactory.getLogger(ErrorUtils.class); - public static void handleAssertionError(AssertionError e) { - System.err.println("Failed to send/receive message (Assertion): " + e.getMessage()); - e.printStackTrace(); - System.err.println("If you use an Oracle JRE please check if you have unlimited strength crypto enabled, see README"); + private ErrorUtils() { } - public static void handleEncapsulatedExceptions(EncapsulatedExceptions e) { - System.err.println("Failed to send (some) messages:"); - for (NetworkFailureException n : e.getNetworkExceptions()) { - System.err.println("Network failure for \"" + n.getE164number() + "\": " + n.getMessage()); - } - for (UnregisteredUserException n : e.getUnregisteredUserExceptions()) { - System.err.println("Unregistered user \"" + n.getE164Number() + "\": " + n.getMessage()); - } - for (UntrustedIdentityException n : e.getUntrustedIdentityExceptions()) { - System.err.println("Untrusted Identity for \"" + n.getIdentifier() + "\": " + n.getMessage()); - } + public static void handleSendMessageResults( + Map> mapResults + ) throws CommandException { + List errors = getErrorMessagesFromSendMessageResults(mapResults); + handleSendMessageResultErrors(errors); } - public static void handleIOException(IOException e) { - System.err.println("Failed to send message: " + e.getMessage()); + public static void handleSendMessageResults( + Collection results + ) throws CommandException { + var errors = getErrorMessagesFromSendMessageResults(results); + handleSendMessageResultErrors(errors); } - public static void handleGroupNotFoundException(GroupNotFoundException e) { - System.err.println("Failed to send to group: " + e.getMessage()); - System.err.println("Aborting sending."); + public static List getErrorMessagesFromSendMessageResults(final Map> mapResults) { + return mapResults.values() + .stream() + .flatMap(results -> getErrorMessagesFromSendMessageResults(results).stream()) + .collect(Collectors.toList()); } - public static void handleNotAGroupMemberException(NotAGroupMemberException e) { - System.err.println("Failed to send to group: " + e.getMessage()); - System.err.println("Update the group on another device to readd the user to this group."); - System.err.println("Aborting sending."); - } + public static List getErrorMessagesFromSendMessageResults(Collection results) { + var errors = new ArrayList(); + for (var result : results) { + var error = getErrorMessageFromSendMessageResult(result); + if (error != null) { + errors.add(error); + } + } - public static void handleDBusExecutionException(DBusExecutionException e) { - System.err.println("Cannot connect to dbus: " + e.getMessage()); - System.err.println("Aborting."); + return errors; } - public static void handleGroupIdFormatException(GroupIdFormatException e) { - System.err.println(e.getMessage()); - System.err.println("Aborting sending."); + public static String getErrorMessageFromSendMessageResult(SendMessageResult result) { + var identifier = getLegacyIdentifier(result.getAddress()); + if (result.getProofRequiredFailure() != null) { + final var failure = result.getProofRequiredFailure(); + return String.format( + "CAPTCHA proof required for sending to \"%s\", available options \"%s\" with challenge token \"%s\", or wait \"%d\" seconds.\n" + + ( + failure.getOptions().contains(ProofRequiredException.Option.RECAPTCHA) + ? + "To get the captcha token, go to https://signalcaptchas.org/registration/generate.html\n" + + "Check the developer tools (F12) console for a failed redirect to signalcaptcha://\n" + + "Everything after signalcaptcha:// is the captcha token.\n" + + "Use the following command to submit the captcha token:\n" + + "signal-cli submitRateLimitChallenge --challenge CHALLENGE_TOKEN --captcha CAPTCHA_TOKEN" + : "" + ), + identifier, + failure.getOptions() + .stream() + .map(ProofRequiredException.Option::toString) + .collect(Collectors.joining(", ")), + failure.getToken(), + failure.getRetryAfterSeconds()); + } else if (result.isNetworkFailure()) { + return String.format("Network failure for \"%s\"", identifier); + } else if (result.isUnregisteredFailure()) { + return String.format("Unregistered user \"%s\"", identifier); + } else if (result.getIdentityFailure() != null) { + return String.format("Untrusted Identity for \"%s\"", identifier); + } + return null; } - public static void handleInvalidNumberException(InvalidNumberException e) { - System.err.println("Failed to parse recipient: " + e.getMessage()); - System.err.println(e.getMessage()); - System.err.println("Aborting sending."); + private static void handleSendMessageResultErrors(List errors) throws CommandException { + if (errors.size() == 0) { + return; + } + var message = new StringBuilder(); + message.append("Failed to send (some) messages:\n"); + for (var error : errors) { + message.append(error).append("\n"); + } + throw new IOErrorException(message.toString(), null); } }