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 51d6be6e..9ce9e313 100644 --- a/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java +++ b/lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java @@ -96,21 +96,28 @@ 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(); - } + public String getAccountNumberByAci(final String aciStr) throws IOException { final var accounts = accountsStore.getAllAccounts(); final var account = accounts.stream() .filter(a -> aciStr.equals(a.uuid())) .findFirst() - .orElseThrow(NotRegisteredException::new); - if (account.number() == null) { + .orElse(null); + if (account == null || account.number() == null) { + return null; + } + return account.number(); + } + + public Manager initManagerByAci(String aciStr) throws IOException, NotRegisteredException, AccountCheckException { + final var phoneNumber = getAccountNumberByAci(aciStr); + if (phoneNumber == null) { throw new NotRegisteredException(); } - return this.initManager(account.number(), accountPath); + final var accountPath = accountsStore.getPathByNumber(phoneNumber); + if (accountPath == null) { + throw new NotRegisteredException(); + } + return this.initManager(phoneNumber, accountPath); } private Manager initManager( 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 c4d042e5..b943a007 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 @@ -114,11 +114,29 @@ public class MultiAccountManagerImpl implements MultiAccountManager { } 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) { + } catch (IOException | IllegalArgumentException | AccountCheckException e) { logger.warn("Failed to load new manager by number: {}", identifier, e); return null; } + // Before trying to initByAci (which would try to re-open an already-locked file), + // check if this UUID corresponds to an already-loaded manager + try { + final var phoneNumber = signalAccountFiles.getAccountNumberByAci(identifier); + if (phoneNumber != null) { + final var existingManager = managers.stream() + .filter(m -> m.getSelfNumber().equals(phoneNumber)) + .findFirst() + .orElse(null); + if (existingManager != null) { + logger.debug("Found already loaded manager for ACI: {}", identifier); + return existingManager; + } + } + } catch (IOException e) { + logger.warn("Failed to lookup ACI in accounts: {}", identifier, e); + } + // Try to load by ACI (useful for SSE endpoint with ?account=) try { final var newManager = signalAccountFiles.initManagerByAci(identifier); @@ -126,7 +144,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager { return newManager; } catch (NotRegisteredException e) { logger.debug("Manager not found by ACI: {}", identifier); - } catch (IOException | AccountCheckException e) { + } catch (IOException | IllegalArgumentException | AccountCheckException e) { logger.warn("Failed to load new manager by ACI: {}", identifier, e); } diff --git a/src/main/java/org/asamk/signal/util/Util.java b/src/main/java/org/asamk/signal/util/Util.java index 585c5690..76e41fa7 100644 --- a/src/main/java/org/asamk/signal/util/Util.java +++ b/src/main/java/org/asamk/signal/util/Util.java @@ -79,7 +79,7 @@ public class Util { for (var param : params) { final var paramParts = param.split("=", 2); var name = URLDecoder.decode(paramParts[0], StandardCharsets.UTF_8); - var value = paramParts.length == 1 ? null : URLDecoder.decode(paramParts[1], StandardCharsets.UTF_8); + var value = paramParts.length == 1 ? null : URLDecoder.decode(paramParts[1].replace("+", "%2B"), StandardCharsets.UTF_8); map.put(name, value); } return map;