]> nmode's Git Repositories - signal-cli/commitdiff
Exit if account check fails at startup
authorAsamK <asamk@gmx.de>
Tue, 8 Jul 2025 15:34:04 +0000 (17:34 +0200)
committerAsamK <asamk@gmx.de>
Tue, 8 Jul 2025 15:34:04 +0000 (17:34 +0200)
Fixes #1804

lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java
src/main/java/org/asamk/signal/App.java

index 4072a9df8fecd7f6461e39357278ae4c5bcf731e..cd0b5a215134b3f9ee0fc636859628dacc9283a0 100644 (file)
@@ -2,6 +2,7 @@ package org.asamk.signal.manager;
 
 import org.asamk.signal.manager.api.AccountCheckException;
 import org.asamk.signal.manager.api.NotRegisteredException;
+import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.ServiceEnvironment;
 import org.asamk.signal.manager.config.ServiceConfig;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
@@ -63,19 +64,28 @@ public class SignalAccountFiles {
         return accountsStore.getAllNumbers();
     }
 
-    public MultiAccountManager initMultiAccountManager() throws IOException {
-        final var managers = accountsStore.getAllAccounts().parallelStream().map(a -> {
+    public MultiAccountManager initMultiAccountManager() throws IOException, AccountCheckException {
+        final var managerPairs = accountsStore.getAllAccounts().parallelStream().map(a -> {
             try {
-                return initManager(a.number(), a.path());
-            } catch (NotRegisteredException | IOException | AccountCheckException e) {
+                return new Pair<Manager, Throwable>(initManager(a.number(), a.path()), null);
+            } catch (NotRegisteredException e) {
                 logger.warn("Ignoring {}: {} ({})", a.number(), e.getMessage(), e.getClass().getSimpleName());
                 return null;
-            } catch (Throwable e) {
+            } catch (AccountCheckException | IOException e) {
                 logger.error("Failed to load {}: {} ({})", a.number(), e.getMessage(), e.getClass().getSimpleName());
-                throw e;
+                return new Pair<Manager, Throwable>(null, e);
             }
         }).filter(Objects::nonNull).toList();
 
+        for (final var pair : managerPairs) {
+            if (pair.second() instanceof IOException e) {
+                throw e;
+            } else if (pair.second() instanceof AccountCheckException e) {
+                throw e;
+            }
+        }
+
+        final var managers = managerPairs.stream().map(Pair::first).toList();
         return new MultiAccountManagerImpl(managers, this);
     }
 
index e494d201016189cec989f6ef0372962fefc9f1b2..cf731ea9ea372fb36fdc8e5e55f2298bd9c5a7a3 100644 (file)
@@ -291,6 +291,8 @@ public class App {
             commandHandler.handleMultiLocalCommand(command, multiAccountManager);
         } catch (IOException e) {
             throw new IOErrorException("Failed to load local accounts file", e);
+        } catch (AccountCheckException e) {
+            throw new UnexpectedErrorException("Failed to load local accounts file", e);
         }
     }