]> nmode's Git Repositories - signal-cli/commitdiff
Fix inspections
authorAsamK <asamk@gmx.de>
Tue, 17 Oct 2023 18:00:47 +0000 (20:00 +0200)
committerAsamK <asamk@gmx.de>
Tue, 17 Oct 2023 18:34:21 +0000 (20:34 +0200)
27 files changed:
graalvm-config-dir/reflect-config.json
lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/Settings.java
lib/src/main/java/org/asamk/signal/manager/actions/SendRetryMessageRequestAction.java
lib/src/main/java/org/asamk/signal/manager/api/MessageEnvelope.java
lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/IdentityHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/SyncHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/MultiAccountManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/storage/Database.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java
lib/src/main/java/org/asamk/signal/manager/storage/accounts/AccountsStore.java
lib/src/main/java/org/asamk/signal/manager/storage/protocol/LegacyIdentityInfo.java
lib/src/main/java/org/asamk/signal/manager/storage/protocol/LegacySessionInfo.java
lib/src/main/java/org/asamk/signal/manager/storage/recipients/RecipientWithAddress.java
lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java
lib/src/main/java/org/asamk/signal/manager/storage/threads/LegacyJsonThreadStore.java
lib/src/main/java/org/asamk/signal/manager/util/MessageCacheUtils.java
lib/src/test/java/org/asamk/signal/manager/storage/recipients/MergeRecipientHelperTest.java
man/signal-cli-dbus.5.adoc
src/main/java/org/asamk/Signal.java
src/main/java/org/asamk/signal/App.java
src/main/java/org/asamk/signal/commands/SendReceiptCommand.java
src/main/java/org/asamk/signal/commands/UpdateConfigurationCommand.java
src/main/java/org/asamk/signal/dbus/DbusManagerImpl.java
src/main/java/org/asamk/signal/dbus/DbusSignalImpl.java

index d24416d9ae2d6500e4502737a292ca839678439e..401727f6b491398b48b737df846ebaf22c9f4ac0 100644 (file)
   "name":"org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.Dilithium$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
   "name":"org.bouncycastle.jcajce.provider.asymmetric.ECGOST$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.EXTERNAL$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.bouncycastle.jcajce.provider.asymmetric.EdEC$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
   "name":"org.bouncycastle.jcajce.provider.asymmetric.ElGamal$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.Falcon$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.bouncycastle.jcajce.provider.asymmetric.GM$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
   "name":"org.bouncycastle.jcajce.provider.asymmetric.IES$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.LMS$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.NTRU$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.SPHINCSPlus$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.bouncycastle.jcajce.provider.asymmetric.X509$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
   "name":"org.bouncycastle.jcajce.provider.digest.Blake2s$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Blake3$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.bouncycastle.jcajce.provider.digest.DSTU7564$Mappings",
   "methods":[{"name":"<init>","parameterTypes":[] }]
index defe71558a6a291993ad61418fb11a7379f4d2de..41e08fb6309c9ddb8b1ff91faa0eed4d9a8f08c6 100644 (file)
@@ -92,7 +92,7 @@ public interface Manager extends Closeable {
 
     Configuration getConfiguration();
 
-    void updateConfiguration(Configuration configuration) throws IOException, NotPrimaryDeviceException;
+    void updateConfiguration(Configuration configuration) throws NotPrimaryDeviceException;
 
     /**
      * Update the user's profile.
@@ -160,11 +160,11 @@ public interface Manager extends Closeable {
 
     SendMessageResults sendReadReceipt(
             RecipientIdentifier.Single sender, List<Long> messageIds
-    ) throws IOException;
+    );
 
     SendMessageResults sendViewedReceipt(
             RecipientIdentifier.Single sender, List<Long> messageIds
-    ) throws IOException;
+    );
 
     SendMessageResults sendMessage(
             Message message, Set<RecipientIdentifier> recipients
@@ -199,7 +199,7 @@ public interface Manager extends Closeable {
 
     void setContactName(
             RecipientIdentifier.Single recipient, String givenName, final String familyName
-    ) throws NotPrimaryDeviceException, IOException, UnregisteredRecipientException;
+    ) throws NotPrimaryDeviceException, UnregisteredRecipientException;
 
     void setContactsBlocked(
             Collection<RecipientIdentifier.Single> recipient, boolean blocked
@@ -299,7 +299,7 @@ public interface Manager extends Closeable {
     InputStream retrieveAttachment(final String id) throws IOException;
 
     @Override
-    void close() throws IOException;
+    void close();
 
     interface ReceiveMessageHandler {
 
index 878545141d9bdc59372636aeb5bc3c35d55f747e..5fd4e36bad59239150851bcf2991e2e02c569bc6 100644 (file)
@@ -4,5 +4,5 @@ import org.asamk.signal.manager.api.TrustNewIdentity;
 
 public record Settings(TrustNewIdentity trustNewIdentity, boolean disableMessageSendLog) {
 
-    public static Settings DEFAULT = new Settings(TrustNewIdentity.ON_FIRST_USE, false);
+    public static final Settings DEFAULT = new Settings(TrustNewIdentity.ON_FIRST_USE, false);
 }
index 1975fd1794cc1003376cc2c778b46cc58f9b0e88..865f062f3ca830156c72ea04baac62ff65c39332 100644 (file)
@@ -50,7 +50,9 @@ public class SendRetryMessageRequestAction implements HandleAction {
             envelopeType = messageContent.getType();
         } else {
             originalContent = envelope.getContent();
-            envelopeType = envelopeTypeToCiphertextMessageType(envelope.getType());
+            envelopeType = envelope.getType() == null
+                    ? CiphertextMessage.WHISPER_TYPE
+                    : envelopeTypeToCiphertextMessageType(envelope.getType());
         }
 
         DecryptionErrorMessage decryptionErrorMessage = DecryptionErrorMessage.forOriginalMessage(originalContent,
index 00abd93e74ffe37caead69418ef012e534ed2ba4..f4b6332422628712aeea2ee47c4d6f5830eab7c0 100644 (file)
@@ -34,6 +34,7 @@ import org.whispersystems.signalservice.api.messages.multidevice.ViewOnceOpenMes
 import org.whispersystems.signalservice.api.messages.multidevice.ViewedMessage;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -234,7 +235,7 @@ public record MessageEnvelope(
                 return new Quote(quote.getId(),
                         addressResolver.resolveRecipientAddress(recipientResolver.resolveRecipient(quote.getAuthor()))
                                 .toApiRecipientAddress(),
-                        Optional.ofNullable(quote.getText()),
+                        Optional.of(quote.getText()),
                         quote.getMentions() == null
                                 ? List.of()
                                 : quote.getMentions()
@@ -291,9 +292,9 @@ public record MessageEnvelope(
                 boolean isBorderless
         ) {
 
-            static Attachment from(SignalServiceAttachment attachment, AttachmentFileProvider fileProvider) {
-                if (attachment.isPointer()) {
-                    final var a = attachment.asPointer();
+            static Attachment from(SignalServiceAttachment signalAttachment, AttachmentFileProvider fileProvider) {
+                if (signalAttachment.isPointer()) {
+                    final var a = signalAttachment.asPointer();
                     final var attachmentFile = fileProvider.getFile(a);
                     return new Attachment(Optional.of(attachmentFile.getName()),
                             Optional.of(attachmentFile),
@@ -310,21 +311,26 @@ public record MessageEnvelope(
                             a.isGif(),
                             a.isBorderless());
                 } else {
-                    final var a = attachment.asStream();
-                    return new Attachment(Optional.empty(),
-                            Optional.empty(),
-                            a.getFileName(),
-                            a.getContentType(),
-                            a.getUploadTimestamp() == 0 ? Optional.empty() : Optional.of(a.getUploadTimestamp()),
-                            Optional.of(a.getLength()),
-                            a.getPreview(),
-                            Optional.empty(),
-                            a.getCaption(),
-                            a.getWidth() == 0 ? Optional.empty() : Optional.of(a.getWidth()),
-                            a.getHeight() == 0 ? Optional.empty() : Optional.of(a.getHeight()),
-                            a.getVoiceNote(),
-                            a.isGif(),
-                            a.isBorderless());
+                    Attachment attachment = null;
+                    try (final var a = signalAttachment.asStream()) {
+                        attachment = new Attachment(Optional.empty(),
+                                Optional.empty(),
+                                a.getFileName(),
+                                a.getContentType(),
+                                a.getUploadTimestamp() == 0 ? Optional.empty() : Optional.of(a.getUploadTimestamp()),
+                                Optional.of(a.getLength()),
+                                a.getPreview(),
+                                Optional.empty(),
+                                a.getCaption(),
+                                a.getWidth() == 0 ? Optional.empty() : Optional.of(a.getWidth()),
+                                a.getHeight() == 0 ? Optional.empty() : Optional.of(a.getHeight()),
+                                a.getVoiceNote(),
+                                a.isGif(),
+                                a.isBorderless());
+                        return attachment;
+                    } catch (IOException e) {
+                        return attachment;
+                    }
                 }
             }
 
index 697786fcd7c98721ca69ae29508494fb98d7f3a5..5991202e5e43fc081a42138b8a2ccd18c8909be5 100644 (file)
@@ -822,8 +822,8 @@ public class GroupHelper {
         if (avatarFile == null) {
             return null;
         }
-        try (final var avatar = Utils.createStreamDetails(avatarFile).first().getStream()) {
-            return IOUtils.readFully(avatar);
+        try (final var avatar = Utils.createStreamDetails(avatarFile).first()) {
+            return IOUtils.readFully(avatar.getStream());
         }
     }
 }
index c1e22c97b271571908396452a895ba923afe7af5..b9281889dab84a8a1a313e7a1f2fd5e3615e39c8 100644 (file)
@@ -14,7 +14,6 @@ import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.messages.SendMessageResult;
 import org.whispersystems.signalservice.api.push.ServiceId;
 
-import java.io.IOException;
 import java.util.Arrays;
 import java.util.function.BiFunction;
 
@@ -112,12 +111,8 @@ public class IdentityHelper {
         }
 
         account.getIdentityKeyStore().setIdentityTrustLevel(serviceId, identity.getIdentityKey(), trustLevel);
-        try {
-            context.getSyncHelper()
-                    .sendVerifiedMessage(address.toSignalServiceAddress(), identity.getIdentityKey(), trustLevel);
-        } catch (IOException e) {
-            logger.warn("Failed to send verification sync message: {}", e.getMessage());
-        }
+        context.getSyncHelper()
+                .sendVerifiedMessage(address.toSignalServiceAddress(), identity.getIdentityKey(), trustLevel);
 
         return true;
     }
index 6d5f2aa180c9e97c32cfbd032ce2a466657b662e..1631ad9d37323045bb7159177012f25d49b5ac85 100644 (file)
@@ -212,10 +212,11 @@ public final class ProfileHelper {
 
         if (avatar != null) {
             if (avatar.isPresent()) {
-                final var streamDetails = Utils.createStreamDetails(avatar.get()).first();
-                context.getAvatarStore()
-                        .storeProfileAvatar(account.getSelfRecipientAddress(),
-                                outputStream -> IOUtils.copyStream(streamDetails.getStream(), outputStream));
+                try (final var streamDetails = Utils.createStreamDetails(avatar.get()).first()) {
+                    context.getAvatarStore()
+                            .storeProfileAvatar(account.getSelfRecipientAddress(),
+                                    outputStream -> IOUtils.copyStream(streamDetails.getStream(), outputStream));
+                }
             } else {
                 context.getAvatarStore().deleteProfileAvatar(account.getSelfRecipientAddress());
             }
index adc4e1d48b8ef5abe9bdab53cb2b141e05a7060b..77aa26573053b1289fb9947baae7eec0edc98cd1 100644 (file)
@@ -13,6 +13,7 @@ import org.asamk.signal.manager.util.MimeUtils;
 import org.signal.libsignal.protocol.IdentityKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.whispersystems.signalservice.api.messages.SendMessageResult;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
 import org.whispersystems.signalservice.api.messages.multidevice.BlockedListMessage;
@@ -73,8 +74,8 @@ public class SyncHelper {
         requestSyncData(SyncMessage.Request.Type.PNI_IDENTITY);
     }
 
-    public void sendSyncFetchProfileMessage() {
-        context.getSendHelper()
+    public SendMessageResult sendSyncFetchProfileMessage() {
+        return context.getSendHelper()
                 .sendSyncMessage(SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.LOCAL_PROFILE));
     }
 
@@ -193,7 +194,7 @@ public class SyncHelper {
         }
     }
 
-    public void sendBlockedList() {
+    public SendMessageResult sendBlockedList() {
         var addresses = new ArrayList<SignalServiceAddress>();
         for (var record : account.getContactStore().getContacts()) {
             if (record.second().isBlocked()) {
@@ -206,30 +207,33 @@ public class SyncHelper {
                 groupIds.add(record.getGroupId().serialize());
             }
         }
-        context.getSendHelper()
+        return context.getSendHelper()
                 .sendSyncMessage(SignalServiceSyncMessage.forBlocked(new BlockedListMessage(addresses, groupIds)));
     }
 
-    public void sendVerifiedMessage(
+    public SendMessageResult sendVerifiedMessage(
             SignalServiceAddress destination, IdentityKey identityKey, TrustLevel trustLevel
-    ) throws IOException {
+    ) {
         var verifiedMessage = new VerifiedMessage(destination,
                 identityKey,
                 trustLevel.toVerifiedState(),
                 System.currentTimeMillis());
-        context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forVerified(verifiedMessage));
+        return context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forVerified(verifiedMessage));
     }
 
-    public void sendKeysMessage() {
+    public SendMessageResult sendKeysMessage() {
         var keysMessage = new KeysMessage(Optional.ofNullable(account.getStorageKey()));
-        context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forKeys(keysMessage));
+        return context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forKeys(keysMessage));
     }
 
-    public void sendStickerOperationsMessage(List<StickerPack> installStickers, List<StickerPack> removeStickers) {
+    public SendMessageResult sendStickerOperationsMessage(
+            List<StickerPack> installStickers, List<StickerPack> removeStickers
+    ) {
         var installStickerMessages = installStickers.stream().map(s -> getStickerPackOperationMessage(s, true));
         var removeStickerMessages = removeStickers.stream().map(s -> getStickerPackOperationMessage(s, false));
         var stickerMessages = Stream.concat(installStickerMessages, removeStickerMessages).toList();
-        context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forStickerPackOperations(stickerMessages));
+        return context.getSendHelper()
+                .sendSyncMessage(SignalServiceSyncMessage.forStickerPackOperations(stickerMessages));
     }
 
     private static StickerPackOperationMessage getStickerPackOperationMessage(
@@ -240,13 +244,13 @@ public class SyncHelper {
                 installed ? StickerPackOperationMessage.Type.INSTALL : StickerPackOperationMessage.Type.REMOVE);
     }
 
-    public void sendConfigurationMessage() {
+    public SendMessageResult sendConfigurationMessage() {
         final var config = account.getConfigurationStore();
         var configurationMessage = new ConfigurationMessage(Optional.ofNullable(config.getReadReceipts()),
                 Optional.ofNullable(config.getUnidentifiedDeliveryIndicators()),
                 Optional.ofNullable(config.getTypingIndicators()),
                 Optional.ofNullable(config.getLinkPreviews()));
-        context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forConfiguration(configurationMessage));
+        return context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forConfiguration(configurationMessage));
     }
 
     public void handleSyncDeviceGroups(final InputStream input) {
@@ -344,10 +348,10 @@ public class SyncHelper {
         }
     }
 
-    private void requestSyncData(final SyncMessage.Request.Type type) {
+    private SendMessageResult requestSyncData(final SyncMessage.Request.Type type) {
         var r = new SyncMessage.Request.Builder().type(type).build();
         var message = SignalServiceSyncMessage.forRequest(new RequestMessage(r));
-        context.getSendHelper().sendSyncMessage(message);
+        return context.getSendHelper().sendSyncMessage(message);
     }
 
     private Optional<SignalServiceAttachmentStream> createContactAvatarAttachment(RecipientAddress address) throws IOException {
index 0461254a4235b68fd27eb9b6f76dae76bf065d06..4dc1ede28999964f1427a5ab64a360dee164a389 100644 (file)
@@ -125,11 +125,7 @@ public class MultiAccountManagerImpl implements MultiAccountManager {
     public void close() {
         synchronized (managers) {
             for (var m : new ArrayList<>(managers)) {
-                try {
-                    m.close();
-                } catch (IOException e) {
-                    logger.warn("Cleanup failed", e);
-                }
+                m.close();
             }
             managers.clear();
         }
index 3d0d937402e2f5bfac677d8cccfc71d70544862b..717046988d73266edd9fbb6b0accb2c703a21d83 100644 (file)
@@ -47,7 +47,7 @@ public abstract class Database implements AutoCloseable {
     }
 
     @Override
-    public void close() throws SQLException {
+    public void close() {
         dataSource.close();
     }
 
index 57300b11b4f5b22b853e00356bbc63244b43a283..2d33555d0913ef5ced1bf43ca3a20c38c2ca833c 100644 (file)
@@ -1610,11 +1610,7 @@ public class SignalAccount implements Closeable {
     public void close() {
         synchronized (fileChannel) {
             if (accountDatabase != null) {
-                try {
-                    accountDatabase.close();
-                } catch (SQLException e) {
-                    logger.warn("Failed to close account database: {}", e.getMessage(), e);
-                }
+                accountDatabase.close();
             }
             if (messageSendLogStore != null) {
                 messageSendLogStore.close();
index 0e9fc5fcad845780ca1a29b8d7da125947b87ba2..55c5adf0935e1e970a44fe3b433f16b47b0abb13 100644 (file)
@@ -252,18 +252,14 @@ public class AccountsStore {
     }
 
     private void saveAccountsLocked(FileChannel fileChannel, AccountsStorage accountsStorage) throws IOException {
-        try {
-            try (var output = new ByteArrayOutputStream()) {
-                // Write to memory first to prevent corrupting the file in case of serialization errors
-                objectMapper.writeValue(output, accountsStorage);
-                var input = new ByteArrayInputStream(output.toByteArray());
-                fileChannel.position(0);
-                input.transferTo(Channels.newOutputStream(fileChannel));
-                fileChannel.truncate(fileChannel.position());
-                fileChannel.force(false);
-            }
-        } catch (Exception e) {
-            logger.error("Error saving accounts file: {}", e.getMessage(), e);
+        try (var output = new ByteArrayOutputStream()) {
+            // Write to memory first to prevent corrupting the file in case of serialization errors
+            objectMapper.writeValue(output, accountsStorage);
+            var input = new ByteArrayInputStream(output.toByteArray());
+            fileChannel.position(0);
+            input.transferTo(Channels.newOutputStream(fileChannel));
+            fileChannel.truncate(fileChannel.position());
+            fileChannel.force(false);
         }
     }
 
index 85ebcd2b3c1fe760fe25f2c620ebd599ee5c433a..0d55529104e2b1d8675da9119c10fefdf4799276 100644 (file)
@@ -9,9 +9,9 @@ import java.util.Date;
 public class LegacyIdentityInfo {
 
     RecipientAddress address;
-    IdentityKey identityKey;
-    TrustLevel trustLevel;
-    Date added;
+    final IdentityKey identityKey;
+    final TrustLevel trustLevel;
+    final Date added;
 
     LegacyIdentityInfo(RecipientAddress address, IdentityKey identityKey, TrustLevel trustLevel, Date added) {
         this.address = address;
index 2cb984fb643c91814e01766f9c4e7baff13bd89d..c6097cd9cb43863cef15a8e5f4cdd4596d8a21fb 100644 (file)
@@ -4,11 +4,11 @@ import org.asamk.signal.manager.storage.recipients.RecipientAddress;
 
 public class LegacySessionInfo {
 
-    public RecipientAddress address;
+    public final RecipientAddress address;
 
-    public int deviceId;
+    public final int deviceId;
 
-    public byte[] sessionRecord;
+    public final byte[] sessionRecord;
 
     LegacySessionInfo(final RecipientAddress address, final int deviceId, final byte[] sessionRecord) {
         this.address = address;
index 6885a8af0645ad18c11793672828eb8f0074c56e..0fc00113f6bab36cf689ddb7d7a54c914b6110cf 100644 (file)
@@ -1,3 +1,3 @@
 package org.asamk.signal.manager.storage.recipients;
 
-record RecipientWithAddress(RecipientId id, RecipientAddress address) {}
+public record RecipientWithAddress(RecipientId id, RecipientAddress address) {}
index ebbd87aa6fd75c1edaf18e9cd6b7d76ad8333959..b8c0a32256e1a42668db921ada2a23a88edf03d2 100644 (file)
@@ -328,7 +328,7 @@ public class SessionStore implements SignalServiceSessionStore {
         return new Key(address, deviceId);
     }
 
-    private SessionRecord getSessionRecordFromResultSet(ResultSet resultSet) throws SQLException {
+    private SessionRecord getSessionRecordFromResultSet(ResultSet resultSet) {
         try {
             final var record = resultSet.getBytes("record");
             return new SessionRecord(record);
index 7e5fd2423b2843ead2b4a8fa09721794752fd1cc..428e9e95059518bc9994f2c46d44d156fb60751a 100644 (file)
@@ -25,7 +25,7 @@ public class LegacyJsonThreadStore {
     @JsonProperty("threads")
     @JsonSerialize(using = MapToListSerializer.class)
     @JsonDeserialize(using = ThreadsDeserializer.class)
-    private Map<String, LegacyThreadInfo> threads = new HashMap<>();
+    private final Map<String, LegacyThreadInfo> threads = new HashMap<>();
 
     public List<LegacyThreadInfo> getThreads() {
         return new ArrayList<>(threads.values());
index b1568bdc21494261652964af48372c8d3e495604..b3c9457baed7e92ce09ace5a36e5a159a6a57220 100644 (file)
@@ -69,7 +69,7 @@ public class MessageCacheUtils {
                 if (version >= 2) {
                     serverReceivedTimestamp = in.readLong();
                     uuid = in.readUTF();
-                    if ("".equals(uuid)) {
+                    if (uuid.isEmpty()) {
                         uuid = null;
                     }
                 }
index a617ce93c643ef3eb5650edb4f34432b60acab3f..770054f32aba08ac401d0981dd6eb3dc9b6e2f7a 100644 (file)
@@ -27,14 +27,14 @@ class MergeRecipientHelperTest {
     static final PartialAddresses ADDR_A = new PartialAddresses(SERVICE_ID_A, PNI_A, NUMBER_A);
     static final PartialAddresses ADDR_B = new PartialAddresses(SERVICE_ID_B, PNI_B, NUMBER_B);
 
-    static T[] testInstancesNone = new T[]{
+    static final T[] testInstancesNone = new T[]{
             new T(Set.of(), ADDR_A.FULL, Set.of(rec(1000000, ADDR_A.FULL))),
             new T(Set.of(), ADDR_A.ACI_NUM, Set.of(rec(1000000, ADDR_A.ACI_NUM))),
             new T(Set.of(), ADDR_A.ACI_PNI, Set.of(rec(1000000, ADDR_A.ACI_PNI))),
             new T(Set.of(), ADDR_A.PNI_NUM, Set.of(rec(1000000, ADDR_A.PNI_NUM))),
     };
 
-    static T[] testInstancesSingle = new T[]{
+    static final T[] testInstancesSingle = new T[]{
             new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.PNI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
@@ -74,7 +74,7 @@ class MergeRecipientHelperTest {
             new T(Set.of(rec(1, ADDR_A.FULL)), ADDR_B.FULL, Set.of(rec(1, ADDR_A.FULL), rec(1000000, ADDR_B.FULL))),
     };
 
-    static T[] testInstancesTwo = new T[]{
+    static final T[] testInstancesTwo = new T[]{
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI_NUM)), ADDR_A.FULL, Set.of(rec(1, ADDR_A.FULL))),
@@ -100,7 +100,7 @@ class MergeRecipientHelperTest {
             new T(Set.of(rec(1, ADDR_A.PNI), rec(2, ADDR_A.ACI_NUM)), ADDR_A.ACI_PNI, Set.of(rec(2, ADDR_A.FULL))),
     };
 
-    static T[] testInstancesThree = new T[]{
+    static final T[] testInstancesThree = new T[]{
             new T(Set.of(rec(1, ADDR_A.ACI), rec(2, ADDR_A.PNI), rec(3, ADDR_A.NUM)),
                     ADDR_A.FULL,
                     Set.of(rec(1, ADDR_A.FULL))),
index 1f2caa1812d1d0a9d43e8e7a26f7f83b66863947..cd73b9f0897af835116b6de2f1102c6dbf343e9d 100644 (file)
@@ -68,9 +68,10 @@ This can be piped to a QR encoder to create a display that can be captured by a
 
 For example:
 
-```
+[source]
+----
 dbus-send --session --dest=org.asamk.Signal --type=method_call --print-reply /org/asamk/Signal org.asamk.Signal.link string:"My secondary client" | tr '\n' '\0' | sed 's/.*string //g' | sed 's/\"//g' | qrencode -s10 -tANSI256
-```
+----
 
 listAccounts() -> accountList<as>::
 * accountList : Array of all attached accounts in DBus object path form
index c4e3a26ef228f879cd142d94a42662ccc02bcde3..1fab81029d3c5111f49792f31686c0a6c4e5baec 100644 (file)
@@ -138,9 +138,9 @@ public interface Signal extends DBusInterface {
 
     DBusPath getDevice(long deviceId);
 
-    public DBusPath getIdentity(String number);
+    DBusPath getIdentity(String number);
 
-    public List<StructIdentity> listIdentities();
+    List<StructIdentity> listIdentities();
 
     List<StructDevice> listDevices() throws Error.Failure;
 
@@ -497,13 +497,13 @@ public interface Signal extends DBusInterface {
     class StructDevice extends Struct {
 
         @Position(0)
-        DBusPath objectPath;
+        final DBusPath objectPath;
 
         @Position(1)
-        Long id;
+        final Long id;
 
         @Position(2)
-        String name;
+        final String name;
 
         public StructDevice(final DBusPath objectPath, final Long id, final String name) {
             this.objectPath = objectPath;
@@ -542,13 +542,13 @@ public interface Signal extends DBusInterface {
     class StructGroup extends Struct {
 
         @Position(0)
-        DBusPath objectPath;
+        final DBusPath objectPath;
 
         @Position(1)
-        byte[] id;
+        final byte[] id;
 
         @Position(2)
-        String name;
+        final String name;
 
         public StructGroup(final DBusPath objectPath, final byte[] id, final String name) {
             this.objectPath = objectPath;
@@ -610,13 +610,13 @@ public interface Signal extends DBusInterface {
     class StructIdentity extends Struct {
 
         @Position(0)
-        DBusPath objectPath;
+        final DBusPath objectPath;
 
         @Position(1)
-        String uuid;
+        final String uuid;
 
         @Position(2)
-        String number;
+        final String number;
 
         public StructIdentity(final DBusPath objectPath, final String uuid, final String number) {
             this.objectPath = objectPath;
index 9ac4b190813aa0480e3538cab98a44dfacfe98dd..f0ebbfaea48012573625ed4f639b5e6c2989bb8b 100644 (file)
@@ -165,20 +165,7 @@ public class App {
                 return;
             }
 
-            Set<String> accounts;
-            try {
-                accounts = signalAccountFiles.getAllLocalAccountNumbers();
-            } catch (IOException e) {
-                throw new IOErrorException("Failed to load local accounts file", e);
-            }
-            if (accounts.size() == 0) {
-                throw new UserErrorException("No local users found, you first need to register or link an account");
-            } else if (accounts.size() > 1) {
-                throw new UserErrorException(
-                        "Multiple users found, you need to specify an account (phone number) with -a");
-            }
-
-            account = accounts.stream().findFirst().get();
+            account = getAccountIfOnlyOne(signalAccountFiles);
         } else if (!Manager.isValidNumber(account, null)) {
             throw new UserErrorException("Invalid account (phone number), make sure you include the country code.");
         }
@@ -196,6 +183,21 @@ public class App {
         throw new UserErrorException("Command only works in multi-account mode");
     }
 
+    private static String getAccountIfOnlyOne(final SignalAccountFiles signalAccountFiles) throws IOErrorException, UserErrorException {
+        Set<String> accounts;
+        try {
+            accounts = signalAccountFiles.getAllLocalAccountNumbers();
+        } catch (IOException e) {
+            throw new IOErrorException("Failed to load local accounts file", e);
+        }
+        if (accounts.isEmpty()) {
+            throw new UserErrorException("No local users found, you first need to register or link an account");
+        } else if (accounts.size() > 1) {
+            throw new UserErrorException("Multiple users found, you need to specify an account (phone number) with -a");
+        }
+        return accounts.stream().findFirst().get();
+    }
+
     private OutputWriter getOutputWriter(final Command command) throws UserErrorException {
         final var outputTypeInput = ns.<OutputType>get("output");
         final var outputType = outputTypeInput == null ? command.getSupportedOutputTypes()
@@ -274,8 +276,6 @@ public class App {
     ) throws CommandException {
         try (var m = loadManager(account, signalAccountFiles)) {
             commandHandler.handleLocalCommand(command, m);
-        } catch (IOException e) {
-            logger.warn("Cleanup failed", e);
         }
     }
 
index 1eec6c9947b8ac49ba4ac920161b11ab74910cb1..adae7c4d97f036ac22ee1c57ca2b969390b8906a 100644 (file)
@@ -10,8 +10,6 @@ import org.asamk.signal.manager.api.SendMessageResults;
 import org.asamk.signal.output.OutputWriter;
 import org.asamk.signal.util.CommandUtil;
 
-import java.io.IOException;
-
 import static org.asamk.signal.util.SendMessageResultUtils.outputResult;
 
 public class SendReceiptCommand implements JsonRpcLocalCommand {
@@ -45,19 +43,14 @@ public class SendReceiptCommand implements JsonRpcLocalCommand {
         final var targetTimestamps = ns.<Long>getList("target-timestamp");
         final var type = ns.getString("type");
 
-        try {
-            final SendMessageResults results;
-            if (type == null || "read".equals(type)) {
-                results = m.sendReadReceipt(recipient, targetTimestamps);
-            } else if ("viewed".equals(type)) {
-                results = m.sendViewedReceipt(recipient, targetTimestamps);
-            } else {
-                throw new UserErrorException("Unknown receipt type: " + type);
-            }
-            outputResult(outputWriter, results);
-        } catch (IOException e) {
-            throw new UserErrorException("Failed to send message: " + e.getMessage() + " (" + e.getClass()
-                    .getSimpleName() + ")");
+        final SendMessageResults results;
+        if (type == null || "read".equals(type)) {
+            results = m.sendReadReceipt(recipient, targetTimestamps);
+        } else if ("viewed".equals(type)) {
+            results = m.sendViewedReceipt(recipient, targetTimestamps);
+        } else {
+            throw new UserErrorException("Unknown receipt type: " + type);
         }
+        outputResult(outputWriter, results);
     }
 }
index 73bac05697aae338be76d775f01083205479e85d..d1feff8a9dc636412d1fa14d5b5513f948baa709 100644 (file)
@@ -4,14 +4,12 @@ import net.sourceforge.argparse4j.inf.Namespace;
 import net.sourceforge.argparse4j.inf.Subparser;
 
 import org.asamk.signal.commands.exceptions.CommandException;
-import org.asamk.signal.commands.exceptions.IOErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.api.Configuration;
 import org.asamk.signal.manager.api.NotPrimaryDeviceException;
 import org.asamk.signal.output.OutputWriter;
 
-import java.io.IOException;
 import java.util.Optional;
 
 public class UpdateConfigurationCommand implements JsonRpcLocalCommand {
@@ -51,8 +49,6 @@ public class UpdateConfigurationCommand implements JsonRpcLocalCommand {
                     Optional.ofNullable(unidentifiedDeliveryIndicators),
                     Optional.ofNullable(typingIndicators),
                     Optional.ofNullable(linkPreviews)));
-        } catch (IOException e) {
-            throw new IOErrorException("UpdateAccount error: " + e.getMessage(), e);
         } catch (NotPrimaryDeviceException e) {
             throw new UserErrorException("This command doesn't work on linked devices.");
         }
index 290ab647f0326f7b4170c809bffa12a75a1ed3bf..49aa0e27775556d0055464294f5086f4fef77578 100644 (file)
@@ -136,7 +136,7 @@ public class DbusManagerImpl implements Manager {
     }
 
     @Override
-    public void updateConfiguration(Configuration newConfiguration) throws IOException {
+    public void updateConfiguration(Configuration newConfiguration) {
         final var configuration = getRemoteObject(new DBusPath(signal.getObjectPath() + "/Configuration"),
                 Signal.Configuration.class);
         newConfiguration.readReceipts()
index 2223c96a6d31d2af3d6bf672523a3d09185c563c..95acd2cba06ec69e11a4384c70a4d61ff615abeb 100644 (file)
@@ -351,26 +351,16 @@ public class DbusSignalImpl implements Signal {
     public void sendReadReceipt(
             final String recipient, final List<Long> messageIds
     ) throws Error.Failure, Error.UntrustedIdentity {
-        try {
-            final var results = m.sendReadReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()),
-                    messageIds);
-            checkSendMessageResults(results);
-        } catch (IOException e) {
-            throw new Error.Failure(e.getMessage());
-        }
+        final var results = m.sendReadReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
+        checkSendMessageResults(results);
     }
 
     @Override
     public void sendViewedReceipt(
             final String recipient, final List<Long> messageIds
     ) throws Error.Failure, Error.UntrustedIdentity {
-        try {
-            final var results = m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()),
-                    messageIds);
-            checkSendMessageResults(results);
-        } catch (IOException e) {
-            throw new Error.Failure(e.getMessage());
-        }
+        final var results = m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
+        checkSendMessageResults(results);
     }
 
     @Override
@@ -532,8 +522,6 @@ public class DbusSignalImpl implements Signal {
             m.setContactName(getSingleRecipientIdentifier(number, m.getSelfNumber()), name, "");
         } catch (NotPrimaryDeviceException e) {
             throw new Error.Failure("This command doesn't work on linked devices.");
-        } catch (IOException e) {
-            throw new Error.Failure("Contact is not registered.");
         } catch (UnregisteredRecipientException e) {
             throw new Error.UntrustedIdentity(e.getSender().getIdentifier() + " is not registered.");
         }
@@ -1238,8 +1226,6 @@ public class DbusSignalImpl implements Signal {
                         Optional.ofNullable(unidentifiedDeliveryIndicators),
                         Optional.ofNullable(typingIndicators),
                         Optional.ofNullable(linkPreviews)));
-            } catch (IOException e) {
-                throw new Error.Failure("UpdateAccount error: " + e.getMessage());
             } catch (NotPrimaryDeviceException e) {
                 throw new Error.Failure("This command doesn't work on linked devices.");
             }