Skip to content

Commit 0c4f653

Browse files
committed
feat(core): pause/resume protocol with ExecutionPhase lifecycle
Move LogSanitizer to core. Fix github-advanced-security warning Resolve: #71 Signed-off-by: Aleksandr Suvorov <asuvorov@hensu.io>
1 parent 1086e72 commit 0c4f653

13 files changed

Lines changed: 21 additions & 16 deletions

File tree

hensu-core/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,8 @@ hensu-core/src/main/java/io/hensu/core/
392392
├── template/ # {variable} placeholder resolution
393393
├── util/
394394
│ ├── AgentOutputValidator.java # LLM output safety checks (control chars, Unicode tricks, size)
395-
│ └── JsonUtil.java # Dependency-free JSON extraction utilities
395+
│ ├── JsonUtil.java # Dependency-free JSON extraction utilities
396+
│ └── LogSanitizer.java # Strips CR/LF from logged values to prevent log injection
396397
└── state/ # Execution state and persistence
397398
├── HensuState.java # Mutable runtime state during execution
398399
├── HensuSnapshot.java # Immutable checkpoint record for persistence

hensu-core/src/main/java/io/hensu/core/execution/pipeline/ReviewPostProcessor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.hensu.core.review.ReviewOutcome;
1212
import io.hensu.core.state.ExecutionPhase;
1313
import io.hensu.core.state.HensuState;
14+
import io.hensu.core.util.LogSanitizer;
1415
import io.hensu.core.workflow.node.StandardNode;
1516
import java.util.Map;
1617
import java.util.logging.Logger;
@@ -101,7 +102,11 @@ private ProcessorOutcome handleDecision(
101102
case ReviewDecision.Approve approve -> handleApprove(approve, context);
102103
case ReviewDecision.Backtrack backtrack -> handleBacktrack(backtrack, nodeId, context);
103104
case ReviewDecision.Reject reject -> {
104-
logger.info("Rejecting node: " + nodeId + " due to: " + reject.getReason());
105+
logger.info(
106+
"Rejecting node: "
107+
+ LogSanitizer.sanitize(nodeId)
108+
+ " due to: "
109+
+ LogSanitizer.sanitize(reject.getReason()));
105110
yield ProcessorOutcome.terminal(
106111
new ExecutionResult.Rejected(reject.getReason(), context.state()));
107112
}

hensu-server/src/main/java/io/hensu/server/validation/LogSanitizer.java renamed to hensu-core/src/main/java/io/hensu/core/util/LogSanitizer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.hensu.server.validation;
1+
package io.hensu.core.util;
22

33
/// Strips control characters from strings to prevent log injection.
44
///
@@ -7,9 +7,9 @@
77
/// allowing attackers to forge log entries.
88
///
99
/// Apply to any user-derived value before passing it to a logger:
10-
/// ```
11-
/// LOG.infov("Processing: id={0}", LogSanitizer.sanitize(userInput));
12-
/// ```
10+
/// {@snippet :
11+
/// logger.info("Processing: id=" + LogSanitizer.sanitize(userInput));
12+
/// }
1313
public final class LogSanitizer {
1414

1515
private LogSanitizer() {}

hensu-server/src/test/java/io/hensu/server/validation/LogSanitizerTest.java renamed to hensu-core/src/test/java/io/hensu/core/util/LogSanitizerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.hensu.server.validation;
1+
package io.hensu.core.util;
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

hensu-server/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,6 @@ hensu-server/
403403
│ │ ├── ValidMessageValidator # Size-limit + control-character validator
404404
│ │ ├── ValidWorkflow.java # Custom constraint for Workflow bodies
405405
│ │ ├── ValidWorkflowValidator.java # Deep-validates workflow object graph
406-
│ │ ├── LogSanitizer.java # Strips CR/LF for log injection prevention
407406
│ │ ├── IllegalArgumentExceptionMapper.java # Maps IllegalArgumentException → 400
408407
│ │ └── ConstraintViolationExceptionMapper.java # Global 400 error mapper
409408
│ ├── config/ # CDI configuration

hensu-server/src/main/java/io/hensu/server/api/ExecutionEventResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package io.hensu.server.api;
22

3+
import io.hensu.core.util.LogSanitizer;
34
import io.hensu.server.security.RequestTenantResolver;
45
import io.hensu.server.streaming.ExecutionEvent;
56
import io.hensu.server.streaming.ExecutionEventBroadcaster;
6-
import io.hensu.server.validation.LogSanitizer;
77
import io.hensu.server.validation.ValidId;
88
import io.smallrye.mutiny.Multi;
99
import jakarta.inject.Inject;

hensu-server/src/main/java/io/hensu/server/api/ExecutionResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.hensu.server.api;
22

33
import io.hensu.core.resume.ResumeInput;
4+
import io.hensu.core.util.LogSanitizer;
45
import io.hensu.server.security.RequestTenantResolver;
5-
import io.hensu.server.validation.LogSanitizer;
66
import io.hensu.server.validation.ValidId;
77
import io.hensu.server.workflow.ExecutionNotFoundException;
88
import io.hensu.server.workflow.ExecutionOutput;

hensu-server/src/main/java/io/hensu/server/api/McpGatewayResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.hensu.server.api;
22

3+
import io.hensu.core.util.LogSanitizer;
34
import io.hensu.server.mcp.McpSessionManager;
4-
import io.hensu.server.validation.LogSanitizer;
55
import io.hensu.server.validation.ValidId;
66
import io.hensu.server.validation.ValidMessage;
77
import io.smallrye.mutiny.Multi;

hensu-server/src/main/java/io/hensu/server/api/WorkflowResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.hensu.server.api;
22

3+
import io.hensu.core.util.LogSanitizer;
34
import io.hensu.core.workflow.Workflow;
45
import io.hensu.server.security.RequestTenantResolver;
5-
import io.hensu.server.validation.LogSanitizer;
66
import io.hensu.server.validation.ValidId;
77
import io.hensu.server.validation.ValidWorkflow;
88
import io.hensu.server.workflow.WorkflowNotFoundException;

hensu-server/src/main/java/io/hensu/server/mcp/McpSessionManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.hensu.server.mcp;
22

3-
import io.hensu.server.validation.LogSanitizer;
3+
import io.hensu.core.util.LogSanitizer;
44
import io.smallrye.mutiny.Multi;
55
import io.smallrye.mutiny.Uni;
66
import io.smallrye.mutiny.subscription.MultiEmitter;

0 commit comments

Comments
 (0)