]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/dbus/DbusCommandHandler.java
Implement dbus support for listIdentities
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusCommandHandler.java
index 1ab7cb2264af5c98c97c5c3b057b778a3d0a3ad5..5e272895256722800c0775552a84e1b3be88ebd4 100644 (file)
@@ -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);
     }