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();
                }
            }
        }
Ejemplo n.º 2
0
        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();
            }
        }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 6
0
        // 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();
        }
Ejemplo n.º 7
0
        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();
        }
Ejemplo n.º 8
0
        public void Execute(string[] _)
        {
            using var tx = _WorkflowDb.BeginTransaction();

            ForceWorkflowAuth();
            _WorkflowDb.SaveAndCommit();
        }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 13
0
        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"
                }); });
        }
Ejemplo n.º 15
0
        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());
        }
Ejemplo n.º 16
0
        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();
        }
Ejemplo n.º 17
0
        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();
        }
Ejemplo n.º 19
0
        // 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"
                });
            });
        }
Ejemplo n.º 20
0
        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();
        }
Ejemplo n.º 21
0
        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[] {}
                    }
                });
            });
        }
Ejemplo n.º 24
0
        // 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"));
            });
        }