From c6865bbed99212269aec9eb5c11c8bdc5aa14fb0 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 25 May 2022 09:28:38 +0200 Subject: [PATCH] Reintroduce Jetty web socket --- Makefile-tp.mk | 2 + .../cms/integration/CmsExceptionsChain.java | 154 --------- .../cms/integration/CmsLoginServlet.java | 112 ------ .../cms/integration/CmsLogoutServlet.java | 79 ----- .../integration/CmsPrivateServletContext.java | 82 ----- .../cms/integration/CmsSessionDescriptor.java | 96 ------ .../cms/integration/CmsTokenServlet.java | 117 ------- .../argeo/cms/integration/JcrReadServlet.java | 318 ------------------ .../cms/integration/JcrWriteServlet.java | 91 ----- .../cms/integration/TokenDescriptor.java | 49 --- .../argeo/cms/integration/XslTemplate.java | 55 --- .../argeo/cms/integration/package-info.java | 2 - .../websocket/CmsWebSocketConfigurator.java | 86 ----- .../org/argeo/cms/websocket/package-info.java | 2 - ext/org.argeo.ext.equinox.jetty/.classpath | 7 - ext/org.argeo.ext.equinox.jetty/.gitignore | 2 - ext/org.argeo.ext.equinox.jetty/.project | 28 -- .../META-INF/.gitignore | 1 - ext/org.argeo.ext.equinox.jetty/bnd.bnd | 7 - .../build.properties | 4 - .../equinox/jetty/CmsJettyCustomizer.java | 40 --- .../org/argeo/equinox/jetty/package-info.java | 2 - .../src/org/argeo/slc/factory/A2Factory.java | 9 +- .../jetty-websocket/common.bnd | 2 - .../org.eclipse.jetty.websocket.api.bnd | 3 - .../org.eclipse.jetty.websocket.client.bnd | 3 - .../org.eclipse.jetty.websocket.common.bnd | 3 - ...rg.eclipse.jetty.websocket.core.client.bnd | 3 - ...rg.eclipse.jetty.websocket.core.common.bnd | 3 - ...rg.eclipse.jetty.websocket.core.server.bnd | 3 - ...cket.jakarta.websocket.client.bnd.disabled | 3 - ...cket.jakarta.websocket.common.bnd.disabled | 3 - ...cket.jakarta.websocket.server.bnd.disabled | 3 - .../org.eclipse.jetty.websocket.server.bnd | 3 - .../org.eclipse.jetty.websocket.servlet.bnd | 3 - .../javax.websocket.bnd | 0 .../jetty-websocket/merge.bnd | 22 ++ .../jetty/org.eclipse.jetty.alpn.client.bnd | 2 + .../jetty/org.eclipse.jetty.alpn.server.bnd | 2 + ...d.retired => org.eclipse.jetty.client.bnd} | 0 .../jetty/org.eclipse.jetty.http2.client.bnd | 2 + .../jetty/org.eclipse.jetty.http2.common.bnd | 2 + .../jetty/org.eclipse.jetty.http2.hpack.bnd | 2 + .../jetty/org.eclipse.jetty.http2.server.bnd | 2 + 44 files changed, 42 insertions(+), 1372 deletions(-) delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsExceptionsChain.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLoginServlet.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLogoutServlet.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsPrivateServletContext.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsSessionDescriptor.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsTokenServlet.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrReadServlet.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/TokenDescriptor.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/XslTemplate.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/integration/package-info.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/CmsWebSocketConfigurator.java delete mode 100644 cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/package-info.java delete mode 100644 ext/org.argeo.ext.equinox.jetty/.classpath delete mode 100644 ext/org.argeo.ext.equinox.jetty/.gitignore delete mode 100644 ext/org.argeo.ext.equinox.jetty/.project delete mode 100644 ext/org.argeo.ext.equinox.jetty/META-INF/.gitignore delete mode 100644 ext/org.argeo.ext.equinox.jetty/bnd.bnd delete mode 100644 ext/org.argeo.ext.equinox.jetty/build.properties delete mode 100644 ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java delete mode 100644 ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/package-info.java delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/common.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.api.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.client.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.common.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.client.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.common.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.server.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.client.bnd.disabled delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.common.bnd.disabled delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.server.bnd.disabled delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.server.bnd delete mode 100644 tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.servlet.bnd rename tp/{org.argeo.tp.jetty.websocket => org.argeo.tp.jetty}/javax.websocket.bnd (100%) create mode 100644 tp/org.argeo.tp.jetty/jetty-websocket/merge.bnd create mode 100644 tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.client.bnd create mode 100644 tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.server.bnd rename tp/org.argeo.tp.jetty/jetty/{org.eclipse.jetty.client.bnd.retired => org.eclipse.jetty.client.bnd} (100%) create mode 100644 tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.client.bnd create mode 100644 tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.common.bnd create mode 100644 tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.hpack.bnd create mode 100644 tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.server.bnd diff --git a/Makefile-tp.mk b/Makefile-tp.mk index 5fcaba3b1..ba01d243e 100644 --- a/Makefile-tp.mk +++ b/Makefile-tp.mk @@ -26,6 +26,8 @@ bootstrap : clean: rm -rf $(BOOTSTRAP_BASE) + rm -rf $(A2_OUTPUT)/org.argeo.tp + rm -rf $(A2_OUTPUT)/org.argeo.tp.* $(MAKE) -f Makefile-ext.mk clean include $(SDK_SRC_BASE)/sdk/argeo-build/osgi.mk \ No newline at end of file diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsExceptionsChain.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsExceptionsChain.java deleted file mode 100644 index fb289c18e..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsExceptionsChain.java +++ /dev/null @@ -1,154 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.IOException; -import java.io.Writer; -import java.util.ArrayList; -import java.util.List; - -import javax.servlet.http.HttpServletResponse; - -import org.argeo.api.cms.CmsLog; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** Serialisable wrapper of a {@link Throwable}. */ -public class CmsExceptionsChain { - public final static CmsLog log = CmsLog.getLog(CmsExceptionsChain.class); - - private List exceptions = new ArrayList<>(); - - public CmsExceptionsChain() { - super(); - } - - public CmsExceptionsChain(Throwable exception) { - writeException(exception); - if (log.isDebugEnabled()) - log.error("Exception chain", exception); - } - - public String toJsonString(ObjectMapper objectMapper) { - try { - return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(this); - } catch (JsonProcessingException e) { - throw new IllegalStateException("Cannot write system exceptions " + toString(), e); - } - } - - public void writeAsJson(ObjectMapper objectMapper, Writer writer) { - try { - JsonGenerator jg = objectMapper.writerWithDefaultPrettyPrinter().getFactory().createGenerator(writer); - jg.writeObject(this); - } catch (IOException e) { - throw new IllegalStateException("Cannot write system exceptions " + toString(), e); - } - } - - public void writeAsJson(ObjectMapper objectMapper, HttpServletResponse resp) { - try { - resp.setContentType("application/json"); - resp.setStatus(500); - writeAsJson(objectMapper, resp.getWriter()); - } catch (IOException e) { - throw new IllegalStateException("Cannot write system exceptions " + toString(), e); - } - } - - /** recursive */ - protected void writeException(Throwable exception) { - SystemException systemException = new SystemException(exception); - exceptions.add(systemException); - Throwable cause = exception.getCause(); - if (cause != null) - writeException(cause); - } - - public List getExceptions() { - return exceptions; - } - - public void setExceptions(List exceptions) { - this.exceptions = exceptions; - } - - /** An exception in the chain. */ - public static class SystemException { - private String type; - private String message; - private List stackTrace; - - public SystemException() { - } - - public SystemException(Throwable exception) { - this.type = exception.getClass().getName(); - this.message = exception.getMessage(); - this.stackTrace = new ArrayList<>(); - StackTraceElement[] elems = exception.getStackTrace(); - for (int i = 0; i < elems.length; i++) - stackTrace.add("at " + elems[i].toString()); - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getStackTrace() { - return stackTrace; - } - - public void setStackTrace(List stackTrace) { - this.stackTrace = stackTrace; - } - - @Override - public String toString() { - return "System exception: " + type + ", " + message + ", " + stackTrace; - } - - } - - @Override - public String toString() { - return exceptions.toString(); - } - -// public static void main(String[] args) throws Exception { -// try { -// try { -// try { -// testDeeper(); -// } catch (Exception e) { -// throw new Exception("Less deep exception", e); -// } -// } catch (Exception e) { -// throw new RuntimeException("Top exception", e); -// } -// } catch (Exception e) { -// CmsExceptionsChain vjeSystemErrors = new CmsExceptionsChain(e); -// ObjectMapper objectMapper = new ObjectMapper(); -// System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(vjeSystemErrors)); -// System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(e)); -// e.printStackTrace(); -// } -// } -// -// static void testDeeper() throws Exception { -// throw new IllegalStateException("Deep exception"); -// } - -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLoginServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLoginServlet.java deleted file mode 100644 index 29a3137bb..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLoginServlet.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.IOException; -import java.util.Locale; -import java.util.Set; - -import javax.security.auth.Subject; -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.NameCallback; -import javax.security.auth.callback.PasswordCallback; -import javax.security.auth.callback.UnsupportedCallbackException; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.argeo.api.cms.CmsAuth; -import org.argeo.api.cms.CmsSessionId; -import org.argeo.cms.auth.RemoteAuthCallback; -import org.argeo.cms.auth.RemoteAuthCallbackHandler; -import org.argeo.cms.servlet.ServletHttpRequest; -import org.argeo.cms.servlet.ServletHttpResponse; -import org.osgi.service.useradmin.Authorization; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** Externally authenticate an http session. */ -public class CmsLoginServlet extends HttpServlet { - public final static String PARAM_USERNAME = "username"; - public final static String PARAM_PASSWORD = "password"; - - private static final long serialVersionUID = 2478080654328751539L; - private ObjectMapper objectMapper = new ObjectMapper(); - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - doPost(request, response); - } - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - LoginContext lc = null; - String username = req.getParameter(PARAM_USERNAME); - String password = req.getParameter(PARAM_PASSWORD); - ServletHttpRequest request = new ServletHttpRequest(req); - ServletHttpResponse response = new ServletHttpResponse(resp); - try { - lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, new RemoteAuthCallbackHandler(request, response) { - public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { - for (Callback callback : callbacks) { - if (callback instanceof NameCallback && username != null) - ((NameCallback) callback).setName(username); - else if (callback instanceof PasswordCallback && password != null) - ((PasswordCallback) callback).setPassword(password.toCharArray()); - else if (callback instanceof RemoteAuthCallback) { - ((RemoteAuthCallback) callback).setRequest(request); - ((RemoteAuthCallback) callback).setResponse(response); - } - } - } - }); - lc.login(); - - Subject subject = lc.getSubject(); - CmsSessionId cmsSessionId = extractFrom(subject.getPrivateCredentials(CmsSessionId.class)); - if (cmsSessionId == null) { - resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - return; - } - Authorization authorization = extractFrom(subject.getPrivateCredentials(Authorization.class)); - Locale locale = extractFrom(subject.getPublicCredentials(Locale.class)); - - CmsSessionDescriptor cmsSessionDescriptor = new CmsSessionDescriptor(authorization.getName(), - cmsSessionId.getUuid().toString(), authorization.getRoles(), authorization.toString(), - locale != null ? locale.toString() : null); - - resp.setContentType("application/json"); - JsonGenerator jg = objectMapper.getFactory().createGenerator(resp.getWriter()); - jg.writeObject(cmsSessionDescriptor); - - String redirectTo = redirectTo(req); - if (redirectTo != null) - resp.sendRedirect(redirectTo); - } catch (LoginException e) { - resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - return; - } - } - - protected T extractFrom(Set creds) { - if (creds.size() > 0) - return creds.iterator().next(); - else - return null; - } - - /** - * To be overridden in order to return a richer {@link CmsSessionDescriptor} to - * be serialized. - */ - protected CmsSessionDescriptor enrichJson(CmsSessionDescriptor cmsSessionDescriptor) { - return cmsSessionDescriptor; - } - - protected String redirectTo(HttpServletRequest request) { - return null; - } -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLogoutServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLogoutServlet.java deleted file mode 100644 index 0628eae36..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsLogoutServlet.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.IOException; -import java.util.Set; - -import javax.security.auth.Subject; -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.UnsupportedCallbackException; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.argeo.api.cms.CmsAuth; -import org.argeo.api.cms.CmsSessionId; -import org.argeo.cms.auth.CurrentUser; -import org.argeo.cms.auth.RemoteAuthCallback; -import org.argeo.cms.auth.RemoteAuthCallbackHandler; -import org.argeo.cms.servlet.ServletHttpRequest; -import org.argeo.cms.servlet.ServletHttpResponse; - -/** Externally authenticate an http session. */ -public class CmsLogoutServlet extends HttpServlet { - private static final long serialVersionUID = 2478080654328751539L; - - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - doPost(request, response); - } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - ServletHttpRequest httpRequest = new ServletHttpRequest(request); - ServletHttpResponse httpResponse = new ServletHttpResponse(response); - LoginContext lc = null; - try { - lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, - new RemoteAuthCallbackHandler(httpRequest, httpResponse) { - public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { - for (Callback callback : callbacks) { - if (callback instanceof RemoteAuthCallback) { - ((RemoteAuthCallback) callback).setRequest(httpRequest); - ((RemoteAuthCallback) callback).setResponse(httpResponse); - } - } - } - }); - lc.login(); - - Subject subject = lc.getSubject(); - CmsSessionId cmsSessionId = extractFrom(subject.getPrivateCredentials(CmsSessionId.class)); - if (cmsSessionId != null) {// logged in - CurrentUser.logoutCmsSession(subject); - } - - } catch (LoginException e) { - // ignore - } - - String redirectTo = redirectTo(request); - if (redirectTo != null) - response.sendRedirect(redirectTo); - } - - protected T extractFrom(Set creds) { - if (creds.size() > 0) - return creds.iterator().next(); - else - return null; - } - - protected String redirectTo(HttpServletRequest request) { - return null; - } -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsPrivateServletContext.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsPrivateServletContext.java deleted file mode 100644 index cec04d230..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsPrivateServletContext.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.IOException; -import java.security.AccessControlContext; -import java.security.PrivilegedAction; -import java.util.Map; - -import javax.security.auth.Subject; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.argeo.api.cms.CmsAuth; -import org.argeo.cms.auth.RemoteAuthCallbackHandler; -import org.argeo.cms.auth.RemoteAuthUtils; -import org.argeo.cms.servlet.ServletHttpRequest; -import org.argeo.cms.servlet.ServletHttpResponse; -import org.osgi.service.http.context.ServletContextHelper; - -/** Manages security access to servlets. */ -public class CmsPrivateServletContext extends ServletContextHelper { - public final static String LOGIN_PAGE = "argeo.cms.integration.loginPage"; - public final static String LOGIN_SERVLET = "argeo.cms.integration.loginServlet"; - private String loginPage; - private String loginServlet; - - public void init(Map properties) { - loginPage = properties.get(LOGIN_PAGE); - loginServlet = properties.get(LOGIN_SERVLET); - } - - /** - * Add the {@link AccessControlContext} as a request attribute, or redirect to - * the login page. - */ - @Override - public boolean handleSecurity(final HttpServletRequest req, HttpServletResponse resp) throws IOException { - LoginContext lc = null; - ServletHttpRequest request = new ServletHttpRequest(req); - ServletHttpResponse response = new ServletHttpResponse(resp); - - String pathInfo = req.getPathInfo(); - String servletPath = req.getServletPath(); - if ((pathInfo != null && (servletPath + pathInfo).equals(loginPage)) || servletPath.contentEquals(loginServlet)) - return true; - try { - lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, new RemoteAuthCallbackHandler(request, response)); - lc.login(); - } catch (LoginException e) { - lc = processUnauthorized(req, resp); - if (lc == null) - return false; - } - Subject.doAs(lc.getSubject(), new PrivilegedAction() { - - @Override - public Void run() { - // TODO also set login context in order to log out ? - RemoteAuthUtils.configureRequestSecurity(request); - return null; - } - - }); - - return true; - } - - @Override - public void finishSecurity(HttpServletRequest req, HttpServletResponse resp) { - RemoteAuthUtils.clearRequestSecurity(new ServletHttpRequest(req)); - } - - protected LoginContext processUnauthorized(HttpServletRequest request, HttpServletResponse response) { - try { - response.sendRedirect(loginPage); - } catch (IOException e) { - throw new RuntimeException("Cannot redirect to login page", e); - } - return null; - } -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsSessionDescriptor.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsSessionDescriptor.java deleted file mode 100644 index 30de616a2..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsSessionDescriptor.java +++ /dev/null @@ -1,96 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.Collections; -import java.util.Set; -import java.util.TreeSet; - -import org.argeo.api.cms.CmsSession; -import org.osgi.service.useradmin.Authorization; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -/** A serializable descriptor of an internal {@link CmsSession}. */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class CmsSessionDescriptor implements Serializable, Authorization { - private static final long serialVersionUID = 8592162323372641462L; - - private String name; - private String cmsSessionId; - private String displayName; - private String locale; - private Set roles; - - public CmsSessionDescriptor() { - } - - public CmsSessionDescriptor(String name, String cmsSessionId, String[] roles, String displayName, String locale) { - this.name = name; - this.displayName = displayName; - this.cmsSessionId = cmsSessionId; - this.locale = locale; - this.roles = Collections.unmodifiableSortedSet(new TreeSet<>(Arrays.asList(roles))); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public String getCmsSessionId() { - return cmsSessionId; - } - - public void setCmsSessionId(String cmsSessionId) { - this.cmsSessionId = cmsSessionId; - } - - public Boolean isAnonymous() { - return name == null; - } - - public String getLocale() { - return locale; - } - - public void setLocale(String locale) { - this.locale = locale; - } - - @Override - public boolean hasRole(String name) { - return roles.contains(name); - } - - @Override - public String[] getRoles() { - return roles.toArray(new String[roles.size()]); - } - - public void setRoles(String[] roles) { - this.roles = Collections.unmodifiableSortedSet(new TreeSet<>(Arrays.asList(roles))); - } - - @Override - public int hashCode() { - return cmsSessionId != null ? cmsSessionId.hashCode() : super.hashCode(); - } - - @Override - public String toString() { - return displayName != null ? displayName : name != null ? name : super.toString(); - } - -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsTokenServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsTokenServlet.java deleted file mode 100644 index 983202ad2..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/CmsTokenServlet.java +++ /dev/null @@ -1,117 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.IOException; -import java.time.ZonedDateTime; -import java.util.Set; -import java.util.UUID; - -import javax.security.auth.Subject; -import javax.security.auth.callback.Callback; -import javax.security.auth.callback.UnsupportedCallbackException; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.argeo.api.cms.CmsAuth; -import org.argeo.cms.CmsUserManager; -import org.argeo.cms.auth.RemoteAuthCallback; -import org.argeo.cms.auth.RemoteAuthCallbackHandler; -import org.argeo.cms.servlet.ServletHttpRequest; -import org.argeo.cms.servlet.ServletHttpResponse; -import org.argeo.util.naming.NamingUtils; -import org.osgi.service.useradmin.Authorization; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** Provides access to tokens. */ -public class CmsTokenServlet extends HttpServlet { - private static final long serialVersionUID = 302918711430864140L; - - public final static String PARAM_EXPIRY_DATE = "expiryDate"; - public final static String PARAM_TOKEN = "token"; - - private final static int DEFAULT_HOURS = 24; - - private CmsUserManager userManager; - private ObjectMapper objectMapper = new ObjectMapper(); - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - ServletHttpRequest request = new ServletHttpRequest(req); - ServletHttpResponse response = new ServletHttpResponse(resp); - LoginContext lc = null; - try { - lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, new RemoteAuthCallbackHandler(request, response) { - public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { - for (Callback callback : callbacks) { - if (callback instanceof RemoteAuthCallback) { - ((RemoteAuthCallback) callback).setRequest(request); - ((RemoteAuthCallback) callback).setResponse(response); - } - } - } - }); - lc.login(); - } catch (LoginException e) { - // ignore - } - - try { - Subject subject = lc.getSubject(); - Authorization authorization = extractFrom(subject.getPrivateCredentials(Authorization.class)); - String token = UUID.randomUUID().toString(); - String expiryDateStr = req.getParameter(PARAM_EXPIRY_DATE); - ZonedDateTime expiryDate; - if (expiryDateStr != null) { - expiryDate = NamingUtils.ldapDateToZonedDateTime(expiryDateStr); - } else { - expiryDate = ZonedDateTime.now().plusHours(DEFAULT_HOURS); - expiryDateStr = NamingUtils.instantToLdapDate(expiryDate); - } - userManager.addAuthToken(authorization.getName(), token, expiryDate); - - TokenDescriptor tokenDescriptor = new TokenDescriptor(); - tokenDescriptor.setUsername(authorization.getName()); - tokenDescriptor.setToken(token); - tokenDescriptor.setExpiryDate(expiryDateStr); -// tokenDescriptor.setRoles(Collections.unmodifiableSortedSet(new TreeSet<>(Arrays.asList(roles)))); - - resp.setContentType("application/json"); - JsonGenerator jg = objectMapper.getFactory().createGenerator(resp.getWriter()); - jg.writeObject(tokenDescriptor); - } catch (Exception e) { - new CmsExceptionsChain(e).writeAsJson(objectMapper, resp); - } - } - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - // temporarily wrap POST for ease of testing - doPost(req, resp); - } - - @Override - protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - try { - String token = req.getParameter(PARAM_TOKEN); - userManager.expireAuthToken(token); - } catch (Exception e) { - new CmsExceptionsChain(e).writeAsJson(objectMapper, resp); - } - } - - protected T extractFrom(Set creds) { - if (creds.size() > 0) - return creds.iterator().next(); - else - return null; - } - - public void setUserManager(CmsUserManager userManager) { - this.userManager = userManager; - } -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrReadServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrReadServlet.java deleted file mode 100644 index 0553d7f59..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrReadServlet.java +++ /dev/null @@ -1,318 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.security.AccessControlContext; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import javax.jcr.Node; -import javax.jcr.NodeIterator; -import javax.jcr.Property; -import javax.jcr.PropertyIterator; -import javax.jcr.PropertyType; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.Value; -import javax.jcr.nodetype.NodeType; -import javax.security.auth.Subject; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.io.IOUtils; -import org.apache.jackrabbit.api.JackrabbitNode; -import org.apache.jackrabbit.api.JackrabbitValue; -import org.argeo.api.cms.CmsLog; -import org.argeo.jcr.JcrUtils; -import org.osgi.service.http.context.ServletContextHelper; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** Access a JCR repository via web services. */ -public class JcrReadServlet extends HttpServlet { - private static final long serialVersionUID = 6536175260540484539L; - private final static CmsLog log = CmsLog.getLog(JcrReadServlet.class); - - protected final static String ACCEPT_HTTP_HEADER = "Accept"; - protected final static String CONTENT_DISPOSITION_HTTP_HEADER = "Content-Disposition"; - - protected final static String OCTET_STREAM_CONTENT_TYPE = "application/octet-stream"; - protected final static String XML_CONTENT_TYPE = "application/xml"; - protected final static String JSON_CONTENT_TYPE = "application/json"; - - private final static String PARAM_VERBOSE = "verbose"; - private final static String PARAM_DEPTH = "depth"; - - protected final static String JCR_NODES = "jcr:nodes"; - // cf. javax.jcr.Property - protected final static String JCR_PATH = "path"; - protected final static String JCR_NAME = "name"; - - protected final static String _JCR = "_jcr"; - protected final static String JCR_PREFIX = "jcr:"; - protected final static String REP_PREFIX = "rep:"; - - private Repository repository; - private Integer maxDepth = 8; - - private ObjectMapper objectMapper = new ObjectMapper(); - - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - if (log.isTraceEnabled()) - log.trace("Data service: " + req.getPathInfo()); - - String dataWorkspace = getWorkspace(req); - String jcrPath = getJcrPath(req); - - boolean verbose = req.getParameter(PARAM_VERBOSE) != null && !req.getParameter(PARAM_VERBOSE).equals("false"); - int depth = 1; - if (req.getParameter(PARAM_DEPTH) != null) { - depth = Integer.parseInt(req.getParameter(PARAM_DEPTH)); - if (depth > maxDepth) - throw new RuntimeException("Depth " + depth + " is higher than maximum " + maxDepth); - } - - Session session = null; - try { - // authentication - session = openJcrSession(req, resp, getRepository(), dataWorkspace); - if (!session.itemExists(jcrPath)) - throw new RuntimeException("JCR node " + jcrPath + " does not exist"); - Node node = session.getNode(jcrPath); - - List acceptHeader = readAcceptHeader(req); - if (!acceptHeader.isEmpty() && node.isNodeType(NodeType.NT_FILE)) { - resp.setContentType(OCTET_STREAM_CONTENT_TYPE); - resp.addHeader(CONTENT_DISPOSITION_HTTP_HEADER, "attachment; filename='" + node.getName() + "'"); - IOUtils.copy(JcrUtils.getFileAsStream(node), resp.getOutputStream()); - resp.flushBuffer(); - } else { - if (!acceptHeader.isEmpty() && acceptHeader.get(0).equals(XML_CONTENT_TYPE)) { - // TODO Use req.startAsync(); ? - resp.setContentType(XML_CONTENT_TYPE); - session.exportSystemView(node.getPath(), resp.getOutputStream(), false, depth <= 1); - return; - } - if (!acceptHeader.isEmpty() && !acceptHeader.contains(JSON_CONTENT_TYPE)) { - if (log.isTraceEnabled()) - log.warn("Content type " + acceptHeader + " in Accept header is not supported. Supported: " - + JSON_CONTENT_TYPE + " (default), " + XML_CONTENT_TYPE); - } - resp.setContentType(JSON_CONTENT_TYPE); - JsonGenerator jsonGenerator = getObjectMapper().getFactory().createGenerator(resp.getWriter()); - jsonGenerator.writeStartObject(); - writeNodeChildren(node, jsonGenerator, depth, verbose); - writeNodeProperties(node, jsonGenerator, verbose); - jsonGenerator.writeEndObject(); - jsonGenerator.flush(); - } - } catch (Exception e) { - new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - protected Session openJcrSession(HttpServletRequest req, HttpServletResponse resp, Repository repository, - String workspace) throws RepositoryException { - AccessControlContext acc = (AccessControlContext) req.getAttribute(ServletContextHelper.REMOTE_USER); - Subject subject = Subject.getSubject(acc); - try { - return Subject.doAs(subject, new PrivilegedExceptionAction() { - - @Override - public Session run() throws RepositoryException { - return repository.login(workspace); - } - - }); - } catch (PrivilegedActionException e) { - if (e.getException() instanceof RepositoryException) - throw (RepositoryException) e.getException(); - else - throw new RuntimeException(e.getException()); - } -// return workspace != null ? repository.login(workspace) : repository.login(); - } - - protected String getWorkspace(HttpServletRequest req) { - String path = req.getPathInfo(); - try { - path = URLDecoder.decode(path, StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException e) { - throw new IllegalArgumentException(e); - } - String[] pathTokens = path.split("/"); - return pathTokens[1]; - } - - protected String getJcrPath(HttpServletRequest req) { - String path = req.getPathInfo(); - try { - path = URLDecoder.decode(path, StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException e) { - throw new IllegalArgumentException(e); - } - String[] pathTokens = path.split("/"); - String domain = pathTokens[1]; - String jcrPath = path.substring(domain.length() + 1); - return jcrPath; - } - - protected List readAcceptHeader(HttpServletRequest req) { - List lst = new ArrayList<>(); - String acceptHeader = req.getHeader(ACCEPT_HTTP_HEADER); - if (acceptHeader == null) - return lst; -// Enumeration acceptHeader = req.getHeaders(ACCEPT_HTTP_HEADER); -// while (acceptHeader.hasMoreElements()) { - String[] arr = acceptHeader.split("\\."); - for (int i = 0; i < arr.length; i++) { - String str = arr[i].trim(); - if (!"".equals(str)) - lst.add(str); - } -// } - return lst; - } - - protected void writeNodeProperties(Node node, JsonGenerator jsonGenerator, boolean verbose) - throws RepositoryException, IOException { - String jcrPath = node.getPath(); - Map> namespaces = new TreeMap<>(); - - PropertyIterator pit = node.getProperties(); - properties: while (pit.hasNext()) { - Property property = pit.nextProperty(); - - final String propertyName = property.getName(); - int columnIndex = propertyName.indexOf(':'); - if (columnIndex > 0) { - // mark prefix with a '_' before the name of the object, according to JSON - // conventions to indicate a special value - String prefix = "_" + propertyName.substring(0, columnIndex); - String unqualifiedName = propertyName.substring(columnIndex + 1); - if (!namespaces.containsKey(prefix)) - namespaces.put(prefix, new LinkedHashMap()); - Map map = namespaces.get(prefix); - assert !map.containsKey(unqualifiedName); - map.put(unqualifiedName, property); - continue properties; - } - - if (property.getType() == PropertyType.BINARY) { - if (!(node instanceof JackrabbitNode)) { - continue properties;// skip - } - } - - writeProperty(propertyName, property, jsonGenerator); - } - - for (String prefix : namespaces.keySet()) { - Map map = namespaces.get(prefix); - jsonGenerator.writeFieldName(prefix); - jsonGenerator.writeStartObject(); - if (_JCR.equals(prefix)) { - jsonGenerator.writeStringField(JCR_NAME, node.getName()); - jsonGenerator.writeStringField(JCR_PATH, jcrPath); - } - properties: for (String unqualifiedName : map.keySet()) { - Property property = map.get(unqualifiedName); - if (property.getType() == PropertyType.BINARY) { - if (!(node instanceof JackrabbitNode)) { - continue properties;// skip - } - } - writeProperty(unqualifiedName, property, jsonGenerator); - } - jsonGenerator.writeEndObject(); - } - } - - protected void writeProperty(String fieldName, Property property, JsonGenerator jsonGenerator) - throws RepositoryException, IOException { - if (!property.isMultiple()) { - jsonGenerator.writeFieldName(fieldName); - writePropertyValue(property.getType(), property.getValue(), jsonGenerator); - } else { - jsonGenerator.writeFieldName(fieldName); - jsonGenerator.writeStartArray(); - Value[] values = property.getValues(); - for (Value value : values) { - writePropertyValue(property.getType(), value, jsonGenerator); - } - jsonGenerator.writeEndArray(); - } - } - - protected void writePropertyValue(int type, Value value, JsonGenerator jsonGenerator) - throws RepositoryException, IOException { - if (type == PropertyType.DOUBLE) - jsonGenerator.writeNumber(value.getDouble()); - else if (type == PropertyType.LONG) - jsonGenerator.writeNumber(value.getLong()); - else if (type == PropertyType.BINARY) { - if (value instanceof JackrabbitValue) { - String contentIdentity = ((JackrabbitValue) value).getContentIdentity(); - jsonGenerator.writeString("SHA256:" + contentIdentity); - } else { - // TODO write Base64 ? - jsonGenerator.writeNull(); - } - } else - jsonGenerator.writeString(value.getString()); - } - - protected void writeNodeChildren(Node node, JsonGenerator jsonGenerator, int depth, boolean verbose) - throws RepositoryException, IOException { - if (!node.hasNodes()) - return; - if (depth <= 0) - return; - NodeIterator nit; - - nit = node.getNodes(); - children: while (nit.hasNext()) { - Node child = nit.nextNode(); - if (!verbose && child.getName().startsWith(REP_PREFIX)) { - continue children;// skip Jackrabbit auth metadata - } - - jsonGenerator.writeFieldName(child.getName()); - jsonGenerator.writeStartObject(); - writeNodeChildren(child, jsonGenerator, depth - 1, verbose); - writeNodeProperties(child, jsonGenerator, verbose); - jsonGenerator.writeEndObject(); - } - } - - public void setRepository(Repository repository) { - this.repository = repository; - } - - public void setMaxDepth(Integer maxDepth) { - this.maxDepth = maxDepth; - } - - protected Repository getRepository() { - return repository; - } - - protected ObjectMapper getObjectMapper() { - return objectMapper; - } - -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java deleted file mode 100644 index 8a3864bbd..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.IOException; - -import javax.jcr.ImportUUIDBehavior; -import javax.jcr.Node; -import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.argeo.api.cms.CmsLog; -import org.argeo.jcr.JcrUtils; - -/** Access a JCR repository via web services. */ -public class JcrWriteServlet extends JcrReadServlet { - private static final long serialVersionUID = 17272653843085492L; - private final static CmsLog log = CmsLog.getLog(JcrWriteServlet.class); - - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - if (log.isDebugEnabled()) - log.debug("Data service POST: " + req.getPathInfo()); - - String dataWorkspace = getWorkspace(req); - String jcrPath = getJcrPath(req); - - Session session = null; - try { - // authentication - session = openJcrSession(req, resp, getRepository(), dataWorkspace); - - if (req.getContentType() != null && req.getContentType().equals(XML_CONTENT_TYPE)) { -// resp.setContentType(XML_CONTENT_TYPE); - session.getWorkspace().importXML(jcrPath, req.getInputStream(), - ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING); - return; - } - - if (!session.itemExists(jcrPath)) { - String parentPath = FilenameUtils.getFullPathNoEndSeparator(jcrPath); - String fileName = FilenameUtils.getName(jcrPath); - Node folderNode = JcrUtils.mkfolders(session, parentPath); - byte[] bytes = IOUtils.toByteArray(req.getInputStream()); - JcrUtils.copyBytesAsFile(folderNode, fileName, bytes); - } else { - Node node = session.getNode(jcrPath); - if (!node.isNodeType(NodeType.NT_FILE)) - throw new IllegalArgumentException("Node " + jcrPath + " exists but is not a file"); - byte[] bytes = IOUtils.toByteArray(req.getInputStream()); - JcrUtils.copyBytesAsFile(node.getParent(), node.getName(), bytes); - } - session.save(); - } catch (Exception e) { - new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - @Override - protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - if (log.isDebugEnabled()) - log.debug("Data service DELETE: " + req.getPathInfo()); - - String dataWorkspace = getWorkspace(req); - String jcrPath = getJcrPath(req); - - Session session = null; - try { - // authentication - session = openJcrSession(req, resp, getRepository(), dataWorkspace); - if (!session.itemExists(jcrPath)) { - // ignore - return; - } else { - Node node = session.getNode(jcrPath); - node.remove(); - } - session.save(); - } catch (Exception e) { - new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp); - } finally { - JcrUtils.logoutQuietly(session); - } - } - -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/TokenDescriptor.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/TokenDescriptor.java deleted file mode 100644 index 1541b4f29..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/TokenDescriptor.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; - -/** A serializable descriptor of a token. */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class TokenDescriptor implements Serializable { - private static final long serialVersionUID = -6607393871416803324L; - - private String token; - private String username; - private String expiryDate; -// private Set roles; - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - -// public Set getRoles() { -// return roles; -// } -// -// public void setRoles(Set roles) { -// this.roles = roles; -// } - - public String getExpiryDate() { - return expiryDate; - } - - public void setExpiryDate(String expiryDate) { - this.expiryDate = expiryDate; - } - -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/XslTemplate.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/XslTemplate.java deleted file mode 100644 index c9802a2f5..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/XslTemplate.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.argeo.cms.integration; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import javax.jcr.Node; -import javax.jcr.RepositoryException; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.TransformerFactoryConfigurationError; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - -public class XslTemplate { - private Transformer transformer; - - public XslTemplate(InputStream in, String systemId) { - this(loadTransformer(in, systemId)); - } - - public XslTemplate(Transformer transformer) { - this.transformer = transformer; - } - - private static Transformer loadTransformer(InputStream in, String systemId) { - try { - TransformerFactory tFactory = TransformerFactory.newInstance(); - StreamSource stylesource = new StreamSource(in, systemId); - return tFactory.newTransformer(stylesource); - } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) { - throw new IllegalArgumentException("Cannot initialise stylesheet with systemId " + systemId, e); - } - } - - public synchronized void apply(Node node, OutputStream out) { - // TODO use a pool of Transformer instead of synchronized - try (ByteArrayOutputStream xml = new ByteArrayOutputStream()) { - node.getSession().exportDocumentView(node.getPath(), xml, true, false); - try (ByteArrayInputStream xmlIn = new ByteArrayInputStream(xml.toByteArray())) { - Source source = new StreamSource(xmlIn); - Result results = new StreamResult(out); - transformer.transform(source, results); - } - } catch (IOException | RepositoryException | TransformerException e) { - throw new RuntimeException("Cannot process XSL template on " + node, e); - } - } -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/package-info.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/package-info.java deleted file mode 100644 index 1405737ee..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/integration/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -/** Argeo CMS integration (JSON, web services). */ -package org.argeo.cms.integration; \ No newline at end of file diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/CmsWebSocketConfigurator.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/CmsWebSocketConfigurator.java deleted file mode 100644 index 747afa4c1..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/CmsWebSocketConfigurator.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.argeo.cms.websocket; - -/** Disabled until third party issues are solved.. Customises the initialisation of a new web socket. */ -public class CmsWebSocketConfigurator { -//extends Configurator { -// public final static String WEBSOCKET_SUBJECT = "org.argeo.cms.websocket.subject"; -// -// private final static CmsLog log = CmsLog.getLog(CmsWebSocketConfigurator.class); -// final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; -// -// @Override -// public boolean checkOrigin(String originHeaderValue) { -// return true; -// } -// -// @Override -// public T getEndpointInstance(Class endpointClass) throws InstantiationException { -// try { -// return endpointClass.getDeclaredConstructor().newInstance(); -// } catch (Exception e) { -// throw new IllegalArgumentException("Cannot get endpoint instance", e); -// } -// } -// -// @Override -// public List getNegotiatedExtensions(List installed, List requested) { -// return requested; -// } -// -// @Override -// public String getNegotiatedSubprotocol(List supported, List requested) { -// if ((requested == null) || (requested.size() == 0)) -// return ""; -// if ((supported == null) || (supported.isEmpty())) -// return ""; -// for (String possible : requested) { -// if (possible == null) -// continue; -// if (supported.contains(possible)) -// return possible; -// } -// return ""; -// } -// -// @Override -// public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { -// -// RemoteAuthSession httpSession = new ServletHttpSession((javax.servlet.http.HttpSession) request.getHttpSession()); -// if (log.isDebugEnabled() && httpSession != null) -// log.debug("Web socket HTTP session id: " + httpSession.getId()); -// -// if (httpSession == null) { -// rejectResponse(response, null); -// } -// try { -// LoginContext lc = new LoginContext(CmsAuth.LOGIN_CONTEXT_USER, -// new RemoteAuthCallbackHandler(httpSession)); -// lc.login(); -// if (log.isDebugEnabled()) -// log.debug("Web socket logged-in as " + lc.getSubject()); -// Subject.doAs(lc.getSubject(), new PrivilegedAction() { -// -// @Override -// public Void run() { -// sec.getUserProperties().put(ServletContextHelper.REMOTE_USER, AccessController.getContext()); -// return null; -// } -// -// }); -// } catch (Exception e) { -// rejectResponse(response, e); -// } -// } -// -// /** -// * Behaviour when the web socket could not be authenticated. Throws an -// * {@link IllegalStateException} by default. -// * -// * @param e can be null -// */ -// protected void rejectResponse(HandshakeResponse response, Exception e) { -// // violent implementation, as suggested in -// // https://stackoverflow.com/questions/21763829/jsr-356-how-to-abort-a-websocket-connection-during-the-handshake -//// throw new IllegalStateException("Web socket cannot be authenticated"); -// } -} diff --git a/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/package-info.java b/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/package-info.java deleted file mode 100644 index 2ab9a679e..000000000 --- a/cms/org.argeo.cms.integration/src/org/argeo/cms/websocket/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -/** Argeo CMS websocket integration. */ -package org.argeo.cms.websocket; \ No newline at end of file diff --git a/ext/org.argeo.ext.equinox.jetty/.classpath b/ext/org.argeo.ext.equinox.jetty/.classpath deleted file mode 100644 index eca7bdba8..000000000 --- a/ext/org.argeo.ext.equinox.jetty/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/ext/org.argeo.ext.equinox.jetty/.gitignore b/ext/org.argeo.ext.equinox.jetty/.gitignore deleted file mode 100644 index 09e3bc9b2..000000000 --- a/ext/org.argeo.ext.equinox.jetty/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin/ -/target/ diff --git a/ext/org.argeo.ext.equinox.jetty/.project b/ext/org.argeo.ext.equinox.jetty/.project deleted file mode 100644 index 0b9700dd6..000000000 --- a/ext/org.argeo.ext.equinox.jetty/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - org.argeo.ext.equinox.jetty - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/ext/org.argeo.ext.equinox.jetty/META-INF/.gitignore b/ext/org.argeo.ext.equinox.jetty/META-INF/.gitignore deleted file mode 100644 index 4854a41b9..000000000 --- a/ext/org.argeo.ext.equinox.jetty/META-INF/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/MANIFEST.MF diff --git a/ext/org.argeo.ext.equinox.jetty/bnd.bnd b/ext/org.argeo.ext.equinox.jetty/bnd.bnd deleted file mode 100644 index 0f21e73c9..000000000 --- a/ext/org.argeo.ext.equinox.jetty/bnd.bnd +++ /dev/null @@ -1,7 +0,0 @@ -Fragment-Host: org.eclipse.equinox.http.jetty - -Import-Package: org.eclipse.jetty.websocket.jsr356,\ -org.eclipse.jetty.websocket.api,\ -org.eclipse.jetty.websocket.common,\ -org.osgi.service.http,\ -* \ No newline at end of file diff --git a/ext/org.argeo.ext.equinox.jetty/build.properties b/ext/org.argeo.ext.equinox.jetty/build.properties deleted file mode 100644 index 34d2e4d2d..000000000 --- a/ext/org.argeo.ext.equinox.jetty/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - . diff --git a/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java b/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java deleted file mode 100644 index 46f0280bd..000000000 --- a/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/CmsJettyCustomizer.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.argeo.equinox.jetty; - -import java.util.Dictionary; - -import javax.servlet.ServletContext; -import javax.websocket.DeploymentException; - -import org.eclipse.equinox.http.jetty.JettyCustomizer; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.websocket.jsr356.server.ServerContainer; -import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; -import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer.Configurator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; - -/** Customises the Jetty HTTP server. */ -public class CmsJettyCustomizer extends JettyCustomizer { - private BundleContext bc = FrameworkUtil.getBundle(CmsJettyCustomizer.class).getBundleContext(); - - public final static String WEBSOCKET_ENABLED = "websocket.enabled"; - - @Override - public Object customizeContext(Object context, Dictionary settings) { - // WebSocket - Object webSocketEnabled = settings.get(WEBSOCKET_ENABLED); - if (webSocketEnabled != null && webSocketEnabled.toString().equals("true")) { - ServletContextHandler servletContextHandler = (ServletContextHandler) context; - WebSocketServerContainerInitializer.configure(servletContextHandler, new Configurator() { - - @Override - public void accept(ServletContext servletContext, ServerContainer serverContainer) - throws DeploymentException { - bc.registerService(javax.websocket.server.ServerContainer.class, serverContainer, null); - } - }); - } - return super.customizeContext(context, settings); - - } -} diff --git a/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/package-info.java b/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/package-info.java deleted file mode 100644 index 41c8ce9b0..000000000 --- a/ext/org.argeo.ext.equinox.jetty/src/org/argeo/equinox/jetty/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -/** Equinox Jetty extensions. */ -package org.argeo.equinox.jetty; \ No newline at end of file diff --git a/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java b/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java index 5641687f7..3bebfe637 100644 --- a/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java +++ b/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java @@ -300,6 +300,8 @@ public class A2Factory { continue entries; if (entry.getName().equals("META-INF/NOTICE")) continue entries; + if (entry.getName().equals("META-INF/NOTICE.txt")) + continue entries; if (entry.getName().equals("META-INF/LICENSE")) continue entries; Path target = targetBundleDir.resolve(entry.getName()); @@ -920,11 +922,12 @@ public class A2Factory { // factory.processSingleM2ArtifactDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache").resolve("org.apache.xml.resolver.bnd")); // factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache/apache-sshd")); // factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty")); -// factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty-websocket")); + factory.processCategory(descriptorsBase.resolve("org.argeo.tp.jetty")); +// factory.processCategory(descriptorsBase.resolve("org.argeo.tp.jetty.websocket")); // factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp")); // factory.processCategory(descriptorsBase.resolve("org.argeo.tp")); - factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache")); - factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats")); +// factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache")); +// factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats")); // factory.processCategory(descriptorsBase.resolve("org.argeo.tp.gis")); System.exit(0); diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/common.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/common.bnd deleted file mode 100644 index c26721c9f..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/common.bnd +++ /dev/null @@ -1,2 +0,0 @@ -Bundle-License: Apache-2.0 -SLC-Origin-M2: :10.0.8 diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.api.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.api.bnd deleted file mode 100644 index 3723f3555..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.api.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-api -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.api diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.client.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.client.bnd deleted file mode 100644 index 12795c3fc..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.client.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-client -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.client diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.common.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.common.bnd deleted file mode 100644 index d97b5e716..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.common.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-common -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.common diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.client.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.client.bnd deleted file mode 100644 index e6f4338e6..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.client.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-core-client -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.core.client diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.common.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.common.bnd deleted file mode 100644 index 9d8bbe97c..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.common.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-core-common -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.core.common diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.server.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.server.bnd deleted file mode 100644 index e6f4338e6..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.core.server.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-core-client -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.core.client diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.client.bnd.disabled b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.client.bnd.disabled deleted file mode 100644 index 29ee7193b..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.client.bnd.disabled +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jakarta-client -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.jakarta.client diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.common.bnd.disabled b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.common.bnd.disabled deleted file mode 100644 index b2d60afe7..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.common.bnd.disabled +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jakarta-common -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.jakarta.common diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.server.bnd.disabled b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.server.bnd.disabled deleted file mode 100644 index 999440a74..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.jakarta.websocket.server.bnd.disabled +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jakarta-server -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.jakarta.server diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.server.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.server.bnd deleted file mode 100644 index c51589947..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.server.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-jetty-server -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.server diff --git a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.servlet.bnd b/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.servlet.bnd deleted file mode 100644 index 3db77e27d..000000000 --- a/tp/org.argeo.tp.jetty.websocket/jetty-websocket/org.eclipse.jetty.websocket.servlet.bnd +++ /dev/null @@ -1,3 +0,0 @@ -SLC-Origin-M2: org.eclipse.jetty.websocket:websocket-servlet -SLC-Origin-ManifestNotModified: true -Bundle-SymbolicName: org.eclipse.jetty.websocket.servlet diff --git a/tp/org.argeo.tp.jetty.websocket/javax.websocket.bnd b/tp/org.argeo.tp.jetty/javax.websocket.bnd similarity index 100% rename from tp/org.argeo.tp.jetty.websocket/javax.websocket.bnd rename to tp/org.argeo.tp.jetty/javax.websocket.bnd diff --git a/tp/org.argeo.tp.jetty/jetty-websocket/merge.bnd b/tp/org.argeo.tp.jetty/jetty-websocket/merge.bnd new file mode 100644 index 000000000..309a9e7aa --- /dev/null +++ b/tp/org.argeo.tp.jetty/jetty-websocket/merge.bnd @@ -0,0 +1,22 @@ +Bundle-SymbolicName: org.eclipse.jetty.websocket +Bundle-License: Apache-2.0 +SLC-Origin-M2: :10.0.9 +SLC-Origin-M2-Merge: \ +org.eclipse.jetty.websocket:websocket-core-client, \ +org.eclipse.jetty.websocket:websocket-core-common, \ +org.eclipse.jetty.websocket:websocket-core-server, \ +org.eclipse.jetty.websocket:websocket-jetty-api, \ +org.eclipse.jetty.websocket:websocket-jetty-client, \ +org.eclipse.jetty.websocket:websocket-jetty-common, \ +org.eclipse.jetty.websocket:websocket-jetty-server,\ +org.eclipse.jetty.websocket:websocket-javax-client, \ +org.eclipse.jetty.websocket:websocket-javax-common, \ +org.eclipse.jetty.websocket:websocket-javax-server,\ +org.eclipse.jetty.websocket:websocket-servlet, \ + +Export-Package: org.eclipse.jetty.* + +Import-Package: \ +!java.*, \ +org.eclipse.jetty.webapp;resolution:="optional", \ +* \ No newline at end of file diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.client.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.client.bnd new file mode 100644 index 000000000..202f50a6b --- /dev/null +++ b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.client.bnd @@ -0,0 +1,2 @@ +SLC-Origin-M2: org.eclipse.jetty:jetty-alpn-client +SLC-Origin-ManifestNotModified: true diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.server.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.server.bnd new file mode 100644 index 000000000..47e4560f9 --- /dev/null +++ b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.alpn.server.bnd @@ -0,0 +1,2 @@ +SLC-Origin-M2: org.eclipse.jetty:jetty-alpn-server +SLC-Origin-ManifestNotModified: true diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd.retired b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd similarity index 100% rename from tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd.retired rename to tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.client.bnd diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.client.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.client.bnd new file mode 100644 index 000000000..b57b83fb8 --- /dev/null +++ b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.client.bnd @@ -0,0 +1,2 @@ +SLC-Origin-M2: org.eclipse.jetty.http2:http2-client +SLC-Origin-ManifestNotModified: true diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.common.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.common.bnd new file mode 100644 index 000000000..c1d717474 --- /dev/null +++ b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.common.bnd @@ -0,0 +1,2 @@ +SLC-Origin-M2: org.eclipse.jetty.http2:http2-common +SLC-Origin-ManifestNotModified: true diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.hpack.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.hpack.bnd new file mode 100644 index 000000000..766cdd002 --- /dev/null +++ b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.hpack.bnd @@ -0,0 +1,2 @@ +SLC-Origin-M2: org.eclipse.jetty.http2:http2-hpack +SLC-Origin-ManifestNotModified: true diff --git a/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.server.bnd b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.server.bnd new file mode 100644 index 000000000..2f1a080e5 --- /dev/null +++ b/tp/org.argeo.tp.jetty/jetty/org.eclipse.jetty.http2.server.bnd @@ -0,0 +1,2 @@ +SLC-Origin-M2: org.eclipse.jetty.http2:http2-server +SLC-Origin-ManifestNotModified: true -- 2.30.2