summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-10-12 17:30:51 +0200
committerLinnea Gräf <nea@nea.moe>2025-10-12 17:30:51 +0200
commitabc83ee7180e2ea4c5d65689dca48bfe88023862 (patch)
treeefebd2b984cddc1374312bec497aa7ff8cb45b44
parentad1fc4e34b80c40245d8e15b4b480e0bcc7e3104 (diff)
downloadprickly-abc83ee7180e2ea4c5d65689dca48bfe88023862.tar.gz
prickly-abc83ee7180e2ea4c5d65689dca48bfe88023862.tar.bz2
prickly-abc83ee7180e2ea4c5d65689dca48bfe88023862.zip
feat: application registration
-rw-r--r--src/main/java/moe/nea/prickly/auth/Authorizations.java9
-rw-r--r--src/main/java/moe/nea/prickly/config/Config.java28
-rw-r--r--src/main/java/moe/nea/prickly/config/ConfigCompat.java33
-rw-r--r--src/main/java/moe/nea/prickly/config/ConfigPath.java10
-rw-r--r--src/main/java/moe/nea/prickly/server/Server.java11
-rw-r--r--src/main/resources/simplelogger.properties2
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