major refactoring: working towards more interface-implementation splitting

This commit is contained in:
2025-07-10 10:56:03 +02:00
parent d68dc991d0
commit 21812d2b42
22 changed files with 168 additions and 84 deletions

View File

@@ -12,6 +12,7 @@ public class Constants {
public static final String CLIENT_ID = "client_id";
public static final String CLIENT_SECRET = "client_secret";
public static final String CODE = "code";
public static final String CONFIG_DATABASE = "umbrella.modules.user.database";
public static final String DB_VERSION = "user_db_version";

View File

@@ -4,6 +4,7 @@ package de.srsoftware.umbrella.user;
import static de.srsoftware.tools.MimeType.MIME_FORM_URL;
import static de.srsoftware.tools.Optionals.*;
import static de.srsoftware.tools.Strings.uuid;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.Paths.LIST;
import static de.srsoftware.umbrella.core.Paths.LOGOUT;
@@ -24,13 +25,14 @@ import static java.time.temporal.ChronoUnit.DAYS;
import static java.util.Optional.empty;
import com.sun.net.httpserver.HttpExchange;
import de.srsoftware.configuration.Configuration;
import de.srsoftware.tools.Path;
import de.srsoftware.tools.SessionToken;
import de.srsoftware.umbrella.core.BaseHandler;
import de.srsoftware.umbrella.core.Token;
import de.srsoftware.umbrella.core.UmbrellaException;
import de.srsoftware.umbrella.core.api.UserHelper;
import de.srsoftware.umbrella.core.api.UserService;
import de.srsoftware.umbrella.core.model.EmailAddress;
import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.message.MessageSystem;
import de.srsoftware.umbrella.message.model.Envelope;
@@ -38,6 +40,9 @@ import de.srsoftware.umbrella.message.model.Message;
import de.srsoftware.umbrella.user.api.LoginServiceDb;
import de.srsoftware.umbrella.user.api.UserDb;
import de.srsoftware.umbrella.user.model.*;
import de.srsoftware.umbrella.user.model.DbUser;
import de.srsoftware.umbrella.user.model.Password;
import de.srsoftware.umbrella.user.sqlite.SqliteDB;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.*;
@@ -53,7 +58,7 @@ import org.jose4j.keys.resolvers.HttpsJwksVerificationKeyResolver;
import org.json.JSONObject;
public class UserModule extends BaseHandler implements UserHelper {
public class UserModule extends BaseHandler implements UserService {
private record State(LoginService loginService, JSONObject config){
@@ -78,13 +83,17 @@ public class UserModule extends BaseHandler implements UserHelper {
}
}
public UserModule(UserDb userDb, LoginServiceDb loginDb, MessageSystem messageSystem){
logins = loginDb;
public UserModule(Configuration config, MessageSystem messageSystem) throws UmbrellaException {
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> new UmbrellaException(ERROR_MISSING_CONFIG,CONFIG_DATABASE));
// may be splitted in separate db files later
logins = new SqliteDB(connect(dbFile));
messages = messageSystem;
users = userDb;
users = new SqliteDB(connect(dbFile));
}
public UserDb userDb(){
return users;
}
private boolean deleteOIDC(HttpExchange ex, UmbrellaUser user, Path path) throws IOException {
var head = path.pop();
@@ -126,6 +135,11 @@ public class UserModule extends BaseHandler implements UserHelper {
}
}
@Override
public UmbrellaUser loadUser(long userId) throws UmbrellaException {
return users.load(userId);
}
public Optional<UmbrellaUser> loadUser(Optional<Token> sessionToken) throws UmbrellaException {
if (sessionToken.isEmpty()) return empty();
var session = users.load(sessionToken.get());

View File

@@ -1,13 +1,13 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.user.api;
import de.srsoftware.umbrella.core.Token;
import de.srsoftware.umbrella.core.UmbrellaException;
import de.srsoftware.umbrella.core.model.EmailAddress;
import de.srsoftware.umbrella.core.model.Session;
import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.user.model.DbUser;
import de.srsoftware.umbrella.user.model.Password;
import de.srsoftware.umbrella.user.model.Session;
import java.util.List;
public interface UserDb {

View File

@@ -1,18 +0,0 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.user.model;
import de.srsoftware.tools.SessionToken;
import de.srsoftware.umbrella.core.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.time.Instant;
/* © SRSoftware 2025 */
public record Session(UmbrellaUser user, Token token, Instant expiration) {
public Session extended(Instant newExpiration) {
return new Session(user,token,newExpiration);
}
public SessionToken cookie() {
return new SessionToken(token.toString(),"/",expiration,true);
}
}

View File

@@ -12,15 +12,17 @@ import static java.text.MessageFormat.format;
import de.srsoftware.tools.PasswordHasher;
import de.srsoftware.tools.jdbc.Query;
import de.srsoftware.umbrella.core.Token;
import de.srsoftware.umbrella.core.UmbrellaException;
import de.srsoftware.umbrella.core.model.EmailAddress;
import de.srsoftware.umbrella.core.model.Session;
import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.user.BadHasher;
import de.srsoftware.umbrella.user.api.LoginServiceDb;
import de.srsoftware.umbrella.user.api.UserDb;
import de.srsoftware.umbrella.user.model.*;
import de.srsoftware.umbrella.user.model.Session;
import de.srsoftware.umbrella.user.model.DbUser;
import de.srsoftware.umbrella.user.model.Password;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.ResultSet;