Update to Quarkus 3.4.1 and use redis for tokens

This commit is contained in:
2023-09-29 15:33:23 +00:00
parent 5e0fc29d2c
commit afb1be9793
25 changed files with 187 additions and 195 deletions

View File

@@ -1,5 +1,5 @@
executable:
./mvnw package -Pnative $(EXECUTABLE_ARGS)
./mvnw package -Pnative -Dquarkus.native.additional-build-args="--initialize-at-run-time=sun.java2d.Disposer" $(EXECUTABLE_ARGS)
image:
docker build -t rhiobet/lalafin$(IMAGE_TAG) . -f src/main/docker/Dockerfile.native

View File

@@ -12,10 +12,10 @@
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus-plugin.version>2.15.0.Final</quarkus-plugin.version>
<quarkus-plugin.version>3.4.1</quarkus-plugin.version>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
<quarkus.platform.version>2.15.0.Final</quarkus.platform.version>
<quarkus.platform.version>3.4.1</quarkus.platform.version>
<surefire-plugin.version>2.22.1</surefire-plugin.version>
</properties>
<dependencyManagement>
@@ -54,6 +54,10 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-elytron-security-properties-file</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-redis-client</artifactId>
</dependency>
<dependency>
<groupId>org.openimaj</groupId>
<artifactId>core-image</artifactId>

View File

@@ -2,19 +2,20 @@ package sh.rhiobet.lalafin.api;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.PathSegment;
import jakarta.ws.rs.core.Response;
import io.quarkus.security.Authenticated;
import io.quarkus.security.identity.SecurityIdentity;
import io.vertx.core.http.HttpServerRequest;
import sh.rhiobet.lalafin.api.advent.AdventAccessService;
import sh.rhiobet.lalafin.api.internal.FileTokenProvider;
import sh.rhiobet.lalafin.api.internal.RedisProviders;
import sh.rhiobet.lalafin.api.internal.redis.FileTokenProvider;
import sh.rhiobet.lalafin.api.internal.RoleAccessService;
import sh.rhiobet.lalafin.api.model.FileInfoBase;
import sh.rhiobet.lalafin.file.FileInfoService;
@@ -37,6 +38,9 @@ public class FilePrivateAPI {
@Inject
AdventAccessService adventAccessService;
@Inject
RedisProviders redisProviders;
@GET
@Path("/")
@Produces(MediaType.APPLICATION_JSON)
@@ -54,7 +58,7 @@ public class FilePrivateAPI {
}
FileTokenProvider fileTokenProvider =
new FileTokenProvider(securityIdentity.getPrincipal().getName(),
redisProviders.newFileTokenProvider(securityIdentity.getPrincipal().getName(),
request.remoteAddress().host().toString());
FileInfoBase fileInfo = fileInfoService.getInfo(names, fileTokenProvider);

View File

@@ -3,17 +3,18 @@ package sh.rhiobet.lalafin.api;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.HeaderParam;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.PathSegment;
import jakarta.ws.rs.core.Response;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.runtime.annotations.RegisterForReflection;
import io.vertx.core.http.HttpServerRequest;
import sh.rhiobet.lalafin.api.internal.RedisProviders;
import sh.rhiobet.lalafin.api.model.FileInfo;
import sh.rhiobet.lalafin.api.model.FileInfoBase;
import sh.rhiobet.lalafin.api.model.FileToken;
@@ -22,7 +23,6 @@ import sh.rhiobet.lalafin.file.FileInfoService;
import sh.rhiobet.lalafin.file.FileServeService;
import sh.rhiobet.lalafin.api.configuration.FolderApiConfiguration;
import sh.rhiobet.lalafin.api.configuration.FolderApiConfiguration.Token;
import sh.rhiobet.lalafin.api.internal.RSAKey;
@RegisterForReflection
@Path("/api/public/file")
@@ -39,13 +39,14 @@ public class FilePublicAPI {
@Inject
FolderApiConfiguration folderApiConfiguration;
@Inject
RedisProviders redisProviders;
@GET
@Path("/token/{fileToken}{fileName: (/.*)?}")
public Response getFileFromToken(String fileToken,
@HeaderParam("Range") String range) throws JsonProcessingException {
String decryptedToken = RSAKey.decrypt(fileToken);
ObjectMapper obj = new ObjectMapper();
FileToken token = obj.readValue(decryptedToken, FileToken.class);
public Response getFileFromToken(String fileToken, @HeaderParam("Range") String range) {
FileToken token = redisProviders.getRedisDataSource().value(FileToken.class).get(
"fileToken-" + fileToken);
String decodedFile = URLDecoder.decode(token.file, StandardCharsets.UTF_8);
if (request.remoteAddress().host().toString().equals(token.ip)
&& System.currentTimeMillis() < token.timestamp + 172800000) {

View File

@@ -1,14 +1,14 @@
package sh.rhiobet.lalafin.api;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
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.inject.Inject;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
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 org.jboss.resteasy.reactive.MultipartForm;
import io.quarkus.security.Authenticated;
import io.quarkus.security.identity.SecurityIdentity;

View File

@@ -1,10 +1,10 @@
package sh.rhiobet.lalafin.api;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Response;
import io.quarkus.runtime.annotations.RegisterForReflection;
import sh.rhiobet.lalafin.LalafinConfiguration;
import sh.rhiobet.lalafin.upload.UploadService;

View File

@@ -2,9 +2,9 @@ package sh.rhiobet.lalafin.api.advent;
import java.time.LocalDateTime;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.core.PathSegment;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.PathSegment;
import sh.rhiobet.lalafin.api.advent.AdventConfiguration.AdventEvent;
@ApplicationScoped

View File

@@ -1,34 +0,0 @@
package sh.rhiobet.lalafin.api.internal;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import sh.rhiobet.lalafin.api.model.FileToken;
public class FileTokenProvider {
private String username;
private String ip;
public FileTokenProvider(String username, String ip) {
this.username = username;
this.ip = ip;
}
public String getFileToken(String file) {
FileToken token = new FileToken(username, System.currentTimeMillis(), ip, file);
ObjectMapper obj = new ObjectMapper();
try {
return URLEncoder.encode(RSAKey.encrypt(obj.writeValueAsString(token)),
StandardCharsets.UTF_8);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
public String getUsername() {
return this.username;
}
}

View File

@@ -1,62 +0,0 @@
package sh.rhiobet.lalafin.api.internal;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
public class RSAKey {
private static volatile SecretKey secretKey = null;
private static volatile IvParameterSpec ivParameterSpec = null;
private static SecretKey getKey() throws NoSuchAlgorithmException {
if (secretKey == null) {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
secretKey = keyGen.generateKey();
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
ivParameterSpec = new IvParameterSpec(iv);
}
return secretKey;
}
public static String encrypt(String input) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, getKey(), ivParameterSpec);
byte[] cipherText = cipher.doFinal(input.getBytes());
return Base64.getEncoder().encodeToString(cipherText);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
| IllegalBlockSizeException | BadPaddingException
| InvalidAlgorithmParameterException e) {
throw new RuntimeException("Could not create cipher", e);
// Should never happen tbh
}
}
public static String decrypt(String input) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, getKey(), ivParameterSpec);
byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(input));
return new String(plainText);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
| IllegalBlockSizeException | BadPaddingException
| InvalidAlgorithmParameterException e) {
throw new RuntimeException("Could not create cipher", e);
// Should never happen tbh
}
}
}

View File

@@ -0,0 +1,30 @@
package sh.rhiobet.lalafin.api.internal;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.redis.datasource.RedisDataSource;
import io.quarkus.redis.datasource.value.SetArgs;
import io.quarkus.redis.datasource.value.ValueCommands;
import sh.rhiobet.lalafin.api.internal.redis.FileTokenProvider;
import sh.rhiobet.lalafin.api.model.FileToken;
@ApplicationScoped
public class RedisProviders {
@Inject
RedisDataSource redisDataSource;
public FileTokenProvider newFileTokenProvider(String username, String ip) {
return new FileTokenProvider(username, ip, this);
}
public RedisDataSource getRedisDataSource() {
return this.redisDataSource;
}
}

View File

@@ -3,9 +3,9 @@ package sh.rhiobet.lalafin.api.internal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.core.PathSegment;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.PathSegment;
import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration;
import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration.Route;

View File

@@ -0,0 +1,37 @@
package sh.rhiobet.lalafin.api.internal.redis;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.quarkus.redis.datasource.RedisDataSource;
import io.quarkus.redis.datasource.value.SetArgs;
import sh.rhiobet.lalafin.api.internal.RedisProviders;
import sh.rhiobet.lalafin.api.model.FileToken;
public class FileTokenProvider {
private String username;
private String ip;
private RedisProviders redisProviders;
public FileTokenProvider(String username, String ip, RedisProviders redisProviders) {
this.username = username;
this.ip = ip;
this.redisProviders = redisProviders;
}
public String getFileToken(String file) {
FileToken token = new FileToken(username, System.currentTimeMillis(), ip, file);
String uniqueID = UUID.randomUUID().toString();
this.redisProviders.getRedisDataSource().value(FileToken.class).set(
"fileToken-" + uniqueID, token, new SetArgs().pxAt(System.currentTimeMillis() + 86400000));
return uniqueID;
}
public String getUsername() {
return this.username;
}
}

View File

@@ -1,7 +1,7 @@
package sh.rhiobet.lalafin.api.model;
import javax.ws.rs.FormParam;
import javax.ws.rs.core.MediaType;
import jakarta.ws.rs.FormParam;
import jakarta.ws.rs.core.MediaType;
import org.jboss.resteasy.reactive.PartType;
import org.jboss.resteasy.reactive.multipart.FileUpload;

View File

@@ -8,8 +8,8 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;

View File

@@ -9,13 +9,13 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Stream;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.core.PathSegment;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.PathSegment;
import sh.rhiobet.lalafin.LalafinConfiguration;
import sh.rhiobet.lalafin.api.advent.AdventAccessService;
import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration;
import sh.rhiobet.lalafin.api.internal.FileTokenProvider;
import sh.rhiobet.lalafin.api.internal.redis.FileTokenProvider;
import sh.rhiobet.lalafin.api.model.FileInfo;
import sh.rhiobet.lalafin.api.model.FileInfoBase;
import sh.rhiobet.lalafin.api.model.FolderInfo;

View File

@@ -4,19 +4,20 @@ import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.HeaderParam;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.PathSegment;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriInfo;
import io.quarkus.security.Authenticated;
import io.quarkus.security.identity.SecurityIdentity;
import io.vertx.core.http.HttpServerRequest;
import sh.rhiobet.lalafin.api.advent.AdventAccessService;
import sh.rhiobet.lalafin.api.internal.FileTokenProvider;
import sh.rhiobet.lalafin.api.internal.RedisProviders;
import sh.rhiobet.lalafin.api.internal.redis.FileTokenProvider;
import sh.rhiobet.lalafin.api.internal.RoleAccessService;
import sh.rhiobet.lalafin.api.model.FileInfo;
import sh.rhiobet.lalafin.api.model.FileInfoBase;
@@ -46,6 +47,9 @@ public class FileResource {
@Inject
AdventAccessService adventAccessService;
@Inject
RedisProviders redisProviders;
@GET
@Path("/")
public Response serveRoot(@HeaderParam("Range") String range) {
@@ -61,7 +65,7 @@ public class FileResource {
}
FileTokenProvider fileTokenProvider =
new FileTokenProvider(securityIdentity.getPrincipal().getName(),
redisProviders.newFileTokenProvider(securityIdentity.getPrincipal().getName(),
request.remoteAddress().host().toString());
FileInfoBase fileInfoBase = fileInfoService.getInfo(names, fileTokenProvider);

View File

@@ -8,10 +8,10 @@ import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import io.quarkus.qute.Location;
import io.quarkus.qute.Template;
import sh.rhiobet.lalafin.LalafinConfiguration;

View File

@@ -11,9 +11,9 @@ import java.util.Optional;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Instance;
import jakarta.inject.Inject;
import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;

View File

@@ -2,18 +2,19 @@ package sh.rhiobet.lalafin.file;
import java.util.List;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.PathSegment;
import jakarta.ws.rs.core.Response;
import io.quarkus.security.Authenticated;
import io.quarkus.security.identity.SecurityIdentity;
import io.vertx.core.http.HttpServerRequest;
import sh.rhiobet.lalafin.api.advent.AdventAccessService;
import sh.rhiobet.lalafin.api.internal.FileTokenProvider;
import sh.rhiobet.lalafin.api.internal.RedisProviders;
import sh.rhiobet.lalafin.api.internal.redis.FileTokenProvider;
import sh.rhiobet.lalafin.api.internal.RoleAccessService;
import sh.rhiobet.lalafin.api.model.FileInfoBase;
@@ -38,6 +39,9 @@ public class ViewerResource {
@Context
HttpServerRequest request;
@Inject
RedisProviders redisProviders;
@GET
@Path("/{names: .+}/{page}")
public Response view(List<PathSegment> names, int page) {
@@ -47,7 +51,7 @@ public class ViewerResource {
}
FileTokenProvider fileTokenProvider =
new FileTokenProvider(securityIdentity.getPrincipal().getName(),
redisProviders.newFileTokenProvider(securityIdentity.getPrincipal().getName(),
request.remoteAddress().host().toString());
FileInfoBase fileInfoBase = fileInfoService.getInfo(names, fileTokenProvider);

View File

@@ -13,10 +13,10 @@ import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import io.quarkus.qute.Location;
import io.quarkus.qute.Template;
import io.quarkus.qute.TemplateInstance;

View File

@@ -1,10 +1,10 @@
package sh.rhiobet.lalafin.nzb;
import io.quarkus.security.Authenticated;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;
import sh.rhiobet.lalafin.LalafinConfiguration;
@Authenticated

View File

@@ -4,9 +4,9 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
@ApplicationScoped
public class NzbResultService {

View File

@@ -1,9 +1,9 @@
package sh.rhiobet.lalafin.upload;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;
import io.quarkus.security.Authenticated;
import io.quarkus.security.identity.SecurityIdentity;
import sh.rhiobet.lalafin.LalafinConfiguration;

View File

@@ -25,11 +25,11 @@ import javax.crypto.CipherInputStream;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.xml.bind.DatatypeConverter;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.ResponseBuilder;
import jakarta.xml.bind.DatatypeConverter;
import org.jboss.resteasy.reactive.multipart.FileUpload;
import io.quarkus.qute.Location;
import io.quarkus.qute.Template;

View File

@@ -8,6 +8,7 @@ quarkus:
proxy-address-forwarding: true
native:
additional-build-args: --initialize-at-run-time=sun.java2d.Disposer
container-build: true
container-runtime: docker
builder-image: quay.io/quarkus/ubi-quarkus-mandrel:22.3-java17
@@ -25,6 +26,9 @@ quarkus:
token:
refresh-expired: true
redis:
hosts: redis://localhost/
lalafin:
base_url: 127.0.0.1:8910
disabled_services: {}