import org.asamk.signal.commands.ExtendedDbusCommand;
import org.asamk.signal.commands.LocalCommand;
import org.asamk.signal.commands.ProvisioningCommand;
+import org.asamk.signal.commands.RegistrationCommand;
import org.asamk.signal.dbus.DbusSignalImpl;
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.ServiceConfig;
import org.asamk.signal.util.IOUtils;
import org.asamk.signal.util.SecurityProvider;
import org.freedesktop.dbus.exceptions.DBusException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration;
}
public static int init(Namespace ns) {
+ Command command = getCommand(ns);
+ if (command == null) {
+ logger.error("Command not implemented!");
+ return 3;
+ }
+
if (ns.getBoolean("dbus") || ns.getBoolean("dbus_system")) {
- return initDbusClient(ns, ns.getBoolean("dbus_system"));
+ return initDbusClient(command, ns, ns.getBoolean("dbus_system"));
}
final String username = ns.getString("username");
if (username == null) {
ProvisioningManager pm = new ProvisioningManager(dataPath, serviceConfiguration, BaseConfig.USER_AGENT);
- return handleCommands(ns, pm);
+ return handleCommand(command, ns, pm);
+ }
+
+ if (command instanceof RegistrationCommand) {
+ final RegistrationManager manager;
+ try {
+ manager = RegistrationManager.init(username, dataPath, serviceConfiguration, BaseConfig.USER_AGENT);
+ } catch (Throwable e) {
+ logger.error("Error loading or creating state file: {}", e.getMessage());
+ return 2;
+ }
+ try (RegistrationManager m = manager) {
+ return handleCommand(command, ns, m);
+ } catch (Exception e) {
+ logger.error("Cleanup failed", e);
+ return 3;
+ }
}
Manager manager;
try {
manager = Manager.init(username, dataPath, serviceConfiguration, BaseConfig.USER_AGENT);
+ } catch (NotRegisteredException e) {
+ System.err.println("User is not registered.");
+ return 1;
} catch (Throwable e) {
logger.error("Error loading state file: {}", e.getMessage());
return 2;
try (Manager m = manager) {
try {
m.checkAccountState();
- } catch (AuthorizationFailedException e) {
- if (!"register".equals(ns.getString("command"))) {
- // Register command should still be possible, if current authorization fails
- System.err.println("Authorization failed, was the number registered elsewhere?");
- return 2;
- }
} catch (IOException e) {
logger.error("Error while checking account: {}", e.getMessage());
return 2;
}
- return handleCommands(ns, m);
+ return handleCommand(command, ns, m);
} catch (IOException e) {
logger.error("Cleanup failed", e);
return 3;
}
}
- private static int initDbusClient(final Namespace ns, final boolean systemBus) {
+ private static int initDbusClient(final Command command, final Namespace ns, final boolean systemBus) {
try {
DBusConnection.DBusBusType busType;
if (systemBus) {
DbusConfig.SIGNAL_OBJECTPATH,
Signal.class);
- return handleCommands(ns, ts, dBusConn);
+ return handleCommand(command, ns, ts, dBusConn);
}
} catch (DBusException | IOException e) {
logger.error("Dbus client failed", e);
}
}
- private static int handleCommands(Namespace ns, Signal ts, DBusConnection dBusConn) {
+ private static Command getCommand(Namespace ns) {
String commandKey = ns.getString("command");
final Map<String, Command> commands = Commands.getCommands();
- if (commands.containsKey(commandKey)) {
- Command command = commands.get(commandKey);
+ if (!commands.containsKey(commandKey)) {
+ return null;
+ }
+ return commands.get(commandKey);
+ }
- if (command instanceof ExtendedDbusCommand) {
- return ((ExtendedDbusCommand) command).handleCommand(ns, ts, dBusConn);
- } else if (command instanceof DbusCommand) {
- return ((DbusCommand) command).handleCommand(ns, ts);
- } else {
- System.err.println(commandKey + " is not yet implemented via dbus");
- return 1;
- }
+ private static int handleCommand(Command command, Namespace ns, Signal ts, DBusConnection dBusConn) {
+ if (command instanceof ExtendedDbusCommand) {
+ return ((ExtendedDbusCommand) command).handleCommand(ns, ts, dBusConn);
+ } else if (command instanceof DbusCommand) {
+ return ((DbusCommand) command).handleCommand(ns, ts);
+ } else {
+ System.err.println("Command is not yet implemented via dbus");
+ return 1;
}
- return 0;
}
- private static int handleCommands(Namespace ns, ProvisioningManager pm) {
- String commandKey = ns.getString("command");
- final Map<String, Command> commands = Commands.getCommands();
- if (commands.containsKey(commandKey)) {
- Command command = commands.get(commandKey);
+ private static int handleCommand(Command command, Namespace ns, ProvisioningManager pm) {
+ if (command instanceof ProvisioningCommand) {
+ return ((ProvisioningCommand) command).handleCommand(ns, pm);
+ } else {
+ System.err.println("Command only works with a username");
+ return 1;
+ }
+ }
- if (command instanceof ProvisioningCommand) {
- return ((ProvisioningCommand) command).handleCommand(ns, pm);
- } else {
- System.err.println(commandKey + " only works with a username");
- return 1;
- }
+ private static int handleCommand(Command command, Namespace ns, RegistrationManager m) {
+ if (command instanceof RegistrationCommand) {
+ return ((RegistrationCommand) command).handleCommand(ns, m);
}
- return 0;
+ return 1;
}
- private static int handleCommands(Namespace ns, Manager m) {
- String commandKey = ns.getString("command");
- final Map<String, Command> commands = Commands.getCommands();
- if (commands.containsKey(commandKey)) {
- Command command = commands.get(commandKey);
-
- if (command instanceof LocalCommand) {
- return ((LocalCommand) command).handleCommand(ns, m);
- } else if (command instanceof DbusCommand) {
- return ((DbusCommand) command).handleCommand(ns, new DbusSignalImpl(m));
- } else if (command instanceof ExtendedDbusCommand) {
- System.err.println(commandKey + " only works via dbus");
- }
+ private static int handleCommand(Command command, Namespace ns, Manager m) {
+ if (command instanceof LocalCommand) {
+ return ((LocalCommand) command).handleCommand(ns, m);
+ } else if (command instanceof DbusCommand) {
+ return ((DbusCommand) command).handleCommand(ns, new DbusSignalImpl(m));
+ } else {
+ System.err.println("Command only works via dbus");
return 1;
}
- return 0;
}
/**
* @return the data directory to be used by signal-cli.
*/
private static File getDefaultDataPath() {
- File dataPath = new File(IOUtils.getDataHomeDir(), "/signal-cli");
+ File dataPath = new File(IOUtils.getDataHomeDir(), "signal-cli");
if (dataPath.exists()) {
return dataPath;
}
- File legacySettingsPath = new File(System.getProperty("user.home"), "/.config/signal");
+ File configPath = new File(System.getProperty("user.home"), ".config");
+
+ File legacySettingsPath = new File(configPath, "signal");
if (legacySettingsPath.exists()) {
return legacySettingsPath;
}
- legacySettingsPath = new File(System.getProperty("user.home"), "/.config/textsecure");
+ legacySettingsPath = new File(configPath, "textsecure");
if (legacySettingsPath.exists()) {
return legacySettingsPath;
}