Update to Quarkus 3.4.1 and use redis for tokens
This commit is contained in:
2
Makefile
2
Makefile
@@ -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
|
||||||
|
|||||||
8
pom.xml
8
pom.xml
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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: {}
|
||||||
|
|||||||
Reference in New Issue
Block a user