]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/manager/storage/SignalAccount.java
Make loggers private
[signal-cli] / src / main / java / org / asamk / signal / manager / storage / SignalAccount.java
index 1c35b1fb65b14fc50190fb304534f9d6cc1ced96..87b1efd4db5c954d6fbb6ad8d63aee72c3ac234e 100644 (file)
@@ -16,6 +16,7 @@ import org.asamk.signal.manager.storage.contacts.JsonContactsStore;
 import org.asamk.signal.manager.storage.groups.GroupInfo;
 import org.asamk.signal.manager.storage.groups.GroupInfoV1;
 import org.asamk.signal.manager.storage.groups.JsonGroupStore;
+import org.asamk.signal.manager.storage.messageCache.MessageCache;
 import org.asamk.signal.manager.storage.profiles.ProfileStore;
 import org.asamk.signal.manager.storage.protocol.IdentityInfo;
 import org.asamk.signal.manager.storage.protocol.JsonSignalProtocolStore;
@@ -26,6 +27,7 @@ import org.asamk.signal.manager.storage.stickers.StickerStore;
 import org.asamk.signal.manager.storage.threads.LegacyJsonThreadStore;
 import org.asamk.signal.manager.storage.threads.ThreadInfo;
 import org.asamk.signal.manager.util.IOUtils;
+import org.asamk.signal.manager.util.KeyUtils;
 import org.asamk.signal.manager.util.Utils;
 import org.signal.zkgroup.InvalidInputException;
 import org.signal.zkgroup.profiles.ProfileKey;
@@ -36,6 +38,7 @@ import org.whispersystems.libsignal.state.PreKeyRecord;
 import org.whispersystems.libsignal.state.SignedPreKeyRecord;
 import org.whispersystems.libsignal.util.Medium;
 import org.whispersystems.libsignal.util.Pair;
+import org.whispersystems.signalservice.api.crypto.UnidentifiedAccess;
 import org.whispersystems.signalservice.api.kbs.MasterKey;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.util.Base64;
@@ -56,7 +59,7 @@ import java.util.stream.Collectors;
 
 public class SignalAccount implements Closeable {
 
-    final static Logger logger = LoggerFactory.getLogger(SignalAccount.class);
+    private final static Logger logger = LoggerFactory.getLogger(SignalAccount.class);
 
     private final ObjectMapper jsonProcessor = new ObjectMapper();
     private final FileChannel fileChannel;
@@ -82,6 +85,8 @@ public class SignalAccount implements Closeable {
     private ProfileStore profileStore;
     private StickerStore stickerStore;
 
+    private MessageCache messageCache;
+
     private SignalAccount(final FileChannel fileChannel, final FileLock lock) {
         this.fileChannel = fileChannel;
         this.lock = lock;
@@ -98,6 +103,8 @@ public class SignalAccount implements Closeable {
         try {
             SignalAccount account = new SignalAccount(pair.first(), pair.second());
             account.load(dataPath);
+            account.migrateLegacyConfigs();
+
             return account;
         } catch (Throwable e) {
             pair.second().close();
@@ -126,6 +133,9 @@ public class SignalAccount implements Closeable {
         account.recipientStore = new RecipientStore();
         account.profileStore = new ProfileStore();
         account.stickerStore = new StickerStore();
+
+        account.messageCache = new MessageCache(getMessageCachePath(dataPath, username));
+
         account.registered = false;
 
         return account;
@@ -163,12 +173,40 @@ public class SignalAccount implements Closeable {
         account.recipientStore = new RecipientStore();
         account.profileStore = new ProfileStore();
         account.stickerStore = new StickerStore();
+
+        account.messageCache = new MessageCache(getMessageCachePath(dataPath, username));
+
         account.registered = true;
         account.isMultiDevice = true;
 
         return account;
     }
 
+    public void migrateLegacyConfigs() {
+        if (getProfileKey() == null && isRegistered()) {
+            // Old config file, creating new profile key
+            setProfileKey(KeyUtils.createProfileKey());
+            save();
+        }
+        // Store profile keys only in profile store
+        for (ContactInfo contact : getContactStore().getContacts()) {
+            String profileKeyString = contact.profileKey;
+            if (profileKeyString == null) {
+                continue;
+            }
+            final ProfileKey profileKey;
+            try {
+                profileKey = new ProfileKey(Base64.decode(profileKeyString));
+            } catch (InvalidInputException | IOException e) {
+                continue;
+            }
+            contact.profileKey = null;
+            getProfileStore().storeProfileKey(contact.getAddress(), profileKey);
+        }
+        // Ensure our profile key is stored in profile store
+        getProfileStore().storeProfileKey(getSelfAddress(), getProfileKey());
+    }
+
     public static File getFileName(File dataPath, String username) {
         return new File(dataPath, username);
     }
@@ -313,6 +351,8 @@ public class SignalAccount implements Closeable {
             stickerStore = new StickerStore();
         }
 
+        messageCache = new MessageCache(getMessageCachePath(dataPath, username));
+
         JsonNode threadStoreNode = rootNode.get("threadStore");
         if (threadStoreNode != null) {
             LegacyJsonThreadStore threadStore = jsonProcessor.convertValue(threadStoreNode,
@@ -431,6 +471,10 @@ public class SignalAccount implements Closeable {
         return stickerStore;
     }
 
+    public MessageCache getMessageCache() {
+        return messageCache;
+    }
+
     public String getUsername() {
         return username;
     }
@@ -451,6 +495,10 @@ public class SignalAccount implements Closeable {
         return deviceId;
     }
 
+    public void setDeviceId(final int deviceId) {
+        this.deviceId = deviceId;
+    }
+
     public String getPassword() {
         return password;
     }
@@ -491,6 +539,10 @@ public class SignalAccount implements Closeable {
         this.profileKey = profileKey;
     }
 
+    public byte[] getSelfUnidentifiedAccessKey() {
+        return UnidentifiedAccess.deriveAccessKeyFrom(getProfileKey());
+    }
+
     public int getPreKeyIdOffset() {
         return preKeyIdOffset;
     }
@@ -515,8 +567,19 @@ public class SignalAccount implements Closeable {
         isMultiDevice = multiDevice;
     }
 
+    public boolean isUnrestrictedUnidentifiedAccess() {
+        // TODO make configurable
+        return false;
+    }
+
+    public boolean isDiscoverableByPhoneNumber() {
+        // TODO make configurable
+        return true;
+    }
+
     @Override
     public void close() throws IOException {
+        save();
         synchronized (fileChannel) {
             try {
                 lock.close();