Files
git.stella-ops.org/src/__Libraries/StellaOps.AuditPack/Services/IsolatedReplayContext.Initialize.cs

86 lines
2.6 KiB
C#

using StellaOps.AuditPack.Models;
namespace StellaOps.AuditPack.Services;
public sealed partial class IsolatedReplayContext
{
/// <summary>
/// Initializes the replay context from a bundle read result.
/// </summary>
public async Task<ReplayContextInitResult> InitializeAsync(
AuditBundleReadResult bundleResult,
CancellationToken cancellationToken = default)
{
if (_disposed)
{
throw new ObjectDisposedException(nameof(IsolatedReplayContext));
}
if (!bundleResult.Success || bundleResult.ReplayInputs is null)
{
return ReplayContextInitResult.Failed("Bundle read result is invalid or has no replay inputs");
}
try
{
var inputs = bundleResult.ReplayInputs;
if (inputs.Sbom is null)
{
return ReplayContextInitResult.Failed("SBOM is required for replay");
}
Sbom = inputs.Sbom;
SbomDigest = ComputeDigest(Sbom);
if (inputs.FeedsSnapshot is null)
{
return ReplayContextInitResult.Failed("Feeds snapshot is required for replay");
}
FeedsSnapshot = inputs.FeedsSnapshot;
FeedsDigest = ComputeDigest(FeedsSnapshot);
if (inputs.PolicyBundle is null)
{
return ReplayContextInitResult.Failed("Policy bundle is required for replay");
}
PolicyBundle = inputs.PolicyBundle;
PolicyDigest = ComputeDigest(PolicyBundle);
if (inputs.VexStatements is not null)
{
VexStatements = inputs.VexStatements;
VexDigest = ComputeDigest(VexStatements);
}
if (inputs.Verdict is not null)
{
OriginalVerdict = inputs.Verdict;
}
if (bundleResult.Manifest?.TimeAnchor?.Timestamp is DateTimeOffset anchorTime)
{
EvaluationTime = anchorTime;
}
await ExtractInputsAsync(cancellationToken).ConfigureAwait(false);
IsInitialized = true;
return new ReplayContextInitResult
{
Success = true,
SbomDigest = SbomDigest,
FeedsDigest = FeedsDigest,
PolicyDigest = PolicyDigest,
VexDigest = VexDigest,
EvaluationTime = EvaluationTime
};
}
catch (Exception ex)
{
return ReplayContextInitResult.Failed($"Failed to initialize replay context: {ex.Message}");
}
}
}