Add support for using PNI as recipient

This commit is contained in:
AsamK 2024-11-29 21:10:37 +01:00
parent 68c9d84d19
commit 2c68b5a9e1
5 changed files with 20 additions and 8 deletions

View file

@ -2,6 +2,10 @@ package org.asamk.signal.manager.api;
public class InvalidNumberException extends Exception { public class InvalidNumberException extends Exception {
InvalidNumberException(String message) {
super(message);
}
InvalidNumberException(String message, Throwable e) { InvalidNumberException(String message, Throwable e) {
super(message, e); super(message, e);
} }

View file

@ -29,6 +29,14 @@ public sealed interface RecipientIdentifier {
return new Uuid(UUID.fromString(identifier)); 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:")) { if (identifier.startsWith("u:")) {
return new Username(identifier.substring(2)); return new Username(identifier.substring(2));
} }
@ -50,7 +58,7 @@ public sealed interface RecipientIdentifier {
} else if (address.aci().isPresent()) { } else if (address.aci().isPresent()) {
return new Uuid(UUID.fromString(address.aci().get())); return new Uuid(UUID.fromString(address.aci().get()));
} else if (address.pni().isPresent()) { } 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()) { } else if (address.username().isPresent()) {
return new Username(address.username().get()); 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 @Override
public String getIdentifier() { public String getIdentifier() {
return pni; return "PNI:" + pni.toString();
} }
@Override @Override
public RecipientAddress toPartialRecipientAddress() { public RecipientAddress toPartialRecipientAddress() {
return new RecipientAddress(null, pni, null, null); return new RecipientAddress(null, getIdentifier(), null, null);
} }
} }

View file

@ -79,7 +79,7 @@ public class RecipientHelper {
if (recipient instanceof RecipientIdentifier.Uuid uuidRecipient) { if (recipient instanceof RecipientIdentifier.Uuid uuidRecipient) {
return account.getRecipientResolver().resolveRecipient(ACI.from(uuidRecipient.uuid())); return account.getRecipientResolver().resolveRecipient(ACI.from(uuidRecipient.uuid()));
} else if (recipient instanceof RecipientIdentifier.Pni pniRecipient) { } 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) { } else if (recipient instanceof RecipientIdentifier.Number numberRecipient) {
final var number = numberRecipient.number(); final var number = numberRecipient.number();
return account.getRecipientStore().resolveRecipientByNumber(number, () -> { return account.getRecipientStore().resolveRecipientByNumber(number, () -> {

View file

@ -888,7 +888,7 @@ public class ManagerImpl implements Manager {
.deleteEntryForRecipientNonGroup(targetSentTimestamp, ACI.from(u.uuid())); .deleteEntryForRecipientNonGroup(targetSentTimestamp, ACI.from(u.uuid()));
} else if (recipient instanceof RecipientIdentifier.Pni pni) { } else if (recipient instanceof RecipientIdentifier.Pni pni) {
account.getMessageSendLogStore() account.getMessageSendLogStore()
.deleteEntryForRecipientNonGroup(targetSentTimestamp, PNI.parseOrThrow(pni.pni())); .deleteEntryForRecipientNonGroup(targetSentTimestamp, PNI.from(pni.pni()));
} else if (recipient instanceof RecipientIdentifier.Single r) { } else if (recipient instanceof RecipientIdentifier.Single r) {
try { try {
final var recipientId = context.getRecipientHelper().resolveRecipient(r); final var recipientId = context.getRecipientHelper().resolveRecipient(r);

View file

@ -69,8 +69,8 @@ public record RecipientAddress(
} }
public RecipientAddress(org.asamk.signal.manager.api.RecipientAddress address) { public RecipientAddress(org.asamk.signal.manager.api.RecipientAddress address) {
this(address.aci().map(ACI::parseOrNull), this(address.aci().map(ACI::parseOrThrow),
address.pni().map(PNI::parseOrNull), address.pni().map(PNI::parseOrThrow),
address.number(), address.number(),
address.username()); address.username());
} }