diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java index 5314fe77..0dddf6db 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java @@ -194,6 +194,9 @@ public final class ProfileHelper { } profile = decryptProfileIfKeyKnown(recipientId, encryptedProfile); + if (profile.getGivenName() == null && profile.getFamilyName() == null) { + return profile; + } account.getProfileStore().storeProfile(recipientId, profile); return profile; diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java index 16a9f4cb..f28c6861 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientStore.java @@ -261,7 +261,12 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile public void storeProfile(final RecipientId recipientId, final Profile profile) { synchronized (recipients) { final var recipient = recipients.get(recipientId); - storeRecipientLocked(recipientId, Recipient.newBuilder(recipient).withProfile(profile).build()); + if (recipient != null) { + storeRecipientLocked(recipientId, Recipient.newBuilder(recipient).withProfile(profile).build()); + } else { + storeRecipientLocked(recipientId, + Recipient.newBuilder().withRecipientId(recipientId).withProfile(profile).build()); + } } } @@ -459,6 +464,10 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile final var base64 = Base64.getEncoder(); var storage = new Storage(recipients.entrySet().stream().map(pair -> { final var recipient = pair.getValue(); + final var number = recipient.getAddress() == null ? null : recipient.getAddress().getNumber().orElse(null); + final var uuid = recipient.getAddress() == null + ? null + : recipient.getAddress().getUuid().map(UUID::toString).orElse(null); final var contact = recipient.getContact() == null ? null : new Storage.Recipient.Contact(recipient.getContact().getName(), @@ -481,8 +490,8 @@ public class RecipientStore implements RecipientResolver, ContactsStore, Profile .map(Enum::name) .collect(Collectors.toSet())); return new Storage.Recipient(pair.getKey().id(), - recipient.getAddress().getNumber().orElse(null), - recipient.getAddress().getUuid().map(UUID::toString).orElse(null), + number, + uuid, recipient.getProfileKey() == null ? null : base64.encodeToString(recipient.getProfileKey().serialize()), diff --git a/man/signal-cli-dbus.5.adoc b/man/signal-cli-dbus.5.adoc index 5950b582..dd7f8034 100755 --- a/man/signal-cli-dbus.5.adoc +++ b/man/signal-cli-dbus.5.adoc @@ -519,6 +519,16 @@ setContactName(number,name<>) -> <>:: Exceptions: InvalidNumber, Failure +deleteContact(number) -> <>:: +* number : Phone number + +Exceptions: Failure + +deleteRecipient(number) -> <>:: +* number : Phone number + +Exceptions: Failure + setExpirationTimer(number, expiration) -> <>:: * number : Phone number of recipient * expiration : int32 for the number of seconds before messages to this recipient disappear. Set to 0 to disable expiration. diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index 8ce71745..421e5de5 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -76,6 +76,10 @@ public interface Signal extends DBusInterface { void sendEndSessionMessage(List recipients) throws Error.Failure, Error.InvalidNumber, Error.UntrustedIdentity; + void deleteRecipient(final String recipient) throws Error.Failure; + + void deleteContact(final String recipient) throws Error.Failure; + long sendGroupMessage( String message, List attachments, byte[] groupId ) throws Error.GroupNotFound, Error.Failure, Error.AttachmentInvalid, Error.InvalidGroupId; diff --git a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java index adef6f96..49b8b6aa 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java @@ -383,12 +383,12 @@ public class DbusManagerImpl implements Manager { @Override public void deleteRecipient(final RecipientIdentifier.Single recipient) throws IOException { - throw new UnsupportedOperationException(); + signal.deleteRecipient(recipient.getIdentifier()); } @Override public void deleteContact(final RecipientIdentifier.Single recipient) throws IOException { - throw new UnsupportedOperationException(); + signal.deleteContact(recipient.getIdentifier()); } @Override diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java index 6395eb14..7c4ba816 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java @@ -387,6 +387,24 @@ public class DbusSignalImpl implements Signal { } } + @Override + public void deleteRecipient(final String recipient) throws Error.Failure { + try { + m.deleteRecipient(getSingleRecipientIdentifier(recipient, m.getSelfNumber())); + } catch (IOException e) { + throw new Error.Failure("Recipient not found"); + } + } + + @Override + public void deleteContact(final String recipient) throws Error.Failure { + try { + m.deleteContact(getSingleRecipientIdentifier(recipient, m.getSelfNumber())); + } catch (IOException e) { + throw new Error.Failure("Contact not found"); + } + } + @Override public long sendGroupMessage(final String message, final List attachments, final byte[] groupId) { try {