diff options
| author | Linnea Gräf <nea@nea.moe> | 2025-10-12 17:30:51 +0200 |
|---|---|---|
| committer | Linnea Gräf <nea@nea.moe> | 2025-10-12 17:30:51 +0200 |
| commit | abc83ee7180e2ea4c5d65689dca48bfe88023862 (patch) | |
| tree | efebd2b984cddc1374312bec497aa7ff8cb45b44 | |
| parent | ad1fc4e34b80c40245d8e15b4b480e0bcc7e3104 (diff) | |
| download | prickly-abc83ee7180e2ea4c5d65689dca48bfe88023862.tar.gz prickly-abc83ee7180e2ea4c5d65689dca48bfe88023862.tar.bz2 prickly-abc83ee7180e2ea4c5d65689dca48bfe88023862.zip | |
feat: application registration
| -rw-r--r-- | src/main/java/moe/nea/prickly/auth/Authorizations.java | 9 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/config/Config.java | 28 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/config/ConfigCompat.java | 33 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/config/ConfigPath.java | 10 | ||||
| -rw-r--r-- | src/main/java/moe/nea/prickly/server/Server.java | 11 | ||||
| -rw-r--r-- | src/main/resources/simplelogger.properties | 2 |
6 files changed, 87 insertions, 6 deletions
diff --git a/src/main/java/moe/nea/prickly/auth/Authorizations.java b/src/main/java/moe/nea/prickly/auth/Authorizations.java new file mode 100644 index 0000000..8b720a5 --- /dev/null +++ b/src/main/java/moe/nea/prickly/auth/Authorizations.java @@ -0,0 +1,9 @@ +/* (C) 2025 Linnea Gräf - Licensed to everyone under the BSD 3 Clause License */ +package moe.nea.prickly.auth; + +import com.auth0.jwt.algorithms.Algorithm; +import moe.nea.prickly.config.Config; + +public class Authorizations { + public static final Algorithm JWT_ALGORITHM = Algorithm.HMAC256(Config.SECRET); +} diff --git a/src/main/java/moe/nea/prickly/config/Config.java b/src/main/java/moe/nea/prickly/config/Config.java index 4f886b1..624b1e3 100644 --- a/src/main/java/moe/nea/prickly/config/Config.java +++ b/src/main/java/moe/nea/prickly/config/Config.java @@ -1,9 +1,37 @@ /* (C) 2025 Linnea Gräf - Licensed to everyone under the BSD 3 Clause License */ package moe.nea.prickly.config; +import java.util.List; +import java.util.stream.Collectors; +import lombok.ToString; + public class Config { private static final ConfigPath ROOT = new ConfigPath("PRICKLY"); private static final ConfigPath NET = ROOT.join("NET"); + private static final ConfigPath AUTH = ROOT.join("AUTH"); public static final int PORT = NET.join("PORT").requireInt(); + public static final String COOKIE = AUTH.join("COOKIE").getString().orElse("AUTH_COOKIE"); + public static final String SECRET = AUTH.join("SECRET").requireString(); public static final String HOST = NET.join("HOST").getString().orElse("0"); + public static final List<Application> APPLICATIONS = + ROOT.join("APPLICATION").findChildren().map(Application::new).collect(Collectors.toList()); + + @ToString + public static class Application extends ConfigStruct { + Application(ConfigPath path) { + super(path); + } + + public final String SLUG = path.lastPart(); + public final String NAME = path.join("NAME").requireString(); + public final String HOMEPAGE = path.join("HOMEPAGE").requireString(); + } + + static class ConfigStruct { + protected final ConfigPath path; + + protected ConfigStruct(ConfigPath path) { + this.path = path; + } + } } diff --git a/src/main/java/moe/nea/prickly/config/ConfigCompat.java b/src/main/java/moe/nea/prickly/config/ConfigCompat.java index d574759..6c94947 100644 --- a/src/main/java/moe/nea/prickly/config/ConfigCompat.java +++ b/src/main/java/moe/nea/prickly/config/ConfigCompat.java @@ -5,8 +5,8 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Map; -import java.util.Properties; +import java.util.*; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.jspecify.annotations.Nullable; @@ -30,11 +30,32 @@ public class ConfigCompat { return (Map) properties; } - public static Map<String, String> DOTENV_FALLBACK = loadDotenv(); + public static Map<String, String> DOTENV_FALLBACK = Collections.unmodifiableMap(loadDotenv()); + public static NavigableMap<String, String> ENV; + + static { + var env = new TreeMap<String, String>(); + env.putAll(DOTENV_FALLBACK); + env.putAll(System.getenv()); + ENV = Collections.unmodifiableNavigableMap(env); + } public static @Nullable String getEnv(String key) { - var value = System.getenv(key); - if (value != null) return value; - return DOTENV_FALLBACK.get(key); + return ENV.get(key); + } + + public static Map<String, String> getAllEnvStartingWith(String prefix) { + return ENV.subMap(prefix + "_", prefix + (char) ((int) '_' + 1)); + } + + public static Set<String> getAllDirectChildren(String prefix) { + int start = prefix.length() + 1; + return getAllEnvStartingWith(prefix).keySet().stream() + .map(it -> { + int nextUnderscore = it.indexOf('_', start); + if (nextUnderscore < 0) return it.substring(start); + else return it.substring(start, nextUnderscore); + }) + .collect(Collectors.toSet()); } } diff --git a/src/main/java/moe/nea/prickly/config/ConfigPath.java b/src/main/java/moe/nea/prickly/config/ConfigPath.java index e5c8077..8c85a08 100644 --- a/src/main/java/moe/nea/prickly/config/ConfigPath.java +++ b/src/main/java/moe/nea/prickly/config/ConfigPath.java @@ -3,6 +3,7 @@ package moe.nea.prickly.config; import java.util.Optional; import java.util.function.Supplier; +import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -15,6 +16,10 @@ public record ConfigPath(String path) { return Optional.ofNullable(ConfigCompat.getEnv(path)); } + public Stream<ConfigPath> findChildren() { + return ConfigCompat.getAllDirectChildren(path).stream().map(this::join); + } + public Optional<Integer> getInt() { var str = getString(); if (str.isPresent()) @@ -50,4 +55,9 @@ public record ConfigPath(String path) { public int requireInt() { return getInt().orElseThrow(requireMessage()); } + + public String lastPart() { + int index = path.lastIndexOf('_'); + return path.substring(index + 1); + } } diff --git a/src/main/java/moe/nea/prickly/server/Server.java b/src/main/java/moe/nea/prickly/server/Server.java index 9e87128..2ff7bc9 100644 --- a/src/main/java/moe/nea/prickly/server/Server.java +++ b/src/main/java/moe/nea/prickly/server/Server.java @@ -18,6 +18,17 @@ public class Server { protected void installRoutes() { log.info("installing routes"); + for (Config.Application application : Config.APPLICATIONS) { + installApplication(application); + } + } + + protected void installApplication(Config.Application application) { + log.debug("registering application {}", application); + var prefix = "/app/" + application.SLUG; + javalin.get(prefix + "/", ctx -> { + ctx.redirect(application.HOMEPAGE); + }); } protected void configure(JavalinConfig config) { diff --git a/src/main/resources/simplelogger.properties b/src/main/resources/simplelogger.properties new file mode 100644 index 0000000..653b07c --- /dev/null +++ b/src/main/resources/simplelogger.properties @@ -0,0 +1,2 @@ +org.slf4j.simpleLogger.defaultLogLevel=info +org.slf4j.simpleLogger.log.moe.nea.prickly=debug
\ No newline at end of file |
