blob: af5eb5f28a34dfd0d5a81193af93b4d7b3401d1d [file] [log] [blame]
/*
* Copyright (c) 2022 Contributors to the Eclipse Foundation
* Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package com.sun.enterprise.config.serverbeans;
import com.sun.enterprise.config.util.ConfigApiLoggerInfo;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.glassfish.api.admin.config.ConfigExtension;
import org.glassfish.api.admin.config.PropertiesDesc;
import org.glassfish.api.admin.config.PropertyDesc;
import org.glassfish.config.support.datatypes.NonNegativeInteger;
import org.jvnet.hk2.config.Attribute;
import org.jvnet.hk2.config.ConfigBeanProxy;
import org.jvnet.hk2.config.ConfigSupport;
import org.jvnet.hk2.config.Configured;
import org.jvnet.hk2.config.DuckTyped;
import org.jvnet.hk2.config.Element;
import org.jvnet.hk2.config.SingleConfigCode;
import org.jvnet.hk2.config.TransactionFailure;
import org.jvnet.hk2.config.types.Property;
import org.jvnet.hk2.config.types.PropertyBag;
@Configured
public interface HttpService extends ConfigBeanProxy, PropertyBag, ConfigExtension {
/**
* Gets the value of the accessLog property.
*
* @return possible object is {@link AccessLog }
*/
@Element
@NotNull
AccessLog getAccessLog();
/**
* Sets the value of the accessLog property.
*
* @param value allowed object is {@link AccessLog }
*/
void setAccessLog(AccessLog value) throws PropertyVetoException;
/**
* Gets the value of the virtualServer property.
* <p/>
* <p/>
* This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object. This is why there is not a <CODE>set</CODE> method for the
* virtualServer property.
* <p/>
* <p/>
* For example, to add a new item, do as follows:
*
* <pre>
* getVirtualServer().add(newItem);
* </pre>
* <p/>
* <p/>
* <p/>
* Objects of the following type(s) are allowed in the list {@link VirtualServer }
*/
@Element(required = true)
List<VirtualServer> getVirtualServer();
@DuckTyped
VirtualServer getVirtualServerByName(String name);
@DuckTyped
List<String> getNonAdminVirtualServerList();
@Attribute(defaultValue = "false")
@Pattern(regexp = "(false|true|on|off)", message = "Valid values: true|false")
String getAccessLoggingEnabled();
void setAccessLoggingEnabled(String enabled);
/**
* If true, single sign-on is enabled by default for all web applications on all virtual servers on this server instance
* that are configured for the same realm. If false, single sign-on is disabled by default for all virtual servers, and
* users must authenticate separately to every application on each virtual server. The sso-enabled property setting of
* the virtual-server element can override this setting for an individual virtual server or inherit the value by using
* "inherit."
*
* @return possible object is {@link String }
*/
@Attribute(defaultValue = "false")
@Pattern(regexp = "(true|false|on|off)", message = "Valid values: true|false")
String getSsoEnabled();
/**
* Sets the value of the sso-enabled property.
*
* @param value allowed object is {@link String }
*/
void setSsoEnabled(String value);
class Duck {
private static final Logger logger = ConfigApiLoggerInfo.getLogger();
public static VirtualServer getVirtualServerByName(HttpService target, String name) {
for (VirtualServer v : target.getVirtualServer()) {
if (v.getId().equals(name)) {
return v;
}
}
return null;
}
public static List<String> getNonAdminVirtualServerList(HttpService target) {
List<String> nonAdminVSList = new ArrayList<>();
for (VirtualServer v : target.getVirtualServer()) {
if (!v.getId().equals("__asadmin")) {
nonAdminVSList.add(v.getId());
}
}
return Collections.unmodifiableList(nonAdminVSList);
}
public static HttpService createDefaultConfig(Config c) {
final Config param = c;
try {
ConfigSupport.apply(new SingleConfigCode<Config>() {
@Override
public Object run(Config param) throws PropertyVetoException, TransactionFailure {
HttpService httpService = param.createChild(HttpService.class);
AccessLog accessLog = httpService.createChild(AccessLog.class);
List<VirtualServer> vsList = httpService.getVirtualServer();
httpService.setAccessLog(accessLog);
VirtualServer vs = httpService.createChild(VirtualServer.class);
vs.setId("server");
vs.setNetworkListeners("http-listener-1,http-listener-2");
VirtualServer vs1 = httpService.createChild(VirtualServer.class);
vs1.setId("__asadmin");
vs1.setNetworkListeners("admin-listener");
vsList.add(vs);
vsList.add(vs1);
param.getContainers().add(httpService);
return httpService;
}
}, param);
} catch (TransactionFailure ex) {
// Will use the BG logging infrastrucre... And probably some exception type?
logger.log(Level.INFO, ConfigApiLoggerInfo.unableToCreateHttpServiceConfig, ex);
}
return param.getExtensionByType(HttpService.class);
}
}
@Override
@PropertiesDesc(props = {
@PropertyDesc(name = "monitoring-cache-enabled", defaultValue = "true", dataType = Boolean.class, description = "Enables the monitoring cache"),
@PropertyDesc(name = "monitoring-cache-refresh-in-millis", defaultValue = "5000", dataType = NonNegativeInteger.class, description = "Specifies the interval between refreshes of the monitoring cache"),
@PropertyDesc(name = "ssl-cache-entries", defaultValue = "10000", dataType = NonNegativeInteger.class, description = "Specifies the number of SSL sessions to be cached"),
@PropertyDesc(name = "ssl3-session-timeout", defaultValue = "86400", dataType = NonNegativeInteger.class, description = "Specifies the interval at which SSL3 sessions are cached"),
@PropertyDesc(name = "ssl-session-timeout", defaultValue = "100", dataType = NonNegativeInteger.class, description = "Specifies the interval at which SSL2 sessions are cached"),
@PropertyDesc(name = "recycle-objects", defaultValue = "true", dataType = Boolean.class, description = "Whether to recycle internal objects instead of using the VM garbage collector"),
@PropertyDesc(name = "reader-threads", defaultValue = "0", dataType = NonNegativeInteger.class, description = "Specifies the number of reader threads, which read bytes from the non-blocking socket"),
@PropertyDesc(name = "acceptor-queue-length", defaultValue = "4096", dataType = NonNegativeInteger.class, description = "Specifies the length of the acceptor thread queue. Once full, connections are rejected"),
@PropertyDesc(name = "reader-queue-length", defaultValue = "4096", dataType = NonNegativeInteger.class, description = "Specifies the length of the reader thread queue. Once full, connections are rejected"),
@PropertyDesc(name = "use-nio-direct-bytebuffer", defaultValue = "true", dataType = Boolean.class, description = "Controls whether the NIO direct ByteBuffer is used. In a limited resource environment, "
+ "it might be faster to use non-direct Java's ByteBuffer by setting a value of false"),
@PropertyDesc(name = "authPassthroughEnabled", defaultValue = "false", dataType = Boolean.class, description = "Indicates that the http-listeners receive traffic from an SSL-terminating proxy server, "
+ "which is responsible for forwarding any information about the original client request (such as client "
+ "IP address, SSL keysize, and authenticated client certificate chain) to the HTTP listeners using custom request headers. "
+ "Each subelement can override this setting for itself"),
/**
* Specifies the fully qualified class name of a custom implementation of the com.sun.appserv.ProxyHandler abstract
* class, which allows a back-end application server instance to retrieve information about the original client request
* that was intercepted by an SSL-terminating proxy server (for example, a load balancer). An implementation of this
* abstract class inspects a given request for the custom request headers through which the proxy server communicates
* the information about the original client request to the Enterprise Server instance, and returns that information to
* its caller. The default implementation reads the client IP address from an HTTP request header named Proxy-ip, the
* SSL keysize from an HTTP request header named Proxy-keysize, and the SSL client certificate chain from an HTTP
* request header named Proxy-auth-cert. The Proxy-auth-cert value must contain the BASE-64 encoded client certificate
* chain without the BEGIN CERTIFICATE and END CERTIFICATE boundaries and with \n replaced with % d% a. Only used if
* authPassthroughEnabled is set to true. Each “http-listener” on page 37 subelement can override the setting for
* itself.
*/
@PropertyDesc(name = "proxyHandler", defaultValue = "com.sun.enterprise.web.web.ProxyHandlerImpl", description = "Specifies the fully qualified class name of a custom implementation of com.sun.appserv.ProxyHandler. "
+ "Only used if authPassthroughEnabled is set to true. Each http-listener can override the setting for itself"),
@PropertyDesc(name = "bufferSize", defaultValue = "4096", dataType = NonNegativeInteger.class, description = "Size in bytes of the buffer to be provided for input streams created by HTTP listeners"),
@PropertyDesc(name = "connectionTimeout", defaultValue = "30", dataType = NonNegativeInteger.class, description = "Number of seconds HTTP listeners wait, after accepting a connection, for the request URI line to be presented"),
@PropertyDesc(name = "maxKeepAliveRequests", defaultValue = "250", dataType = NonNegativeInteger.class, description = "Maximum number of HTTP requests that can be pipelined until the connection is closed by the server. "
+ "Set this property to 1 to disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining"),
@PropertyDesc(name = "traceEnabled", defaultValue = "true", dataType = Boolean.class, description = "Enables the TRACE operation. Set to false to make the server less susceptible to cross-site scripting attacks"),
@PropertyDesc(name = "accessLoggingEnabled", defaultValue = "false", dataType = Boolean.class, description = "Controls access logging for all virtual-server that do not specify this property"),
@PropertyDesc(name = "disableUploadTimeout", defaultValue = "true", dataType = Boolean.class, description = "If false, the connection for a servlet that reads bytes slowly is closed after the 'connectionUploadTimeout' is reached"),
@PropertyDesc(name = "connectionUploadTimeout", defaultValue = "5", dataType = NonNegativeInteger.class, description = "Specifies the timeout for uploads. Applicable only if 'disableUploadTimeout' is set to false"),
@PropertyDesc(name = "uriEncoding", defaultValue = "UTF-8", description = "Specifies the character set used to decode the request URIs received on http-listeners that "
+ "do not define this property. Must be a valid IANA character set name") })
@Element("property")
List<Property> getProperty();
}