@@ -18,7 +18,6 @@ import de.srsoftware.logging.ColorLogger;
|
|||||||
import de.srsoftware.oidc.api.*;
|
import de.srsoftware.oidc.api.*;
|
||||||
import de.srsoftware.oidc.api.data.User;
|
import de.srsoftware.oidc.api.data.User;
|
||||||
import de.srsoftware.oidc.backend.*;
|
import de.srsoftware.oidc.backend.*;
|
||||||
import de.srsoftware.oidc.datastore.file.FileStore;
|
|
||||||
import de.srsoftware.oidc.datastore.file.FileStoreProvider;
|
import de.srsoftware.oidc.datastore.file.FileStoreProvider;
|
||||||
import de.srsoftware.oidc.datastore.file.PlaintextKeyStore;
|
import de.srsoftware.oidc.datastore.file.PlaintextKeyStore;
|
||||||
import de.srsoftware.oidc.datastore.file.UuidHasher;
|
import de.srsoftware.oidc.datastore.file.UuidHasher;
|
||||||
@@ -28,6 +27,7 @@ import de.srsoftware.oidc.web.StaticPages;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
@@ -49,60 +49,27 @@ public class Application {
|
|||||||
private static final String WELL_KNOWN = "/.well-known";
|
private static final String WELL_KNOWN = "/.well-known";
|
||||||
private static System.Logger LOG = new ColorLogger("Application").setLogLevel(DEBUG);
|
private static System.Logger LOG = new ColorLogger("Application").setLogLevel(DEBUG);
|
||||||
private static ConnectionProvider connectionProvider = new ConnectionProvider();
|
private static ConnectionProvider connectionProvider = new ConnectionProvider();
|
||||||
public static void main(String[] args) throws Exception {
|
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
var argMap = map(args);
|
var argMap = map(args);
|
||||||
Optional<Path> basePath = argMap.get(BASE_PATH) instanceof Path p ? Optional.of(p) : empty();
|
Optional<Path> basePath = argMap.get(BASE_PATH) instanceof Path p ? Optional.of(p) : empty();
|
||||||
var configFile = (argMap.get(CONFIG_PATH) instanceof Path p ? p : configDir(APP_NAME).resolve("config.json")).toFile();
|
var configFile = (argMap.get(CONFIG_PATH) instanceof Path p ? p : configDir(APP_NAME).resolve("config.json")).toFile();
|
||||||
var config = new Configuration(configFile);
|
var config = new Configuration(configFile);
|
||||||
var defaultConfigDir = configDir(APP_NAME);
|
var passHasher = new UuidHasher();
|
||||||
var passwordHasher = new UuidHasher();
|
var firstHash = passHasher.hash(FIRST_USER_PASS, FIRST_UUID);
|
||||||
var firstHash = passwordHasher.hash(FIRST_USER_PASS, FIRST_UUID);
|
|
||||||
var firstUser = new User(FIRST_USER, firstHash, FIRST_USER, "%s@internal".formatted(FIRST_USER), FIRST_UUID).add(MANAGE_CLIENTS, MANAGE_PERMISSIONS, MANAGE_SMTP, MANAGE_USERS);
|
var firstUser = new User(FIRST_USER, firstHash, FIRST_USER, "%s@internal".formatted(FIRST_USER), FIRST_UUID).add(MANAGE_CLIENTS, MANAGE_PERMISSIONS, MANAGE_SMTP, MANAGE_USERS);
|
||||||
|
|
||||||
|
|
||||||
|
FileStoreProvider fileStoreProvider = new FileStoreProvider(passHasher);
|
||||||
|
var defaultConfigDir = configDir(APP_NAME);
|
||||||
var defaultFile = defaultConfigDir.resolve("data.json");
|
var defaultFile = defaultConfigDir.resolve("data.json");
|
||||||
var keyStorageLocation = new File(config.getOrDefault("key_storage", defaultConfigDir.resolve("keys")));
|
var userService = setupUserService(config, defaultFile, fileStoreProvider).init(firstUser);
|
||||||
KeyStorage keyStore;
|
var sessionService = setupSessionService(config, defaultFile, fileStoreProvider);
|
||||||
if ((keyStorageLocation.exists() && keyStorageLocation.isDirectory()) || !keyStorageLocation.getName().contains(".")) {
|
var mailConfig = setupMailConfig(config, defaultFile, fileStoreProvider);
|
||||||
keyStore = new PlaintextKeyStore(keyStorageLocation.toPath());
|
var keyStore = setupKeyStore(config, defaultConfigDir);
|
||||||
} else { // SQLite
|
|
||||||
var conn = connectionProvider.get(keyStorageLocation);
|
|
||||||
keyStore = new SqliteKeyStore(conn);
|
|
||||||
}
|
|
||||||
|
|
||||||
KeyManager keyManager = new RotatingKeyManager(keyStore);
|
KeyManager keyManager = new RotatingKeyManager(keyStore);
|
||||||
FileStoreProvider fileStoreProvider = new FileStoreProvider(passwordHasher);
|
var authService = setupAuthService(config, defaultFile, fileStoreProvider);
|
||||||
|
var clientService = setupClientService(config, defaultFile, fileStoreProvider);
|
||||||
var userStorageLocation = new File(config.getOrDefault("user_storage",defaultFile));
|
|
||||||
var userService = switch (extension(userStorageLocation).toLowerCase()){
|
|
||||||
case "db", "sqlite", "sqlite3" -> new SqliteUserService(connectionProvider.get(userStorageLocation));
|
|
||||||
default -> fileStoreProvider.get(userStorageLocation);
|
|
||||||
};
|
|
||||||
userService.init(firstUser);
|
|
||||||
|
|
||||||
var mailConfigLocation = new File(config.getOrDefault("mail_config_storage",defaultFile));
|
|
||||||
var mailConfig = switch (extension(mailConfigLocation)){
|
|
||||||
case "db", "sqlite", "sqlite3" -> new SqliteMailConfig(connectionProvider.get(userStorageLocation));
|
|
||||||
default -> fileStoreProvider.get(mailConfigLocation);
|
|
||||||
};
|
|
||||||
|
|
||||||
var sessionStore = new File(config.getOrDefault("session_storage",defaultFile));
|
|
||||||
var sessionService = switch (extension(sessionStore)){
|
|
||||||
case "db", "sqlite", "sqlite3" -> new SqliteSessionService(connectionProvider.get(sessionStore));
|
|
||||||
default -> fileStoreProvider.get(sessionStore);
|
|
||||||
};
|
|
||||||
|
|
||||||
var authServiceLocation = new File(config.getOrDefault("auth_store",defaultFile));
|
|
||||||
AuthorizationService authService = switch (extension(authServiceLocation)){
|
|
||||||
case "db", "sqlite", "sqlite3" -> new SqliteAuthService(connectionProvider.get(sessionStore));
|
|
||||||
default -> fileStoreProvider.get(sessionStore);
|
|
||||||
};
|
|
||||||
|
|
||||||
var clientStore = new File(config.getOrDefault("client_store",defaultFile));
|
|
||||||
ClientService clientService = switch (extension(clientStore)){
|
|
||||||
case "db", "sqlite", "sqlite3" -> new SqliteClientService(connectionProvider.get(sessionStore));
|
|
||||||
default -> fileStoreProvider.get(sessionStore);
|
|
||||||
};
|
|
||||||
|
|
||||||
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
|
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
|
||||||
var staticPages = (StaticPages) new StaticPages(basePath).bindPath(STATIC_PATH, FAVICON).on(server);
|
var staticPages = (StaticPages) new StaticPages(basePath).bindPath(STATIC_PATH, FAVICON).on(server);
|
||||||
new Forward(INDEX).bindPath(ROOT).on(server);
|
new Forward(INDEX).bindPath(ROOT).on(server);
|
||||||
@@ -117,6 +84,56 @@ public class Application {
|
|||||||
server.start();
|
server.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ClientService setupClientService(Configuration config, Path defaultFile, FileStoreProvider fileStoreProvider) {
|
||||||
|
var clientStore = new File(config.getOrDefault("client_store", defaultFile));
|
||||||
|
return switch (extension(clientStore)) {
|
||||||
|
case "db", "sqlite", "sqlite3" -> new SqliteClientService(connectionProvider.get(clientStore));
|
||||||
|
default -> fileStoreProvider.get(clientStore);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static AuthorizationService setupAuthService(Configuration config, Path defaultFile, FileStoreProvider fileStoreProvider) {
|
||||||
|
var authServiceLocation = new File(config.getOrDefault("auth_store",defaultFile));
|
||||||
|
return switch (extension(authServiceLocation)){
|
||||||
|
case "db", "sqlite", "sqlite3" -> new SqliteAuthService(connectionProvider.get(authServiceLocation));
|
||||||
|
default -> fileStoreProvider.get(authServiceLocation);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static SessionService setupSessionService(Configuration config, Path defaultFile, FileStoreProvider fileStoreProvider) {
|
||||||
|
var sessionStore = new File(config.getOrDefault("session_storage",defaultFile));
|
||||||
|
return switch (extension(sessionStore)){
|
||||||
|
case "db", "sqlite", "sqlite3" -> new SqliteSessionService(connectionProvider.get(sessionStore));
|
||||||
|
default -> fileStoreProvider.get(sessionStore);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MailConfig setupMailConfig(Configuration config, Path defaultFile, FileStoreProvider fileStoreProvider) {
|
||||||
|
var mailConfigLocation = new File(config.getOrDefault("mail_config_storage",defaultFile));
|
||||||
|
return switch (extension(mailConfigLocation)){
|
||||||
|
case "db", "sqlite", "sqlite3" -> new SqliteMailConfig(connectionProvider.get(mailConfigLocation));
|
||||||
|
default -> fileStoreProvider.get(mailConfigLocation);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static UserService setupUserService(Configuration config, Path defaultFile, FileStoreProvider fileStoreProvider) {
|
||||||
|
var userStorageLocation = new File(config.getOrDefault("user_storage",defaultFile));
|
||||||
|
return switch (extension(userStorageLocation).toLowerCase()){
|
||||||
|
case "db", "sqlite", "sqlite3" -> new SqliteUserService(connectionProvider.get(userStorageLocation));
|
||||||
|
default -> fileStoreProvider.get(userStorageLocation);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static KeyStorage setupKeyStore(Configuration config, Path defaultConfigDir) throws SQLException {
|
||||||
|
var keyStorageLocation = new File(config.getOrDefault("key_storage", defaultConfigDir.resolve("keys")));
|
||||||
|
if ((keyStorageLocation.exists() && keyStorageLocation.isDirectory()) || !keyStorageLocation.getName().contains(".")) {
|
||||||
|
return new PlaintextKeyStore(keyStorageLocation.toPath());
|
||||||
|
} else { // SQLite
|
||||||
|
var conn = connectionProvider.get(keyStorageLocation);
|
||||||
|
return new SqliteKeyStore(conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static Map<String, Object> map(String[] args) {
|
private static Map<String, Object> map(String[] args) {
|
||||||
var tokens = new ArrayList<>(List.of(args));
|
var tokens = new ArrayList<>(List.of(args));
|
||||||
var map = new HashMap<String, Object>();
|
var map = new HashMap<String, Object>();
|
||||||
@@ -142,5 +159,5 @@ public class Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user