more audit work

This commit is contained in:
master
2026-01-08 10:21:51 +02:00
parent 43c02081ef
commit 51cf4bc16c
546 changed files with 36721 additions and 4003 deletions

View File

@@ -13,7 +13,11 @@ public sealed class DeterminismManifestReader
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) }
Converters =
{
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase),
new ObjectValueConverter()
}
};
/// <summary>
@@ -225,6 +229,127 @@ public sealed class DeterminismManifestReader
}
}
private sealed class ObjectValueConverter : JsonConverter<object?>
{
public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> ReadValue(ref reader, options);
public override void Write(Utf8JsonWriter writer, object? value, JsonSerializerOptions options)
{
if (value is null)
{
writer.WriteNullValue();
return;
}
switch (value)
{
case string text:
writer.WriteStringValue(text);
return;
case bool flag:
writer.WriteBooleanValue(flag);
return;
case int intValue:
writer.WriteNumberValue(intValue);
return;
case long longValue:
writer.WriteNumberValue(longValue);
return;
case float floatValue:
writer.WriteNumberValue(floatValue);
return;
case double doubleValue:
writer.WriteNumberValue(doubleValue);
return;
case decimal decimalValue:
writer.WriteNumberValue(decimalValue);
return;
case byte[] bytes:
writer.WriteBase64StringValue(bytes);
return;
case IDictionary<string, object?> dictionary:
writer.WriteStartObject();
foreach (var (key, itemValue) in dictionary)
{
writer.WritePropertyName(key);
Write(writer, itemValue, options);
}
writer.WriteEndObject();
return;
case IEnumerable<object?> list:
writer.WriteStartArray();
foreach (var item in list)
{
Write(writer, item, options);
}
writer.WriteEndArray();
return;
default:
JsonSerializer.Serialize(writer, value, value.GetType(), options);
return;
}
}
private static IDictionary<string, object?> ReadObject(ref Utf8JsonReader reader, JsonSerializerOptions options)
{
var values = new Dictionary<string, object?>(StringComparer.Ordinal);
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject)
{
return values;
}
if (reader.TokenType != JsonTokenType.PropertyName)
{
throw new JsonException("Expected property name.");
}
var propertyName = reader.GetString() ?? string.Empty;
if (!reader.Read())
{
throw new JsonException("Unexpected end of JSON.");
}
values[propertyName] = ReadValue(ref reader, options);
}
throw new JsonException("Unexpected end of JSON.");
}
private static IList<object?> ReadArray(ref Utf8JsonReader reader, JsonSerializerOptions options)
{
var values = new List<object?>();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndArray)
{
return values;
}
values.Add(ReadValue(ref reader, options));
}
throw new JsonException("Unexpected end of JSON.");
}
private static object? ReadValue(ref Utf8JsonReader reader, JsonSerializerOptions options)
{
return reader.TokenType switch
{
JsonTokenType.String => reader.GetString(),
JsonTokenType.Number => reader.TryGetInt64(out var number) ? number : reader.GetDouble(),
JsonTokenType.True => true,
JsonTokenType.False => false,
JsonTokenType.Null => null,
JsonTokenType.StartObject => ReadObject(ref reader, options),
JsonTokenType.StartArray => ReadArray(ref reader, options),
_ => throw new JsonException("Unsupported JSON token.")
};
}
}
private static bool IsSupportedHashAlgorithm(string algorithm)
{
return algorithm switch