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())); + } +}