public FileController( IsoUploadOptions isoUploadOptions, IPlayerService playerService ) : base() { _isoUploadOptions = isoUploadOptions; _playerService = playerService; }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddSingleton <TaskServiceHealthCheck>(); services.AddSingleton <ConnectionServiceHealthCheck>(); services.AddHealthChecks() .AddCheck <TaskServiceHealthCheck>( "task_service_responsive", failureStatus: HealthStatus.Unhealthy, tags: new[] { "live" }) .AddCheck <ConnectionServiceHealthCheck>( "connection_service_responsive", failureStatus: HealthStatus.Unhealthy, tags: new[] { "live" }); var provider = Configuration["Database:Provider"]; switch (provider) { case "InMemory": services.AddDbContextPool <VmContext>((serviceProvider, optionsBuilder) => optionsBuilder .AddInterceptors(serviceProvider.GetRequiredService <EventTransactionInterceptor>()) .UseInMemoryDatabase("vm")); break; case "Sqlite": case "SqlServer": case "PostgreSQL": services.AddDbContextPool <VmContext>((serviceProvider, optionsBuilder) => optionsBuilder .AddInterceptors(serviceProvider.GetRequiredService <EventTransactionInterceptor>()) .UseConfiguredDatabase(Configuration)); break; } var connectionString = Configuration.GetConnectionString(Configuration.GetValue <string>("Database:Provider", "Sqlite").Trim()); switch (provider) { case "Sqlite": services.AddHealthChecks().AddSqlite(connectionString, tags: new[] { "ready", "live" }); break; case "SqlServer": services.AddHealthChecks().AddSqlServer(connectionString, tags: new[] { "ready", "live" }); break; case "PostgreSQL": services.AddHealthChecks().AddNpgSql(connectionString, tags: new[] { "ready", "live" }); break; } services.AddOptions() .Configure <DatabaseOptions>(Configuration.GetSection("Database")) .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue); IConfiguration isoConfig = Configuration.GetSection("IsoUpload"); IsoUploadOptions isoOptions = new IsoUploadOptions(); isoConfig.Bind(isoOptions); services.AddOptions() .Configure <IsoUploadOptions>(isoConfig) .AddScoped(config => config.GetService <IOptionsMonitor <IsoUploadOptions> >().CurrentValue); services .Configure <ClientOptions>(Configuration.GetSection("ClientSettings")) .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue); services .Configure <VsphereOptions>(Configuration.GetSection("Vsphere")) .AddScoped(config => config.GetService <IOptionsSnapshot <VsphereOptions> >().Value); services .Configure <RewriteHostOptions>(Configuration.GetSection("RewriteHost")) .AddScoped(config => config.GetService <IOptionsSnapshot <RewriteHostOptions> >().Value); services .Configure <IdentityClientOptions>(Configuration.GetSection("IdentityClient")) .AddScoped(config => config.GetService <IOptionsSnapshot <IdentityClientOptions> >().Value); services .Configure <ConsoleUrlOptions>(Configuration.GetSection("ConsoleUrls")) .AddScoped(config => config.GetService <IOptionsSnapshot <ConsoleUrlOptions> >().Value); services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddMvc() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); services.AddAuthorization(options => { var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); foreach (var scope in _authOptions.AuthorizationScope.Split(' ')) { policyBuilder.RequireScope(scope); } options.DefaultPolicy = policyBuilder.Build(); options.AddPolicy(Constants.PrivilegedAuthorizationPolicy, builder => builder .RequireAuthenticatedUser() .RequireScope(_authOptions.PrivilegedScope) ); }); services.AddSignalR() .AddJsonProtocol(options => { options.PayloadSerializerOptions.PropertyNameCaseInsensitive = true; options.PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); // allow upload of large files services.Configure <FormOptions>(x => { x.ValueLengthLimit = int.MaxValue; x.MultipartBodyLengthLimit = isoOptions.MaxFileSize; }); services.AddSwagger(_authOptions); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateAudience = false, ValidateIssuer = true }; options.Events = new JwtBearerEvents { OnMessageReceived = context => { // If the request is for our hub... var path = context.HttpContext.Request.Path; var accessToken = context.Request.Query["access_token"]; if (!string.IsNullOrEmpty(accessToken) && (path.StartsWithSegments("/hubs"))) { // Read the token out of the query string context.Token = accessToken; } return(Task.CompletedTask); } }; }); services.AddRouting(options => { options.LowercaseUrls = true; }); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); services.AddScoped <IVmService, VmService>(); services.AddScoped <IPlayerService, PlayerService>(); services.AddScoped <IViewService, ViewService>(); services.AddScoped <IPermissionsService, PermissionsService>(); services.AddSingleton <CallbackBackgroundService>(); services.AddSingleton <IHostedService>(x => x.GetService <CallbackBackgroundService>()); services.AddSingleton <ICallbackBackgroundService>(x => x.GetService <CallbackBackgroundService>()); services.AddSingleton <IAuthenticationService, AuthenticationService>(); services.AddSingleton <IActiveVirtualMachineService, ActiveVirtualMachineService>(); // Vsphere Services services.AddSingleton <ConnectionService>(); services.AddSingleton <IHostedService>(x => x.GetService <ConnectionService>()); services.AddSingleton <IConnectionService>(x => x.GetService <ConnectionService>()); services.AddScoped <IVsphereService, VsphereService>(); services.AddSingleton <TaskService>(); services.AddSingleton <IHostedService>(x => x.GetService <TaskService>()); services.AddSingleton <ITaskService>(x => x.GetService <TaskService>()); services.AddSingleton <MachineStateService>(); services.AddSingleton <IHostedService>(x => x.GetService <MachineStateService>()); services.AddSingleton <IMachineStateService>(x => x.GetService <MachineStateService>()); services.AddTransient <EventTransactionInterceptor>(); services.AddAutoMapper(typeof(Startup)); services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly); services.AddTransient(typeof(IPipelineBehavior <,>), typeof(CheckTasksBehavior <,>)); services.AddMemoryCache(); services.AddApiClients(identityClientOptions: _identityClientOptions, clientOptions: _clientOptions); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var provider = Configuration["Database:Provider"]; switch (provider) { case "InMemory": services.AddDbContextPool <Context>(opt => opt.UseInMemoryDatabase("vm")); break; case "Sqlite": case "SqlServer": case "PostgreSQL": services.AddDbProvider(Configuration); services.AddDbContextPool <Context>(builder => builder.UseConfiguredDatabase(Configuration)); break; } services.AddOptions() .Configure <DatabaseOptions>(Configuration.GetSection("Database")) .AddScoped(config => config.GetService <IOptionsMonitor <DatabaseOptions> >().CurrentValue); IConfiguration isoConfig = Configuration.GetSection("IsoUpload"); IsoUploadOptions isoOptions = new IsoUploadOptions(); isoConfig.Bind(isoOptions); services.AddOptions() .Configure <IsoUploadOptions>(isoConfig) .AddScoped(config => config.GetService <IOptionsMonitor <IsoUploadOptions> >().CurrentValue); services .Configure <ClientOptions>(Configuration.GetSection("ClientSettings")) .AddScoped(config => config.GetService <IOptionsMonitor <ClientOptions> >().CurrentValue); services.AddCors(options => options.UseConfiguredCors(Configuration.GetSection("CorsPolicy"))); services.AddMvc(options => { options.Filters.Add(typeof(ValidateModelStateFilter)); options.Filters.Add(typeof(JsonExceptionFilter)); // Require all scopes in authOptions var policyBuilder = new AuthorizationPolicyBuilder().RequireAuthenticatedUser(); Array.ForEach(_authOptions.AuthorizationScope.Split(' '), x => policyBuilder.RequireScope(x)); var policy = policyBuilder.Build(); options.Filters.Add(new AuthorizeFilter(policy)); }) .AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new StringEnumConverter()); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); // allow upload of large files services.Configure <FormOptions>(x => { x.ValueLengthLimit = int.MaxValue; x.MultipartBodyLengthLimit = isoOptions.MaxFileSize; }); services.AddSwagger(_authOptions); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = _authOptions.Authority; options.RequireHttpsMetadata = _authOptions.RequireHttpsMetadata; options.SaveToken = true; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters { ValidateIssuer = true, ValidAudiences = _authOptions.AuthorizationScope.Split(' ') }; }); services.AddRouting(options => { options.LowercaseUrls = true; }); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddScoped <IPrincipal>(p => p.GetService <IHttpContextAccessor>().HttpContext.User); services.AddScoped <IVmService, VmService>(); services.AddScoped <IPlayerService, PlayerService>(); services.AddAutoMapper(); services.AddHttpClient(); services.AddScoped <IS3PlayerApiClient, S3PlayerApiClient>(p => { var httpContextAccessor = p.GetRequiredService <IHttpContextAccessor>(); var httpClientFactory = p.GetRequiredService <IHttpClientFactory>(); var clientOptions = p.GetRequiredService <ClientOptions>(); var playerUri = new Uri(clientOptions.urls.playerApi); string authHeader = httpContextAccessor.HttpContext.Request.Headers["Authorization"]; var httpClient = httpClientFactory.CreateClient(); httpClient.BaseAddress = playerUri; httpClient.DefaultRequestHeaders.Add("Authorization", authHeader); var s3PlayerApiClient = new S3PlayerApiClient(httpClient, true); s3PlayerApiClient.BaseUri = playerUri; return(s3PlayerApiClient); }); }