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: executable:
./mvnw package -Pnative $(EXECUTABLE_ARGS) ./mvnw package -Pnative -Dquarkus.native.additional-build-args="--initialize-at-run-time=sun.java2d.Disposer" $(EXECUTABLE_ARGS)
image: image:
docker build -t rhiobet/lalafin$(IMAGE_TAG) . -f src/main/docker/Dockerfile.native 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> <maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <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.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus</quarkus.platform.group-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> <surefire-plugin.version>2.22.1</surefire-plugin.version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
@@ -54,6 +54,10 @@
<groupId>io.quarkus</groupId> <groupId>io.quarkus</groupId>
<artifactId>quarkus-elytron-security-properties-file</artifactId> <artifactId>quarkus-elytron-security-properties-file</artifactId>
</dependency> </dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-redis-client</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.openimaj</groupId> <groupId>org.openimaj</groupId>
<artifactId>core-image</artifactId> <artifactId>core-image</artifactId>

View File

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

View File

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

View File

@@ -1,14 +1,14 @@
package sh.rhiobet.lalafin.api; package sh.rhiobet.lalafin.api;
import javax.inject.Inject; import jakarta.inject.Inject;
import javax.ws.rs.Consumes; import jakarta.ws.rs.Consumes;
import javax.ws.rs.DELETE; import jakarta.ws.rs.DELETE;
import javax.ws.rs.GET; import jakarta.ws.rs.GET;
import javax.ws.rs.POST; import jakarta.ws.rs.POST;
import javax.ws.rs.Path; import jakarta.ws.rs.Path;
import javax.ws.rs.Produces; import jakarta.ws.rs.Produces;
import javax.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import org.jboss.resteasy.reactive.MultipartForm; import org.jboss.resteasy.reactive.MultipartForm;
import io.quarkus.security.Authenticated; import io.quarkus.security.Authenticated;
import io.quarkus.security.identity.SecurityIdentity; import io.quarkus.security.identity.SecurityIdentity;

View File

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

View File

@@ -2,9 +2,9 @@ package sh.rhiobet.lalafin.api.advent;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import javax.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import javax.inject.Inject; import jakarta.inject.Inject;
import javax.ws.rs.core.PathSegment; import jakarta.ws.rs.core.PathSegment;
import sh.rhiobet.lalafin.api.advent.AdventConfiguration.AdventEvent; import sh.rhiobet.lalafin.api.advent.AdventConfiguration.AdventEvent;
@ApplicationScoped @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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import javax.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import javax.inject.Inject; import jakarta.inject.Inject;
import javax.ws.rs.core.PathSegment; import jakarta.ws.rs.core.PathSegment;
import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration; import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration;
import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration.Route; 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; package sh.rhiobet.lalafin.api.model;
import javax.ws.rs.FormParam; import jakarta.ws.rs.FormParam;
import javax.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import org.jboss.resteasy.reactive.PartType; import org.jboss.resteasy.reactive.PartType;
import org.jboss.resteasy.reactive.multipart.FileUpload; 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.nio.file.Paths;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import javax.enterprise.context.ApplicationScoped; import jakarta.enterprise.context.ApplicationScoped;
import javax.inject.Inject; import jakarta.inject.Inject;
import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.im4java.core.ConvertCmd; import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException; import org.im4java.core.IM4JavaException;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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