From f25128281a43a6cf507c05face5932a9321d0fa9 Mon Sep 17 00:00:00 2001
From: Kanan B <32438208+kananb@users.noreply.github.com>
Date: Thu, 12 Oct 2023 11:43:07 -0700
Subject: [PATCH] Add middleware for optional strict CLI version checking
(#3564)
* Add a middleware for strict version checking
* Fill in doc comments
* Move header names to constants
* Make version middleware more easily testable and add first unit test
* Add the rest of the version check unit tests
* Fix build errors for dropped FluentAssertions return values in other tests
* dotnet format
* Fix import order
* fix str.lower on optional str
* Rename TestCliVersion to CheckCliVersion
* Use OneFuzzResultVoid instead of nullabe Error
* Change version parser to Semver
* Restore projects that use ApiService
* Add a prerelease version test case
---
src/ApiService/ApiService/ApiService.csproj | 2 +-
.../ApiService/OneFuzzTypes/Enums.cs | 1 +
src/ApiService/ApiService/Program.cs | 63 +
.../ApiService/onefuzzlib/Versions.cs | 4 +-
src/ApiService/ApiService/packages.lock.json | 6 +-
src/ApiService/FunctionalTests/Auth.cs | 2 +-
.../FunctionalTests/FunctionalTests.csproj | 5 +-
.../FunctionalTests/TestContainer.cs | 18 +-
src/ApiService/FunctionalTests/TestInfo.cs | 4 +-
src/ApiService/FunctionalTests/TestNode.cs | 20 +-
src/ApiService/FunctionalTests/TestPool.cs | 12 +-
src/ApiService/FunctionalTests/TestProxy.cs | 18 +-
.../FunctionalTests/TestScaleset.cs | 28 +-
src/ApiService/FunctionalTests/TestTasks.cs | 8 +-
.../TestVersionCheckMiddleware.cs | 165 ++
.../FunctionalTests/packages.lock.json | 1464 ++++++++++++++++-
.../IntegrationTests/packages.lock.json | 6 +-
src/ApiService/Tests/packages.lock.json | 6 +-
src/cli/onefuzz/backend.py | 7 +-
src/pytypes/onefuzztypes/enums.py | 1 +
20 files changed, 1712 insertions(+), 128 deletions(-)
create mode 100644 src/ApiService/FunctionalTests/TestVersionCheckMiddleware.cs
diff --git a/src/ApiService/ApiService/ApiService.csproj b/src/ApiService/ApiService/ApiService.csproj
index b96b58e8b4..1a80d69bcc 100644
--- a/src/ApiService/ApiService/ApiService.csproj
+++ b/src/ApiService/ApiService/ApiService.csproj
@@ -13,7 +13,7 @@
-
+
diff --git a/src/ApiService/ApiService/OneFuzzTypes/Enums.cs b/src/ApiService/ApiService/OneFuzzTypes/Enums.cs
index 4692debfe8..9f752622f1 100644
--- a/src/ApiService/ApiService/OneFuzzTypes/Enums.cs
+++ b/src/ApiService/ApiService/OneFuzzTypes/Enums.cs
@@ -51,6 +51,7 @@ public enum ErrorCode {
ADO_VALIDATION_INVALID_PATH = 495,
ADO_VALIDATION_INVALID_PROJECT = 496,
INVALID_RETENTION_PERIOD = 497,
+ INVALID_CLI_VERSION = 498,
// NB: if you update this enum, also update enums.py
}
diff --git a/src/ApiService/ApiService/Program.cs b/src/ApiService/ApiService/Program.cs
index d5ee30b45e..f26463883b 100644
--- a/src/ApiService/ApiService/Program.cs
+++ b/src/ApiService/ApiService/Program.cs
@@ -18,6 +18,7 @@
using Microsoft.FeatureManagement;
using Microsoft.Graph;
using Microsoft.OneFuzz.Service.OneFuzzLib.Orm;
+using Semver;
namespace Microsoft.OneFuzz.Service;
public class Program {
@@ -58,6 +59,67 @@ public async Async.Task Invoke(FunctionContext context, FunctionExecutionDelegat
}
}
+ ///
+ /// Represents a middleware that can optionally perform strict version checking based on data sent in request headers.
+ ///
+ public class VersionCheckingMiddleware : IFunctionsWorkerMiddleware {
+ private const string CliVersionHeader = "Cli-Version";
+ private const string StrictVersionHeader = "Strict-Version";
+ private readonly SemVersion _oneFuzzServiceVersion;
+ private readonly IRequestHandling _requestHandling;
+
+ ///
+ /// Initializes an instance of with the provided config and request handling objects.
+ ///
+ /// The service config containing the service version.
+ /// The request handling object to create HTTP responses with.
+ public VersionCheckingMiddleware(IServiceConfig config, IRequestHandling requestHandling) {
+ _oneFuzzServiceVersion = SemVersion.Parse(config.OneFuzzVersion, SemVersionStyles.Strict);
+ _requestHandling = requestHandling;
+ }
+
+ public OneFuzzResultVoid CheckCliVersion(Azure.Functions.Worker.Http.HttpHeadersCollection headers) {
+ var doStrictVersionCheck =
+ headers.TryGetValues(StrictVersionHeader, out var strictVersion)
+ && strictVersion?.FirstOrDefault()?.Equals("true", StringComparison.InvariantCultureIgnoreCase) == true; // "== true" necessary here to avoid implicit null -> bool casting
+
+ if (doStrictVersionCheck) {
+ if (!headers.TryGetValues(CliVersionHeader, out var cliVersion)) {
+ return Error.Create(ErrorCode.INVALID_REQUEST, $"'{StrictVersionHeader}' is set to true without a corresponding '{CliVersionHeader}' header");
+ }
+ if (!SemVersion.TryParse(cliVersion?.FirstOrDefault() ?? "", SemVersionStyles.Strict, out var version)) {
+ return Error.Create(ErrorCode.INVALID_CLI_VERSION, $"'{CliVersionHeader}' header value is not a valid sematic version");
+ }
+ if (version.ComparePrecedenceTo(_oneFuzzServiceVersion) < 0) {
+ return Error.Create(ErrorCode.INVALID_CLI_VERSION, "cli is out of date");
+ }
+ }
+
+ return OneFuzzResultVoid.Ok;
+ }
+
+ ///
+ /// Checks the request for two headers, cli version and one indicating whether to do strict version checking.
+ /// When both are present and the cli is out of date, a descriptive response is sent back.
+ ///
+ /// The function context.
+ /// The function execution delegate.
+ /// A
+ public async Async.Task Invoke(FunctionContext context, FunctionExecutionDelegate next) {
+ var requestData = await context.GetHttpRequestDataAsync();
+ if (requestData is not null) {
+ var error = CheckCliVersion(requestData.Headers);
+ if (!error.IsOk) {
+ var response = await _requestHandling.NotOk(requestData, error.ErrorV, "version middleware");
+ context.GetInvocationResult().Value = response;
+ return;
+ }
+ }
+
+ await next(context);
+ }
+ }
+
//Move out expensive resources into separate class, and add those as Singleton
// ArmClient, Table Client(s), Queue Client(s), HttpClient, etc.
@@ -161,6 +223,7 @@ public static async Async.Task Main() {
builder.UseMiddleware();
builder.UseMiddleware();
builder.UseMiddleware();
+ builder.UseMiddleware();
//this is a must, to tell the host that worker logging is done by us
builder.Services.Configure(workerOptions => workerOptions.Capabilities["WorkerApplicationInsightsLoggingEnabled"] = bool.TrueString);
diff --git a/src/ApiService/ApiService/onefuzzlib/Versions.cs b/src/ApiService/ApiService/onefuzzlib/Versions.cs
index 6c44812a34..68032124d4 100644
--- a/src/ApiService/ApiService/onefuzzlib/Versions.cs
+++ b/src/ApiService/ApiService/onefuzzlib/Versions.cs
@@ -2,11 +2,11 @@
namespace Microsoft.OneFuzz.Service;
-public class versions {
+public class Versions {
public static bool IsMinimumVersion(string versionStr, string minimumStr) {
var version = SemVersion.Parse(versionStr, SemVersionStyles.Any);
var minimum = SemVersion.Parse(minimumStr, SemVersionStyles.Any);
- return version >= minimum;
+ return version.ComparePrecedenceTo(minimum) >= 0;
}
}
diff --git a/src/ApiService/ApiService/packages.lock.json b/src/ApiService/ApiService/packages.lock.json
index 5f57ce8ebd..1f912aa014 100644
--- a/src/ApiService/ApiService/packages.lock.json
+++ b/src/ApiService/ApiService/packages.lock.json
@@ -385,9 +385,9 @@
},
"Semver": {
"type": "Direct",
- "requested": "[2.1.0, )",
- "resolved": "2.1.0",
- "contentHash": "1jUT0PwgKO9d9F/X2n762qLp7v/30OpMtJPFRtmjPXUX2/J0lnqiGiSJNNsW3yYTj5StF0Z1yE36TrvtGpcbrg=="
+ "requested": "[2.3.0, )",
+ "resolved": "2.3.0",
+ "contentHash": "4vYo1zqn6pJ1YrhjuhuOSbIIm0CpM47grbpTJ5ABjOlfGt/EhMEM9ed4MRK5Jr6gVnntWDqOUzGeUJp68PZGjw=="
},
"SmartAnalyzers.CSharpExtensions.Annotations": {
"type": "Direct",
diff --git a/src/ApiService/FunctionalTests/Auth.cs b/src/ApiService/FunctionalTests/Auth.cs
index f717977d2b..28f69abe69 100644
--- a/src/ApiService/FunctionalTests/Auth.cs
+++ b/src/ApiService/FunctionalTests/Auth.cs
@@ -47,7 +47,7 @@ public async Task Auth(CancellationToken cancelationToken)
_token = await _app.AcquireTokenForClient(_authConfig.Scopes).ExecuteAsync(cancelationToken);
return _token;
} finally {
- _lockObj.Release();
+ _ = _lockObj.Release();
}
}
diff --git a/src/ApiService/FunctionalTests/FunctionalTests.csproj b/src/ApiService/FunctionalTests/FunctionalTests.csproj
index 2dfe9df83c..5b702705a3 100644
--- a/src/ApiService/FunctionalTests/FunctionalTests.csproj
+++ b/src/ApiService/FunctionalTests/FunctionalTests.csproj
@@ -9,7 +9,7 @@
-
+
@@ -18,6 +18,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
+
@@ -34,4 +35,4 @@
-
\ No newline at end of file
+
diff --git a/src/ApiService/FunctionalTests/TestContainer.cs b/src/ApiService/FunctionalTests/TestContainer.cs
index 6d132964f8..6b80698ff7 100644
--- a/src/ApiService/FunctionalTests/TestContainer.cs
+++ b/src/ApiService/FunctionalTests/TestContainer.cs
@@ -19,27 +19,27 @@ public TestContainer(ITestOutputHelper output) {
[Fact]
public async Task DownloadNonExistentContainer() {
var r1 = await _downloadApi.Get();
- r1.IsOk.Should().BeFalse();
- r1.ErrorV!.Item2!.ShouldBeProvided("container").Should().BeTrue();
+ _ = r1.IsOk.Should().BeFalse();
+ _ = r1.ErrorV!.Item2!.ShouldBeProvided("container").Should().BeTrue();
var r2 = await _downloadApi.Get(container: Guid.NewGuid().ToString());
- r2.IsOk.Should().BeFalse();
- r2.ErrorV!.Item2!.ShouldBeProvided("filename").Should().BeTrue();
+ _ = r2.IsOk.Should().BeFalse();
+ _ = r2.ErrorV!.Item2!.ShouldBeProvided("filename").Should().BeTrue();
var r3 = await _downloadApi.Get(filename: Guid.NewGuid().ToString());
- r3.IsOk.Should().BeFalse();
- r3.ErrorV!.Item2!.ShouldBeProvided("container").Should().BeTrue();
+ _ = r3.IsOk.Should().BeFalse();
+ _ = r3.ErrorV!.Item2!.ShouldBeProvided("container").Should().BeTrue();
var r4 = await _downloadApi.Get(container: Guid.NewGuid().ToString(), filename: Guid.NewGuid().ToString());
- r4.IsOk.Should().BeFalse();
- r4.ErrorV!.Item1.Should().Be(System.Net.HttpStatusCode.NotFound);
+ _ = r4.IsOk.Should().BeFalse();
+ _ = r4.ErrorV!.Item1.Should().Be(System.Net.HttpStatusCode.NotFound);
}
[Fact]
public async Task CreateGetDeleteContainer() {
var containerName = Guid.NewGuid().ToString();
var container = await _containerApi.Post(containerName);
- container.IsOk.Should().BeTrue($"failed to create container due to {container.ErrorV}");
+ _ = container.IsOk.Should().BeTrue($"failed to create container due to {container.ErrorV}");
var c = await _containerApi.Get(containerName);
diff --git a/src/ApiService/FunctionalTests/TestInfo.cs b/src/ApiService/FunctionalTests/TestInfo.cs
index fa3b11e815..c080553b02 100644
--- a/src/ApiService/FunctionalTests/TestInfo.cs
+++ b/src/ApiService/FunctionalTests/TestInfo.cs
@@ -16,8 +16,8 @@ public TestInfo(ITestOutputHelper output) {
[Fact]
async Task GetInfo() {
var info = await _infoApi.Get();
- info.IsOk.Should().BeTrue();
- info.OkV!.Versions.ContainsKey("onefuzz").Should().BeTrue();
+ _ = info.IsOk.Should().BeTrue();
+ _ = info.OkV!.Versions.ContainsKey("onefuzz").Should().BeTrue();
}
}
}
diff --git a/src/ApiService/FunctionalTests/TestNode.cs b/src/ApiService/FunctionalTests/TestNode.cs
index 79308a1ab9..f8dfd9cc15 100644
--- a/src/ApiService/FunctionalTests/TestNode.cs
+++ b/src/ApiService/FunctionalTests/TestNode.cs
@@ -24,14 +24,14 @@ public TestNode(ITestOutputHelper output) {
async Task GetNonExistentNode() {
var n = await _nodeApi.Get(Guid.NewGuid());
- n.IsOk.Should().BeFalse();
- n.ErrorV!.UnableToFindNode.Should().BeTrue();
+ _ = n.IsOk.Should().BeFalse();
+ _ = n.ErrorV!.UnableToFindNode.Should().BeTrue();
}
[Fact]
async Task GetAllNodes() {
var ns = await _nodeApi.Get();
- ns.IsOk.Should().BeTrue("failed to get all nodes due to {0}", ns.ErrorV);
+ _ = ns.IsOk.Should().BeTrue("failed to get all nodes due to {0}", ns.ErrorV);
foreach (var n in ns.OkV!) {
_output.WriteLine($"node machine id: {n.MachineId}, scaleset id: {n.ScalesetId}, poolName: {n.PoolName}, poolId: {n.PoolId} state: {n.State}, version: {n.Version}");
}
@@ -41,8 +41,8 @@ async Task GetAllNodes() {
[Fact]
async Task DeleteNonExistentNode() {
var n = await _nodeApi.Delete(Guid.NewGuid());
- n.IsError.Should().BeTrue();
- n.Error!.UnableToFindNode.Should().BeTrue();
+ _ = n.IsError.Should().BeTrue();
+ _ = n.Error!.UnableToFindNode.Should().BeTrue();
}
[Fact]
@@ -51,25 +51,25 @@ async Task GetPatchPostDelete() {
var (pool, scaleset) = await Helpers.CreatePoolAndScaleset(_poolApi, _scalesetApi, "linux");
scaleset = await _scalesetApi.WaitWhile(scaleset.ScalesetId, sc => sc.State == "init" || sc.State == "setup");
- scaleset.Nodes!.Should().NotBeEmpty();
+ _ = scaleset.Nodes!.Should().NotBeEmpty();
var nodeState = scaleset.Nodes!.First();
var nodeResult = await _nodeApi.Get(nodeState.MachineId);
- nodeResult.IsOk.Should().BeTrue("failed to get node due to {0}", nodeResult.ErrorV);
+ _ = nodeResult.IsOk.Should().BeTrue("failed to get node due to {0}", nodeResult.ErrorV);
var node = nodeResult.OkV!.First();
node = await _nodeApi.WaitWhile(node.MachineId, n => n.State == "init" || n.State == "setup");
var r = await _nodeApi.Patch(node.MachineId);
- r.Result.Should().BeTrue();
+ _ = r.Result.Should().BeTrue();
var rr = await _nodeApi.Update(node.MachineId, false);
var d = await _nodeApi.Delete(node.MachineId);
- d.Result.Should().BeTrue();
+ _ = d.Result.Should().BeTrue();
var deletePool = await _poolApi.Delete(pool.Name);
- deletePool.Result.Should().BeTrue();
+ _ = deletePool.Result.Should().BeTrue();
}
}
}
diff --git a/src/ApiService/FunctionalTests/TestPool.cs b/src/ApiService/FunctionalTests/TestPool.cs
index 2fad583f48..28b633f6ea 100644
--- a/src/ApiService/FunctionalTests/TestPool.cs
+++ b/src/ApiService/FunctionalTests/TestPool.cs
@@ -21,7 +21,7 @@ public TestPool(ITestOutputHelper output) {
[Fact]
public async Task GetNonExistentPool() {
var p = await _poolApi.Get(name: Guid.NewGuid().ToString());
- p.ErrorV!.UnableToFindPoolError.Should().BeTrue("{0}", p.ErrorV!);
+ _ = p.ErrorV!.UnableToFindPoolError.Should().BeTrue("{0}", p.ErrorV!);
}
@@ -34,7 +34,7 @@ public async Task DeleteFunctionalTestPools() {
[Fact]
public async Task GetPools() {
var pools = await _poolApi.Get();
- pools.IsOk.Should().BeTrue();
+ _ = pools.IsOk.Should().BeTrue();
if (!pools.OkV!.Any()) {
_output.WriteLine("Got empty pools");
@@ -54,16 +54,16 @@ public async Task CreateAndDelete() {
_output.WriteLine($"creating pool {newPoolName}");
var newPool = await _poolApi.Create(newPoolName, "linux");
- newPool.IsOk.Should().BeTrue("failed to create new pool: {0}", newPool.ErrorV);
+ _ = newPool.IsOk.Should().BeTrue("failed to create new pool: {0}", newPool.ErrorV);
var poolsCreated = await _poolApi.Get();
- poolsCreated.IsOk.Should().BeTrue("failed to get pools: {0}", poolsCreated.ErrorV);
+ _ = poolsCreated.IsOk.Should().BeTrue("failed to get pools: {0}", poolsCreated.ErrorV);
var newPools = poolsCreated.OkV!.Where(p => p.Name == newPoolName);
- newPools.Count().Should().Be(1);
+ _ = newPools.Count().Should().Be(1);
var deletedPoolResult = await _poolApi.Delete(newPoolName);
- deletedPoolResult.Result.Should().BeTrue();
+ _ = deletedPoolResult.Result.Should().BeTrue();
}
}
}
diff --git a/src/ApiService/FunctionalTests/TestProxy.cs b/src/ApiService/FunctionalTests/TestProxy.cs
index 0c0cc301dc..3e99c231e4 100644
--- a/src/ApiService/FunctionalTests/TestProxy.cs
+++ b/src/ApiService/FunctionalTests/TestProxy.cs
@@ -26,7 +26,7 @@ public TestProxy(ITestOutputHelper output) {
public async Task GetProxies() {
var allProxiesResult = await _proxyApi.Get();
- allProxiesResult.IsOk.Should().BeTrue("failed to get proxies due to {0}", allProxiesResult.ErrorV);
+ _ = allProxiesResult.IsOk.Should().BeTrue("failed to get proxies due to {0}", allProxiesResult.ErrorV);
if (!allProxiesResult.OkV!.Any()) {
_output.WriteLine("Got empty list of proxies");
@@ -42,12 +42,12 @@ public async Task CreateResetDelete() {
var (newPool, newScaleset) = await Helpers.CreatePoolAndScaleset(_poolApi, _scalesetApi, "linux");
newScaleset = await _scalesetApi.WaitWhile(newScaleset.ScalesetId, sc => sc.State == "init" || sc.State == "setup");
- newScaleset.Nodes!.Should().NotBeEmpty();
+ _ = newScaleset.Nodes!.Should().NotBeEmpty();
var firstNode = newScaleset.Nodes!.First();
var nodeResult = await _nodeApi.Get(machineId: firstNode.MachineId);
- nodeResult.IsOk.Should().BeTrue();
+ _ = nodeResult.IsOk.Should().BeTrue();
var node = nodeResult.OkV!.First();
node = await _nodeApi.WaitWhile(node.MachineId, n => n.State == "init" || n.State == "setup");
@@ -56,23 +56,23 @@ public async Task CreateResetDelete() {
var proxyAgain = await _proxyApi.Create(newScaleset.ScalesetId, node.MachineId, 2223, 1);
- proxy.IsOk.Should().BeTrue("failed to create proxy due to {0}", proxy.ErrorV);
- proxyAgain.IsOk.Should().BeTrue("failed to create proxy with same config due to {0}", proxyAgain.ErrorV);
+ _ = proxy.IsOk.Should().BeTrue("failed to create proxy due to {0}", proxy.ErrorV);
+ _ = proxyAgain.IsOk.Should().BeTrue("failed to create proxy with same config due to {0}", proxyAgain.ErrorV);
- proxy.OkV!.Should().BeEquivalentTo(proxyAgain.OkV!);
+ _ = proxy.OkV!.Should().BeEquivalentTo(proxyAgain.OkV!);
_output.WriteLine($"created proxy dst ip: {proxy.OkV!.Forward.DstIp}, srcPort: {proxy.OkV.Forward.SrcPort} dstport: {proxy.OkV!.Forward.DstPort}, ip: {proxy.OkV!.Ip}");
var proxyReset = await _proxyApi.Reset(newScaleset.Region);
- proxyReset.Result.Should().BeTrue();
+ _ = proxyReset.Result.Should().BeTrue();
var deleteProxy = await _proxyApi.Delete(newScaleset.ScalesetId, node.MachineId);
- deleteProxy.Result.Should().BeTrue();
+ _ = deleteProxy.Result.Should().BeTrue();
_output.WriteLine($"deleted proxy");
var deletePool = await _poolApi.Delete(newPool.Name);
- deletePool.Result.Should().BeTrue();
+ _ = deletePool.Result.Should().BeTrue();
_output.WriteLine($"deleted pool {newPool.Name}");
}
}
diff --git a/src/ApiService/FunctionalTests/TestScaleset.cs b/src/ApiService/FunctionalTests/TestScaleset.cs
index 08e51cf094..8e4cc339d6 100644
--- a/src/ApiService/FunctionalTests/TestScaleset.cs
+++ b/src/ApiService/FunctionalTests/TestScaleset.cs
@@ -21,7 +21,7 @@ public TestScaleset(ITestOutputHelper output) {
[Fact]
public async Task GetScalesets() {
var scalesets = await _scalesetApi.Get();
- scalesets.IsOk.Should().BeTrue("failed to get scalesets due to {0}", scalesets.ErrorV);
+ _ = scalesets.IsOk.Should().BeTrue("failed to get scalesets due to {0}", scalesets.ErrorV);
if (!scalesets.OkV!.Any()) {
_output.WriteLine("Got empty scalesets");
} else {
@@ -44,16 +44,16 @@ private async Task CreateAndDelete(string os) {
_output.WriteLine($"New scale set info id: {newScaleset.ScalesetId}, pool: {newScaleset.PoolName}, state: {newScaleset.State}, error: {newScaleset.Error}");
var scalesetsCreated = await _scalesetApi.Get();
- scalesetsCreated.IsOk.Should().BeTrue("failed to get scalesets: {0}", scalesetsCreated.ErrorV);
+ _ = scalesetsCreated.IsOk.Should().BeTrue("failed to get scalesets: {0}", scalesetsCreated.ErrorV);
var poolsCreated = await _poolApi.Get();
- poolsCreated.IsOk.Should().BeTrue("failed to get pools: {0}", poolsCreated.ErrorV);
+ _ = poolsCreated.IsOk.Should().BeTrue("failed to get pools: {0}", poolsCreated.ErrorV);
var newPools = poolsCreated.OkV!.Where(p => p.Name == newPool.Name);
var newScalesets = scalesetsCreated.OkV!.Where(sc => sc.ScalesetId == newScaleset.ScalesetId);
- newPools.Count().Should().Be(1);
- newScalesets.Count().Should().Be(1);
+ _ = newPools.Count().Should().Be(1);
+ _ = newScalesets.Count().Should().Be(1);
Console.WriteLine($"Waiting for scaleset to move out from Init State");
newScaleset = await _scalesetApi.WaitWhile(newScaleset.ScalesetId, sc => sc.State == "init" || sc.State == "setup");
@@ -67,8 +67,8 @@ private async Task CreateAndDelete(string os) {
}
var patch0 = await _scalesetApi.Patch(newScaleset.ScalesetId, 0);
- patch0.IsOk.Should().BeFalse();
- patch0.ErrorV!.IsWrongSizeError.Should().BeTrue();
+ _ = patch0.IsOk.Should().BeFalse();
+ _ = patch0.ErrorV!.IsWrongSizeError.Should().BeTrue();
// https://github.com/microsoft/onefuzz/issues/2311
//var patch1 = await _scalesetApi.Patch(newScaleset.ScalesetId, 1);
//Assert.True(patch1.IsOk, $"scaleset patch failed due to: {patch1}");
@@ -89,9 +89,9 @@ private async Task CreateAndDelete(string os) {
var preDeleteScalesets = await _scalesetApi.Get();
var deletedPoolResult = await _poolApi.Delete(newPool.Name);
- preDeleteScalesets.IsOk.Should().BeTrue("failed to get pre-deleted scalesets due to: {0}", preDeleteScalesets.ErrorV);
+ _ = preDeleteScalesets.IsOk.Should().BeTrue("failed to get pre-deleted scalesets due to: {0}", preDeleteScalesets.ErrorV);
var preDelete = preDeleteScalesets.OkV!.Where(sc => sc.PoolName == newPool.Name);
- preDelete.Count().Should().Be(3);
+ _ = preDelete.Count().Should().Be(3);
Result, Error> deletedPool;
do {
@@ -100,17 +100,17 @@ private async Task CreateAndDelete(string os) {
} while (deletedPool.IsOk);
- deletedPool.ErrorV!.UnableToFindPoolError.Should().BeTrue();
+ _ = deletedPool.ErrorV!.UnableToFindPoolError.Should().BeTrue();
var postDeleteScalesets = await _scalesetApi.Get();
- postDeleteScalesets.IsOk.Should().BeTrue("failed to get scalesets after finishing pool deletion due to {0}", postDeleteScalesets.ErrorV);
+ _ = postDeleteScalesets.IsOk.Should().BeTrue("failed to get scalesets after finishing pool deletion due to {0}", postDeleteScalesets.ErrorV);
_output.WriteLine($"Pool is deleted {newPool.Name}");
var postDelete = postDeleteScalesets.OkV!.Where(sc => sc.PoolName == newPool.Name);
- postDelete.Should().BeEmpty();
+ _ = postDelete.Should().BeEmpty();
var patch1 = await _scalesetApi.Patch(newScaleset.ScalesetId, 1);
- patch1.IsOk.Should().BeFalse();
- patch1.ErrorV!.UnableToFindScalesetError.Should().BeTrue();
+ _ = patch1.IsOk.Should().BeFalse();
+ _ = patch1.ErrorV!.UnableToFindScalesetError.Should().BeTrue();
}
return;
diff --git a/src/ApiService/FunctionalTests/TestTasks.cs b/src/ApiService/FunctionalTests/TestTasks.cs
index a0ea1ff747..14b7387173 100644
--- a/src/ApiService/FunctionalTests/TestTasks.cs
+++ b/src/ApiService/FunctionalTests/TestTasks.cs
@@ -18,13 +18,13 @@ public TestTasks(ITestOutputHelper output) {
[Fact]
public async Task GetNonExistentTask() {
var t1 = await _taskApi.Get(Guid.NewGuid());
- t1.IsOk.Should().BeTrue();
- t1.OkV.Should().BeEmpty();
+ _ = t1.IsOk.Should().BeTrue();
+ _ = t1.OkV.Should().BeEmpty();
var t2 = await _taskApi.Get(Guid.NewGuid(), Guid.NewGuid());
- t2.IsOk.Should().BeFalse();
- t2.ErrorV!.UnableToFindTask.Should().BeTrue();
+ _ = t2.IsOk.Should().BeFalse();
+ _ = t2.ErrorV!.UnableToFindTask.Should().BeTrue();
}
diff --git a/src/ApiService/FunctionalTests/TestVersionCheckMiddleware.cs b/src/ApiService/FunctionalTests/TestVersionCheckMiddleware.cs
new file mode 100644
index 0000000000..12cc6f1a42
--- /dev/null
+++ b/src/ApiService/FunctionalTests/TestVersionCheckMiddleware.cs
@@ -0,0 +1,165 @@
+using Azure.Core;
+using Microsoft.ApplicationInsights.DataContracts;
+using Microsoft.Azure.Functions.Worker.Http;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.OneFuzz.Service;
+using Semver;
+using Xunit;
+
+namespace FunctionalTests;
+
+[Trait("Category", "Live")]
+public class TestVersionCheckMiddleware {
+ private sealed class MockServiceConfiguration : IServiceConfig {
+ public LogDestination[] LogDestinations => throw new NotImplementedException();
+
+ public SeverityLevel LogSeverityLevel => throw new NotImplementedException();
+
+ public string? ApplicationInsightsAppId => throw new NotImplementedException();
+
+ public string? ApplicationInsightsInstrumentationKey => throw new NotImplementedException();
+
+ public string? AppConfigurationEndpoint => throw new NotImplementedException();
+
+ public string? AppConfigurationConnectionString => throw new NotImplementedException();
+
+ public string? CliAppId => throw new NotImplementedException();
+
+ public string? Authority => throw new NotImplementedException();
+
+ public string? TenantDomain => throw new NotImplementedException();
+
+ public string? MultiTenantDomain => throw new NotImplementedException();
+
+ public ResourceIdentifier OneFuzzResourceGroup => throw new NotImplementedException();
+
+ public ResourceIdentifier OneFuzzDataStorage => throw new NotImplementedException();
+
+ public ResourceIdentifier OneFuzzFuncStorage => throw new NotImplementedException();
+
+ public Uri OneFuzzInstance => throw new NotImplementedException();
+
+ public string OneFuzzInstanceName => throw new NotImplementedException();
+
+ public Uri? OneFuzzEndpoint => throw new NotImplementedException();
+
+ public string OneFuzzKeyvault => throw new NotImplementedException();
+
+ public string? OneFuzzMonitor => throw new NotImplementedException();
+
+ public string? OneFuzzOwner => throw new NotImplementedException();
+
+ public string? OneFuzzTelemetry => throw new NotImplementedException();
+
+ public string OneFuzzVersion { get; } = "1.0.0";
+
+ public string? OneFuzzAllowOutdatedAgent => throw new NotImplementedException();
+
+ public string OneFuzzStoragePrefix => throw new NotImplementedException();
+ }
+ private static Program.VersionCheckingMiddleware GetMiddleware() {
+ return new Program.VersionCheckingMiddleware(
+ new MockServiceConfiguration(),
+ new RequestHandling(NullLogger.Instance)
+ );
+ }
+
+ private static HttpHeadersCollection GetHeaders(string? cliVersion = null, string? strictVersionCheck = null) {
+ var headers = new HttpHeadersCollection();
+ if (cliVersion != null) {
+ headers.Add("cli-version", cliVersion);
+ }
+ if (strictVersionCheck != null) {
+ headers.Add("strict-version", strictVersionCheck);
+ }
+ return headers;
+ }
+
+ [Fact]
+ public void VersionCheck_NoHeaders_ReturnsOk() {
+ var middleware = GetMiddleware();
+ var headers = GetHeaders();
+
+ var result = middleware.CheckCliVersion(headers);
+
+ Assert.True(result.IsOk);
+ }
+
+ [Theory]
+ [InlineData("1.0.0")]
+ [InlineData("0.0.1")]
+ [InlineData("BadVersionFormat")]
+ public void VersionCheck_JustCliVersion_ReturnsOk(string cliVersion) {
+ var middleware = GetMiddleware();
+ var headers = GetHeaders(cliVersion);
+
+ var result = middleware.CheckCliVersion(headers);
+
+ Assert.True(result.IsOk);
+ }
+
+ [Fact]
+ public void VersionCheck_JustStrictVersionTrue_ReturnsInvalidRequest() {
+ var middleware = GetMiddleware();
+ var headers = GetHeaders(null, "True");
+
+ var result = middleware.CheckCliVersion(headers);
+
+ Assert.False(result.IsOk);
+ Assert.Equal(ErrorCode.INVALID_REQUEST, result.ErrorV.Code);
+ Assert.Contains("is set to true without a corresponding", result.ErrorV.Errors?.First());
+ }
+
+ [Theory]
+ [InlineData("False")]
+ [InlineData("Something else")]
+ public void VersionCheck_JustStrictVersionNotTrue_ReturnsOk(string strictVersion) {
+ var middleware = GetMiddleware();
+ var headers = GetHeaders(null, strictVersion);
+
+ var result = middleware.CheckCliVersion(headers);
+
+ Assert.True(result.IsOk);
+ }
+
+ [Theory]
+ [InlineData("1.0.0", "False")]
+ [InlineData("0.0.1", "Something else")]
+ [InlineData("BadVersionFormat", "Not true")]
+ public void VersionCheck_StrictVersionNotTrue_ReturnsOk(string cliVersion, string strictVersion) {
+ var middleware = GetMiddleware();
+ var headers = GetHeaders(cliVersion, strictVersion);
+
+ var result = middleware.CheckCliVersion(headers);
+
+ Assert.True(result.IsOk);
+ }
+
+ [Theory]
+ [InlineData("1.0.0")]
+ [InlineData("1.0.0+90b616cc9c742ee3dd085802e713a6fd0054e624")]
+ [InlineData("1.1.0+meta")]
+ public void VersionCheck_ValidVersion_ReturnsOk(string cliVersion) {
+ var middleware = GetMiddleware();
+ var headers = GetHeaders(cliVersion, "True");
+
+ var result = middleware.CheckCliVersion(headers);
+
+ Assert.True(result.IsOk, result.ErrorV?.Errors?.FirstOrDefault());
+ }
+
+ [Theory]
+ [InlineData("0.9.1", ErrorCode.INVALID_CLI_VERSION, "cli is out of date")]
+ [InlineData("1.0.0-pre.release", ErrorCode.INVALID_CLI_VERSION, "cli is out of date")]
+ [InlineData("Bad Format", ErrorCode.INVALID_CLI_VERSION, "not a valid sematic version")]
+ public void VersionCheck_InvalidVersion_ReturnsInvalidRequest(string cliVersion, ErrorCode expectedCode, string expectedMessage) {
+ var middleware = GetMiddleware();
+ var headers = GetHeaders(cliVersion, "True");
+
+ var result = middleware.CheckCliVersion(headers);
+
+ Assert.False(result.IsOk);
+ Assert.Equal(expectedCode, result.ErrorV.Code);
+ Assert.Contains(expectedMessage, result.ErrorV.Errors?.First());
+ }
+}
diff --git a/src/ApiService/FunctionalTests/packages.lock.json b/src/ApiService/FunctionalTests/packages.lock.json
index 6a3e72e238..d138ad07cb 100644
--- a/src/ApiService/FunctionalTests/packages.lock.json
+++ b/src/ApiService/FunctionalTests/packages.lock.json
@@ -23,6 +23,15 @@
"resolved": "0.21.0",
"contentHash": "5CprzHStF627DqPytBnjRMXT2dvmXrP4XwVK4+jRllU5JH8SC6tytyyuOOd06tzjDPHU8YbDZ7/JtgJSiMb8RA=="
},
+ "Microsoft.Azure.Functions.Worker.Extensions.Http": {
+ "type": "Direct",
+ "requested": "[3.0.13, )",
+ "resolved": "3.0.13",
+ "contentHash": "GX41psGbjLSPKuFnBcGGB7PAAdhfLsgxvGVsyGq/jQwgGwjAVRRx2UbSl35+imKwCPZdT5vGjq6YV1rgXIeEvA==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0"
+ }
+ },
"Microsoft.Identity.Client": {
"type": "Direct",
"requested": "[4.52.0, )",
@@ -111,25 +120,983 @@
"resolved": "2.5.0",
"contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw=="
},
+ "Azure.Core": {
+ "type": "Transitive",
+ "resolved": "1.32.0",
+ "contentHash": "NmnJxaNqKjPwnHXngVg63SrkwbJXrkT0mcK8uCx9rSq0nK6Q3Q+/GZRCaTWcdcECoRP5XK0lr3Ce8PZkHkuHNg==",
+ "dependencies": {
+ "Microsoft.Bcl.AsyncInterfaces": "1.1.1",
+ "System.Diagnostics.DiagnosticSource": "4.6.0",
+ "System.Memory.Data": "1.0.2",
+ "System.Numerics.Vectors": "4.5.0",
+ "System.Text.Encodings.Web": "4.7.2",
+ "System.Text.Json": "4.7.2",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "Azure.Data.AppConfiguration": {
+ "type": "Transitive",
+ "resolved": "1.2.0",
+ "contentHash": "KA1dAM9TuDsq0CRFd+3cJTYUAzA2z9N8t9/xKdDbP9URuReq/NDFcKYr7GW2W9xzVGDtCHlD5j5am/+zLLBdSg==",
+ "dependencies": {
+ "Azure.Core": "1.20.0",
+ "Microsoft.Bcl.AsyncInterfaces": "1.0.0",
+ "System.Text.Json": "4.6.0"
+ }
+ },
+ "Azure.Data.Tables": {
+ "type": "Transitive",
+ "resolved": "12.8.0",
+ "contentHash": "jBNOUXoANEv66mIyR+rzC7toogo48pYciH4n5xsb8nHRz6lfjX9jwsOjC8sdR1Zl75Z6MZvaZjajqVwCt3JqVw==",
+ "dependencies": {
+ "Azure.Core": "1.27.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.Identity": {
+ "type": "Transitive",
+ "resolved": "1.8.2",
+ "contentHash": "ywnpn9MLhNTtBG12WOxSaomx0Dwu5HK5PyhHH/CApGrd1BCrhgEwdy4Uwy5IfAznJzVJKZRyKR9cp4aa61xYvA==",
+ "dependencies": {
+ "Azure.Core": "1.25.0",
+ "Microsoft.Identity.Client": "4.49.1",
+ "Microsoft.Identity.Client.Extensions.Msal": "2.25.3",
+ "System.Memory": "4.5.4",
+ "System.Security.Cryptography.ProtectedData": "4.7.0",
+ "System.Text.Json": "4.7.2",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "Azure.Messaging.EventGrid": {
+ "type": "Transitive",
+ "resolved": "4.15.0",
+ "contentHash": "ydVq99LruKcWiH+BJK82sfnBPZH82BM1qr49WNUXRb4nB/jlNBnam8Ay3z010bC5v1nDdLDDW+GsVTuE6SnEmQ==",
+ "dependencies": {
+ "Azure.Core": "1.31.0",
+ "System.Memory.Data": "1.0.2",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "1.6.0",
+ "contentHash": "pd7DRK7UpsQagSwgkXiWl6k5v3aXTcEwLvyjAtozd/pr86bsmaWEtcA2aa+kt82wMH2L8nw1ByfRIY0hQQSIVg==",
+ "dependencies": {
+ "Azure.Core": "1.32.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.ResourceManager.Compute": {
+ "type": "Transitive",
+ "resolved": "1.0.0-beta.8",
+ "contentHash": "rYYjjmEdmcOa8O4UgO/bdJ/qQclNZjuHdalxRJ0AhUHCORcM1f1BbIKR9CoN83IpfuEE+X+n5XY9QZcKvfrGVA==",
+ "dependencies": {
+ "Azure.Core": "1.24.0",
+ "Azure.ResourceManager": "1.0.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.ResourceManager.Monitor": {
+ "type": "Transitive",
+ "resolved": "1.0.0-beta.2",
+ "contentHash": "yPaVtBPI3OTxAXQ+I+lxMPalrJ/YsM6rlunqFA9NIYBzRQkVFZvn013RkHY5SZUD7icKXTbanP6Nefc8vosqMg==",
+ "dependencies": {
+ "Azure.Core": "1.24.0",
+ "Azure.ResourceManager": "1.0.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.ResourceManager.Network": {
+ "type": "Transitive",
+ "resolved": "1.0.0",
+ "contentHash": "BhN2ULPSgi7vPmllXycYbGUBF/r9fI4zklGbuCBWPCNm2hJrFRQOwUy1NYy2UmLBRHtcAK7zp376n+lylsyjAg==",
+ "dependencies": {
+ "Azure.Core": "1.25.0",
+ "Azure.ResourceManager": "1.2.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.ResourceManager.Resources": {
+ "type": "Transitive",
+ "resolved": "1.6.0",
+ "contentHash": "QC1DAa8X1pQTJRC5clCWX+mfV0DJDE4hPTrgnGmBniLxLDOv9Bd143ydUliiBEYDp5u3QsQNth3O0VXIMG/b8A==",
+ "dependencies": {
+ "Azure.Core": "1.32.0",
+ "Azure.ResourceManager": "1.6.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.ResourceManager.Storage": {
+ "type": "Transitive",
+ "resolved": "1.0.0-beta.11",
+ "contentHash": "w7hOgG4yUFTRrJ65FzHeIQH8wFPczSJG12SnFiA9HrcvoceD/8CflIk5aPHzqc6moB3A1od0lwGciluovsHMbg==",
+ "dependencies": {
+ "Azure.Core": "1.25.0",
+ "Azure.ResourceManager": "1.2.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.Security.KeyVault.Secrets": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "GRnmQzTXDVABry1rC8PwuVOHSDCUGn4Om1ABTCzWfHdDSOwRydtQ13ucJ1Z0YtdajklNwxEL6lhHGhFCI0diAw==",
+ "dependencies": {
+ "Azure.Core": "1.23.0",
+ "System.Memory": "4.5.4",
+ "System.Text.Json": "4.7.2",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "Azure.Storage.Blobs": {
+ "type": "Transitive",
+ "resolved": "12.13.0",
+ "contentHash": "h5ZxRwmS/U1NOFwd+MuHJe4To1hEPu/yeBIKS1cbAHTDc+7RBZEjPf1VFeUZsIIuHvU/AzXtcRaph9BHuPRNMQ==",
+ "dependencies": {
+ "Azure.Storage.Common": "12.12.0",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Azure.Storage.Common": {
+ "type": "Transitive",
+ "resolved": "12.12.0",
+ "contentHash": "Ms0XsZ/D9Pcudfbqj+rWeCkhx/ITEq8isY0jkor9JFmDAEHsItFa2XrWkzP3vmJU6EsXQrk4snH63HkW/Jksvg==",
+ "dependencies": {
+ "Azure.Core": "1.25.0",
+ "System.IO.Hashing": "6.0.0"
+ }
+ },
+ "Azure.Storage.Queues": {
+ "type": "Transitive",
+ "resolved": "12.11.0",
+ "contentHash": "qpe1Gs1/2t18FoZORF3TgPTaF31RJhN5DQFgZ6ay6qKak9IztaqwKG8Lv2eZ/yhRKJNrOVnaZF4iqf7a4N57BA==",
+ "dependencies": {
+ "Azure.Storage.Common": "12.12.0",
+ "System.Memory.Data": "1.0.2",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Faithlife.Utility": {
+ "type": "Transitive",
+ "resolved": "0.12.2",
+ "contentHash": "JgMAGj8ekeAzKkagubXqf1UqgfHq89GyA1UQYWbkAe441uRr2Rh2rktkx5Z0LPwmD/aOqu9cxjekD2GZjP8rbw=="
+ },
+ "Google.Protobuf": {
+ "type": "Transitive",
+ "resolved": "3.23.3",
+ "contentHash": "CH/9X2w7zTYyZjGCMDlfi3ZaB1HZ3BM35XUm4WADcNWQuT5QttjE2BQ+ydSROaZ1JEJ5p7gh1LKIbf9hoWrFNA=="
+ },
+ "Grpc.Core.Api": {
+ "type": "Transitive",
+ "resolved": "2.55.0",
+ "contentHash": "qtJauqAZ4jAM6A2TQyenhpZWPfJBow7/HV/KiRbxJvYHo9jVtUL7SBIs3cjvBh5DXIUaNFIFfBQ3QGyv3nLKCw==",
+ "dependencies": {
+ "System.Memory": "4.5.3"
+ }
+ },
+ "Grpc.Net.Client": {
+ "type": "Transitive",
+ "resolved": "2.55.0",
+ "contentHash": "cQyNEAIVs/5npjSHuCKCT5kQJm3AyOnUw7h7s2lXt9rSWC/bhCGPbNAtiFGNvKiQAYgIt4zV13BS983viZP9pg==",
+ "dependencies": {
+ "Grpc.Net.Common": "2.55.0",
+ "Microsoft.Extensions.Logging.Abstractions": "3.0.3"
+ }
+ },
+ "Grpc.Net.ClientFactory": {
+ "type": "Transitive",
+ "resolved": "2.55.0",
+ "contentHash": "D8yiJjFxK2mwy0LqNlT8BhZ2nyKWds+Vh44tL2Ilub8evL/98Zt2m5D/xqteO87Ml8S4vyjXrWgSVEyH00mPSw==",
+ "dependencies": {
+ "Grpc.Net.Client": "2.55.0",
+ "Microsoft.Extensions.Http": "3.0.3"
+ }
+ },
+ "Grpc.Net.Common": {
+ "type": "Transitive",
+ "resolved": "2.55.0",
+ "contentHash": "s1tzY9Z3jKq+mcYGSkZSTTs8Gwi9M5zfXltSDIx7XvFIdSbh+QtfWiV/4n+vP8yDvFDQASaW+6BzkGUbHEftRA==",
+ "dependencies": {
+ "Grpc.Core.Api": "2.55.0"
+ }
+ },
+ "Microsoft.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==",
+ "dependencies": {
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.ApplicationInsights.DependencyCollector": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "XArm5tBEUdWs05eDKxnsUUQBduJ45DEQOMnpL7wNWxBpgxn+dbl8nObA2jzExbQhbw6P74lc/1f+RdV4iPaOgg==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.21.0",
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.ApplicationInsights.EventCounterCollector": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "MfF9IKxx9UhaYHVFQ1VKw0LYvBhkjZtPNUmCTYlGws0N7D2EaupmeIj/EWalqP47sQRedR9+VzARsONcwH8OCA==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.21.0"
+ }
+ },
+ "Microsoft.ApplicationInsights.PerfCounterCollector": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "RcckSVkfu+NkDie6/HyM6AVLHmTMVZrUrYnDeJdvRByOc2a+DqTM6KXMtsTHW/5+K7DT9QK5ZrZdi0YbBW8PVA==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.21.0",
+ "Microsoft.Extensions.Caching.Memory": "1.0.0",
+ "System.Diagnostics.PerformanceCounter": "4.7.0"
+ }
+ },
+ "Microsoft.ApplicationInsights.WindowsServer": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "Xbhss7dqbKyE5PENm1lRA9oxzhKEouKGMzgNqJ9xTHPZiogDwKVMK02qdbVhvaXKf9zG8RvvIpM5tnGR5o+Onw==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.21.0",
+ "Microsoft.ApplicationInsights.DependencyCollector": "2.21.0",
+ "Microsoft.ApplicationInsights.PerfCounterCollector": "2.21.0",
+ "Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel": "2.21.0",
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "7D4oq+9YyagEPx+0kNNOXdG6c7IDM/2d+637nAYKFqdWhNN0IqHZEed0DuG28waj7hBSLM9lBO+B8qQqgfE4rw==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.21.0",
+ "System.IO.FileSystem.AccessControl": "4.7.0"
+ }
+ },
+ "Microsoft.ApplicationInsights.WorkerService": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "Y/KcaQf+Jy92vdHTd2P8zoaW/IIUl4VkzGkvmBqi1IFQ0JXR4f6LXB73/2GMGhWMc7+QMVHeqW0QDjbLU6Fw5g==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.21.0",
+ "Microsoft.ApplicationInsights.DependencyCollector": "2.21.0",
+ "Microsoft.ApplicationInsights.EventCounterCollector": "2.21.0",
+ "Microsoft.ApplicationInsights.PerfCounterCollector": "2.21.0",
+ "Microsoft.ApplicationInsights.WindowsServer": "2.21.0",
+ "Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel": "2.21.0",
+ "Microsoft.Extensions.DependencyInjection": "2.1.1",
+ "Microsoft.Extensions.Logging.ApplicationInsights": "2.21.0"
+ }
+ },
+ "Microsoft.AspNet.WebApi.Client": {
+ "type": "Transitive",
+ "resolved": "5.2.7",
+ "contentHash": "/76fAHknzvFqbznS6Uj2sOyE9rJB3PltY+f53TH8dX9RiGhk02EhuFCWljSj5nnqKaTsmma8DFR50OGyQ4yJ1g==",
+ "dependencies": {
+ "Newtonsoft.Json": "10.0.1",
+ "Newtonsoft.Json.Bson": "1.0.1"
+ }
+ },
+ "Microsoft.AspNetCore.Cryptography.Internal": {
+ "type": "Transitive",
+ "resolved": "7.0.4",
+ "contentHash": "DmdKVBQCY34nO9pm1CijbT+AZc8tndD1uGXLUySaznl63i+xTe4PB0Gl5hQY+XMdEpjGN1ShER1ULYuAnOl6Fw=="
+ },
+ "Microsoft.AspNetCore.DataProtection": {
+ "type": "Transitive",
+ "resolved": "7.0.4",
+ "contentHash": "Al30Iak4d469xpa90w0otzv7zj893K0+YbZe/ot4hnah82MSaHkaVw5rPi5csPlQKsc6Iwznw/bH56tI1u61zg==",
+ "dependencies": {
+ "Microsoft.AspNetCore.Cryptography.Internal": "7.0.4",
+ "Microsoft.AspNetCore.DataProtection.Abstractions": "7.0.4",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Options": "7.0.1",
+ "System.Security.Cryptography.Xml": "7.0.1"
+ }
+ },
+ "Microsoft.AspNetCore.DataProtection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "7.0.4",
+ "contentHash": "LrTtzEkC28PBGDpohPtMOf26a8Sg5yvQyEtlG7z2YB93qloK2u8sqG6BDzj0rBiz/mpyVlkc8Nj36IJCvqWtPg=="
+ },
+ "Microsoft.Azure.AppConfiguration.Functions.Worker": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "cwj73rhjH27VOg5pGB7mlTkX6do96u733T8m8int62RuxcQRKQVTuzh91hpQYFsf9IFAgS/RAwdO7fTAPJ7vOA==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker": "1.6.0",
+ "Microsoft.Extensions.Configuration.AzureAppConfiguration": "6.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Extensions": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "zYKtQQoS1fdzufxFApuMFiFtoi9QAGH6McXxntpylwLKgKjmCMWdgUd1dcekzTKNR9DPSDPRLiulvukqXnpWrQ==",
+ "dependencies": {
+ "Microsoft.Azure.WebJobs": "3.0.18",
+ "Microsoft.Extensions.DependencyInjection": "2.1.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker": {
+ "type": "Transitive",
+ "resolved": "1.18.0",
+ "contentHash": "TN7OwMjHbsEX0xejRbuA/qkz0uLCoXyuhr/XoZIAcOEbj9vzRPjXD5VuTgwhFffUygkDIkLnnaGzP4peGOThAA==",
+ "dependencies": {
+ "Azure.Core": "1.10.0",
+ "Microsoft.Azure.Functions.Worker.Core": "1.14.0",
+ "Microsoft.Azure.Functions.Worker.Grpc": "1.13.0",
+ "Microsoft.Extensions.Hosting": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "1.0.0-preview4",
+ "contentHash": "oX3LX4gOQr8kLoWVbNrXJFldDs3m0YKW2CKu7Nt96BMBThmSx8PdGTwfNX42tDmZ71G6dghoilhXH1oZGiUJfw==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights.WorkerService": "2.21.0",
+ "Microsoft.Azure.Functions.Worker.Core": "1.11.0",
+ "Microsoft.Bcl.AsyncInterfaces": "5.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Core": {
+ "type": "Transitive",
+ "resolved": "1.14.0",
+ "contentHash": "9vqbGwRb7mmsplbCFWH4Yf8oco4fkypAZnNU4h3ZZSL4y1Vna/XJ2J9TwCEWc4M6nkillvQkD6zq9hhHSnLtRQ==",
+ "dependencies": {
+ "Azure.Core": "1.10.0",
+ "Microsoft.Extensions.Hosting": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0",
+ "System.Collections.Immutable": "5.0.0",
+ "System.Diagnostics.DiagnosticSource": "7.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": {
+ "type": "Transitive",
+ "resolved": "1.3.0",
+ "contentHash": "+6+/Yb/ouWUweaSQhesbbiIVSmwYEzkSfjIHrBnNqIiCYnx2iLeoYyWjN/wHP3Fnn5COtyDXRDwHKr5A/tCL9Q=="
+ },
+ "Microsoft.Azure.Functions.Worker.Extensions.EventGrid": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "8Kjhxaj2gK2Bi5K5jiNAG/e9tTlRItFNCINj+kfUDMBbf5lsiZUBChyAQCxrnITeHKkwAtgXB7GBX4W1Xcoc0A==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Extensions.SignalRService": {
+ "type": "Transitive",
+ "resolved": "1.7.0",
+ "contentHash": "mgk7ZnrXLPCI70cYgqxi+TJMJJgRMPYzZwIFMpxP2cto3D6XSxbF8eGj46T4DwopBBqWpfJ4Y2QFB93hNb4Yxg==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0",
+ "Microsoft.Extensions.Primitives": "5.0.1",
+ "System.Text.Json": "5.0.2"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Extensions.Storage": {
+ "type": "Transitive",
+ "resolved": "5.0.1",
+ "contentHash": "jz2cF1BfkIrWzOUr73vPKtgTi6jnwv0hkKPcOYTO9fUbgc7Jehfo5Rny+W/f01yEIAF6j5oouqa4Bn+XsAFa6Q==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs": "5.0.1",
+ "Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues": "5.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Extensions.Storage.Blobs": {
+ "type": "Transitive",
+ "resolved": "5.0.1",
+ "contentHash": "b8+cj8YWiEGKMHyQvt3+Ynf3u8zy99uIHzOmUX8FAl+OVRfAe9k8uexih0uXXA+ZR6y+zOT8SarrVRQMxhnKtg==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Extensions.Storage.Queues": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "cF95kiiU6PD9sptrV3GKQKzRv2DYATYNTpOtvUtbAYQ4xPFKgF4ke3fDBcu+cu2O1/C8FQ7MhzkEQv00bx552A==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.1.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Extensions.Timer": {
+ "type": "Transitive",
+ "resolved": "4.1.0",
+ "contentHash": "8HvZaChaw40EKBfBew0XG132YhO6bEw0nznvey7gkhm9thUe6wkA2LXTXHXxcYefbx0rlh57WedSiJgKTG7MvQ==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Grpc": {
+ "type": "Transitive",
+ "resolved": "1.13.0",
+ "contentHash": "ZSd916dFjEqFUJ1Rfe/T5t3MHCnPXt/cefJ2YdN3zjufMp2ImD7KBnoROTOJ0NniNMd8Ais/MX1kFGpULfPpWg==",
+ "dependencies": {
+ "Azure.Core": "1.10.0",
+ "Google.Protobuf": "3.23.3",
+ "Grpc.Net.Client": "2.55.0",
+ "Grpc.Net.ClientFactory": "2.55.0",
+ "Microsoft.Azure.Functions.Worker.Core": "1.14.0",
+ "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.3.0",
+ "Microsoft.Extensions.Hosting": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Sdk": {
+ "type": "Transitive",
+ "resolved": "1.10.0",
+ "contentHash": "U5N4c87aUvwfhjkox6A97MxM/PfXn3MctegV3VnaMPlVva/gnVMna4e3p2oGaOp/XDvJ1UmnPTcgj50yaKiZpg==",
+ "dependencies": {
+ "Microsoft.Azure.Functions.Worker.Sdk.Analyzers": "1.1.2",
+ "Microsoft.Azure.Functions.Worker.Sdk.Generators": "1.1.0-preview2"
+ }
+ },
+ "Microsoft.Azure.Functions.Worker.Sdk.Analyzers": {
+ "type": "Transitive",
+ "resolved": "1.1.2",
+ "contentHash": "e/7MOc5Tf40eiJgOBkg3O2LVtZZlqbh07Mldf/QKtNJ3JkFHHZNq8sMy5M/Ji6JOCOemSNpOwVtfSue7rJTp6Q=="
+ },
+ "Microsoft.Azure.Functions.Worker.Sdk.Generators": {
+ "type": "Transitive",
+ "resolved": "1.1.0-preview2",
+ "contentHash": "9mbUbe5AYkj8bvx2GNl4H1CzMS01nAhE/uCsjeSvQFEJs5mREQk6FafSbpVOXAaQ7JMgEZ3aGUfmwdCI94NoOw=="
+ },
+ "Microsoft.Azure.Management.Monitor": {
+ "type": "Transitive",
+ "resolved": "0.28.0-preview",
+ "contentHash": "XgWDDtop/1/uvO76GJ5vyjwvhkvnsLPgouqf7i9EU2QavWP8AL+Vu/aEL2wgPkGml6an+JSrrCKtI8eFjPCyGA==",
+ "dependencies": {
+ "Microsoft.Rest.ClientRuntime": "[2.3.20, 3.0.0)",
+ "Microsoft.Rest.ClientRuntime.Azure": "[3.3.19, 4.0.0)",
+ "Newtonsoft.Json": "10.0.3",
+ "System.Net.Http": "4.3.0"
+ }
+ },
+ "Microsoft.Azure.Management.OperationalInsights": {
+ "type": "Transitive",
+ "resolved": "0.24.0-preview",
+ "contentHash": "wPDI5PLv/whYHPArcmDOaemdhNBEgDfCUZbJcmuXy7TjNujp4ibwyCpbnyA6uwoeyhmsW/1tp9LnTQ5WnT4HuQ==",
+ "dependencies": {
+ "Microsoft.Rest.ClientRuntime": "[2.3.20, 3.0.0)",
+ "Microsoft.Rest.ClientRuntime.Azure": "[3.3.19, 4.0.0)",
+ "Newtonsoft.Json": "10.0.3",
+ "System.Net.Http": "4.3.0"
+ }
+ },
+ "Microsoft.Azure.WebJobs": {
+ "type": "Transitive",
+ "resolved": "3.0.18",
+ "contentHash": "aYJ76yjPkIpsafqFp1Xz1sA06RvhUwqJnk4AqX4I0teuRjPyig9Sv7LTzxUMAppKXc4JyR/Asos2At/LMiblqg==",
+ "dependencies": {
+ "Microsoft.Azure.WebJobs.Core": "3.0.18",
+ "Microsoft.Extensions.Configuration": "2.1.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "2.1.0",
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": "2.1.0",
+ "Microsoft.Extensions.Configuration.Json": "2.1.0",
+ "Microsoft.Extensions.Hosting": "2.1.0",
+ "Microsoft.Extensions.Logging": "2.1.0",
+ "Microsoft.Extensions.Logging.Abstractions": "2.1.0",
+ "Microsoft.Extensions.Logging.Configuration": "2.1.0",
+ "Newtonsoft.Json": "11.0.2",
+ "System.Threading.Tasks.Dataflow": "4.8.0"
+ }
+ },
+ "Microsoft.Azure.WebJobs.Core": {
+ "type": "Transitive",
+ "resolved": "3.0.18",
+ "contentHash": "ajYI8pPzPn4qq7FL8C2tz9WmFEG5PorUlkw8W9CF5M+5egnFJaF7yH48WYC+zBoQIzv2vHmFq0zhQpnv+O8v5Q==",
+ "dependencies": {
+ "System.ComponentModel.Annotations": "4.4.0",
+ "System.Diagnostics.TraceSource": "4.3.0"
+ }
+ },
+ "Microsoft.Bcl.AsyncInterfaces": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg=="
+ },
"Microsoft.CodeCoverage": {
"type": "Transitive",
"resolved": "17.6.2",
"contentHash": "t+DjPlq7GIxIkOK/jiTmNeiEMVkfVCynBEZyV+IMg2ro43NugKExng+7a04R1fBLi+d6voxjeDxL2ozdl+XyVg=="
},
- "Microsoft.IdentityModel.Abstractions": {
+ "Microsoft.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "kaj6Wb4qoMuH3HySFJhxwQfe8R/sJsNJnANrvv8WdFPMoNbKY5htfNscv+LHCu5ipz+49m2e+WQXpLXr9XYemQ=="
+ },
+ "Microsoft.Extensions.Caching.Abstractions": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.Caching.Memory": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==",
+ "dependencies": {
+ "Microsoft.Extensions.Caching.Abstractions": "7.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Options": "7.0.0",
+ "Microsoft.Extensions.Primitives": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "LN322qEKHjuVEhhXueTUe7RNePooZmS8aGid5aK2woX3NPjSnONFyKUc6+JknOS6ce6h2tCLfKPTBXE3mN/6Ag==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.AzureAppConfiguration": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "oRCr8qqBp/37CXttfgbEWnPznHy0/ZCkgNVFFQ5cnXGvG8TBWicnAK032opyrbGIH3n2jYSg/PvIw7aLoOTy3Q==",
+ "dependencies": {
+ "Azure.Data.AppConfiguration": "1.2.0",
+ "Azure.Messaging.EventGrid": "4.7.0",
+ "Azure.Security.KeyVault.Secrets": "4.3.0",
+ "Microsoft.Extensions.Configuration": "3.1.18",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "3.1.18",
+ "Microsoft.Extensions.Logging": "3.1.18",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "Of1Irt1+NzWO+yEYkuDh5TpT4On7LKl98Q9iLqCdOZps6XXEWDj3AKtmyvzJPVXZe4apmkJJIiDL7rR1yC+hjQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.CommandLine": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "OelM+VQdhZ0XMXsEQBq/bt3kFzD+EBGqR4TAgFDRAye0JfvHAaRi+3BxCRcwqUAwDhV0U0HieljBGHlTgYseRA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "fqh6y6hAi0Z0fRsb4B/mP9OkKkSlifh5osa+N/YSQ+/S2a//+zYApZMUC1XeP9fdjlgZoPQoZ72Q2eLHyKLddQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.FileExtensions": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "rRdspYKA18ViPOISwAihhCMbusHsARCOtDMwa23f+BGEdIjpKPlhs3LLjmKlxfhpGXBjIsS0JpXcChjRUN+PAw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Physical": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Json": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "Pak8ymSUfdzPfBTLHxeOwcR32YDbuVfhnH2hkfOLnJNQd19ItlBdpMjIDY9C5O/nS2Sn9bzDMai0ZrvF7KyY/Q==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Configuration.FileExtensions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.UserSecrets": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "+tK3seG68106lN277YWQvqmfyI/89w0uTu/5Gz5VYSUu5TI4mqwsaWLlSmT9Bl1yW/i1Nr06gHJxqaqB5NU9Tw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Configuration.Json": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Physical": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw=="
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "NyawiW9ZT/liQb34k9YqBSNPLuuPkrjMgQZ24Y/xXX1RoiBkLUdPMaQTmxhZ5TYu8ZKZ9qayzil75JX95vGQUg==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Physical": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "1rkd8UO2qf21biwO7X0hL9uHP7vtfmdv/NLvKgCRHkdz1XnW8zVQJXyEYiN68WYpExgtVWn55QF0qBzgfh1mGg==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileSystemGlobbing": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileSystemGlobbing": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "ArliS8lGk8sWRtrWpqI8yUVYJpRruPjCDT+EIjrgkA/AAPRctlAkRISVZ334chAKktTLzD1+PK8F5IZpGedSqA=="
+ },
+ "Microsoft.Extensions.Hosting": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "hiokSU1TOVfcqpQAnpiOzP2rE9p+niq92g5yeAnwlbSrUlIdIS6M8emCknZvhdOagQA9x5YWNwe1n0kFUwE0NQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "5.0.0",
+ "Microsoft.Extensions.Configuration.CommandLine": "5.0.0",
+ "Microsoft.Extensions.Configuration.EnvironmentVariables": "5.0.0",
+ "Microsoft.Extensions.Configuration.FileExtensions": "5.0.0",
+ "Microsoft.Extensions.Configuration.Json": "5.0.0",
+ "Microsoft.Extensions.Configuration.UserSecrets": "5.0.0",
+ "Microsoft.Extensions.DependencyInjection": "5.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Physical": "5.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging.Configuration": "5.0.0",
+ "Microsoft.Extensions.Logging.Console": "5.0.0",
+ "Microsoft.Extensions.Logging.Debug": "5.0.0",
+ "Microsoft.Extensions.Logging.EventLog": "5.0.0",
+ "Microsoft.Extensions.Logging.EventSource": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "43n9Je09z0p/7ViPxfRqs5BUItRLNVh5b6JH40F2Agkh2NBsY/jpNYTtbCcxrHCsA3oRmbR6RJBzUutB4VZvNQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "7.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "3.0.3",
+ "contentHash": "dcyB8szIcSynjVZRuFgqkZpPgTc5zeRSj1HMXSmNqWbHYKiPYJl8ZQgBHz6wmZNSUUNGpCs5uxUg8DZHHDC1Ew==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "3.0.3",
+ "Microsoft.Extensions.Logging": "3.0.3",
+ "Microsoft.Extensions.Options": "3.0.3"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "7.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Options": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw=="
+ },
+ "Microsoft.Extensions.Logging.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "2.21.0",
+ "contentHash": "tjzErt5oaLs1caaThu6AbtJuHH0oIGDG/rYCXDruHVGig3m8MyCDuwDsGQwzimY7g4aFyLOKfHc3unBN2G96gw==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.21.0",
+ "Microsoft.Extensions.Logging": "2.1.1"
+ }
+ },
+ "Microsoft.Extensions.Logging.Configuration": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "N3/d0HeMRnBekadbZlmbp+In8EvNNkQHSdbtRzjrGVckdZWpYs5GNrAfaYqVplDFW0WUedSaFJ3khB50BWYGsw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "5.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Console": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "jH0wbWhfvXjOVmCkbra4vbiovDtTUIWLQjCeJ7Xun3h4AHvwfzm7V7wlsXKs3tNnPrsCxZ9oaV0vUAgGY1JxOA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging.Configuration": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Debug": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "9dvt0xqRrClvhaPNpfyS39WxnW9G55l5lrV5ZX7IrEgwo4VwtmJKtoPiKVYKbhAuOBGUI5WY3hWLvF+PSbJp5A==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.EventLog": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "CYzsgF2lqgahGl/HuErsIDaZZ9ueN+MBjGfO/0jVDLPaXLaywxlGKFpDgXMaB053DRYZwD1H2Lb1I60mTXS3jg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0",
+ "System.Diagnostics.EventLog": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.EventSource": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "hF+D6PJkrM0qXcSEGs1BwZwgP8c0BRkj26P/5wmYTcHKOp52GRey/Z/YKRmRIHIrXxj9tz/JgIjU9oWmiJ5HMw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Logging": "5.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "7.0.1",
+ "contentHash": "pZRDYdN1FpepOIfHU62QoBQ6zdAoTvnjxFfqAzEd9Jhb2dfhA5i6jeTdgGgcgTWFRC7oT0+3XrbQu4LjvgX1Nw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
+ "Microsoft.Extensions.Primitives": "7.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "280RxNJqOeQqq47aJLy5D9LN61CAWeuRA83gPToQ8B9jl9SNdQ5EXjlfvF66zQI5AXMl+C/3hGnbtIEN+X3mqA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "5.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Options": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q=="
+ },
+ "Microsoft.FeatureManagement": {
+ "type": "Transitive",
+ "resolved": "2.5.1",
+ "contentHash": "ERbRjk0etZs4d5Pv17unfogO4iBwV2c/HoBt4jqIJmfbKbmTLV+GbjBPYzidIg2RgYIFi8yA+EoEapSAIOp19g==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "2.1.10",
+ "Microsoft.Extensions.Logging": "2.1.1"
+ }
+ },
+ "Microsoft.Graph": {
+ "type": "Transitive",
+ "resolved": "4.37.0",
+ "contentHash": "XfbRLmmyJkNcNFbjC+FP+LgeFiOk2cNn7TeLh9A2T24UXCwy8Kz4rKTvfmdgYUAO8fcSe4kkGNOmfG1H6Myktg==",
+ "dependencies": {
+ "Microsoft.Graph.Core": "2.0.12"
+ }
+ },
+ "Microsoft.Graph.Core": {
+ "type": "Transitive",
+ "resolved": "2.0.12",
+ "contentHash": "3a6vQADJMDJX0ZrU+lVYjlJxpsDAJNUmgB8vXodwrlGHkHJP7TqsQZ43MeU35XkoPfWtEj06+Hed3SLFlkoqAg==",
+ "dependencies": {
+ "Azure.Core": "1.25.0",
+ "Microsoft.Identity.Client": "4.46.1",
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.22.0",
+ "System.Diagnostics.DiagnosticSource": "4.7.1",
+ "System.Net.Http": "4.3.4",
+ "System.Security.Claims": "4.3.0",
+ "System.Text.Json": "6.0.5"
+ }
+ },
+ "Microsoft.Identity.Client.Extensions.Msal": {
+ "type": "Transitive",
+ "resolved": "2.25.3",
+ "contentHash": "I6/Od0d3OMD9b7RPxW1l25A8oA94H+r9ZtrOe4Ogk49Ftxhs9RS+pbzPE5dLe0i7nQy+1aob7mR22YsNcc0BiQ==",
+ "dependencies": {
+ "Microsoft.Identity.Client": "4.49.1",
+ "System.IO.FileSystem.AccessControl": "5.0.0",
+ "System.Security.Cryptography.ProtectedData": "4.5.0"
+ }
+ },
+ "Microsoft.Identity.Web.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "SOY9upekrafFvrVToTXMX8hLUtvJM/OSIXTirq4/LkU6I7IlNRmZ7ULddD4D/r4mS6JoV3lWcLYAkcfnS2JGQg=="
+ },
+ "Microsoft.Identity.Web.TokenCache": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "lyPG8/zAfMETuynAGX3xC3ZlSfs8BoFoJ+3aqOxl8CdGYsHkB+faSHo/m1Qi5Snq08MQ8Ld6tx6rY8h7Pf31xQ==",
+ "dependencies": {
+ "Microsoft.AspNetCore.DataProtection": "7.0.4",
+ "Microsoft.Extensions.Caching.Memory": "7.0.0",
+ "Microsoft.Extensions.Logging": "7.0.0",
+ "Microsoft.Identity.Client": "4.51.0",
+ "Microsoft.Identity.Web.Diagnostics": "2.7.0",
+ "System.Drawing.Common": "4.7.2",
+ "System.Security.Cryptography.Xml": "7.0.1",
+ "System.Text.Encodings.Web": "7.0.0"
+ }
+ },
+ "Microsoft.IdentityModel.Abstractions": {
+ "type": "Transitive",
+ "resolved": "6.29.0",
+ "contentHash": "qBEGruUGU5YkqV58ykpbtT5oUWzChe+xVy/siPFPzB4KydqDv6r91ElbiifIn9ncAceFtuEkIUQWav76lg7e0A=="
+ },
+ "Microsoft.IdentityModel.JsonWebTokens": {
+ "type": "Transitive",
+ "resolved": "6.29.0",
+ "contentHash": "lJRNpOKsPqCSf1DRDlWUsM272DQKhfLtU7dKAVOnJBsN5z1wP5lncdY1RqC5uAMdGspsyjSLe0qs1aWl+lIGZQ==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Tokens": "6.29.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encodings.Web": "4.7.2",
+ "System.Text.Json": "4.7.2"
+ }
+ },
+ "Microsoft.IdentityModel.Logging": {
+ "type": "Transitive",
+ "resolved": "6.29.0",
+ "contentHash": "71GkXXyBNnIzs2Ybgi7FamQSrieVNPo+FLKECnFQOOgfIZdJ4jz5O3kBY7wIj4l8GbD+nKZkWYvcl6/Yk5up5g==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Abstractions": "6.29.0"
+ }
+ },
+ "Microsoft.IdentityModel.Protocols": {
+ "type": "Transitive",
+ "resolved": "6.22.0",
+ "contentHash": "DZ9yTL2xSk2C3i6QjOgQvNhfSnQ3ZnmOEVlmL2i4ZQHw3jigZmioE8XGv59Ba7rnk6xAl+Oo8DxlkZv4qU/4rQ==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Logging": "6.22.0",
+ "Microsoft.IdentityModel.Tokens": "6.22.0"
+ }
+ },
+ "Microsoft.IdentityModel.Protocols.OpenIdConnect": {
+ "type": "Transitive",
+ "resolved": "6.22.0",
+ "contentHash": "Ig+zgdXT5rbzhN71TkjeHd7HMWO+wq89V5KecXWgJvNrWKTp2xVerDsWqM5SUz7UU3d1m6aotq4ABKZuNn71qA==",
+ "dependencies": {
+ "Microsoft.IdentityModel.Protocols": "6.22.0",
+ "System.IdentityModel.Tokens.Jwt": "6.22.0"
+ }
+ },
+ "Microsoft.IdentityModel.Tokens": {
+ "type": "Transitive",
+ "resolved": "6.29.0",
+ "contentHash": "llkQIhO3E/+7iXjGywJmBUe+kdyygsFo2RGlzFEGxPQRN7sgZDGk9pM6aJ/aFM3oQeugKWfM30wPFMgT69FXeQ==",
+ "dependencies": {
+ "Microsoft.CSharp": "4.5.0",
+ "Microsoft.IdentityModel.Logging": "6.29.0",
+ "System.Security.Cryptography.Cng": "4.5.0"
+ }
+ },
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
+ },
+ "Microsoft.NETCore.Targets": {
+ "type": "Transitive",
+ "resolved": "1.1.3",
+ "contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ=="
+ },
+ "Microsoft.Rest.ClientRuntime": {
+ "type": "Transitive",
+ "resolved": "2.3.24",
+ "contentHash": "hZH7XgM3eV2jFrnq7Yf0nBD4WVXQzDrer2gEY7HMNiwio2hwDsTHO6LWuueNQAfRpNp4W7mKxcXpwXUiuVIlYw==",
+ "dependencies": {
+ "Newtonsoft.Json": "10.0.3"
+ }
+ },
+ "Microsoft.Rest.ClientRuntime.Azure": {
"type": "Transitive",
- "resolved": "6.22.0",
- "contentHash": "iI+9V+2ciCrbheeLjpmjcqCnhy+r6yCoEcid3nkoFWerHgjVuT6CPM4HODUTtUPe1uwks4wcnAujJ8u+IKogHQ=="
+ "resolved": "3.3.19",
+ "contentHash": "+NVBWvRXNwaAPTZUxjUlQggsrf3X0GbiRoxYfgc3kG9E55ZxZxvZPT3nIfC4DNqzGSXUEvmLbckdXgBBzGdUaA==",
+ "dependencies": {
+ "Microsoft.Rest.ClientRuntime": "[2.3.19, 3.0.0)",
+ "Newtonsoft.Json": "10.0.3"
+ }
},
- "Microsoft.NETCore.Platforms": {
+ "Microsoft.TeamFoundation.DistributedTask.Common.Contracts": {
"type": "Transitive",
- "resolved": "1.1.1",
- "contentHash": "TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ=="
+ "resolved": "19.219.0-preview",
+ "contentHash": "+LYJnc0rlPNJg2T5TgVkjPOypJxslwxbD/ALl3DM7c3UB0Ttmqx546A1VXJeab9ofxgHnaxzElNIOlmJEPY6rQ==",
+ "dependencies": {
+ "Microsoft.VisualStudio.Services.Client": "[19.219.0-preview]"
+ }
},
- "Microsoft.NETCore.Targets": {
+ "Microsoft.TeamFoundationServer.Client": {
"type": "Transitive",
- "resolved": "1.1.3",
- "contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ=="
+ "resolved": "19.219.0-preview",
+ "contentHash": "0Jkm+SOVEW7W9ym/C4v3P1CUJ0E50/dFXjOeRyAYwnKqxG22VliDZgpAlnQ0M7vDk2M2Tldo6mKsKWZebX9d0g==",
+ "dependencies": {
+ "Microsoft.AspNet.WebApi.Client": "5.2.7",
+ "Microsoft.TeamFoundation.DistributedTask.Common.Contracts": "[19.219.0-preview]",
+ "Microsoft.VisualStudio.Services.Client": "[19.219.0-preview]",
+ "Newtonsoft.Json": "13.0.2",
+ "System.ComponentModel.Annotations": "5.0.0"
+ }
},
"Microsoft.TestPlatform.ObjectModel": {
"type": "Transitive",
@@ -149,6 +1116,22 @@
"Newtonsoft.Json": "13.0.1"
}
},
+ "Microsoft.VisualStudio.Services.Client": {
+ "type": "Transitive",
+ "resolved": "19.219.0-preview",
+ "contentHash": "RGtUL3Q/qSxJZtcRZApB91W2vAGTNwaO7nzAyN86vtAzm8u/pEVlBvoEZ1wx6HF4JRvFlyWvUHN+Z6kAj6nk8w==",
+ "dependencies": {
+ "Microsoft.AspNet.WebApi.Client": "5.2.7",
+ "Newtonsoft.Json": "13.0.2",
+ "System.Configuration.ConfigurationManager": "6.0.1",
+ "System.Data.SqlClient": "4.8.5",
+ "System.Security.Cryptography.Cng": "5.0.0",
+ "System.Security.Cryptography.OpenSsl": "5.0.0",
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Principal.Windows": "5.0.0",
+ "System.Xml.XPath.XmlDocument": "4.3.0"
+ }
+ },
"Microsoft.Win32.Primitives": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -159,6 +1142,20 @@
"System.Runtime": "4.3.0"
}
},
+ "Microsoft.Win32.Registry": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
"NETStandard.Library": {
"type": "Transitive",
"resolved": "1.6.1",
@@ -212,14 +1209,57 @@
},
"Newtonsoft.Json": {
"type": "Transitive",
- "resolved": "13.0.1",
- "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A=="
+ "resolved": "13.0.2",
+ "contentHash": "R2pZ3B0UjeyHShm9vG+Tu0EBb2lC8b0dFzV9gVn50ofHXh9Smjk6kTn7A/FdAsC8B5cKib1OnGYOXxRBz5XQDg=="
+ },
+ "Newtonsoft.Json.Bson": {
+ "type": "Transitive",
+ "resolved": "1.0.1",
+ "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==",
+ "dependencies": {
+ "NETStandard.Library": "1.6.1",
+ "Newtonsoft.Json": "10.0.1"
+ }
},
"NuGet.Frameworks": {
"type": "Transitive",
"resolved": "6.5.0",
"contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg=="
},
+ "Octokit": {
+ "type": "Transitive",
+ "resolved": "2.0.1",
+ "contentHash": "JVlfUY+sfItl6RSyVKDJTutuy28cDydUwKKfzcelwNMor2Sa18pYVKna6phO8lug1b+ep+pcuFh/FPayuImsQw=="
+ },
+ "OpenTelemetry.Api": {
+ "type": "Transitive",
+ "resolved": "1.5.0-rc.1",
+ "contentHash": "KQYeO/UgV1WoaxOh9l4qV15T1FVow7Aflz1yplSgdnJPqji62hD9+hCe2tQ001iJ9l/mv1/x0xfVEZlRfwDaUA==",
+ "dependencies": {
+ "System.Diagnostics.DiagnosticSource": "7.0.0"
+ }
+ },
+ "Polly": {
+ "type": "Transitive",
+ "resolved": "8.0.0-alpha.2",
+ "contentHash": "CrZqfioV2FG4ip7622CKk7B0Jey6fttRzVGu7Md6MVcIotQxZqR/zy8FW8dUL0B15whoCW5U0t1JBd27Pm1GXw==",
+ "dependencies": {
+ "Polly.Core": "8.0.0-alpha.2"
+ }
+ },
+ "Polly.Core": {
+ "type": "Transitive",
+ "resolved": "8.0.0-alpha.2",
+ "contentHash": "X58/YFxm15uRJyA1Bo1ZPNSYOXmu1MD4CQD4BJr/a0qVOGPkqJOucSQVP6bcQSGgrZXLgPEGZbgSHtJx9qE0VQ=="
+ },
+ "Polly.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "drrG+hB3pYFY7w1c3BD+lSGYvH2oIclH8GRSehgfyP5kjnFnHKQuuBhuHLv+PWyFuaTDyk/vfRpnxOzd11+J8g==",
+ "dependencies": {
+ "Polly": "7.1.0"
+ }
+ },
"runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
"type": "Transitive",
"resolved": "4.3.2",
@@ -244,6 +1284,16 @@
"Microsoft.NETCore.Targets": "1.1.0"
}
},
+ "runtime.native.System.Data.SqlClient.sni": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==",
+ "dependencies": {
+ "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0",
+ "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0",
+ "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0"
+ }
+ },
"runtime.native.System.IO.Compression": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -327,6 +1377,36 @@
"resolved": "4.3.2",
"contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg=="
},
+ "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": {
+ "type": "Transitive",
+ "resolved": "4.4.0",
+ "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg=="
+ },
+ "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": {
+ "type": "Transitive",
+ "resolved": "4.4.0",
+ "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ=="
+ },
+ "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": {
+ "type": "Transitive",
+ "resolved": "4.4.0",
+ "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA=="
+ },
+ "Scriban": {
+ "type": "Transitive",
+ "resolved": "5.5.0",
+ "contentHash": "e6n2qpSPlOx43+y1PeEukwu5n4i0slIUIMaFSndiIydfNuVqRbqL2QLd4y+BzFWDfN349YT71N/J38CH2IYb+w=="
+ },
+ "Semver": {
+ "type": "Transitive",
+ "resolved": "2.3.0",
+ "contentHash": "4vYo1zqn6pJ1YrhjuhuOSbIIm0CpM47grbpTJ5ABjOlfGt/EhMEM9ed4MRK5Jr6gVnntWDqOUzGeUJp68PZGjw=="
+ },
+ "SmartAnalyzers.CSharpExtensions.Annotations": {
+ "type": "Transitive",
+ "resolved": "4.2.7",
+ "contentHash": "9fRFxTUwPmH7lukckwEvvKawMcP8ObwnOngN8kx5Bx773WHSku1EGa5BIteV07th5553il76fPX7U1xz2bFmuQ=="
+ },
"System.AppContext": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -374,12 +1454,23 @@
"System.Threading.Tasks": "4.3.0"
}
},
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g=="
+ },
+ "System.ComponentModel.Annotations": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg=="
+ },
"System.Configuration.ConfigurationManager": {
"type": "Transitive",
- "resolved": "4.4.0",
- "contentHash": "gWwQv/Ug1qWJmHCmN17nAbxJYmQBM/E94QxKLksvUiiKB1Ld3Sc/eK1lgmbSjDFxkQhVuayI/cGFZhpBSodLrg==",
+ "resolved": "6.0.1",
+ "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==",
"dependencies": {
- "System.Security.Cryptography.ProtectedData": "4.4.0"
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
}
},
"System.Console": {
@@ -394,6 +1485,16 @@
"System.Text.Encoding": "4.3.0"
}
},
+ "System.Data.SqlClient": {
+ "type": "Transitive",
+ "resolved": "4.8.5",
+ "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==",
+ "dependencies": {
+ "Microsoft.Win32.Registry": "4.7.0",
+ "System.Security.Principal.Windows": "4.7.0",
+ "runtime.native.System.Data.SqlClient.sni": "4.7.0"
+ }
+ },
"System.Diagnostics.Debug": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -406,14 +1507,28 @@
},
"System.Diagnostics.DiagnosticSource": {
"type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==",
+ "resolved": "8.0.0-preview.4.23259.5",
+ "contentHash": "p7bkTixVHLOALaNlqX+8uBMT68Fbo0yoEigLQ6ya9wNRPThGx5V14et7kf9pVQbR9gN1H2zqSPbX0y8nrXTq+g=="
+ },
+ "System.Diagnostics.EventLog": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "FHkCwUfsTs+/5tsK+c0egLfacUgbhvcwi3wUFWSEEArSXao343mYqcpOVVFMlcCkdNtjU4YwAWaKYwal6f02og==",
"dependencies": {
- "System.Collections": "4.3.0",
- "System.Diagnostics.Tracing": "4.3.0",
- "System.Reflection": "4.3.0",
- "System.Runtime": "4.3.0",
- "System.Threading": "4.3.0"
+ "Microsoft.NETCore.Platforms": "5.0.0",
+ "Microsoft.Win32.Registry": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "System.Diagnostics.PerformanceCounter": {
+ "type": "Transitive",
+ "resolved": "4.7.0",
+ "contentHash": "kE9szT4i3TYT9bDE/BPfzg9/BL6enMiZlcUmnUEBrhRtxWvurKoa8qhXkLTRhrxMzBqaDleWlRfIPE02tulU+w==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "3.1.0",
+ "Microsoft.Win32.Registry": "4.7.0",
+ "System.Configuration.ConfigurationManager": "4.7.0",
+ "System.Security.Principal.Windows": "4.7.0"
}
},
"System.Diagnostics.Tools": {
@@ -426,6 +1541,22 @@
"System.Runtime": "4.3.0"
}
},
+ "System.Diagnostics.TraceSource": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VnYp1NxGx8Ww731y2LJ1vpfb/DKVNKEZ8Jsh5SgQTZREL/YpWRArgh9pI8CDLmgHspZmLL697CaLvH85qQpRiw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "runtime.native.System": "4.3.0"
+ }
+ },
"System.Diagnostics.Tracing": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -436,6 +1567,14 @@
"System.Runtime": "4.3.0"
}
},
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
"System.Formats.Asn1": {
"type": "Transitive",
"resolved": "7.0.0",
@@ -475,6 +1614,15 @@
"System.Runtime.InteropServices": "4.3.0"
}
},
+ "System.IdentityModel.Tokens.Jwt": {
+ "type": "Transitive",
+ "resolved": "6.29.0",
+ "contentHash": "2WwptlYJQffT6z7V0WVoChznOBjacAIByLSoXp5fZ8kK33heAAqn/aX50xB+cQNfKFYRGVbqiVrzz+m80Q2zcA==",
+ "dependencies": {
+ "Microsoft.IdentityModel.JsonWebTokens": "6.29.0",
+ "Microsoft.IdentityModel.Tokens": "6.29.0"
+ }
+ },
"System.IO": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -540,6 +1688,15 @@
"System.Threading.Tasks": "4.3.0"
}
},
+ "System.IO.FileSystem.AccessControl": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
"System.IO.FileSystem.Primitives": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -548,6 +1705,11 @@
"System.Runtime": "4.3.0"
}
},
+ "System.IO.Hashing": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "Rfm2jYCaUeGysFEZjDe7j1R4x6Z6BzumS/vUT5a1AA/AWJuGX71PoGB0RmpyX3VmrGqVnAwtfMn39OHR8Y/5+g=="
+ },
"System.Linq": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -560,6 +1722,14 @@
"System.Runtime.Extensions": "4.3.0"
}
},
+ "System.Linq.Async": {
+ "type": "Transitive",
+ "resolved": "6.0.1",
+ "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==",
+ "dependencies": {
+ "Microsoft.Bcl.AsyncInterfaces": "6.0.0"
+ }
+ },
"System.Linq.Expressions": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -584,6 +1754,20 @@
"System.Threading": "4.3.0"
}
},
+ "System.Memory": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw=="
+ },
+ "System.Memory.Data": {
+ "type": "Transitive",
+ "resolved": "1.0.2",
+ "contentHash": "JGkzeqgBsiZwKJZ1IxPNsDFZDhUvuEdX8L8BDC8N3KOj+6zMcNU28CNN59TpZE/VJYy9cP+5M+sbxtWJx3/xtw==",
+ "dependencies": {
+ "System.Text.Encodings.Web": "4.7.2",
+ "System.Text.Json": "4.6.0"
+ }
+ },
"System.Net.Primitives": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -608,6 +1792,11 @@
"System.Threading.Tasks": "4.3.0"
}
},
+ "System.Numerics.Vectors": {
+ "type": "Transitive",
+ "resolved": "4.5.0",
+ "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ=="
+ },
"System.ObjectModel": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -721,6 +1910,11 @@
"Microsoft.NETCore.Targets": "1.1.3"
}
},
+ "System.Runtime.CompilerServices.Unsafe": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
+ },
"System.Runtime.Extensions": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -779,6 +1973,25 @@
"System.Runtime.Extensions": "4.3.0"
}
},
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Claims": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "P/+BR/2lnc4PNDHt/TPBAWHVMLMRHsyYZbU1NphW4HIWzCggz8mJbTQQ3MKljFE7LS3WagmVFuBgoLcFzYXlkA==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Security.Principal": "4.3.0"
+ }
+ },
"System.Security.Cryptography.Algorithms": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -802,20 +2015,10 @@
},
"System.Security.Cryptography.Cng": {
"type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==",
+ "resolved": "5.0.0",
+ "contentHash": "jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==",
"dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0",
- "System.IO": "4.3.0",
- "System.Resources.ResourceManager": "4.3.0",
- "System.Runtime": "4.3.0",
- "System.Runtime.Extensions": "4.3.0",
- "System.Runtime.Handles": "4.3.0",
- "System.Runtime.InteropServices": "4.3.0",
- "System.Security.Cryptography.Algorithms": "4.3.0",
- "System.Security.Cryptography.Encoding": "4.3.0",
- "System.Security.Cryptography.Primitives": "4.3.0",
- "System.Text.Encoding": "4.3.0"
+ "System.Formats.Asn1": "5.0.0"
}
},
"System.Security.Cryptography.Csp": {
@@ -859,22 +2062,10 @@
},
"System.Security.Cryptography.OpenSsl": {
"type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==",
+ "resolved": "5.0.0",
+ "contentHash": "D3aDrPOPBORUl6V/WJ2AtN3Ae48aSH0W7yChBIecvu1lyoAhopPORmMpNTjv5/Kay7Z+h3KXpfbvteIm7x7miA==",
"dependencies": {
- "System.Collections": "4.3.0",
- "System.IO": "4.3.0",
- "System.Resources.ResourceManager": "4.3.0",
- "System.Runtime": "4.3.0",
- "System.Runtime.Extensions": "4.3.0",
- "System.Runtime.Handles": "4.3.0",
- "System.Runtime.InteropServices": "4.3.0",
- "System.Runtime.Numerics": "4.3.0",
- "System.Security.Cryptography.Algorithms": "4.3.0",
- "System.Security.Cryptography.Encoding": "4.3.0",
- "System.Security.Cryptography.Primitives": "4.3.0",
- "System.Text.Encoding": "4.3.0",
- "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ "System.Formats.Asn1": "5.0.0"
}
},
"System.Security.Cryptography.Primitives": {
@@ -893,8 +2084,8 @@
},
"System.Security.Cryptography.ProtectedData": {
"type": "Transitive",
- "resolved": "4.4.0",
- "contentHash": "cJV7ScGW7EhatRsjehfvvYVBvtiSMKgN8bOVI0bQhnF5bU7vnHVIsH49Kva7i7GWaWYvmEzkYVk1TC+gZYBEog=="
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
},
"System.Security.Cryptography.X509Certificates": {
"type": "Transitive",
@@ -928,6 +2119,36 @@
"runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
}
},
+ "System.Security.Cryptography.Xml": {
+ "type": "Transitive",
+ "resolved": "7.0.1",
+ "contentHash": "MCxBCtH0GrDuvU63ZODwQHQZPchb24pUAX3MfZ6b13qg246ZD10PRdOvay8C9HBPfCXkymUNwFPEegud7ax2zg==",
+ "dependencies": {
+ "System.Security.Cryptography.Pkcs": "7.0.0"
+ }
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Security.Principal": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Security.Principal.Windows": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
+ },
"System.Text.Encoding": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -949,6 +2170,20 @@
"System.Text.Encoding": "4.3.0"
}
},
+ "System.Text.Encodings.Web": {
+ "type": "Transitive",
+ "resolved": "7.0.0",
+ "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg=="
+ },
+ "System.Text.Json": {
+ "type": "Transitive",
+ "resolved": "6.0.5",
+ "contentHash": "SSH+YYrMpvLcy7Orzb5K1tSyffnFacWahyxCCjYH1PbSHdAF4dekmIetBurFKgtTHDmwEe/J2Csi/7niRH6d/g==",
+ "dependencies": {
+ "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+ "System.Text.Encodings.Web": "6.0.0"
+ }
+ },
"System.Threading": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -968,15 +2203,15 @@
"System.Runtime": "4.3.0"
}
},
+ "System.Threading.Tasks.Dataflow": {
+ "type": "Transitive",
+ "resolved": "4.8.0",
+ "contentHash": "PSIdcgbyNv7FZvZ1I9Mqy6XZOwstYYMdZiXuHvIyc0gDyPjEhrrP9OvTGDHp+LAHp1RNSLjPYssyqox9+Kt9Ug=="
+ },
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
- "resolved": "4.3.0",
- "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==",
- "dependencies": {
- "System.Collections": "4.3.0",
- "System.Runtime": "4.3.0",
- "System.Threading.Tasks": "4.3.0"
- }
+ "resolved": "4.5.4",
+ "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
},
"System.Threading.Timer": {
"type": "Transitive",
@@ -988,6 +2223,14 @@
"System.Runtime": "4.3.0"
}
},
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
"System.Xml.ReaderWriter": {
"type": "Transitive",
"resolved": "4.3.0",
@@ -1029,6 +2272,61 @@
"System.Xml.ReaderWriter": "4.3.0"
}
},
+ "System.Xml.XmlDocument": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0"
+ }
+ },
+ "System.Xml.XPath": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "v1JQ5SETnQusqmS3RwStF7vwQ3L02imIzl++sewmt23VGygix04pEH+FCj1yWb+z4GDzKiljr1W7Wfvrx0YwgA==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0"
+ }
+ },
+ "System.Xml.XPath.XmlDocument": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "A/uxsWi/Ifzkmd4ArTLISMbfFs6XpRPsXZonrIqyTY70xi8t+mDtvSM5Os0RqyRDobjMBwIDHDL4NOIbkDwf7A==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0",
+ "System.Xml.XPath": "4.3.0",
+ "System.Xml.XmlDocument": "4.3.0"
+ }
+ },
+ "TaskTupleAwaiter": {
+ "type": "Transitive",
+ "resolved": "2.0.3",
+ "contentHash": "RUdwpeaZpj98w1dQw295V950qGGtoVdPbhxU1UBazR9pOAX6YpK9qc17u9swRhlKTDY2PvHIXODrNwFXGC/jvw=="
+ },
"xunit.abstractions": {
"type": "Transitive",
"resolved": "2.0.3",
@@ -1073,6 +2371,56 @@
"NETStandard.Library": "1.6.1",
"xunit.extensibility.core": "[2.5.0]"
}
+ },
+ "apiservice": {
+ "type": "Project",
+ "dependencies": {
+ "Azure.Data.Tables": "[12.8.0, )",
+ "Azure.Identity": "[1.8.2, )",
+ "Azure.Messaging.EventGrid": "[4.15.0, )",
+ "Azure.ResourceManager": "[1.6.0, )",
+ "Azure.ResourceManager.Compute": "[1.0.0-beta.8, )",
+ "Azure.ResourceManager.Monitor": "[1.0.0-beta.2, )",
+ "Azure.ResourceManager.Network": "[1.0.0, )",
+ "Azure.ResourceManager.Resources": "[1.6.0, )",
+ "Azure.ResourceManager.Storage": "[1.0.0-beta.11, )",
+ "Azure.Security.KeyVault.Secrets": "[4.3.0, )",
+ "Azure.Storage.Blobs": "[12.13.0, )",
+ "Azure.Storage.Queues": "[12.11.0, )",
+ "Faithlife.Utility": "[0.12.2, )",
+ "Microsoft.Azure.AppConfiguration.Functions.Worker": "[6.0.0, )",
+ "Microsoft.Azure.Functions.Extensions": "[1.1.0, )",
+ "Microsoft.Azure.Functions.Worker": "[1.18.0, )",
+ "Microsoft.Azure.Functions.Worker.ApplicationInsights": "[1.0.0-preview4, )",
+ "Microsoft.Azure.Functions.Worker.Extensions.EventGrid": "[2.1.0, )",
+ "Microsoft.Azure.Functions.Worker.Extensions.Http": "[3.0.13, )",
+ "Microsoft.Azure.Functions.Worker.Extensions.SignalRService": "[1.7.0, )",
+ "Microsoft.Azure.Functions.Worker.Extensions.Storage": "[5.0.1, )",
+ "Microsoft.Azure.Functions.Worker.Extensions.Timer": "[4.1.0, )",
+ "Microsoft.Azure.Functions.Worker.Sdk": "[1.10.0, )",
+ "Microsoft.Azure.Management.Monitor": "[0.28.0-preview, )",
+ "Microsoft.Azure.Management.OperationalInsights": "[0.24.0-preview, )",
+ "Microsoft.Extensions.Logging.ApplicationInsights": "[2.21.0, )",
+ "Microsoft.FeatureManagement": "[2.5.1, )",
+ "Microsoft.Graph": "[4.37.0, )",
+ "Microsoft.Identity.Client": "[4.52.0, )",
+ "Microsoft.Identity.Web.TokenCache": "[2.7.0, )",
+ "Microsoft.Rest.ClientRuntime": "[2.3.24, )",
+ "Microsoft.TeamFoundationServer.Client": "[19.219.0-preview, )",
+ "Octokit": "[2.0.1, )",
+ "OpenTelemetry.Api": "[1.5.0-rc.1, )",
+ "Polly": "[8.0.0-alpha.2, )",
+ "Polly.Extensions.Http": "[3.0.0, )",
+ "Scriban": "[5.5.0, )",
+ "Semver": "[2.3.0, )",
+ "SmartAnalyzers.CSharpExtensions.Annotations": "[4.2.7, )",
+ "System.Diagnostics.DiagnosticSource": "[8.0.0-preview.4.23259.5, )",
+ "System.IdentityModel.Tokens.Jwt": "[6.29.0, )",
+ "System.Linq.Async": "[6.0.1, )",
+ "System.Security.Cryptography.Pkcs": "[7.0.2, )",
+ "System.Text.RegularExpressions": "[4.3.1, )",
+ "TaskTupleAwaiter": "[2.0.3, )"
+ }
}
}
}
diff --git a/src/ApiService/IntegrationTests/packages.lock.json b/src/ApiService/IntegrationTests/packages.lock.json
index 37fd1215bf..497cf663a0 100644
--- a/src/ApiService/IntegrationTests/packages.lock.json
+++ b/src/ApiService/IntegrationTests/packages.lock.json
@@ -1417,8 +1417,8 @@
},
"Semver": {
"type": "Transitive",
- "resolved": "2.1.0",
- "contentHash": "1jUT0PwgKO9d9F/X2n762qLp7v/30OpMtJPFRtmjPXUX2/J0lnqiGiSJNNsW3yYTj5StF0Z1yE36TrvtGpcbrg=="
+ "resolved": "2.3.0",
+ "contentHash": "4vYo1zqn6pJ1YrhjuhuOSbIIm0CpM47grbpTJ5ABjOlfGt/EhMEM9ed4MRK5Jr6gVnntWDqOUzGeUJp68PZGjw=="
},
"SmartAnalyzers.CSharpExtensions.Annotations": {
"type": "Transitive",
@@ -2544,7 +2544,7 @@
"Polly": "[8.0.0-alpha.2, )",
"Polly.Extensions.Http": "[3.0.0, )",
"Scriban": "[5.5.0, )",
- "Semver": "[2.1.0, )",
+ "Semver": "[2.3.0, )",
"SmartAnalyzers.CSharpExtensions.Annotations": "[4.2.7, )",
"System.Diagnostics.DiagnosticSource": "[8.0.0-preview.4.23259.5, )",
"System.IdentityModel.Tokens.Jwt": "[6.29.0, )",
diff --git a/src/ApiService/Tests/packages.lock.json b/src/ApiService/Tests/packages.lock.json
index 1c8392cb4a..d3ad57006a 100644
--- a/src/ApiService/Tests/packages.lock.json
+++ b/src/ApiService/Tests/packages.lock.json
@@ -1420,8 +1420,8 @@
},
"Semver": {
"type": "Transitive",
- "resolved": "2.1.0",
- "contentHash": "1jUT0PwgKO9d9F/X2n762qLp7v/30OpMtJPFRtmjPXUX2/J0lnqiGiSJNNsW3yYTj5StF0Z1yE36TrvtGpcbrg=="
+ "resolved": "2.3.0",
+ "contentHash": "4vYo1zqn6pJ1YrhjuhuOSbIIm0CpM47grbpTJ5ABjOlfGt/EhMEM9ed4MRK5Jr6gVnntWDqOUzGeUJp68PZGjw=="
},
"SmartAnalyzers.CSharpExtensions.Annotations": {
"type": "Transitive",
@@ -2547,7 +2547,7 @@
"Polly": "[8.0.0-alpha.2, )",
"Polly.Extensions.Http": "[3.0.0, )",
"Scriban": "[5.5.0, )",
- "Semver": "[2.1.0, )",
+ "Semver": "[2.3.0, )",
"SmartAnalyzers.CSharpExtensions.Annotations": "[4.2.7, )",
"System.Diagnostics.DiagnosticSource": "[8.0.0-preview.4.23259.5, )",
"System.IdentityModel.Tokens.Jwt": "[6.29.0, )",
diff --git a/src/cli/onefuzz/backend.py b/src/cli/onefuzz/backend.py
index 4d3af2371b..7f23e7de03 100644
--- a/src/cli/onefuzz/backend.py
+++ b/src/cli/onefuzz/backend.py
@@ -41,6 +41,7 @@
from tenacity.stop import stop_after_attempt
from tenacity.wait import wait_random
+from .__version__ import __version__
from .azcopy import azcopy_copy, azcopy_sync
_ACCESSTOKENCACHE_UMASK = 0o077
@@ -191,7 +192,9 @@ def logout(self) -> None:
os.unlink(self.token_path)
def headers(self) -> Dict[str, str]:
- value = {}
+ value = {
+ "Cli-Version": __version__,
+ }
if self.config.client_id is not None:
access_token = self.get_access_token()
value["Authorization"] = "%s %s" % (
@@ -371,6 +374,8 @@ def request(
):
self.config_params()
headers = self.headers()
+ if str.lower(os.environ.get("ONEFUZZ_STRICT_VERSIONING") or "") == "true":
+ headers["Strict-Version"] = "true"
json_data = serialize(json_data)
# 401 errors with IDX10501: Signature validation failed occur
diff --git a/src/pytypes/onefuzztypes/enums.py b/src/pytypes/onefuzztypes/enums.py
index 317325de0b..9bf03d9663 100644
--- a/src/pytypes/onefuzztypes/enums.py
+++ b/src/pytypes/onefuzztypes/enums.py
@@ -305,6 +305,7 @@ class ErrorCode(Enum):
ADO_VALIDATION_INVALID_PATH = 495
ADO_VALIDATION_INVALID_PROJECT = 496
INVALID_RETENTION_PERIOD = 497
+ INVALID_CLI_VERSION = 498
# NB: if you update this enum, also update Enums.cs