]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/commands/DaemonCommand.java
Update dbus-java
[signal-cli] / src / main / java / org / asamk / signal / commands / DaemonCommand.java
index e224bf1c0a55ec4500fc1ecf581df5ade2aeca5e..e6fb1d812cecf02f34b499e1e813cf96ba55a16a 100644 (file)
@@ -10,6 +10,7 @@ import org.asamk.signal.ReceiveMessageHandler;
 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.DbusSignalControlImpl;
 import org.asamk.signal.dbus.DbusSignalImpl;
 import org.asamk.signal.json.JsonReceiveMessageHandler;
@@ -22,6 +23,7 @@ import org.asamk.signal.output.OutputWriter;
 import org.asamk.signal.output.PlainTextWriter;
 import org.asamk.signal.util.IOUtils;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
+import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,7 +37,6 @@ import java.nio.channels.ServerSocketChannel;
 import java.nio.channels.SocketChannel;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
-import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Consumer;
 
@@ -240,12 +241,13 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
     private void runSocket(final ServerSocketChannel serverChannel, Consumer<SocketChannel> socketHandler) {
         final var thread = new Thread(() -> {
             while (true) {
+                final var connectionId = threadNumber.getAndIncrement();
                 final SocketChannel channel;
                 final String clientString;
                 try {
                     channel = serverChannel.accept();
                     clientString = channel.getRemoteAddress() + " " + IOUtils.getUnixDomainPrincipal(channel);
-                    logger.info("Accepted new client: " + clientString);
+                    logger.info("Accepted new client connection {}: {}", connectionId, clientString);
                 } catch (IOException e) {
                     logger.error("Failed to accept new socket connection", e);
                     synchronized (this) {
@@ -256,12 +258,14 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
                 final var connectionThread = new Thread(() -> {
                     try (final var c = channel) {
                         socketHandler.accept(c);
-                        logger.info("Connection closed: " + clientString);
                     } catch (IOException e) {
                         logger.warn("Failed to close channel", e);
+                    } catch (Throwable e) {
+                        logger.warn("Connection handler failed, closing connection", e);
                     }
+                    logger.info("Connection {} closed: {}", connectionId, clientString);
                 });
-                connectionThread.setName("daemon-connection-" + threadNumber.getAndIncrement());
+                connectionThread.setName("daemon-connection-" + connectionId);
                 connectionThread.start();
             }
         });
@@ -280,7 +284,7 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
 
     private void runDbusSingleAccount(
             final Manager m, final boolean isDbusSystem, final boolean noReceiveOnStart
-    ) throws UnexpectedErrorException {
+    ) throws CommandException {
         runDbus(isDbusSystem, (conn, objectPath) -> {
             try {
                 exportDbusObject(conn, objectPath, m, noReceiveOnStart).join();
@@ -291,18 +295,16 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
 
     private void runDbusMultiAccount(
             final MultiAccountManager c, final boolean noReceiveOnStart, final boolean isDbusSystem
-    ) throws UnexpectedErrorException {
+    ) throws CommandException {
         runDbus(isDbusSystem, (connection, objectPath) -> {
             final var signalControl = new DbusSignalControlImpl(c, objectPath);
             connection.exportObject(signalControl);
 
             c.addOnManagerAddedHandler(m -> {
                 final var thread = exportMultiAccountManager(connection, m, noReceiveOnStart);
-                if (thread != null) {
-                    try {
-                        thread.join();
-                    } catch (InterruptedException ignored) {
-                    }
+                try {
+                    thread.join();
+                } catch (InterruptedException ignored) {
                 }
             });
             c.addOnManagerRemovedHandler(m -> {
@@ -319,7 +321,6 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
             final var initThreads = c.getManagers()
                     .stream()
                     .map(m -> exportMultiAccountManager(connection, m, noReceiveOnStart))
-                    .filter(Objects::nonNull)
                     .toList();
 
             for (var t : initThreads) {
@@ -333,7 +334,7 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
 
     private void runDbus(
             final boolean isDbusSystem, DbusRunner dbusRunner
-    ) throws UnexpectedErrorException {
+    ) throws CommandException {
         DBusConnection.DBusBusType busType;
         if (isDbusSystem) {
             busType = DBusConnection.DBusBusType.SYSTEM;
@@ -342,10 +343,12 @@ public class DaemonCommand implements MultiLocalCommand, LocalCommand {
         }
         DBusConnection conn;
         try {
-            conn = DBusConnection.getConnection(busType);
+            conn = DBusConnectionBuilder.forType(busType).build();
             dbusRunner.run(conn, DbusConfig.getObjectPath());
         } catch (DBusException e) {
             throw new UnexpectedErrorException("Dbus command failed: " + e.getMessage(), e);
+        } catch (UnsupportedOperationException e) {
+            throw new UserErrorException("Failed to connect to Dbus: " + e.getMessage(), e);
         }
 
         try {