feat: Initialize Zastava Webhook service with TLS and Authority authentication
- Added Program.cs to set up the web application with Serilog for logging, health check endpoints, and a placeholder admission endpoint. - Configured Kestrel server to use TLS 1.3 and handle client certificates appropriately. - Created StellaOps.Zastava.Webhook.csproj with necessary dependencies including Serilog and Polly. - Documented tasks in TASKS.md for the Zastava Webhook project, outlining current work and exit criteria for each task.
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using MongoDB.Driver;
 | 
			
		||||
using StellaOps.Authority.Plugins.Abstractions;
 | 
			
		||||
using StellaOps.Authority.Plugin.Standard.Storage;
 | 
			
		||||
using StellaOps.Authority.Storage.Mongo.Documents;
 | 
			
		||||
@@ -46,19 +47,19 @@ public class StandardClientProvisioningStoreTests
 | 
			
		||||
    {
 | 
			
		||||
        public Dictionary<string, AuthorityClientDocument> Documents { get; } = new(StringComparer.OrdinalIgnoreCase);
 | 
			
		||||
 | 
			
		||||
        public ValueTask<AuthorityClientDocument?> FindByClientIdAsync(string clientId, CancellationToken cancellationToken)
 | 
			
		||||
        public ValueTask<AuthorityClientDocument?> FindByClientIdAsync(string clientId, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        {
 | 
			
		||||
            Documents.TryGetValue(clientId, out var document);
 | 
			
		||||
            return ValueTask.FromResult(document);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public ValueTask UpsertAsync(AuthorityClientDocument document, CancellationToken cancellationToken)
 | 
			
		||||
        public ValueTask UpsertAsync(AuthorityClientDocument document, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        {
 | 
			
		||||
            Documents[document.ClientId] = document;
 | 
			
		||||
            return ValueTask.CompletedTask;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public ValueTask<bool> DeleteByClientIdAsync(string clientId, CancellationToken cancellationToken)
 | 
			
		||||
        public ValueTask<bool> DeleteByClientIdAsync(string clientId, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        {
 | 
			
		||||
            var removed = Documents.Remove(clientId);
 | 
			
		||||
            return ValueTask.FromResult(removed);
 | 
			
		||||
@@ -69,16 +70,16 @@ public class StandardClientProvisioningStoreTests
 | 
			
		||||
    {
 | 
			
		||||
        public List<AuthorityRevocationDocument> Upserts { get; } = new();
 | 
			
		||||
 | 
			
		||||
        public ValueTask UpsertAsync(AuthorityRevocationDocument document, CancellationToken cancellationToken)
 | 
			
		||||
        public ValueTask UpsertAsync(AuthorityRevocationDocument document, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        {
 | 
			
		||||
            Upserts.Add(document);
 | 
			
		||||
            return ValueTask.CompletedTask;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public ValueTask<bool> RemoveAsync(string category, string revocationId, CancellationToken cancellationToken)
 | 
			
		||||
        public ValueTask<bool> RemoveAsync(string category, string revocationId, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
            => ValueTask.FromResult(true);
 | 
			
		||||
 | 
			
		||||
        public ValueTask<IReadOnlyList<AuthorityRevocationDocument>> GetActiveAsync(DateTimeOffset asOf, CancellationToken cancellationToken)
 | 
			
		||||
        public ValueTask<IReadOnlyList<AuthorityRevocationDocument>> GetActiveAsync(DateTimeOffset asOf, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
            => ValueTask.FromResult<IReadOnlyList<AuthorityRevocationDocument>>(Array.Empty<AuthorityRevocationDocument>());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -319,13 +319,13 @@ internal sealed class CapturingLoggerProvider : ILoggerProvider
 | 
			
		||||
 | 
			
		||||
internal sealed class StubRevocationStore : IAuthorityRevocationStore
 | 
			
		||||
{
 | 
			
		||||
    public ValueTask UpsertAsync(AuthorityRevocationDocument document, CancellationToken cancellationToken)
 | 
			
		||||
    public ValueTask UpsertAsync(AuthorityRevocationDocument document, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        => ValueTask.CompletedTask;
 | 
			
		||||
 | 
			
		||||
    public ValueTask<bool> RemoveAsync(string category, string revocationId, CancellationToken cancellationToken)
 | 
			
		||||
    public ValueTask<bool> RemoveAsync(string category, string revocationId, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        => ValueTask.FromResult(false);
 | 
			
		||||
 | 
			
		||||
    public ValueTask<IReadOnlyList<AuthorityRevocationDocument>> GetActiveAsync(DateTimeOffset asOf, CancellationToken cancellationToken)
 | 
			
		||||
    public ValueTask<IReadOnlyList<AuthorityRevocationDocument>> GetActiveAsync(DateTimeOffset asOf, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        => ValueTask.FromResult<IReadOnlyList<AuthorityRevocationDocument>>(Array.Empty<AuthorityRevocationDocument>());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -333,18 +333,18 @@ internal sealed class InMemoryClientStore : IAuthorityClientStore
 | 
			
		||||
{
 | 
			
		||||
    private readonly Dictionary<string, AuthorityClientDocument> clients = new(StringComparer.OrdinalIgnoreCase);
 | 
			
		||||
 | 
			
		||||
    public ValueTask<AuthorityClientDocument?> FindByClientIdAsync(string clientId, CancellationToken cancellationToken)
 | 
			
		||||
    public ValueTask<AuthorityClientDocument?> FindByClientIdAsync(string clientId, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
    {
 | 
			
		||||
        clients.TryGetValue(clientId, out var document);
 | 
			
		||||
        return ValueTask.FromResult(document);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ValueTask UpsertAsync(AuthorityClientDocument document, CancellationToken cancellationToken)
 | 
			
		||||
    public ValueTask UpsertAsync(AuthorityClientDocument document, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
    {
 | 
			
		||||
        clients[document.ClientId] = document;
 | 
			
		||||
        return ValueTask.CompletedTask;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ValueTask<bool> DeleteByClientIdAsync(string clientId, CancellationToken cancellationToken)
 | 
			
		||||
    public ValueTask<bool> DeleteByClientIdAsync(string clientId, CancellationToken cancellationToken, IClientSessionHandle? session = null)
 | 
			
		||||
        => ValueTask.FromResult(clients.Remove(clientId));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,4 +9,7 @@
 | 
			
		||||
    <ProjectReference Include="..\StellaOps.Authority.Plugin.Standard\StellaOps.Authority.Plugin.Standard.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\StellaOps.Authority.Plugins.Abstractions\StellaOps.Authority.Plugins.Abstractions.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="MongoDB.Driver" Version="3.5.0" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
</Project>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user