X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/9ad24614cb800c0e3f853dc985d8d4180bbdd04d..fc2e9bbfaec8dbe6e317b951c0d28fa2e9421347:/lib/src/main/java/org/asamk/signal/manager/Manager.java diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index eb00d745..41e08fb6 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -1,17 +1,35 @@ package org.asamk.signal.manager; +import org.asamk.signal.manager.api.AlreadyReceivingException; import org.asamk.signal.manager.api.AttachmentInvalidException; +import org.asamk.signal.manager.api.CaptchaRequiredException; import org.asamk.signal.manager.api.Configuration; import org.asamk.signal.manager.api.Device; +import org.asamk.signal.manager.api.DeviceLinkUrl; import org.asamk.signal.manager.api.Group; +import org.asamk.signal.manager.api.GroupId; +import org.asamk.signal.manager.api.GroupInviteLinkUrl; +import org.asamk.signal.manager.api.GroupNotFoundException; +import org.asamk.signal.manager.api.GroupSendingNotAllowedException; import org.asamk.signal.manager.api.Identity; +import org.asamk.signal.manager.api.IdentityVerificationCode; import org.asamk.signal.manager.api.InactiveGroupLinkException; +import org.asamk.signal.manager.api.IncorrectPinException; import org.asamk.signal.manager.api.InvalidDeviceLinkException; import org.asamk.signal.manager.api.InvalidStickerException; +import org.asamk.signal.manager.api.InvalidUsernameException; +import org.asamk.signal.manager.api.LastGroupAdminException; import org.asamk.signal.manager.api.Message; import org.asamk.signal.manager.api.MessageEnvelope; +import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException; +import org.asamk.signal.manager.api.NotAGroupMemberException; import org.asamk.signal.manager.api.NotPrimaryDeviceException; import org.asamk.signal.manager.api.Pair; +import org.asamk.signal.manager.api.PendingAdminApprovalException; +import org.asamk.signal.manager.api.PinLockedException; +import org.asamk.signal.manager.api.RateLimitException; +import org.asamk.signal.manager.api.ReceiveConfig; +import org.asamk.signal.manager.api.Recipient; import org.asamk.signal.manager.api.RecipientIdentifier; import org.asamk.signal.manager.api.SendGroupMessageResults; import org.asamk.signal.manager.api.SendMessageResults; @@ -23,20 +41,14 @@ import org.asamk.signal.manager.api.UnregisteredRecipientException; import org.asamk.signal.manager.api.UpdateGroup; import org.asamk.signal.manager.api.UpdateProfile; import org.asamk.signal.manager.api.UserStatus; -import org.asamk.signal.manager.groups.GroupId; -import org.asamk.signal.manager.groups.GroupInviteLinkUrl; -import org.asamk.signal.manager.groups.GroupNotFoundException; -import org.asamk.signal.manager.groups.GroupSendingNotAllowedException; -import org.asamk.signal.manager.groups.LastGroupAdminException; -import org.asamk.signal.manager.groups.NotAGroupMemberException; -import org.asamk.signal.manager.storage.recipients.Profile; -import org.asamk.signal.manager.storage.recipients.Recipient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import java.io.Closeable; import java.io.File; import java.io.IOException; -import java.net.URI; +import java.io.InputStream; import java.time.Duration; import java.util.Collection; import java.util.List; @@ -50,6 +62,21 @@ public interface Manager extends Closeable { return PhoneNumberFormatter.isValidNumber(e164Number, countryCode); } + static boolean isSignalClientAvailable() { + final Logger logger = LoggerFactory.getLogger(Manager.class); + try { + try { + org.signal.libsignal.internal.Native.UuidCiphertext_CheckValidContents(new byte[0]); + } catch (Exception e) { + logger.trace("Expected exception when checking libsignal-client: {}", e.getMessage()); + } + return true; + } catch (UnsatisfiedLinkError e) { + logger.warn("Failed to call libsignal-client: {}", e.getMessage()); + return false; + } + } + String getSelfNumber(); /** @@ -59,13 +86,13 @@ public interface Manager extends Closeable { * @return A map of numbers to canonicalized number and uuid. If a number is not registered the uuid is null. * @throws IOException if it's unable to get the contacts to check if they're registered */ - Map getUserStatus(Set numbers) throws IOException; + Map getUserStatus(Set numbers) throws IOException, RateLimitException; void updateAccountAttributes(String deviceName) throws IOException; Configuration getConfiguration(); - void updateConfiguration(Configuration configuration) throws IOException, NotPrimaryDeviceException; + void updateConfiguration(Configuration configuration) throws NotPrimaryDeviceException; /** * Update the user's profile. @@ -73,6 +100,26 @@ public interface Manager extends Closeable { */ void updateProfile(UpdateProfile updateProfile) throws IOException; + /** + * Set a username for the account. + * If the username is null, it will be deleted. + */ + String setUsername(String username) throws IOException, InvalidUsernameException; + + /** + * Set a username for the account. + * If the username is null, it will be deleted. + */ + void deleteUsername() throws IOException; + + void startChangeNumber( + String newNumber, boolean voiceVerification, String captcha + ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException; + + void finishChangeNumber( + String newNumber, String verificationCode, String pin + ) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException; + void unregister() throws IOException; void deleteAccount() throws IOException; @@ -83,12 +130,10 @@ public interface Manager extends Closeable { void removeLinkedDevices(int deviceId) throws IOException; - void addDeviceLink(URI linkUri) throws IOException, InvalidDeviceLinkException; + void addDeviceLink(DeviceLinkUrl linkUri) throws IOException, InvalidDeviceLinkException, NotPrimaryDeviceException; void setRegistrationLockPin(Optional pin) throws IOException, NotPrimaryDeviceException; - Profile getRecipientProfile(RecipientIdentifier.Single recipient) throws IOException, UnregisteredRecipientException; - List getGroups(); SendGroupMessageResults quitGroup( @@ -98,7 +143,7 @@ public interface Manager extends Closeable { void deleteGroup(GroupId groupId) throws IOException; Pair createGroup( - String name, Set members, File avatarFile + String name, Set members, String avatarFile ) throws IOException, AttachmentInvalidException, UnregisteredRecipientException; SendGroupMessageResults updateGroup( @@ -107,7 +152,7 @@ public interface Manager extends Closeable { Pair joinGroup( GroupInviteLinkUrl inviteLinkUrl - ) throws IOException, InactiveGroupLinkException; + ) throws IOException, InactiveGroupLinkException, PendingAdminApprovalException; SendMessageResults sendTypingMessage( TypingAction action, Set recipients @@ -115,16 +160,20 @@ public interface Manager extends Closeable { SendMessageResults sendReadReceipt( RecipientIdentifier.Single sender, List messageIds - ) throws IOException; + ); SendMessageResults sendViewedReceipt( RecipientIdentifier.Single sender, List messageIds - ) throws IOException; + ); SendMessageResults sendMessage( Message message, Set recipients ) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException, InvalidStickerException; + SendMessageResults sendEditMessage( + Message message, Set recipients, long editTargetTimestamp + ) throws IOException, AttachmentInvalidException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException, InvalidStickerException; + SendMessageResults sendRemoteDeleteMessage( long targetSentTimestamp, Set recipients ) throws IOException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException; @@ -134,7 +183,8 @@ public interface Manager extends Closeable { boolean remove, RecipientIdentifier.Single targetAuthor, long targetSentTimestamp, - Set recipients + Set recipients, + final boolean isStory ) throws IOException, NotAGroupMemberException, GroupNotFoundException, GroupSendingNotAllowedException, UnregisteredRecipientException; SendMessageResults sendPaymentNotificationMessage( @@ -148,8 +198,8 @@ public interface Manager extends Closeable { void deleteContact(RecipientIdentifier.Single recipient); void setContactName( - RecipientIdentifier.Single recipient, String name - ) throws NotPrimaryDeviceException, IOException, UnregisteredRecipientException; + RecipientIdentifier.Single recipient, String givenName, final String familyName + ) throws NotPrimaryDeviceException, UnregisteredRecipientException; void setContactsBlocked( Collection recipient, boolean blocked @@ -174,6 +224,8 @@ public interface Manager extends Closeable { */ StickerPackUrl uploadStickerPack(File path) throws IOException, StickerPackInvalidException; + void installStickerPack(StickerPackUrl url) throws IOException; + List getStickerPacks(); void requestAllSyncData() throws IOException; @@ -199,16 +251,11 @@ public interface Manager extends Closeable { /** * Receive new messages from server, returns if no new message arrive in a timespan of timeout. */ - void receiveMessages(Duration timeout, ReceiveMessageHandler handler) throws IOException; - - /** - * Receive new messages from server, returns only if the thread is interrupted. - */ - void receiveMessages(ReceiveMessageHandler handler) throws IOException; - - void setIgnoreAttachments(boolean ignoreAttachments); + void receiveMessages( + Optional timeout, Optional maxMessages, ReceiveMessageHandler handler + ) throws IOException, AlreadyReceivingException; - boolean hasCaughtUpWithOldMessages(); + void setReceiveConfig(ReceiveConfig receiveConfig); boolean isContactBlocked(RecipientIdentifier.Single recipient); @@ -230,33 +277,12 @@ public interface Manager extends Closeable { List getIdentities(RecipientIdentifier.Single recipient); /** - * Trust this the identity with this fingerprint + * Trust this the identity with this fingerprint/safetyNumber * - * @param recipient account of the identity - * @param fingerprint Fingerprint + * @param recipient account of the identity */ boolean trustIdentityVerified( - RecipientIdentifier.Single recipient, byte[] fingerprint - ) throws UnregisteredRecipientException; - - /** - * Trust this the identity with this safety number - * - * @param recipient account of the identity - * @param safetyNumber Safety number - */ - boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, String safetyNumber - ) throws UnregisteredRecipientException; - - /** - * Trust this the identity with this scannable safety number - * - * @param recipient account of the identity - * @param safetyNumber Scannable safety number - */ - boolean trustIdentityVerifiedSafetyNumber( - RecipientIdentifier.Single recipient, byte[] safetyNumber + RecipientIdentifier.Single recipient, IdentityVerificationCode verificationCode ) throws UnregisteredRecipientException; /** @@ -270,8 +296,10 @@ public interface Manager extends Closeable { void addClosedListener(Runnable listener); + InputStream retrieveAttachment(final String id) throws IOException; + @Override - void close() throws IOException; + void close(); interface ReceiveMessageHandler {