From: AsamK Date: Sun, 11 Jun 2017 14:28:03 +0000 (+0200) Subject: Send and receive verified messages X-Git-Tag: v0.5.6~4 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/4377a2179b38360b00efc1c1db00a62f3f020db1?ds=sidebyside Send and receive verified messages Fixes #85 --- diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index 79174549..a9097fc9 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -992,6 +992,16 @@ public class Main { System.out.println(" - " + number); } } + if (syncMessage.getVerified().isPresent()) { + System.out.println("Received sync message with verified identities:"); + final List verifiedList = syncMessage.getVerified().get(); + for (VerifiedMessage v : verifiedList) { + System.out.println(" - " + v.getDestination() + ": " + v.getVerified()); + String safetyNumber = formatSafetyNumber(m.computeSafetyNumber(v.getDestination(), v.getIdentityKey())); + System.out.println(" " + safetyNumber); + } + + } } } } else { diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index a38d313f..c9252f83 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -96,7 +96,7 @@ class Manager implements Signal { private final static int PREKEY_MINIMUM_COUNT = 20; private static final int PREKEY_BATCH_SIZE = 100; - private static final int MAX_ATTACHMENT_SIZE = 150 * 1024 * 1024; + private static final int MAX_ATTACHMENT_SIZE = 150 * 1024 * 1024; private final String settingsPath; private final String dataPath; @@ -559,7 +559,7 @@ class Manager implements Signal { mime = "application/octet-stream"; } // TODO mabybe add a parameter to set the voiceNote and preview option - return new SignalServiceAttachmentStream(attachmentStream, mime, attachmentSize, Optional.of(attachmentFile.getName()), false, Optional.absent(),null); + return new SignalServiceAttachmentStream(attachmentStream, mime, attachmentSize, Optional.of(attachmentFile.getName()), false, Optional.absent(), null); } private Optional createGroupAvatarAttachment(byte[] groupId) throws IOException { @@ -1199,6 +1199,7 @@ class Manager implements Signal { if (rm.isContactsRequest()) { try { sendContacts(); + sendVerifiedMessage(); } catch (UntrustedIdentityException | IOException e) { e.printStackTrace(); } @@ -1288,6 +1289,12 @@ class Manager implements Signal { } } } + if (syncMessage.getVerified().isPresent()) { + final List verifiedList = syncMessage.getVerified().get(); + for (VerifiedMessage v : verifiedList) { + signalProtocolStore.saveIdentity(v.getDestination(), v.getIdentityKey(), TrustLevel.fromVerifiedState(v.getVerified())); + } + } } } } @@ -1523,6 +1530,26 @@ class Manager implements Signal { } } + private void sendVerifiedMessage() throws IOException, UntrustedIdentityException { + List verifiedMessages = new LinkedList<>(); + for (Map.Entry> x : getIdentities().entrySet()) { + final String name = x.getKey(); + for (JsonIdentityKeyStore.Identity id : x.getValue()) { + if (id.getTrustLevel() == TrustLevel.TRUSTED_UNVERIFIED) { + continue; + } + VerifiedMessage verifiedMessage = new VerifiedMessage(name, id.getIdentityKey(), id.getTrustLevel().toVerifiedState()); + verifiedMessages.add(verifiedMessage); + } + } + sendSyncMessage(SignalServiceSyncMessage.forVerified(verifiedMessages)); + } + + private void sendVerifiedMessage(String destination, IdentityKey identityKey, TrustLevel trustLevel) throws IOException, UntrustedIdentityException { + VerifiedMessage verifiedMessage = new VerifiedMessage(destination, identityKey, trustLevel.toVerifiedState()); + sendSyncMessage(SignalServiceSyncMessage.forVerified(verifiedMessage)); + } + public ContactInfo getContact(String number) { return contactStore.getContact(number); } @@ -1556,6 +1583,11 @@ class Manager implements Signal { } signalProtocolStore.saveIdentity(name, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED); + try { + sendVerifiedMessage(name, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED); + } catch (IOException | UntrustedIdentityException e) { + e.printStackTrace(); + } save(); return true; } @@ -1579,6 +1611,11 @@ class Manager implements Signal { } signalProtocolStore.saveIdentity(name, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED); + try { + sendVerifiedMessage(name, id.getIdentityKey(), TrustLevel.TRUSTED_VERIFIED); + } catch (IOException | UntrustedIdentityException e) { + e.printStackTrace(); + } save(); return true; } @@ -1598,6 +1635,11 @@ class Manager implements Signal { for (JsonIdentityKeyStore.Identity id : ids) { if (id.getTrustLevel() == TrustLevel.UNTRUSTED) { signalProtocolStore.saveIdentity(name, id.getIdentityKey(), TrustLevel.TRUSTED_UNVERIFIED); + try { + sendVerifiedMessage(name, id.getIdentityKey(), TrustLevel.TRUSTED_UNVERIFIED); + } catch (IOException | UntrustedIdentityException e) { + e.printStackTrace(); + } } } save(); diff --git a/src/main/java/org/asamk/signal/TrustLevel.java b/src/main/java/org/asamk/signal/TrustLevel.java index e9e7796d..5eaf960a 100644 --- a/src/main/java/org/asamk/signal/TrustLevel.java +++ b/src/main/java/org/asamk/signal/TrustLevel.java @@ -1,5 +1,7 @@ package org.asamk.signal; +import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage; + public enum TrustLevel { UNTRUSTED, TRUSTED_UNVERIFIED, @@ -13,4 +15,28 @@ public enum TrustLevel { } return TrustLevel.cachedValues[i]; } + + public static TrustLevel fromVerifiedState(VerifiedMessage.VerifiedState verifiedState) { + switch (verifiedState) { + case DEFAULT: + return TRUSTED_UNVERIFIED; + case UNVERIFIED: + return UNTRUSTED; + case VERIFIED: + return TRUSTED_VERIFIED; + } + throw new RuntimeException("Unknown verified state: " + verifiedState); + } + + public VerifiedMessage.VerifiedState toVerifiedState() { + switch (this) { + case TRUSTED_UNVERIFIED: + return VerifiedMessage.VerifiedState.DEFAULT; + case UNTRUSTED: + return VerifiedMessage.VerifiedState.UNVERIFIED; + case TRUSTED_VERIFIED: + return VerifiedMessage.VerifiedState.VERIFIED; + } + throw new RuntimeException("Unknown verified state: " + this); + } }