private async Task CopyInput(bool useAllKeys = false) { _Logger.LogDebug($"Copy input TEKs."); await using (_PublishingDbContext.BeginTransaction()) { await _PublishingDbContext.Set <EksCreateJobInputEntity>().BatchDeleteAsync(); //TODO truncate instead await _PublishingDbContext.Set <EksCreateJobOutputEntity>().BatchDeleteAsync(); _PublishingDbContext.SaveAndCommit(); } await using (_WorkflowDbContext.BeginTransaction()) { var read = _WorkflowDbContext.TemporaryExposureKeys .Where(x => (x.Owner.Authorised || useAllKeys) && x.PublishingState == PublishingState.Unpublished) .Select(x => new EksCreateJobInputEntity { Id = x.Id, RollingPeriod = x.RollingPeriod, KeyData = x.KeyData, TransmissionRiskLevel = x.TransmissionRiskLevel, RollingStartNumber = x.RollingStartNumber, }).ToList(); await using (_PublishingDbContext.BeginTransaction()) { await _PublishingDbContext.BulkInsertAsync(read.ToList()); _PublishingDbContext.SaveAndCommit(); } } }
private async Task GenWorkflows() { for (var i = 0; i < _Args.WorkflowCount; i++) { _WorkflowDb.BeginTransaction(); var workflow = await _RegisterWriter().Execute(); //Save/Commit _WorkflowDb.BeginTransaction(); GenTeks(workflow); _WorkflowDb.SaveAndCommit(); } }
public async Task InitializeAsync() { _FakeTimeProvider = new FakeTimeProvider(); _Connection = new SqliteConnection("Data Source=:memory:"); _DbContext = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); _Factory = WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { services.AddScoped(sp => { var context = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); context.BeginTransaction(); return(context); }); services.AddTransient <IUtcDateTimeProvider>(x => _FakeTimeProvider); }); builder.ConfigureAppConfiguration((ctx, config) => { config.AddInMemoryCollection(new Dictionary <string, string> { ["Workflow:PostKeys:TemporaryExposureKeys:RollingStartNumber:Min"] = new DateTime(2019, 12, 31, 0, 0, 0, DateTimeKind.Utc).ToRollingStartNumber().ToString(), ["Validation:TemporaryExposureKey:RollingPeriod:Min"] = "1", ["Validation:TemporaryExposureKey:RollingPeriod:Max"] = "144" }); }); }); await _Connection.OpenAsync(); await _DbContext.Database.EnsureCreatedAsync(); }
public async Task <SnapshotEksInputResult> Execute(DateTime snapshotStart) { _Logger.LogDebug("Snapshot publishable TEKs."); _SnapshotStart = snapshotStart; var stopwatch = new Stopwatch(); stopwatch.Start(); const int pagesize = 10000; var index = 0; using var tx = _WorkflowDbContext.BeginTransaction(); var page = ReadTeksFromWorkflow(index, pagesize); while (page.Count > 0) { var db = _PublishingDbContextFactory(); await db.BulkInsertAsync2(page.ToList(), new SubsetBulkArgs()); index += page.Count; page = ReadTeksFromWorkflow(index, pagesize); } var result = new SnapshotEksInputResult { SnapshotSeconds = stopwatch.Elapsed.TotalSeconds, TekInputCount = index }; _Logger.LogInformation($"TEKs to publish - Count:{index}."); return(result); }
public async Task <TekReleaseWorkflowStateEntity> ExecuteAsync() { var entity = new TekReleaseWorkflowStateEntity { Created = _DateTimeProvider.Snapshot.Date, ValidUntil = _WorkflowTime.Expiry(_DateTimeProvider.Snapshot) }; await _WorkflowDbContext.KeyReleaseWorkflowStates.AddAsync(entity); _Logger.WriteWritingStart(); var success = WriteAttempt(entity); while (!success) { _WorkflowDbContext.BeginTransaction(); entity = new TekReleaseWorkflowStateEntity { Created = _DateTimeProvider.Snapshot.Date, ValidUntil = _WorkflowTime.Expiry(_DateTimeProvider.Snapshot) }; await _WorkflowDbContext.KeyReleaseWorkflowStates.AddAsync(entity); success = WriteAttempt(entity); } return(entity); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddScoped(x => DbContextStartup.Workflow(x, false)); services.AddScoped(x => DbContextStartup.Content(x, false)); services.AddScoped(x => DbContextStartup.Publishing(x, false)); services.AddTransient <ContentValidator>(); services.AddTransient <ContentInsertDbCommand>(); services.NlSignerStartup(_Configuration.UseCertificatesFromResources()); services.GaSignerStartup(_Configuration.UseCertificatesFromResources()); // Database Scoping services.AddScoped(x => { var config = new StandardEfDbConfig(_Configuration, "WorkFlow"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new WorkflowDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddScoped <IUtcDateTimeProvider, StandardUtcDateTimeProvider>(); services.AddTransient <IPublishingIdService, Sha256HexPublishingIdService>(); services.AddTransient <ZippedSignedContentFormatter>(); services.AddControllersWithViews(); }
public async Task InitializeAsync() { //_Connection = new SqliteConnection("Data Source=:memory:"); //_DbContext = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); _Connection = new SqlConnection("Data Source=.;Database=WorkflowControllerPostSecretTests;Integrated Security=True"); _DbContext = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlServer(_Connection).Options); _FakeNumbers = new FakeNumberGen(); _Factory = WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { services.AddScoped(sp => { var context = //new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlServer(_Connection).Options); context.BeginTransaction(); return(context); }); services.Replace(new ServiceDescriptor(typeof(IRandomNumberGenerator), _FakeNumbers)); }); }); await _DbContext.Database.EnsureDeletedAsync(); await _DbContext.Database.EnsureCreatedAsync(); //await _Connection.OpenAsync(); }
public void Execute(string[] _) { using var tx = _WorkflowDb.BeginTransaction(); ForceWorkflowAuth(); _WorkflowDb.SaveAndCommit(); }
private async Task SnapshotTeks() { _logger.LogDebug("Snapshot publishable TEKs."); var stopwatch = new Stopwatch(); stopwatch.Start(); const int PageSize = 10000; var index = 0; await using var tx = _workflowDbContext.BeginTransaction(); var page = ReadFromWorkflow(index, PageSize); while (page.Count > 0) { var db = _dkSourceDbContextFactory(); await db.BulkInsertAsync2(page.ToList(), new SubsetBulkArgs()); index += page.Count; page = ReadFromWorkflow(index, PageSize); } _result.TekReadCount = index; }
public static WorkflowDbContext Workflow(IServiceProvider x, bool beginTrans = true) { var config = new StandardEfDbConfig(x.GetRequiredService <IConfiguration>(), DatabaseConnectionStringNames.Workflow); var builder = new SqlServerDbContextOptionsBuilder(config, x.GetRequiredService <ILoggerFactory>()); var result = new WorkflowDbContext(builder.Build()); if (beginTrans) { result.BeginTransaction(); } return(result); }
// This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { ComponentsContainerHelper.RegisterDefaultServices(services); services.AddControllers(); services.AddSeriLog(Configuration); services.AddScoped(x => { var config = new StandardEfDbConfig(Configuration, "WorkFlow"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new WorkflowDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddBasicAuthentication(); services.AddScoped <PurgeExpiredSecretsDbCommand, PurgeExpiredSecretsDbCommand>(); services.AddSwaggerGen(o => { o.SwaggerDoc("v1", new OpenApiInfo { Title = Title, Version = "v1" }); o.AddSecurityDefinition("basic", new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "basic", In = ParameterLocation.Header, Description = "Basic Authorization header using the Bearer scheme." }); o.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "basic" } }, new string[] {} } }); }); }
public async Task NoTekPost() { // Arrange _FakeTimeProvider.Value = new DateTime(2020, 8, 2, 0, 0, 0, DateTimeKind.Utc); var bucket = new byte[32]; var pollToken = _PollTokenService.Next(); await WriteBucket(pollToken); // Act var args = new LabVerifyArgs { PollToken = pollToken }; _DbContext.BeginTransaction(); var result = _Command.Execute(args); // Assert Assert.AreEqual(false, ((LabVerifyAuthorisationResponse)((OkObjectResult)result.Result).Value).Valid); var wf = _DbContext.KeyReleaseWorkflowStates.Single(x => x.BucketId == bucket); Assert.AreEqual(0, wf.Teks.Count); Assert.AreEqual(false, wf.TeksTouched); }
public void Execute() { var expired = _DateTimeProvider.Now() - TimeSpan.FromMinutes(_KeysLastWorkflowConfig.AuthorisationWindowDurationMinutes); _DbContextProvider.BeginTransaction(); throw new NotImplementedException(); //var q = _DbContextProvider.KeysLastWorkflows // .Where(x => x.State == KeysLastWorkflowState.Receiving && x.AuthorisationWindowStart < expired); //_DbContextProvider.KeysLastWorkflows.RemoveRange(q); _DbContextProvider.SaveChanges(); _DbContextProvider.SaveAndCommit(); }
public void ConfigureServices(IServiceCollection services) { services.AddScoped <IJsonSerializer, StandardJsonSerializer>(); services.AddControllers(); services.AddScoped(x => { var config = new StandardEfDbConfig(_Configuration, "WorkFlow"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new WorkflowDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddSingleton <IUtcDateTimeProvider, StandardUtcDateTimeProvider>(); services.AddSingleton <IGeanTekListValidationConfig, StandardGeanCommonWorkflowConfig>(); services.AddSingleton <ITemporaryExposureKeyValidator, TemporaryExposureKeyValidator>(); services.AddSingleton <ITemporaryExposureKeyValidatorConfig, TemporaryExposureKeyValidatorConfig>(); services.AddScoped <HttpPostReleaseTeksCommand, HttpPostReleaseTeksCommand>(); services.AddScoped <IReleaseTeksValidator, ReleaseTeksValidator>(); services.AddScoped <ISignatureValidator, SignatureValidator>(); _SignatureValidationEnabled = _Configuration.GetValue("ValidatePostKeysSignature", true); if (_SignatureValidationEnabled) { services.AddScoped <ISignatureValidator, SignatureValidator>(); } else { services.AddScoped <ISignatureValidator, DoNotValidateSignatureValidator>(); } services.AddScoped <HttpPostRegisterSecret, HttpPostRegisterSecret>(); services.AddScoped <ISecretWriter, SecretWriter>(); services.AddScoped <ITekWriter, TekWriter>(); services.AddScoped <RandomNumberGenerator, RandomNumberGenerator>(); services.AddScoped <IRandomNumberGenerator, RandomNumberGenerator>(); services.AddScoped <HttpPostDecoyKeysCommand, HttpPostDecoyKeysCommand>(); services.AddScoped <IDecoyKeysConfig, StandardDecoyKeysConfig>(); services.AddSwaggerGen(o => { o.SwaggerDoc("v1", new OpenApiInfo { Title = Title, Version = "v1" }); }); }
public async Task <IActionResult> Execute(KeysFirstEscrowArgs args) { if (!_KeysFirstEscrowValidator.Validate(args)) { return(new BadRequestResult()); } await using (var tx = _DbContextProvider.BeginTransaction()) { await _KeysFirstEscrowDbInsertCommand.Execute(args); _DbContextProvider.SaveAndCommit(); } return(new OkResult()); }
public void Execute() { var expired = _DateTimeProvider.Now() - TimeSpan.FromDays(_KeysLastWorkflowConfig.SecretLifetimeDays); _DbContextProvider.BeginTransaction(); throw new NotImplementedException(); //var q = _DbContextProvider.KeysLastWorkflows // .Where(x => x.State == KeysLastWorkflowState.Unauthorised && x.Created < expired); //_DbContextProvider.KeysLastWorkflows.RemoveRange(q); _DbContextProvider.SaveChanges(); _DbContextProvider.SaveAndCommit(); }
public async Task <TekReleaseWorkflowStateEntity> ExecuteAsync() { var entity = await BuildEntityAndAddToContextAsync(); _logger.WriteWritingStart(); var success = TryGenerateRemainingFieldsAndWriteToDb(entity); while (!success) { _workflowDbContext.BeginTransaction(); entity = await BuildEntityAndAddToContextAsync(); success = TryGenerateRemainingFieldsAndWriteToDb(entity); } return(entity); }
public async Task Execute(int pAuthorize, Random r) { _DbContextProvider.BeginTransaction(); var unauthorized = _DbContextProvider.Set <KeyReleaseWorkflowState>() .Where(x => x.Authorised == false) .Select(x => x.ConfirmationKey) .ToArray(); var authorized = unauthorized .Where(x => r.Next(100) <= pAuthorize); foreach (var i in authorized) { await _Writer.Execute(new KeysFirstAuthorisationArgs { Token = i }); } _DbContextProvider.SaveAndCommit(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { ComponentsContainerHelper.RegisterDefaultServices(services); services.AddControllers(); services.AddSeriLog(Configuration); services.AddScoped(x => { var config = new StandardEfDbConfig(Configuration, "WorkFlow"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new WorkflowDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddScoped <JwtService, JwtService>(); services.AddAuthentication("icc_jwt") .AddScheme <AuthenticationSchemeOptions, JwtAuthorizationHandler>("icc_jwt", null); services.AddSingleton <IUtcDateTimeProvider, StandardUtcDateTimeProvider>(); services.AddSingleton <IGeanTekListValidationConfig, StandardGeanCommonWorkflowConfig>(); services.AddSingleton <ITemporaryExposureKeyValidator, TemporaryExposureKeyValidator>(); services.AddSingleton <ITemporaryExposureKeyValidatorConfig, TemporaryExposureKeyValidatorConfig>(); services.AddScoped <HttpPostReleaseTeksCommand, HttpPostReleaseTeksCommand>(); services.AddScoped <IReleaseTeksValidator, ReleaseTeksValidator>(); services.AddScoped <ISignatureValidator, SignatureValidator>(); services.AddScoped <HttpPostRegisterSecret, HttpPostRegisterSecret>(); services.AddScoped <ISecretWriter, SecretWriter>(); services.AddScoped <ISecretConfig, StandardSecretConfig>(); services.AddScoped <ITekWriter, TekWriter>(); services.AddScoped <RandomNumberGenerator, RandomNumberGenerator>(); services.AddSwaggerGen(o => { o.SwaggerDoc("v1", new OpenApiInfo { Title = Title, Version = "v1" }); }); }
public async Task InitializeAsync() { _Connection = new SqliteConnection("Data Source=:memory:"); _DbContext = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); _Factory = WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { services.AddScoped(sp => { var context = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); context.BeginTransaction(); return(context); }); }); builder.ConfigureAppConfiguration((ctx, config) => { config.AddInMemoryCollection(new Dictionary <string, string> { ["Validation:TemporaryExposureKey:RollingPeriod:Min"] = "1", ["Validation:TemporaryExposureKey:RollingPeriod:Max"] = "256" }); }); }); await _Connection.OpenAsync(); await _DbContext.Database.EnsureCreatedAsync(); // ReSharper disable once MethodHasAsyncOverload //TODO mapper... _DbContext.KeyReleaseWorkflowStates.Add(new TekReleaseWorkflowStateEntity { BucketId = _BucketId, ValidUntil = DateTime.UtcNow.AddHours(1), Created = DateTime.UtcNow, ConfirmationKey = _Key, }); await _DbContext.SaveChangesAsync(); }
public async Task InitializeAsync() { _Connection = new SqliteConnection("Data Source=:memory:"); _DbContext = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); _Factory = WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { services.AddScoped(sp => { var context = new WorkflowDbContext(new DbContextOptionsBuilder().UseSqlite(_Connection).Options); context.BeginTransaction(); return(context); }); }); }); await _Connection.OpenAsync(); await _DbContext.Database.EnsureCreatedAsync(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { if (services == null) { throw new ArgumentNullException(nameof(services)); } services.AddLogging(); services.AddScoped <IJsonSerializer, StandardJsonSerializer>(); services.AddControllers(options => { options.RespectBrowserAcceptHeader = true; }); IIccPortalConfig iccPortalConfig = new IccPortalConfig(_Configuration, "IccPortalConfig"); services.AddSingleton(iccPortalConfig); // Database Scoping services.AddScoped(x => { var config = new StandardEfDbConfig(_Configuration, "WorkFlow"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new WorkflowDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddScoped <HttpPostAuthoriseCommand>(); services.AddScoped <HttpPostLabVerifyCommand>(); services.AddScoped <AuthorisationWriterCommand>(); services.AddScoped <IUtcDateTimeProvider, StandardUtcDateTimeProvider>(); services.AddScoped <IRandomNumberGenerator, RandomNumberGenerator>(); services.AddScoped <JwtService>(); services.AddScoped <LabVerificationAuthorisationCommand>(); services.AddScoped <PollTokens>(); services.AddScoped <HttpGetLogoutCommand>(); services.AddScoped <HttpGetUserClaimCommand>(); services.AddScoped <HttpGetAuthorisationRedirectCommand>(); services.AddMvc(config => { config.EnableEndpointRouting = false; var policy = new AuthorizationPolicyBuilder() .AddAuthenticationSchemes(TheIdentityHubDefaults.AuthenticationScheme) .RequireAuthenticatedUser() .Build(); config.Filters.Add(new AuthorizeFilter(policy)); // .RequireClaim(ClaimTypes.Role) //TODO still needed or dead line? }); services.AddCors(); services.AddSwaggerGen(o => { o.SwaggerDoc("v1", new OpenApiInfo { Title = "Dutch Exposure Notification ICC API (inc. dev support)", Version = "v1", Description = "This specification describes the interface between the Dutch exposure notification app backend, ICC Webportal and the ICC backend service.", Contact = new OpenApiContact { Name = "Ministerie van Volksgezondheid Welzijn en Sport backend repository", //TODO looks wrong? Url = new Uri("https://github.com/minvws/nl-covid19-notification-app-backend"), }, License = new OpenApiLicense { Name = "European Union Public License v. 1.2", //TODO this should be https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 Url = new Uri("https://github.com/minvws/nl-covid19-notification-app-backend/blob/master/LICENSE.txt") }, }); o.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "NL.Rijksoverheid.ExposureNotification.BackEnd.Components.xml")); o.AddSecurityDefinition("Icc", new OpenApiSecurityScheme { Description = "Icc Code Authentication", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Scheme = "IccAuthentication" }); o.OperationFilter <SecurityRequirementsOperationFilter>(); }); services.Configure <CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); // TODO: Make service for adding authentication + configuration model services .AddAuthentication(auth => { auth.DefaultChallengeScheme = TheIdentityHubDefaults.AuthenticationScheme; auth.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; auth.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; }) .AddCookie() .AddTheIdentityHubAuthentication(options => { if (!string.IsNullOrWhiteSpace(iccPortalConfig.IdentityHubConfig.BaseUrl)) { options.TheIdentityHubUrl = new Uri(iccPortalConfig.IdentityHubConfig.BaseUrl); } //TODO if the Url is not set is there any sense to setting these? options.Tenant = iccPortalConfig.IdentityHubConfig.Tenant; options.ClientId = iccPortalConfig.IdentityHubConfig.ClientId; options.ClientSecret = iccPortalConfig.IdentityHubConfig.ClientSecret; }); services.AddMvc(config => { config.EnableEndpointRouting = false; var policy = new AuthorizationPolicyBuilder() .AddAuthenticationSchemes(TheIdentityHubDefaults.AuthenticationScheme) .RequireAuthenticatedUser() .Build(); config.Filters.Add(new AuthorizeFilter(policy)); // .RequireClaim(ClaimTypes.Role) }); services .AddAuthentication("jwt") .AddScheme <AuthenticationSchemeOptions, StandardJwtAuthenticationHandler>("jwt", null); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services .AddControllers(options => { options.RespectBrowserAcceptHeader = true; }) //Arming these options only makes them less tolerant of casing on Deserialization and DOES NOT for serialisation to camelCase. //.AddNewtonsoftJson(options => //{ // options.UseCamelCasing(false); //NB this IS setting camel case - just not for dictionary element names //}) ; //Same with this one. //services.AddMvc() // .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase); services.AddControllers(); services.AddSingleton <IUtcDateTimeProvider, StandardUtcDateTimeProvider>(); services.AddSingleton <IGaenContentConfig, GaenContentConfig>(); services.AddSingleton <IExposureKeySetBatchJobConfig, ExposureKeySetBatchJobConfig>(); services.AddScoped <IPublishingId, StandardPublishingIdFormatter>(); services.AddScoped(x => { var config = new StandardEfDbConfig(Configuration, "Content"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new ExposureContentDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddScoped(x => { var config = new StandardEfDbConfig(Configuration, "WorkFlow"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new WorkflowDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddScoped(x => { var config = new StandardEfDbConfig(Configuration, "Icc"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new IccBackendContentDbContext(builder.Build()); result.BeginTransaction(); return(result); }); //Just for the Batch Job //services.AddScoped<IEfDbConfig>(x => new StandardEfDbConfig(Configuration, "Job")); //services.AddScoped<IExposureKeySetHeaderInfoConfig, ExposureKeySetHeaderInfoConfig>(); services.AddScoped <IContentSigner, FakeContentSigner>(); services.AddSingleton <IGeanTekListValidationConfig, StandardGeanCommonWorkflowConfig>(); services.AddSingleton <ITemporaryExposureKeyValidator, TemporaryExposureKeyValidator>(); services.AddSingleton <ITemporaryExposureKeyValidatorConfig, TemporaryExposureKeyValidatorConfig>(); services.AddScoped <IPublishingId, StandardPublishingIdFormatter>(); services.AddScoped(x => new ExposureKeySetBatchJobMk2( x.GetService <IGaenContentConfig>(), x.GetService <IExposureKeySetBuilder>(), x.GetService <WorkflowDbContext>(), x.GetService <ExposureContentDbContext>(), x.GetService <IUtcDateTimeProvider>(), x.GetService <IPublishingId>() )); services.AddSingleton <IGaenContentConfig, GaenContentConfig>(); services.AddScoped <IExposureKeySetBuilder>(x => new ExposureKeySetBuilderV1( x.GetService <IExposureKeySetHeaderInfoConfig>(), new EcdSaSigner(new ResourceCertificateProvider("FakeECDSA.p12")), new CmsSigner(new ResourceCertificateProvider("FakeRSA.p12")), x.GetService <IUtcDateTimeProvider>(), //TODO pass in time thru execute new GeneratedProtobufContentFormatter() )); services.AddScoped <IExposureKeySetHeaderInfoConfig, ExposureKeySetHeaderInfoConfig>(); services.AddSingleton <ISignatureValidator>(new FakeSignatureValidator()); services.AddScoped(x => new ExposureKeySetBuilderV1( x.GetService <ExposureKeySetHeaderInfoConfig>(), new FakeContentSigner(), new FakeContentSigner(), x.GetService <IUtcDateTimeProvider>(), new GeneratedProtobufContentFormatter() )); services.AddScoped <ManifestBuilder, ManifestBuilder>(); services.AddScoped <GetActiveExposureKeySetsListCommand, GetActiveExposureKeySetsListCommand>(); services.AddScoped <ExposureKeySetSafeReadCommand, ExposureKeySetSafeReadCommand>(); services.AddScoped <SafeGetRiskCalculationConfigDbCommand, SafeGetRiskCalculationConfigDbCommand>(); services.AddScoped <HttpPostRiskCalculationConfigCommand, HttpPostRiskCalculationConfigCommand>(); services.AddScoped <RiskCalculationConfigValidator, RiskCalculationConfigValidator>(); services.AddScoped <RiskCalculationConfigInsertDbCommand, RiskCalculationConfigInsertDbCommand>(); services.AddScoped <HttpPostResourceBundleCommand, HttpPostResourceBundleCommand>(); services.AddScoped <ResourceBundleInsertDbCommand, ResourceBundleInsertDbCommand>(); services.AddScoped <ResourceBundleValidator, ResourceBundleValidator>(); services.AddScoped <ProvisionDatabasesCommand, ProvisionDatabasesCommand>(); services.AddScoped <ProvisionDatabasesCommandIcc, ProvisionDatabasesCommandIcc>(); services.AddScoped <HttpPostGenerateExposureKeySetsCommand, HttpPostGenerateExposureKeySetsCommand>(); //services.AddScoped<HttpGetCdnContentCommand<ManifestEntity>, HttpGetCdnContentCommand<ManifestEntity>>(); services.AddScoped <HttpGetSignedCdnContentOnlyCommand <ExposureKeySetContentEntity>, HttpGetSignedCdnContentOnlyCommand <ExposureKeySetContentEntity> >(); services.AddScoped <HttpGetCdnContentCommand <RiskCalculationContentEntity>, HttpGetCdnContentCommand <RiskCalculationContentEntity> >(); services.AddScoped <HttpGetCdnContentCommand <ResourceBundleContentEntity>, HttpGetCdnContentCommand <ResourceBundleContentEntity> >(); services.AddScoped <HttpGetCdnContentCommand <AppConfigContentEntity>, HttpGetCdnContentCommand <AppConfigContentEntity> >(); services.AddScoped <DynamicManifestReader, DynamicManifestReader>(); services.AddScoped <IReader <ExposureKeySetContentEntity>, SafeBinaryContentDbReader <ExposureKeySetContentEntity> >(); services.AddScoped <IReader <ResourceBundleContentEntity>, SafeBinaryContentDbReader <ResourceBundleContentEntity> >(); services.AddScoped <IReader <RiskCalculationContentEntity>, SafeBinaryContentDbReader <RiskCalculationContentEntity> >(); services.AddScoped <IReader <AppConfigContentEntity>, SafeBinaryContentDbReader <AppConfigContentEntity> >(); services.AddScoped <PurgeExpiredSecretsDbCommand, PurgeExpiredSecretsDbCommand>(); services.AddScoped <HttpPostRegisterSecret, HttpPostRegisterSecret>(); services.AddScoped <RandomNumberGenerator, RandomNumberGenerator>(); services.AddScoped <ISecretConfig, StandardSecretConfig>(); services.AddScoped <ISecretWriter, SecretWriter>(); services.AddScoped <AuthorisationWriter, AuthorisationWriter>(); services.AddScoped <HttpPostReleaseTeksCommand, HttpPostReleaseTeksCommand>(); services.AddScoped <IReleaseTeksValidator, ReleaseTeksValidator>(); services.AddScoped <ITekWriter, TekWriter>(); services.AddScoped <HttpPostAppConfigCommand, HttpPostAppConfigCommand>(); services.AddScoped <AppConfigInsertDbCommand, AppConfigInsertDbCommand>(); services.AddScoped <AppConfigValidator, AppConfigValidator>(); services.AddScoped <HttpPostAuthorise, HttpPostAuthorise>(); services.AddScoped <IAuthorisationWriter, AuthorisationWriter>(); services.AddScoped <IBasicAuthenticationConfig, BasicAuthenticationConfig>(); services.AddBasicAuthentication(); services.AddScoped <GetLatestContentCommand <ResourceBundleContentEntity>, GetLatestContentCommand <ResourceBundleContentEntity> >(); services.AddScoped <GetLatestContentCommand <RiskCalculationContentEntity>, GetLatestContentCommand <RiskCalculationContentEntity> >(); services.AddScoped <GetLatestContentCommand <AppConfigContentEntity>, GetLatestContentCommand <AppConfigContentEntity> >(); services.AddScoped <IContentEntityFormatter, StandardContentEntityFormatter>(); services.AddScoped <ZippedSignedContentFormatter, ZippedSignedContentFormatter>(); services.AddScoped <HttpGetManifestBinaryContentCommand, HttpGetManifestBinaryContentCommand>(); services.AddScoped <DynamicManifestReader, DynamicManifestReader>(); services.AddScoped <HttpGetManifestSasCommand, HttpGetManifestSasCommand>(); services.AddSwaggerGen(o => { o.SwaggerDoc("v1", new OpenApiInfo { Title = "Dutch Exposure Notification API (inc. dev support)", Version = "v1", Description = "This specification describes the interface between the Dutch exposure notification app and the backend service.\nTODO: Add signatures to manifest, riskcalculationparameters and appconfig", Contact = new OpenApiContact { Name = "Ministerie van Volksgezondheid Welzijn en Sport backend repository", //TODO looks wrong? Url = new Uri("https://github.com/minvws/nl-covid19-notification-app-backend"), }, License = new OpenApiLicense { Name = "European Union Public License v. 1.2", //TODO this should be https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 Url = new Uri("https://github.com/minvws/nl-covid19-notification-app-backend/blob/master/LICENSE.txt") }, }); o.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "NL.Rijksoverheid.ExposureNotification.BackEnd.ServerStandAlone.xml")); o.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "NL.Rijksoverheid.ExposureNotification.BackEnd.Components.xml")); o.AddSecurityDefinition("basic", new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "basic", In = ParameterLocation.Header, Description = "Basic Authorization header." }); o.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "basic" } }, new string[] {} } }); }); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(options => { options.RespectBrowserAcceptHeader = true; }).AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()); services.AddControllers(); services.AddSingleton <IUtcDateTimeProvider, StandardUtcDateTimeProvider>(); services.AddSingleton <ILuhnModNConfig, LuhnModNConfig>(); services.AddSingleton <IGaenContentConfig, GaenContentConfig>(); services.AddSingleton <IExposureKeySetHeaderInfoConfig, HsmExposureKeySetHeaderInfoConfig>(); services.AddSingleton <IExposureKeySetBatchJobConfig, ExposureKeySetBatchJobConfig>(); services.AddSingleton <IPublishingId>(x => new StandardPublishingIdFormatter(new HardCodedSigner())); services.AddScoped(x => { var config = new StandardEfDbConfig(Configuration, "Content"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new ExposureContentDbContext(builder.Build()); result.BeginTransaction(); return(result); }); services.AddScoped(x => { var config = new StandardEfDbConfig(Configuration, "WorkFlow"); var builder = new SqlServerDbContextOptionsBuilder(config); var result = new WorkflowDbContext(builder.Build()); result.BeginTransaction(); return(result); }); //Just for the Batch Job services.AddScoped <IEfDbConfig>(x => new StandardEfDbConfig(Configuration, "Job")); services.AddScoped <HttpPostKeysFirstGenerateTekSetsCommand, HttpPostKeysFirstGenerateTekSetsCommand>(); services.AddScoped <HttpPostKeysFirstEscrowCommand, HttpPostKeysFirstEscrowCommand>(); services.AddSingleton <IKeysFirstEscrowValidator, KeysFirstEscrowValidator>(); services.AddSingleton <IKeysFirstAuthorisationTokenValidator, KeysFirstAuthorisationTokenLuhnModNValidator>(); services.AddSingleton <IGeanTekListValidationConfig, StandardGeanCommonWorkflowConfig>(); services.AddSingleton <ITemporaryExposureKeyValidator, TemporaryExposureKeyValidator>(); services.AddSingleton <ITemporaryExposureKeyValidatorConfig, TemporaryExposureKeyValidatorConfig>(); services.AddScoped <IKeysFirstEscrowWriter, KeysFirstEscrowInsertDbCommand>(); services.AddScoped <ISigner, HardCodedSigner>(); services.AddScoped <HttpPostKeysFirstAuthorisationCommand, HttpPostKeysFirstAuthorisationCommand>(); services.AddScoped <IKeysFirstAuthorisationWriter, KeysFirstDbAuthoriseCommand>(); //TODO services.AddScoped<HttpGetLatestManifestCommand, HttpGetLatestManifestCommand>(); services.AddScoped <ManifestBuilder, ManifestBuilder>(); services.AddScoped <GetActiveExposureKeySetsListCommand, GetActiveExposureKeySetsListCommand>(); services.AddScoped <ExposureKeySetSafeReadCommand, ExposureKeySetSafeReadCommand>(); services.AddScoped <SafeGetRiskCalculationConfigDbCommand, SafeGetRiskCalculationConfigDbCommand>(); services.AddScoped <HttpPostRiskCalculationConfigCommand, HttpPostRiskCalculationConfigCommand>(); services.AddScoped <RiskCalculationConfigValidator, RiskCalculationConfigValidator>(); services.AddScoped <RiskCalculationConfigInsertDbCommand, RiskCalculationConfigInsertDbCommand>(); services.AddScoped <HttpPostResourceBundleCommand, HttpPostResourceBundleCommand>(); services.AddScoped <ResourceBundleInsertDbCommand, ResourceBundleInsertDbCommand>(); services.AddScoped <ResourceBundleValidator, ResourceBundleValidator>(); //services.AddScoped<SafeGetResourceBundleCommand, SafeGetResourceBundleCommand>(); services.AddScoped <ProvisionDatabasesCommand, ProvisionDatabasesCommand>(); services.AddScoped <GenerateKeysFirstTekSetsArgs, GenerateKeysFirstTekSetsArgs>(); services.AddScoped <HttpPostGenerateExposureKeySetsCommand, HttpPostGenerateExposureKeySetsCommand>(); services.AddScoped <HttpPostKeysFirstRandomAuthorisationCommand, HttpPostKeysFirstRandomAuthorisationCommand>(); services.AddScoped <GenerateKeysFirstAuthorisations, GenerateKeysFirstAuthorisations>(); services.AddScoped <HttpGetCdnContentCommand <ManifestEntity>, HttpGetCdnContentCommand <ManifestEntity> >(); services.AddScoped <HttpGetCdnContentCommand <ExposureKeySetContentEntity>, HttpGetCdnContentCommand <ExposureKeySetContentEntity> >(); services.AddScoped <HttpGetCdnContentCommand <RiskCalculationContentEntity>, HttpGetCdnContentCommand <RiskCalculationContentEntity> >(); services.AddScoped <HttpGetCdnContentCommand <ResourceBundleContentEntity>, HttpGetCdnContentCommand <ResourceBundleContentEntity> >(); services.AddScoped <HttpGetCdnContentCommand <AppConfigContentEntity>, HttpGetCdnContentCommand <AppConfigContentEntity> >(); services.AddScoped <IReader <ManifestEntity>, DynamicManifestReader>(); services.AddScoped <IReader <ExposureKeySetContentEntity>, SafeBinaryContentDbReader <ExposureKeySetContentEntity> >(); services.AddScoped <IReader <ResourceBundleContentEntity>, SafeBinaryContentDbReader <ResourceBundleContentEntity> >(); services.AddScoped <IReader <RiskCalculationContentEntity>, SafeBinaryContentDbReader <RiskCalculationContentEntity> >(); services.AddScoped <IReader <AppConfigContentEntity>, SafeBinaryContentDbReader <AppConfigContentEntity> >(); services.AddScoped <HttpPostKeysLastRegisterSecret, HttpPostKeysLastRegisterSecret>(); services.AddScoped <RandomNumberGenerator, RandomNumberGenerator>(); services.AddScoped <IKeysLastSecretConfig, StandardKeysLastSecretConfig>(); services.AddScoped <IKeysLastSecretWriter, KeysLastSecretWriter>(); services.AddScoped <KeysLastAuthorisationWriter, KeysLastAuthorisationWriter>(); services.AddScoped <HttpPostKeysLastReleaseTeksCommand, HttpPostKeysLastReleaseTeksCommand>(); services.AddScoped <IKeysLastReleaseTeksValidator, KeysLastReleaseTeksValidator>(); services.AddScoped <IKeysLastSignatureValidator, FakeKeysLastSignatureValidator>(); services.AddScoped <IKeysLastTekWriter, FakeKeysLastTekWriter>(); services.AddScoped <HttpPostAppConfigCommand, HttpPostAppConfigCommand>(); services.AddScoped <AppConfigInsertDbCommand, AppConfigInsertDbCommand>(); services.AddScoped <AppConfigValidator, AppConfigValidator>(); services.AddScoped <HttpPostKeysLastAuthorise, HttpPostKeysLastAuthorise>(); services.AddScoped <IKeysLastAuthorisationWriter, KeysLastAuthorisationWriter>(); services.AddScoped <IReleaseKeysAuthorizationValidator, FakeReleaseKeysAuthorizationValidator>(); services.AddScoped <GetLatestContentCommand <ResourceBundleContentEntity>, GetLatestContentCommand <ResourceBundleContentEntity> >(); services.AddScoped <GetLatestContentCommand <RiskCalculationContentEntity>, GetLatestContentCommand <RiskCalculationContentEntity> >(); services.AddScoped <GetLatestContentCommand <AppConfigContentEntity>, GetLatestContentCommand <AppConfigContentEntity> >(); services.AddScoped <IContentEntityFormatter, StandardContentEntityFormatter>(); services.AddScoped <ZippedSignedContentFormatter, ZippedSignedContentFormatter>(); services.AddSwaggerGen(o => { o.SwaggerDoc("v1", new OpenApiInfo { Title = "Dutch Exposure Notification API (inc. dev support)", Version = "v1", Description = "This specification describes the interface between the Dutch exposure notification app and the backend service.\nTODO: Add signatures to manifest, riskcalculationparameters and appconfig", Contact = new OpenApiContact { Name = "Ministerie van Volksgezondheid Welzijn en Sport backend repository", //TODO looks wrong? Url = new Uri("https://github.com/minvws/nl-covid19-notification-app-backend"), }, License = new OpenApiLicense { Name = "European Union Public License v. 1.2", //TODO this should be https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 Url = new Uri("https://github.com/minvws/nl-covid19-notification-app-backend/blob/master/LICENSE.txt") }, }); o.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "NL.Rijksoverheid.ExposureNotification.BackEnd.ServerStandAlone.xml")); o.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "NL.Rijksoverheid.ExposureNotification.BackEnd.Components.xml")); }); }