/* * Copyright 2014 ForgeRock AS. * * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions copyright [year] [name of copyright owner]". */ package com.sun.identity.shared.whitelist; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.net.MalformedURLException; import java.util.HashMap; import static org.fest.assertions.Assertions.assertThat; /** * Exercises the behaviour of {@link PrefixResourceName}. */ public class PrefixResourceNameTest { private ResourceName resourceName; @BeforeClass public void setUp() { resourceName = new PrefixResourceName(); resourceName.initialize(new HashMap()); } @Test public void normaliseHandlesTrailingSlashes() throws MalformedURLException { assertThat(resourceName.canonicalize("http://a.b.c:80///ab///cd///")).isEqualTo("http://a.b.c:80/ab/cd/"); assertThat(resourceName.canonicalize("http://a.b.c:80///ab///cd")).isEqualTo("http://a.b.c:80/ab/cd"); assertThat(resourceName.canonicalize("//a.b.c///ab///cd///")).isEqualTo("/a.b.c/ab/cd/"); assertThat(resourceName.canonicalize("//a.b.c///ab///cd")).isEqualTo("/a.b.c/ab/cd"); } @Test public void normalizationOnlyAffectsPath() throws Exception { assertThat(resourceName.canonicalize("http://a.b..c:80///ab/cd?index=hello/./world//../")) .isEqualTo("http://a.b..c:80/ab/cd?index=hello/./world//../"); assertThat(resourceName.canonicalize("http://a.b.c:80/./ab//cd/../?index=hello/./world//../")) .isEqualTo("http://a.b.c:80/ab/?index=hello/./world//../"); assertThat(resourceName.canonicalize("http://a.b.c:80/ab/../cd/.././ab///cd?index=hello/./world//../")) .isEqualTo("http://a.b.c:80/ab/cd?index=hello/./world//../"); } @Test public void normalizationShouldRemovePathNavigationSegments() throws Exception { assertThat(resourceName.canonicalize("http://w.e.c:80/aa/../zz")) .isEqualTo("http://w.e.c:80/zz"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/../zz?qq")) .isEqualTo("http://w.e.c:80/zz?qq"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/./../zz")) .isEqualTo("http://w.e.c:80/zz"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/./../zz?qq")) .isEqualTo("http://w.e.c:80/zz?qq"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/bb/cc/../cc/../../bb/../../zz")) .isEqualTo("http://w.e.c:80/zz"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/bb/cc/../cc/../../bb/../../zz?qq")) .isEqualTo("http://w.e.c:80/zz?qq"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/bb/./../bb/.././bb/../../zz")) .isEqualTo("http://w.e.c:80/zz"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/bb/./../bb/.././bb/../../zz?qq")) .isEqualTo("http://w.e.c:80/zz?qq"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/bb/././../bb/././../././../././zz")) .isEqualTo("http://w.e.c:80/zz"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/bb/././../bb/././../././../././zz?qq")) .isEqualTo("http://w.e.c:80/zz?qq"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/../aa/ee.ff")) .isEqualTo("http://w.e.c:80/aa/ee.ff"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/../aa/ee.ff?qq")) .isEqualTo("http://w.e.c:80/aa/ee.ff?qq"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/./.././aa/ee.ff")) .isEqualTo("http://w.e.c:80/aa/ee.ff"); assertThat(resourceName.canonicalize("http://w.e.c:80/aa/./.././aa/ee.ff?qq")) .isEqualTo("http://w.e.c:80/aa/ee.ff?qq"); } @Test public void verifyNullMatchBehaviour() { assertThat(resourceName.compare(null, null, true)).isEqualTo(ResourceMatch.EXACT_MATCH); assertThat(resourceName.compare(null, "abc", true)).isEqualTo(ResourceMatch.NO_MATCH); assertThat(resourceName.compare("abc", null, true)).isEqualTo(ResourceMatch.NO_MATCH); } @Test public void verifyTrailingSlashMatchBehaviour() { assertThat(resourceName.compare("/abc/def", "/abc/def", true)).isEqualTo(ResourceMatch.EXACT_MATCH); assertThat(resourceName.compare("/abc/def", "/abc/def/", true)).isEqualTo(ResourceMatch.SUB_RESOURCE_MATCH); assertThat(resourceName.compare("/abc/def/", "/abc/def", true)).isEqualTo(ResourceMatch.SUPER_RESOURCE_MATCH); } @Test public void verifyMultiLevelWildcardMatchBehaviour() { assertThat(resourceName.compare("/abc/", "/abc/*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def", "/abc/*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def/", "/abc/*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def/hij", "/abc/*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc", "/abc*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abcdef", "/abc*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def", "/abc*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def/", "/abc*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def/hij", "/abc*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/ac", "/a*c", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc", "/a*c", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/a/c", "/a*c", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/ab/dc", "/a*c", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); } @Test public void verifySingleLevelWildcardMatchBehaviour() { // Note: the single level wildcard is a lazy wildcard in that it does not // consume the forward slash marking the end of level its matching. assertThat(resourceName.compare("/abc/", "/abc/-*-", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def", "/abc/-*-", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def/", "/abc/-*-", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def/hij", "/abc/-*-", true)).isEqualTo(ResourceMatch.SUPER_RESOURCE_MATCH); assertThat(resourceName.compare("/abc", "/abc-*-", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abcdef", "/abc-*-", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/def", "/abc-*-", true)).isEqualTo(ResourceMatch.SUPER_RESOURCE_MATCH); assertThat(resourceName.compare("/abc/def/", "/abc-*-", true)).isEqualTo(ResourceMatch.SUPER_RESOURCE_MATCH); assertThat(resourceName.compare("/abc/def/hij", "/abc-*-", true)).isEqualTo(ResourceMatch.SUPER_RESOURCE_MATCH); assertThat(resourceName.compare("/ac", "/a-*-c", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc", "/a-*-c", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/ac/", "/a-*-c", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc/d", "/a-*-c", true)).isEqualTo(ResourceMatch.SUPER_RESOURCE_MATCH); assertThat(resourceName.compare("/a/c", "/a-*-c", true)).isEqualTo(ResourceMatch.NO_MATCH); assertThat(resourceName.compare("/ab/dc", "/a-*-c", true)).isEqualTo(ResourceMatch.NO_MATCH); } @Test public void ignoreWildcardMatchBehaviour() { assertThat(resourceName.compare("/axyzc/", "/a-*-c/", false)).isEqualTo(ResourceMatch.NO_MATCH); assertThat(resourceName.compare("/a-*-c/", "/a-*-c/", false)).isEqualTo(ResourceMatch.EXACT_MATCH); assertThat(resourceName.compare("/ax/yc/", "/a*c/", false)).isEqualTo(ResourceMatch.NO_MATCH); assertThat(resourceName.compare("/a*c/", "/a*c/", false)).isEqualTo(ResourceMatch.EXACT_MATCH); } @Test public void verifyQueryStringMatchBehaviour() { assertThat(resourceName.compare("/abc?", "/abc?*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc?def", "/abc?*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abc?", "/abc*?*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); assertThat(resourceName.compare("/abcdef?a=b", "/abc*?*", true)).isEqualTo(ResourceMatch.WILDCARD_MATCH); } }