Adding AliasedConstraintTest for working out alias logic
This commit is contained in:
parent
6faf94e4c1
commit
a68bf9139b
|
@ -0,0 +1,173 @@
|
|||
//
|
||||
// ========================================================================
|
||||
// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
|
||||
// ------------------------------------------------------------------------
|
||||
// All rights reserved. This program and the accompanying materials
|
||||
// are made available under the terms of the Eclipse Public License v1.0
|
||||
// and Apache License v2.0 which accompanies this distribution.
|
||||
//
|
||||
// The Eclipse Public License is available at
|
||||
// http://www.eclipse.org/legal/epl-v10.html
|
||||
//
|
||||
// The Apache License v2.0 is available at
|
||||
// http://www.opensource.org/licenses/apache2.0.php
|
||||
//
|
||||
// You may elect to redistribute this code under either of these licenses.
|
||||
// ========================================================================
|
||||
//
|
||||
|
||||
package org.eclipse.jetty.security;
|
||||
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.eclipse.jetty.http.HttpStatus;
|
||||
import org.eclipse.jetty.server.Connector;
|
||||
import org.eclipse.jetty.server.LocalConnector;
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.eclipse.jetty.server.handler.ContextHandler;
|
||||
import org.eclipse.jetty.server.handler.ResourceHandler;
|
||||
import org.eclipse.jetty.server.session.SessionHandler;
|
||||
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
|
||||
import org.eclipse.jetty.util.security.Constraint;
|
||||
import org.eclipse.jetty.util.security.Password;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.junit.runners.Parameterized;
|
||||
import org.junit.runners.Parameterized.Parameter;
|
||||
import org.junit.runners.Parameterized.Parameters;
|
||||
|
||||
/**
|
||||
* Some requests for static data that is served by ResourceHandler, but some is secured.
|
||||
* <p>
|
||||
* This is mainly here to test security bypass techniques using aliased names that should be caught.
|
||||
*/
|
||||
@RunWith(Parameterized.class)
|
||||
@Ignore("need to verify alias logic with greg")
|
||||
public class AliasedConstraintTest
|
||||
{
|
||||
private static final String TEST_REALM = "TestRealm";
|
||||
private static Server server;
|
||||
private static LocalConnector connector;
|
||||
private static ConstraintSecurityHandler security;
|
||||
|
||||
@BeforeClass
|
||||
public static void startServer() throws Exception
|
||||
{
|
||||
server = new Server();
|
||||
connector = new LocalConnector(server);
|
||||
server.setConnectors(new Connector[] { connector });
|
||||
|
||||
ContextHandler context = new ContextHandler();
|
||||
SessionHandler session = new SessionHandler();
|
||||
|
||||
HashLoginService loginService = new HashLoginService(TEST_REALM);
|
||||
loginService.putUser("user0",new Password("password"),new String[] {});
|
||||
loginService.putUser("user",new Password("password"),new String[] { "user" });
|
||||
loginService.putUser("user2",new Password("password"),new String[] { "user" });
|
||||
loginService.putUser("admin",new Password("password"),new String[] { "user", "administrator" });
|
||||
loginService.putUser("user3",new Password("password"),new String[] { "foo" });
|
||||
|
||||
context.setContextPath("/ctx");
|
||||
server.setHandler(context);
|
||||
context.setHandler(session);
|
||||
|
||||
server.addBean(loginService);
|
||||
|
||||
security = new ConstraintSecurityHandler();
|
||||
session.setHandler(security);
|
||||
ResourceHandler handler = new ResourceHandler();
|
||||
String resourceBase = MavenTestingUtils.getTestResourceDir("docroot").getAbsolutePath();
|
||||
handler.setResourceBase(resourceBase);
|
||||
security.setHandler(handler);
|
||||
|
||||
List<ConstraintMapping> constraints = new ArrayList<>();
|
||||
|
||||
Constraint constraint0 = new Constraint();
|
||||
constraint0.setAuthenticate(true);
|
||||
constraint0.setName("forbid");
|
||||
ConstraintMapping mapping0 = new ConstraintMapping();
|
||||
mapping0.setPathSpec("/forbid/*");
|
||||
mapping0.setConstraint(constraint0);
|
||||
constraints.add(mapping0);
|
||||
|
||||
Set<String> knownRoles = new HashSet<>();
|
||||
knownRoles.add("user");
|
||||
knownRoles.add("administrator");
|
||||
|
||||
security.setConstraintMappings(constraints,knownRoles);
|
||||
server.start();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void stopServer() throws Exception
|
||||
{
|
||||
server.stop();
|
||||
}
|
||||
|
||||
@Parameters(name = "{0}: {1}")
|
||||
public static Collection<Object[]> data()
|
||||
{
|
||||
List<Object[]> data = new ArrayList<>();
|
||||
|
||||
final String OPENCONTENT = "this is open content";
|
||||
|
||||
data.add(new Object[] { "/ctx/all/index.txt", HttpStatus.OK_200, OPENCONTENT });
|
||||
data.add(new Object[] { "/ctx/ALL/index.txt", HttpStatus.OK_200, OPENCONTENT });
|
||||
data.add(new Object[] { "/ctx/ALL/Fred/../index.txt", HttpStatus.OK_200, OPENCONTENT });
|
||||
data.add(new Object[] { "/ctx/../bar/../ctx/all/index.txt", HttpStatus.OK_200, OPENCONTENT });
|
||||
data.add(new Object[] { "/ctx/forbid/index.txt", HttpStatus.FORBIDDEN_403, null });
|
||||
data.add(new Object[] { "/ctx/all/../forbid/index.txt", HttpStatus.FORBIDDEN_403, null });
|
||||
data.add(new Object[] { "/ctx/FoRbId/index.txt", HttpStatus.FORBIDDEN_403, null });
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@Parameter(value = 0)
|
||||
public String uri;
|
||||
|
||||
@Parameter(value = 1)
|
||||
public int expectedStatusCode;
|
||||
|
||||
@Parameter(value = 2)
|
||||
public String expectedContent;
|
||||
|
||||
@Test
|
||||
public void testAccess() throws Exception
|
||||
{
|
||||
StringBuilder request = new StringBuilder();
|
||||
request.append("GET ").append(uri).append(" HTTP/1.1\r\n");
|
||||
request.append("Host: localhost\r\n");
|
||||
request.append("Connection: close\r\n");
|
||||
request.append("\r\n");
|
||||
|
||||
String response = connector.getResponses(request.toString());
|
||||
|
||||
switch (expectedStatusCode)
|
||||
{
|
||||
case 200:
|
||||
assertThat(response,startsWith("HTTP/1.1 200 OK"));
|
||||
break;
|
||||
case 403:
|
||||
assertThat(response,startsWith("HTTP/1.1 403 Forbidden"));
|
||||
break;
|
||||
default:
|
||||
fail("Write a handler for response status code: " + expectedStatusCode);
|
||||
break;
|
||||
}
|
||||
|
||||
if (expectedContent != null)
|
||||
{
|
||||
assertThat(response,containsString("this is open content"));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
this is open content.
|
|
@ -0,0 +1 @@
|
|||
this is forbidden content.
|
Loading…
Reference in New Issue