diff --git a/smack-core/src/main/java/org/jivesoftware/smack/SmackException.java b/smack-core/src/main/java/org/jivesoftware/smack/SmackException.java index 988d2091d..583b70589 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/SmackException.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/SmackException.java @@ -131,6 +131,10 @@ public class SmackException extends Exception { public NotLoggedInException() { super("Client is not logged in"); } + + public NotLoggedInException(String message) { + super("Client is not logged in. " + message); + } } public static class AlreadyLoggedInException extends SmackException { diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/AbstractOmemoIntegrationTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/AbstractOmemoIntegrationTest.java index e7b0ce63b..998baa82a 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/AbstractOmemoIntegrationTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/AbstractOmemoIntegrationTest.java @@ -16,6 +16,8 @@ */ package org.jivesoftware.smackx.omemo; +import static org.junit.Assert.fail; + import java.io.File; import java.util.logging.Level; @@ -65,7 +67,11 @@ public abstract class AbstractOmemoIntegrationTest extends AbstractSmackIntegrat public void beforeTest() { LOGGER.log(Level.INFO, "START EXECUTION"); OmemoIntegrationTestHelper.deletePath(storePath); - before(); + try { + before(); + } catch (SmackException.NotLoggedInException e) { + fail(); + } } @AfterClass @@ -75,7 +81,7 @@ public abstract class AbstractOmemoIntegrationTest extends AbstractSmackIntegrat LOGGER.log(Level.INFO, "END EXECUTION"); } - public abstract void before(); + public abstract void before() throws SmackException.NotLoggedInException; public abstract void after(); } diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoInitializationTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoInitializationTest.java index 155b9ca3a..36cbd5a64 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoInitializationTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoInitializationTest.java @@ -41,7 +41,7 @@ public class OmemoInitializationTest extends AbstractOmemoIntegrationTest { private OmemoStore store; @Override - public void before() { + public void before() throws SmackException.NotLoggedInException { alice = OmemoManager.getInstanceFor(conOne, 666); store = OmemoService.getInstance().getOmemoStoreBackend(); } diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoKeyTransportTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoKeyTransportTest.java index cb745c1d1..ccbc63614 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoKeyTransportTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoKeyTransportTest.java @@ -55,7 +55,7 @@ public class OmemoKeyTransportTest extends AbstractOmemoIntegrationTest { } @Override - public void before() { + public void before() throws SmackException.NotLoggedInException { alice = OmemoManager.getInstanceFor(conOne, 11111); bob = OmemoManager.getInstanceFor(conTwo, 222222); } diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoMessageSendingTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoMessageSendingTest.java index 690c19b81..20882a388 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoMessageSendingTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoMessageSendingTest.java @@ -60,7 +60,7 @@ public class OmemoMessageSendingTest extends AbstractOmemoIntegrationTest { } @Override - public void before() { + public void before() throws SmackException.NotLoggedInException { alice = OmemoManager.getInstanceFor(conOne, 123); bob = OmemoManager.getInstanceFor(conTwo, 345); store = OmemoService.getInstance().getOmemoStoreBackend(); diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoSessionRenegotiationTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoSessionRenegotiationTest.java index 4a058df06..f5a993158 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoSessionRenegotiationTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoSessionRenegotiationTest.java @@ -52,7 +52,7 @@ public class OmemoSessionRenegotiationTest extends AbstractOmemoIntegrationTest } @Override - public void before() { + public void before() throws SmackException.NotLoggedInException { alice = OmemoManager.getInstanceFor(conOne, 1337); bob = OmemoManager.getInstanceFor(conTwo, 1009); store = OmemoService.getInstance().getOmemoStoreBackend(); diff --git a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoStoreTest.java b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoStoreTest.java index 91dca385b..0e5b4d51a 100644 --- a/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoStoreTest.java +++ b/smack-integration-test/src/main/java/org/jivesoftware/smackx/omemo/OmemoStoreTest.java @@ -47,7 +47,7 @@ public class OmemoStoreTest extends AbstractOmemoIntegrationTest { } @Override - public void before() { + public void before() throws SmackException.NotLoggedInException { alice = OmemoManager.getInstanceFor(conOne); bob = OmemoManager.getInstanceFor(conOne); } 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 faff979b0..96d3764ae 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 @@ -32,7 +32,6 @@ import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; -import org.jivesoftware.smack.AbstractXMPPConnection; import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.Manager; import org.jivesoftware.smack.SmackException; @@ -41,7 +40,6 @@ import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Stanza; - import org.jivesoftware.smackx.carbons.CarbonManager; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.eme.element.ExplicitMessageEncryptionElement; @@ -79,8 +77,6 @@ import org.jxmpp.jid.DomainBareJid; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.EntityFullJid; import org.jxmpp.jid.FullJid; -import org.jxmpp.jid.impl.JidCreate; -import org.jxmpp.stringprep.XmppStringprepException; /** * Manager that allows sending messages encrypted with OMEMO. @@ -101,6 +97,7 @@ public final class OmemoManager extends Manager { private OmemoService.OmemoStanzaListener omemoStanzaListener; private OmemoService.OmemoCarbonCopyListener omemoCarbonCopyListener; + private final BareJid ownBareJid; private int deviceId; /** @@ -108,21 +105,15 @@ public final class OmemoManager extends Manager { * * @param connection connection */ - private OmemoManager(XMPPConnection connection, int deviceId) { + private OmemoManager(XMPPConnection connection, BareJid user, int deviceId) { super(connection); setConnectionListener(); + this.ownBareJid = user; this.deviceId = deviceId; service = OmemoService.getInstance(); } - /** - * Get an instance of the OmemoManager for the given connection and deviceId. - * - * @param connection Connection - * @param deviceId deviceId of the Manager. If the deviceId is null, a random id will be generated. - * @return an OmemoManager - */ - public synchronized static OmemoManager getInstanceFor(XMPPConnection connection, Integer deviceId) { + public synchronized static OmemoManager getInstanceFor(XMPPConnection connection, BareJid user, Integer deviceId) { WeakHashMap managersOfConnection = INSTANCES.get(connection); if (managersOfConnection == null) { managersOfConnection = new WeakHashMap<>(); @@ -135,12 +126,31 @@ public final class OmemoManager extends Manager { OmemoManager manager = managersOfConnection.get(deviceId); if (manager == null) { - manager = new OmemoManager(connection, deviceId); + manager = new OmemoManager(connection, user, deviceId); managersOfConnection.put(deviceId, manager); } return manager; } + /** + * Get an instance of the OmemoManager for the given connection and deviceId. + * + * @param connection Connection + * @param deviceId deviceId of the Manager. If the deviceId is null, a random id will be generated. + * @return an OmemoManager + */ + public synchronized static OmemoManager getInstanceFor(XMPPConnection connection, Integer deviceId) throws SmackException.NotLoggedInException { + BareJid user; + if (connection.getUser() != null) { + user = connection.getUser().asBareJid(); + } else { + throw new SmackException.NotLoggedInException("If you want to get an instance of the OmemoManager before " + + "login, you must use OmemoManager.getInstanceFor(connection, barejid, deviceId)."); + } + + return getInstanceFor(connection, user, deviceId); + } + /** * Get an instance of the OmemoManager for the given connection. * This method creates the OmemoManager for the stored defaultDeviceId of the connections user. @@ -149,27 +159,25 @@ public final class OmemoManager extends Manager { * @param connection connection * @return OmemoManager */ - public synchronized static OmemoManager getInstanceFor(XMPPConnection connection) { + public synchronized static OmemoManager getInstanceFor(XMPPConnection connection) throws SmackException.NotLoggedInException { BareJid user; if (connection.getUser() != null) { user = connection.getUser().asBareJid(); } else { - //This might be dangerous - try { - user = JidCreate.bareFrom(((AbstractXMPPConnection) connection).getConfiguration().getUsername()); - } catch (XmppStringprepException e) { - throw new AssertionError("Username is not a valid Jid. " + - "Use OmemoManager.gerInstanceFor(Connection, deviceId) instead."); - } + throw new SmackException.NotLoggedInException("If you want to get an instance of the OmemoManager before " + + "login, you must use OmemoManager.getInstanceFor(connection, barejid)."); } + return getInstanceFor(connection, user); + } + public synchronized static OmemoManager getInstanceFor(XMPPConnection connection, BareJid user) { int defaultDeviceId = OmemoService.getInstance().getOmemoStoreBackend().getDefaultDeviceId(user); if (defaultDeviceId < 1) { defaultDeviceId = randomDeviceId(); OmemoService.getInstance().getOmemoStoreBackend().setDefaultDeviceId(user, defaultDeviceId); } - return getInstanceFor(connection, defaultDeviceId); + return getInstanceFor(connection, user, defaultDeviceId); } /** @@ -438,7 +446,7 @@ public final class OmemoManager extends Manager { } Message chatMessage = new Message(); - chatMessage.setFrom(connection().getUser().asBareJid()); + chatMessage.setFrom(getOwnJid()); chatMessage.addExtension(encrypted); if (OmemoConfiguration.getAddOmemoHintBody()) { @@ -705,9 +713,7 @@ public final class OmemoManager extends Manager { * @return bareJid */ public BareJid getOwnJid() { - EntityFullJid fullJid = connection().getUser(); - if (fullJid == null) return null; - return fullJid.asBareJid(); + return ownBareJid; } /**