aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2019-07-01 08:42:54 +0200
committerChristian Schneppe <christian@pix-art.de>2019-07-01 08:42:54 +0200
commit037932dc02ff27cd452cd37378aa66d0bfcd5d7f (patch)
tree4bb9f580df46f1b2f3520a58d470d9849cec555e
parent66a57e01292d576dc7df6480ad8f3fa9090094d5 (diff)
attempt to unregister when receiving push for channel no longer joined
when receiving a FCM push message for a channel the user is no longer in (this can happen when the disable command failed) an attempt will be made to explicitly unregister from the app server (which in turn will then send item-not-found on next push)
-rw-r--r--src/main/java/de/pixart/messenger/crypto/PgpEngine.java10
-rw-r--r--src/main/java/de/pixart/messenger/generator/IqGenerator.java14
-rw-r--r--src/main/java/de/pixart/messenger/services/XmppConnectionService.java27
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java2
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConversationFragment.java16
-rw-r--r--src/main/java/de/pixart/messenger/ui/EditAccountActivity.java4
-rw-r--r--src/main/java/de/pixart/messenger/ui/StartConversationActivity.java4
-rw-r--r--src/main/java/de/pixart/messenger/ui/UiCallback.java2
-rw-r--r--src/main/java/de/pixart/messenger/ui/XmppActivity.java6
-rw-r--r--src/main/java/de/pixart/messenger/utils/CryptoHelper.java6
-rw-r--r--src/standard/java/de/pixart/messenger/services/PushManagementService.java4
-rw-r--r--src/standardPush/java/de/pixart/messenger/services/PushManagementService.java13
12 files changed, 82 insertions, 26 deletions
diff --git a/src/main/java/de/pixart/messenger/crypto/PgpEngine.java b/src/main/java/de/pixart/messenger/crypto/PgpEngine.java
index 7fb474429..8cd0e2e6f 100644
--- a/src/main/java/de/pixart/messenger/crypto/PgpEngine.java
+++ b/src/main/java/de/pixart/messenger/crypto/PgpEngine.java
@@ -92,7 +92,7 @@ public class PgpEngine {
}
break;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
- callback.userInputRequried(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), message);
+ callback.userInputRequired(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), message);
break;
case OpenPgpApi.RESULT_CODE_ERROR:
OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR);
@@ -131,7 +131,7 @@ public class PgpEngine {
callback.success(message);
break;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
- callback.userInputRequried(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), message);
+ callback.userInputRequired(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), message);
break;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(conversation.getAccount(), result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
@@ -198,7 +198,7 @@ public class PgpEngine {
callback.success(account);
return;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
- callback.userInputRequried(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), account);
+ callback.userInputRequired(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), account);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(account, result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
@@ -247,7 +247,7 @@ public class PgpEngine {
callback.success(signatureBuilder.toString());
return;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
- callback.userInputRequried(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), status);
+ callback.userInputRequired(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), status);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR);
@@ -274,7 +274,7 @@ public class PgpEngine {
callback.success(contact);
return;
case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED:
- callback.userInputRequried(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), contact);
+ callback.userInputRequired(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), contact);
return;
case OpenPgpApi.RESULT_CODE_ERROR:
logError(contact.getAccount(), result.getParcelableExtra(OpenPgpApi.RESULT_ERROR));
diff --git a/src/main/java/de/pixart/messenger/generator/IqGenerator.java b/src/main/java/de/pixart/messenger/generator/IqGenerator.java
index ad977c7b4..52f9f5b01 100644
--- a/src/main/java/de/pixart/messenger/generator/IqGenerator.java
+++ b/src/main/java/de/pixart/messenger/generator/IqGenerator.java
@@ -453,6 +453,20 @@ public class IqGenerator extends AbstractGenerator {
return packet;
}
+ public IqPacket unregisterChannelOnAppServer(Jid appServer, String deviceId, String channel) {
+ final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
+ packet.setTo(appServer);
+ final Element command = packet.addChild("command", Namespace.COMMANDS);
+ command.setAttribute("node", "unregister-push-fcm");
+ command.setAttribute("action", "execute");
+ final Data data = new Data();
+ data.put("channel", channel);
+ data.put("android-id", deviceId);
+ data.submit();
+ command.addChild(data);
+ return packet;
+ }
+
public IqPacket enablePush(final Jid jid, final String node, final String secret) {
IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
Element enable = packet.addChild("enable", Namespace.PUSH);
diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
index 9d9be2a5b..ff96f255d 100644
--- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
+++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
@@ -609,6 +609,7 @@ public class XmppConnectionService extends Service {
toggleForegroundService(true);
}
String pushedAccountHash = null;
+ String pushedChannelHash = null;
boolean interactive = false;
if (action != null) {
final String uuid = intent.getStringExtra("uuid");
@@ -721,6 +722,7 @@ public class XmppConnectionService extends Service {
break;
case ACTION_FCM_MESSAGE_RECEIVED:
pushedAccountHash = intent.getStringExtra("account");
+ pushedChannelHash = intent.getStringExtra("channel");
Log.d(Config.LOGTAG, "push message arrived in service. account=" + pushedAccountHash);
break;
case Intent.ACTION_SEND:
@@ -734,13 +736,18 @@ public class XmppConnectionService extends Service {
synchronized (this) {
WakeLockHelper.acquire(wakeLock);
boolean pingNow = ConnectivityManager.CONNECTIVITY_ACTION.equals(action) || (Config.POST_CONNECTIVITY_CHANGE_PING_INTERVAL > 0 && ACTION_POST_CONNECTIVITY_CHANGE.equals(action));
- HashSet<Account> pingCandidates = new HashSet<>();
+ final HashSet<Account> pingCandidates = new HashSet<>();
+ final String androidId = PhoneHelper.getAndroidId(this);
for (Account account : accounts) {
+ final boolean pushWasMeantForThisAccount = CryptoHelper.getAccountFingerprint(account, androidId).equals(pushedAccountHash);
pingNow |= processAccountState(account,
interactive,
"ui".equals(action),
- CryptoHelper.getAccountFingerprint(account, PhoneHelper.getAndroidId(this)).equals(pushedAccountHash),
+ pushWasMeantForThisAccount,
pingCandidates);
+ if (pushWasMeantForThisAccount && pushedChannelHash != null) {
+ checkMucStillJoined(account, pushedAccountHash, androidId);
+ }
}
if (pingNow) {
for (Account account : pingCandidates) {
@@ -876,6 +883,20 @@ public class XmppConnectionService extends Service {
editor.apply();
}
+ private void checkMucStillJoined(final Account account, final String hash, final String androidId) {
+ for (final Conversation conversation : this.conversations) {
+ if (conversation.getAccount() == account && conversation.getMode() == Conversational.MODE_MULTI) {
+ Jid jid = conversation.getJid().asBareJid();
+ final String currentHash = CryptoHelper.getFingerprint(jid, androidId);
+ if (currentHash.equals(hash)) {
+ Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received cloud push notification for MUC " + jid);
+ return;
+ }
+ }
+ }
+ mPushManagementService.unregisterChannel(account, hash);
+ }
+
public void reinitializeMuclumbusService() {
mChannelDiscoveryService.initializeMuclumbusService();
}
@@ -914,7 +935,7 @@ public class XmppConnectionService extends Service {
}
@Override
- public void userInputRequried(PendingIntent pi, Message object) {
+ public void userInputRequired(PendingIntent pi, Message object) {
}
});
diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
index 27fb7fe90..cdd4a00df 100644
--- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
@@ -103,7 +103,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
}
@Override
- public void userInputRequried(PendingIntent pi, Conversation object) {
+ public void userInputRequired(PendingIntent pi, Conversation object) {
}
};
diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
index ad5b15894..04b52adc3 100644
--- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
+++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java
@@ -718,7 +718,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
}
@Override
- public void userInputRequried(PendingIntent pi, Message object) {
+ public void userInputRequired(PendingIntent pi, Message object) {
}
});
@@ -752,7 +752,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
}
@Override
- public void userInputRequried(PendingIntent pi, Message message) {
+ public void userInputRequired(PendingIntent pi, Message message) {
hidePrepareFileToast(prepareFileToast);
}
});
@@ -769,7 +769,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
new UiCallback<Message>() {
@Override
- public void userInputRequried(PendingIntent pi, Message object) {
+ public void userInputRequired(PendingIntent pi, Message object) {
hidePrepareFileToast(prepareFileToast);
}
@@ -797,7 +797,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
new UiCallback<Message>() {
@Override
- public void userInputRequried(PendingIntent pi, Message object) {
+ public void userInputRequired(PendingIntent pi, Message object) {
hidePrepareFileToast(prepareFileToast);
}
@@ -829,7 +829,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
activity.xmppConnectionService.attachImageToConversation(conversation, uri,
new UiCallback<Message>() {
@Override
- public void userInputRequried(PendingIntent pi, Message object) {
+ public void userInputRequired(PendingIntent pi, Message object) {
hidePrepareFileToast(prepareFileToast);
}
@@ -1544,7 +1544,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
new UiCallback<Contact>() {
@Override
- public void userInputRequried(PendingIntent pi, Contact contact) {
+ public void userInputRequired(PendingIntent pi, Contact contact) {
startPendingIntent(pi, attachmentChoice);
}
@@ -2721,7 +2721,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
new UiCallback<Contact>() {
@Override
- public void userInputRequried(PendingIntent pi, Contact contact) {
+ public void userInputRequired(PendingIntent pi, Contact contact) {
startPendingIntent(pi, REQUEST_ENCRYPT_MESSAGE);
}
@@ -2779,7 +2779,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
new UiCallback<Message>() {
@Override
- public void userInputRequried(PendingIntent pi, Message message) {
+ public void userInputRequired(PendingIntent pi, Message message) {
startPendingIntent(pi, REQUEST_SEND_MESSAGE);
}
diff --git a/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java b/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java
index 6f4f00bce..980ce5bce 100644
--- a/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java
@@ -353,7 +353,7 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
private final UiCallback<Avatar> mAvatarFetchCallback = new UiCallback<Avatar>() {
@Override
- public void userInputRequried(final PendingIntent pi, final Avatar avatar) {
+ public void userInputRequired(final PendingIntent pi, final Avatar avatar) {
finishInitialSetup(avatar);
}
@@ -1023,7 +1023,7 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
}
@Override
- public void userInputRequried(PendingIntent pi, String object) {
+ public void userInputRequired(PendingIntent pi, String object) {
mPendingPresenceTemplate.push(template);
try {
startIntentSenderForResult(pi.getIntentSender(), REQUEST_CHANGE_STATUS, null, 0, 0, 0);
diff --git a/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java b/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java
index 4689add0a..68aa128b6 100644
--- a/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/StartConversationActivity.java
@@ -171,7 +171,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
}
@Override
- public void userInputRequried(PendingIntent pi, Conversation object) {
+ public void userInputRequired(PendingIntent pi, Conversation object) {
}
};
@@ -1050,7 +1050,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
}
@Override
- public void userInputRequried(PendingIntent pi, Conversation object) {
+ public void userInputRequired(PendingIntent pi, Conversation object) {
}
});
diff --git a/src/main/java/de/pixart/messenger/ui/UiCallback.java b/src/main/java/de/pixart/messenger/ui/UiCallback.java
index 310a49255..59b12c7e6 100644
--- a/src/main/java/de/pixart/messenger/ui/UiCallback.java
+++ b/src/main/java/de/pixart/messenger/ui/UiCallback.java
@@ -7,5 +7,5 @@ public interface UiCallback<T> {
void error(int errorCode, T object);
- void userInputRequried(PendingIntent pi, T object);
+ void userInputRequired(PendingIntent pi, T object);
}
diff --git a/src/main/java/de/pixart/messenger/ui/XmppActivity.java b/src/main/java/de/pixart/messenger/ui/XmppActivity.java
index bcdcafe37..05d5c4d31 100644
--- a/src/main/java/de/pixart/messenger/ui/XmppActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/XmppActivity.java
@@ -164,7 +164,7 @@ public abstract class XmppActivity extends ActionBarActivity {
}
@Override
- public void userInputRequried(PendingIntent pi, Conversation object) {
+ public void userInputRequired(PendingIntent pi, Conversation object) {
}
};
@@ -582,7 +582,7 @@ public abstract class XmppActivity extends ActionBarActivity {
xmppConnectionService.getPgpEngine().generateSignature(intent, account, status, new UiCallback<String>() {
@Override
- public void userInputRequried(PendingIntent pi, String signature) {
+ public void userInputRequired(PendingIntent pi, String signature) {
try {
startIntentSenderForResult(pi.getIntentSender(), REQUEST_ANNOUNCE_PGP, null, 0, 0, 0);
} catch (final SendIntentException ignored) {
@@ -642,7 +642,7 @@ public abstract class XmppActivity extends ActionBarActivity {
}
@Override
- public void userInputRequried(PendingIntent pi, Account object) {
+ public void userInputRequired(PendingIntent pi, Account object) {
try {
startIntentSenderForResult(pi.getIntentSender(),
REQUEST_CHOOSE_PGP_ID, null, 0, 0, 0);
diff --git a/src/main/java/de/pixart/messenger/utils/CryptoHelper.java b/src/main/java/de/pixart/messenger/utils/CryptoHelper.java
index 5d1e7980c..6d14ccf93 100644
--- a/src/main/java/de/pixart/messenger/utils/CryptoHelper.java
+++ b/src/main/java/de/pixart/messenger/utils/CryptoHelper.java
@@ -246,8 +246,12 @@ public final class CryptoHelper {
return prettifyFingerprintCert(bytesToHex(fingerprint));
}
+ public static String getFingerprint(Jid jid, String androidId) {
+ return getFingerprint(jid.toEscapedString() + "\00" + androidId);
+ }
+
public static String getAccountFingerprint(Account account, String androidId) {
- return getFingerprint(account.getJid().asBareJid().toEscapedString() + "\00" + androidId);
+ return getFingerprint(account.getJid().asBareJid(), androidId);
}
public static String getFingerprint(String value) {
diff --git a/src/standard/java/de/pixart/messenger/services/PushManagementService.java b/src/standard/java/de/pixart/messenger/services/PushManagementService.java
index 0f11e3759..49d2589ba 100644
--- a/src/standard/java/de/pixart/messenger/services/PushManagementService.java
+++ b/src/standard/java/de/pixart/messenger/services/PushManagementService.java
@@ -18,6 +18,10 @@ public class PushManagementService {
//stub implementation. only affects playstore flavor
}
+ void unregisterChannel(Account account, String hash) {
+ //stub implementation. only affects playstore flavor
+ }
+
void disablePushOnServer(Conversation conversation) {
//stub implementation. only affects playstore flavor
}
diff --git a/src/standardPush/java/de/pixart/messenger/services/PushManagementService.java b/src/standardPush/java/de/pixart/messenger/services/PushManagementService.java
index bc41ef1e6..13251ce6a 100644
--- a/src/standardPush/java/de/pixart/messenger/services/PushManagementService.java
+++ b/src/standardPush/java/de/pixart/messenger/services/PushManagementService.java
@@ -62,6 +62,19 @@ public class PushManagementService {
});
}
+ public void unregisterChannel(final Account account, final String channel) {
+ final String androidId = PhoneHelper.getAndroidId(mXmppConnectionService);
+ final Jid appServer = getAppServer();
+ final IqPacket packet = mXmppConnectionService.getIqGenerator().unregisterChannelOnAppServer(appServer, androidId, channel);
+ mXmppConnectionService.sendIqPacket(account, packet, (a, response) -> {
+ if (response.getType() == IqPacket.TYPE.RESULT) {
+ Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": successfully unregistered channel");
+ } else if (response.getType() == IqPacket.TYPE.ERROR) {
+ Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": unable to unregister channel with hash " + channel);
+ }
+ });
+ }
+
void registerPushTokenOnServer(final Conversation conversation) {
Log.d(Config.LOGTAG, conversation.getAccount().getJid().asBareJid() + ": room " + conversation.getJid().asBareJid() + " has push support");
retrieveFcmInstanceToken(token -> {