Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
6e7d9d7
fix(config): refuse a save that would write redacted secrets back
SebTardif Sep 24, 2026
1bb4cc5
ci: retrigger after setup E2E sqlite lock flake
SebTardif Sep 24, 2026
a8418f9
fix(config): block a redacted placeholder even after the field was ed…
SebTardif Sep 24, 2026
01d2f19
fix(config): translate the blocked-save sentence
SebTardif Sep 25, 2026
fb1a344
fix(config): let unrelated saves skip untouched redaction masks
SebTardif Sep 27, 2026
1624842
fix(config): allow a save when a normal list contains mask text
SebTardif Sep 27, 2026
5a31026
fix(config): block masked apiKey values inside arrays
SebTardif Sep 28, 2026
024b62b
fix(config): omit untouched masked array credentials instead of block…
SebTardif Sep 28, 2026
5ddef72
fix(config): keep a safe save when a masked secret sits in an array w…
SebTardif Sep 29, 2026
46e8d07
fix(config): keep parent-object edits and literal mask text
SebTardif Sep 30, 2026
e1931c4
ci: retrigger after tray UI host hang
SebTardif Sep 30, 2026
b6e8060
ci: retrigger after output-drain timing flake
SebTardif Sep 30, 2026
b8e8208
ci: retrigger after startup timeouts
SebTardif Sep 30, 2026
f8ad6a6
test(config): lock parent-object saves that keep a rename and a new mask
SebTardif Oct 1, 2026
14d286a
fix(config): refuse a new credential mask typed into a parent object
SebTardif Oct 1, 2026
234d3ff
fix(config): keep a parent edit that changes one mask literal to another
SebTardif Oct 1, 2026
48cf3fb
ci: retrigger after UI test host hang
SebTardif Oct 1, 2026
6f85f83
fix(config): compare loaded and submitted masks without trimming
SebTardif Oct 1, 2026
b810b38
fix(config): match id-keyed account rows before omitting a mask
SebTardif Oct 1, 2026
6aa7a65
ci: retrigger after UI test host hang
SebTardif Oct 1, 2026
89ea68b
fix(config): refuse a new mask and follow literal config keys
SebTardif Oct 1, 2026
da65bba
ci: retrigger after workspace navigation flake
SebTardif Oct 1, 2026
ffef70b
fix(config): classify non-id arrays without splitting JSON keys
SebTardif Oct 1, 2026
15d0ee4
fix(config): drop a non-id array from the object that owns it
SebTardif Oct 1, 2026
5fa003d
fix(config): omit the gateway redaction mask on an unrelated save
SebTardif Oct 6, 2026
fffc847
fix(config): keep the gateway mask out of the Channels blocker
SebTardif Oct 6, 2026
6ad6ed0
fix(config): refuse a direct edit that replaces the gateway mask
SebTardif Oct 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions src/OpenClaw.Shared/ChannelConfigPatchBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,19 @@ public static class ChannelConfigPatchBuilder
"********",
};

/// <summary>
/// Exact mask <c>config.get</c> substitutes for a stored secret.
/// The gateway restores this value before it writes, so a Channels save
/// must still send it. It is not a <see cref="IsRedactionSentinel"/> hit.
/// </summary>
public const string NativeGatewayRedactionMask = "__OPENCLAW_REDACTED__";

public static bool IsRedactionSentinel(string? value) =>
value != null && RedactionSentinels.Contains(value.Trim());

public static bool IsNativeGatewayRedactionMask(string? value) =>
string.Equals(value, NativeGatewayRedactionMask, StringComparison.Ordinal);

/// <summary>
/// Build a patched full-config from the cached config and a list of
/// per-field updates for one channel.
Expand Down Expand Up @@ -168,8 +181,7 @@ public static ChannelPatchBuildResult BuildPatch(
}
else if (el.ValueKind == JsonValueKind.String)
{
var v = el.GetString();
if (v != null && RedactionSentinels.Contains(v.Trim()))
if (IsRedactionSentinel(el.GetString()))
return path;
}
return null;
Expand Down
18 changes: 18 additions & 0 deletions src/OpenClaw.Tray.WinUI/Pages/ConfigPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,24 @@ private async Task OnSaveAsync()
try
{
var updated = ConfigEditorModel.ApplyChanges(saveBase.Root, _pendingChanges);
var blockedPath = ConfigEditorModel.FindUneditedRedactionSentinel(
updated,
_pendingChanges.Keys,
saveBase.Root);
if (blockedPath != null)
{
ShowStatus(
L("ConfigPage_StatusSaveFailedTitle"),
Lf("ConfigPage_StatusSaveBlockedSentinelFormat", blockedPath),
InfoBarSeverity.Error);
return;
}

updated = ConfigEditorModel.OmitUntouchedRedactionSentinels(
updated,
_pendingChanges.Keys,
saveBase.Root);

var result = await client.PatchConfigDetailedAsync(updated, saveBase.BaseHash);
if (!result.Ok)
{
Expand Down
Loading
Loading