- Added `spl-secret-block@1.json` to block deployments with critical or high severity secret findings. - Introduced `spl-secret-warn@1.json` to warn on secret findings without blocking deployments. - Created `SecretSignalBinder.cs` to bind secret evidence to policy evaluation signals. - Developed unit tests for `SecretEvidenceContext` and `SecretSignalBinder` to ensure correct functionality. - Enhanced `SecretSignalContextExtensions` to integrate secret evidence into signal contexts.
107 lines
3.9 KiB
C#
107 lines
3.9 KiB
C#
// -----------------------------------------------------------------------------
|
|
// SecretSignalContextExtensions.cs
|
|
// Sprint: SPRINT_20260104_004_POLICY (Secret DSL Integration)
|
|
// Task: PSD-008 - Register predicates in PolicyDslRegistry (via signal context)
|
|
// -----------------------------------------------------------------------------
|
|
|
|
using StellaOps.Policy.Secrets;
|
|
|
|
namespace StellaOps.PolicyDsl;
|
|
|
|
/// <summary>
|
|
/// Extension methods for integrating secret evidence with PolicyDsl SignalContext.
|
|
/// </summary>
|
|
public static class SecretSignalContextExtensions
|
|
{
|
|
/// <summary>
|
|
/// Adds secret evidence signals to the signal context.
|
|
/// </summary>
|
|
/// <param name="context">The signal context.</param>
|
|
/// <param name="evidenceContext">The secret evidence context.</param>
|
|
/// <returns>The signal context for chaining.</returns>
|
|
public static SignalContext WithSecretEvidence(
|
|
this SignalContext context,
|
|
SecretEvidenceContext evidenceContext)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(context);
|
|
ArgumentNullException.ThrowIfNull(evidenceContext);
|
|
|
|
// Add flat signals
|
|
var signals = SecretSignalBinder.BindToSignals(evidenceContext);
|
|
foreach (var (name, value) in signals)
|
|
{
|
|
context.SetSignal(name, value);
|
|
}
|
|
|
|
// Add nested object for member access (secret.severity.high, etc.)
|
|
var nested = SecretSignalBinder.BindToNestedObject(evidenceContext);
|
|
context.SetSignal("secret", nested);
|
|
|
|
return context;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds secret evidence signals to the signal context builder.
|
|
/// </summary>
|
|
/// <param name="builder">The signal context builder.</param>
|
|
/// <param name="evidenceContext">The secret evidence context.</param>
|
|
/// <returns>The builder for chaining.</returns>
|
|
public static SignalContextBuilder WithSecretEvidence(
|
|
this SignalContextBuilder builder,
|
|
SecretEvidenceContext evidenceContext)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(builder);
|
|
ArgumentNullException.ThrowIfNull(evidenceContext);
|
|
|
|
// Add flat signals
|
|
var signals = SecretSignalBinder.BindToSignals(evidenceContext);
|
|
foreach (var (name, value) in signals)
|
|
{
|
|
builder.WithSignal(name, value);
|
|
}
|
|
|
|
// Add nested object for member access
|
|
var nested = SecretSignalBinder.BindToNestedObject(evidenceContext);
|
|
builder.WithSignal("secret", nested);
|
|
|
|
return builder;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds secret evidence signals from a provider.
|
|
/// </summary>
|
|
/// <param name="builder">The signal context builder.</param>
|
|
/// <param name="provider">The secret evidence provider.</param>
|
|
/// <returns>The builder for chaining.</returns>
|
|
public static SignalContextBuilder WithSecretEvidence(
|
|
this SignalContextBuilder builder,
|
|
ISecretEvidenceProvider provider)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(builder);
|
|
ArgumentNullException.ThrowIfNull(provider);
|
|
|
|
var context = new SecretEvidenceContext(provider);
|
|
return builder.WithSecretEvidence(context);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a signal context builder with secret evidence.
|
|
/// </summary>
|
|
/// <param name="evidenceContext">The secret evidence context.</param>
|
|
/// <returns>A new builder with secret signals.</returns>
|
|
public static SignalContextBuilder CreateBuilderWithSecrets(SecretEvidenceContext evidenceContext)
|
|
{
|
|
return SignalContext.Builder().WithSecretEvidence(evidenceContext);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a signal context with secret evidence.
|
|
/// </summary>
|
|
/// <param name="evidenceContext">The secret evidence context.</param>
|
|
/// <returns>A new signal context with secret signals.</returns>
|
|
public static SignalContext CreateContextWithSecrets(SecretEvidenceContext evidenceContext)
|
|
{
|
|
return CreateBuilderWithSecrets(evidenceContext).Build();
|
|
}
|
|
}
|