X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/b2289568efb9f9c0fed3fac019ae082a05cd39f5..6c9f26f49b46d39421e822cf0be6b299f161c5bf:/src/main/java/org/asamk/signal/Manager.java diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 6bd8c657..34bb5068 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -31,6 +31,8 @@ import org.whispersystems.libsignal.*; import org.whispersystems.libsignal.ecc.Curve; import org.whispersystems.libsignal.ecc.ECKeyPair; import org.whispersystems.libsignal.ecc.ECPublicKey; +import org.whispersystems.libsignal.fingerprint.Fingerprint; +import org.whispersystems.libsignal.fingerprint.NumericFingerprintGenerator; import org.whispersystems.libsignal.state.PreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyRecord; import org.whispersystems.libsignal.util.KeyHelper; @@ -125,6 +127,10 @@ class Manager implements Signal { return username; } + private IdentityKey getIdentity() { + return signalProtocolStore.getIdentityKeyPair().getPublicKey(); + } + public int getDeviceId() { return deviceId; } @@ -205,7 +211,23 @@ class Manager implements Signal { } } - public void load() throws IOException, InvalidKeyException { + public void init() throws IOException { + load(); + + migrateLegacyConfigs(); + + accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, deviceId, USER_AGENT); + try { + if (registered && accountManager.getPreKeysCount() < PREKEY_MINIMUM_COUNT) { + refreshPreKeys(); + save(); + } + } catch (AuthorizationFailedException e) { + System.err.println("Authorization failed, was the number registered elsewhere?"); + } + } + + private void load() throws IOException { openFileChannel(); JsonNode rootNode = jsonProcessot.readTree(Channels.newInputStream(fileChannel)); @@ -237,10 +259,21 @@ class Manager implements Signal { if (groupStore == null) { groupStore = new JsonGroupStore(); } + + JsonNode contactStoreNode = rootNode.get("contactStore"); + if (contactStoreNode != null) { + contactStore = jsonProcessot.convertValue(contactStoreNode, JsonContactsStore.class); + } + if (contactStore == null) { + contactStore = new JsonContactsStore(); + } + } + + private void migrateLegacyConfigs() { // Copy group avatars that were previously stored in the attachments folder // to the new avatar folder - if (groupStore.groupsWithLegacyAvatarId.size() > 0) { - for (GroupInfo g : groupStore.groupsWithLegacyAvatarId) { + if (JsonGroupStore.groupsWithLegacyAvatarId.size() > 0) { + for (GroupInfo g : JsonGroupStore.groupsWithLegacyAvatarId) { File avatarFile = getGroupAvatarFile(g.groupId); File attachmentFile = getAttachmentFile(g.getAvatarId()); if (!avatarFile.exists() && attachmentFile.exists()) { @@ -252,27 +285,9 @@ class Manager implements Signal { } } } - groupStore.groupsWithLegacyAvatarId.clear(); + JsonGroupStore.groupsWithLegacyAvatarId.clear(); save(); } - - JsonNode contactStoreNode = rootNode.get("contactStore"); - if (contactStoreNode != null) { - contactStore = jsonProcessot.convertValue(contactStoreNode, JsonContactsStore.class); - } - if (contactStore == null) { - contactStore = new JsonContactsStore(); - } - - accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, deviceId, USER_AGENT); - try { - if (registered && accountManager.getPreKeysCount() < PREKEY_MINIMUM_COUNT) { - refreshPreKeys(); - save(); - } - } catch (AuthorizationFailedException e) { - System.err.println("Authorization failed, was the number registered elsewhere?"); - } } private void save() { @@ -1017,6 +1032,9 @@ class Manager implements Signal { } catch (Exception e) { e.printStackTrace(); } + if (syncMessage.getBlockedList().isPresent()) { + // TODO store list of blocked numbers + } } if (syncMessage.getContacts().isPresent()) { try { @@ -1028,6 +1046,9 @@ class Manager implements Signal { if (c.getName().isPresent()) { contact.name = c.getName().get(); } + if (c.getColor().isPresent()) { + contact.color = c.getColor().get(); + } contactStore.updateContact(contact); if (c.getAvatar().isPresent()) { @@ -1264,7 +1285,7 @@ class Manager implements Signal { try { for (ContactInfo record : contactStore.getContacts()) { out.write(new DeviceContact(record.number, Optional.fromNullable(record.name), - createContactAvatarAttachment(record.number))); + createContactAvatarAttachment(record.number), Optional.fromNullable(record.color))); } } finally { out.close(); @@ -1324,6 +1345,29 @@ class Manager implements Signal { return false; } + /** + * Trust this the identity with this safety number + * + * @param name username of the identity + * @param safetyNumber Safety number + */ + public boolean trustIdentityVerifiedSafetyNumber(String name, String safetyNumber) { + List ids = signalProtocolStore.getIdentities(name); + if (ids == null) { + return false; + } + for (JsonIdentityKeyStore.Identity id : ids) { + if (!safetyNumber.equals(computeSafetyNumber(name, id.identityKey))) { + continue; + } + + signalProtocolStore.saveIdentity(name, id.identityKey, TrustLevel.TRUSTED_VERIFIED); + save(); + return true; + } + return false; + } + /** * Trust all keys of this identity without verification * @@ -1342,4 +1386,9 @@ class Manager implements Signal { save(); return true; } + + public String computeSafetyNumber(String theirUsername, IdentityKey theirIdentityKey) { + Fingerprint fingerprint = new NumericFingerprintGenerator(5200).createFor(username, getIdentity(), theirUsername, theirIdentityKey); + return fingerprint.getDisplayableFingerprint().getDisplayText(); + } }