diff --git a/java10-shim/src/main/java/org/owasp/shim/ForJava9AndLater.java b/java10-shim/src/main/java/org/owasp/shim/ForJava9AndLater.java index 78de9746..90931546 100644 --- a/java10-shim/src/main/java/org/owasp/shim/ForJava9AndLater.java +++ b/java10-shim/src/main/java/org/owasp/shim/ForJava9AndLater.java @@ -62,6 +62,6 @@ final class ForJava9AndLater extends Java8Shim { } @Override public Set setCopyOf(Collection c) { - return Set.copyOf(c); + return Collections.unmodifiableSet(new LinkedHashSet<>(c)); } } diff --git a/owasp-java-html-sanitizer/src/main/java/org/owasp/html/HtmlPolicyBuilder.java b/owasp-java-html-sanitizer/src/main/java/org/owasp/html/HtmlPolicyBuilder.java index d5a5df05..7b126477 100644 --- a/owasp-java-html-sanitizer/src/main/java/org/owasp/html/HtmlPolicyBuilder.java +++ b/owasp-java-html-sanitizer/src/main/java/org/owasp/html/HtmlPolicyBuilder.java @@ -33,6 +33,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -428,7 +429,7 @@ public HtmlPolicyBuilder requireRelNofollowOnLinks() { public HtmlPolicyBuilder requireRelsOnLinks(String... linkValues) { this.invalidateCompiledState(); if (this.extraRelsForLinks == null) { - this.extraRelsForLinks = new HashSet<>(); + this.extraRelsForLinks = new LinkedHashSet<>(); } for (String linkValue : linkValues) { linkValue = HtmlLexer.canonicalKeywordAttributeValue(linkValue); @@ -1112,8 +1113,8 @@ static final class JoinRelsOnLinksPolicies public JoinableElementPolicy join( Iterable toJoin) { - Set extra = new HashSet<>(); - Set skip = new HashSet<>(); + Set extra = new LinkedHashSet<>(); + Set skip = new LinkedHashSet<>(); for (JoinableElementPolicy ep : toJoin) { RelsOnLinksPolicy p = (RelsOnLinksPolicy) ep; extra.addAll(p.extra); diff --git a/owasp-java-html-sanitizer/src/test/java/org/owasp/html/SanitizersTest.java b/owasp-java-html-sanitizer/src/test/java/org/owasp/html/SanitizersTest.java index 5ad6f501..3b29e023 100644 --- a/owasp-java-html-sanitizer/src/test/java/org/owasp/html/SanitizersTest.java +++ b/owasp-java-html-sanitizer/src/test/java/org/owasp/html/SanitizersTest.java @@ -252,6 +252,30 @@ public static final void testLinks() { s.sanitize("Header text")); } + @Test + public static final void testLinksRelAttributeAdditionsOrder() { + // Issue 336. + PolicyFactory pf = Sanitizers.LINKS.and( + new HtmlPolicyBuilder() + .allowElements("a") + .requireRelsOnLinks("noopener", "noreferrer") + .toFactory()); + + assertEquals( + "Link text", + pf.sanitize("Link text")); + + pf = Sanitizers.LINKS.and( + new HtmlPolicyBuilder() + .allowElements("a") + .requireRelsOnLinks("noreferrer", "noopener") + .toFactory()); + + assertEquals( + "Link text", + pf.sanitize("Link text")); + } + @Test public static final void testExplicitlyAllowedProtocolsAreCaseInsensitive() { // Issue 24. @@ -552,7 +576,7 @@ public static final void testStyleGlobally() { String want = "

This is some green text

"; assertEquals(want, policyBuilder.sanitize(input)); } - + static int fac(int n) { int ifac = 1; for (int i = 1; i <= n; ++i) {