From 9b82a3deb52adae675dff560dd0f14f3a4acb985 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 12:57:27 +0100 Subject: [PATCH 01/18] Bring back gretty-runner-jetty94 from master as basis for Jetty 11 --- libs/gretty-runner-jetty94/build.gradle | 22 ++ .../akhikhl/gretty/JettyConfigurerImpl.groovy | 321 ++++++++++++++++++ .../akhikhl/gretty/JettyWebAppContext.groovy | 109 ++++++ .../gretty/LifeCycleListenerAdapter.java | 43 +++ .../gretty/SSOAuthenticatorFactory.java | 41 +++ .../akhikhl/gretty/SSOBasicAuthenticator.java | 113 ++++++ .../gretty/SSOClientCertAuthenticator.java | 113 ++++++ .../gretty/SSODigestAuthenticator.java | 113 ++++++ .../gretty/SSOSpnegoAuthenticator.java | 120 +++++++ .../gretty/WebInfConfigurationEx.groovy | 51 +++ .../akhikhl/gretty/FilteringClassLoader.java | 91 +++++ 11 files changed, 1137 insertions(+) create mode 100644 libs/gretty-runner-jetty94/build.gradle create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java create mode 100644 libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy create mode 100644 libs/gretty-runner-jetty94/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java diff --git a/libs/gretty-runner-jetty94/build.gradle b/libs/gretty-runner-jetty94/build.gradle new file mode 100644 index 000000000..6d922cc28 --- /dev/null +++ b/libs/gretty-runner-jetty94/build.gradle @@ -0,0 +1,22 @@ +apply from: rootProject.file('common.gradle') + +configurations { + compile { + exclude group: 'org.eclipse.jetty.orbit', module: 'javax.servlet' + } +} + +dependencies { + compile project(':libs:gretty-runner-jetty') + compile "javax.servlet:javax.servlet-api:$jetty9_servlet_api_version" + compile "org.eclipse.jetty:jetty-server:$jetty94_version" + compile "org.eclipse.jetty:jetty-servlet:$jetty94_version" + compile "org.eclipse.jetty:jetty-webapp:$jetty94_version" + compile "org.eclipse.jetty:jetty-security:$jetty94_version" + compile "org.eclipse.jetty:apache-jsp:$jetty94_version" + compile "org.eclipse.jetty:jetty-annotations:$jetty94_version" + compile "org.eclipse.jetty:jetty-plus:$jetty94_version" + compile "org.eclipse.jetty.websocket:javax-websocket-server-impl:$jetty94_version" + compile "org.ow2.asm:asm:$asm_version" + compile "org.ow2.asm:asm-commons:$asm_version" +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy new file mode 100644 index 000000000..3c97cc8c3 --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -0,0 +1,321 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty + +import groovy.transform.CompileStatic +import groovy.transform.TypeCheckingMode +import org.eclipse.jetty.annotations.AnnotationConfiguration +import org.eclipse.jetty.plus.webapp.EnvConfiguration +import org.eclipse.jetty.plus.webapp.PlusConfiguration +import org.eclipse.jetty.security.HashLoginService +import org.eclipse.jetty.server.* +import org.eclipse.jetty.server.handler.ContextHandlerCollection +import org.eclipse.jetty.server.session.SessionHandler +import org.eclipse.jetty.util.component.LifeCycle +import org.eclipse.jetty.util.resource.FileResource +import org.eclipse.jetty.util.resource.Resource +import org.eclipse.jetty.util.resource.ResourceCollection +import org.eclipse.jetty.util.ssl.SslContextFactory +import org.eclipse.jetty.webapp.* +import org.eclipse.jetty.xml.XmlConfiguration +import org.slf4j.Logger +import org.slf4j.LoggerFactory +/** + * + * @author akhikhl + */ +@CompileStatic(TypeCheckingMode.SKIP) +class JettyConfigurerImpl implements JettyConfigurer { + + private static final Logger log = LoggerFactory.getLogger(JettyConfigurerImpl) + + private SSOAuthenticatorFactory ssoAuthenticatorFactory + private SessionHandler sharedSessionHandler + + @Override + def addLifeCycleListener(lifecycle, listener) { + def lifeCycleListener = listener as LifeCycleListenerAdapter + lifecycle.addLifeCycleListener(lifeCycleListener) + lifeCycleListener + } + + @Override + void applyContextConfigFile(webAppContext, URL contextConfigFile) { + if(contextConfigFile) { + log.info 'Configuring {} with {}', webAppContext.contextPath, contextConfigFile + XmlConfiguration xmlConfiguration = new XmlConfiguration(contextConfigFile) + xmlConfiguration.configure(webAppContext) + } + } + + @Override + void applyJettyXml(server, String jettyXml) { + if(jettyXml != null) { + log.info 'Configuring server with {}', jettyXml + XmlConfiguration xmlConfiguration = new XmlConfiguration(new File(jettyXml).toURI().toURL()) + xmlConfiguration.configure(server) + } + } + + @Override + void configureConnectors(server, Map params) { + + HttpConfiguration http_config = new HttpConfiguration() + if(params.httpsPort) { + http_config.setSecureScheme('https') + http_config.setSecurePort(params.httpsPort) + } + + Connector httpConn = findHttpConnector(server) + + boolean newHttpConnector = false + if(params.httpEnabled && !httpConn) { + newHttpConnector = true + httpConn = new ServerConnector(server, new HttpConnectionFactory(http_config)) + } + + if(httpConn) { + if(!httpConn.host) + httpConn.host = params.host ?: ServerDefaults.defaultHost + + if(!httpConn.port) + httpConn.port = params.httpPort ?: ServerDefaults.defaultHttpPort + + if(httpConn.port == PortUtils.RANDOM_FREE_PORT) + httpConn.port = 0 + + if(params.httpIdleTimeout) + httpConn.idleTimeout = params.httpIdleTimeout + + if(newHttpConnector) + server.addConnector(httpConn) + } + + Connector httpsConn = findHttpsConnector(server) + + boolean newHttpsConnector = false + if(params.httpsEnabled && !httpsConn) { + newHttpsConnector = true + HttpConfiguration https_config = new HttpConfiguration(http_config) + https_config.addCustomizer(new SecureRequestCustomizer()) + httpsConn = new ServerConnector(server, + new SslConnectionFactory(new SslContextFactory(), 'http/1.1'), + new HttpConnectionFactory(https_config)) + } + + if(httpsConn) { + if(!httpsConn.host) + httpsConn.host = params.host ?: ServerDefaults.defaultHost + + if(!httpsConn.port) + httpsConn.port = params.httpsPort ?: ServerDefaults.defaultHttpsPort + + if(httpsConn.port == PortUtils.RANDOM_FREE_PORT) + httpsConn.port = 0 + + def sslContextFactory = httpsConn.getConnectionFactories().find { it instanceof SslConnectionFactory }?.getSslContextFactory() + if(sslContextFactory) { + if(params.sslKeyStorePath) { + if(params.sslKeyStorePath.startsWith('classpath:')) { + String resString = params.sslKeyStorePath - 'classpath:' + URL url = getClass().getResource(resString) + if(url == null) + throw new Exception("Could not resource referenced in sslKeyStorePath: '${resString}'") + sslContextFactory.setKeyStoreResource(new FileResource(url)) + } + else + sslContextFactory.setKeyStorePath(params.sslKeyStorePath) + } + if(params.sslKeyStorePassword) + sslContextFactory.setKeyStorePassword(params.sslKeyStorePassword) + if(params.sslKeyManagerPassword) + sslContextFactory.setKeyManagerPassword(params.sslKeyManagerPassword) + if(params.sslTrustStorePath) { + if(params.sslTrustStorePath.startsWith('classpath:')) { + String resString = params.sslTrustStorePath - 'classpath:' + URL url = getClass().getResource(resString) + if(url == null) + throw new Exception("Could not resource referenced in sslTrustStorePath: '${resString}'") + sslContextFactory.setTrustStoreResource(new FileResource(url)) + } + else + sslContextFactory.setTrustStorePath(params.sslTrustStorePath) + } + if(params.sslTrustStorePassword) + sslContextFactory.setTrustStorePassword(params.sslTrustStorePassword) + if(params.sslNeedClientAuth) + sslContextFactory.setNeedClientAuth(params.sslNeedClientAuth) + } + + if(params.httpsIdleTimeout) + httpsConn.idleTimeout = params.httpsIdleTimeout + + if(newHttpsConnector) + server.addConnector(httpsConn) + } + } + + @Override + void configureSecurity(context, String realm, String realmConfigFile, boolean singleSignOn) { + context.securityHandler.loginService = new HashLoginService(realm, realmConfigFile) + if(singleSignOn) { + if(ssoAuthenticatorFactory == null) + ssoAuthenticatorFactory = new SSOAuthenticatorFactory() + context.securityHandler.authenticatorFactory = ssoAuthenticatorFactory + } + } + + @Override + void configureSessionManager(server, context, Map serverParams, Map webappParams) { + SessionHandler sessionHandler + if(serverParams.singleSignOn) { + sessionHandler = sharedSessionHandler + if(sessionHandler == null) { + sessionHandler = sharedSessionHandler = new SessionHandler() + sessionHandler.setMaxInactiveInterval(60 * 30) // 30 minutes + sessionHandler.getSessionCookieConfig().setPath('/') + } + } else { + sessionHandler = new SessionHandler() + sessionHandler.setMaxInactiveInterval(60 * 30) // 30 minutes + } + context.setSessionHandler(sessionHandler) + } + + @Override + def createResourceCollection(List paths) { + new ResourceCollection(paths as String[]) + } + + @Override + def createServer() { + // fix for issue https://github.com/akhikhl/gretty/issues/24 + org.eclipse.jetty.util.resource.Resource.defaultUseCaches = false + return new Server() + } + + @Override + def createWebAppContext(Map serverParams, Map webappParams) { + List webappClassPath = webappParams.webappClassPath + JettyWebAppContext context = new JettyWebAppContext() + context.setWebInfLib(webappClassPath.findAll { it.endsWith('.jar') }.collect { new File(it) }) + context.setExtraClasspath(webappClassPath.collect { it.endsWith('.jar') ? it : (it.endsWith('/') ? it : it + '/') }.join(';')) + context.setInitParameter('org.eclipse.jetty.servlet.Default.useFileMappedBuffer', serverParams.productMode ? 'true' : 'false') + context.setAttribute(WebInfConfiguration.CONTAINER_JAR_PATTERN, + '.*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$'); + FilteringClassLoader classLoader = new FilteringClassLoader(context) + classLoader.addServerClass('ch.qos.logback.') + classLoader.addServerClass('org.slf4j.') + classLoader.addServerClass('org.codehaus.groovy.') + classLoader.addServerClass('groovy.') + classLoader.addServerClass('groovyx.') + classLoader.addServerClass('groovyjarjarantlr.') + classLoader.addServerClass('groovyjarjarasm.') + classLoader.addServerClass('groovyjarjarcommonscli.') + context.classLoader = classLoader + context.addLifeCycleListener(new LifeCycleListenerAdapter() { + public void lifeCycleStopped(LifeCycle event) { + context.classLoader = null + } + }) + return context + } + + @Override + def findHttpConnector(server) { + server.connectors.find { it.connectionFactories.find { it.protocol.startsWith('HTTP') } && !it.connectionFactories.find { it.protocol.startsWith('SSL') } } + } + + @Override + def findHttpsConnector(server) { + server.connectors.find { it.connectionFactories.find { it.protocol.startsWith('HTTP') } && it.connectionFactories.find { it.protocol.startsWith('SSL') } } + } + + @Override + URL findResourceURL(baseResource, String path) { + Resource res = baseResource.addPath(path) + if(res.exists()) + return res.getURL() + null + } + + @Override + List getConfigurations(Map webappParams) { + [ + new WebInfConfigurationEx(), + new WebXmlConfiguration(), + new MetaInfConfiguration(), + new FragmentConfiguration(), + new EnvConfiguration(), + new PlusConfiguration(), + new AnnotationConfiguration(), + new JettyWebXmlConfiguration() + ] + } + + @Override + void removeLifeCycleListener(lifecycle, listener) { + lifecycle.removeLifeCycleListener(listener) + } + + @Override + void setConfigurationsToWebAppContext(webAppContext, List configurations) { + webAppContext.setConfigurations(configurations as Configuration[]) + } + + private ContextHandlerCollection findContextHandlerCollection(Handler handler) { + if(handler instanceof ContextHandlerCollection) + return handler + if(handler.respondsTo('getHandlers')) + return handler.getHandlers().findResult { findContextHandlerCollection(it) } + null + } + + @Override + void setHandlersToServer(server, List handlers) { + ContextHandlerCollection contexts = findContextHandlerCollection(server.handler) + if(!contexts) + contexts = new ContextHandlerCollection() + + contexts.setHandlers(handlers as Handler[]) + if(server.handler == null) + server.handler = contexts + } + + @Override + List getHandlersByContextPaths(server, List contextPaths) { + ContextHandlerCollection context = findContextHandlerCollection(((Server)server).handler) + return context.getHandlers().findAll { + if(it.respondsTo("getContextPath")) { + contextPaths.contains(it.getContextPath()) + } + } + } + + @Override + void removeHandlerFromServer(server, handler) { + def collection = findContextHandlerCollection(server.handler) + collection.removeHandler(handler) + } + + @Override + void addHandlerToServer(server, handler) { + def collection = findContextHandlerCollection(server.handler) + collection.addHandler(handler) + + // we need to make new handler managed by the HandlerCollection + // so it is stopped automatically when the whole server is stopped + // or when handler is removed from collection. + collection.manage(handler) + + // addHandler and manage don't start the context, so we need to do start it manually + handler.start() + } + +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy new file mode 100644 index 000000000..a065241a4 --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy @@ -0,0 +1,109 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty + +import org.eclipse.jetty.util.URIUtil +import org.eclipse.jetty.util.log.Log +import org.eclipse.jetty.util.log.Logger +import org.eclipse.jetty.util.resource.Resource +import org.eclipse.jetty.webapp.WebAppContext + +/** + * Inspired by maven-jetty-plugin's JettyWebAppContext + * + * @author sala + */ +class JettyWebAppContext extends WebAppContext { + + private static final Logger LOG = Log.getLogger(JettyWebAppContext.class) + + private static final String WEB_INF_LIB_PREFIX = '/WEB-INF/lib' + private final Map webInfJarMap = [:] + private final List webInfJars = [] + + void setWebInfLib (List jars) { + webInfJars.addAll(jars); + } + + @Override + protected void doStart() throws Exception { + // preparing our pathes patch + webInfJarMap.clear() + webInfJars.each { + String fileName = it.getName() + if(fileName.endsWith('.jar')) { + webInfJarMap.put(fileName, it) + } + } + super.doStart() + } + + @Override + protected void doStop() throws Exception { + // cancelling our pathes patch + if(webInfJarMap != null) { + webInfJarMap.clear() + } + webInfJars.clear() + super.doStop() + } + + @Override + Set getResourcePaths(String path) { + Set paths = super.getResourcePaths(path) + // Tinkering with pathes, adding pathes provided manually + if(path != null) { + def allPaths = new TreeSet() + allPaths.addAll(paths) + + if(path.startsWith(WEB_INF_LIB_PREFIX)) { + webInfJarMap.keySet().each { + allPaths.add(WEB_INF_LIB_PREFIX + '/' + it) + } + } + return allPaths + } + + return paths + } + + @Override + Resource getResource(String uriInContext) throws MalformedURLException { + Resource resource = super.getResource(uriInContext) + + if((resource == null || !resource.exists()) && uriInContext != null) { + String uri = URIUtil.canonicalPath(uriInContext) + if(uri == null) { + return null + } + + try { + if(uri.startsWith(WEB_INF_LIB_PREFIX)) { + String jarName = uri.replace(WEB_INF_LIB_PREFIX, '') + if(jarName.startsWith('/') || jarName.startsWith('\\')) { + jarName = jarName.substring(1) + } + if(jarName.isEmpty()) { + return null + } + File jarFile = webInfJarMap.get(jarName) + if(jarFile != null) { + return Resource.newResource(jarFile.getPath()) + } + return null; + } + } catch (MalformedURLException e) { + throw e; + } catch (IOException e) { + LOG.ignore(e) + } + } + return resource + } +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java new file mode 100644 index 000000000..2ccf906ca --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java @@ -0,0 +1,43 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty; + +import org.eclipse.jetty.util.component.LifeCycle; + +/** + * + * @author akhikhl + */ +public class LifeCycleListenerAdapter implements LifeCycle.Listener { + + @Override + public void lifeCycleStarting(LifeCycle event) { + + } + + @Override + public void lifeCycleStarted(LifeCycle event) { + + } + + @Override + public void lifeCycleFailure(LifeCycle event, Throwable cause) { + + } + + @Override + public void lifeCycleStopping(LifeCycle event) { + + } + + @Override + public void lifeCycleStopped(LifeCycle event) { + + } +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java new file mode 100644 index 000000000..5395cfcca --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java @@ -0,0 +1,41 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty; + +import org.eclipse.jetty.security.Authenticator.AuthConfiguration; +import org.eclipse.jetty.security.DefaultAuthenticatorFactory; +import org.eclipse.jetty.security.IdentityService; +import org.eclipse.jetty.security.LoginService; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.security.Constraint; + +import javax.servlet.ServletContext; + +/** + * + * @author akhikhl + */ +public class SSOAuthenticatorFactory extends DefaultAuthenticatorFactory { + + @Override + public org.eclipse.jetty.security.Authenticator getAuthenticator(Server server, ServletContext ctx, AuthConfiguration configuration, IdentityService identityService, LoginService loginService) { + String auth = configuration.getAuthMethod(); + if (auth==null || Constraint.__BASIC_AUTH.equalsIgnoreCase(auth)) + return new SSOBasicAuthenticator(); + if (Constraint.__DIGEST_AUTH.equalsIgnoreCase(auth)) + return new SSODigestAuthenticator(); + if ( Constraint.__SPNEGO_AUTH.equalsIgnoreCase(auth) ) + return new SSOSpnegoAuthenticator(); + if ( Constraint.__NEGOTIATE_AUTH.equalsIgnoreCase(auth) ) // see Bug #377076 + return new SSOSpnegoAuthenticator(Constraint.__NEGOTIATE_AUTH); + if (Constraint.__CERT_AUTH.equalsIgnoreCase(auth)||Constraint.__CERT_AUTH2.equalsIgnoreCase(auth)) + return new SSOClientCertAuthenticator(); + return super.getAuthenticator(server, ctx, configuration, identityService, loginService); + } +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java new file mode 100644 index 000000000..04988f134 --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java @@ -0,0 +1,113 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty; + +import org.eclipse.jetty.security.ServerAuthException; +import org.eclipse.jetty.security.authentication.BasicAuthenticator; +import org.eclipse.jetty.security.authentication.DeferredAuthentication; +import org.eclipse.jetty.security.authentication.SessionAuthentication; +import org.eclipse.jetty.server.Authentication; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.UserIdentity; +import org.eclipse.jetty.util.MultiMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; + +/** + * + * @author akhikhl + */ +public class SSOBasicAuthenticator extends BasicAuthenticator { + + private static final Logger LOG = LoggerFactory.getLogger(SSOBasicAuthenticator.class); + + // "login" is copied without changes from FormAuthenticator + @Override + public UserIdentity login(String username, Object password, ServletRequest request) + { + + UserIdentity user = super.login(username,password,request); + if (user!=null) + { + HttpSession session = ((HttpServletRequest)request).getSession(true); + Authentication cached=new SessionAuthentication(getAuthMethod(),user,password); + session.setAttribute(SessionAuthentication.__J_AUTHENTICATED, cached); + } + return user; + } + + @Override + public Authentication validateRequest(ServletRequest req, ServletResponse res, boolean mandatory) throws ServerAuthException + { + HttpServletRequest request = (HttpServletRequest)req; + + if (!mandatory) + return new DeferredAuthentication(this); + + // ++ copied from FormAuthenticator + + HttpSession session = request.getSession(true); + + // Look for cached authentication + Authentication authentication = (Authentication) session.getAttribute(SessionAuthentication.__J_AUTHENTICATED); + if (authentication != null) + { + // Has authentication been revoked? + if (authentication instanceof Authentication.User && + _loginService!=null && + !_loginService.validate(((Authentication.User)authentication).getUserIdentity())) + { + LOG.debug("auth revoked {}",authentication); + session.removeAttribute(SessionAuthentication.__J_AUTHENTICATED); + } + else + { + synchronized (session) + { + String j_uri=(String)session.getAttribute(__J_URI); + if (j_uri!=null) + { + //check if the request is for the same url as the original and restore + //params if it was a post + LOG.debug("auth retry {}->{}",authentication,j_uri); + StringBuffer buf = request.getRequestURL(); + if (request.getQueryString() != null) + buf.append("?").append(request.getQueryString()); + + if (j_uri.equals(buf.toString())) + { + MultiMap j_post = (MultiMap)session.getAttribute(__J_POST); + if (j_post!=null) + { + LOG.debug("auth rePOST {}->{}",authentication,j_uri); + Request base_request = Request.getBaseRequest(request); + base_request.setContentParameters(j_post); + } + session.removeAttribute(__J_URI); + session.removeAttribute(__J_METHOD); + session.removeAttribute(__J_POST); + } + } + } + LOG.debug("auth {}",authentication); + return authentication; + } + } + // -- copied from FormAuthenticator + + return super.validateRequest(req, res, mandatory); + } +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java new file mode 100644 index 000000000..def86dc4a --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java @@ -0,0 +1,113 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty; + +import org.eclipse.jetty.security.ServerAuthException; +import org.eclipse.jetty.security.authentication.ClientCertAuthenticator; +import org.eclipse.jetty.security.authentication.DeferredAuthentication; +import org.eclipse.jetty.security.authentication.SessionAuthentication; +import org.eclipse.jetty.server.Authentication; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.UserIdentity; +import org.eclipse.jetty.util.MultiMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; + +/** + * + * @author akhikhl + */ +public class SSOClientCertAuthenticator extends ClientCertAuthenticator { + + private static final Logger LOG = LoggerFactory.getLogger(SSOClientCertAuthenticator.class); + + // "login" is copied without changes from FormAuthenticator + @Override + public UserIdentity login(String username, Object password, ServletRequest request) + { + + UserIdentity user = super.login(username,password,request); + if (user!=null) + { + HttpSession session = ((HttpServletRequest)request).getSession(true); + Authentication cached=new SessionAuthentication(getAuthMethod(),user,password); + session.setAttribute(SessionAuthentication.__J_AUTHENTICATED, cached); + } + return user; + } + + @Override + public Authentication validateRequest(ServletRequest req, ServletResponse res, boolean mandatory) throws ServerAuthException + { + HttpServletRequest request = (HttpServletRequest)req; + + if (!mandatory) + return new DeferredAuthentication(this); + + // ++ copied from FormAuthenticator + + HttpSession session = request.getSession(true); + + // Look for cached authentication + Authentication authentication = (Authentication) session.getAttribute(SessionAuthentication.__J_AUTHENTICATED); + if (authentication != null) + { + // Has authentication been revoked? + if (authentication instanceof Authentication.User && + _loginService!=null && + !_loginService.validate(((Authentication.User)authentication).getUserIdentity())) + { + LOG.debug("auth revoked {}",authentication); + session.removeAttribute(SessionAuthentication.__J_AUTHENTICATED); + } + else + { + synchronized (session) + { + String j_uri=(String)session.getAttribute(__J_URI); + if (j_uri!=null) + { + //check if the request is for the same url as the original and restore + //params if it was a post + LOG.debug("auth retry {}->{}",authentication,j_uri); + StringBuffer buf = request.getRequestURL(); + if (request.getQueryString() != null) + buf.append("?").append(request.getQueryString()); + + if (j_uri.equals(buf.toString())) + { + MultiMap j_post = (MultiMap)session.getAttribute(__J_POST); + if (j_post!=null) + { + LOG.debug("auth rePOST {}->{}",authentication,j_uri); + Request base_request = Request.getBaseRequest(request); + base_request.setContentParameters(j_post); + } + session.removeAttribute(__J_URI); + session.removeAttribute(__J_METHOD); + session.removeAttribute(__J_POST); + } + } + } + LOG.debug("auth {}",authentication); + return authentication; + } + } + // -- copied from FormAuthenticator + + return super.validateRequest(req, res, mandatory); + } +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java new file mode 100644 index 000000000..a05c877b4 --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java @@ -0,0 +1,113 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty; + +import org.eclipse.jetty.security.ServerAuthException; +import org.eclipse.jetty.security.authentication.DeferredAuthentication; +import org.eclipse.jetty.security.authentication.DigestAuthenticator; +import org.eclipse.jetty.security.authentication.SessionAuthentication; +import org.eclipse.jetty.server.Authentication; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.UserIdentity; +import org.eclipse.jetty.util.MultiMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; + +/** + * + * @author akhikhl + */ +class SSODigestAuthenticator extends DigestAuthenticator { + + private static final Logger LOG = LoggerFactory.getLogger(SSOBasicAuthenticator.class); + + // "login" is copied without changes from FormAuthenticator + @Override + public UserIdentity login(String username, Object password, ServletRequest request) + { + + UserIdentity user = super.login(username,password,request); + if (user!=null) + { + HttpSession session = ((HttpServletRequest)request).getSession(true); + Authentication cached=new SessionAuthentication(getAuthMethod(),user,password); + session.setAttribute(SessionAuthentication.__J_AUTHENTICATED, cached); + } + return user; + } + + @Override + public Authentication validateRequest(ServletRequest req, ServletResponse res, boolean mandatory) throws ServerAuthException + { + HttpServletRequest request = (HttpServletRequest)req; + + if (!mandatory) + return new DeferredAuthentication(this); + + // ++ copied from FormAuthenticator + + HttpSession session = request.getSession(true); + + // Look for cached authentication + Authentication authentication = (Authentication) session.getAttribute(SessionAuthentication.__J_AUTHENTICATED); + if (authentication != null) + { + // Has authentication been revoked? + if (authentication instanceof Authentication.User && + _loginService!=null && + !_loginService.validate(((Authentication.User)authentication).getUserIdentity())) + { + LOG.debug("auth revoked {}",authentication); + session.removeAttribute(SessionAuthentication.__J_AUTHENTICATED); + } + else + { + synchronized (session) + { + String j_uri=(String)session.getAttribute(__J_URI); + if (j_uri!=null) + { + //check if the request is for the same url as the original and restore + //params if it was a post + LOG.debug("auth retry {}->{}",authentication,j_uri); + StringBuffer buf = request.getRequestURL(); + if (request.getQueryString() != null) + buf.append("?").append(request.getQueryString()); + + if (j_uri.equals(buf.toString())) + { + MultiMap j_post = (MultiMap)session.getAttribute(__J_POST); + if (j_post!=null) + { + LOG.debug("auth rePOST {}->{}",authentication,j_uri); + Request base_request = Request.getBaseRequest(request); + base_request.setContentParameters(j_post); + } + session.removeAttribute(__J_URI); + session.removeAttribute(__J_METHOD); + session.removeAttribute(__J_POST); + } + } + } + LOG.debug("auth {}",authentication); + return authentication; + } + } + // -- copied from FormAuthenticator + + return super.validateRequest(req, res, mandatory); + } +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java new file mode 100644 index 000000000..f57415380 --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java @@ -0,0 +1,120 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty; + +import org.eclipse.jetty.security.ServerAuthException; +import org.eclipse.jetty.security.authentication.DeferredAuthentication; +import org.eclipse.jetty.security.authentication.SessionAuthentication; +import org.eclipse.jetty.security.authentication.SpnegoAuthenticator; +import org.eclipse.jetty.server.Authentication; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.UserIdentity; +import org.eclipse.jetty.util.MultiMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; + +/** + * + * @author akhikhl + */ +public class SSOSpnegoAuthenticator extends SpnegoAuthenticator { + + private static final Logger LOG = LoggerFactory.getLogger(SSOSpnegoAuthenticator.class); + + public SSOSpnegoAuthenticator() { + } + + public SSOSpnegoAuthenticator(String authMethod) { + super(authMethod); + } + + // "login" is copied without changes from FormAuthenticator + @Override + public UserIdentity login(String username, Object password, ServletRequest request) + { + + UserIdentity user = super.login(username,password,request); + if (user!=null) + { + HttpSession session = ((HttpServletRequest)request).getSession(true); + Authentication cached=new SessionAuthentication(getAuthMethod(),user,password); + session.setAttribute(SessionAuthentication.__J_AUTHENTICATED, cached); + } + return user; + } + + @Override + public Authentication validateRequest(ServletRequest req, ServletResponse res, boolean mandatory) throws ServerAuthException + { + HttpServletRequest request = (HttpServletRequest)req; + + if (!mandatory) + return new DeferredAuthentication(this); + + // ++ copied from FormAuthenticator + + HttpSession session = request.getSession(true); + + // Look for cached authentication + Authentication authentication = (Authentication) session.getAttribute(SessionAuthentication.__J_AUTHENTICATED); + if (authentication != null) + { + // Has authentication been revoked? + if (authentication instanceof Authentication.User && + _loginService!=null && + !_loginService.validate(((Authentication.User)authentication).getUserIdentity())) + { + LOG.debug("auth revoked {}",authentication); + session.removeAttribute(SessionAuthentication.__J_AUTHENTICATED); + } + else + { + synchronized (session) + { + String j_uri=(String)session.getAttribute(__J_URI); + if (j_uri!=null) + { + //check if the request is for the same url as the original and restore + //params if it was a post + LOG.debug("auth retry {}->{}",authentication,j_uri); + StringBuffer buf = request.getRequestURL(); + if (request.getQueryString() != null) + buf.append("?").append(request.getQueryString()); + + if (j_uri.equals(buf.toString())) + { + MultiMap j_post = (MultiMap)session.getAttribute(__J_POST); + if (j_post!=null) + { + LOG.debug("auth rePOST {}->{}",authentication,j_uri); + Request base_request = Request.getBaseRequest(request); + base_request.setContentParameters(j_post); + } + session.removeAttribute(__J_URI); + session.removeAttribute(__J_METHOD); + session.removeAttribute(__J_POST); + } + } + } + LOG.debug("auth {}",authentication); + return authentication; + } + } + // -- copied from FormAuthenticator + + return super.validateRequest(req, res, mandatory); + } +} diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy new file mode 100644 index 000000000..6b10fa14b --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy @@ -0,0 +1,51 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty + +import groovy.transform.CompileStatic +import groovy.transform.TypeCheckingMode +import org.eclipse.jetty.util.resource.Resource +import org.eclipse.jetty.util.resource.ResourceCollection +import org.eclipse.jetty.webapp.WebAppContext +import org.eclipse.jetty.webapp.WebInfConfiguration + +@CompileStatic(TypeCheckingMode.SKIP) +class WebInfConfigurationEx extends WebInfConfiguration implements BaseResourceConfiguration { + + private List extraResourceBases + private final List baseResourceListeners = [] + + @Override + void addBaseResourceListener(Closure closure) { + baseResourceListeners.add(closure) + } + + @Override + void setExtraResourceBases(List extraResourceBases) { + this.extraResourceBases = extraResourceBases + } + + @Override + public void unpack (WebAppContext context) throws IOException { + super.unpack(context) + if(extraResourceBases) { + Resource res = context.getBaseResource() + List resources = [] + if(res instanceof ResourceCollection) + resources.addAll(res.getResources()) + else + resources.add(res) + for(def e in extraResourceBases) + resources.add(Resource.newResource(e)) + context.setBaseResource(new ResourceCollection(resources as Resource[])) + } + for(Closure closure in baseResourceListeners) + closure(context) + } +} diff --git a/libs/gretty-runner-jetty94/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java b/libs/gretty-runner-jetty94/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java new file mode 100644 index 000000000..7d97d21d1 --- /dev/null +++ b/libs/gretty-runner-jetty94/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java @@ -0,0 +1,91 @@ +/* + * Gretty + * + * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. + * + * See the file "LICENSE" for copying and usage permission. + * See the file "CONTRIBUTORS" for complete list of contributors. + */ +package org.akhikhl.gretty; + +import org.eclipse.jetty.webapp.WebAppClassLoader; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; + +/** + * Properly implements "server classes" concept. + * + * @author akhikhl + */ +public class FilteringClassLoader extends WebAppClassLoader { + + private final List serverClasses = new ArrayList(); + + private final List serverResources = new ArrayList(); + + private ClassLoader bootClassLoader; + + public FilteringClassLoader(Context context) throws IOException { + super(context); + findBootClassLoader(); + } + + public FilteringClassLoader(ClassLoader parent, Context context) throws IOException { + super(parent, context); + findBootClassLoader(); + } + + protected void findBootClassLoader() { + bootClassLoader = getParent(); + if (bootClassLoader != null) { + while(bootClassLoader.getParent() != null) { + bootClassLoader = bootClassLoader.getParent(); + } + } + } + + public void addServerClass(String serverClass) { + serverClasses.add(serverClass); + serverResources.add(serverClass.replace('.', '/')); + serverResources.add("META-INF/services/" + serverClass); + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + for(String serverClass : serverClasses) + if(name.startsWith(serverClass)) { + Class c = findLoadedClass(name); + if(c == null) + c = findClass(name); + if(c != null) { + if(resolve) + resolveClass(c); + return c; + } + throw new ClassNotFoundException(name); + } + return super.loadClass(name, resolve); + } + + @Override + public Enumeration getResources(String name) throws IOException { + for(String serverResource : serverResources) { + if(name.startsWith(serverResource)) { + final List resources = new ArrayList<>(); + resources.addAll(Collections.list(getBootstrapResources(name))); + resources.addAll(Collections.list(findResources(name))); + return Collections.enumeration(resources); + } + } + return super.getResources(name); + } + + private Enumeration getBootstrapResources(String name) throws IOException { + return bootClassLoader.getResources(name); + } +} From fb9aadba58b528e3cd3077ea446f756ff129eba1 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 12:59:58 +0100 Subject: [PATCH 02/18] Rename 'gretty-runner-jetty94' to 'gretty-runner-jetty11' --- .../{gretty-runner-jetty94 => gretty-runner-jetty11}/build.gradle | 0 .../src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy | 0 .../src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy | 0 .../main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java | 0 .../main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java | 0 .../src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java | 0 .../groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java | 0 .../main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java | 0 .../main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java | 0 .../main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy | 0 .../src/main/java/org/akhikhl/gretty/FilteringClassLoader.java | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/build.gradle (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy (100%) rename libs/{gretty-runner-jetty94 => gretty-runner-jetty11}/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java (100%) diff --git a/libs/gretty-runner-jetty94/build.gradle b/libs/gretty-runner-jetty11/build.gradle similarity index 100% rename from libs/gretty-runner-jetty94/build.gradle rename to libs/gretty-runner-jetty11/build.gradle diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java diff --git a/libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy similarity index 100% rename from libs/gretty-runner-jetty94/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy rename to libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/WebInfConfigurationEx.groovy diff --git a/libs/gretty-runner-jetty94/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java b/libs/gretty-runner-jetty11/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java similarity index 100% rename from libs/gretty-runner-jetty94/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java rename to libs/gretty-runner-jetty11/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java From cc7eddd518721809156d7d839b65c407dc6653bb Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 13:33:19 +0100 Subject: [PATCH 03/18] Compile against Jetty 11 --- gradle.properties | 4 ++-- .../testJettyContextConfig/build.gradle | 2 +- .../testJettyRandomPorts/build.gradle | 2 +- .../testJettyServerConfig/build.gradle | 2 +- libs/gretty-core/build.gradle | 4 ++-- .../akhikhl/gretty/Externalized.properties | 4 ++-- libs/gretty-runner-jetty11/build.gradle | 18 ++++++++--------- .../akhikhl/gretty/JettyConfigurerImpl.groovy | 8 ++++---- .../gretty/SSOAuthenticatorFactory.java | 2 +- .../akhikhl/gretty/SSOBasicAuthenticator.java | 8 ++++---- .../gretty/SSOClientCertAuthenticator.java | 8 ++++---- .../gretty/SSODigestAuthenticator.java | 8 ++++---- .../gretty/SSOSpnegoAuthenticator.java | 12 +++++------ libs/gretty/build.gradle | 2 +- .../org/akhikhl/gretty/GrettyPlugin.groovy | 8 ++++---- .../gretty/ServletContainerConfig.groovy | 20 +++++++++---------- settings.gradle | 4 ++-- 17 files changed, 58 insertions(+), 58 deletions(-) diff --git a/gradle.properties b/gradle.properties index 76e5ad19a..f774ee597 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,8 +7,8 @@ developerName = Andrey Hihlovskiy license = MIT group = org.gretty version = 4.0.0-SNAPSHOT -jetty10_version = 10.0.0.alpha2 -jetty10_servlet_api_version = 5.0.0-M1 +jetty11_version = 11.0.0.beta3 +jetty11_servlet_api_version = 5.0.0 tomcat10_version = 10.0.0-M9 tomcat10_servlet_api_version = 5.0.0-M1 asm_version = 9.0 diff --git a/integrationTests/testJettyContextConfig/build.gradle b/integrationTests/testJettyContextConfig/build.gradle index 136140f60..359fb2d9b 100644 --- a/integrationTests/testJettyContextConfig/build.gradle +++ b/integrationTests/testJettyContextConfig/build.gradle @@ -11,4 +11,4 @@ dependencies { defineIntegrationTest() // FIXME (#162) -// testAll.dependsOn defineIntegrationTestAllContainers(['jetty10']) +// testAll.dependsOn defineIntegrationTestAllContainers(['jetty11']) diff --git a/integrationTests/testJettyRandomPorts/build.gradle b/integrationTests/testJettyRandomPorts/build.gradle index 6c2f31d0c..abaf1a29b 100644 --- a/integrationTests/testJettyRandomPorts/build.gradle +++ b/integrationTests/testJettyRandomPorts/build.gradle @@ -17,4 +17,4 @@ gretty { defineIntegrationTest() // FIXME (#162) -// testAll.dependsOn defineIntegrationTestAllContainers(['jetty10']) +// testAll.dependsOn defineIntegrationTestAllContainers(['jetty11']) diff --git a/integrationTests/testJettyServerConfig/build.gradle b/integrationTests/testJettyServerConfig/build.gradle index b4b63b2bc..da7981001 100644 --- a/integrationTests/testJettyServerConfig/build.gradle +++ b/integrationTests/testJettyServerConfig/build.gradle @@ -11,4 +11,4 @@ dependencies { defineIntegrationTest() // FIXME (#162) -// testAll.dependsOn defineIntegrationTestAllContainers([''jetty10']) +// testAll.dependsOn defineIntegrationTestAllContainers([''jetty11']) diff --git a/libs/gretty-core/build.gradle b/libs/gretty-core/build.gradle index edd8595f1..4661130ad 100644 --- a/libs/gretty-core/build.gradle +++ b/libs/gretty-core/build.gradle @@ -19,8 +19,8 @@ dependencies { tasks.processResources { def props = [ grettyVersion: project.version, - jetty10Version: project.jetty10_version, - jetty10ServletApiVersion: project.jetty10_servlet_api_version, + jetty11Version: project.jetty11_version, + jetty11ServletApiVersion: project.jetty11_servlet_api_version, tomcat10Version: project.tomcat10_version, tomcat10ServletApiVersion: project.tomcat10_servlet_api_version, springBootVersion: project.springBootVersion, diff --git a/libs/gretty-core/src/main/resources/org/akhikhl/gretty/Externalized.properties b/libs/gretty-core/src/main/resources/org/akhikhl/gretty/Externalized.properties index 029038aae..26f829daf 100644 --- a/libs/gretty-core/src/main/resources/org/akhikhl/gretty/Externalized.properties +++ b/libs/gretty-core/src/main/resources/org/akhikhl/gretty/Externalized.properties @@ -1,6 +1,6 @@ grettyVersion=@grettyVersion@ -jetty10Version=@jetty10Version@ -jetty10ServletApiVersion=@jetty10ServletApiVersion@ +jetty11Version=@jetty11Version@ +jetty11ServletApiVersion=@jetty11ServletApiVersion@ tomcat10Version=@tomcat10Version@ tomcat10ServletApiVersion=@tomcat10ServletApiVersion@ springBootVersion=@springBootVersion@ diff --git a/libs/gretty-runner-jetty11/build.gradle b/libs/gretty-runner-jetty11/build.gradle index 6d922cc28..76f989d9f 100644 --- a/libs/gretty-runner-jetty11/build.gradle +++ b/libs/gretty-runner-jetty11/build.gradle @@ -8,15 +8,15 @@ configurations { dependencies { compile project(':libs:gretty-runner-jetty') - compile "javax.servlet:javax.servlet-api:$jetty9_servlet_api_version" - compile "org.eclipse.jetty:jetty-server:$jetty94_version" - compile "org.eclipse.jetty:jetty-servlet:$jetty94_version" - compile "org.eclipse.jetty:jetty-webapp:$jetty94_version" - compile "org.eclipse.jetty:jetty-security:$jetty94_version" - compile "org.eclipse.jetty:apache-jsp:$jetty94_version" - compile "org.eclipse.jetty:jetty-annotations:$jetty94_version" - compile "org.eclipse.jetty:jetty-plus:$jetty94_version" - compile "org.eclipse.jetty.websocket:javax-websocket-server-impl:$jetty94_version" + compile "jakarta.servlet:jakarta.servlet-api:$jetty11_servlet_api_version" + compile "org.eclipse.jetty:jetty-server:$jetty11_version" + compile "org.eclipse.jetty:jetty-servlet:$jetty11_version" + compile "org.eclipse.jetty:jetty-webapp:$jetty11_version" + compile "org.eclipse.jetty:jetty-security:$jetty11_version" + compile "org.eclipse.jetty:apache-jsp:$jetty11_version" + compile "org.eclipse.jetty:jetty-annotations:$jetty11_version" + compile "org.eclipse.jetty:jetty-plus:$jetty11_version" + compile "org.eclipse.jetty.websocket:websocket-jetty-server:$jetty11_version" compile "org.ow2.asm:asm:$asm_version" compile "org.ow2.asm:asm-commons:$asm_version" } diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index 3c97cc8c3..53f9fc5b4 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -18,7 +18,7 @@ import org.eclipse.jetty.server.* import org.eclipse.jetty.server.handler.ContextHandlerCollection import org.eclipse.jetty.server.session.SessionHandler import org.eclipse.jetty.util.component.LifeCycle -import org.eclipse.jetty.util.resource.FileResource +import org.eclipse.jetty.util.resource.PathResource import org.eclipse.jetty.util.resource.Resource import org.eclipse.jetty.util.resource.ResourceCollection import org.eclipse.jetty.util.ssl.SslContextFactory @@ -105,7 +105,7 @@ class JettyConfigurerImpl implements JettyConfigurer { HttpConfiguration https_config = new HttpConfiguration(http_config) https_config.addCustomizer(new SecureRequestCustomizer()) httpsConn = new ServerConnector(server, - new SslConnectionFactory(new SslContextFactory(), 'http/1.1'), + new SslConnectionFactory(new SslContextFactory.Server(), 'http/1.1'), new HttpConnectionFactory(https_config)) } @@ -127,7 +127,7 @@ class JettyConfigurerImpl implements JettyConfigurer { URL url = getClass().getResource(resString) if(url == null) throw new Exception("Could not resource referenced in sslKeyStorePath: '${resString}'") - sslContextFactory.setKeyStoreResource(new FileResource(url)) + sslContextFactory.setKeyStoreResource(new PathResource(url)) } else sslContextFactory.setKeyStorePath(params.sslKeyStorePath) @@ -142,7 +142,7 @@ class JettyConfigurerImpl implements JettyConfigurer { URL url = getClass().getResource(resString) if(url == null) throw new Exception("Could not resource referenced in sslTrustStorePath: '${resString}'") - sslContextFactory.setTrustStoreResource(new FileResource(url)) + sslContextFactory.setTrustStoreResource(new PathResource(url)) } else sslContextFactory.setTrustStorePath(params.sslTrustStorePath) diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java index 5395cfcca..245136b16 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOAuthenticatorFactory.java @@ -15,7 +15,7 @@ import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.security.Constraint; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; /** * diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java index 04988f134..365bad9e0 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOBasicAuthenticator.java @@ -19,10 +19,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java index def86dc4a..cfa2d627d 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOClientCertAuthenticator.java @@ -19,10 +19,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java index a05c877b4..2d4ec3d2f 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSODigestAuthenticator.java @@ -19,10 +19,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java index f57415380..dd71ac23e 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SSOSpnegoAuthenticator.java @@ -11,7 +11,7 @@ import org.eclipse.jetty.security.ServerAuthException; import org.eclipse.jetty.security.authentication.DeferredAuthentication; import org.eclipse.jetty.security.authentication.SessionAuthentication; -import org.eclipse.jetty.security.authentication.SpnegoAuthenticator; +import org.eclipse.jetty.security.authentication.ConfigurableSpnegoAuthenticator; import org.eclipse.jetty.server.Authentication; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.UserIdentity; @@ -19,10 +19,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import static org.eclipse.jetty.security.authentication.FormAuthenticator.*; @@ -30,7 +30,7 @@ * * @author akhikhl */ -public class SSOSpnegoAuthenticator extends SpnegoAuthenticator { +public class SSOSpnegoAuthenticator extends ConfigurableSpnegoAuthenticator { private static final Logger LOG = LoggerFactory.getLogger(SSOSpnegoAuthenticator.class); diff --git a/libs/gretty/build.gradle b/libs/gretty/build.gradle index 56ba22b5c..b03a5b1d9 100644 --- a/libs/gretty/build.gradle +++ b/libs/gretty/build.gradle @@ -11,7 +11,7 @@ dependencies { exclude group: 'ch.qos.logback', module: 'logback-classic' } compile "org.springframework.boot:spring-boot-loader-tools:${springBootVersion}" - compile "org.eclipse.jetty:jetty-util:$jetty10_version" + compile "org.eclipse.jetty:jetty-util:$jetty11_version" compile gradleApi() } diff --git a/libs/gretty/src/main/groovy/org/akhikhl/gretty/GrettyPlugin.groovy b/libs/gretty/src/main/groovy/org/akhikhl/gretty/GrettyPlugin.groovy index 259eabbba..711876231 100644 --- a/libs/gretty/src/main/groovy/org/akhikhl/gretty/GrettyPlugin.groovy +++ b/libs/gretty/src/main/groovy/org/akhikhl/gretty/GrettyPlugin.groovy @@ -768,10 +768,10 @@ class GrettyPlugin implements Plugin { project.ext { grettyVersion = Externalized.getString('grettyVersion') - if(!has('jetty10Version')) - jetty10Version = Externalized.getString('jetty10Version') - if(!has('jetty10ServletApiVersion')) - jetty10ServletApiVersion = Externalized.getString('jetty10ServletApiVersion') + if(!has('jetty11Version')) + jetty11Version = Externalized.getString('jetty11Version') + if(!has('jetty11ServletApiVersion')) + jetty11ServletApiVersion = Externalized.getString('jetty11ServletApiVersion') if(!has('tomcat10Version')) tomcat10Version = Externalized.getString('tomcat10Version') if(!has('tomcat10ServletApiVersion')) diff --git a/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy b/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy index 193877e8b..69a0bb67d 100644 --- a/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy +++ b/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy @@ -49,17 +49,17 @@ class ServletContainerConfig { String grettyVersion = Externalized.getString('grettyVersion') def runnerGroup = "org.gretty" def configs = [:] - configs['jetty10'] = [ + configs['jetty11'] = [ servletContainerType: 'jetty', - servletContainerVersion: { project -> project.ext.jetty10Version }, - servletContainerDescription: { project -> "Jetty ${project.ext.jetty10Version}" }, - servletContainerRunnerConfig: 'grettyRunnerJetty10', + servletContainerVersion: { project -> project.ext.jetty11Version }, + servletContainerDescription: { project -> "Jetty ${project.ext.jetty11Version}" }, + servletContainerRunnerConfig: 'grettyRunnerJetty11', servletContainerRunnerDependencies: { project -> - project.dependencies.add servletContainerRunnerConfig, "${runnerGroup}:gretty-runner-jetty10:$grettyVersion" + project.dependencies.add servletContainerRunnerConfig, "${runnerGroup}:gretty-runner-jetty11:$grettyVersion" addRedirectFilter(project, servletContainerRunnerConfig) project.configurations[servletContainerRunnerConfig].resolutionStrategy { - force "jakarta.servlet:jakarta.servlet-api:${project.ext.jetty10ServletApiVersion}" - def jettyVversion = project.ext.jetty10Version + force "jakarta.servlet:jakarta.servlet-api:${project.ext.jetty11ServletApiVersion}" + def jettyVversion = project.ext.jetty11Version force "org.eclipse.jetty:jetty-server:$jettVersion" force "org.eclipse.jetty:jetty-servlet:$jettyVersion" force "org.eclipse.jetty:jetty-webapp:$jettyVersion" @@ -73,10 +73,10 @@ class ServletContainerConfig { force "org.ow2.asm:asm-commons:$asm_version" } }, - servletApiVersion: { project -> project.ext.jetty10ServletApiVersion }, + servletApiVersion: { project -> project.ext.jetty11ServletApiVersion }, servletApiDependencies: { project -> project.dependencies { - grettyProvidedCompile "jakarta.servlet:jakarta.servlet-api:${project.ext.jetty10ServletApiVersion}" + grettyProvidedCompile "jakarta.servlet:jakarta.servlet-api:${project.ext.jetty11ServletApiVersion}" grettyProvidedCompile 'jakarta.websocket:jakarta.websocket-api:2.0.0-M1' } } @@ -135,7 +135,7 @@ class ServletContainerConfig { } if(compatibleConfigEntry) return compatibleConfigEntry.key - String defaultJettyServletContainer = 'jetty10' + String defaultJettyServletContainer = 'jetty11' log.warn 'Cannot find jetty container with compatible servlet-api to {}, defaulting to {}', servletContainer, defaultJettyServletContainer defaultJettyServletContainer } diff --git a/settings.gradle b/settings.gradle index c3c887da0..8c9d6b469 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,8 +4,8 @@ include 'libs:gretty' include 'libs:gretty-common' include 'libs:gretty-filter' include 'libs:gretty-runner' -// FIXME (#162) -// include 'libs:gretty-runner-jetty' +include 'libs:gretty-runner-jetty' +include 'libs:gretty-runner-jetty11' include 'libs:gretty-runner-tomcat' include 'libs:gretty-runner-tomcat10' include 'libs:gretty-spock' From e92596e264faa9f0da9143357b05bd0e6d321726 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 13:45:19 +0100 Subject: [PATCH 04/18] Fix typos in ServletContainerConfig for Jetty 11 --- .../groovy/org/akhikhl/gretty/ServletContainerConfig.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy b/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy index 69a0bb67d..5dff6878b 100644 --- a/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy +++ b/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy @@ -59,8 +59,8 @@ class ServletContainerConfig { addRedirectFilter(project, servletContainerRunnerConfig) project.configurations[servletContainerRunnerConfig].resolutionStrategy { force "jakarta.servlet:jakarta.servlet-api:${project.ext.jetty11ServletApiVersion}" - def jettyVversion = project.ext.jetty11Version - force "org.eclipse.jetty:jetty-server:$jettVersion" + def jettyVersion = project.ext.jetty11Version + force "org.eclipse.jetty:jetty-server:$jettyVersion" force "org.eclipse.jetty:jetty-servlet:$jettyVersion" force "org.eclipse.jetty:jetty-webapp:$jettyVersion" force "org.eclipse.jetty:jetty-security:$jettyVersion" From 980affbfe0bf06bf432bfe86ad28a7e44136961c Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 13:59:47 +0100 Subject: [PATCH 05/18] Jetty 11: Disable log configuration via Gaffer for now and add FIXMEs --- .../gretty/GafferConfiguratorEx.groovy | 2 ++ .../groovy/org/akhikhl/gretty/Runner.groovy | 12 ++++++- .../main/resources/grettyRunnerLogback.xml | 32 +++++++++++++++++++ .../gretty/ServletContainerConfig.groovy | 4 +++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 libs/gretty-runner/src/main/resources/grettyRunnerLogback.xml diff --git a/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/GafferConfiguratorEx.groovy b/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/GafferConfiguratorEx.groovy index d07aced60..a5c585d04 100644 --- a/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/GafferConfiguratorEx.groovy +++ b/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/GafferConfiguratorEx.groovy @@ -24,6 +24,8 @@ import org.codehaus.groovy.control.CompilerConfiguration * * @author akhikhl */ +// FIXME #162 recent logback versions do not include GafferConfigurator +// see also: remark in Runner.groovy, the only call site @CompileStatic(TypeCheckingMode.SKIP) class GafferConfiguratorEx extends GafferConfigurator { diff --git a/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/Runner.groovy b/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/Runner.groovy index 81c39fea0..dfe5f49bb 100644 --- a/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/Runner.groovy +++ b/libs/gretty-runner/src/main/groovy/org/akhikhl/gretty/Runner.groovy @@ -80,7 +80,17 @@ final class Runner { binding.logFileName = serverParams.logFileName binding.logDir = serverParams.logDir binding.grettyDebug = params.debug - new GafferConfiguratorEx(logCtx).run(binding, logbackConfigText) + // FIXME #162 logback has temporarily suspended GafferConfigurator. + // We do not know if and when it will come back, see news of 2019-10-11: + // http://logback.qos.ch/news.html + // new GafferConfiguratorEx(logCtx).run(binding, logbackConfigText) + // Instead we use a fixed configuration file, which does not respect all the different + // logging toggles in Gretty: + Runner.class.getResource('/grettyRunnerLogback.xml').withInputStream { + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(logCtx) + configurator.doConfigure(it) + } } private static Level stringToLoggingLevel(String str) { diff --git a/libs/gretty-runner/src/main/resources/grettyRunnerLogback.xml b/libs/gretty-runner/src/main/resources/grettyRunnerLogback.xml new file mode 100644 index 000000000..d98b4d890 --- /dev/null +++ b/libs/gretty-runner/src/main/resources/grettyRunnerLogback.xml @@ -0,0 +1,32 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy b/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy index 5dff6878b..541be8695 100644 --- a/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy +++ b/libs/gretty/src/main/groovy/org/akhikhl/gretty/ServletContainerConfig.groovy @@ -71,6 +71,10 @@ class ServletContainerConfig { def asm_version = project.ext.asmVersion force "org.ow2.asm:asm:$asm_version" force "org.ow2.asm:asm-commons:$asm_version" + + // FIXME #162 make Tomcat and Jetty agree on a common version of logback again? + force 'ch.qos.logback:logback-classic:1.3.0-alpha5' + force 'org.slf4j:slf4j-api:2.0.0-alpha1' } }, servletApiVersion: { project -> project.ext.jetty11ServletApiVersion }, From 4e3cac8c6dea308429557279ae35efa11e84019c Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 14:01:33 +0100 Subject: [PATCH 06/18] Fix location of constant CONTAINER_JAR_PATTERN in Jetty 11 --- .../main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index 53f9fc5b4..e7e022dd8 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -207,7 +207,7 @@ class JettyConfigurerImpl implements JettyConfigurer { context.setWebInfLib(webappClassPath.findAll { it.endsWith('.jar') }.collect { new File(it) }) context.setExtraClasspath(webappClassPath.collect { it.endsWith('.jar') ? it : (it.endsWith('/') ? it : it + '/') }.join(';')) context.setInitParameter('org.eclipse.jetty.servlet.Default.useFileMappedBuffer', serverParams.productMode ? 'true' : 'false') - context.setAttribute(WebInfConfiguration.CONTAINER_JAR_PATTERN, + context.setAttribute(MetaInfConfiguration.CONTAINER_JAR_PATTERN, '.*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$'); FilteringClassLoader classLoader = new FilteringClassLoader(context) classLoader.addServerClass('ch.qos.logback.') From a05c509486041fb7aba3eb4d5a2a10b0dcbb20f2 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 14:11:02 +0100 Subject: [PATCH 07/18] Jetty 11: Remove redundant LifeCycleListenerAdapter The super-interface LifeCycleListener added default methods. The adapter became redundant. --- .../akhikhl/gretty/JettyConfigurerImpl.groovy | 4 +- .../gretty/LifeCycleListenerAdapter.java | 43 ------------------- 2 files changed, 2 insertions(+), 45 deletions(-) delete mode 100644 libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index e7e022dd8..c20062c56 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -40,7 +40,7 @@ class JettyConfigurerImpl implements JettyConfigurer { @Override def addLifeCycleListener(lifecycle, listener) { - def lifeCycleListener = listener as LifeCycleListenerAdapter + def lifeCycleListener = listener as LifeCycle.Listener lifecycle.addLifeCycleListener(lifeCycleListener) lifeCycleListener } @@ -219,7 +219,7 @@ class JettyConfigurerImpl implements JettyConfigurer { classLoader.addServerClass('groovyjarjarasm.') classLoader.addServerClass('groovyjarjarcommonscli.') context.classLoader = classLoader - context.addLifeCycleListener(new LifeCycleListenerAdapter() { + context.addEventListener(new LifeCycle.Listener() { public void lifeCycleStopped(LifeCycle event) { context.classLoader = null } diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java deleted file mode 100644 index 2ccf906ca..000000000 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/LifeCycleListenerAdapter.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Gretty - * - * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. - * - * See the file "LICENSE" for copying and usage permission. - * See the file "CONTRIBUTORS" for complete list of contributors. - */ -package org.akhikhl.gretty; - -import org.eclipse.jetty.util.component.LifeCycle; - -/** - * - * @author akhikhl - */ -public class LifeCycleListenerAdapter implements LifeCycle.Listener { - - @Override - public void lifeCycleStarting(LifeCycle event) { - - } - - @Override - public void lifeCycleStarted(LifeCycle event) { - - } - - @Override - public void lifeCycleFailure(LifeCycle event, Throwable cause) { - - } - - @Override - public void lifeCycleStopping(LifeCycle event) { - - } - - @Override - public void lifeCycleStopped(LifeCycle event) { - - } -} From ce5f4ce6ecbd2dbf562962c4aa13fbdefb1c6fcc Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 17:51:58 +0100 Subject: [PATCH 08/18] Fix classloading during startup of Jetty 11 --- .../groovy/org/akhikhl/gretty/JettyWebAppContext.groovy | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy index a065241a4..4a19656a3 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyWebAppContext.groovy @@ -12,6 +12,7 @@ import org.eclipse.jetty.util.URIUtil import org.eclipse.jetty.util.log.Log import org.eclipse.jetty.util.log.Logger import org.eclipse.jetty.util.resource.Resource +import org.eclipse.jetty.webapp.WebAppClassLoader import org.eclipse.jetty.webapp.WebAppContext /** @@ -41,7 +42,10 @@ class JettyWebAppContext extends WebAppContext { webInfJarMap.put(fileName, it) } } - super.doStart() + + WebAppClassLoader.runWithServerClassAccess { + super.doStart() + } } @Override From e05ed3db80e87fa57065ab98dba8117c462c7b0f Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 18:05:55 +0100 Subject: [PATCH 09/18] Jetty 11: Bring back testJettyRandomPorts IT --- integrationTests/settings.gradle | 2 +- integrationTests/testJettyRandomPorts/build.gradle | 3 +-- .../testJettyRandomPorts/src/main/webapp/WEB-INF/jetty-env.xml | 1 + 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrationTests/settings.gradle b/integrationTests/settings.gradle index 7652a5e55..2f70e5392 100644 --- a/integrationTests/settings.gradle +++ b/integrationTests/settings.gradle @@ -16,7 +16,7 @@ include 'testDuplicatingResources' include 'testInitParameter' // FIXME Jetty 10 servlet container is not implemented yet (#162) // include 'testJettyContextConfig' -// include 'testJettyRandomPorts' +include 'testJettyRandomPorts' // include 'testJettyServerConfig' include 'testTomcatContextConfig' include 'testTomcatRandomPorts' diff --git a/integrationTests/testJettyRandomPorts/build.gradle b/integrationTests/testJettyRandomPorts/build.gradle index abaf1a29b..e08a2a8c9 100644 --- a/integrationTests/testJettyRandomPorts/build.gradle +++ b/integrationTests/testJettyRandomPorts/build.gradle @@ -16,5 +16,4 @@ gretty { } defineIntegrationTest() -// FIXME (#162) -// testAll.dependsOn defineIntegrationTestAllContainers(['jetty11']) +testAll.dependsOn defineIntegrationTestAllContainers(['jetty11']) diff --git a/integrationTests/testJettyRandomPorts/src/main/webapp/WEB-INF/jetty-env.xml b/integrationTests/testJettyRandomPorts/src/main/webapp/WEB-INF/jetty-env.xml index 3060ad849..4656a48ec 100644 --- a/integrationTests/testJettyRandomPorts/src/main/webapp/WEB-INF/jetty-env.xml +++ b/integrationTests/testJettyRandomPorts/src/main/webapp/WEB-INF/jetty-env.xml @@ -1,4 +1,5 @@ + /abc From c95616b243d82a49c4ded5410b7664433a319e1d Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 18:13:59 +0100 Subject: [PATCH 10/18] Jetty 11: Bring back testJettyServerConfig IT --- integrationTests/settings.gradle | 2 +- integrationTests/testJettyServerConfig/build.gradle | 3 +-- integrationTests/testJettyServerConfig/jetty/jetty.xml | 1 + .../main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/integrationTests/settings.gradle b/integrationTests/settings.gradle index 2f70e5392..c1cdc2091 100644 --- a/integrationTests/settings.gradle +++ b/integrationTests/settings.gradle @@ -17,7 +17,7 @@ include 'testInitParameter' // FIXME Jetty 10 servlet container is not implemented yet (#162) // include 'testJettyContextConfig' include 'testJettyRandomPorts' -// include 'testJettyServerConfig' +include 'testJettyServerConfig' include 'testTomcatContextConfig' include 'testTomcatRandomPorts' include 'testTomcatServerConfig' diff --git a/integrationTests/testJettyServerConfig/build.gradle b/integrationTests/testJettyServerConfig/build.gradle index da7981001..656900894 100644 --- a/integrationTests/testJettyServerConfig/build.gradle +++ b/integrationTests/testJettyServerConfig/build.gradle @@ -10,5 +10,4 @@ dependencies { } defineIntegrationTest() -// FIXME (#162) -// testAll.dependsOn defineIntegrationTestAllContainers([''jetty11']) +testAll.dependsOn defineIntegrationTestAllContainers(['jetty11']) diff --git a/integrationTests/testJettyServerConfig/jetty/jetty.xml b/integrationTests/testJettyServerConfig/jetty/jetty.xml index 21ab51019..ee36e79c8 100644 --- a/integrationTests/testJettyServerConfig/jetty/jetty.xml +++ b/integrationTests/testJettyServerConfig/jetty/jetty.xml @@ -1,4 +1,5 @@ + 10 diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index c20062c56..ce247f6bc 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -58,7 +58,7 @@ class JettyConfigurerImpl implements JettyConfigurer { void applyJettyXml(server, String jettyXml) { if(jettyXml != null) { log.info 'Configuring server with {}', jettyXml - XmlConfiguration xmlConfiguration = new XmlConfiguration(new File(jettyXml).toURI().toURL()) + XmlConfiguration xmlConfiguration = new XmlConfiguration(new PathResource(new File(jettyXml))) xmlConfiguration.configure(server) } } From fc38048244f0d2717470133e1f0fe7b60edf6128 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 18:17:44 +0100 Subject: [PATCH 11/18] Jetty 11: Bring back testJettyContextConfig IT --- integrationTests/settings.gradle | 3 +-- integrationTests/testJettyContextConfig/build.gradle | 3 +-- .../src/main/webapp/WEB-INF/jetty-env.xml | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/integrationTests/settings.gradle b/integrationTests/settings.gradle index c1cdc2091..be5fa4c45 100644 --- a/integrationTests/settings.gradle +++ b/integrationTests/settings.gradle @@ -14,8 +14,7 @@ include 'testAnnotationsOverlay' include 'testDependency' include 'testDuplicatingResources' include 'testInitParameter' -// FIXME Jetty 10 servlet container is not implemented yet (#162) -// include 'testJettyContextConfig' +include 'testJettyContextConfig' include 'testJettyRandomPorts' include 'testJettyServerConfig' include 'testTomcatContextConfig' diff --git a/integrationTests/testJettyContextConfig/build.gradle b/integrationTests/testJettyContextConfig/build.gradle index 359fb2d9b..656900894 100644 --- a/integrationTests/testJettyContextConfig/build.gradle +++ b/integrationTests/testJettyContextConfig/build.gradle @@ -10,5 +10,4 @@ dependencies { } defineIntegrationTest() -// FIXME (#162) -// testAll.dependsOn defineIntegrationTestAllContainers(['jetty11']) +testAll.dependsOn defineIntegrationTestAllContainers(['jetty11']) diff --git a/integrationTests/testJettyContextConfig/src/main/webapp/WEB-INF/jetty-env.xml b/integrationTests/testJettyContextConfig/src/main/webapp/WEB-INF/jetty-env.xml index 3060ad849..4656a48ec 100644 --- a/integrationTests/testJettyContextConfig/src/main/webapp/WEB-INF/jetty-env.xml +++ b/integrationTests/testJettyContextConfig/src/main/webapp/WEB-INF/jetty-env.xml @@ -1,4 +1,5 @@ + /abc From abb9a1f733b4d2326c5f20413880e57f68489fe2 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 18:19:28 +0100 Subject: [PATCH 12/18] Jetty 11: Find replacement for new XmlConfiguration(URL) in JettyConfigurerImpl --- .../main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index ce247f6bc..82a902fcd 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -49,7 +49,7 @@ class JettyConfigurerImpl implements JettyConfigurer { void applyContextConfigFile(webAppContext, URL contextConfigFile) { if(contextConfigFile) { log.info 'Configuring {} with {}', webAppContext.contextPath, contextConfigFile - XmlConfiguration xmlConfiguration = new XmlConfiguration(contextConfigFile) + XmlConfiguration xmlConfiguration = new XmlConfiguration(new PathResource(contextConfigFile)) xmlConfiguration.configure(webAppContext) } } From 402a348aeae0ebe35bd3d77c52eed7b1ab9fe061 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 19:46:13 +0100 Subject: [PATCH 13/18] Jetty 11: Repair filterWebapp IT The Gradle module is called 'filterWebapp' on the filesystem. Mind the lowercase 'a'! In Jetty 11, this caused Gretty to fail to locate the filter configuration. --- integrationTests/settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrationTests/settings.gradle b/integrationTests/settings.gradle index be5fa4c45..350b66bd4 100644 --- a/integrationTests/settings.gradle +++ b/integrationTests/settings.gradle @@ -8,7 +8,7 @@ include 'helloGrettyOverlay' // Jersey 3.0.0-M1 still depends on javax.servlet internally // include 'helloJersey' include 'extraResourceBases' -include 'filterWebApp' +include 'filterWebapp' include 'testAnnotations' include 'testAnnotationsOverlay' include 'testDependency' From 32a3876023d732d111c3c0802ca262c12055336c Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 6 Nov 2020 19:47:54 +0100 Subject: [PATCH 14/18] Add Jetty 11 to Travis servlet containers --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 52d4a8ae1..bc33fcdc8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,11 +2,11 @@ language: groovy matrix: include: - jdk: openjdk11 - env: TEST_ALL_CONTAINERS="['tomcat10']" GRADLE_VERSION="5.6.4" + env: TEST_ALL_CONTAINERS="['tomcat10','jetty11']" GRADLE_VERSION="5.6.4" - jdk: openjdk15 - env: TEST_ALL_CONTAINERS="['tomcat10']" GRADLE_VERSION="6.6.1" + env: TEST_ALL_CONTAINERS="['tomcat10','jetty11']" GRADLE_VERSION="6.6.1" - jdk: openjdk11 - env: TEST_ALL_CONTAINERS="['tomcat10']" GRADLE_VERSION="6.6.1" + env: TEST_ALL_CONTAINERS="['tomcat10','jetty11']" GRADLE_VERSION="6.6.1" before_cache: - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock cache: From ed5c9267058c95b526c88acefc3b6b012b53f863 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Sat, 7 Nov 2020 14:10:53 +0100 Subject: [PATCH 15/18] Jetty 11: Remove redundant FilteringClassLoader The FilteringClassLoader implements the server classes concept, which Jetty appears to support natively. I also cleaned up the list of server class patterns, because I cannot figure out what exactly 'groovyjarjarantlr' and the likes are supposed to match on. --- .../akhikhl/gretty/JettyConfigurerImpl.groovy | 22 ++--- .../akhikhl/gretty/FilteringClassLoader.java | 91 ------------------- 2 files changed, 8 insertions(+), 105 deletions(-) delete mode 100644 libs/gretty-runner-jetty11/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index 82a902fcd..fa6614435 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -209,21 +209,15 @@ class JettyConfigurerImpl implements JettyConfigurer { context.setInitParameter('org.eclipse.jetty.servlet.Default.useFileMappedBuffer', serverParams.productMode ? 'true' : 'false') context.setAttribute(MetaInfConfiguration.CONTAINER_JAR_PATTERN, '.*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$'); - FilteringClassLoader classLoader = new FilteringClassLoader(context) - classLoader.addServerClass('ch.qos.logback.') - classLoader.addServerClass('org.slf4j.') - classLoader.addServerClass('org.codehaus.groovy.') - classLoader.addServerClass('groovy.') - classLoader.addServerClass('groovyx.') - classLoader.addServerClass('groovyjarjarantlr.') - classLoader.addServerClass('groovyjarjarasm.') - classLoader.addServerClass('groovyjarjarcommonscli.') - context.classLoader = classLoader - context.addEventListener(new LifeCycle.Listener() { - public void lifeCycleStopped(LifeCycle event) { - context.classLoader = null - } + + context.addServerClassMatcher(new ClassMatcher().tap { + include'ch.qos.logback.' + include 'org.slf4j.' + include 'org.codehaus.groovy.' + include 'groovy.' + include 'groovyx.' }) + return context } diff --git a/libs/gretty-runner-jetty11/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java b/libs/gretty-runner-jetty11/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java deleted file mode 100644 index 7d97d21d1..000000000 --- a/libs/gretty-runner-jetty11/src/main/java/org/akhikhl/gretty/FilteringClassLoader.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Gretty - * - * Copyright (C) 2013-2015 Andrey Hihlovskiy and contributors. - * - * See the file "LICENSE" for copying and usage permission. - * See the file "CONTRIBUTORS" for complete list of contributors. - */ -package org.akhikhl.gretty; - -import org.eclipse.jetty.webapp.WebAppClassLoader; - -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.List; - -/** - * Properly implements "server classes" concept. - * - * @author akhikhl - */ -public class FilteringClassLoader extends WebAppClassLoader { - - private final List serverClasses = new ArrayList(); - - private final List serverResources = new ArrayList(); - - private ClassLoader bootClassLoader; - - public FilteringClassLoader(Context context) throws IOException { - super(context); - findBootClassLoader(); - } - - public FilteringClassLoader(ClassLoader parent, Context context) throws IOException { - super(parent, context); - findBootClassLoader(); - } - - protected void findBootClassLoader() { - bootClassLoader = getParent(); - if (bootClassLoader != null) { - while(bootClassLoader.getParent() != null) { - bootClassLoader = bootClassLoader.getParent(); - } - } - } - - public void addServerClass(String serverClass) { - serverClasses.add(serverClass); - serverResources.add(serverClass.replace('.', '/')); - serverResources.add("META-INF/services/" + serverClass); - } - - @Override - protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - for(String serverClass : serverClasses) - if(name.startsWith(serverClass)) { - Class c = findLoadedClass(name); - if(c == null) - c = findClass(name); - if(c != null) { - if(resolve) - resolveClass(c); - return c; - } - throw new ClassNotFoundException(name); - } - return super.loadClass(name, resolve); - } - - @Override - public Enumeration getResources(String name) throws IOException { - for(String serverResource : serverResources) { - if(name.startsWith(serverResource)) { - final List resources = new ArrayList<>(); - resources.addAll(Collections.list(getBootstrapResources(name))); - resources.addAll(Collections.list(findResources(name))); - return Collections.enumeration(resources); - } - } - return super.getResources(name); - } - - private Enumeration getBootstrapResources(String name) throws IOException { - return bootClassLoader.getResources(name); - } -} From 9d4bc4b7a46a0eab1b259a87a6116460c0ee3adf Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Sat, 7 Nov 2020 14:21:38 +0100 Subject: [PATCH 16/18] Jetty 11: Load servlet classes via app class loader (fixes webhost integration test) --- .../org/akhikhl/gretty/JettyConfigurerImpl.groovy | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index fa6614435..c4c93a0df 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -218,6 +218,16 @@ class JettyConfigurerImpl implements JettyConfigurer { include 'groovyx.' }) + context.addSystemClassMatcher(new ClassMatcher().tap { + // I do not know if the servlet classes are system classes in the truest sense. + // However, those must be loaded by the app class loader. Otherwise the check in + // org.eclipse.jetty.servlet.ServletHolder#checkServletType does not succeed, because + // class HttpServlet (loaded from the web app class loader) is not assignable to class + // HttpServlet (loaded from the app class loader). Hence the error message 'YourServlet + // is not a Jakarta servlet'. + include 'jakarta.' + }) + return context } From 48f243e6d53376762d32178ce5cacfb0d3a2eee7 Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Sat, 7 Nov 2020 15:13:06 +0100 Subject: [PATCH 17/18] Jetty 11: Repair websocket IT --- libs/gretty-runner-jetty11/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/gretty-runner-jetty11/build.gradle b/libs/gretty-runner-jetty11/build.gradle index 76f989d9f..416c15bb4 100644 --- a/libs/gretty-runner-jetty11/build.gradle +++ b/libs/gretty-runner-jetty11/build.gradle @@ -16,6 +16,7 @@ dependencies { compile "org.eclipse.jetty:apache-jsp:$jetty11_version" compile "org.eclipse.jetty:jetty-annotations:$jetty11_version" compile "org.eclipse.jetty:jetty-plus:$jetty11_version" + compile "org.eclipse.jetty.websocket:websocket-jakarta-server:$jetty11_version" compile "org.eclipse.jetty.websocket:websocket-jetty-server:$jetty11_version" compile "org.ow2.asm:asm:$asm_version" compile "org.ow2.asm:asm-commons:$asm_version" From 18a14f8f402320998349e9ecd5a44d608a8d339e Mon Sep 17 00:00:00 2001 From: Falco Duersch Date: Fri, 13 Nov 2020 10:14:04 +0100 Subject: [PATCH 18/18] Rework single-sign-on to cope with Jetty 11 Sharing the session handler between contexts leads to an NPE, because startup of the first context now reaches into the lifecycle of the second webapp, which has not started yet. SessionHandler objects, which carry context-specific lifecycle information, must not be shared between contexts. --- .../akhikhl/gretty/JettyConfigurerImpl.groovy | 10 ++---- .../gretty/SingleSignOnSessionHandler.groovy | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SingleSignOnSessionHandler.groovy diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy index c4c93a0df..8d6fa11a0 100644 --- a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/JettyConfigurerImpl.groovy @@ -36,7 +36,6 @@ class JettyConfigurerImpl implements JettyConfigurer { private static final Logger log = LoggerFactory.getLogger(JettyConfigurerImpl) private SSOAuthenticatorFactory ssoAuthenticatorFactory - private SessionHandler sharedSessionHandler @Override def addLifeCycleListener(lifecycle, listener) { @@ -175,12 +174,9 @@ class JettyConfigurerImpl implements JettyConfigurer { void configureSessionManager(server, context, Map serverParams, Map webappParams) { SessionHandler sessionHandler if(serverParams.singleSignOn) { - sessionHandler = sharedSessionHandler - if(sessionHandler == null) { - sessionHandler = sharedSessionHandler = new SessionHandler() - sessionHandler.setMaxInactiveInterval(60 * 30) // 30 minutes - sessionHandler.getSessionCookieConfig().setPath('/') - } + sessionHandler = new SingleSignOnSessionHandler() + sessionHandler.setMaxInactiveInterval(60 * 30) // 30 minutes + sessionHandler.getSessionCookieConfig().setPath('/') } else { sessionHandler = new SessionHandler() sessionHandler.setMaxInactiveInterval(60 * 30) // 30 minutes diff --git a/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SingleSignOnSessionHandler.groovy b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SingleSignOnSessionHandler.groovy new file mode 100644 index 000000000..c7624e220 --- /dev/null +++ b/libs/gretty-runner-jetty11/src/main/groovy/org/akhikhl/gretty/SingleSignOnSessionHandler.groovy @@ -0,0 +1,31 @@ +package org.akhikhl.gretty + +import org.eclipse.jetty.server.session.Session +import org.eclipse.jetty.server.session.SessionHandler + +class SingleSignOnSessionHandler extends SessionHandler { + + @Override + Session getSession(String id) { + Session session = getLocalSession(id) + if (session == null) { + for (SessionHandler handler : getSessionIdManager().getSessionHandlers()) { + + if (handler == this || !(handler instanceof SingleSignOnSessionHandler)) { + continue + } + + session = ((SingleSignOnSessionHandler) handler).getLocalSession(id) + if (session != null) { + break + } + } + } + + return session + } + + private Session getLocalSession(String id) { + return super.getSession(id) + } +}