]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/api/RecipientIdentifier.java
Update libsignal-service
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / api / RecipientIdentifier.java
index 823881c79c98900c5ff98e0b492bad383a06383c..b1a3ad61d04c98f90ecf349268926320657b4805 100644 (file)
@@ -1,8 +1,8 @@
 package org.asamk.signal.manager.api;
 
+import org.asamk.signal.manager.util.PhoneNumberFormatter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
 import org.whispersystems.signalservice.api.util.UuidUtil;
 
 import java.util.UUID;
@@ -24,24 +24,28 @@ public sealed interface RecipientIdentifier {
     sealed interface Single extends RecipientIdentifier {
 
         static Single fromString(String identifier, String localNumber) throws InvalidNumberException {
-            try {
-                if (UuidUtil.isUuid(identifier)) {
-                    return new Uuid(UUID.fromString(identifier));
-                }
+            if (UuidUtil.isUuid(identifier)) {
+                return new Uuid(UUID.fromString(identifier));
+            }
 
-                if (identifier.startsWith("u:")) {
-                    return new Username(identifier.substring(2));
+            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));
+            }
 
-                final var normalizedNumber = PhoneNumberFormatter.formatNumber(identifier, localNumber);
-                if (!normalizedNumber.equals(identifier)) {
-                    final Logger logger = LoggerFactory.getLogger(RecipientIdentifier.class);
-                    logger.debug("Normalized number {} to {}.", identifier, normalizedNumber);
-                }
-                return new Number(normalizedNumber);
-            } catch (org.whispersystems.signalservice.api.util.InvalidNumberException e) {
-                throw new InvalidNumberException(e.getMessage(), e);
+            if (identifier.startsWith("u:")) {
+                return new Username(identifier.substring(2));
             }
+
+            final var normalizedNumber = PhoneNumberFormatter.formatNumber(identifier, localNumber);
+            if (!normalizedNumber.equals(identifier)) {
+                final Logger logger = LoggerFactory.getLogger(RecipientIdentifier.class);
+                logger.debug("Normalized number {} to {}.", identifier, normalizedNumber);
+            }
+            return new Number(normalizedNumber);
         }
 
         static Single fromAddress(RecipientAddress address) {
@@ -49,6 +53,8 @@ public sealed interface RecipientIdentifier {
                 return new Number(address.number().get());
             } else if (address.aci().isPresent()) {
                 return new Uuid(UUID.fromString(address.aci().get()));
+            } else if (address.pni().isPresent()) {
+                return new Pni(UUID.fromString(address.pni().get().substring(4)));
             } else if (address.username().isPresent()) {
                 return new Username(address.username().get());
             }
@@ -71,6 +77,19 @@ public sealed interface RecipientIdentifier {
         }
     }
 
+    record Pni(UUID pni) implements Single {
+
+        @Override
+        public String getIdentifier() {
+            return "PNI:" + pni.toString();
+        }
+
+        @Override
+        public RecipientAddress toPartialRecipientAddress() {
+            return new RecipientAddress(null, getIdentifier(), null, null);
+        }
+    }
+
     record Number(String number) implements Single {
 
         @Override