aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/utils/XmppUri.java
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel@gultsch.de>2016-11-17 20:09:42 +0100
committerDaniel Gultsch <daniel@gultsch.de>2016-11-17 20:09:42 +0100
commit7e2e42cb11fdd8fc126795f6005956ccffe084ff (patch)
treee2523c145208bcb80c82766a1633d6b015b7c565 /src/main/java/eu/siacs/conversations/utils/XmppUri.java
parent3f3b360eeeabf06c3b7c43ff05ad6ed8cf307473 (diff)
parse omemo fingerprints from uris
Diffstat (limited to 'src/main/java/eu/siacs/conversations/utils/XmppUri.java')
-rw-r--r--src/main/java/eu/siacs/conversations/utils/XmppUri.java71
1 files changed, 57 insertions, 14 deletions
diff --git a/src/main/java/eu/siacs/conversations/utils/XmppUri.java b/src/main/java/eu/siacs/conversations/utils/XmppUri.java
index 15a6c9a1..b2dcc553 100644
--- a/src/main/java/eu/siacs/conversations/utils/XmppUri.java
+++ b/src/main/java/eu/siacs/conversations/utils/XmppUri.java
@@ -4,7 +4,9 @@ import android.net.Uri;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
@@ -13,7 +15,9 @@ public class XmppUri {
protected String jid;
protected boolean muc;
- protected String fingerprint;
+ protected List<Fingerprint> fingerprints = new ArrayList<>();
+
+ private static final String OMEMO_URI_PARAM = "omemo-sid-";
public XmppUri(String uri) {
try {
@@ -56,7 +60,7 @@ public class XmppUri {
} else {
jid = uri.getSchemeSpecificPart().split("\\?")[0];
}
- fingerprint = parseFingerprint(uri.getQuery());
+ this.fingerprints = parseFingerprints(uri.getQuery());
} else if ("imto".equalsIgnoreCase(scheme)) {
// sample: imto://xmpp/foo@bar.com
try {
@@ -73,18 +77,28 @@ public class XmppUri {
}
}
- protected String parseFingerprint(String query) {
- if (query == null) {
- return null;
- } else {
- final String NEEDLE = "otr-fingerprint=";
- int index = query.indexOf(NEEDLE);
- if (index >= 0 && query.length() >= (NEEDLE.length() + index + 40)) {
- return query.substring(index + NEEDLE.length(), index + NEEDLE.length() + 40);
- } else {
- return null;
+ protected List<Fingerprint> parseFingerprints(String query) {
+ List<Fingerprint> fingerprints = new ArrayList<>();
+ String[] pairs = query == null ? new String[0] : query.split(";");
+ for(String pair : pairs) {
+ String[] parts = pair.split("=",2);
+ if (parts.length == 2) {
+ String key = parts[0].toLowerCase(Locale.US);
+ String value = parts[1];
+ if ("otr-fingerprint".equals(key)) {
+ fingerprints.add(new Fingerprint(FingerprintType.OTR,value));
+ }
+ if (key.startsWith(OMEMO_URI_PARAM)) {
+ try {
+ int id = Integer.parseInt(key.substring(OMEMO_URI_PARAM.length()));
+ fingerprints.add(new Fingerprint(FingerprintType.OMEMO,value,id));
+ } catch (Exception e) {
+ //ignoring invalid device id
+ }
+ }
}
}
+ return fingerprints;
}
public Jid getJid() {
@@ -95,7 +109,36 @@ public class XmppUri {
}
}
- public String getFingerprint() {
- return this.fingerprint;
+ public List<Fingerprint> getFingerprints() {
+ return this.fingerprints;
+ }
+
+ public boolean hasFingerprints() {
+ return fingerprints.size() > 0;
+ }
+ public enum FingerprintType {
+ OMEMO,
+ OTR
+ }
+
+ public static class Fingerprint {
+ public final FingerprintType type;
+ public final String fingerprint;
+ public final int deviceId;
+
+ public Fingerprint(FingerprintType type, String fingerprint) {
+ this(type, fingerprint, 0);
+ }
+
+ public Fingerprint(FingerprintType type, String fingerprint, int deviceId) {
+ this.type = type;
+ this.fingerprint = fingerprint;
+ this.deviceId = deviceId;
+ }
+
+ @Override
+ public String toString() {
+ return type.toString()+": "+fingerprint+(deviceId != 0 ? " "+String.valueOf(deviceId) : "");
+ }
}
}