tgstation-server 5.12.7
The /tg/station 13 server suite
Loading...
Searching...
No Matches
Application.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Globalization;
4using System.IdentityModel.Tokens.Jwt;
5using System.Linq;
6
7using Cyberboss.AspNetCore.AsyncInitializer;
8
9using Microsoft.AspNetCore.Authentication.JwtBearer;
10using Microsoft.AspNetCore.Builder;
11using Microsoft.AspNetCore.Cors.Infrastructure;
12using Microsoft.AspNetCore.Hosting;
13using Microsoft.AspNetCore.Identity;
14using Microsoft.AspNetCore.Mvc.Infrastructure;
15using Microsoft.Extensions.Configuration;
16using Microsoft.Extensions.DependencyInjection;
17using Microsoft.Extensions.Hosting;
18using Microsoft.Extensions.Logging;
19using Microsoft.Extensions.Options;
20
21using Newtonsoft.Json;
22
23using Serilog;
24using Serilog.Events;
25using Serilog.Formatting.Display;
26
53
55{
59#pragma warning disable CA1506
60 public sealed class Application : SetupApplication
61 {
65 readonly IWebHostEnvironment hostingEnvironment;
66
71
77 {
78 var assemblyInformationProvider = new AssemblyInformationProvider();
79 var ioManager = new DefaultIOManager();
80 return new ServerFactory(
81 assemblyInformationProvider,
82 ioManager);
83 }
84
91 static void AddWatchdog<TSystemWatchdogFactory>(IServiceCollection services, IPostSetupServices postSetupServices)
92 where TSystemWatchdogFactory : class, IWatchdogFactory
93 {
94 if (postSetupServices.GeneralConfiguration.UseBasicWatchdog)
95 services.AddSingleton<IWatchdogFactory, WatchdogFactory>();
96 else
97 services.AddSingleton<IWatchdogFactory, TSystemWatchdogFactory>();
98 }
99
106 IConfiguration configuration,
107 IWebHostEnvironment hostingEnvironment)
108 : base(configuration)
109 {
110 this.hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment));
111 }
112
120 public void ConfigureServices(
121 IServiceCollection services,
122 IAssemblyInformationProvider assemblyInformationProvider,
123 IIOManager ioManager,
124 IPostSetupServices postSetupServices)
125 {
126 ConfigureServices(services, assemblyInformationProvider, ioManager);
127
128 ArgumentNullException.ThrowIfNull(postSetupServices);
129
130 // configure configuration
131 services.UseStandardConfig<UpdatesConfiguration>(Configuration);
132 services.UseStandardConfig<ControlPanelConfiguration>(Configuration);
133 services.UseStandardConfig<SwarmConfiguration>(Configuration);
134 services.UseStandardConfig<SessionConfiguration>(Configuration);
135
136 // enable options which give us config reloading
137 services.AddOptions();
138
139 // Set the timeout for IHostedService.StopAsync
140 services.Configure<HostOptions>(
141 opts => opts.ShutdownTimeout = TimeSpan.FromMinutes(postSetupServices.GeneralConfiguration.RestartTimeoutMinutes));
142
143 static LogEventLevel? ConvertSeriLogLevel(LogLevel logLevel) =>
144 logLevel switch
145 {
146 LogLevel.Critical => LogEventLevel.Fatal,
147 LogLevel.Debug => LogEventLevel.Debug,
148 LogLevel.Error => LogEventLevel.Error,
149 LogLevel.Information => LogEventLevel.Information,
150 LogLevel.Trace => LogEventLevel.Verbose,
151 LogLevel.Warning => LogEventLevel.Warning,
152 LogLevel.None => null,
153 _ => throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid log level {0}", logLevel)),
154 };
155
156 var microsoftEventLevel = ConvertSeriLogLevel(postSetupServices.FileLoggingConfiguration.MicrosoftLogLevel);
157 services.SetupLogging(
158 config =>
159 {
160 if (microsoftEventLevel.HasValue)
161 {
162 config.MinimumLevel.Override("Microsoft", microsoftEventLevel.Value);
163 config.MinimumLevel.Override("System.Net.Http.HttpClient", microsoftEventLevel.Value);
164 }
165 },
166 sinkConfig =>
167 {
168 if (postSetupServices.FileLoggingConfiguration.Disable)
169 return;
170
171 var logPath = postSetupServices.FileLoggingConfiguration.GetFullLogDirectory(
172 ioManager,
173 assemblyInformationProvider,
174 postSetupServices.PlatformIdentifier);
175
176 var logEventLevel = ConvertSeriLogLevel(postSetupServices.FileLoggingConfiguration.LogLevel);
177
178 var formatter = new MessageTemplateTextFormatter(
179 "{Timestamp:o} "
181 + "): [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}",
182 null);
183
184 logPath = ioManager.ConcatPath(logPath, "tgs-.log");
185 var rollingFileConfig = sinkConfig.File(
186 formatter,
187 logPath,
188 logEventLevel ?? LogEventLevel.Verbose,
189 50 * 1024 * 1024, // 50MB max size
190 flushToDiskInterval: TimeSpan.FromSeconds(2),
191 rollingInterval: RollingInterval.Day,
192 rollOnFileSizeLimit: true);
193 },
194 postSetupServices.ElasticsearchConfiguration);
195
196 // configure bearer token validation
197 services
198 .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
199 .AddJwtBearer(jwtBearerOptions =>
200 {
201 // this line isn't actually run until the first request is made
202 // at that point tokenFactory will be populated
203 jwtBearerOptions.TokenValidationParameters = tokenFactory.ValidationParameters;
204 jwtBearerOptions.Events = new JwtBearerEvents
205 {
206 // Application is our composition root so this monstrosity of a line is okay
207 // At least, that's what I tell myself to sleep at night
208 OnTokenValidated = ctx => ctx
209 .HttpContext
210 .RequestServices
211 .GetRequiredService<IClaimsInjector>()
212 .InjectClaimsIntoContext(
213 ctx,
214 ctx.HttpContext.RequestAborted),
215 };
216 });
217
218 // WARNING: STATIC CODE
219 // fucking prevents converting 'sub' to M$ bs
220 // can't be done in the above lambda, that's too late
221 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
222
223 // add mvc, configure the json serializer settings
224 services
225 .AddMvc(options =>
226 {
227 options.EnableEndpointRouting = false;
228 options.ReturnHttpNotAcceptable = true;
229 options.RespectBrowserAcceptHeader = true;
230 })
231 .AddNewtonsoftJson(options =>
232 {
233 options.AllowInputFormatterExceptionMessages = true;
234 options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
235 options.SerializerSettings.CheckAdditionalContent = true;
236 options.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error;
237 options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
238 options.SerializerSettings.Converters = new List<JsonConverter>
239 {
240 new VersionConverter(),
241 };
242 });
243
244 if (postSetupServices.GeneralConfiguration.HostApiDocumentation)
245 {
246 string GetDocumentationFilePath(string assemblyLocation) => ioManager.ConcatPath(ioManager.GetDirectoryName(assemblyLocation), String.Concat(ioManager.GetFileNameWithoutExtension(assemblyLocation), ".xml"));
247 var assemblyDocumentationPath = GetDocumentationFilePath(GetType().Assembly.Location);
248 var apiDocumentationPath = GetDocumentationFilePath(typeof(ApiHeaders).Assembly.Location);
249 services.AddSwaggerGen(genOptions => SwaggerConfiguration.Configure(genOptions, assemblyDocumentationPath, apiDocumentationPath));
250 services.AddSwaggerGenNewtonsoftSupport();
251 }
252
253 // CORS conditionally enabled later
254 services.AddCors();
255
256 // Enable managed HTTP clients
257 services.AddHttpClient();
259
260 void AddTypedContext<TContext>() where TContext : DatabaseContext
261 {
262 var configureAction = DatabaseContext.GetConfigureAction<TContext>();
263
264 services.AddDbContextPool<TContext>((serviceProvider, builder) =>
265 {
266 if (hostingEnvironment.IsDevelopment())
267 builder.EnableSensitiveDataLogging();
268
269 var databaseConfigOptions = serviceProvider.GetRequiredService<IOptions<DatabaseConfiguration>>();
270 var databaseConfig = databaseConfigOptions.Value ?? throw new InvalidOperationException("DatabaseConfiguration missing!");
271 configureAction(builder, databaseConfig);
272 });
273 services.AddScoped<IDatabaseContext>(x => x.GetRequiredService<TContext>());
274 }
275
276 // add the correct database context type
277 var dbType = postSetupServices.DatabaseConfiguration.DatabaseType;
278 switch (dbType)
279 {
280 case DatabaseType.MySql:
281 case DatabaseType.MariaDB:
282 AddTypedContext<MySqlDatabaseContext>();
283 break;
284 case DatabaseType.SqlServer:
285 AddTypedContext<SqlServerDatabaseContext>();
286 break;
287 case DatabaseType.Sqlite:
288 AddTypedContext<SqliteDatabaseContext>();
289 break;
290 case DatabaseType.PostgresSql:
291 AddTypedContext<PostgresSqlDatabaseContext>();
292 break;
293 default:
294 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, "Invalid {0}: {1}!", nameof(DatabaseType), dbType));
295 }
296
297 // configure other database services
298 services.AddSingleton<IDatabaseContextFactory, DatabaseContextFactory>();
299 services.AddSingleton<IDatabaseSeeder, DatabaseSeeder>();
300
301 // configure security services
303 services.AddScoped<IClaimsInjector, ClaimsInjector>();
304 services.AddSingleton<IOAuthProviders, OAuthProviders>();
305 services.AddSingleton<IIdentityCache, IdentityCache>();
306 services.AddSingleton<ICryptographySuite, CryptographySuite>();
307 services.AddSingleton<ITokenFactory, TokenFactory>();
308 services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
309
310 // configure platform specific services
311 if (postSetupServices.PlatformIdentifier.IsWindows)
312 {
313 AddWatchdog<WindowsWatchdogFactory>(services, postSetupServices);
315 services.AddSingleton<ISymlinkFactory, WindowsSymlinkFactory>();
316 services.AddSingleton<IByondInstaller, WindowsByondInstaller>();
317 services.AddSingleton<IPostWriteHandler, WindowsPostWriteHandler>();
318 services.AddSingleton<IProcessFeatures, WindowsProcessFeatures>();
319
320 services.AddSingleton<WindowsNetworkPromptReaper>();
321 services.AddSingleton<INetworkPromptReaper>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
322 services.AddSingleton<IHostedService>(x => x.GetRequiredService<WindowsNetworkPromptReaper>());
323 }
324 else
325 {
326 AddWatchdog<PosixWatchdogFactory>(services, postSetupServices);
327 services.AddSingleton<ISystemIdentityFactory, PosixSystemIdentityFactory>();
328 services.AddSingleton<ISymlinkFactory, PosixSymlinkFactory>();
329 services.AddSingleton<IByondInstaller, PosixByondInstaller>();
330 services.AddSingleton<IPostWriteHandler, PosixPostWriteHandler>();
331
332 services.AddSingleton<IProcessFeatures, PosixProcessFeatures>();
333
334 // PosixProcessFeatures also needs a IProcessExecutor for gcore
335 services.AddSingleton(x => new Lazy<IProcessExecutor>(() => x.GetRequiredService<IProcessExecutor>(), true));
336 services.AddSingleton<INetworkPromptReaper, PosixNetworkPromptReaper>();
337
338 services.AddSingleton<IHostedService, PosixSignalHandler>();
339
340 services.AddSingleton<SystemDManager>();
341 services.AddSingleton<IHostedService>(x => x.GetRequiredService<SystemDManager>());
342 }
343
344 // configure file transfer services
345 services.AddSingleton<FileTransferService>();
346 services.AddSingleton<IFileTransferStreamHandler>(x => x.GetRequiredService<FileTransferService>());
347 services.AddSingleton<IFileTransferTicketProvider>(x => x.GetRequiredService<FileTransferService>());
349
350 // configure swarm service
351 services.AddSingleton<SwarmService>();
352 services.AddSingleton<ISwarmService>(x => x.GetRequiredService<SwarmService>());
353 services.AddSingleton<ISwarmOperations>(x => x.GetRequiredService<SwarmService>());
354 services.AddSingleton<ISwarmServiceController>(x => x.GetRequiredService<SwarmService>());
355
356 // configure component services
357 services.AddScoped<IPortAllocator, PortAllocator>();
358 services.AddSingleton<IInstanceFactory, InstanceFactory>();
359 services.AddSingleton<IGitRemoteFeaturesFactory, GitRemoteFeaturesFactory>();
360 services.AddSingleton<ILibGit2RepositoryFactory, LibGit2RepositoryFactory>();
361 services.AddSingleton<ILibGit2Commands, LibGit2Commands>();
363 services.AddChatProviderFactory();
364 services.AddSingleton<IChatManagerFactory, ChatManagerFactory>();
365 services.AddSingleton<IServerUpdater, ServerUpdater>();
366 services.AddSingleton<IServerUpdateInitiator, ServerUpdateInitiator>();
367
368 // configure misc services
369 services.AddSingleton<IProcessExecutor, ProcessExecutor>();
370 services.AddSingleton<ISynchronousIOManager, SynchronousIOManager>();
371 services.AddFileDownloader();
372 services.AddSingleton<IServerPortProvider, ServerPortProivder>();
373 services.AddSingleton<ITopicClientFactory, TopicClientFactory>();
374
375 services.AddGitHub();
376
377 // configure root services
378 services.AddSingleton<IJobService, JobService>();
379 services.AddSingleton<IJobManager>(x => x.GetRequiredService<IJobService>());
380
381 services.AddSingleton<InstanceManager>();
382 services.AddSingleton<IBridgeDispatcher>(x => x.GetRequiredService<InstanceManager>());
383 services.AddSingleton<IInstanceManager>(x => x.GetRequiredService<InstanceManager>());
384 }
385
398 public void Configure(
399 IApplicationBuilder applicationBuilder,
400 IServerControl serverControl,
402 IServerPortProvider serverPortProvider,
403 IAssemblyInformationProvider assemblyInformationProvider,
404 IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
405 IOptions<GeneralConfiguration> generalConfigurationOptions,
406 IOptions<SwarmConfiguration> swarmConfigurationOptions,
407 ILogger<Application> logger)
408 {
409 ArgumentNullException.ThrowIfNull(applicationBuilder);
410 ArgumentNullException.ThrowIfNull(serverControl);
411
412 this.tokenFactory = tokenFactory ?? throw new ArgumentNullException(nameof(tokenFactory));
413
414 ArgumentNullException.ThrowIfNull(serverPortProvider);
415 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
416
417 var controlPanelConfiguration = controlPanelConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(controlPanelConfigurationOptions));
418 var generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
419 var swarmConfiguration = swarmConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(swarmConfigurationOptions));
420
421 ArgumentNullException.ThrowIfNull(logger);
422
423 logger.LogDebug("Content Root: {contentRoot}", hostingEnvironment.ContentRootPath);
424 logger.LogTrace("Web Root: {webRoot}", hostingEnvironment.WebRootPath);
425
426 // setup the HTTP request pipeline
427 // Add additional logging context to the request
428 applicationBuilder.UseAdditionalRequestLoggingContext(swarmConfiguration);
429
430 // Wrap exceptions in a 500 (ErrorMessage) response
431 applicationBuilder.UseServerErrorHandling();
432
433 // Add the X-Powered-By response header
434 applicationBuilder.UseServerBranding(assemblyInformationProvider);
435
436 // suppress OperationCancelledExceptions, they are just aborted HTTP requests
437 applicationBuilder.UseCancelledRequestSuppression();
438
439 // 503 requests made while the application is starting
440 applicationBuilder.UseAsyncInitialization<IInstanceManager>(
441 (instanceManager, cancellationToken) => instanceManager.Ready.WithToken(cancellationToken));
442
443 if (generalConfiguration.HostApiDocumentation)
444 {
445 applicationBuilder.UseSwagger();
446 applicationBuilder.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "TGS API"));
447 logger.LogTrace("Swagger API generation enabled");
448 }
449
450 // Set up CORS based on configuration if necessary
451 Action<CorsPolicyBuilder> corsBuilder = null;
452 if (controlPanelConfiguration.AllowAnyOrigin)
453 {
454 logger.LogTrace("Access-Control-Allow-Origin: *");
455 corsBuilder = builder => builder.AllowAnyOrigin();
456 }
457 else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
458 {
459 logger.LogTrace("Access-Control-Allow-Origin: {allowedOrigins}", String.Join(',', controlPanelConfiguration.AllowedOrigins));
460 corsBuilder = builder => builder.WithOrigins(controlPanelConfiguration.AllowedOrigins.ToArray());
461 }
462
463 var originalBuilder = corsBuilder;
464 corsBuilder = builder =>
465 {
466 builder
467 .AllowAnyHeader()
468 .AllowAnyMethod()
469 .SetPreflightMaxAge(TimeSpan.FromDays(1));
470 originalBuilder?.Invoke(builder);
471 };
472 applicationBuilder.UseCors(corsBuilder);
473
474 // spa loading if necessary
475 if (controlPanelConfiguration.Enable)
476 {
477 logger.LogInformation("Web control panel enabled.");
478 applicationBuilder.UseFileServer(new FileServerOptions
479 {
481 EnableDefaultFiles = true,
482 EnableDirectoryBrowsing = false,
483 });
484 }
485 else
486 logger.LogTrace("Web control panel disabled!");
487
488 // Do not cache a single thing beyond this point, it's all API
489 applicationBuilder.UseDisabledClientCache();
490
491 // authenticate JWT tokens using our security pipeline if present, returns 401 if bad
492 applicationBuilder.UseAuthentication();
493
494 // suppress and log database exceptions
495 applicationBuilder.UseDbConflictHandling();
496
497 // majority of handling is done in the controllers
498 applicationBuilder.UseMvc();
499
500 // 404 anything that gets this far
501 // End of request pipeline setup
502 logger.LogTrace("Configuration version: {configVersion}", GeneralConfiguration.CurrentConfigVersion);
503 logger.LogTrace("DMAPI Interop version: {interopVersion}", DMApiConstants.InteropVersion);
504 if (controlPanelConfiguration.Enable)
505 logger.LogTrace("Web control panel version: {webCPVersion}", MasterVersionsAttribute.Instance.RawControlPanelVersion);
506
507 logger.LogDebug("Starting hosting on port {httpApiPort}...", serverPortProvider.HttpApiPort);
508 }
509
511 protected override void ConfigureHostedService(IServiceCollection services)
512 => services.AddSingleton<IHostedService>(x => x.GetRequiredService<InstanceManager>());
513 }
514}
Represents the header that must be present for every server request.
Definition: ApiHeaders.cs:22
Constants used for communication with the DMAPI.
static readonly Version InteropVersion
The DMAPI InteropVersion being used.
DatabaseType DatabaseType
The Configuration.DatabaseType to create.
LogLevel MicrosoftLogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs for Microsoft library sources.
string GetFullLogDirectory(IIOManager ioManager, IAssemblyInformationProvider assemblyInformationProvider, IPlatformIdentifier platformIdentifier)
Gets the evaluated log Directory.
LogLevel LogLevel
The minimum Microsoft.Extensions.Logging.LogLevel to display in logs.
static readonly Version CurrentConfigVersion
The current ConfigVersion.
bool HostApiDocumentation
If the swagger UI should be made avaiable.
uint RestartTimeoutMinutes
The timeout minutes for restarting the server.
Configuration options for the game sessions.
Configuration for the server swarm system.
Configuration for the automatic update system.
const string ControlPanelRoute
Route to the ControlPanelController.
IActionResultExecutor<TResult> for LimitedStreamResults.
Sets up dependency injection.
Definition: Application.cs:61
override void ConfigureHostedService(IServiceCollection services)
Configures the IHostedService.
static void AddWatchdog< TSystemWatchdogFactory >(IServiceCollection services, IPostSetupServices postSetupServices)
Adds the IWatchdogFactory implementation.
Definition: Application.cs:91
void ConfigureServices(IServiceCollection services, IAssemblyInformationProvider assemblyInformationProvider, IIOManager ioManager, IPostSetupServices postSetupServices)
Configure the Application's services.
Definition: Application.cs:120
static IServerFactory CreateDefaultServerFactory()
Create the default IServerFactory.
Definition: Application.cs:76
ITokenFactory tokenFactory
The ITokenFactory for the Application.
Definition: Application.cs:70
void Configure(IApplicationBuilder applicationBuilder, IServerControl serverControl, ITokenFactory tokenFactory, IServerPortProvider serverPortProvider, IAssemblyInformationProvider assemblyInformationProvider, IOptions< ControlPanelConfiguration > controlPanelConfigurationOptions, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, ILogger< Application > logger)
Configure the Application.
Definition: Application.cs:398
Application(IConfiguration configuration, IWebHostEnvironment hostingEnvironment)
Initializes a new instance of the Application class.
Definition: Application.cs:105
readonly IWebHostEnvironment hostingEnvironment
The IWebHostEnvironment for the Application.
Definition: Application.cs:65
Backend abstract implementation of IDatabaseContext.
JsonConverter and IYamlTypeConverter for serializing global::System.Versions in semver format.
IIOManager that resolves paths to Environment.CurrentDirectory.
IPostWriteHandler for POSIX systems.
IPostWriteHandler for Windows systems.
Attribute for bringing in the master versions list from MSBuild that aren't embedded into assemblies ...
string RawControlPanelVersion
The Version string of the control panel version built.
static MasterVersionsAttribute Instance
Return the Assembly's instance of the MasterVersionsAttribute.
ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domain...
Implementation of IServerFactory.
DI root for configuring a SetupWizard.
IConfiguration Configuration
The IConfiguration for the SetupApplication.
Helps keep servers connected to the same database in sync by coordinating updates.
Definition: SwarmService.cs:35
Implements the SystemD notify service protocol.
Implementation of the file transfer service.
Helpers for manipulating the Serilog.Context.LogContext.
static string Template
Common template used for adding our custom log context to serilog.
Implements various filters for Swashbuckle.
static void Configure(SwaggerGenOptions swaggerGenOptions, string assemblyDocumentationPath, string apiDocumentationPath)
Configure the swagger settings.
For downloading and installing BYOND extractions for a given system.
Task Ready
Task that completes when the IInstanceManager finishes initializing.
For low level interactions with a LibGit2Sharp.IRepository.
Represents a service that may take an updated Host assembly and run it, stopping the current assembly...
Provides access to the server's HttpApiPort.
ushort HttpApiPort
The port the server listens on.
Factory for scoping usage of IDatabaseContexts. Meant for use by Components.
For initially setting up a database.
Interface for using filesystems.
Definition: IIOManager.cs:13
string ConcatPath(params string[] paths)
Combines an array of strings into a path.
string GetDirectoryName(string path)
Gets the directory portion of a given path .
string GetFileNameWithoutExtension(string path)
Gets the file name portion of a path with.
Handles changing file modes/permissions after writing.
For accessing the disk in a synchronous manner.
Manages the runtime of Jobs.
Definition: IJobManager.cs:13
The service that manages everything to do with jobs.
Definition: IJobService.cs:9
For injecting global::System.Security.Claims.Claims that Controllers.TgsAuthorizeAttribute can look f...
Contains various cryptographic functions.
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory.
Set of objects needed to configure an Core.Application.
ElasticsearchConfiguration ElasticsearchConfiguration
The Configuration.ElasticsearchConfiguration.
GeneralConfiguration GeneralConfiguration
The Configuration.GeneralConfiguration.
DatabaseConfiguration DatabaseConfiguration
The Configuration.DatabaseConfiguration.
IPlatformIdentifier PlatformIdentifier
The IPlatformIdentifier.
FileLoggingConfiguration FileLoggingConfiguration
The Configuration.FileLoggingConfiguration.
Swarm service operations for the Controllers.SwarmController.
Start and stop controllers for a swarm service.
Used for swarm operations. Functions may be no-op based on configuration.
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
bool IsWindows
If the current platform is a Windows platform.
Abstraction for suspending and resuming processes.
Reads and writes to Streams associated with FileTicketResponses.
Service for temporarily storing files to be downloaded or uploaded.
Gets unassigned ports for use by TGS.
DatabaseType
Type of database to user.
Definition: DatabaseType.cs:7