diff --git a/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java b/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java index 82b73495..51d6be6e 100644 --- a/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java +++ b/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java @@ -5,6 +5,7 @@ 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.signal.core.models.ServiceId.ACI; import org.asamk.signal.manager.config.ServiceEnvironmentConfig; import org.asamk.signal.manager.internal.AccountFileUpdaterImpl; import org.asamk.signal.manager.internal.ManagerImpl; @@ -95,6 +96,23 @@ public class SignalAccountFiles { return this.initManager(number, accountPath); } + public Manager initManagerByAci(String aciStr) throws IOException, NotRegisteredException, AccountCheckException { + final var aci = ACI.parseOrThrow(aciStr); + final var accountPath = accountsStore.getPathByAci(aci); + if (accountPath == null) { + throw new NotRegisteredException(); + } + final var accounts = accountsStore.getAllAccounts(); + final var account = accounts.stream() + .filter(a -> aciStr.equals(a.uuid())) + .findFirst() + .orElseThrow(NotRegisteredException::new); + if (account.number() == null) { + throw new NotRegisteredException(); + } + return this.initManager(account.number(), accountPath); + } + private Manager initManager( String number, String accountPath diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java index 24ecae61..c4d042e5 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java @@ -95,23 +95,42 @@ public class MultiAccountManagerImpl implements MultiAccountManager { } @Override - public Manager getManager(final String number) { + public Manager getManager(final String identifier) { synchronized (managers) { - final var manager = managers.stream() - .filter(m -> m.getSelfNumber().equals(number)) + // Try to find already loaded manager by phone number + var manager = managers.stream() + .filter(m -> m.getSelfNumber().equals(identifier)) .findFirst() .orElse(null); if (manager != null) { return manager; } + + // Try to load by phone number first try { - final var newManager = signalAccountFiles.initManager(number); + final var newManager = signalAccountFiles.initManager(identifier); managers.add(newManager); return newManager; - } catch (IOException | NotRegisteredException | AccountCheckException e) { - logger.warn("Failed to load new manager", e); + } catch (NotRegisteredException e) { + // Not a valid phone number or not registered yet, try ACI + logger.debug("Manager not found by number, trying ACI: {}", identifier); + } catch (IOException | AccountCheckException e) { + logger.warn("Failed to load new manager by number: {}", identifier, e); return null; } + + // Try to load by ACI (useful for SSE endpoint with ?account=) + try { + final var newManager = signalAccountFiles.initManagerByAci(identifier); + managers.add(newManager); + return newManager; + } catch (NotRegisteredException e) { + logger.debug("Manager not found by ACI: {}", identifier); + } catch (IOException | AccountCheckException e) { + logger.warn("Failed to load new manager by ACI: {}", identifier, e); + } + + return null; } } diff --git a/src/main/java/org/asamk/signal/http/HttpServerHandler.java b/src/main/java/org/asamk/signal/http/HttpServerHandler.java index a6fc9f9e..1d2c48f8 100644 --- a/src/main/java/org/asamk/signal/http/HttpServerHandler.java +++ b/src/main/java/org/asamk/signal/http/HttpServerHandler.java @@ -262,7 +262,10 @@ public class HttpServerHandler implements AutoCloseable { } else { final var manager = c.getManager(account); if (manager == null) { - return null; + // Account not found by the given identifier (number or ACI/UUID) + // Log the available accounts to help debug + logger.warn("Account not found for identifier: {}", account); + return c.getManagers(); } return List.of(manager); }