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 bfb1a20d9..d135cf58b 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 @@ -143,7 +143,7 @@ public class SignalOmemoStoreConnector @Override public void removePreKey(int i) { - omemoStore.removeOmemoPreKey(getOurDevice(), i); + omemoStore.removeOrQueueOmemoPreKey(getOurDevice(), i); } @Override 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 4626f6e00..4c92f1806 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 @@ -20,7 +20,9 @@ import static org.jivesoftware.smackx.omemo.util.OmemoConstants.PRE_KEY_COUNT_PE import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.SortedSet; import java.util.TreeMap; import java.util.logging.Level; @@ -56,6 +58,9 @@ import org.jxmpp.jid.BareJid; public abstract class OmemoStore { private static final Logger LOGGER = Logger.getLogger(OmemoStore.class.getName()); + private final Map postponePreKeyDeletion = new HashMap<>(); + private final Map> preKeyDeletionQueues = new HashMap<>(); + /** * Create a new OmemoStore. */ @@ -124,6 +129,51 @@ public abstract class OmemoStore preKeyIds = preKeyDeletionQueues.get(userDevice); + if (preKeyIds == null) { + preKeyIds = new HashSet<>(); + preKeyDeletionQueues.put(userDevice, preKeyIds); + } + preKeyIds.add(deviceId); + } + + public void deleteQueuedPreKeys(OmemoDevice userDevice) { + Set queuedPreKeys = preKeyDeletionQueues.get(userDevice); + if (queuedPreKeys == null) { + return; + } + + for (Integer id : queuedPreKeys) { + removeOmemoPreKey(userDevice, id); + } + + } + /** * Renew our singed preKey. This should be done once every 7-14 days. * The old signed PreKey should be kept for around a month or so (look it up in the XEP). @@ -407,6 +457,16 @@ public abstract class OmemoStore