X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/a7db3a5610db2cf718030fbe06e5ebb8531459c8..c1775913b9c54c84b45154aa841a0ba475c7c9fd:/src/main/java/org/asamk/signal/dbus/DbusCommandHandler.java diff --git a/src/main/java/org/asamk/signal/dbus/DbusCommandHandler.java b/src/main/java/org/asamk/signal/dbus/DbusCommandHandler.java index 1ab7cb22..5e272895 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusCommandHandler.java +++ b/src/main/java/org/asamk/signal/dbus/DbusCommandHandler.java @@ -13,16 +13,43 @@ import org.asamk.signal.commands.exceptions.CommandException; import org.asamk.signal.commands.exceptions.UnexpectedErrorException; import org.asamk.signal.commands.exceptions.UserErrorException; import org.freedesktop.dbus.connections.impl.DBusConnection; +import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder; +import org.freedesktop.dbus.errors.ServiceUnknown; import org.freedesktop.dbus.errors.UnknownMethod; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; +import java.io.IOException; + public class DbusCommandHandler { + public static void initDbusClient( + final Command command, + final String account, + final boolean systemBus, + final String busname, + final CommandHandler commandHandler + ) throws CommandException { + try { + final var busType = systemBus ? DBusConnection.DBusBusType.SYSTEM : DBusConnection.DBusBusType.SESSION; + try (var dBusConn = DBusConnectionBuilder.forType(busType).build()) { + handleCommand(command, account, dBusConn, busname, commandHandler); + } + } catch (ServiceUnknown e) { + throw new UserErrorException("signal-cli DBus daemon not running on " + + (systemBus ? "system" : "session") + + " bus: " + + e.getMessage(), e); + } catch (DBusExecutionException | DBusException | IOException e) { + throw new UnexpectedErrorException("Dbus client failed: " + e.getMessage(), e); + } + } + public static void handleCommand( final Command command, final String account, final DBusConnection dBusConn, + final String busname, final CommandHandler commandHandler ) throws CommandException, DBusException { try { @@ -31,27 +58,27 @@ public class DbusCommandHandler { throw new UserErrorException("You cannot specify a account (phone number) when linking"); } - handleProvisioningCommand(c, dBusConn, commandHandler); + handleProvisioningCommand(c, dBusConn, busname, commandHandler); return; } if (account == null && command instanceof MultiLocalCommand c) { - handleMultiLocalCommand(c, dBusConn, commandHandler); + handleMultiLocalCommand(c, dBusConn, busname, commandHandler); return; } if (account != null && command instanceof RegistrationCommand c) { - handleRegistrationCommand(c, account, dBusConn, commandHandler); + handleRegistrationCommand(c, account, dBusConn, busname, commandHandler); return; } if (!(command instanceof LocalCommand localCommand)) { throw new UserErrorException("Command only works in multi-account mode"); } - var accountObjectPath = account == null ? tryGetSingleAccountObjectPath(dBusConn) : null; + var accountObjectPath = account == null ? tryGetSingleAccountObjectPath(dBusConn, busname) : null; if (accountObjectPath == null) { accountObjectPath = DbusConfig.getObjectPath(account); } - handleLocalCommand(localCommand, accountObjectPath, dBusConn, commandHandler); + handleLocalCommand(localCommand, accountObjectPath, dBusConn, busname, commandHandler); } catch (UnsupportedOperationException e) { throw new UserErrorException("Command is not yet implemented via dbus", e); } catch (DBusExecutionException e) { @@ -59,20 +86,20 @@ public class DbusCommandHandler { } } - private static String tryGetSingleAccountObjectPath(final DBusConnection dBusConn) throws DBusException, CommandException { - var control = dBusConn.getRemoteObject(DbusConfig.getBusname(), - DbusConfig.getObjectPath(), - SignalControl.class); + private static String tryGetSingleAccountObjectPath( + final DBusConnection dBusConn, final String busname + ) throws DBusException, CommandException { + var control = dBusConn.getRemoteObject(busname, DbusConfig.getObjectPath(), SignalControl.class); try { final var accounts = control.listAccounts(); - if (accounts.size() == 0) { + if (accounts.isEmpty()) { throw new UserErrorException("No local users found, you first need to register or link an account"); } else if (accounts.size() > 1) { throw new UserErrorException( "Multiple users found, you need to specify an account (phone number) with -a"); } - return accounts.get(0).getPath(); + return accounts.getFirst().getPath(); } catch (UnknownMethod e) { // dbus daemon not running in multi-account mode return null; @@ -80,12 +107,13 @@ public class DbusCommandHandler { } private static void handleMultiLocalCommand( - final MultiLocalCommand c, final DBusConnection dBusConn, final CommandHandler commandHandler + final MultiLocalCommand c, + final DBusConnection dBusConn, + final String busname, + final CommandHandler commandHandler ) throws CommandException, DBusException { - final var signalControl = dBusConn.getRemoteObject(DbusConfig.getBusname(), - DbusConfig.getObjectPath(), - SignalControl.class); - try (final var multiAccountManager = new DbusMultiAccountManagerImpl(signalControl, dBusConn)) { + final var signalControl = dBusConn.getRemoteObject(busname, DbusConfig.getObjectPath(), SignalControl.class); + try (final var multiAccountManager = new DbusMultiAccountManagerImpl(signalControl, dBusConn, busname)) { commandHandler.handleMultiLocalCommand(c, multiAccountManager); } } @@ -94,10 +122,11 @@ public class DbusCommandHandler { final LocalCommand c, String accountObjectPath, final DBusConnection dBusConn, + final String busname, final CommandHandler commandHandler ) throws CommandException, DBusException { - var signal = dBusConn.getRemoteObject(DbusConfig.getBusname(), accountObjectPath, Signal.class); - try (final var manager = new DbusManagerImpl(signal, dBusConn)) { + var signal = dBusConn.getRemoteObject(busname, accountObjectPath, Signal.class); + try (final var manager = new DbusManagerImpl(signal, dBusConn, busname)) { commandHandler.handleLocalCommand(c, manager); } } @@ -106,24 +135,24 @@ public class DbusCommandHandler { final RegistrationCommand c, String account, final DBusConnection dBusConn, + final String busname, final CommandHandler commandHandler ) throws CommandException, DBusException { - final var signalControl = dBusConn.getRemoteObject(DbusConfig.getBusname(), - DbusConfig.getObjectPath(), - SignalControl.class); + final var signalControl = dBusConn.getRemoteObject(busname, DbusConfig.getObjectPath(), SignalControl.class); try (final var registrationManager = new DbusRegistrationManagerImpl(account, signalControl, dBusConn)) { commandHandler.handleRegistrationCommand(c, registrationManager); } } private static void handleProvisioningCommand( - final ProvisioningCommand c, final DBusConnection dBusConn, final CommandHandler commandHandler + final ProvisioningCommand c, + final DBusConnection dBusConn, + final String busname, + final CommandHandler commandHandler ) throws CommandException, DBusException { - final var signalControl = dBusConn.getRemoteObject(DbusConfig.getBusname(), - DbusConfig.getObjectPath(), - SignalControl.class); + final var signalControl = dBusConn.getRemoteObject(busname, DbusConfig.getObjectPath(), SignalControl.class); final var provisioningManager = new DbusProvisioningManagerImpl(signalControl, dBusConn); commandHandler.handleProvisioningCommand(c, provisioningManager); }