X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/1d2c7a479d791dedde6c2022ac65e9c82400af79..ed79e0b37717a51ff83114a07202c25fcc274206:/src/main/java/org/asamk/Signal.java diff --git a/src/main/java/org/asamk/Signal.java b/src/main/java/org/asamk/Signal.java index 9e81c788..ac1f6d50 100644 --- a/src/main/java/org/asamk/Signal.java +++ b/src/main/java/org/asamk/Signal.java @@ -1,11 +1,18 @@ package org.asamk; +import org.freedesktop.dbus.DBusPath; +import org.freedesktop.dbus.Struct; +import org.freedesktop.dbus.annotations.DBusProperty; +import org.freedesktop.dbus.annotations.Position; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.freedesktop.dbus.interfaces.DBusInterface; +import org.freedesktop.dbus.interfaces.Properties; import org.freedesktop.dbus.messages.DBusSignal; +import org.freedesktop.dbus.types.Variant; import java.util.List; +import java.util.Map; /** * DBus interface for the org.asamk.Signal service. @@ -13,63 +20,292 @@ import java.util.List; */ public interface Signal extends DBusInterface { + String getSelfNumber(); + + void subscribeReceive(); + + void unsubscribeReceive(); + long sendMessage( - String message, List attachments, String recipient + String message, + List attachments, + String recipient ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.UntrustedIdentity; long sendMessage( - String message, List attachments, List recipients + String message, + List attachments, + List recipients ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.UntrustedIdentity; - long sendNoteToSelfMessage( - String message, List attachments - ) throws Error.AttachmentInvalid, Error.Failure; + void sendTyping(String recipient, boolean stop) throws Error.Failure, Error.UntrustedIdentity; + + void sendReadReceipt(String recipient, List messageIds) throws Error.Failure, Error.UntrustedIdentity; + + void sendViewedReceipt(String recipient, List messageIds) throws Error.Failure, Error.UntrustedIdentity; + + long sendRemoteDeleteMessage(long targetSentTimestamp, String recipient) throws Error.Failure, Error.InvalidNumber; + + long sendRemoteDeleteMessage( + long targetSentTimestamp, + List recipients + ) throws Error.Failure, Error.InvalidNumber; + + long sendMessageReaction( + String emoji, + boolean remove, + String targetAuthor, + long targetSentTimestamp, + String recipient + ) throws Error.InvalidNumber, Error.Failure; + + long sendMessageReaction( + String emoji, + boolean remove, + String targetAuthor, + long targetSentTimestamp, + List recipients + ) throws Error.InvalidNumber, Error.Failure; + + long sendPaymentNotification(byte[] receipt, String note, String recipient) throws Error.Failure; + + void sendContacts() throws Error.Failure; + + void sendSyncRequest() throws Error.Failure; + + long sendNoteToSelfMessage(String message, List attachments) throws Error.AttachmentInvalid, Error.Failure; 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; + String message, + List attachments, + byte[] groupId + ) throws Error.GroupNotFound, Error.Failure, Error.AttachmentInvalid, Error.InvalidGroupId; + + void sendGroupTyping( + final byte[] groupId, + final boolean stop + ) throws Error.Failure, Error.GroupNotFound, Error.UntrustedIdentity; + + long sendGroupRemoteDeleteMessage( + long targetSentTimestamp, + byte[] groupId + ) throws Error.Failure, Error.GroupNotFound, Error.InvalidGroupId; + + long sendGroupMessageReaction( + String emoji, + boolean remove, + String targetAuthor, + long targetSentTimestamp, + byte[] groupId + ) throws Error.GroupNotFound, Error.Failure, Error.InvalidNumber, Error.InvalidGroupId; String getContactName(String number) throws Error.InvalidNumber; void setContactName(String number, String name) throws Error.InvalidNumber; + void setExpirationTimer(final String number, final int expiration) throws Error.Failure; + void setContactBlocked(String number, boolean blocked) throws Error.InvalidNumber; - void setGroupBlocked(byte[] groupId, boolean blocked) throws Error.GroupNotFound; + @Deprecated + void setGroupBlocked(byte[] groupId, boolean blocked) throws Error.GroupNotFound, Error.InvalidGroupId; + @Deprecated List getGroupIds(); - String getGroupName(byte[] groupId); + DBusPath getGroup(byte[] groupId); + + List listGroups(); + + @Deprecated + String getGroupName(byte[] groupId) throws Error.InvalidGroupId; - List getGroupMembers(byte[] groupId); + @Deprecated + List getGroupMembers(byte[] groupId) throws Error.InvalidGroupId; + byte[] createGroup( + String name, + List members, + String avatar + ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber; + + @Deprecated byte[] updateGroup( - byte[] groupId, String name, List members, String avatar - ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.GroupNotFound; + byte[] groupId, + String name, + List members, + String avatar + ) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber, Error.GroupNotFound, Error.InvalidGroupId; + + @Deprecated + boolean isRegistered() throws Error.Failure, Error.InvalidNumber; + + boolean isRegistered(String number) throws Error.Failure, Error.InvalidNumber; + + List isRegistered(List numbers) throws Error.Failure, Error.InvalidNumber; + + void addDevice(String uri) throws Error.InvalidUri; + + DBusPath getDevice(long deviceId); + + DBusPath getIdentity(String number); + + List listIdentities(); + + List listDevices() throws Error.Failure; - boolean isRegistered(); + DBusPath getThisDevice(); void updateProfile( - String name, String about, String aboutEmoji, String avatarPath, boolean removeAvatar + String givenName, + String familyName, + String about, + String aboutEmoji, + String avatarPath, + boolean removeAvatar ) throws Error.Failure; - - public String version(); - - public List listNumbers(); - - public List getContactNumber(final String name) throws Error.Failure; - - public void quitGroup(final byte[] groupId) throws Error.GroupNotFound,Error.Failure; - - public boolean isContactBlocked(final String number); - - public boolean isGroupBlocked(final byte[] groupId); - - public boolean isMember(final byte[] groupId); - - public void joinGroup(final String groupLink) throws Error.Failure; + + void updateProfile( + String name, + String about, + String aboutEmoji, + String avatarPath, + boolean removeAvatar + ) throws Error.Failure; + + void removePin(); + + void setPin(String registrationLockPin); + + String version(); + + List listNumbers(); + + List getContactNumber(final String name) throws Error.Failure; + + @Deprecated + void quitGroup(final byte[] groupId) throws Error.GroupNotFound, Error.Failure, Error.InvalidGroupId; + + boolean isContactBlocked(final String number) throws Error.InvalidNumber; + + @Deprecated + boolean isGroupBlocked(final byte[] groupId) throws Error.InvalidGroupId; + + @Deprecated + boolean isMember(final byte[] groupId) throws Error.InvalidGroupId; + + byte[] joinGroup(final String groupLink) throws Error.Failure; + + String uploadStickerPack(String stickerPackPath) throws Error.Failure; + + void submitRateLimitChallenge(String challenge, String captchaString) throws Error.Failure; + + void unregister() throws Error.Failure; + + void deleteAccount() throws Error.Failure; + + class MessageReceivedV2 extends DBusSignal { + + private final long timestamp; + private final String sender; + private final byte[] groupId; + private final String message; + private final Map> extras; + + public MessageReceivedV2( + String objectpath, + long timestamp, + String sender, + byte[] groupId, + String message, + final Map> extras + ) throws DBusException { + super(objectpath, timestamp, sender, groupId, message, extras); + this.timestamp = timestamp; + this.sender = sender; + this.groupId = groupId; + this.message = message; + this.extras = extras; + } + + public long getTimestamp() { + return timestamp; + } + + public String getSender() { + return sender; + } + + public byte[] getGroupId() { + return groupId; + } + + public String getMessage() { + return message; + } + + public Map> getExtras() { + return extras; + } + } + + class EditMessageReceived extends DBusSignal { + + private final long timestamp; + private final long targetSentTimestamp; + private final String sender; + private final byte[] groupId; + private final String message; + private final Map> extras; + + public EditMessageReceived( + String objectpath, + long timestamp, + final long targetSentTimestamp, + String sender, + byte[] groupId, + String message, + final Map> extras + ) throws DBusException { + super(objectpath, timestamp, targetSentTimestamp, sender, groupId, message, extras); + this.timestamp = timestamp; + this.targetSentTimestamp = targetSentTimestamp; + this.sender = sender; + this.groupId = groupId; + this.message = message; + this.extras = extras; + } + + public long getTimestamp() { + return timestamp; + } + + public long getTargetSentTimestamp() { + return targetSentTimestamp; + } + + public String getSender() { + return sender; + } + + public byte[] getGroupId() { + return groupId; + } + + public String getMessage() { + return message; + } + + public Map> getExtras() { + return extras; + } + } class MessageReceived extends DBusSignal { @@ -136,6 +372,44 @@ public interface Signal extends DBusInterface { } } + class ReceiptReceivedV2 extends DBusSignal { + + private final long timestamp; + private final String sender; + private final String type; + private final Map> extras; + + public ReceiptReceivedV2( + String objectpath, + long timestamp, + String sender, + final String type, + final Map> extras + ) throws DBusException { + super(objectpath, timestamp, sender, type, extras); + this.timestamp = timestamp; + this.sender = sender; + this.type = type; + this.extras = extras; + } + + public long getTimestamp() { + return timestamp; + } + + public String getSender() { + return sender; + } + + public String getReceiptType() { + return type; + } + + public Map> getExtras() { + return extras; + } + } + class SyncMessageReceived extends DBusSignal { private final long timestamp; @@ -188,40 +462,295 @@ public interface Signal extends DBusInterface { } } + class SyncMessageReceivedV2 extends DBusSignal { + + private final long timestamp; + private final String source; + private final String destination; + private final byte[] groupId; + private final String message; + private final Map> extras; + + public SyncMessageReceivedV2( + String objectpath, + long timestamp, + String source, + String destination, + byte[] groupId, + String message, + final Map> extras + ) throws DBusException { + super(objectpath, timestamp, source, destination, groupId, message, extras); + this.timestamp = timestamp; + this.source = source; + this.destination = destination; + this.groupId = groupId; + this.message = message; + this.extras = extras; + } + + public long getTimestamp() { + return timestamp; + } + + public String getSource() { + return source; + } + + public String getDestination() { + return destination; + } + + public byte[] getGroupId() { + return groupId; + } + + public String getMessage() { + return message; + } + + public Map> getExtras() { + return extras; + } + } + + class StructDevice extends Struct { + + @Position(0) + final DBusPath objectPath; + + @Position(1) + final Long id; + + @Position(2) + final String name; + + public StructDevice(final DBusPath objectPath, final Long id, final String name) { + this.objectPath = objectPath; + this.id = id; + this.name = name; + } + + public DBusPath getObjectPath() { + return objectPath; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + } + + @DBusProperty(name = "Id", type = Integer.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "Name", type = String.class) + @DBusProperty(name = "Created", type = String.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "LastSeen", type = String.class, access = DBusProperty.Access.READ) + interface Device extends DBusInterface, Properties { + + void removeDevice() throws Error.Failure; + } + + @DBusProperty(name = "ReadReceipts", type = Boolean.class) + @DBusProperty(name = "UnidentifiedDeliveryIndicators", type = Boolean.class) + @DBusProperty(name = "TypingIndicators", type = Boolean.class) + @DBusProperty(name = "LinkPreviews", type = Boolean.class) + interface Configuration extends DBusInterface, Properties {} + + class StructGroup extends Struct { + + @Position(0) + final DBusPath objectPath; + + @Position(1) + final byte[] id; + + @Position(2) + final String name; + + public StructGroup(final DBusPath objectPath, final byte[] id, final String name) { + this.objectPath = objectPath; + this.id = id; + this.name = name; + } + + public DBusPath getObjectPath() { + return objectPath; + } + + public byte[] getId() { + return id; + } + + public String getName() { + return name; + } + } + + @DBusProperty(name = "Id", type = Byte[].class, access = DBusProperty.Access.READ) + @DBusProperty(name = "Name", type = String.class) + @DBusProperty(name = "Description", type = String.class) + @DBusProperty(name = "Avatar", type = String.class, access = DBusProperty.Access.WRITE) + @DBusProperty(name = "IsBlocked", type = Boolean.class) + @DBusProperty(name = "IsMember", type = Boolean.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "IsAdmin", type = Boolean.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "MessageExpirationTimer", type = Integer.class) + @DBusProperty(name = "Members", type = String[].class, access = DBusProperty.Access.READ) + @DBusProperty(name = "PendingMembers", type = String[].class, access = DBusProperty.Access.READ) + @DBusProperty(name = "RequestingMembers", type = String[].class, access = DBusProperty.Access.READ) + @DBusProperty(name = "Admins", type = String[].class, access = DBusProperty.Access.READ) + @DBusProperty(name = "Banned", type = String[].class, access = DBusProperty.Access.READ) + @DBusProperty(name = "PermissionAddMember", type = String.class) + @DBusProperty(name = "PermissionEditDetails", type = String.class) + @DBusProperty(name = "PermissionSendMessage", type = String.class) + @DBusProperty(name = "GroupInviteLink", type = String.class, access = DBusProperty.Access.READ) + interface Group extends DBusInterface, Properties { + + void quitGroup() throws Error.Failure, Error.LastGroupAdmin; + + void deleteGroup() throws Error.Failure; + + void addMembers(List recipients) throws Error.Failure; + + void removeMembers(List recipients) throws Error.Failure; + + void addAdmins(List recipients) throws Error.Failure; + + void removeAdmins(List recipients) throws Error.Failure; + + void resetLink() throws Error.Failure; + + void disableLink() throws Error.Failure; + + void enableLink(boolean requiresApproval) throws Error.Failure; + } + + class StructIdentity extends Struct { + + @Position(0) + final DBusPath objectPath; + + @Position(1) + final String uuid; + + @Position(2) + final String number; + + public StructIdentity(final DBusPath objectPath, final String uuid, final String number) { + this.objectPath = objectPath; + this.uuid = uuid; + this.number = number; + } + + public DBusPath getObjectPath() { + return objectPath; + } + + public String getUuid() { + return uuid; + } + + public String getNumber() { + return number; + } + } + + @DBusProperty(name = "Number", type = String.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "Uuid", type = String.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "Fingerprint", type = Byte[].class, access = DBusProperty.Access.READ) + @DBusProperty(name = "SafetyNumber", type = String.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "TrustLevel", type = String.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "AddedDate", type = Long.class, access = DBusProperty.Access.READ) + @DBusProperty(name = "ScannableSafetyNumber", type = Byte[].class, access = DBusProperty.Access.READ) + interface Identity extends DBusInterface, Properties { + + void trust() throws Error.Failure; + + void trustVerified(String safetyNumber) throws Error.Failure; + } + interface Error { class AttachmentInvalid extends DBusExecutionException { public AttachmentInvalid(final String message) { - super(message); + super("Invalid attachment: " + message); + } + } + + class InvalidUri extends DBusExecutionException { + + public InvalidUri(final String message) { + super("Invalid uri: " + message); } } class Failure extends DBusExecutionException { + public Failure(final Exception e) { + super("Failure: " + e.getMessage() + " (" + e.getClass().getSimpleName() + ")"); + } + public Failure(final String message) { - super(message); + super("Failure: " + message); + } + } + + class DeviceNotFound extends DBusExecutionException { + + public DeviceNotFound(final String message) { + super("Device not found: " + message); } } class GroupNotFound extends DBusExecutionException { public GroupNotFound(final String message) { - super(message); + super("Group not found: " + message); + } + } + + class NotAGroupMember extends DBusExecutionException { + + public NotAGroupMember(final String message) { + super("Not a group member: " + message); + } + } + + class InvalidGroupId extends DBusExecutionException { + + public InvalidGroupId(final String message) { + super("Invalid group id: " + message); + } + } + + class LastGroupAdmin extends DBusExecutionException { + + public LastGroupAdmin(final String message) { + super("Last group admin: " + message); } } class InvalidNumber extends DBusExecutionException { public InvalidNumber(final String message) { - super(message); + super("Invalid number: " + message); } } class UntrustedIdentity extends DBusExecutionException { public UntrustedIdentity(final String message) { - super(message); + super("Untrusted identity: " + message); + } + } + + class UnregisteredRecipient extends DBusExecutionException { + + public UnregisteredRecipient(final String message) { + super("Unregistered recipient: " + message); } } }