X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/ef2a013db35f6c5ac65546857df27b584e176307..3c40b11:/src/main/java/org/asamk/signal/App.java diff --git a/src/main/java/org/asamk/signal/App.java b/src/main/java/org/asamk/signal/App.java index 6b31e2bc..3d35ff8f 100644 --- a/src/main/java/org/asamk/signal/App.java +++ b/src/main/java/org/asamk/signal/App.java @@ -8,7 +8,6 @@ import net.sourceforge.argparse4j.inf.Namespace; import org.asamk.Signal; import org.asamk.signal.commands.Command; import org.asamk.signal.commands.Commands; -import org.asamk.signal.commands.DbusCommand; import org.asamk.signal.commands.ExtendedDbusCommand; import org.asamk.signal.commands.LocalCommand; import org.asamk.signal.commands.MultiLocalCommand; @@ -16,17 +15,21 @@ import org.asamk.signal.commands.ProvisioningCommand; import org.asamk.signal.commands.RegistrationCommand; import org.asamk.signal.commands.SignalCreator; import org.asamk.signal.commands.exceptions.CommandException; +import org.asamk.signal.commands.exceptions.IOErrorException; import org.asamk.signal.commands.exceptions.UnexpectedErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; +import org.asamk.signal.dbus.DbusManagerImpl; import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.NotRegisteredException; import org.asamk.signal.manager.ProvisioningManager; import org.asamk.signal.manager.RegistrationManager; import org.asamk.signal.manager.config.ServiceConfig; import org.asamk.signal.manager.config.ServiceEnvironment; +import org.asamk.signal.manager.storage.identities.TrustNewIdentity; import org.asamk.signal.util.IOUtils; import org.freedesktop.dbus.connections.impl.DBusConnection; import org.freedesktop.dbus.exceptions.DBusException; +import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; @@ -74,6 +77,11 @@ public class App { .type(Arguments.enumStringType(ServiceEnvironmentCli.class)) .setDefault(ServiceEnvironmentCli.LIVE); + parser.addArgument("--trust-new-identities") + .help("Choose when to trust new identities.") + .type(Arguments.enumStringType(TrustNewIdentityCli.class)) + .setDefault(TrustNewIdentityCli.ON_FIRST_USE); + var subparsers = parser.addSubparsers().title("subcommands").dest("command"); Commands.getCommandSubparserAttachers().forEach((key, value) -> { @@ -109,8 +117,8 @@ public class App { var username = ns.getString("username"); - final var useDbus = ns.getBoolean("dbus"); - final var useDbusSystem = ns.getBoolean("dbus-system"); + final var useDbus = Boolean.TRUE.equals(ns.getBoolean("dbus")); + final var useDbusSystem = Boolean.TRUE.equals(ns.getBoolean("dbus-system")); if (useDbus || useDbusSystem) { // If username is null, it will connect to the default object path initDbusClient(command, username, useDbusSystem, outputWriter); @@ -125,11 +133,6 @@ public class App { dataPath = getDefaultDataPath(); } - final var serviceEnvironmentCli = ns.get("service-environment"); - final var serviceEnvironment = serviceEnvironmentCli == ServiceEnvironmentCli.LIVE - ? ServiceEnvironment.LIVE - : ServiceEnvironment.SANDBOX; - if (!ServiceConfig.getCapabilities().isGv2()) { logger.warn("WARNING: Support for new group V2 is disabled," + " because the required native library dependency is missing: libzkgroup"); @@ -139,6 +142,16 @@ public class App { throw new UserErrorException("Missing required native library dependency: libsignal-client"); } + final var serviceEnvironmentCli = ns.get("service-environment"); + final var serviceEnvironment = serviceEnvironmentCli == ServiceEnvironmentCli.LIVE + ? ServiceEnvironment.LIVE + : ServiceEnvironment.SANDBOX; + + final var trustNewIdentityCli = ns.get("trust-new-identities"); + final var trustNewIdentity = trustNewIdentityCli == TrustNewIdentityCli.ON_FIRST_USE + ? TrustNewIdentity.ON_FIRST_USE + : trustNewIdentityCli == TrustNewIdentityCli.ALWAYS ? TrustNewIdentity.ALWAYS : TrustNewIdentity.NEVER; + if (command instanceof ProvisioningCommand) { if (username != null) { throw new UserErrorException("You cannot specify a username (phone number) when linking"); @@ -149,14 +162,15 @@ public class App { } if (username == null) { - var usernames = Manager.getAllLocalUsernames(dataPath); + var usernames = Manager.getAllLocalNumbers(dataPath); if (command instanceof MultiLocalCommand) { handleMultiLocalCommand((MultiLocalCommand) command, dataPath, serviceEnvironment, usernames, - outputWriter); + outputWriter, + trustNewIdentity); return; } @@ -181,7 +195,12 @@ public class App { throw new UserErrorException("Command only works via dbus"); } - handleLocalCommand((LocalCommand) command, username, dataPath, serviceEnvironment, outputWriter); + handleLocalCommand((LocalCommand) command, + username, + dataPath, + serviceEnvironment, + outputWriter, + trustNewIdentity); } private void handleProvisioningCommand( @@ -208,7 +227,7 @@ public class App { + e.getMessage() + " (" + e.getClass().getSimpleName() - + ")"); + + ")", e); } try (var m = manager) { command.handleCommand(ns, m); @@ -222,9 +241,10 @@ public class App { final String username, final File dataPath, final ServiceEnvironment serviceEnvironment, - final OutputWriter outputWriter + final OutputWriter outputWriter, + final TrustNewIdentity trustNewIdentity ) throws CommandException { - try (var m = loadManager(username, dataPath, serviceEnvironment)) { + try (var m = loadManager(username, dataPath, serviceEnvironment, trustNewIdentity)) { command.handleCommand(ns, m, outputWriter); } catch (IOException e) { logger.warn("Cleanup failed", e); @@ -236,12 +256,13 @@ public class App { final File dataPath, final ServiceEnvironment serviceEnvironment, final List usernames, - final OutputWriter outputWriter + final OutputWriter outputWriter, + final TrustNewIdentity trustNewIdentity ) throws CommandException { final var managers = new ArrayList(); for (String u : usernames) { try { - managers.add(loadManager(u, dataPath, serviceEnvironment)); + managers.add(loadManager(u, dataPath, serviceEnvironment, trustNewIdentity)); } catch (CommandException e) { logger.warn("Ignoring {}: {}", u, e.getMessage()); } @@ -269,28 +290,30 @@ public class App { } private Manager loadManager( - final String username, final File dataPath, final ServiceEnvironment serviceEnvironment + final String username, + final File dataPath, + final ServiceEnvironment serviceEnvironment, + final TrustNewIdentity trustNewIdentity ) throws CommandException { Manager manager; try { - manager = Manager.init(username, dataPath, serviceEnvironment, BaseConfig.USER_AGENT); + manager = Manager.init(username, dataPath, serviceEnvironment, BaseConfig.USER_AGENT, trustNewIdentity); } catch (NotRegisteredException e) { throw new UserErrorException("User " + username + " is not registered."); } catch (Throwable e) { - logger.debug("Loading state file failed", e); throw new UnexpectedErrorException("Error loading state file for user " + username + ": " + e.getMessage() + " (" + e.getClass().getSimpleName() - + ")"); + + ")", e); } try { manager.checkAccountState(); } catch (IOException e) { - throw new UnexpectedErrorException("Error while checking account " + username + ": " + e.getMessage()); + throw new IOErrorException("Error while checking account " + username + ": " + e.getMessage(), e); } return manager; @@ -315,7 +338,7 @@ public class App { } } catch (DBusException | IOException e) { logger.error("Dbus client failed", e); - throw new UnexpectedErrorException("Dbus client failed"); + throw new UnexpectedErrorException("Dbus client failed", e); } } @@ -324,8 +347,14 @@ public class App { ) throws CommandException { if (command instanceof ExtendedDbusCommand) { ((ExtendedDbusCommand) command).handleCommand(ns, ts, dBusConn, outputWriter); - } else if (command instanceof DbusCommand) { - ((DbusCommand) command).handleCommand(ns, ts, outputWriter); + } else if (command instanceof LocalCommand) { + try { + ((LocalCommand) command).handleCommand(ns, new DbusManagerImpl(ts, dBusConn), outputWriter); + } catch (UnsupportedOperationException e) { + throw new UserErrorException("Command is not yet implemented via dbus", e); + } catch (DBusExecutionException e) { + throw new UnexpectedErrorException(e.getMessage(), e); + } } else { throw new UserErrorException("Command is not yet implemented via dbus"); }