blob: 3627d920a89eeffe6145a2e73e31d1d1fbdedb8d [file]
/*
* Copyright (C) 2010, 2017 Google Inc. and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.junit.http;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.eclipse.jetty.ee8.nested.ServletConstraint;
import org.eclipse.jetty.ee8.security.ConstraintMapping;
import org.eclipse.jetty.ee8.security.ConstraintSecurityHandler;
import org.eclipse.jetty.ee8.security.authentication.BasicAuthenticator;
import org.eclipse.jetty.ee8.servlet.ServletContextHandler;
import org.eclipse.jetty.security.AbstractLoginService;
/**
* Tiny web application server for unit testing, wired for the EE8
* (javax.servlet / Jetty EE8) generation.
* <p>
* Only the Jetty security wiring is generation specific; everything else is
* inherited from the generated {@link AppServerBase}. This is the hand
* maintained EE8 overlay that the canonical {@code AppServer} cannot be
* rewritten into automatically, because the Jetty EE8 security API
* ({@code ServletConstraint} + {@code setSecurityHandler}) differs structurally
* from the EE10 one.
*/
public class AppServer extends AppServerBase {
/**
* Constructor for <code>AppServer</code>.
*/
public AppServer() {
super();
}
/**
* Constructor for <code>AppServer</code>.
*
* @param port
* the http port number; may be zero to allocate a port
* dynamically
* @since 4.2
*/
public AppServer(int port) {
super(port);
}
/**
* Constructor for <code>AppServer</code>.
*
* @param port
* for http, may be zero to allocate a port dynamically
* @param sslPort
* for https,may be zero to allocate a port dynamically. If
* negative, the server will be set up without https support.
* @since 4.9
*/
public AppServer(int port, int sslPort) {
super(port, sslPort);
}
private ConstraintMapping createConstraintMapping() {
ConstraintMapping cm = new ConstraintMapping();
cm.setConstraint(new ServletConstraint());
cm.getConstraint().setAuthenticate(true);
cm.getConstraint().setDataConstraint(ServletConstraint.DC_NONE);
cm.getConstraint().setRoles(new String[] { authRole });
return cm;
}
@Override
protected void configureAuthentication(ServletContextHandler ctx,
String[] methods) {
AbstractLoginService users = new TestMappedLoginService(authRole);
List<ConstraintMapping> mappings = new ArrayList<>();
if (methods == null || methods.length == 0) {
ConstraintMapping cm = createConstraintMapping();
cm.setPathSpec("/*");
mappings.add(cm);
} else {
for (String method : methods) {
ConstraintMapping cm = createConstraintMapping();
cm.setMethod(method.toUpperCase(Locale.ROOT));
cm.setPathSpec("/*");
mappings.add(cm);
}
}
ConstraintSecurityHandler sec = new ConstraintSecurityHandler();
sec.setRealmName(realm);
sec.setAuthenticator(new BasicAuthenticator());
sec.setLoginService(users);
sec.setConstraintMappings(mappings.toArray(new ConstraintMapping[0]));
ctx.setSecurityHandler(sec);
}
}