]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/Manager.java
Add support for new safety numbers, that replace the hex fingerprint
[signal-cli] / src / main / java / org / asamk / signal / Manager.java
index 6bd8c65716e83bb06c20566bd41bccd593c98973..e02258f19918967c9e9f3afeec3454c8c1a8cf63 100644 (file)
@@ -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;
     }
@@ -1017,6 +1023,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 +1037,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 +1276,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 +1336,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<JsonIdentityKeyStore.Identity> 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 +1377,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();
+    }
 }