From 8c0bb2ce4aa7a645270487acb64cf058b49a3e96 Mon Sep 17 00:00:00 2001 From: RhiobeT Date: Sat, 18 Apr 2026 21:32:34 +0200 Subject: [PATCH] Refactor accessors --- .../rhiobet/lalafin/access/AccessService.java | 7 +++ .../lalafin/advent/AdventAccessService.java | 49 +++++++++++++++++++ .../lalafin/advent/AdventConfiguration.java | 15 ++++++ .../lalafin/file/FileConfiguration.java | 17 +++++++ .../lalafin/file/FileRoleAccessService.java | 38 ++++++++++++++ 5 files changed, 126 insertions(+) create mode 100644 src/main/java/sh/rhiobet/lalafin/access/AccessService.java create mode 100644 src/main/java/sh/rhiobet/lalafin/advent/AdventAccessService.java create mode 100644 src/main/java/sh/rhiobet/lalafin/advent/AdventConfiguration.java create mode 100644 src/main/java/sh/rhiobet/lalafin/file/FileConfiguration.java create mode 100644 src/main/java/sh/rhiobet/lalafin/file/FileRoleAccessService.java diff --git a/src/main/java/sh/rhiobet/lalafin/access/AccessService.java b/src/main/java/sh/rhiobet/lalafin/access/AccessService.java new file mode 100644 index 0000000..f782485 --- /dev/null +++ b/src/main/java/sh/rhiobet/lalafin/access/AccessService.java @@ -0,0 +1,7 @@ +package sh.rhiobet.lalafin.access; + +import sh.rhiobet.lalafin.path.Path; + +public interface AccessService { + boolean checkAccess(Path path); +} diff --git a/src/main/java/sh/rhiobet/lalafin/advent/AdventAccessService.java b/src/main/java/sh/rhiobet/lalafin/advent/AdventAccessService.java new file mode 100644 index 0000000..b1ed66c --- /dev/null +++ b/src/main/java/sh/rhiobet/lalafin/advent/AdventAccessService.java @@ -0,0 +1,49 @@ +package sh.rhiobet.lalafin.advent; + +import java.time.LocalDateTime; +import java.util.Optional; +import java.util.regex.Pattern; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import sh.rhiobet.lalafin.access.AccessService; +import sh.rhiobet.lalafin.advent.AdventConfiguration.AdventEvent; +import sh.rhiobet.lalafin.path.Path; + +@ApplicationScoped +@Named("advent") +public class AdventAccessService implements AccessService { + + @Inject + AdventConfiguration adventConfiguration; + + @Override + public boolean checkAccess(Path path) { + String pathUri = path.getURI(); + + Optional matchingAdvent = adventConfiguration.events().stream() + .filter(e -> pathUri.startsWith(e.path())) + .findFirst(); + + if (matchingAdvent.isEmpty()) { + return true; + } + + String dayString = pathUri.replaceAll( + "^" + Pattern.quote(matchingAdvent.get().path()) + "/?($1)\\.?[^.]*$", + "$1"); + try { + int day = Integer.parseInt(dayString); + LocalDateTime now = LocalDateTime.now(); + return ((now.getYear() > matchingAdvent.get().year()) + || (now.getYear() == matchingAdvent.get().year() + && now.getMonthValue() > matchingAdvent.get().month()) + || (now.getYear() == matchingAdvent.get().year() + && now.getMonthValue() == matchingAdvent.get().month() + && now.getDayOfMonth() >= day)); + } catch (NumberFormatException ignored) { + return true; + } + } +} diff --git a/src/main/java/sh/rhiobet/lalafin/advent/AdventConfiguration.java b/src/main/java/sh/rhiobet/lalafin/advent/AdventConfiguration.java new file mode 100644 index 0000000..817f478 --- /dev/null +++ b/src/main/java/sh/rhiobet/lalafin/advent/AdventConfiguration.java @@ -0,0 +1,15 @@ +package sh.rhiobet.lalafin.advent; + +import java.util.List; +import io.smallrye.config.ConfigMapping; + +@ConfigMapping(prefix = "advent") +public interface AdventConfiguration { + public List events(); + + public static interface AdventEvent { + public String path(); + public int year(); + public int month(); + } +} diff --git a/src/main/java/sh/rhiobet/lalafin/file/FileConfiguration.java b/src/main/java/sh/rhiobet/lalafin/file/FileConfiguration.java new file mode 100644 index 0000000..ecae5df --- /dev/null +++ b/src/main/java/sh/rhiobet/lalafin/file/FileConfiguration.java @@ -0,0 +1,17 @@ +package sh.rhiobet.lalafin.file; + +import java.util.List; +import java.util.Optional; +import io.smallrye.config.ConfigMapping; + +@ConfigMapping(prefix = "file") +public interface FileConfiguration { + public String directory(); + public Optional> ignored(); + public List routes(); + + public static interface Route { + public String path(); + public Optional> roles(); + } +} diff --git a/src/main/java/sh/rhiobet/lalafin/file/FileRoleAccessService.java b/src/main/java/sh/rhiobet/lalafin/file/FileRoleAccessService.java new file mode 100644 index 0000000..b02cb91 --- /dev/null +++ b/src/main/java/sh/rhiobet/lalafin/file/FileRoleAccessService.java @@ -0,0 +1,38 @@ +package sh.rhiobet.lalafin.file; + +import java.util.List; + +import io.quarkus.security.identity.SecurityIdentity; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import sh.rhiobet.lalafin.access.AccessService; +import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration; +import sh.rhiobet.lalafin.api.configuration.FileApiConfiguration.Route; +import sh.rhiobet.lalafin.path.Path; + +@ApplicationScoped +@Named("file/role") +public class FileRoleAccessService implements AccessService { + @Inject + SecurityIdentity securityIdentity; + + @Inject + FileApiConfiguration fileApiConfiguration; + + public boolean checkAccess(Path path) { + String pathUri = path.getURI(); + List matchingRoutes = fileApiConfiguration.routes().stream() + .filter(r -> pathUri.startsWith(r.path())) + .toList(); + + + if (matchingRoutes.isEmpty()) { + return false; + } + + return matchingRoutes.stream() + .allMatch(r -> r.roles().isEmpty() + || this.securityIdentity.getRoles().containsAll(r.roles().get())); + } +}