Mask sensitive structural replacements

This commit is contained in:
2026-10-09 12:22:36 +00:00
parent ade5d6a273
commit e5dddef204
3 changed files with 183 additions and 15 deletions

View File

@@ -7,13 +7,27 @@ import (
)
type pairedDiffSnapshot struct {
left *document.Node
right *document.Node
leftRedacted bool
rightRedacted bool
left *document.Node
right *document.Node
leftRedacted bool
rightRedacted bool
requiresFallback bool
}
func preparePairedDiffSnapshot(left, right *document.Node, path Path, sensitivity *diffSensitivity) (pairedDiffSnapshot, bool) {
paired, supported := preparePairedDiffNodes(left, right, path, sensitivity)
if !supported || !paired.requiresFallback {
return paired, supported
}
return pairedDiffSnapshot{
left: redactedDiffNode(left),
right: redactedDiffNode(right),
leftRedacted: left != nil,
rightRedacted: right != nil,
}, true
}
func preparePairedDiffNodes(left, right *document.Node, path Path, sensitivity *diffSensitivity) (pairedDiffSnapshot, bool) {
if left == nil && right == nil {
return pairedDiffSnapshot{}, true
}
@@ -26,7 +40,10 @@ func preparePairedDiffSnapshot(left, right *document.Node, path Path, sensitivit
}, true
}
if left != nil && right != nil && left.Kind != right.Kind {
return pairedDiffSnapshot{}, false
if sensitivity.hasStrictDescendant(path.String()) {
return pairedDiffSnapshot{requiresFallback: true}, true
}
return pairedDiffSnapshot{left: left, right: right}, true
}
kind := document.Null
@@ -42,7 +59,7 @@ func preparePairedDiffSnapshot(left, right *document.Node, path Path, sensitivit
return preparePairedDiffSequence(left, right, path, sensitivity)
default:
if sensitivity.hasStrictDescendant(path.String()) {
return pairedDiffSnapshot{}, false
return pairedDiffSnapshot{requiresFallback: true}, true
}
return pairedDiffSnapshot{left: left, right: right}, true
}
@@ -87,10 +104,13 @@ func preparePairedDiffMapping(left, right *document.Node, path Path, sensitivity
if rightPresent {
rightChild = rightEntry.Value
}
child, supported := preparePairedDiffSnapshot(leftChild, rightChild, path.Key(key), sensitivity)
child, supported := preparePairedDiffNodes(leftChild, rightChild, path.Key(key), sensitivity)
if !supported {
return pairedDiffSnapshot{}, false
}
if child.requiresFallback {
return pairedDiffSnapshot{requiresFallback: true}, true
}
if leftPresent {
leftEntry.Value = child.left
leftCopy.Mapping = append(leftCopy.Mapping, leftEntry)
@@ -135,10 +155,13 @@ func preparePairedDiffSequence(left, right *document.Node, path Path, sensitivit
if right != nil && index < len(right.Sequence) {
rightChild = right.Sequence[index]
}
child, supported := preparePairedDiffSnapshot(leftChild, rightChild, path.Index(index), sensitivity)
child, supported := preparePairedDiffNodes(leftChild, rightChild, path.Index(index), sensitivity)
if !supported {
return pairedDiffSnapshot{}, false
}
if child.requiresFallback {
return pairedDiffSnapshot{requiresFallback: true}, true
}
if left != nil && index < len(left.Sequence) {
leftCopy.Sequence[index] = child.left
}