Project history and sensitivity paths
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
package engine
|
||||
|
||||
import "gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
import (
|
||||
"slices"
|
||||
|
||||
"gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
||||
)
|
||||
|
||||
type secretDependency struct {
|
||||
target Path
|
||||
@@ -13,18 +17,40 @@ func classifySecretPaths(schema *schemaDescriptor, predicate func(Path) bool, me
|
||||
|
||||
func classifySecretPathsWithEvidence(schema *schemaDescriptor, predicate func(Path) bool, metadata Metadata, final *document.Node, applications []historyApplication, evidence []*sourceVersionEvidence, projections ...*document.Node) map[string]bool {
|
||||
paths := make(map[string]Path)
|
||||
candidateShapes := make(map[string][]Path)
|
||||
var candidates []Path
|
||||
addCandidate := func(path Path) {
|
||||
pointer := path.String()
|
||||
for _, prior := range candidateShapes[pointer] {
|
||||
if slices.Equal(path.segments, prior.segments) {
|
||||
return
|
||||
}
|
||||
}
|
||||
cloned := path.clone()
|
||||
candidateShapes[pointer] = append(candidateShapes[pointer], cloned)
|
||||
candidates = append(candidates, cloned)
|
||||
}
|
||||
for _, application := range applications {
|
||||
walkDocument(application.value, application.path, func(path Path, _ *document.Node) {
|
||||
walkHistoryApplication(application, func(_ Path, path Path, _ *document.Node) {
|
||||
if len(application.sequences) != 0 {
|
||||
addCandidate(path)
|
||||
} else if parsed, err := ParsePath(path.String()); err == nil {
|
||||
addCandidate(parsed)
|
||||
}
|
||||
addSecretPath(paths, path.String())
|
||||
})
|
||||
}
|
||||
var dependencies []secretDependency
|
||||
for pointer, history := range metadata.history {
|
||||
addSecretPath(paths, pointer)
|
||||
if path, err := ParsePath(pointer); err == nil {
|
||||
addCandidate(path)
|
||||
}
|
||||
for _, change := range history {
|
||||
paths[change.Path.String()] = change.Path.clone()
|
||||
for _, dependency := range change.Dependencies {
|
||||
paths[dependency.String()] = dependency.clone()
|
||||
addCandidate(dependency)
|
||||
dependencies = append(dependencies, secretDependency{
|
||||
target: change.Path.clone(), dependency: dependency.clone(),
|
||||
})
|
||||
@@ -36,8 +62,10 @@ func classifySecretPathsWithEvidence(schema *schemaDescriptor, predicate func(Pa
|
||||
if operation.control != nil {
|
||||
control := operation.control.path
|
||||
paths[control.String()] = control.clone()
|
||||
addCandidate(control)
|
||||
for _, contributor := range operation.controlOrigin.contributors {
|
||||
paths[contributor.source.String()] = contributor.source.clone()
|
||||
addCandidate(contributor.source)
|
||||
inherited = append(inherited, secretDependency{target: control.clone(), dependency: contributor.source.clone()})
|
||||
}
|
||||
continue
|
||||
@@ -57,6 +85,8 @@ func classifySecretPathsWithEvidence(schema *schemaDescriptor, predicate func(Pa
|
||||
destination := appendInheritancePath(operation.transfer.to, relative)
|
||||
paths[pointer] = source
|
||||
paths[destination.String()] = destination.clone()
|
||||
addCandidate(source)
|
||||
addCandidate(destination)
|
||||
inherited = append(inherited, secretDependency{target: destination, dependency: source})
|
||||
}
|
||||
}
|
||||
@@ -66,6 +96,9 @@ func classifySecretPathsWithEvidence(schema *schemaDescriptor, predicate func(Pa
|
||||
walkDocument(tree, Path{}, func(path Path, node *document.Node) {
|
||||
pointer := path.String()
|
||||
addSecretPath(paths, pointer)
|
||||
if parsed, err := ParsePath(pointer); err == nil {
|
||||
addCandidate(parsed)
|
||||
}
|
||||
if node.Sensitive {
|
||||
secret[pointer] = true
|
||||
}
|
||||
@@ -83,7 +116,7 @@ func classifySecretPathsWithEvidence(schema *schemaDescriptor, predicate func(Pa
|
||||
secret[path.String()] = true
|
||||
}
|
||||
}
|
||||
for _, path := range paths {
|
||||
for _, path := range candidates {
|
||||
classifyPath(path)
|
||||
}
|
||||
// Classify each original evidence shape before folding results into pointer
|
||||
@@ -96,9 +129,13 @@ func classifySecretPathsWithEvidence(schema *schemaDescriptor, predicate func(Pa
|
||||
if !candidate.valid() {
|
||||
candidate = item.path
|
||||
}
|
||||
classifyPath(addSecretEvidencePath(paths, item.destination, candidate))
|
||||
resolved := addSecretEvidencePath(paths, item.destination, candidate)
|
||||
addCandidate(resolved)
|
||||
classifyPath(resolved)
|
||||
for _, ancestor := range item.ancestors {
|
||||
classifyPath(addSecretEvidencePath(paths, item.destination, ancestor.path))
|
||||
resolved := addSecretEvidencePath(paths, item.destination, ancestor.path)
|
||||
addCandidate(resolved)
|
||||
classifyPath(resolved)
|
||||
}
|
||||
}
|
||||
return closeSecretDependencies(paths, secret, dependencies, inherited)
|
||||
|
||||
Reference in New Issue
Block a user