experimental mam legacy compat layer

This commit is contained in:
Daniel Gultsch 2017-02-15 16:42:35 +01:00
parent 6e62b62b80
commit caa16a8517
7 changed files with 44 additions and 10 deletions

View file

@ -374,7 +374,11 @@ public class MucOptions {
} }
public boolean mamSupport() { public boolean mamSupport() {
return hasFeature(Xmlns.MAM); return hasFeature(Xmlns.MAM) || hasFeature(Xmlns.MAM_LAGECY);
}
public boolean mamLegacy() {
return hasFeature(Xmlns.MAM_LAGECY) && !hasFeature(Xmlns.MAM);
} }
public boolean nonanonymous() { public boolean nonanonymous() {

View file

@ -10,7 +10,6 @@ import org.whispersystems.libaxolotl.ecc.ECPublicKey;
import org.whispersystems.libaxolotl.state.PreKeyRecord; import org.whispersystems.libaxolotl.state.PreKeyRecord;
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord; import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
import java.math.BigInteger;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
@ -230,10 +229,10 @@ public class IqGenerator extends AbstractGenerator {
public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) { public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) {
final IqPacket packet = new IqPacket(IqPacket.TYPE.SET); final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
final Element query = packet.query(Xmlns.MAM); final Element query = packet.query(mam.isLegacy() ? Xmlns.MAM_LAGECY : Xmlns.MAM);
query.setAttribute("queryid", mam.getQueryId()); query.setAttribute("queryid", mam.getQueryId());
final Data data = new Data(); final Data data = new Data();
data.setFormType(Xmlns.MAM); data.setFormType(mam.isLegacy() ? Xmlns.MAM_LAGECY : Xmlns.MAM);
if (mam.muc()) { if (mam.muc()) {
packet.setTo(mam.getWith()); packet.setTo(mam.getWith());
} else if (mam.getWith()!=null) { } else if (mam.getWith()!=null) {

View file

@ -300,10 +300,16 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
final boolean isForwarded; final boolean isForwarded;
boolean isCarbon = false; boolean isCarbon = false;
String serverMsgId = null; String serverMsgId = null;
final Element result = original.findChild("result",Xmlns.MAM); final Element fin = original.findChild("fin", Xmlns.MAM_LAGECY);
if (fin != null) {
mXmppConnectionService.getMessageArchiveService().processFinLagecy(fin,original.getFrom());
return;
}
final boolean mamLagecy = original.hasChild("result",Xmlns.MAM_LAGECY);
final Element result = original.findChild("result",mamLagecy ? Xmlns.MAM_LAGECY : Xmlns.MAM);
final MessageArchiveService.Query query = result == null ? null : mXmppConnectionService.getMessageArchiveService().findQuery(result.getAttribute("queryid")); final MessageArchiveService.Query query = result == null ? null : mXmppConnectionService.getMessageArchiveService().findQuery(result.getAttribute("queryid"));
if (query != null && query.validFrom(original.getFrom())) { if (query != null && query.validFrom(original.getFrom())) {
Pair<MessagePacket, Long> f = original.getForwardedMessagePacket("result", Xmlns.MAM); Pair<MessagePacket, Long> f = original.getForwardedMessagePacket("result", mamLagecy ? Xmlns.MAM_LAGECY : Xmlns.MAM);
if (f == null) { if (f == null) {
return; return;
} }

View file

@ -164,8 +164,10 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
query.callback(false); query.callback(false);
} }
} }
} else if (packet.getType() == IqPacket.TYPE.RESULT && fin != null) { } else if (packet.getType() == IqPacket.TYPE.RESULT && fin != null ) {
processFin(fin); processFin(fin);
} else if (packet.getType() == IqPacket.TYPE.RESULT && query.isLegacy()) {
//do nothing
} else { } else {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": error executing mam: " + packet.toString()); Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": error executing mam: " + packet.toString());
finalizeQuery(query, true); finalizeQuery(query, true);
@ -219,6 +221,13 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
return queryInProgress(conversation, null); return queryInProgress(conversation, null);
} }
public void processFinLagecy(Element fin, Jid from) {
Query query = findQuery(fin.getAttribute("queryid"));
if (query != null && query.validFrom(from)) {
processFin(fin);
}
}
public void processFin(Element fin) { public void processFin(Element fin) {
Query query = findQuery(fin.getAttribute("queryid")); Query query = findQuery(fin.getAttribute("queryid"));
if (query == null) { if (query == null) {
@ -319,6 +328,14 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded {
return query; return query;
} }
public boolean isLegacy() {
if (conversation == null || conversation.getMode() == Conversation.MODE_SINGLE) {
return account.getXmppConnection().getFeatures().mamLegacy();
} else {
return conversation.getMucOptions().mamLegacy();
}
}
public Query next(String reference) { public Query next(String reference) {
Query query = page(reference); Query query = page(reference);
query.pagingOrder = PagingOrder.NORMAL; query.pagingOrder = PagingOrder.NORMAL;

View file

@ -3711,12 +3711,13 @@ public class XmppConnectionService extends Service {
} }
public void fetchMamPreferences(Account account, final OnMamPreferencesFetched callback) { public void fetchMamPreferences(Account account, final OnMamPreferencesFetched callback) {
final boolean lagecy = account.getXmppConnection().getFeatures().mamLegacy();
IqPacket request = new IqPacket(IqPacket.TYPE.GET); IqPacket request = new IqPacket(IqPacket.TYPE.GET);
request.addChild("prefs",Xmlns.MAM); request.addChild("prefs",lagecy ? Xmlns.MAM_LAGECY : Xmlns.MAM);
sendIqPacket(account, request, new OnIqPacketReceived() { sendIqPacket(account, request, new OnIqPacketReceived() {
@Override @Override
public void onIqPacketReceived(Account account, IqPacket packet) { public void onIqPacketReceived(Account account, IqPacket packet) {
Element prefs = packet.findChild("prefs",Xmlns.MAM); Element prefs = packet.findChild("prefs",lagecy ? Xmlns.MAM_LAGECY : Xmlns.MAM);
if (packet.getType() == IqPacket.TYPE.RESULT && prefs != null) { if (packet.getType() == IqPacket.TYPE.RESULT && prefs != null) {
callback.onPreferencesFetched(prefs); callback.onPreferencesFetched(prefs);
} else { } else {

View file

@ -8,4 +8,5 @@ public final class Xmlns {
public static final String HTTP_UPLOAD = "urn:xmpp:http:upload"; public static final String HTTP_UPLOAD = "urn:xmpp:http:upload";
public static final String STANZA_IDS = "urn:xmpp:sid:0"; public static final String STANZA_IDS = "urn:xmpp:sid:0";
public static final String MAM = "urn:xmpp:mam:1"; public static final String MAM = "urn:xmpp:mam:1";
public static final String MAM_LAGECY = "urn:xmpp:mam:0";
} }

View file

@ -1628,7 +1628,13 @@ public class XmppConnection implements Runnable {
} }
public boolean mam() { public boolean mam() {
return hasDiscoFeature(account.getJid().toBareJid(), Xmlns.MAM); return hasDiscoFeature(account.getJid().toBareJid(), Xmlns.MAM)
|| hasDiscoFeature(account.getJid().toBareJid(), Xmlns.MAM_LAGECY);
}
public boolean mamLegacy() {
return !hasDiscoFeature(account.getJid().toBareJid(),Xmlns.MAM)
&& hasDiscoFeature(account.getJid().toBareJid(),Xmlns.MAM_LAGECY);
} }
public boolean push() { public boolean push() {