change access model of omemo pep nodes after every publish

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java  | 43 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  6 
2 files changed, 34 insertions(+), 15 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java 🔗

@@ -51,6 +51,7 @@ import eu.siacs.conversations.xmpp.OnAdvancedStreamFeaturesLoaded;
 import eu.siacs.conversations.xmpp.OnIqPacketReceived;
 import eu.siacs.conversations.xmpp.jid.InvalidJidException;
 import eu.siacs.conversations.xmpp.jid.Jid;
+import eu.siacs.conversations.xmpp.pep.PublishOptions;
 import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 
 public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
@@ -436,7 +437,14 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
 		deviceIds.add(getOwnDeviceId());
 		IqPacket publish = mXmppConnectionService.getIqGenerator().publishDeviceIds(deviceIds);
 		Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Wiping all other devices from Pep:" + publish);
-		mXmppConnectionService.sendIqPacket(account, publish, null);
+		mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
+			@Override
+			public void onIqPacketReceived(Account account, IqPacket packet) {
+				if (packet.getType() == IqPacket.TYPE.RESULT) {
+					mXmppConnectionService.pushNodeConfiguration(account, AxolotlService.PEP_DEVICE_LIST, PublishOptions.openAccess(), null);
+				}
+			}
+		});
 	}
 
 	public void distrustFingerprint(final String fingerprint) {
@@ -512,6 +520,8 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
 				if (packet.getType() == IqPacket.TYPE.ERROR) {
 					pepBroken = true;
 					Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing own device id" + packet.findChild("error"));
+				} else if (packet.getType() != IqPacket.TYPE.TIMEOUT) {
+					mXmppConnectionService.pushNodeConfiguration(account, AxolotlService.PEP_DEVICE_LIST, PublishOptions.openAccess(), null);
 				}
 			}
 		});
@@ -535,9 +545,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
 				@Override
 				public void onIqPacketReceived(final Account account, IqPacket packet) {
 					String node = AxolotlService.PEP_VERIFICATION+":"+getOwnDeviceId();
-					Bundle pubsubOptions = new Bundle();
-					pubsubOptions.putString("pubsub#access_model","open");
-					mXmppConnectionService.pushNodeConfiguration(account, account.getJid().toBareJid(), node, pubsubOptions, new XmppConnectionService.OnConfigurationPushed() {
+					mXmppConnectionService.pushNodeConfiguration(account, node, PublishOptions.openAccess(), new XmppConnectionService.OnConfigurationPushed() {
 						@Override
 						public void onPushSucceeded() {
 							Log.d(Config.LOGTAG,getLogprefix(account) + "configured verification node to be world readable");
@@ -679,15 +687,26 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
 		Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": Bundle " + getOwnDeviceId() + " in PEP not current. Publishing...");
 		mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
 			@Override
-			public void onIqPacketReceived(Account account, IqPacket packet) {
+			public void onIqPacketReceived(final Account account, IqPacket packet) {
 				if (packet.getType() == IqPacket.TYPE.RESULT) {
-					Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Successfully published bundle. ");
-					if (wipe) {
-						wipeOtherPepDevices();
-					} else if (announceAfter) {
-						Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
-						publishOwnDeviceIdIfNeeded();
-					}
+					final String node = AxolotlService.PEP_BUNDLES + ":" + getOwnDeviceId();
+					mXmppConnectionService.pushNodeConfiguration(account, node, PublishOptions.openAccess(), new XmppConnectionService.OnConfigurationPushed() {
+						@Override
+						public void onPushSucceeded() {
+							Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Successfully published bundle. ");
+							if (wipe) {
+								wipeOtherPepDevices();
+							} else if (announceAfter) {
+								Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
+								publishOwnDeviceIdIfNeeded();
+							}
+						}
+
+						@Override
+						public void onPushFailed() {
+							Log.d(Config.LOGTAG,"unable to change access model for pubsub node");
+						}
+					});
 				} else if (packet.getType() == IqPacket.TYPE.ERROR) {
 					pepBroken = true;
 					Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing bundle: " + packet.findChild("error"));

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -2607,17 +2607,17 @@ public class XmppConnectionService extends Service {
 						sendIqPacket(account, mIqGenerator.publishPubsubConfiguration(jid, node, data), new OnIqPacketReceived() {
 							@Override
 							public void onIqPacketReceived(Account account, IqPacket packet) {
-								if (packet.getType() == IqPacket.TYPE.RESULT) {
+								if (packet.getType() == IqPacket.TYPE.RESULT && callback != null) {
 									callback.onPushSucceeded();
 								} else {
 									Log.d(Config.LOGTAG,packet.toString());
 								}
 							}
 						});
-					} else {
+					} else if (callback !=null) {
 						callback.onPushFailed();
 					}
-				} else {
+				} else if (callback != null){
 					callback.onPushFailed();
 				}
 			}