postpone prekey removal and republish to after mam
This commit is contained in:
		
							parent
							
								
									19c3c54f24
								
							
						
					
					
						commit
						bcfd3f20c2
					
				|  | @ -1444,7 +1444,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { | |||
| 			plaintextMessage = message.decrypt(session, ownDeviceId); | ||||
| 			Integer preKeyId = session.getPreKeyIdAndReset(); | ||||
| 			if (preKeyId != null) { | ||||
| 				postPreKeyMessageHandling(session, preKeyId, postponePreKeyMessageHandling); | ||||
| 				postPreKeyMessageHandling(session, postponePreKeyMessageHandling); | ||||
| 			} | ||||
| 		} catch (NotEncryptedForThisDeviceException e) { | ||||
| 			if (account.getJid().asBareJid().equals(message.getFrom().asBareJid()) && message.getSenderDeviceId() == ownDeviceId) { | ||||
|  | @ -1494,20 +1494,25 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private void postPreKeyMessageHandling(final XmppAxolotlSession session, int preKeyId, final boolean postpone) { | ||||
| 	private void postPreKeyMessageHandling(final XmppAxolotlSession session, final boolean postpone) { | ||||
| 		if (postpone) { | ||||
| 			postponedSessions.add(session); | ||||
| 		} else { | ||||
| 			//TODO: do not republish if we already removed this preKeyId | ||||
| 			if (axolotlStore.flushPreKeys()) { | ||||
| 				publishBundlesIfNeeded(false, false); | ||||
| 			} else { | ||||
| 				Log.d(Config.LOGTAG,account.getJid().asBareJid()+": nothing to flush. Not republishing key"); | ||||
| 			} | ||||
| 			completeSession(session); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public void processPostponed() { | ||||
| 		if (postponedSessions.size() > 0) { | ||||
| 			if (axolotlStore.flushPreKeys()) { | ||||
| 				publishBundlesIfNeeded(false, false); | ||||
| 			} | ||||
| 		} | ||||
| 		Iterator<XmppAxolotlSession> iterator = postponedSessions.iterator(); | ||||
| 		while (iterator.hasNext()) { | ||||
| 			completeSession(iterator.next()); | ||||
|  | @ -1541,7 +1546,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { | |||
| 			keyTransportMessage = message.getParameters(session, getOwnDeviceId()); | ||||
| 			Integer preKeyId = session.getPreKeyIdAndReset(); | ||||
| 			if (preKeyId != null) { | ||||
| 				postPreKeyMessageHandling(session, preKeyId, postponePreKeyMessageHandling); | ||||
| 				postPreKeyMessageHandling(session, postponePreKeyMessageHandling); | ||||
| 			} | ||||
| 		} catch (CryptoFailedException e) { | ||||
| 			Log.d(Config.LOGTAG, "could not decrypt keyTransport message " + e.getMessage()); | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ import org.whispersystems.libsignal.state.SignedPreKeyRecord; | |||
| import org.whispersystems.libsignal.util.KeyHelper; | ||||
| 
 | ||||
| import java.security.cert.X509Certificate; | ||||
| import java.util.HashSet; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
| 
 | ||||
|  | @ -55,6 +56,8 @@ public class SQLiteAxolotlStore implements SignalProtocolStore { | |||
| 	private int localRegistrationId; | ||||
| 	private int currentPreKeyId = 0; | ||||
| 
 | ||||
| 	private final HashSet<Integer> preKeysMarkedForRemoval = new HashSet<>(); | ||||
| 
 | ||||
| 	private final LruCache<String, FingerprintStatus> trustCache = | ||||
| 			new LruCache<String, FingerprintStatus>(NUM_TRUSTS_TO_CACHE) { | ||||
| 				@Override | ||||
|  | @ -385,7 +388,23 @@ public class SQLiteAxolotlStore implements SignalProtocolStore { | |||
| 	 */ | ||||
| 	@Override | ||||
| 	public void removePreKey(int preKeyId) { | ||||
| 		mXmppConnectionService.databaseBackend.deletePreKey(account, preKeyId); | ||||
| 		Log.d(Config.LOGTAG,"mark prekey for removal "+preKeyId); | ||||
| 		synchronized (preKeysMarkedForRemoval) { | ||||
| 			preKeysMarkedForRemoval.add(preKeyId); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	public boolean flushPreKeys() { | ||||
| 		Log.d(Config.LOGTAG,"flushing pre keys"); | ||||
| 		int count = 0; | ||||
| 		synchronized (preKeysMarkedForRemoval) { | ||||
| 			for(Integer preKeyId : preKeysMarkedForRemoval) { | ||||
| 				count += mXmppConnectionService.databaseBackend.deletePreKey(account, preKeyId); | ||||
| 			} | ||||
| 			preKeysMarkedForRemoval.clear(); | ||||
| 		} | ||||
| 		return count > 0; | ||||
| 	} | ||||
| 
 | ||||
| 	// -------------------------------------- | ||||
|  |  | |||
|  | @ -1178,10 +1178,10 @@ public class DatabaseBackend extends SQLiteOpenHelper { | |||
| 		db.insert(SQLiteAxolotlStore.PREKEY_TABLENAME, null, values); | ||||
| 	} | ||||
| 
 | ||||
| 	public void deletePreKey(Account account, int preKeyId) { | ||||
| 	public int deletePreKey(Account account, int preKeyId) { | ||||
| 		SQLiteDatabase db = this.getWritableDatabase(); | ||||
| 		String[] args = {account.getUuid(), Integer.toString(preKeyId)}; | ||||
| 		db.delete(SQLiteAxolotlStore.PREKEY_TABLENAME, | ||||
| 		return db.delete(SQLiteAxolotlStore.PREKEY_TABLENAME, | ||||
| 				SQLiteAxolotlStore.ACCOUNT + "=? AND " | ||||
| 						+ SQLiteAxolotlStore.ID + "=?", | ||||
| 				args); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Daniel Gultsch
						Daniel Gultsch