From 2833fc833c54ecdcfd4e0295e39f60cfe3d33712 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 11 Feb 2024 10:40:50 +0100 Subject: [PATCH] fix JET spec compliance --- .../jingle/JingleFileTransferConnection.java | 13 +++++-- .../xmpp/jingle/stanzas/Content.java | 34 +++++++++++++++++ .../xmpp/jingle/stanzas/JinglePacket.java | 38 ------------------- 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java index 0f7247fdc..632a8f034 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleFileTransferConnection.java @@ -209,8 +209,12 @@ public class JingleFileTransferConnection extends AbstractJingleConnection this.transportSecurity = new TransportSecurity( xmppAxolotlMessage.getInnerKey(), xmppAxolotlMessage.getIV()); - jinglePacket.setSecurity( - Iterables.getOnlyElement(contentMap.contents.keySet()), xmppAxolotlMessage); + final var contents = jinglePacket.getJingleContents(); + final var rawContent = + contents.get(Iterables.getOnlyElement(contentMap.contents.keySet())); + if (rawContent != null) { + rawContent.setSecurity(xmppAxolotlMessage); + } } jinglePacket.setTo(id.with); xmppConnectionService.sendIqPacket( @@ -327,8 +331,10 @@ public class JingleFileTransferConnection extends AbstractJingleConnection return; } final XmppAxolotlMessage.XmppAxolotlKeyTransportMessage keyTransportMessage; + final var contents = jinglePacket.getJingleContents(); + final var rawContent = contents.get(Iterables.getOnlyElement(contentMap.contents.keySet())); final var security = - jinglePacket.getSecurity(Iterables.getOnlyElement(contentMap.contents.keySet())); + rawContent == null ? null : rawContent.getSecurity(jinglePacket.getFrom()); if (security != null) { Log.d(Config.LOGTAG, "found security element!"); keyTransportMessage = @@ -349,7 +355,6 @@ public class JingleFileTransferConnection extends AbstractJingleConnection if (transition(State.SESSION_INITIALIZED, () -> setRemoteContentMap(contentMap))) { respondOk(jinglePacket); - Log.d(Config.LOGTAG, jinglePacket.toString()); Log.d( Config.LOGTAG, "got file offer " + file + " jet=" + Objects.nonNull(keyTransportMessage)); diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java index fbde212a3..a4cb13e07 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java @@ -9,8 +9,11 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import eu.siacs.conversations.Config; +import eu.siacs.conversations.crypto.axolotl.AxolotlService; +import eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.Namespace; +import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.jingle.SessionDescription; import java.util.Locale; @@ -102,6 +105,37 @@ public class Content extends Element { } } + public void setSecurity(final XmppAxolotlMessage xmppAxolotlMessage) { + final String contentName = this.getContentName(); + final Element security = new Element("security", Namespace.JINGLE_ENCRYPTED_TRANSPORT); + security.setAttribute("name", contentName); + security.setAttribute("cipher", "urn:xmpp:ciphers:aes-128-gcm-nopadding"); + security.setAttribute("type", AxolotlService.PEP_PREFIX); + security.addChild(xmppAxolotlMessage.toElement()); + this.addChild(security); + } + + public XmppAxolotlMessage getSecurity(final Jid from) { + final String contentName = this.getContentName(); + for (final Element child : this.children) { + if ("security".equals(child.getName()) + && Namespace.JINGLE_ENCRYPTED_TRANSPORT.equals(child.getNamespace())) { + final String name = child.getAttribute("name"); + final String type = child.getAttribute("type"); + final String cipher = child.getAttribute("cipher"); + if (contentName.equals(name) + && AxolotlService.PEP_PREFIX.equals(type) + && "urn:xmpp:ciphers:aes-128-gcm-nopadding".equals(cipher)) { + final var encrypted = child.findChild("encrypted", AxolotlService.PEP_PREFIX); + if (encrypted != null) { + return XmppAxolotlMessage.fromElement(encrypted, from.asBareJid()); + } + } + } + } + return null; + } + public void setTransport(GenericTransportInfo transportInfo) { this.addChild(transportInfo); } diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java index 552046fb8..82c5b155c 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/JinglePacket.java @@ -1,7 +1,5 @@ package eu.siacs.conversations.xmpp.jingle.stanzas; -import android.util.Log; - import androidx.annotation.NonNull; import com.google.common.base.CaseFormat; @@ -9,9 +7,6 @@ import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; -import eu.siacs.conversations.Config; -import eu.siacs.conversations.crypto.axolotl.AxolotlService; -import eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.Namespace; import eu.siacs.conversations.xmpp.Jid; @@ -121,39 +116,6 @@ public class JinglePacket extends IqPacket { jingle.addChild(child); } - public void setSecurity(final String name, final XmppAxolotlMessage xmppAxolotlMessage) { - final Element security = new Element("security", Namespace.JINGLE_ENCRYPTED_TRANSPORT); - security.setAttribute("name", name); - security.setAttribute("cipher", "urn:xmpp:ciphers:aes-128-gcm-nopadding"); - security.setAttribute("type", AxolotlService.PEP_PREFIX); - security.addChild(xmppAxolotlMessage.toElement()); - addJingleChild(security); - } - - public XmppAxolotlMessage getSecurity(final String nameNeedle) { - final Element jingle = findChild("jingle", Namespace.JINGLE); - if (jingle == null) { - return null; - } - for (final Element child : jingle.getChildren()) { - if ("security".equals(child.getName()) - && Namespace.JINGLE_ENCRYPTED_TRANSPORT.equals(child.getNamespace())) { - final String name = child.getAttribute("name"); - final String type = child.getAttribute("type"); - final String cipher = child.getAttribute("cipher"); - if (nameNeedle.equals(name) - && AxolotlService.PEP_PREFIX.equals(type) - && "urn:xmpp:ciphers:aes-128-gcm-nopadding".equals(cipher)) { - final var encrypted = child.findChild("encrypted", AxolotlService.PEP_PREFIX); - if (encrypted != null) { - return XmppAxolotlMessage.fromElement(encrypted, getFrom().asBareJid()); - } - } - } - } - return null; - } - public String getSessionId() { return findChild("jingle", Namespace.JINGLE).getAttribute("sid"); }