Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/iNPUTmice/Conversations.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel@gultsch.de>2022-09-24 15:58:49 +0300
committerDaniel Gultsch <daniel@gultsch.de>2022-09-24 15:58:49 +0300
commit126e8ef08cb1146976da157b20947466ed3e2303 (patch)
tree770e2c2332514af19ced6301f7b58a81939b79a6
parent9f5da6753929a1a368dabcb67f91c2cf461997f8 (diff)
refactor sasl 2 authentication code
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java84
1 files changed, 48 insertions, 36 deletions
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index 5e4a6c0ed..2ff1fc406 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -1290,43 +1290,10 @@ public class XmppConnection implements Runnable {
authenticate.setContent(firstMessage);
}
} else if (version == SaslMechanism.Version.SASL_2) {
- authenticate = new Element("authenticate", Namespace.SASL_2);
- if (!Strings.isNullOrEmpty(firstMessage)) {
- authenticate.addChild("initial-response").setContent(firstMessage);
- }
- final Element userAgent = authenticate.addChild("user-agent");
- userAgent.setAttribute("id", account.getUuid());
- userAgent
- .addChild("software")
- .setContent(mXmppConnectionService.getString(R.string.app_name));
- if (!PhoneHelper.isEmulator()) {
- userAgent
- .addChild("device")
- .setContent(String.format("%s %s", Build.MANUFACTURER, Build.MODEL));
- }
final Element inline = authElement.findChild("inline", Namespace.SASL_2);
- final boolean inlineStreamManagement =
- inline != null && inline.hasChild("sm", "urn:xmpp:sm:3");
- final Element inlineBind2 =
- inline != null ? inline.findChild("bind", Namespace.BIND2) : null;
- final Element inlineBind2Inline =
- inlineBind2 != null ? inlineBind2.findChild("inline", Namespace.BIND2) : null;
- if (inlineBind2 != null) {
- final Element bind =
- generateBindRequest(
- inlineBind2Inline == null
- ? Collections.emptyList()
- : Collections2.transform(
- inlineBind2Inline.getChildren(),
- c -> c == null ? null : c.getAttribute("var")));
- authenticate.addChild(bind);
- }
- if (inlineStreamManagement && streamId != null) {
- final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived);
- this.mSmCatchupMessageCounter.set(0);
- this.mWaitingForSmCatchup.set(true);
- authenticate.addChild(resume);
- }
+ final boolean sm = inline != null && inline.hasChild("sm", "urn:xmpp:sm:3");
+ final Collection<String> bindFeatures = bindFeatures(inline);
+ authenticate = generateAuthenticationRequest(firstMessage, bindFeatures, sm);
} else {
throw new AssertionError("Missing implementation for " + version);
}
@@ -1342,6 +1309,51 @@ public class XmppConnection implements Runnable {
tagWriter.writeElement(authenticate);
}
+ private static Collection<String> bindFeatures(final Element inline) {
+ final Element inlineBind2 =
+ inline != null ? inline.findChild("bind", Namespace.BIND2) : null;
+ final Element inlineBind2Inline =
+ inlineBind2 != null ? inlineBind2.findChild("inline", Namespace.BIND2) : null;
+ if (inlineBind2 == null) {
+ return null;
+ }
+ if (inlineBind2Inline == null) {
+ return Collections.emptyList();
+ }
+ return Collections2.transform(
+ inlineBind2Inline.getChildren(), c -> c == null ? null : c.getAttribute("var"));
+ }
+
+ private Element generateAuthenticationRequest(
+ final String firstMessage,
+ final Collection<String> bind,
+ final boolean inlineStreamManagement) {
+ final Element authenticate = new Element("authenticate", Namespace.SASL_2);
+ if (!Strings.isNullOrEmpty(firstMessage)) {
+ authenticate.addChild("initial-response").setContent(firstMessage);
+ }
+ final Element userAgent = authenticate.addChild("user-agent");
+ userAgent.setAttribute("id", account.getUuid());
+ userAgent
+ .addChild("software")
+ .setContent(mXmppConnectionService.getString(R.string.app_name));
+ if (!PhoneHelper.isEmulator()) {
+ userAgent
+ .addChild("device")
+ .setContent(String.format("%s %s", Build.MANUFACTURER, Build.MODEL));
+ }
+ if (bind != null) {
+ authenticate.addChild(generateBindRequest(bind));
+ }
+ if (inlineStreamManagement && streamId != null) {
+ final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived);
+ this.mSmCatchupMessageCounter.set(0);
+ this.mWaitingForSmCatchup.set(true);
+ authenticate.addChild(resume);
+ }
+ return authenticate;
+ }
+
private Element generateBindRequest(final Collection<String> bindFeatures) {
Log.d(Config.LOGTAG, "inline bind features: " + bindFeatures);
final Element bind = new Element("bind", Namespace.BIND2);