diff --git a/resources/smack.doap b/resources/smack.doap index 88523b1cfb..d45068d7f4 100644 --- a/resources/smack.doap +++ b/resources/smack.doap @@ -645,7 +645,7 @@ complete smack-experimental - 0.3.0 + 0.4.1 diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/AffixElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/AffixElement.java index 6cda8cbf9f..1bfd3d59ad 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/AffixElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/AffixElement.java @@ -19,7 +19,7 @@ import org.jivesoftware.smack.packet.Element; /** - * Interface that marks elements that may be used as affix elements inside a {@link ContentElement}. + * Interface that marks elements that may be used as affix elements inside a {@link EnvelopeElement}. * * @see * XEP-0420: Stanza Content Encryption - §4. Affix Elements diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/ContentElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/ContentElement.java index 01424edfca..7b5892b258 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/ContentElement.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/ContentElement.java @@ -16,73 +16,30 @@ */ package org.jivesoftware.smackx.stanza_content_encryption.element; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; -import java.util.Date; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import javax.xml.namespace.QName; - -import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.NamedElement; import org.jivesoftware.smack.packet.XmlElement; import org.jivesoftware.smack.packet.XmlEnvironment; -import org.jivesoftware.smack.util.Objects; import org.jivesoftware.smack.util.XmlStringBuilder; -import org.jivesoftware.smackx.address.packet.MultipleAddresses; -import org.jivesoftware.smackx.hints.element.MessageProcessingHint; -import org.jivesoftware.smackx.sid.element.StanzaIdElement; - -import org.jxmpp.jid.Jid; - /** - * Extension element that holds the payload element, as well as a list of affix elements. - * In SCE, the XML representation of this element is what will be encrypted using the encryption mechanism of choice. + * Class that represents a content element in ContentElement. + * + * @author Paul Schaub + * @author Eng Chong Meng */ -public class ContentElement implements ExtensionElement { - - private static final String NAMESPACE_UNVERSIONED = "urn:xmpp:sce"; - public static final String NAMESPACE_0 = NAMESPACE_UNVERSIONED + ":0"; - public static final String NAMESPACE = NAMESPACE_0; +public class ContentElement implements NamedElement { public static final String ELEMENT = "content"; - public static final QName QNAME = new QName(NAMESPACE, ELEMENT); + private final List contentElements; - private final PayloadElement payload; - private final List affixElements; - - ContentElement(PayloadElement payload, List affixElements) { - this.payload = payload; - this.affixElements = Collections.unmodifiableList(affixElements); - } - - /** - * Return the {@link PayloadElement} which holds the sensitive payload extensions. - * - * @return payload element - */ - public PayloadElement getPayload() { - return payload; + public ContentElement(List contentElements) { + this.contentElements = Collections.unmodifiableList(contentElements); } - /** - * Return a list of affix elements. - * Those are elements that need to be verified upon reception by the encryption mechanisms implementation. - * - * @see - * XEP-0420: Stanza Content Encryption - §4. Affix Elements - * - * @return list of affix elements - */ - public List getAffixElements() { - return affixElements; - } - - @Override - public String getNamespace() { - return NAMESPACE; + public List getItems() { + return contentElements; } @Override @@ -93,199 +50,7 @@ public String getElementName() { @Override public XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { XmlStringBuilder xml = new XmlStringBuilder(this).rightAngleBracket(); - xml.append(affixElements); - xml.append(payload); + xml.append(contentElements); return xml.closeElement(this); } - - @Override - public QName getQName() { - return QNAME; - } - - /** - * Return a {@link Builder} that can be used to build the {@link ContentElement}. - * @return builder - */ - public static Builder builder() { - return new Builder(); - } - - public static final class Builder { - private static final Set BLACKLISTED_NAMESPACES = Collections.singleton(MessageProcessingHint.NAMESPACE); - private static final Set BLACKLISTED_QNAMES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( - StanzaIdElement.QNAME, - MultipleAddresses.QNAME - ))); - - private FromAffixElement from = null; - private TimestampAffixElement timestamp = null; - private RandomPaddingAffixElement rpad = null; - - private final List otherAffixElements = new ArrayList<>(); - private final List payloadItems = new ArrayList<>(); - - private Builder() { - - } - - /** - * Add an affix element of type 'to' which addresses one recipient. - * The jid in the 'to' element SHOULD be a bare jid. - * - * @param jid jid - * @return builder - */ - public Builder addTo(Jid jid) { - return addTo(new ToAffixElement(jid)); - } - - /** - * Add an affix element of type 'to' which addresses one recipient. - * - * @param to affix element - * @return builder - */ - public Builder addTo(ToAffixElement to) { - this.otherAffixElements.add(Objects.requireNonNull(to, "'to' affix element MUST NOT be null.")); - return this; - } - - /** - * Set the senders jid as a 'from' affix element. - * - * @param jid jid of the sender - * @return builder - */ - public Builder setFrom(Jid jid) { - return setFrom(new FromAffixElement(jid)); - } - - /** - * Set the senders jid as a 'from' affix element. - * - * @param from affix element - * @return builder - */ - public Builder setFrom(FromAffixElement from) { - this.from = Objects.requireNonNull(from, "'form' affix element MUST NOT be null."); - return this; - } - - /** - * Set the given date as a 'time' affix element. - * - * @param date timestamp as date - * @return builder - */ - public Builder setTimestamp(Date date) { - return setTimestamp(new TimestampAffixElement(date)); - } - - /** - * Set the timestamp of the message as a 'time' affix element. - * - * @param timestamp timestamp affix element - * @return builder - */ - public Builder setTimestamp(TimestampAffixElement timestamp) { - this.timestamp = Objects.requireNonNull(timestamp, "'time' affix element MUST NOT be null."); - return this; - } - - /** - * Set some random length random content padding. - * - * @return builder - */ - public Builder setRandomPadding() { - this.rpad = new RandomPaddingAffixElement(); - return this; - } - - /** - * Set the given string as padding. - * The padding should be of length between 1 and 200 characters. - * - * @param padding padding string - * @return builder - */ - public Builder setRandomPadding(String padding) { - return setRandomPadding(new RandomPaddingAffixElement(padding)); - } - - /** - * Set a padding affix element. - * - * @param padding affix element - * @return builder - */ - public Builder setRandomPadding(RandomPaddingAffixElement padding) { - this.rpad = Objects.requireNonNull(padding, "'rpad' affix element MUST NOT be empty."); - return this; - } - - /** - * Add an additional, SCE profile specific affix element. - * - * @param customAffixElement additional affix element - * @return builder - */ - public Builder addFurtherAffixElement(AffixElement customAffixElement) { - this.otherAffixElements.add(Objects.requireNonNull(customAffixElement, - "Custom affix element MUST NOT be null.")); - return this; - } - - /** - * Add a payload item as child element of the payload element. - * There are some items that are not allowed as payload. - * Adding those will throw an exception. - * - * @see - * XEP-0420: Stanza Content Encryption - §9. Server-processed Elements - * - * @param payloadItem extension element - * @return builder - * @throws IllegalArgumentException in case an extension element from the blacklist is added. - */ - public Builder addPayloadItem(XmlElement payloadItem) { - Objects.requireNonNull(payloadItem, "Payload item MUST NOT be null."); - this.payloadItems.add(checkForIllegalPayloadsAndPossiblyThrow(payloadItem)); - return this; - } - - /** - * Construct a content element from this builder. - * - * @return content element - */ - public ContentElement build() { - List allAffixElements = collectAffixElements(); - PayloadElement payloadElement = new PayloadElement(payloadItems); - return new ContentElement(payloadElement, allAffixElements); - } - - private static XmlElement checkForIllegalPayloadsAndPossiblyThrow(XmlElement payloadItem) { - QName qName = payloadItem.getQName(); - if (BLACKLISTED_QNAMES.contains(qName)) { - throw new IllegalArgumentException("Element identified by " + qName + - " is not allowed as payload item. See https://xmpp.org/extensions/xep-0420.html#server-processed"); - } - - String namespace = payloadItem.getNamespace(); - if (BLACKLISTED_NAMESPACES.contains(namespace)) { - throw new IllegalArgumentException("Elements of namespace '" + namespace + - "' are not allowed as payload items. See https://xmpp.org/extensions/xep-0420.html#server-processed"); - } - - return payloadItem; - } - - private List collectAffixElements() { - List allAffixElements = new ArrayList<>(Arrays.asList(rpad, from, timestamp)); - allAffixElements.addAll(otherAffixElements); - return allAffixElements; - } - } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/EnvelopeElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/EnvelopeElement.java new file mode 100644 index 0000000000..4f384d0f06 --- /dev/null +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/EnvelopeElement.java @@ -0,0 +1,288 @@ +/* + * + * Copyright 2020 Paul Schaub + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smackx.stanza_content_encryption.element; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.xml.namespace.QName; + +import org.jivesoftware.smack.packet.XmlElement; +import org.jivesoftware.smack.packet.XmlEnvironment; +import org.jivesoftware.smack.util.Objects; +import org.jivesoftware.smack.util.XmlStringBuilder; + +import org.jivesoftware.smackx.address.packet.MultipleAddresses; +import org.jivesoftware.smackx.hints.element.MessageProcessingHint; +import org.jivesoftware.smackx.sid.element.StanzaIdElement; + +import org.jxmpp.jid.Jid; + +/** + * Extension element that holds the content element, as well as a list of affix elements. + * In SCE, the XML representation of this element is what will be encrypted using the encryption mechanism of choice. + * + * @author Paul Schaub + * @author Eng Chong Meng + */ +public class EnvelopeElement implements XmlElement { + public static final String ELEMENT = "envelope"; + public static final String NAMESPACE = "urn:xmpp:sce:1"; + public static final QName QNAME = new QName(NAMESPACE, ELEMENT); + + private final List affixElements; + private final ContentElement contentElement; + + EnvelopeElement(ContentElement content, List affixElements) { + this.contentElement = content; + this.affixElements = Collections.unmodifiableList(affixElements); + } + + /** + * Return the {@link ContentElement} which holds the sensitive content extensions. + * + * @return content element + */ + public ContentElement getContentElement() { + return contentElement; + } + + /** + * Return a list of affix elements. + * Those are elements that need to be verified upon reception by the encryption mechanisms implementation. + * + * @see + * XEP-0420: Stanza Content Encryption - §4. Affix Elements + * + * @return list of affix elements + */ + public List getAffixElements() { + return affixElements; + } + + @Override + public String getNamespace() { + return NAMESPACE; + } + + @Override + public String getElementName() { + return ELEMENT; + } + + @Override + public QName getQName() { + return QNAME; + } + + @Override + public XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { + XmlStringBuilder xml = new XmlStringBuilder(this).rightAngleBracket(); + xml.append(contentElement); + xml.append(affixElements); + return xml.closeElement(this); + } + + /** + * Return a {@link Builder} that can be used to build the {@link EnvelopeElement}. + * @return builder + */ + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private static final Set BLACKLISTED_NAMESPACES = Collections.singleton(MessageProcessingHint.NAMESPACE); + private static final Set BLACKLISTED_QNAMES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList( + StanzaIdElement.QNAME, + MultipleAddresses.QNAME + ))); + + private FromAffixElement from = null; + private TimestampAffixElement timestamp = null; + private RandomPaddingAffixElement rpad = null; + + private final List otherAffixElements = new ArrayList<>(); + private final List contentItems = new ArrayList<>(); + + private Builder() { + } + + /** + * Add an affix element of type 'to' which addresses one recipient. + * The jid in the 'to' element SHOULD be a bare jid. + * + * @param jid jid + * @return builder + */ + public Builder addTo(Jid jid) { + return addTo(new ToAffixElement(jid)); + } + + /** + * Add an affix element of type 'to' which addresses one recipient. + * + * @param to affix element + * @return builder + */ + public Builder addTo(ToAffixElement to) { + this.otherAffixElements.add(Objects.requireNonNull(to, "'to' affix element MUST NOT be null.")); + return this; + } + + /** + * Set the senders jid as a 'from' affix element. + * + * @param jid jid of the sender + * @return builder + */ + public Builder setFrom(Jid jid) { + return setFrom(new FromAffixElement(jid)); + } + + /** + * Set the senders jid as a 'from' affix element. + * + * @param from affix element + * @return builder + */ + public Builder setFrom(FromAffixElement from) { + this.from = Objects.requireNonNull(from, "'form' affix element MUST NOT be null."); + return this; + } + + /** + * Set the given date as a 'time' affix element. + * + * @param date timestamp as date + * @return builder + */ + public Builder setTimestamp(Date date) { + return setTimestamp(new TimestampAffixElement(date)); + } + + /** + * Set the timestamp of the message as a 'time' affix element. + * + * @param timestamp timestamp affix element + * @return builder + */ + public Builder setTimestamp(TimestampAffixElement timestamp) { + this.timestamp = Objects.requireNonNull(timestamp, "'time' affix element MUST NOT be null."); + return this; + } + + /** + * Set some random length random content padding. + * + * @return builder + */ + public Builder setRandomPadding() { + this.rpad = new RandomPaddingAffixElement(); + return this; + } + + /** + * Set the given string as padding. + * The padding should be of length between 1 and 200 characters. + * + * @param padding padding string + * @return builder + */ + public Builder setRandomPadding(String padding) { + return setRandomPadding(new RandomPaddingAffixElement(padding)); + } + + /** + * Set a padding affix element. + * + * @param padding affix element + * @return builder + */ + public Builder setRandomPadding(RandomPaddingAffixElement padding) { + this.rpad = Objects.requireNonNull(padding, "'rpad' affix element MUST NOT be empty."); + return this; + } + + /** + * Add an additional, SCE profile specific affix element. + * + * @param customAffixElement additional affix element + * @return builder + */ + public Builder addFurtherAffixElement(AffixElement customAffixElement) { + this.otherAffixElements.add(Objects.requireNonNull(customAffixElement, + "Custom affix element MUST NOT be null.")); + return this; + } + + /** + * Add an item as child element of the content element. + * There are some items that are not allowed as content. + * Adding those will throw an exception. + * + * @see + * XEP-0420: Stanza Content Encryption - §9. Server-processed Elements + * + * @param contentItem extension element + * @return builder + * @throws IllegalArgumentException in case an extension element from the blacklist is added. + */ + public Builder addContentItem(XmlElement contentItem) { + Objects.requireNonNull(contentItem, "Content item MUST NOT be null."); + this.contentItems.add(checkForIllegalContentAndPossiblyThrow(contentItem)); + return this; + } + + /** + * Construct a content element from this builder. + * + * @return content element + */ + public EnvelopeElement build() { + List allAffixElements = collectAffixElements(); + ContentElement contentElement = new ContentElement(contentItems); + return new EnvelopeElement(contentElement, allAffixElements); + } + + private static XmlElement checkForIllegalContentAndPossiblyThrow(XmlElement contentItem) { + QName qName = contentItem.getQName(); + if (BLACKLISTED_QNAMES.contains(qName)) { + throw new IllegalArgumentException("Element identified by " + qName + + " is not allowed as content item. See https://xmpp.org/extensions/xep-0420.html#server-processed"); + } + + String namespace = contentItem.getNamespace(); + if (BLACKLISTED_NAMESPACES.contains(namespace)) { + throw new IllegalArgumentException("Elements of namespace '" + namespace + + "' are not allowed as content items. See https://xmpp.org/extensions/xep-0420.html#server-processed"); + } + return contentItem; + } + + private List collectAffixElements() { + List allAffixElements = new ArrayList<>(Arrays.asList(rpad, from, timestamp)); + allAffixElements.addAll(otherAffixElements); + return allAffixElements; + } + } +} diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/PayloadElement.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/PayloadElement.java deleted file mode 100644 index 9cdc976c6e..0000000000 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/element/PayloadElement.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2020 Paul Schaub - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jivesoftware.smackx.stanza_content_encryption.element; - -import java.util.Collections; -import java.util.List; - -import org.jivesoftware.smack.packet.NamedElement; -import org.jivesoftware.smack.packet.XmlElement; -import org.jivesoftware.smack.packet.XmlEnvironment; -import org.jivesoftware.smack.util.XmlStringBuilder; - -public class PayloadElement implements NamedElement { - - public static final String ELEMENT = "payload"; - - private final List payloadElements; - - public PayloadElement(List payloadElements) { - this.payloadElements = Collections.unmodifiableList(payloadElements); - } - - public List getItems() { - return payloadElements; - } - - @Override - public String getElementName() { - return ELEMENT; - } - - @Override - public XmlStringBuilder toXML(XmlEnvironment xmlEnvironment) { - XmlStringBuilder xml = new XmlStringBuilder(this).rightAngleBracket(); - xml.append(payloadElements); - return xml.closeElement(this); - } -} diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/provider/ContentElementProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/provider/EnvelopeElementProvider.java similarity index 83% rename from smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/provider/ContentElementProvider.java rename to smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/provider/EnvelopeElementProvider.java index c79b9e78ea..63bbfb81ff 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/provider/ContentElementProvider.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/stanza_content_encryption/provider/EnvelopeElementProvider.java @@ -31,8 +31,8 @@ import org.jivesoftware.smackx.stanza_content_encryption.element.AffixElement; import org.jivesoftware.smackx.stanza_content_encryption.element.ContentElement; +import org.jivesoftware.smackx.stanza_content_encryption.element.EnvelopeElement; import org.jivesoftware.smackx.stanza_content_encryption.element.FromAffixElement; -import org.jivesoftware.smackx.stanza_content_encryption.element.PayloadElement; import org.jivesoftware.smackx.stanza_content_encryption.element.RandomPaddingAffixElement; import org.jivesoftware.smackx.stanza_content_encryption.element.TimestampAffixElement; import org.jivesoftware.smackx.stanza_content_encryption.element.ToAffixElement; @@ -41,12 +41,11 @@ import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; -public class ContentElementProvider extends ExtensionElementProvider { - +public class EnvelopeElementProvider extends ExtensionElementProvider { @Override - public ContentElement parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment, JxmppContext jxmppContext) + public EnvelopeElement parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment, JxmppContext jxmppContext) throws XmlPullParserException, IOException, ParseException, SmackParsingException { - ContentElement.Builder builder = ContentElement.builder(); + EnvelopeElement.Builder builder = EnvelopeElement.builder(); while (true) { XmlPullParser.Event tag = parser.next(); @@ -69,8 +68,8 @@ public ContentElement parse(XmlPullParser parser, int initialDepth, XmlEnvironme parseRPadAffix(parser, builder); break; - case PayloadElement.ELEMENT: - parsePayload(parser, xmlEnvironment, jxmppContext, builder); + case ContentElement.ELEMENT: + parseContent(parser, xmlEnvironment, jxmppContext, builder); break; default: @@ -86,7 +85,7 @@ public ContentElement parse(XmlPullParser parser, int initialDepth, XmlEnvironme return builder.build(); } - private static void parseCustomAffix(XmlPullParser parser, XmlEnvironment outerXmlEnvironment, JxmppContext jxmppContext, ContentElement.Builder builder) + private static void parseCustomAffix(XmlPullParser parser, XmlEnvironment outerXmlEnvironment, JxmppContext jxmppContext, EnvelopeElement.Builder builder) throws XmlPullParserException, IOException, SmackParsingException { String name = parser.getName(); String namespace = parser.getNamespace(); @@ -95,7 +94,7 @@ private static void parseCustomAffix(XmlPullParser parser, XmlEnvironment outerX builder.addFurtherAffixElement(element); } - private static void parsePayload(XmlPullParser parser, XmlEnvironment outerXmlEnvironment, JxmppContext jxmppContext, ContentElement.Builder builder) + private static void parseContent(XmlPullParser parser, XmlEnvironment outerXmlEnvironment, JxmppContext jxmppContext, EnvelopeElement.Builder builder) throws IOException, XmlPullParserException, SmackParsingException { final int initialDepth = parser.getDepth(); while (true) { @@ -105,7 +104,7 @@ private static void parsePayload(XmlPullParser parser, XmlEnvironment outerXmlEn String name = parser.getName(); String namespace = parser.getNamespace(); XmlElement element = PacketParserUtils.parseExtensionElement(name, namespace, parser, outerXmlEnvironment, jxmppContext); - builder.addPayloadItem(element); + builder.addContentItem(element); } if (tag == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == initialDepth) { @@ -114,25 +113,25 @@ private static void parsePayload(XmlPullParser parser, XmlEnvironment outerXmlEn } } - private static void parseRPadAffix(XmlPullParser parser, ContentElement.Builder builder) + private static void parseRPadAffix(XmlPullParser parser, EnvelopeElement.Builder builder) throws IOException, XmlPullParserException { builder.setRandomPadding(parser.nextText()); } - private static void parseTimestampAffix(XmlPullParser parser, ContentElement.Builder builder) + private static void parseTimestampAffix(XmlPullParser parser, EnvelopeElement.Builder builder) throws ParseException { Date timestamp = ParserUtils.getDateFromXep82String( parser.getAttributeValue("", TimestampAffixElement.ATTR_STAMP)); builder.setTimestamp(timestamp); } - private static void parseFromAffix(XmlPullParser parser, ContentElement.Builder builder) + private static void parseFromAffix(XmlPullParser parser, EnvelopeElement.Builder builder) throws XmppStringprepException { String jidString = parser.getAttributeValue("", FromAffixElement.ATTR_JID); builder.setFrom(JidCreate.from(jidString)); } - private static void parseToAffix(XmlPullParser parser, ContentElement.Builder builder) + private static void parseToAffix(XmlPullParser parser, EnvelopeElement.Builder builder) throws XmppStringprepException { String jidString = parser.getAttributeValue("", ToAffixElement.ATTR_JID); builder.addTo(JidCreate.from(jidString)); diff --git a/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers b/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers index 822bc58375..a50892971f 100644 --- a/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers +++ b/smack-experimental/src/main/resources/org.jivesoftware.smack.experimental/experimental.providers @@ -322,8 +322,8 @@ content - urn:xmpp:sce:0 - org.jivesoftware.smackx.stanza_content_encryption.provider.ContentElementProvider + urn:xmpp:sce:1 + org.jivesoftware.smackx.stanza_content_encryption.provider.EnvelopeElementProvider diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/element/ContentElementTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/element/EnvelopeElementTest.java similarity index 66% rename from smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/element/ContentElementTest.java rename to smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/element/EnvelopeElementTest.java index 1b25869798..ae53c2857c 100644 --- a/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/element/ContentElementTest.java +++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/element/EnvelopeElementTest.java @@ -32,14 +32,14 @@ import org.junit.jupiter.api.Test; import org.jxmpp.util.XmppDateTime; -public class ContentElementTest { +public class EnvelopeElementTest { @Test - public void testContentElement() throws ParseException { + public void testEnvelopeElement() throws ParseException { Message.Body body = new Message.Body("en", "My battery is low and it’s getting dark"); // :'( - ContentElement contentElement = ContentElement.builder() - .addPayloadItem(body) + EnvelopeElement envelopeElement = EnvelopeElement.builder() + .addContentItem(body) .setFrom(AffixElementsTest.JID_OPPORTUNITY) .addTo(AffixElementsTest.JID_HOUSTON) .setTimestamp(XmppDateTime.parseXEP0082Date("2018-06-10T00:00:00.000+00:00")) @@ -47,36 +47,36 @@ public void testContentElement() throws ParseException { .build(); String expectedXml = "" + - "" + + "" + " " + " " + " "; + " " + + ""; - assertXmlSimilar(expectedXml, contentElement.toXML()); - assertEquals(Collections.singletonList(body), contentElement.getPayload().getItems()); + assertXmlSimilar(expectedXml, envelopeElement.toXML()); + assertEquals(Collections.singletonList(body), envelopeElement.getContentElement().getItems()); - assertEquals(4, contentElement.getAffixElements().size()); - assertTrue(contentElement.getAffixElements().contains(new ToAffixElement(AffixElementsTest.JID_HOUSTON))); - assertTrue(contentElement.getAffixElements().contains(new FromAffixElement(AffixElementsTest.JID_OPPORTUNITY))); - assertTrue(contentElement.getAffixElements().contains( + assertEquals(4, envelopeElement.getAffixElements().size()); + assertTrue(envelopeElement.getAffixElements().contains(new ToAffixElement(AffixElementsTest.JID_HOUSTON))); + assertTrue(envelopeElement.getAffixElements().contains(new FromAffixElement(AffixElementsTest.JID_OPPORTUNITY))); + assertTrue(envelopeElement.getAffixElements().contains( new TimestampAffixElement(XmppDateTime.parseXEP0082Date("2018-06-10T00:00:00.000+00:00")))); - assertTrue(contentElement.getAffixElements().contains(new RandomPaddingAffixElement("RANDOMPADDING"))); + assertTrue(envelopeElement.getAffixElements().contains(new RandomPaddingAffixElement("RANDOMPADDING"))); } @Test public void stanzaIdForbiddenInContentElementPayload() { assertThrows(IllegalArgumentException.class, - () -> ContentElement.builder().addPayloadItem(new StanzaIdElement("alice@wonderland.lit"))); + () -> EnvelopeElement.builder().addContentItem(new StanzaIdElement("alice@wonderland.lit"))); } @Test public void processingHintsForbiddenInContentElementPayload() { assertThrows(IllegalArgumentException.class, - () -> ContentElement.builder().addPayloadItem(StoreHint.INSTANCE)); + () -> EnvelopeElement.builder().addContentItem(StoreHint.INSTANCE)); } } diff --git a/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/provider/ContentElementProviderTest.java b/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/provider/EnvelopeElementProviderTest.java similarity index 74% rename from smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/provider/ContentElementProviderTest.java rename to smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/provider/EnvelopeElementProviderTest.java index fb1da23366..b71dc660d0 100644 --- a/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/provider/ContentElementProviderTest.java +++ b/smack-experimental/src/test/java/org/jivesoftware/smackx/stanza_content_encryption/provider/EnvelopeElementProviderTest.java @@ -30,7 +30,7 @@ import org.jivesoftware.smack.util.ParserUtils; import org.jivesoftware.smack.xml.XmlPullParserException; -import org.jivesoftware.smackx.stanza_content_encryption.element.ContentElement; +import org.jivesoftware.smackx.stanza_content_encryption.element.EnvelopeElement; import org.jivesoftware.smackx.stanza_content_encryption.element.FromAffixElement; import org.jivesoftware.smackx.stanza_content_encryption.element.RandomPaddingAffixElement; import org.jivesoftware.smackx.stanza_content_encryption.element.TimestampAffixElement; @@ -39,46 +39,46 @@ import org.junit.jupiter.api.Test; import org.jxmpp.jid.impl.JidCreate; -public class ContentElementProviderTest { +public class EnvelopeElementProviderTest { @Test public void testParsing() throws XmlPullParserException, IOException, SmackParsingException, ParseException { String xml = "" + - "\n" + - " \n" + + "\n" + + " \n" + " Have you seen that new movie?\n" + " \n" + " https://en.wikipedia.org/wiki/Fight_Club#Plot\n" + " \n" + - " \n" + + " \n" + " \n" + " \n" + "