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;
return username;
}
+ private IdentityKey getIdentity() {
+ return signalProtocolStore.getIdentityKeyPair().getPublicKey();
+ }
+
public int getDeviceId() {
return deviceId;
}
}
}
- 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));
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()) {
}
}
}
- 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() {
} catch (Exception e) {
e.printStackTrace();
}
+ if (syncMessage.getBlockedList().isPresent()) {
+ // TODO store list of blocked numbers
+ }
}
if (syncMessage.getContacts().isPresent()) {
try {
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()) {
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();
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
*
save();
return true;
}
+
+ public String computeSafetyNumber(String theirUsername, IdentityKey theirIdentityKey) {
+ Fingerprint fingerprint = new NumericFingerprintGenerator(5200).createFor(username, getIdentity(), theirUsername, theirIdentityKey);
+ return fingerprint.getDisplayableFingerprint().getDisplayText();
+ }
}