From 85171ee71b3ef4cf31fe6c9e2e222d7b4523e0e8 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sun, 17 Dec 2017 16:53:59 +0100 Subject: [PATCH] Temp commit --- .../omemo/signal/SignalOmemoRatchet.java | 11 +- .../omemo/signal/SignalOmemoService.java | 8 +- .../signal/SignalOmemoStoreConnector.java | 26 ++-- .../omemo/LegacySignalOmemoKeyUtilTest.java | 26 ---- .../smackx/omemo/OmemoManager.java | 118 +++++++++++------- .../smackx/omemo/OmemoRatchet.java | 32 +++-- .../smackx/omemo/OmemoService.java | 97 +++++++------- .../jivesoftware/smackx/omemo/OmemoStore.java | 4 +- .../smackx/omemo/element/OmemoElement.java | 2 +- ...OmemoCarbonCopyStanzaReceivedListener.java | 2 +- .../OmemoMessageStanzaReceivedListener.java | 2 +- .../smackx/omemo/trust/OmemoFingerprint.java | 14 +++ .../smackx/omemo/util/OmemoKeyUtil.java | 43 +------ .../omemo/util/OmemoMessageBuilder.java | 6 +- 14 files changed, 195 insertions(+), 196 deletions(-) diff --git a/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoRatchet.java b/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoRatchet.java index 4898bc34b..d1bfafbcb 100644 --- a/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoRatchet.java +++ b/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoRatchet.java @@ -62,13 +62,13 @@ public class SignalOmemoRatchet private static final Logger LOGGER = Logger.getLogger(OmemoRatchet.class.getName()); private final SignalOmemoStoreConnector storeConnector; - SignalOmemoRatchet(OmemoManager.KnownBareJidGuard managerGuard, + SignalOmemoRatchet(OmemoManager omemoManager, OmemoStore store) { - super(managerGuard, store); - this.storeConnector = new SignalOmemoStoreConnector(managerGuard, store); + super(omemoManager, store); + this.storeConnector = new SignalOmemoStoreConnector(omemoManager, store); } @Override @@ -157,8 +157,7 @@ public class SignalOmemoRatchet } private SessionCipher getCipher(OmemoDevice device) { - SignalOmemoKeyUtil keyUtil = (SignalOmemoKeyUtil) store.keyUtil(); - SignalProtocolAddress address = keyUtil.omemoDeviceAsAddress(device); - return new SessionCipher(storeConnector, storeConnector, storeConnector, storeConnector, address); + return new SessionCipher(storeConnector, storeConnector, storeConnector, storeConnector, + SignalOmemoStoreConnector.asAddress(device)); } } diff --git a/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoService.java b/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoService.java index 50164b747..889203430 100644 --- a/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoService.java +++ b/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoService.java @@ -66,7 +66,7 @@ public final class SignalOmemoService @Override protected SignalOmemoRatchet instantiateOmemoRatchet( - OmemoManager.KnownBareJidGuard manager, + OmemoManager manager, OmemoStore store) { @@ -111,14 +111,14 @@ public final class SignalOmemoService } @Override - protected void processBundle(OmemoManager.KnownBareJidGuard managerGuard, + protected void processBundle(OmemoManager.LoggedInOmemoManager managerGuard, PreKeyBundle preKeyBundle, OmemoDevice device) throws CorruptedOmemoKeyException { - SignalOmemoStoreConnector connector = new SignalOmemoStoreConnector(managerGuard, getOmemoStoreBackend()); + SignalOmemoStoreConnector connector = new SignalOmemoStoreConnector(managerGuard.get(), getOmemoStoreBackend()); SessionBuilder builder = new SessionBuilder(connector, connector, connector, connector, - getOmemoStoreBackend().keyUtil().omemoDeviceAsAddress(device)); + SignalOmemoStoreConnector.asAddress(device)); try { builder.process(preKeyBundle); LOGGER.log(Level.FINE, "Session built with " + device); diff --git a/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoStoreConnector.java b/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoStoreConnector.java index ba7c30faa..921bc855a 100644 --- a/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoStoreConnector.java +++ b/smack-omemo-signal/src/main/java/org/jivesoftware/smackx/omemo/signal/SignalOmemoStoreConnector.java @@ -59,20 +59,20 @@ public class SignalOmemoStoreConnector private static final Logger LOGGER = Logger.getLogger(SignalOmemoStoreConnector.class.getName()); - private final OmemoManager.KnownBareJidGuard managerGuard; + private final OmemoManager omemoManager; private final OmemoStore omemoStore; - public SignalOmemoStoreConnector(OmemoManager.KnownBareJidGuard managerGuard, OmemoStore store) { - this.managerGuard = managerGuard; + this.omemoManager = omemoManager; this.omemoStore = store; } OmemoDevice getOurDevice() { - return managerGuard.get().getOwnDevice(); + return omemoManager.getOwnDevice(); } @Override @@ -98,7 +98,7 @@ public class SignalOmemoStoreConnector public boolean saveIdentity(SignalProtocolAddress signalProtocolAddress, IdentityKey identityKey) { OmemoDevice device; try { - device = omemoStore.keyUtil().addressAsOmemoDevice(signalProtocolAddress); + device = asOmemoDevice(signalProtocolAddress); } catch (XmppStringprepException e) { throw new AssertionError(e); } @@ -150,7 +150,7 @@ public class SignalOmemoStoreConnector public SessionRecord loadSession(SignalProtocolAddress signalProtocolAddress) { OmemoDevice device; try { - device = omemoStore.keyUtil().addressAsOmemoDevice(signalProtocolAddress); + device = asOmemoDevice(signalProtocolAddress); } catch (XmppStringprepException e) { throw new AssertionError(e); } @@ -180,7 +180,7 @@ public class SignalOmemoStoreConnector public void storeSession(SignalProtocolAddress signalProtocolAddress, SessionRecord sessionRecord) { OmemoDevice device; try { - device = omemoStore.keyUtil().addressAsOmemoDevice(signalProtocolAddress); + device = asOmemoDevice(signalProtocolAddress); } catch (XmppStringprepException e) { throw new AssertionError(e); } @@ -192,7 +192,7 @@ public class SignalOmemoStoreConnector public boolean containsSession(SignalProtocolAddress signalProtocolAddress) { OmemoDevice device; try { - device = omemoStore.keyUtil().addressAsOmemoDevice(signalProtocolAddress); + device = asOmemoDevice(signalProtocolAddress); } catch (XmppStringprepException e) { throw new AssertionError(e); } @@ -204,7 +204,7 @@ public class SignalOmemoStoreConnector public void deleteSession(SignalProtocolAddress signalProtocolAddress) { OmemoDevice device; try { - device = omemoStore.keyUtil().addressAsOmemoDevice(signalProtocolAddress); + device = asOmemoDevice(signalProtocolAddress); } catch (XmppStringprepException e) { throw new AssertionError(e); } @@ -259,4 +259,12 @@ public class SignalOmemoStoreConnector public void removeSignedPreKey(int i) { omemoStore.removeOmemoSignedPreKey(getOurDevice(), i); } + + public static OmemoDevice asOmemoDevice(SignalProtocolAddress address) throws XmppStringprepException { + return new OmemoDevice(JidCreate.bareFrom(address.getName()), address.getDeviceId()); + } + + public static SignalProtocolAddress asAddress(OmemoDevice device) { + return new SignalProtocolAddress(device.getJid().toString(), device.getDeviceId()); + } } diff --git a/smack-omemo-signal/src/test/java/org/jivesoftware/smack/omemo/LegacySignalOmemoKeyUtilTest.java b/smack-omemo-signal/src/test/java/org/jivesoftware/smack/omemo/LegacySignalOmemoKeyUtilTest.java index 67359cebb..e27592626 100644 --- a/smack-omemo-signal/src/test/java/org/jivesoftware/smack/omemo/LegacySignalOmemoKeyUtilTest.java +++ b/smack-omemo-signal/src/test/java/org/jivesoftware/smack/omemo/LegacySignalOmemoKeyUtilTest.java @@ -28,15 +28,11 @@ import static junit.framework.TestCase.fail; import org.jivesoftware.smack.test.util.SmackTestSuite; import org.jivesoftware.smackx.omemo.exceptions.CorruptedOmemoKeyException; -import org.jivesoftware.smackx.omemo.internal.OmemoDevice; import org.jivesoftware.smackx.omemo.signal.SignalOmemoKeyUtil; import org.junit.Test; -import org.jxmpp.jid.impl.JidCreate; -import org.jxmpp.stringprep.XmppStringprepException; import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.IdentityKeyPair; -import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.state.SignedPreKeyRecord; /** @@ -97,26 +93,4 @@ public class LegacySignalOmemoKeyUtilTest extends SmackTestSuite { assertTrue("Length of fingerprint must be 64.", keyUtil.getFingerprintOfIdentityKey(ik).length() == 64); } - - @Test - public void addressToDeviceTest() { - SignalProtocolAddress address = new SignalProtocolAddress("test@server.tld",1337); - try { - OmemoDevice device = keyUtil.addressAsOmemoDevice(address); - assertEquals(device, new OmemoDevice(JidCreate.bareFrom("test@server.tld"), 1337)); - } catch (XmppStringprepException e) { - fail("Could not convert address to device: " + e + " " + e.getMessage()); - } - } - - @Test - public void deviceToAddressTest() { - try { - OmemoDevice device = new OmemoDevice(JidCreate.bareFrom("test@server.tld"), 1337); - SignalProtocolAddress address = keyUtil.omemoDeviceAsAddress(device); - assertEquals(address, new SignalProtocolAddress("test@server.tld", 1337)); - } catch (XmppStringprepException e) { - fail("Could not convert device to address: " + e + " " + e.getMessage()); - } - } } diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java index b888cdb23..df43686d3 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoManager.java @@ -33,6 +33,7 @@ import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; +import org.jivesoftware.smack.AbstractConnectionListener; import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.StanzaListener; @@ -96,11 +97,12 @@ import org.jxmpp.jid.EntityFullJid; public final class OmemoManager extends Manager { private static final Logger LOGGER = Logger.getLogger(OmemoManager.class.getName()); + private static final Integer UNKNOWN_DEVICE_ID = -1; + private final Object LOCK = new Object(); + private static final WeakHashMap> INSTANCES = new WeakHashMap<>(); private final OmemoService service; - private final Object LOCK = new Object(); - private final HashSet omemoMessageListeners = new HashSet<>(); private final HashSet omemoMucMessageListeners = new HashSet<>(); @@ -110,20 +112,30 @@ public final class OmemoManager extends Manager { private Integer deviceId; /** - * Private constructor to prevent multiple instances on a single connection (which probably would be bad!). + * Private constructor. * * @param connection connection + * @param deviceId deviceId */ private OmemoManager(XMPPConnection connection, Integer deviceId) { super(connection); service = OmemoService.getInstance(); - if (deviceId != null && deviceId <= 0) { - throw new IllegalArgumentException("DeviceId MUST be greater than 0."); + this.deviceId = deviceId; + + if (connection.isAuthenticated()) { + initBareJidAndDeviceId(this); + } else { + connection.addConnectionListener(new AbstractConnectionListener() { + @Override + public void authenticated(XMPPConnection connection, boolean resumed) { + initBareJidAndDeviceId(OmemoManager.this); + } + }); } - this.deviceId = deviceId; + service.registerManager(this); // StanzaListeners startStanzaListeners(); @@ -137,20 +149,20 @@ public final class OmemoManager extends Manager { * If there was an OmemoManager for the connection and id before, return it. Otherwise create a new OmemoManager * instance and return it. * @param connection XmppConnection. - * @param deviceId can be null, to generate a random deviceId. DeviceIds MUST NOT be less than 1. + * @param deviceId MUST NOT be null and MUST be greater than 0. * @return */ public synchronized static OmemoManager getInstanceFor(XMPPConnection connection, Integer deviceId) { + if (deviceId == null || deviceId < 1) { + throw new IllegalArgumentException("DeviceId MUST NOT be null and MUST be greater than 0."); + } + TreeMap managersOfConnection = INSTANCES.get(connection); if (managersOfConnection == null) { managersOfConnection = new TreeMap<>(); INSTANCES.put(connection, managersOfConnection); } - if (deviceId == null || deviceId < 1) { - deviceId = randomDeviceId(); - } - OmemoManager manager = managersOfConnection.get(deviceId); if (manager == null) { manager = new OmemoManager(connection, deviceId); @@ -177,8 +189,8 @@ public final class OmemoManager extends Manager { OmemoManager manager; if (managers.size() == 0) { - manager = new OmemoManager(connection, null); - managers.put(null, manager); + manager = new OmemoManager(connection, UNKNOWN_DEVICE_ID); + managers.put(UNKNOWN_DEVICE_ID, manager); } else { manager = managers.get(managers.firstKey()); @@ -218,14 +230,7 @@ public final class OmemoManager extends Manager { throw new SmackException.NotLoggedInException(); } - // Set jid and deviceId - this.ownJid = connection().getUser().asBareJid(); - if (deviceId == null) { - SortedSet localDeviceIds = getOmemoService().getOmemoStoreBackend().localDeviceIdsOf(ownJid); - setDeviceId(localDeviceIds.size() > 0 ? localDeviceIds.first() : randomDeviceId()); - } - - getOmemoService().initialize(new KnownBareJidGuard(this)); + getOmemoService().publish(new LoggedInOmemoManager(this)); } } @@ -270,7 +275,7 @@ public final class OmemoManager extends Manager { SmackException.NoResponseException, SmackException.NotLoggedInException { synchronized (LOCK) { - KnownBareJidGuard guard = new KnownBareJidGuard(this); + LoggedInOmemoManager guard = new LoggedInOmemoManager(this); Message plaintext = new Message(); plaintext.setBody(message); OmemoVAxolotlElement encrypted = getOmemoService().processSendingMessage(guard, to, plaintext); @@ -302,7 +307,7 @@ public final class OmemoManager extends Manager { Message m = new Message(); m.setBody(message); OmemoVAxolotlElement encrypted = getOmemoService().processSendingMessage( - new KnownBareJidGuard(this), recipients, m); + new LoggedInOmemoManager(this), recipients, m); return finishMessage(encrypted); } } @@ -364,7 +369,7 @@ public final class OmemoManager extends Manager { Message m = new Message(); m.setBody(message); OmemoVAxolotlElement encrypted = getOmemoService() - .encryptOmemoMessage(new KnownBareJidGuard(this), exception.getSuccesses(), m); + .encryptOmemoMessage(new LoggedInOmemoManager(this), exception.getSuccesses(), m); return finishMessage(encrypted); } } @@ -389,7 +394,7 @@ public final class OmemoManager extends Manager { SmackException.NotLoggedInException { synchronized (LOCK) { - return getOmemoService().processLocalMessage(new KnownBareJidGuard(this), sender, omemoMessage); + return getOmemoService().processLocalMessage(new LoggedInOmemoManager(this), sender, omemoMessage); } } @@ -410,7 +415,7 @@ public final class OmemoManager extends Manager { { synchronized (LOCK) { List l = new ArrayList<>(); - l.addAll(getOmemoService().decryptMamQueryResult(new KnownBareJidGuard(this), mamQueryResult)); + l.addAll(getOmemoService().decryptMamQueryResult(new LoggedInOmemoManager(this), mamQueryResult)); return l; } } @@ -489,7 +494,7 @@ public final class OmemoManager extends Manager { throws SmackException, InterruptedException, XMPPException.XMPPErrorException, CorruptedOmemoKeyException { synchronized (LOCK) { - KnownBareJidGuard managerGuard = new KnownBareJidGuard(this); + LoggedInOmemoManager managerGuard = new LoggedInOmemoManager(this); getOmemoService().publishDeviceIdIfNeeded(managerGuard, true); getOmemoService().publishBundle(managerGuard); } @@ -506,7 +511,7 @@ public final class OmemoManager extends Manager { throws SmackException, InterruptedException, XMPPException.XMPPErrorException, CorruptedOmemoKeyException { synchronized (LOCK) { - KnownBareJidGuard managerGuard = new KnownBareJidGuard(this); + LoggedInOmemoManager managerGuard = new LoggedInOmemoManager(this); // create a new identity and publish new keys to the server getOmemoService().regenerate(managerGuard); getOmemoService().publishDeviceIdIfNeeded(managerGuard, false); @@ -530,7 +535,7 @@ public final class OmemoManager extends Manager { { synchronized (LOCK) { getOmemoService().sendOmemoRatchetUpdateMessage( - new KnownBareJidGuard(this), recipient, false); + new LoggedInOmemoManager(this), recipient, false); } } @@ -553,7 +558,7 @@ public final class OmemoManager extends Manager { { synchronized (LOCK) { return getOmemoService().prepareOmemoKeyTransportElement( - new KnownBareJidGuard(this), aesKey, iv, to); + new LoggedInOmemoManager(this), aesKey, iv, to); } } @@ -605,7 +610,7 @@ public final class OmemoManager extends Manager { SmackException.NotLoggedInException { synchronized (LOCK) { - KnownBareJidGuard managerGuard = new KnownBareJidGuard(this); + LoggedInOmemoManager managerGuard = new LoggedInOmemoManager(this); getOmemoService().refreshDeviceList(managerGuard, contact); return !getOmemoService().getOmemoStoreBackend().loadCachedDeviceList(getOwnDevice(), contact) @@ -681,7 +686,7 @@ public final class OmemoManager extends Manager { return getOwnFingerprint(); } - return getOmemoService().getOmemoStoreBackend().getFingerprint(new KnownBareJidGuard(this), device); + return getOmemoService().getOmemoStoreBackend().getFingerprint(new LoggedInOmemoManager(this), device); } } @@ -746,7 +751,7 @@ public final class OmemoManager extends Manager { SmackException.NoResponseException, SmackException.NotLoggedInException { synchronized (LOCK) { - getOmemoService().buildMissingOmemoSessions(new KnownBareJidGuard(this), contact); + getOmemoService().buildMissingOmemoSessions(new LoggedInOmemoManager(this), contact); } } @@ -763,7 +768,7 @@ public final class OmemoManager extends Manager { SmackException.NotLoggedInException { synchronized (LOCK) { - getOmemoService().refreshDeviceList(new KnownBareJidGuard(this), contact); + getOmemoService().refreshDeviceList(new LoggedInOmemoManager(this), contact); } } @@ -785,7 +790,7 @@ public final class OmemoManager extends Manager { PubSubException.NotALeafNodeException, SmackException.NotLoggedInException { synchronized (LOCK) { - KnownBareJidGuard managerGuard = new KnownBareJidGuard(this); + LoggedInOmemoManager managerGuard = new LoggedInOmemoManager(this); // generate key getOmemoService().getOmemoStoreBackend().changeSignedPreKey(getOwnDevice()); // publish @@ -940,12 +945,16 @@ public final class OmemoManager extends Manager { */ public void startStanzaListeners() { PEPManager pepManager = PEPManager.getInstanceFor(connection()); - pepManager.removePEPListener(deviceListUpdateListener); - pepManager.addPEPListener(deviceListUpdateListener); - connection().removeAsyncStanzaListener(internalOmemoMessageStanzaListener); - connection().addAsyncStanzaListener(internalOmemoMessageStanzaListener, omemoMessageStanzaFilter); CarbonManager carbonManager = CarbonManager.getInstanceFor(connection()); + + // Remove listeners to avoid them getting added twice + connection().removeAsyncStanzaListener(internalOmemoMessageStanzaListener); carbonManager.removeCarbonCopyReceivedListener(internalOmemoCarbonCopyListener); + pepManager.removePEPListener(deviceListUpdateListener); + + // Add listeners + pepManager.addPEPListener(deviceListUpdateListener); + connection().addAsyncStanzaListener(internalOmemoMessageStanzaListener, omemoMessageStanzaFilter); carbonManager.addCarbonCopyReceivedListener(internalOmemoCarbonCopyListener); } @@ -979,14 +988,14 @@ public final class OmemoManager extends Manager { private final PEPListener deviceListUpdateListener = new PEPListener() { - KnownBareJidGuard managerGuard = null; + LoggedInOmemoManager managerGuard = null; @Override public void eventReceived(EntityBareJid from, EventElement event, Message message) { if (managerGuard == null) { try { - managerGuard = new KnownBareJidGuard(OmemoManager.this); + managerGuard = new LoggedInOmemoManager(OmemoManager.this); } catch (SmackException.NotLoggedInException e) { throw new AssertionError(e); } @@ -1066,7 +1075,7 @@ public final class OmemoManager extends Manager { public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException { try { getOmemoService().onOmemoMessageStanzaReceived(packet, - new KnownBareJidGuard(OmemoManager.this)); + new LoggedInOmemoManager(OmemoManager.this)); } catch (SmackException.NotLoggedInException e) { LOGGER.warning("Received OMEMO stanza while being offline: " + e); } @@ -1081,7 +1090,7 @@ public final class OmemoManager extends Manager { if (omemoMessageStanzaFilter.accept(carbonCopy)) { try { getOmemoService().onOmemoCarbonCopyReceived(direction, carbonCopy, wrappingMessage, - new KnownBareJidGuard(OmemoManager.this)); + new LoggedInOmemoManager(OmemoManager.this)); } catch (SmackException.NotLoggedInException e) { LOGGER.warning("Received OMEMO carbon copy while being offline: " + e); } @@ -1099,11 +1108,11 @@ public final class OmemoManager extends Manager { } }; - public static class KnownBareJidGuard { + public static class LoggedInOmemoManager { private final OmemoManager manager; - public KnownBareJidGuard(OmemoManager manager) + public LoggedInOmemoManager(OmemoManager manager) throws SmackException.NotLoggedInException { if (manager == null) { @@ -1132,4 +1141,23 @@ public final class OmemoManager extends Manager { void initializationFailed(Exception cause); } + + private static void initBareJidAndDeviceId(OmemoManager manager) { + if (!manager.getConnection().isAuthenticated()) { + throw new IllegalStateException("Connection MUST be authenticated."); + } + + if (manager.ownJid == null) { + manager.ownJid = manager.getConnection().getUser().asBareJid(); + } + + if (UNKNOWN_DEVICE_ID.equals(manager.deviceId)) { + SortedSet storedDeviceIds = manager.getOmemoService().getOmemoStoreBackend().localDeviceIdsOf(manager.ownJid); + if (storedDeviceIds.size() > 0) { + manager.setDeviceId(storedDeviceIds.first()); + } else { + manager.setDeviceId(randomDeviceId()); + } + } + } } diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoRatchet.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoRatchet.java index 3b39e5f6f..4d1a4c1ef 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoRatchet.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoRatchet.java @@ -39,12 +39,12 @@ import org.jivesoftware.smackx.omemo.internal.OmemoDevice; public abstract class OmemoRatchet { private static final Logger LOGGER = Logger.getLogger(OmemoRatchet.class.getName()); - protected final OmemoManager.KnownBareJidGuard managerGuard; + protected final OmemoManager omemoManager; protected final OmemoStore store; - public OmemoRatchet(OmemoManager.KnownBareJidGuard managerGuard, + public OmemoRatchet(OmemoManager omemoManager, OmemoStore store) { - this.managerGuard = managerGuard; + this.omemoManager = omemoManager; this.store = store; } @@ -58,13 +58,13 @@ public abstract class OmemoRatchet decryptExceptions = new ArrayList<>(); List keys = element.getHeader().getKeys(); @@ -124,7 +124,7 @@ public abstract class OmemoRatchet INSTANCE; protected OmemoStore omemoStore; - protected final HashMap> sessionManagers = new HashMap<>(); + protected final HashMap> omemoRatchets = new HashMap<>(); /** * Return the singleton instance of this class. When no instance is set, throw an IllegalStateException instead. @@ -206,6 +206,10 @@ public abstract class OmemoService deviceListIds) { + boolean removeStaleDevicesIfNeeded(OmemoManager.LoggedInOmemoManager managerGuard, Set deviceListIds) { OmemoManager omemoManager = managerGuard.get(); OmemoDevice userDevice = omemoManager.getOwnDevice(); boolean publish = false; @@ -433,7 +438,7 @@ public abstract class OmemoService recipients, Message message) throws CryptoFailedException, UndecidedOmemoIdentityException, NoSuchAlgorithmException, @@ -972,7 +977,7 @@ public abstract class OmemoService> recipients, Message message) throws CryptoFailedException, UndecidedOmemoIdentityException @@ -1045,7 +1050,7 @@ public abstract class OmemoService builder; try { - builder = new OmemoMessageBuilder<>(managerGuard, getOmemoRatchet(managerGuard), message.getBody()); + builder = new OmemoMessageBuilder<>(managerGuard, getOmemoRatchet(managerGuard.get()), message.getBody()); } catch (UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException | NoSuchProviderException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | NoSuchAlgorithmException e) { throw new CryptoFailedException(e); @@ -1090,7 +1095,7 @@ public abstract class OmemoService builder; try { - builder = new OmemoMessageBuilder<>(managerGuard, getOmemoRatchet(managerGuard), null); + builder = new OmemoMessageBuilder<>(managerGuard, getOmemoRatchet(managerGuard.get()), null); } catch (UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException | NoSuchProviderException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | NoSuchAlgorithmException e) { @@ -1125,7 +1130,7 @@ public abstract class OmemoService builder; try { - builder = new OmemoMessageBuilder<>(managerGuard, getOmemoRatchet(managerGuard), aesKey, iv); + builder = new OmemoMessageBuilder<>(managerGuard, getOmemoRatchet(managerGuard.get()), aesKey, iv); } catch (UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException | NoSuchProviderException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | NoSuchAlgorithmException e) { @@ -1162,7 +1167,7 @@ public abstract class OmemoService decryptMamQueryResult(OmemoManager.KnownBareJidGuard managerGuard, + List decryptMamQueryResult(OmemoManager.LoggedInOmemoManager managerGuard, MamManager.MamQueryResult mamQueryResult) throws InterruptedException, XMPPException.XMPPErrorException, SmackException.NotConnectedException, SmackException.NoResponseException @@ -1255,7 +1260,7 @@ public abstract class OmemoService - instantiateOmemoRatchet(OmemoManager.KnownBareJidGuard manager, + instantiateOmemoRatchet(OmemoManager manager, OmemoStore store); protected OmemoRatchet - getOmemoRatchet(OmemoManager.KnownBareJidGuard guard) { + getOmemoRatchet(OmemoManager manager) { OmemoRatchet - sessionManager = sessionManagers.get(guard.get()); - if (sessionManager == null) { - sessionManager = instantiateOmemoRatchet(guard, omemoStore); - sessionManagers.put(guard.get(), sessionManager); + omemoRatchet = omemoRatchets.get(manager); + if (omemoRatchet == null) { + omemoRatchet = instantiateOmemoRatchet(manager, omemoStore); + omemoRatchets.put(manager, omemoRatchet); } - return sessionManager; + return omemoRatchet; } } diff --git a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoStore.java b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoStore.java index 61b797398..f81c096a0 100644 --- a/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoStore.java +++ b/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/OmemoStore.java @@ -204,7 +204,7 @@ public abstract class OmemoStore preKeyPublisKeysForBundle(TreeMap preKeyHashMap) { + public HashMap preKeyPublicKeysForBundle(TreeMap preKeyHashMap) { HashMap out = new HashMap<>(); for (Map.Entry e : preKeyHashMap.entrySet()) { out.put(e.getKey(), preKeyForBundle(e.getValue())); @@ -339,7 +337,7 @@ public abstract class OmemoKeyUtil { private final OmemoRatchet ratchet; - private final OmemoManager.KnownBareJidGuard managerGuard; + private final OmemoManager.LoggedInOmemoManager managerGuard; private byte[] messageKey = generateKey(); private byte[] initializationVector = generateIv(); @@ -91,7 +91,7 @@ public class OmemoMessageBuilder ratchet, byte[] aesKey, byte[] iv) throws NoSuchPaddingException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, @@ -118,7 +118,7 @@ public class OmemoMessageBuilder ratchet, String message) throws NoSuchPaddingException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException,