From 697f3cbb9c02f96db34a4e5d315b478ea2af3aaf Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 27 Jan 2026 08:44:21 +0100 Subject: [PATCH] bugfix: detecting system users while dispatching emails was broken Signed-off-by: Stephan Richter --- .../srsoftware/umbrella/core/api/UserService.java | 2 ++ .../srsoftware/umbrella/message/MessageSystem.java | 13 ++++++++++--- .../de/srsoftware/umbrella/user/UserModule.java | 7 +++++++ .../de/srsoftware/umbrella/user/api/UserDb.java | 1 + .../srsoftware/umbrella/user/sqlite/SqliteDB.java | 1 - 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/api/UserService.java b/core/src/main/java/de/srsoftware/umbrella/core/api/UserService.java index fda1ef8b..ae5769e4 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/api/UserService.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/api/UserService.java @@ -3,6 +3,7 @@ package de.srsoftware.umbrella.core.api; import com.sun.net.httpserver.HttpExchange; import de.srsoftware.umbrella.core.exceptions.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; @@ -16,6 +17,7 @@ public interface UserService { Map list(Integer start, Integer limit, Collection ids) throws UmbrellaException; Session load(Token token) throws UmbrellaException; UmbrellaUser load(Session session) throws UmbrellaException; + Optional load(EmailAddress email) throws UmbrellaException; UmbrellaUser loadUser(long userId) throws UmbrellaException; Optional loadUser(Optional sessionToken) throws UmbrellaException; Optional loadUser(HttpExchange ex) throws UmbrellaException; diff --git a/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java b/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java index 6581157c..1a42cb94 100644 --- a/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java +++ b/messages/src/main/java/de/srsoftware/umbrella/message/MessageSystem.java @@ -2,6 +2,7 @@ package de.srsoftware.umbrella.message; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; +import static de.srsoftware.umbrella.core.ModuleRegistry.userService; import static de.srsoftware.umbrella.core.constants.Constants.TIME_FORMATTER; import static de.srsoftware.umbrella.core.constants.Constants.UTF8; import static de.srsoftware.umbrella.core.constants.Field.*; @@ -112,7 +113,7 @@ public class MessageSystem extends BaseHandler implements PostBox, EventListener addCors(ex); try { Optional token = SessionToken.from(ex).map(Token::of); - var user = ModuleRegistry.userService().loadUser(token); + var user = userService().loadUser(token); if (user.isEmpty()) return unauthorized(ex); var id = path.pop(); return switch (id){ @@ -139,7 +140,7 @@ public class MessageSystem extends BaseHandler implements PostBox, EventListener addCors(ex); try { Optional token = SessionToken.from(ex).map(Token::of); - var user = ModuleRegistry.userService().loadUser(token); + var user = userService().loadUser(token); if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head){ @@ -210,7 +211,7 @@ public class MessageSystem extends BaseHandler implements PostBox, EventListener private synchronized void processMessages(Integer scheduledHour) { LOG.log(INFO,"Running {0}…",scheduledHour == null ? "instantly" : "scheduled at "+scheduledHour); - var dueRecipients = queue.getReceivers().filter(uu -> sendAt(uu,scheduledHour)).toList(); + var dueRecipients = queue.getReceivers().map(this::toUmbrellaUser).filter(uu -> sendAt(uu,scheduledHour)).toList(); var date = new Date(); @@ -236,6 +237,12 @@ public class MessageSystem extends BaseHandler implements PostBox, EventListener if (scheduledHour != null) new SubmissionTask(scheduledHour).schedule(); } + private User toUmbrellaUser(User user) { + var umbrellaUser = userService().load(user.email()); + if (umbrellaUser.isPresent()) return umbrellaUser.get(); + return user; + } + private boolean sendMessage(HttpExchange ex, UmbrellaUser user, Envelope envelope) throws IOException { var message = envelope.message(); if (message instanceof TranslatableMessage tm) message = tm.translate(user.language()); diff --git a/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java b/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java index 798fd786..955a46e7 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java @@ -147,6 +147,13 @@ public class UserModule extends BaseHandler implements UserService { return users.load(session); } + public Optional load(EmailAddress email){ + try { + return Optional.of(users.load(email)); + } catch (UmbrellaException ignored){ + return empty(); + } + } @Override public UmbrellaUser loadUser(long userId) throws UmbrellaException { diff --git a/user/src/main/java/de/srsoftware/umbrella/user/api/UserDb.java b/user/src/main/java/de/srsoftware/umbrella/user/api/UserDb.java index b7dada5a..284d80a4 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/api/UserDb.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/api/UserDb.java @@ -10,6 +10,7 @@ import de.srsoftware.umbrella.user.model.DbUser; import de.srsoftware.umbrella.user.model.Password; import java.util.Collection; import java.util.Map; +import java.util.Optional; public interface UserDb { diff --git a/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java b/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java index a298bc36..420bcb20 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java @@ -397,7 +397,6 @@ CREATE TABLE IF NOT EXISTS {0} ( } if (user == null) throw unauthorized(FAILED_TO_LOAD_OBJECT_BY_ID, OBJECT,t(Text.USER), ID,key); return user; - } @Override