]> nmode's Git Repositories - signal-cli/commitdiff
Add support for using PNI as recipient
authorAsamK <asamk@gmx.de>
Fri, 29 Nov 2024 20:10:37 +0000 (21:10 +0100)
committerAsamK <asamk@gmx.de>
Fri, 29 Nov 2024 20:10:46 +0000 (21:10 +0100)
lib/src/main/java/org/asamk/signal/manager/api/InvalidNumberException.java
lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java
lib/src/main/java/org/asamk/signal/manager/helper/RecipientHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientAddress.java

index ba71ef2e9ae30e3a774677159e7f7967a530e81c..8e6a806472268674de69705aa28517fc26ddcd16 100644 (file)
@@ -2,6 +2,10 @@ package org.asamk.signal.manager.api;
 
 public class InvalidNumberException extends Exception {
 
+    InvalidNumberException(String message) {
+        super(message);
+    }
+
     InvalidNumberException(String message, Throwable e) {
         super(message, e);
     }
index 794672a4b053368824d8a4b552a59b8df9a6a55a..53da2aade3e712fc3833fbcf9737e03376d379c5 100644 (file)
@@ -29,6 +29,14 @@ public sealed interface RecipientIdentifier {
                     return new Uuid(UUID.fromString(identifier));
                 }
 
+                if (identifier.startsWith("PNI:")) {
+                    final var pni = identifier.substring(4);
+                    if (!UuidUtil.isUuid(pni)) {
+                        throw new InvalidNumberException("Invalid PNI");
+                    }
+                    return new Pni(UUID.fromString(pni));
+                }
+
                 if (identifier.startsWith("u:")) {
                     return new Username(identifier.substring(2));
                 }
@@ -50,7 +58,7 @@ public sealed interface RecipientIdentifier {
             } else if (address.aci().isPresent()) {
                 return new Uuid(UUID.fromString(address.aci().get()));
             } else if (address.pni().isPresent()) {
-                return new Pni(address.pni().get());
+                return new Pni(UUID.fromString(address.pni().get().substring(4)));
             } else if (address.username().isPresent()) {
                 return new Username(address.username().get());
             }
@@ -73,16 +81,16 @@ public sealed interface RecipientIdentifier {
         }
     }
 
-    record Pni(String pni) implements Single {
+    record Pni(UUID pni) implements Single {
 
         @Override
         public String getIdentifier() {
-            return pni;
+            return "PNI:" + pni.toString();
         }
 
         @Override
         public RecipientAddress toPartialRecipientAddress() {
-            return new RecipientAddress(null, pni, null, null);
+            return new RecipientAddress(null, getIdentifier(), null, null);
         }
     }
 
index 5da66b7e40fc554f78294bdd648a0768d6a75953..125fa0d83565eafaabc5e2800fc2344a4f0bdb2e 100644 (file)
@@ -79,7 +79,7 @@ public class RecipientHelper {
         if (recipient instanceof RecipientIdentifier.Uuid uuidRecipient) {
             return account.getRecipientResolver().resolveRecipient(ACI.from(uuidRecipient.uuid()));
         } else if (recipient instanceof RecipientIdentifier.Pni pniRecipient) {
-            return account.getRecipientResolver().resolveRecipient(PNI.parseOrThrow(pniRecipient.pni()));
+            return account.getRecipientResolver().resolveRecipient(PNI.from(pniRecipient.pni()));
         } else if (recipient instanceof RecipientIdentifier.Number numberRecipient) {
             final var number = numberRecipient.number();
             return account.getRecipientStore().resolveRecipientByNumber(number, () -> {
index 2f2ba3dbf6b00464b299c5df1af91d77c09ec0a1..dcdead7355314aa16789fef9bc69e3449bced580 100644 (file)
@@ -888,7 +888,7 @@ public class ManagerImpl implements Manager {
                         .deleteEntryForRecipientNonGroup(targetSentTimestamp, ACI.from(u.uuid()));
             } else if (recipient instanceof RecipientIdentifier.Pni pni) {
                 account.getMessageSendLogStore()
-                        .deleteEntryForRecipientNonGroup(targetSentTimestamp, PNI.parseOrThrow(pni.pni()));
+                        .deleteEntryForRecipientNonGroup(targetSentTimestamp, PNI.from(pni.pni()));
             } else if (recipient instanceof RecipientIdentifier.Single r) {
                 try {
                     final var recipientId = context.getRecipientHelper().resolveRecipient(r);
index b80f81da57e5f9b10bbbc478111b29050c5aab58..ba2b9f266c9001f3ce285c81cb95186ffab3bc07 100644 (file)
@@ -69,8 +69,8 @@ public record RecipientAddress(
     }
 
     public RecipientAddress(org.asamk.signal.manager.api.RecipientAddress address) {
-        this(address.aci().map(ACI::parseOrNull),
-                address.pni().map(PNI::parseOrNull),
+        this(address.aci().map(ACI::parseOrThrow),
+                address.pni().map(PNI::parseOrThrow),
                 address.number(),
                 address.username());
     }