From 42309bdd82b7b82ea9fd0df21084c3e717b7a6dd Mon Sep 17 00:00:00 2001 From: nscuro Date: Fri, 17 May 2024 22:36:45 +0200 Subject: [PATCH 1/2] Migrate to Jakarta EE 10, Jersey 3.x, and Jetty 12 Migrates `javax` namespaces to their `jakarta` counterparts. Performs the following notable version bumps: * Jakarta Servlet API: `4.0.1` -> `6.0.0` (latest) * JAXB: `2.3.6` -> `4.0.5` (latest) * Jersey: `2.41` -> `3.1.6` (latest) * Jetty: `10.0.18` -> `12.0.9` (latest) The following changes were necessary due to compatibility issues with Jakarta EE 10: * `io.jsonwebtoken:jjwt`: `0.9.1` -> `0.12.5` * Signing and verifying of JWTs with Alpine's `SecretKey` no longer worked. I'm not sure why it worked before, but now the library complained about AES keys not being suitable for HMAC signing. I modified the `JsonWebToken` class to use Alpine's public/private key pair instead, which works. It changes the signature algorithm to `RS512`. I believe this change makes sense anyway. * The default implementation of `jakarta.json` is Eclipse Parsson. Replaced `org.glassfish:javax-json` with it. * The default implementation of `jakarta.mail-api` is Eclipse Angus. Added it. Signed-off-by: nscuro --- alpine-executable-war/pom.xml | 10 +-- .../alpine/embedded/EmbeddedJettyServer.java | 19 ++--- .../src/main/java/alpine/model/About.java | 2 - .../src/main/java/alpine/model/ApiKey.java | 6 +- .../java/alpine/model/ConfigProperty.java | 8 +- .../java/alpine/model/EventServiceLog.java | 2 +- .../java/alpine/model/InstalledUpgrades.java | 6 +- .../src/main/java/alpine/model/LdapUser.java | 6 +- .../main/java/alpine/model/ManagedUser.java | 8 +- .../java/alpine/model/MappedLdapGroup.java | 8 +- .../java/alpine/model/MappedOidcGroup.java | 2 +- .../src/main/java/alpine/model/OidcGroup.java | 8 +- .../src/main/java/alpine/model/OidcUser.java | 6 +- .../main/java/alpine/model/Permission.java | 6 +- .../main/java/alpine/model/SchemaVersion.java | 6 +- .../src/main/java/alpine/model/Team.java | 8 +- alpine-server/pom.xml | 42 +++++----- .../java/alpine/server/AlpineServlet.java | 4 +- .../java/alpine/server/auth/AlpineCookie.java | 2 +- .../auth/AuthenticationNotRequired.java | 2 +- .../server/auth/AuthenticationService.java | 2 +- .../java/alpine/server/auth/JsonWebToken.java | 50 +++++------- .../server/auth/JwtAuthenticationService.java | 8 +- .../auth/OidcAuthenticationService.java | 2 +- .../auth/OidcConfigurationResolver.java | 2 +- .../java/alpine/server/filters/ApiFilter.java | 12 +-- .../server/filters/ApiKeyUsageTracker.java | 2 +- .../server/filters/AuthenticationFeature.java | 8 +- .../server/filters/AuthenticationFilter.java | 12 +-- .../server/filters/AuthorizationFeature.java | 8 +- .../server/filters/AuthorizationFilter.java | 14 ++-- .../server/filters/BlacklistUrlFilter.java | 16 ++-- .../server/filters/ClickjackingFilter.java | 14 ++-- .../filters/ContentSecurityPolicyFilter.java | 14 ++-- .../server/filters/FqdnForwardFilter.java | 16 ++-- .../server/filters/GZipInterceptor.java | 18 ++--- .../alpine/server/filters/HeaderFeature.java | 8 +- .../alpine/server/filters/HeaderFilter.java | 12 +-- .../alpine/server/filters/HpkpFilter.java | 16 ++-- .../alpine/server/filters/HstsFilter.java | 16 ++-- .../server/filters/PrettyPrintFilter.java | 18 ++--- .../server/filters/RequestIdFilter.java | 12 +-- .../filters/RequestRateThrottleFilter.java | 18 ++--- .../server/filters/WhitelistUrlFilter.java | 16 ++-- .../java/alpine/server/mail/SendMail.java | 38 ++++----- .../server/metrics/MetricsInitializer.java | 4 +- .../persistence/PersistenceInitializer.java | 4 +- .../PersistenceManagerFactory.java | 4 +- .../server/resources/AlpineResource.java | 20 ++--- .../resources/GlobalExceptionHandler.java | 6 +- .../server/resources/VersionResource.java | 12 +-- .../servlets/FileSystemResourceServlet.java | 8 +- .../alpine/server/servlets/HealthServlet.java | 12 +-- .../server/servlets/MetricsServlet.java | 10 +-- .../servlets/StaticResourceServlet.java | 8 +- .../java/alpine/server/util/HttpUtil.java | 4 +- .../server/filters/RequestIdFilterTest.java | 6 +- .../server/servlets/HealthServletTest.java | 4 +- .../server/servlets/MetricsServletTest.java | 6 +- .../java/alpine/server/util/HttpUtilTest.java | 4 +- .../event/EventSubsystemInitializer.java | 4 +- .../persistence/DefaultObjectCreator.java | 4 +- .../example/resources/v1/LoginResource.java | 12 +-- example/src/main/webapp/WEB-INF/web.xml | 6 +- pom.xml | 80 +++++++++---------- 65 files changed, 356 insertions(+), 375 deletions(-) diff --git a/alpine-executable-war/pom.xml b/alpine-executable-war/pom.xml index ad71f436..bc43b05d 100644 --- a/alpine-executable-war/pom.xml +++ b/alpine-executable-war/pom.xml @@ -32,15 +32,13 @@ 1.0.1 - 4.0.2 - 10.0.18 + 12.0.9 jakarta.servlet jakarta.servlet-api - ${lib.servlet-api.version} provided @@ -49,8 +47,8 @@ ${lib.jetty.version} - org.eclipse.jetty - jetty-webapp + org.eclipse.jetty.ee10 + jetty-ee10-webapp ${lib.jetty.version} @@ -61,12 +59,10 @@ org.slf4j slf4j-api - ${lib.slf4j.version} ch.qos.logback logback-classic - ${lib.logback.version} runtime diff --git a/alpine-executable-war/src/main/java/alpine/embedded/EmbeddedJettyServer.java b/alpine-executable-war/src/main/java/alpine/embedded/EmbeddedJettyServer.java index e10868a4..b22ecdf9 100644 --- a/alpine-executable-war/src/main/java/alpine/embedded/EmbeddedJettyServer.java +++ b/alpine-executable-war/src/main/java/alpine/embedded/EmbeddedJettyServer.java @@ -18,20 +18,19 @@ */ package alpine.embedded; +import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; +import org.eclipse.jetty.ee10.webapp.WebAppContext; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.servlet.ErrorPageErrorHandler; -import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.util.Callback; import org.slf4j.Logger; import org.slf4j.bridge.SLF4JBridgeHandler; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.security.ProtectionDomain; @@ -86,9 +85,9 @@ public static void main(final String[] args) throws Exception { context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/[^/]*taglibs.*\\.jar$"); // Prevent loading of logging classes - context.getSystemClassMatcher().add("org.apache.log4j."); - context.getSystemClassMatcher().add("org.slf4j."); - context.getSystemClassMatcher().add("org.apache.commons.logging."); + context.getProtectedClassMatcher().add("org.apache.log4j."); + context.getProtectedClassMatcher().add("org.slf4j."); + context.getProtectedClassMatcher().add("org.apache.commons.logging."); final ProtectionDomain protectionDomain = EmbeddedJettyServer.class.getProtectionDomain(); final URL location = protectionDomain.getCodeSource().getLocation(); @@ -118,8 +117,10 @@ private static void disableServerVersionHeader(Connector connector) { */ private static class ErrorHandler extends ErrorPageErrorHandler { @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException { + public boolean handle(final Request request, final Response response, final Callback callback) throws Exception { response.setStatus(response.getStatus()); + callback.succeeded(); + return true; } } diff --git a/alpine-model/src/main/java/alpine/model/About.java b/alpine-model/src/main/java/alpine/model/About.java index b313b866..94c63d03 100644 --- a/alpine-model/src/main/java/alpine/model/About.java +++ b/alpine-model/src/main/java/alpine/model/About.java @@ -24,7 +24,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; -import javax.inject.Singleton; import java.io.Serializable; import java.util.HashMap; import java.util.Map; @@ -38,7 +37,6 @@ * @author Steve Springett * @since 1.0.0 */ -@Singleton public class About implements Serializable { private static final long serialVersionUID = -7573425245706188307L; diff --git a/alpine-model/src/main/java/alpine/model/ApiKey.java b/alpine-model/src/main/java/alpine/model/ApiKey.java index 4cf1d189..fe9e3e3a 100644 --- a/alpine-model/src/main/java/alpine/model/ApiKey.java +++ b/alpine-model/src/main/java/alpine/model/ApiKey.java @@ -22,6 +22,9 @@ import alpine.common.validation.RegexSequence; import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.Element; import javax.jdo.annotations.Extension; @@ -32,9 +35,6 @@ import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.security.Principal; import java.util.Date; diff --git a/alpine-model/src/main/java/alpine/model/ConfigProperty.java b/alpine-model/src/main/java/alpine/model/ConfigProperty.java index b8294eb7..eeff6665 100644 --- a/alpine-model/src/main/java/alpine/model/ConfigProperty.java +++ b/alpine-model/src/main/java/alpine/model/ConfigProperty.java @@ -21,16 +21,16 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; /** diff --git a/alpine-model/src/main/java/alpine/model/EventServiceLog.java b/alpine-model/src/main/java/alpine/model/EventServiceLog.java index 4b1c6b9d..441cca31 100644 --- a/alpine-model/src/main/java/alpine/model/EventServiceLog.java +++ b/alpine-model/src/main/java/alpine/model/EventServiceLog.java @@ -20,13 +20,13 @@ import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.validation.constraints.NotBlank; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.Index; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; -import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.sql.Timestamp; diff --git a/alpine-model/src/main/java/alpine/model/InstalledUpgrades.java b/alpine-model/src/main/java/alpine/model/InstalledUpgrades.java index f39d9683..2885755e 100644 --- a/alpine-model/src/main/java/alpine/model/InstalledUpgrades.java +++ b/alpine-model/src/main/java/alpine/model/InstalledUpgrades.java @@ -20,14 +20,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.sql.Timestamp; diff --git a/alpine-model/src/main/java/alpine/model/LdapUser.java b/alpine-model/src/main/java/alpine/model/LdapUser.java index d1c01aa4..a017b573 100644 --- a/alpine-model/src/main/java/alpine/model/LdapUser.java +++ b/alpine-model/src/main/java/alpine/model/LdapUser.java @@ -21,6 +21,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.Element; import javax.jdo.annotations.Extension; @@ -31,9 +34,6 @@ import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.security.Principal; import java.util.List; diff --git a/alpine-model/src/main/java/alpine/model/ManagedUser.java b/alpine-model/src/main/java/alpine/model/ManagedUser.java index 660f4a27..ecf1c54a 100644 --- a/alpine-model/src/main/java/alpine/model/ManagedUser.java +++ b/alpine-model/src/main/java/alpine/model/ManagedUser.java @@ -21,6 +21,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.Element; import javax.jdo.annotations.Extension; @@ -31,10 +35,6 @@ import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.security.Principal; import java.util.Date; diff --git a/alpine-model/src/main/java/alpine/model/MappedLdapGroup.java b/alpine-model/src/main/java/alpine/model/MappedLdapGroup.java index b9ba7a1d..74fd0c56 100644 --- a/alpine-model/src/main/java/alpine/model/MappedLdapGroup.java +++ b/alpine-model/src/main/java/alpine/model/MappedLdapGroup.java @@ -21,16 +21,16 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.util.UUID; diff --git a/alpine-model/src/main/java/alpine/model/MappedOidcGroup.java b/alpine-model/src/main/java/alpine/model/MappedOidcGroup.java index 4eb28dfe..dcc25005 100644 --- a/alpine-model/src/main/java/alpine/model/MappedOidcGroup.java +++ b/alpine-model/src/main/java/alpine/model/MappedOidcGroup.java @@ -22,13 +22,13 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotNull; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotNull; import java.util.UUID; /** diff --git a/alpine-model/src/main/java/alpine/model/OidcGroup.java b/alpine-model/src/main/java/alpine/model/OidcGroup.java index f20c0a80..5b21138a 100644 --- a/alpine-model/src/main/java/alpine/model/OidcGroup.java +++ b/alpine-model/src/main/java/alpine/model/OidcGroup.java @@ -22,16 +22,16 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.util.UUID; diff --git a/alpine-model/src/main/java/alpine/model/OidcUser.java b/alpine-model/src/main/java/alpine/model/OidcUser.java index 6ff4e050..30fa19e2 100644 --- a/alpine-model/src/main/java/alpine/model/OidcUser.java +++ b/alpine-model/src/main/java/alpine/model/OidcUser.java @@ -22,6 +22,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.Element; import javax.jdo.annotations.Extension; @@ -32,9 +35,6 @@ import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.security.Principal; import java.util.List; diff --git a/alpine-model/src/main/java/alpine/model/Permission.java b/alpine-model/src/main/java/alpine/model/Permission.java index c58d9083..b1f6a10e 100644 --- a/alpine-model/src/main/java/alpine/model/Permission.java +++ b/alpine-model/src/main/java/alpine/model/Permission.java @@ -22,6 +22,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.Extension; import javax.jdo.annotations.IdGeneratorStrategy; @@ -30,9 +33,6 @@ import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.util.List; diff --git a/alpine-model/src/main/java/alpine/model/SchemaVersion.java b/alpine-model/src/main/java/alpine/model/SchemaVersion.java index 17ba86fe..cd590004 100644 --- a/alpine-model/src/main/java/alpine/model/SchemaVersion.java +++ b/alpine-model/src/main/java/alpine/model/SchemaVersion.java @@ -20,14 +20,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; /** diff --git a/alpine-model/src/main/java/alpine/model/Team.java b/alpine-model/src/main/java/alpine/model/Team.java index 595bf92b..df2cfe8d 100644 --- a/alpine-model/src/main/java/alpine/model/Team.java +++ b/alpine-model/src/main/java/alpine/model/Team.java @@ -21,6 +21,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; import javax.jdo.annotations.Column; import javax.jdo.annotations.Element; import javax.jdo.annotations.Extension; @@ -33,10 +37,6 @@ import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.Unique; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; import java.io.Serializable; import java.util.List; import java.util.UUID; diff --git a/alpine-server/pom.xml b/alpine-server/pom.xml index 91a857c0..667c68b3 100644 --- a/alpine-server/pom.xml +++ b/alpine-server/pom.xml @@ -72,8 +72,8 @@ - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api provided @@ -98,29 +98,25 @@ - javax.xml.bind - jaxb-api + jakarta.xml.bind + jakarta.xml.bind-api - com.sun.xml.bind - jaxb-core - - - com.sun.xml.bind - jaxb-impl + org.glassfish.jaxb + jaxb-runtime - javax.json - javax.json-api + jakarta.json + jakarta.json-api - org.glassfish - javax.json + org.eclipse.parsson + jakarta.json io.swagger.core.v3 - swagger-annotations + swagger-annotations-jakarta @@ -174,12 +170,12 @@ jackson-annotations - com.fasterxml.jackson.jaxrs - jackson-jaxrs-base + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-base - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider com.fasterxml.jackson.datatype @@ -227,8 +223,12 @@ - com.sun.mail - jakarta.mail + jakarta.mail + jakarta.mail-api + + + org.eclipse.angus + angus-mail diff --git a/alpine-server/src/main/java/alpine/server/AlpineServlet.java b/alpine-server/src/main/java/alpine/server/AlpineServlet.java index 09d48b23..b829dc93 100644 --- a/alpine-server/src/main/java/alpine/server/AlpineServlet.java +++ b/alpine-server/src/main/java/alpine/server/AlpineServlet.java @@ -26,8 +26,8 @@ import org.owasp.security.logging.util.SecurityLoggingFactory; import org.owasp.security.logging.util.SecurityUtil; -import javax.servlet.ServletConfig; -import javax.servlet.ServletException; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; /** * The AlpineServlet is the main servlet which extends diff --git a/alpine-server/src/main/java/alpine/server/auth/AlpineCookie.java b/alpine-server/src/main/java/alpine/server/auth/AlpineCookie.java index a1335a58..5ca1b226 100644 --- a/alpine-server/src/main/java/alpine/server/auth/AlpineCookie.java +++ b/alpine-server/src/main/java/alpine/server/auth/AlpineCookie.java @@ -18,7 +18,7 @@ */ package alpine.server.auth; -import javax.ws.rs.core.NewCookie; +import jakarta.ws.rs.core.NewCookie; /** * Alpine Cookies are secure with the HttpOnly, Secure, and Samesite flags enabled. diff --git a/alpine-server/src/main/java/alpine/server/auth/AuthenticationNotRequired.java b/alpine-server/src/main/java/alpine/server/auth/AuthenticationNotRequired.java index 2f6f4241..6daa54d3 100644 --- a/alpine-server/src/main/java/alpine/server/auth/AuthenticationNotRequired.java +++ b/alpine-server/src/main/java/alpine/server/auth/AuthenticationNotRequired.java @@ -18,7 +18,7 @@ */ package alpine.server.auth; -import javax.ws.rs.NameBinding; +import jakarta.ws.rs.NameBinding; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/alpine-server/src/main/java/alpine/server/auth/AuthenticationService.java b/alpine-server/src/main/java/alpine/server/auth/AuthenticationService.java index 291cf1f1..dee44c28 100644 --- a/alpine-server/src/main/java/alpine/server/auth/AuthenticationService.java +++ b/alpine-server/src/main/java/alpine/server/auth/AuthenticationService.java @@ -18,7 +18,7 @@ */ package alpine.server.auth; -import javax.annotation.Nullable; +import jakarta.annotation.Nullable; import javax.naming.AuthenticationException; import java.security.Principal; diff --git a/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java b/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java index f74b7fbc..5158d29b 100644 --- a/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java +++ b/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java @@ -31,14 +31,13 @@ import io.jsonwebtoken.JwtParser; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.MalformedJwtException; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.SignatureException; import io.jsonwebtoken.UnsupportedJwtException; +import io.jsonwebtoken.security.SignatureException; import org.owasp.security.logging.SecurityMarkers; -import javax.crypto.SecretKey; -import java.security.Key; import java.security.Principal; +import java.security.PrivateKey; +import java.security.PublicKey; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -66,24 +65,12 @@ public class JsonWebToken { } } - private final Key key; + private final PrivateKey privateKey; + private final PublicKey publicKey; private String subject; private Date expiration; private IdentityProvider identityProvider; - /** - * Constructs a new JsonWekToken object using the specified SecretKey which can - * be retrieved from {@link KeyManager#getSecretKey()} to use the Alpine-generated - * secret key. Usage of other SecretKeys is allowed but management of those keys - * is up to the implementor. - * - * @param key the SecretKey to use in generating or validating the token - * @since 1.0.0 - */ - public JsonWebToken(final SecretKey key) { - this.key = key; - } - /** * Constructs a new JsonWebToken object using the default Alpine-generated * secret key. @@ -92,7 +79,8 @@ public JsonWebToken(final SecretKey key) { * @since 1.0.0 */ public JsonWebToken() { - this.key = KeyManager.getInstance().getSecretKey(); + this.privateKey = KeyManager.getInstance().getPrivateKey(); + this.publicKey = KeyManager.getInstance().getPublicKey(); } /** @@ -133,10 +121,10 @@ public String createToken(final Principal principal, final List perm public String createToken(final Principal principal, final List permissions, final IdentityProvider identityProvider) { final Date today = new Date(); final JwtBuilder jwtBuilder = Jwts.builder(); - jwtBuilder.setSubject(principal.getName()); - jwtBuilder.setIssuer(ISSUER); - jwtBuilder.setIssuedAt(today); - jwtBuilder.setExpiration(addDays(today, 7)); + jwtBuilder.subject(principal.getName()); + jwtBuilder.issuer(ISSUER); + jwtBuilder.issuedAt(today); + jwtBuilder.expiration(addDays(today, 7)); if (permissions != null) { jwtBuilder.claim("permissions", permissions.stream() .map(Permission::getName) @@ -154,7 +142,7 @@ public String createToken(final Principal principal, final List perm jwtBuilder.claim(IDENTITY_PROVIDER_CLAIM, IdentityProvider.LOCAL.name()); } } - return jwtBuilder.signWith(SignatureAlgorithm.HS256, key).compact(); + return jwtBuilder.signWith(privateKey).compact(); } /** @@ -167,8 +155,8 @@ public String createToken(final Principal principal, final List perm */ public String createToken(final Map claims) { final JwtBuilder jwtBuilder = Jwts.builder(); - jwtBuilder.setClaims(claims); - return jwtBuilder.signWith(SignatureAlgorithm.HS256, key).compact(); + jwtBuilder.claims(claims); + return jwtBuilder.signWith(privateKey).compact(); } /** @@ -181,11 +169,11 @@ public String createToken(final Map claims) { */ public boolean validateToken(final String token) { try { - final JwtParser jwtParser = Jwts.parser().setSigningKey(key); - final Jws claims = jwtParser.parseClaimsJws(token); - this.subject = claims.getBody().getSubject(); - this.expiration = claims.getBody().getExpiration(); - this.identityProvider = IdentityProvider.forName(claims.getBody().get(IDENTITY_PROVIDER_CLAIM, String.class)); + final JwtParser jwtParser = Jwts.parser().verifyWith(publicKey).build(); + final Jws claims = jwtParser.parseSignedClaims(token); + this.subject = claims.getPayload().getSubject(); + this.expiration = claims.getPayload().getExpiration(); + this.identityProvider = IdentityProvider.forName(claims.getPayload().get(IDENTITY_PROVIDER_CLAIM, String.class)); return true; } catch (SignatureException e) { LOGGER.info(SecurityMarkers.SECURITY_FAILURE, "Received token that did not pass signature verification"); diff --git a/alpine-server/src/main/java/alpine/server/auth/JwtAuthenticationService.java b/alpine-server/src/main/java/alpine/server/auth/JwtAuthenticationService.java index 9bab7e19..574c7078 100644 --- a/alpine-server/src/main/java/alpine/server/auth/JwtAuthenticationService.java +++ b/alpine-server/src/main/java/alpine/server/auth/JwtAuthenticationService.java @@ -22,12 +22,11 @@ import alpine.model.ManagedUser; import alpine.model.OidcUser; import alpine.persistence.AlpineQueryManager; -import alpine.security.crypto.KeyManager; import org.glassfish.jersey.server.ContainerRequest; +import jakarta.ws.rs.core.Cookie; +import jakarta.ws.rs.core.HttpHeaders; import javax.naming.AuthenticationException; -import javax.ws.rs.core.Cookie; -import javax.ws.rs.core.HttpHeaders; import java.security.Principal; import java.util.List; import java.util.Map; @@ -63,9 +62,8 @@ public boolean isSpecified() { * {@inheritDoc} */ public Principal authenticate() throws AuthenticationException { - final KeyManager keyManager = KeyManager.getInstance(); if (bearer != null) { - final JsonWebToken jwt = new JsonWebToken(keyManager.getSecretKey()); + final JsonWebToken jwt = new JsonWebToken(); final boolean isValid = jwt.validateToken(bearer); if (isValid) { try (AlpineQueryManager qm = new AlpineQueryManager()) { diff --git a/alpine-server/src/main/java/alpine/server/auth/OidcAuthenticationService.java b/alpine-server/src/main/java/alpine/server/auth/OidcAuthenticationService.java index 3ffa0fbd..dcb36b39 100644 --- a/alpine-server/src/main/java/alpine/server/auth/OidcAuthenticationService.java +++ b/alpine-server/src/main/java/alpine/server/auth/OidcAuthenticationService.java @@ -26,7 +26,7 @@ import alpine.server.util.OidcUtil; import com.nimbusds.openid.connect.sdk.claims.UserInfo; -import javax.annotation.Nonnull; +import jakarta.annotation.Nonnull; import java.security.Principal; import java.util.Objects; diff --git a/alpine-server/src/main/java/alpine/server/auth/OidcConfigurationResolver.java b/alpine-server/src/main/java/alpine/server/auth/OidcConfigurationResolver.java index e4b8df8d..198e3a3c 100644 --- a/alpine-server/src/main/java/alpine/server/auth/OidcConfigurationResolver.java +++ b/alpine-server/src/main/java/alpine/server/auth/OidcConfigurationResolver.java @@ -31,7 +31,7 @@ import com.nimbusds.openid.connect.sdk.op.OIDCProviderMetadata; import net.minidev.json.JSONObject; -import javax.annotation.Nullable; +import jakarta.annotation.Nullable; import java.io.IOException; import java.net.URL; diff --git a/alpine-server/src/main/java/alpine/server/filters/ApiFilter.java b/alpine-server/src/main/java/alpine/server/filters/ApiFilter.java index 891361b4..f71d0b90 100644 --- a/alpine-server/src/main/java/alpine/server/filters/ApiFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/ApiFilter.java @@ -25,12 +25,12 @@ import org.apache.commons.lang3.StringUtils; import org.glassfish.jersey.server.ContainerRequest; -import javax.annotation.Priority; -import javax.ws.rs.Priorities; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Priority; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.Provider; import java.security.Principal; @Provider diff --git a/alpine-server/src/main/java/alpine/server/filters/ApiKeyUsageTracker.java b/alpine-server/src/main/java/alpine/server/filters/ApiKeyUsageTracker.java index 81ebfeda..0b43757d 100644 --- a/alpine-server/src/main/java/alpine/server/filters/ApiKeyUsageTracker.java +++ b/alpine-server/src/main/java/alpine/server/filters/ApiKeyUsageTracker.java @@ -28,10 +28,10 @@ import org.glassfish.jersey.server.monitoring.RequestEvent; import org.glassfish.jersey.server.monitoring.RequestEventListener; +import jakarta.ws.rs.ext.Provider; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory; import javax.jdo.datastore.JDOConnection; -import javax.ws.rs.ext.Provider; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; diff --git a/alpine-server/src/main/java/alpine/server/filters/AuthenticationFeature.java b/alpine-server/src/main/java/alpine/server/filters/AuthenticationFeature.java index 86982415..3da59116 100644 --- a/alpine-server/src/main/java/alpine/server/filters/AuthenticationFeature.java +++ b/alpine-server/src/main/java/alpine/server/filters/AuthenticationFeature.java @@ -21,10 +21,10 @@ import alpine.Config; import alpine.server.auth.AuthenticationNotRequired; -import javax.ws.rs.container.DynamicFeature; -import javax.ws.rs.container.ResourceInfo; -import javax.ws.rs.core.FeatureContext; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.container.DynamicFeature; +import jakarta.ws.rs.container.ResourceInfo; +import jakarta.ws.rs.core.FeatureContext; +import jakarta.ws.rs.ext.Provider; import java.lang.reflect.Method; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/AuthenticationFilter.java b/alpine-server/src/main/java/alpine/server/filters/AuthenticationFilter.java index 47c14b75..13ec980c 100644 --- a/alpine-server/src/main/java/alpine/server/filters/AuthenticationFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/AuthenticationFilter.java @@ -25,13 +25,13 @@ import org.glassfish.jersey.server.ContainerRequest; import org.owasp.security.logging.SecurityMarkers; -import javax.annotation.Priority; +import jakarta.annotation.Priority; +import jakarta.ws.rs.HttpMethod; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.core.Response; import javax.naming.AuthenticationException; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.Priorities; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.core.Response; import java.security.Principal; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/AuthorizationFeature.java b/alpine-server/src/main/java/alpine/server/filters/AuthorizationFeature.java index a0c99a6d..ad4e53be 100644 --- a/alpine-server/src/main/java/alpine/server/filters/AuthorizationFeature.java +++ b/alpine-server/src/main/java/alpine/server/filters/AuthorizationFeature.java @@ -21,10 +21,10 @@ import alpine.Config; import alpine.server.auth.PermissionRequired; -import javax.ws.rs.container.DynamicFeature; -import javax.ws.rs.container.ResourceInfo; -import javax.ws.rs.core.FeatureContext; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.container.DynamicFeature; +import jakarta.ws.rs.container.ResourceInfo; +import jakarta.ws.rs.core.FeatureContext; +import jakarta.ws.rs.ext.Provider; import java.lang.reflect.Method; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/AuthorizationFilter.java b/alpine-server/src/main/java/alpine/server/filters/AuthorizationFilter.java index 74ed59b1..4d670cb6 100644 --- a/alpine-server/src/main/java/alpine/server/filters/AuthorizationFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/AuthorizationFilter.java @@ -29,13 +29,13 @@ import org.glassfish.jersey.server.ContainerRequest; import org.owasp.security.logging.SecurityMarkers; -import javax.annotation.Priority; -import javax.ws.rs.Priorities; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.container.ResourceInfo; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; +import jakarta.annotation.Priority; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.container.ResourceInfo; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; import java.security.Principal; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/BlacklistUrlFilter.java b/alpine-server/src/main/java/alpine/server/filters/BlacklistUrlFilter.java index 9fab5192..15771812 100644 --- a/alpine-server/src/main/java/alpine/server/filters/BlacklistUrlFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/BlacklistUrlFilter.java @@ -20,14 +20,14 @@ import org.apache.commons.lang3.StringUtils; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; diff --git a/alpine-server/src/main/java/alpine/server/filters/ClickjackingFilter.java b/alpine-server/src/main/java/alpine/server/filters/ClickjackingFilter.java index 0f3a3fd3..90c3db1d 100644 --- a/alpine-server/src/main/java/alpine/server/filters/ClickjackingFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/ClickjackingFilter.java @@ -20,13 +20,13 @@ import org.apache.commons.lang3.StringUtils; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/ContentSecurityPolicyFilter.java b/alpine-server/src/main/java/alpine/server/filters/ContentSecurityPolicyFilter.java index 3791575e..11107c6e 100644 --- a/alpine-server/src/main/java/alpine/server/filters/ContentSecurityPolicyFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/ContentSecurityPolicyFilter.java @@ -20,13 +20,13 @@ import org.apache.commons.lang3.StringUtils; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/FqdnForwardFilter.java b/alpine-server/src/main/java/alpine/server/filters/FqdnForwardFilter.java index 5fefd2bc..22554cb9 100644 --- a/alpine-server/src/main/java/alpine/server/filters/FqdnForwardFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/FqdnForwardFilter.java @@ -20,14 +20,14 @@ import org.apache.commons.lang3.StringUtils; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/GZipInterceptor.java b/alpine-server/src/main/java/alpine/server/filters/GZipInterceptor.java index 019773d5..cbf45a27 100644 --- a/alpine-server/src/main/java/alpine/server/filters/GZipInterceptor.java +++ b/alpine-server/src/main/java/alpine/server/filters/GZipInterceptor.java @@ -18,15 +18,15 @@ */ package alpine.server.filters; -import javax.validation.constraints.NotNull; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.ext.Provider; -import javax.ws.rs.ext.ReaderInterceptor; -import javax.ws.rs.ext.ReaderInterceptorContext; -import javax.ws.rs.ext.WriterInterceptor; -import javax.ws.rs.ext.WriterInterceptorContext; +import jakarta.validation.constraints.NotNull; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.ext.Provider; +import jakarta.ws.rs.ext.ReaderInterceptor; +import jakarta.ws.rs.ext.ReaderInterceptorContext; +import jakarta.ws.rs.ext.WriterInterceptor; +import jakarta.ws.rs.ext.WriterInterceptorContext; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; diff --git a/alpine-server/src/main/java/alpine/server/filters/HeaderFeature.java b/alpine-server/src/main/java/alpine/server/filters/HeaderFeature.java index baf2291c..1c9efa51 100644 --- a/alpine-server/src/main/java/alpine/server/filters/HeaderFeature.java +++ b/alpine-server/src/main/java/alpine/server/filters/HeaderFeature.java @@ -18,10 +18,10 @@ */ package alpine.server.filters; -import javax.ws.rs.container.DynamicFeature; -import javax.ws.rs.container.ResourceInfo; -import javax.ws.rs.core.FeatureContext; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.container.DynamicFeature; +import jakarta.ws.rs.container.ResourceInfo; +import jakarta.ws.rs.core.FeatureContext; +import jakarta.ws.rs.ext.Provider; /** * Registers the {@link HeaderFilter}. diff --git a/alpine-server/src/main/java/alpine/server/filters/HeaderFilter.java b/alpine-server/src/main/java/alpine/server/filters/HeaderFilter.java index 18254641..c6c78f12 100644 --- a/alpine-server/src/main/java/alpine/server/filters/HeaderFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/HeaderFilter.java @@ -21,12 +21,12 @@ import alpine.Config; import org.apache.commons.lang3.StringUtils; -import javax.annotation.Priority; -import javax.ws.rs.Priorities; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerResponseContext; -import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.core.HttpHeaders; +import jakarta.annotation.Priority; +import jakarta.ws.rs.Priorities; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.core.HttpHeaders; /** * Adds Powered-By and cache-control headers. diff --git a/alpine-server/src/main/java/alpine/server/filters/HpkpFilter.java b/alpine-server/src/main/java/alpine/server/filters/HpkpFilter.java index 73600437..26f03621 100644 --- a/alpine-server/src/main/java/alpine/server/filters/HpkpFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/HpkpFilter.java @@ -20,14 +20,14 @@ import alpine.common.util.BooleanUtil; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/HstsFilter.java b/alpine-server/src/main/java/alpine/server/filters/HstsFilter.java index a9f6b07f..748ce68e 100644 --- a/alpine-server/src/main/java/alpine/server/filters/HstsFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/HstsFilter.java @@ -20,14 +20,14 @@ import alpine.common.util.BooleanUtil; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/PrettyPrintFilter.java b/alpine-server/src/main/java/alpine/server/filters/PrettyPrintFilter.java index 112e5478..e3a63d07 100644 --- a/alpine-server/src/main/java/alpine/server/filters/PrettyPrintFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/PrettyPrintFilter.java @@ -20,16 +20,16 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase; -import com.fasterxml.jackson.jaxrs.cfg.ObjectWriterInjector; -import com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier; +import com.fasterxml.jackson.jakarta.rs.cfg.EndpointConfigBase; +import com.fasterxml.jackson.jakarta.rs.cfg.ObjectWriterInjector; +import com.fasterxml.jackson.jakarta.rs.cfg.ObjectWriterModifier; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerResponseContext; -import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.UriInfo; +import jakarta.ws.rs.ext.Provider; import java.io.IOException; /** diff --git a/alpine-server/src/main/java/alpine/server/filters/RequestIdFilter.java b/alpine-server/src/main/java/alpine/server/filters/RequestIdFilter.java index dc74ecb3..20e73d7c 100644 --- a/alpine-server/src/main/java/alpine/server/filters/RequestIdFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/RequestIdFilter.java @@ -20,12 +20,12 @@ import org.slf4j.MDC; -import javax.annotation.Priority; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.container.ContainerResponseContext; -import javax.ws.rs.container.ContainerResponseFilter; -import javax.ws.rs.ext.Provider; +import jakarta.annotation.Priority; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerRequestFilter; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.container.ContainerResponseFilter; +import jakarta.ws.rs.ext.Provider; import java.io.IOException; import java.util.UUID; import java.util.regex.Pattern; diff --git a/alpine-server/src/main/java/alpine/server/filters/RequestRateThrottleFilter.java b/alpine-server/src/main/java/alpine/server/filters/RequestRateThrottleFilter.java index a2ea17db..4cb50f25 100644 --- a/alpine-server/src/main/java/alpine/server/filters/RequestRateThrottleFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/RequestRateThrottleFilter.java @@ -20,15 +20,15 @@ import alpine.server.util.HttpUtil; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; import java.io.IOException; import java.util.Date; import java.util.Stack; diff --git a/alpine-server/src/main/java/alpine/server/filters/WhitelistUrlFilter.java b/alpine-server/src/main/java/alpine/server/filters/WhitelistUrlFilter.java index c68ecbee..d726b802 100644 --- a/alpine-server/src/main/java/alpine/server/filters/WhitelistUrlFilter.java +++ b/alpine-server/src/main/java/alpine/server/filters/WhitelistUrlFilter.java @@ -20,14 +20,14 @@ import org.apache.commons.lang3.StringUtils; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; diff --git a/alpine-server/src/main/java/alpine/server/mail/SendMail.java b/alpine-server/src/main/java/alpine/server/mail/SendMail.java index c92121ae..e342941d 100644 --- a/alpine-server/src/main/java/alpine/server/mail/SendMail.java +++ b/alpine-server/src/main/java/alpine/server/mail/SendMail.java @@ -19,24 +19,24 @@ package alpine.server.mail; import alpine.security.crypto.RelaxedX509TrustManager; -import com.sun.mail.util.MailSSLSocketFactory; - -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.activation.FileDataSource; -import javax.mail.Address; -import javax.mail.BodyPart; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.AddressException; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; +import org.eclipse.angus.mail.util.MailSSLSocketFactory; + +import jakarta.activation.DataHandler; +import jakarta.activation.DataSource; +import jakarta.activation.FileDataSource; +import jakarta.mail.Address; +import jakarta.mail.BodyPart; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.Multipart; +import jakarta.mail.PasswordAuthentication; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeBodyPart; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; import javax.net.ssl.TrustManager; import java.io.File; import java.security.GeneralSecurityException; @@ -209,7 +209,7 @@ public void send() throws SendMailException { props.put("mail.smtp.auth.ntlm.domain", host); } - final Session session = Session.getInstance(props, new javax.mail.Authenticator() { + final Session session = Session.getInstance(props, new jakarta.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } diff --git a/alpine-server/src/main/java/alpine/server/metrics/MetricsInitializer.java b/alpine-server/src/main/java/alpine/server/metrics/MetricsInitializer.java index 7365b0e3..97e2eb14 100644 --- a/alpine-server/src/main/java/alpine/server/metrics/MetricsInitializer.java +++ b/alpine-server/src/main/java/alpine/server/metrics/MetricsInitializer.java @@ -30,8 +30,8 @@ import io.micrometer.core.instrument.binder.system.ProcessorMetrics; import io.micrometer.core.instrument.binder.system.UptimeMetrics; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; /** * @since 2.1.0 diff --git a/alpine-server/src/main/java/alpine/server/persistence/PersistenceInitializer.java b/alpine-server/src/main/java/alpine/server/persistence/PersistenceInitializer.java index 6298c25a..4feff6a8 100644 --- a/alpine-server/src/main/java/alpine/server/persistence/PersistenceInitializer.java +++ b/alpine-server/src/main/java/alpine/server/persistence/PersistenceInitializer.java @@ -23,8 +23,8 @@ import org.apache.commons.lang3.StringUtils; import org.h2.tools.Server; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; import java.sql.SQLException; /** diff --git a/alpine-server/src/main/java/alpine/server/persistence/PersistenceManagerFactory.java b/alpine-server/src/main/java/alpine/server/persistence/PersistenceManagerFactory.java index 2f8c0d70..73373752 100644 --- a/alpine-server/src/main/java/alpine/server/persistence/PersistenceManagerFactory.java +++ b/alpine-server/src/main/java/alpine/server/persistence/PersistenceManagerFactory.java @@ -34,10 +34,10 @@ import org.datanucleus.api.jdo.JDOPersistenceManagerFactory; import org.datanucleus.store.schema.SchemaAwareStoreManager; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; import javax.jdo.JDOHelper; import javax.jdo.PersistenceManager; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; import javax.sql.DataSource; import java.util.HashSet; import java.util.Properties; diff --git a/alpine-server/src/main/java/alpine/server/resources/AlpineResource.java b/alpine-server/src/main/java/alpine/server/resources/AlpineResource.java index 2feb6f60..3131442a 100644 --- a/alpine-server/src/main/java/alpine/server/resources/AlpineResource.java +++ b/alpine-server/src/main/java/alpine/server/resources/AlpineResource.java @@ -34,16 +34,16 @@ import org.owasp.security.logging.SecurityMarkers; import org.slf4j.Marker; -import javax.servlet.http.HttpServletRequest; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; -import javax.ws.rs.BadRequestException; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import jakarta.ws.rs.BadRequestException; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.UriInfo; import java.security.Principal; import java.util.ArrayList; import java.util.List; diff --git a/alpine-server/src/main/java/alpine/server/resources/GlobalExceptionHandler.java b/alpine-server/src/main/java/alpine/server/resources/GlobalExceptionHandler.java index 0dc95309..90415905 100644 --- a/alpine-server/src/main/java/alpine/server/resources/GlobalExceptionHandler.java +++ b/alpine-server/src/main/java/alpine/server/resources/GlobalExceptionHandler.java @@ -20,9 +20,9 @@ import alpine.common.logging.Logger; -import javax.ws.rs.core.Response; -import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; +import jakarta.ws.rs.ext.Provider; @Provider public class GlobalExceptionHandler implements ExceptionMapper { diff --git a/alpine-server/src/main/java/alpine/server/resources/VersionResource.java b/alpine-server/src/main/java/alpine/server/resources/VersionResource.java index c2eb9d18..a7d4ab45 100644 --- a/alpine-server/src/main/java/alpine/server/resources/VersionResource.java +++ b/alpine-server/src/main/java/alpine/server/resources/VersionResource.java @@ -26,12 +26,12 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.GenericEntity; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.GenericEntity; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; /** * Bundled JAX-RS resource that displays the name of the application, version, and build timestamp. diff --git a/alpine-server/src/main/java/alpine/server/servlets/FileSystemResourceServlet.java b/alpine-server/src/main/java/alpine/server/servlets/FileSystemResourceServlet.java index 972ab9d3..a260862e 100644 --- a/alpine-server/src/main/java/alpine/server/servlets/FileSystemResourceServlet.java +++ b/alpine-server/src/main/java/alpine/server/servlets/FileSystemResourceServlet.java @@ -22,10 +22,10 @@ import alpine.common.util.BooleanUtil; import org.apache.commons.lang3.StringUtils; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.io.InputStream; diff --git a/alpine-server/src/main/java/alpine/server/servlets/HealthServlet.java b/alpine-server/src/main/java/alpine/server/servlets/HealthServlet.java index 202dfb9a..fe8169e1 100644 --- a/alpine-server/src/main/java/alpine/server/servlets/HealthServlet.java +++ b/alpine-server/src/main/java/alpine/server/servlets/HealthServlet.java @@ -32,12 +32,12 @@ import org.eclipse.microprofile.health.Readiness; import org.eclipse.microprofile.health.Startup; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; import java.io.IOException; import java.util.ArrayList; diff --git a/alpine-server/src/main/java/alpine/server/servlets/MetricsServlet.java b/alpine-server/src/main/java/alpine/server/servlets/MetricsServlet.java index 144764ae..1d34908b 100644 --- a/alpine-server/src/main/java/alpine/server/servlets/MetricsServlet.java +++ b/alpine-server/src/main/java/alpine/server/servlets/MetricsServlet.java @@ -25,11 +25,11 @@ import org.apache.commons.lang3.StringUtils; import org.owasp.security.logging.SecurityMarkers; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.HttpHeaders; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.HttpHeaders; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Base64; diff --git a/alpine-server/src/main/java/alpine/server/servlets/StaticResourceServlet.java b/alpine-server/src/main/java/alpine/server/servlets/StaticResourceServlet.java index 09bd2e81..109fe0f5 100644 --- a/alpine-server/src/main/java/alpine/server/servlets/StaticResourceServlet.java +++ b/alpine-server/src/main/java/alpine/server/servlets/StaticResourceServlet.java @@ -18,10 +18,10 @@ */ package alpine.server.servlets; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.nio.ByteBuffer; diff --git a/alpine-server/src/main/java/alpine/server/util/HttpUtil.java b/alpine-server/src/main/java/alpine/server/util/HttpUtil.java index 7b59445d..72d39068 100644 --- a/alpine-server/src/main/java/alpine/server/util/HttpUtil.java +++ b/alpine-server/src/main/java/alpine/server/util/HttpUtil.java @@ -18,8 +18,8 @@ */ package alpine.server.util; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; /** * This class contains a collection of useful utility methods for various HTTP tasks. diff --git a/alpine-server/src/test/java/alpine/server/filters/RequestIdFilterTest.java b/alpine-server/src/test/java/alpine/server/filters/RequestIdFilterTest.java index 345cf7fe..d0177abe 100644 --- a/alpine-server/src/test/java/alpine/server/filters/RequestIdFilterTest.java +++ b/alpine-server/src/test/java/alpine/server/filters/RequestIdFilterTest.java @@ -24,9 +24,9 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerResponseContext; -import javax.ws.rs.core.MultivaluedHashMap; +import jakarta.ws.rs.container.ContainerRequestContext; +import jakarta.ws.rs.container.ContainerResponseContext; +import jakarta.ws.rs.core.MultivaluedHashMap; import java.util.List; import java.util.Map; diff --git a/alpine-server/src/test/java/alpine/server/servlets/HealthServletTest.java b/alpine-server/src/test/java/alpine/server/servlets/HealthServletTest.java index 70c451dd..33621fb6 100644 --- a/alpine-server/src/test/java/alpine/server/servlets/HealthServletTest.java +++ b/alpine-server/src/test/java/alpine/server/servlets/HealthServletTest.java @@ -10,8 +10,8 @@ import org.junit.Before; import org.junit.Test; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; diff --git a/alpine-server/src/test/java/alpine/server/servlets/MetricsServletTest.java b/alpine-server/src/test/java/alpine/server/servlets/MetricsServletTest.java index ef17ed4b..e53b8f9e 100644 --- a/alpine-server/src/test/java/alpine/server/servlets/MetricsServletTest.java +++ b/alpine-server/src/test/java/alpine/server/servlets/MetricsServletTest.java @@ -23,9 +23,9 @@ import org.junit.Before; import org.junit.Test; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.ws.rs.core.HttpHeaders; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.ws.rs.core.HttpHeaders; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; diff --git a/alpine-server/src/test/java/alpine/server/util/HttpUtilTest.java b/alpine-server/src/test/java/alpine/server/util/HttpUtilTest.java index 971dc82e..8176ab5d 100644 --- a/alpine-server/src/test/java/alpine/server/util/HttpUtilTest.java +++ b/alpine-server/src/test/java/alpine/server/util/HttpUtilTest.java @@ -21,8 +21,8 @@ import org.junit.Assert; import org.junit.Test; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/example/src/main/java/com/example/event/EventSubsystemInitializer.java b/example/src/main/java/com/example/event/EventSubsystemInitializer.java index b2d1e13c..c9e5149c 100644 --- a/example/src/main/java/com/example/event/EventSubsystemInitializer.java +++ b/example/src/main/java/com/example/event/EventSubsystemInitializer.java @@ -22,8 +22,8 @@ import alpine.event.framework.EventService; import alpine.tasks.LdapSyncTask; import com.example.tasks.TaskScheduler; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; /** * Initializes the event subsystem. diff --git a/example/src/main/java/com/example/persistence/DefaultObjectCreator.java b/example/src/main/java/com/example/persistence/DefaultObjectCreator.java index f9220af4..f28ee10b 100644 --- a/example/src/main/java/com/example/persistence/DefaultObjectCreator.java +++ b/example/src/main/java/com/example/persistence/DefaultObjectCreator.java @@ -22,8 +22,8 @@ import alpine.model.ManagedUser; import alpine.model.Team; import alpine.persistence.AlpineQueryManager; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; +import jakarta.servlet.ServletContextEvent; +import jakarta.servlet.ServletContextListener; /** * This class simply creates objects on startup. The example application uses diff --git a/example/src/main/java/com/example/resources/v1/LoginResource.java b/example/src/main/java/com/example/resources/v1/LoginResource.java index e4e3936c..a3a9da17 100644 --- a/example/src/main/java/com/example/resources/v1/LoginResource.java +++ b/example/src/main/java/com/example/resources/v1/LoginResource.java @@ -29,12 +29,12 @@ import io.swagger.annotations.ApiOperation; import org.owasp.security.logging.SecurityMarkers; import javax.naming.AuthenticationException; -import javax.ws.rs.FormParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import java.security.Principal; /** diff --git a/example/src/main/webapp/WEB-INF/web.xml b/example/src/main/webapp/WEB-INF/web.xml index a0e9e880..8f41b89d 100644 --- a/example/src/main/webapp/WEB-INF/web.xml +++ b/example/src/main/webapp/WEB-INF/web.xml @@ -1,8 +1,8 @@ - + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" + version="6.0"> alpine.persistence.PersistenceInitializer diff --git a/pom.xml b/pom.xml index 68fa4045..e04bbdf8 100644 --- a/pom.xml +++ b/pom.xml @@ -158,6 +158,7 @@ 2.2.6-SNAPSHOT + 2.0.3 0.4 3.1.8 4.4 @@ -171,27 +172,25 @@ 3.29.2-GA 2.17.0 2.17.1 - 1.6.7 - 2.3.1 - 2.3.0.1 - 2.3.6 + 2.1.3 + 2.1.3 + 6.0.0 + 4.0.2 + 4.0.5 3.2.1 - 2.41 + 3.1.6 2.37.0 - 2.2 - 0.9.1 + 0.12.5 3.0.2 - 1.1.4 - 1.1.4 - 1.2.5 1.3.14 7.3 1.11.4 - 3.1 + 4.0.1 10.15 1.2.3 1.1.7 + 1.1.6 2.0.12 2.2.22 @@ -231,9 +230,9 @@ - javax.servlet - javax.servlet-api - 4.0.1 + jakarta.servlet + jakarta.servlet-api + ${lib.jakarta-servlet-api.version} provided @@ -263,34 +262,30 @@ - javax.xml.bind - jaxb-api - ${lib.jaxb.api.version} + jakarta.xml.bind + jakarta.xml.bind-api + ${lib.jakarta-xml-bind-api.version} - com.sun.xml.bind - jaxb-core - ${lib.jaxb.core.version} + org.glassfish.jaxb + jaxb-runtime + ${lib.jaxb-runtime.version} + - com.sun.xml.bind - jaxb-impl - ${lib.jaxb.impl.version} + jakarta.json + jakarta.json-api + ${lib.jakarta-json-api.version} - - javax.json - javax.json-api - ${lib.jsr353-spec.version} - - - org.glassfish - javax.json - ${lib.jsr353-impl.version} + org.eclipse.parsson + jakarta.json + ${lib.parsson.version} + io.swagger.core.v3 - swagger-annotations + swagger-annotations-jakarta ${lib.swagger.version} @@ -369,13 +364,13 @@ ${lib.jackson.version} - com.fasterxml.jackson.jaxrs - jackson-jaxrs-base + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-base ${lib.jackson.version} - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider + com.fasterxml.jackson.jakarta.rs + jackson-jakarta-rs-json-provider ${lib.jackson.version} @@ -440,9 +435,14 @@ - com.sun.mail - jakarta.mail - ${lib.javamail.version} + jakarta.mail + jakarta.mail-api + ${lib.jakarta-mail-api.version} + + + org.eclipse.angus + angus-mail + ${lib.angus-mail.version} From a3687b4998b046c49f46e95d5af3282a6449040c Mon Sep 17 00:00:00 2001 From: nscuro Date: Thu, 23 May 2024 13:09:50 +0200 Subject: [PATCH 2/2] Avoid breaking change in key used for JWT signing Instead of switching to public/private key pair, convert the secret key to the appropriate `HmacSHA*` algorithm instead. Switching the keys used for signing would have been a breaking change. Signed-off-by: nscuro --- .../java/alpine/server/auth/JsonWebToken.java | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java b/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java index fc2a6619..1686ecb1 100644 --- a/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java +++ b/alpine-server/src/main/java/alpine/server/auth/JsonWebToken.java @@ -32,12 +32,12 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.MalformedJwtException; import io.jsonwebtoken.UnsupportedJwtException; +import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.SignatureException; import org.owasp.security.logging.SecurityMarkers; +import javax.crypto.SecretKey; import java.security.Principal; -import java.security.PrivateKey; -import java.security.PublicKey; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -65,12 +65,27 @@ public class JsonWebToken { } } - private final PrivateKey privateKey; - private final PublicKey publicKey; + private final SecretKey key; private String subject; private Date expiration; private IdentityProvider identityProvider; + /** + * Constructs a new JsonWekToken object using the specified SecretKey which can + * be retrieved from {@link KeyManager#getSecretKey()} to use the Alpine-generated + * secret key. Usage of other SecretKeys is allowed but management of those keys + * is up to the implementor. + * + * @param key the SecretKey to use in generating or validating the token + * @since 1.0.0 + */ + public JsonWebToken(final SecretKey key) { + // NB: JJWT will throw if the key's algorithm is not explicitly any of: HmacSHA512, HmacSHA384, or HmacSHA256. + // Alpine generates its secret key with algorithm AES per default. + // Keys#hmacShaKeyFor will pick the correct HmacSHA* algorithm based on the key's bit length. + this.key = Keys.hmacShaKeyFor(key.getEncoded()); + } + /** * Constructs a new JsonWebToken object using the default Alpine-generated * secret key. @@ -79,8 +94,7 @@ public class JsonWebToken { * @since 1.0.0 */ public JsonWebToken() { - this.privateKey = KeyManager.getInstance().getPrivateKey(); - this.publicKey = KeyManager.getInstance().getPublicKey(); + this(KeyManager.getInstance().getSecretKey()); } /** @@ -159,7 +173,7 @@ public String createToken(final Principal principal, final List perm jwtBuilder.claim(IDENTITY_PROVIDER_CLAIM, IdentityProvider.LOCAL.name()); } } - return jwtBuilder.signWith(privateKey).compact(); + return jwtBuilder.signWith(key).compact(); } /** @@ -173,7 +187,7 @@ public String createToken(final Principal principal, final List perm public String createToken(final Map claims) { final JwtBuilder jwtBuilder = Jwts.builder(); jwtBuilder.claims(claims); - return jwtBuilder.signWith(privateKey).compact(); + return jwtBuilder.signWith(key).compact(); } /** @@ -186,7 +200,7 @@ public String createToken(final Map claims) { */ public boolean validateToken(final String token) { try { - final JwtParser jwtParser = Jwts.parser().verifyWith(publicKey).build(); + final JwtParser jwtParser = Jwts.parser().verifyWith(key).build(); final Jws claims = jwtParser.parseSignedClaims(token); this.subject = claims.getPayload().getSubject(); this.expiration = claims.getPayload().getExpiration();