2using System.Collections.Frozen;
3using System.Collections.Generic;
4using System.Globalization;
5using System.IO.Abstractions;
6using System.Threading.Tasks;
9using Cyberboss.AspNetCore.AsyncInitializer;
11using Elastic.CommonSchema.Serilog;
13using HotChocolate.AspNetCore;
15using Microsoft.AspNetCore.Authentication;
16using Microsoft.AspNetCore.Authentication.Cookies;
17using Microsoft.AspNetCore.Authentication.JwtBearer;
18using Microsoft.AspNetCore.Authentication.OpenIdConnect;
19using Microsoft.AspNetCore.Authorization;
20using Microsoft.AspNetCore.Builder;
21using Microsoft.AspNetCore.Cors.Infrastructure;
22using Microsoft.AspNetCore.Hosting;
23using Microsoft.AspNetCore.Http;
24using Microsoft.AspNetCore.Http.Connections;
25using Microsoft.AspNetCore.HttpOverrides;
26using Microsoft.AspNetCore.Identity;
27using Microsoft.AspNetCore.Mvc.Infrastructure;
28using Microsoft.AspNetCore.SignalR;
29using Microsoft.Extensions.Configuration;
30using Microsoft.Extensions.DependencyInjection;
31using Microsoft.Extensions.Hosting;
32using Microsoft.Extensions.Logging;
33using Microsoft.Extensions.Options;
34using Microsoft.IdentityModel.Protocols.OpenIdConnect;
42using Serilog.Formatting.Display;
43using Serilog.Sinks.Elasticsearch;
83#pragma warning disable CA1506
89 readonly IWebHostEnvironment hostingEnvironment;
103 var fileSystem =
new FileSystem();
106 assemblyInformationProvider,
117 static void AddWatchdog<TSystemWatchdogFactory>(IServiceCollection services,
IPostSetupServices postSetupServices)
120 if (postSetupServices.GeneralConfiguration.UseBasicWatchdog)
131 static string GetOidcScheme(
string schemeKey)
132 => AuthenticationContextFactory.OpenIDConnectAuthenticationSchemePrefix + schemeKey;
140 IConfiguration configuration,
141 IWebHostEnvironment hostingEnvironment)
142 : base(configuration)
144 this.hostingEnvironment = hostingEnvironment ??
throw new ArgumentNullException(nameof(hostingEnvironment));
155 public void ConfigureServices(
156 IServiceCollection services,
160 IFileSystem fileSystem)
162 ConfigureServices(services, assemblyInformationProvider, ioManager);
164 ArgumentNullException.ThrowIfNull(postSetupServices);
173 services.AddOptions();
176 services.Configure<HostOptions>(
179 static LogEventLevel? ConvertSeriLogLevel(LogLevel logLevel) =>
182 LogLevel.Critical => LogEventLevel.Fatal,
183 LogLevel.Debug => LogEventLevel.Debug,
184 LogLevel.Error => LogEventLevel.Error,
185 LogLevel.Information => LogEventLevel.Information,
186 LogLevel.Trace => LogEventLevel.Verbose,
187 LogLevel.Warning => LogEventLevel.Warning,
188 LogLevel.None =>
null,
189 _ =>
throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
"Invalid log level {0}", logLevel)),
194 services.SetupLogging(
197 if (microsoftEventLevel.HasValue)
199 config.MinimumLevel.Override(
"Microsoft", microsoftEventLevel.Value);
200 config.MinimumLevel.Override(
"System.Net.Http.HttpClient", microsoftEventLevel.Value);
210 assemblyInformationProvider,
215 var formatter =
new MessageTemplateTextFormatter(
218 +
"): [{Level:u3}] {SourceContext:l}: {Message} ({EventId:x8}){NewLine}{Exception}",
221 logPath = ioManager.
ConcatPath(logPath,
"tgs-.log");
222 var rollingFileConfig = sinkConfig.File(
225 logEventLevel ?? LogEventLevel.Verbose,
227 flushToDiskInterval: TimeSpan.FromSeconds(2),
228 rollingInterval: RollingInterval.Day,
229 rollOnFileSizeLimit: true);
231 elasticsearchConfiguration.Enable
232 ?
new ElasticsearchSinkOptions(elasticsearchConfiguration.Host ??
throw new InvalidOperationException($
"Missing {ElasticsearchConfiguration.Section}:{nameof(elasticsearchConfiguration.Host)}!"))
236 ModifyConnectionSettings = connectionConfigration => (!String.IsNullOrWhiteSpace(elasticsearchConfiguration.Username) && !String.IsNullOrWhiteSpace(elasticsearchConfiguration.Password))
237 ? connectionConfigration
238 .BasicAuthentication(
239 elasticsearchConfiguration.Username,
240 elasticsearchConfiguration.Password)
241 .ServerCertificateValidationCallback((o, certificate, chain, errors) =>
true)
243 CustomFormatter = new EcsTextFormatter(),
244 AutoRegisterTemplate = true,
245 AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7,
246 IndexFormat =
"tgs-logs",
256 var jsonVersionConverterList =
new List<JsonConverter>
261 void ConfigureNewtonsoftJsonSerializerSettingsForApi(JsonSerializerSettings settings)
263 settings.NullValueHandling = NullValueHandling.Ignore;
264 settings.CheckAdditionalContent =
true;
265 settings.MissingMemberHandling = MissingMemberHandling.Error;
266 settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
267 settings.Converters = jsonVersionConverterList;
273 options.ReturnHttpNotAcceptable =
true;
274 options.RespectBrowserAcceptHeader =
true;
276 .AddNewtonsoftJson(options =>
278 options.AllowInputFormatterExceptionMessages =
true;
279 ConfigureNewtonsoftJsonSerializerSettingsForApi(options.SerializerSettings);
287 .AddNewtonsoftJsonProtocol(options =>
289 ConfigureNewtonsoftJsonSerializerSettingsForApi(options.PayloadSerializerSettings);
297 var assemblyDocumentationPath = GetDocumentationFilePath(GetType().Assembly.Location);
298 var apiDocumentationPath = GetDocumentationFilePath(typeof(
ApiHeaders).Assembly.Location);
300 services.AddSwaggerGenNewtonsoftSupport();
309 .ConfigureHttpClientDefaults(
310 builder => builder.ConfigureHttpClient(
311 client => client.DefaultRequestHeaders.UserAgent.Add(
317 services.AddSingleton<IMetricFactory>(_ => Metrics.DefaultFactory);
318 services.AddSingleton<ICollectorRegistry>(_ => Metrics.DefaultRegistry);
321 services.AddMetricServer(options => options.Port = prometheusPort.Value);
323 services.UseHttpClientMetrics();
325 var healthChecksBuilder = services
327 .ForwardToPrometheus();
333 .ConfigureGraphQLServer();
335 void AddTypedContext<TContext>()
340 services.AddDbContextPool<TContext>((serviceProvider, builder) =>
342 if (hostingEnvironment.IsDevelopment())
343 builder.EnableSensitiveDataLogging();
345 var databaseConfigOptions = serviceProvider.GetRequiredService<IOptions<DatabaseConfiguration>>();
346 var databaseConfig = databaseConfigOptions.Value ??
throw new InvalidOperationException(
"DatabaseConfiguration missing!");
347 configureAction(builder, databaseConfig);
349 services.AddScoped<
IDatabaseContext>(x => x.GetRequiredService<TContext>());
352 .AddDbContextCheck<TContext>();
361 AddTypedContext<MySqlDatabaseContext>();
364 AddTypedContext<SqlServerDatabaseContext>();
367 AddTypedContext<SqliteDatabaseContext>();
370 AddTypedContext<PostgresSqlDatabaseContext>();
373 throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture,
"Invalid {0}: {1}!", nameof(
DatabaseType), dbType));
386 services.AddSingleton<IPasswordHasher<Models.User>, PasswordHasher<Models.User>>();
391 AddWatchdog<WindowsWatchdogFactory>(services, postSetupServices);
405 AddWatchdog<PosixWatchdogFactory>(services, postSetupServices);
416 services.AddSingleton(x =>
new Lazy<IProcessExecutor>(() => x.GetRequiredService<
IProcessExecutor>(),
true));
424 var openDreamRepositoryDirectory = ioManager.
ConcatPath(
425 ioManager.GetPathInLocalDirectory(assemblyInformationProvider),
426 "OpenDreamRepository");
427 services.AddSingleton(
429 .GetRequiredService<IRepositoryManagerFactory>()
430 .CreateRepositoryManager(
432 openDreamRepositoryDirectory),
435 services.AddSingleton(
436 serviceProvider =>
new Dictionary<EngineType, IEngineInstaller>
441 .ToFrozenDictionary());
467 services.AddChatProviderFactory();
469 services.AddSingleton<IServerUpdater, ServerUpdater>();
470 services.AddSingleton<IServerUpdateInitiator, ServerUpdateInitiator>();
486 services.AddSingleton<IServerPortProvider, ServerPortProivder>();
488 services.AddSingleton(fileSystem);
489 services.AddHostedService<CommandPipeManager>();
491 services.AddFileDownloader();
492 services.AddGitHub();
523 public void Configure(
524 IApplicationBuilder applicationBuilder,
525 IServerControl serverControl,
527 IServerPortProvider serverPortProvider,
529 IOptions<ControlPanelConfiguration> controlPanelConfigurationOptions,
530 IOptions<GeneralConfiguration> generalConfigurationOptions,
531 IOptions<DatabaseConfiguration> databaseConfigurationOptions,
532 IOptions<SecurityConfiguration> securityConfigurationOptions,
533 IOptions<SwarmConfiguration> swarmConfigurationOptions,
534 IOptions<InternalConfiguration> internalConfigurationOptions,
535 ILogger<Application> logger)
537 ArgumentNullException.ThrowIfNull(applicationBuilder);
538 ArgumentNullException.ThrowIfNull(serverControl);
540 this.tokenFactory = tokenFactory ??
throw new ArgumentNullException(nameof(tokenFactory));
542 ArgumentNullException.ThrowIfNull(serverPortProvider);
543 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
545 var controlPanelConfiguration = (controlPanelConfigurationOptions ??
throw new ArgumentNullException(nameof(controlPanelConfigurationOptions))).Value;
546 var generalConfiguration = (generalConfigurationOptions ??
throw new ArgumentNullException(nameof(generalConfigurationOptions))).Value;
547 var databaseConfiguration = (databaseConfigurationOptions ??
throw new ArgumentNullException(nameof(databaseConfigurationOptions))).Value;
548 var swarmConfiguration = (swarmConfigurationOptions ??
throw new ArgumentNullException(nameof(swarmConfigurationOptions))).Value;
549 var internalConfiguration = (internalConfigurationOptions ??
throw new ArgumentNullException(nameof(internalConfigurationOptions))).Value;
551 ArgumentNullException.ThrowIfNull(logger);
553 logger.LogDebug(
"Database provider: {provider}", databaseConfiguration.DatabaseType);
554 logger.LogDebug(
"Content Root: {contentRoot}", hostingEnvironment.ContentRootPath);
555 logger.LogTrace(
"Web Root: {webRoot}", hostingEnvironment.WebRootPath);
559 applicationBuilder.UseAdditionalRequestLoggingContext(swarmConfiguration);
562 applicationBuilder.UseServerErrorHandling();
565 var forwardedHeaderOptions =
new ForwardedHeadersOptions
567 ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost,
570 forwardedHeaderOptions.KnownNetworks.Clear();
571 forwardedHeaderOptions.KnownNetworks.Add(
573 global::System.Net.IPAddress.Any,
576 applicationBuilder.UseForwardedHeaders(forwardedHeaderOptions);
579 applicationBuilder.UseHttpMetrics();
582 applicationBuilder.UseServerBranding(assemblyInformationProvider);
585 applicationBuilder.UseDisabledNginxProxyBuffering();
588 applicationBuilder.UseCancelledRequestSuppression();
592 (instanceManager, cancellationToken) => instanceManager.
Ready.WaitAsync(cancellationToken));
594 if (generalConfiguration.HostApiDocumentation)
596 var siteDocPath = Routes.ApiRoot + $
"doc/{SwaggerConfiguration.DocumentName}.json";
597 if (!String.IsNullOrWhiteSpace(controlPanelConfiguration.PublicPath))
598 siteDocPath = controlPanelConfiguration.PublicPath.TrimEnd(
'/') + siteDocPath;
600 applicationBuilder.UseSwagger(options =>
602 options.RouteTemplate = Routes.ApiRoot +
"doc/{documentName}.{json|yaml}";
604 applicationBuilder.UseSwaggerUI(options =>
607 options.SwaggerEndpoint(siteDocPath,
"TGS API");
609 logger.LogTrace(
"Swagger API generation enabled");
613 if (controlPanelConfiguration.Enable)
615 logger.LogInformation(
"Web control panel enabled.");
616 applicationBuilder.UseFileServer(
new FileServerOptions
619 EnableDefaultFiles =
true,
620 EnableDirectoryBrowsing =
false,
621 RedirectToAppendTrailingSlash =
false,
626 logger.LogDebug(
"Web control panel was not included in TGS build!");
628 logger.LogTrace(
"Web control panel disabled!");
632 applicationBuilder.UseRouting();
635 Action<CorsPolicyBuilder>? corsBuilder =
null;
636 if (controlPanelConfiguration.AllowAnyOrigin)
638 logger.LogTrace(
"Access-Control-Allow-Origin: *");
639 corsBuilder = builder => builder.SetIsOriginAllowed(_ =>
true);
641 else if (controlPanelConfiguration.AllowedOrigins?.Count > 0)
643 logger.LogTrace(
"Access-Control-Allow-Origin: {allowedOrigins}", String.Join(
',', controlPanelConfiguration.AllowedOrigins));
644 corsBuilder = builder => builder.WithOrigins([.. controlPanelConfiguration.AllowedOrigins]);
647 var originalBuilder = corsBuilder;
648 corsBuilder = builder =>
654 .SetPreflightMaxAge(TimeSpan.FromDays(1));
655 originalBuilder?.Invoke(builder);
657 applicationBuilder.UseCors(corsBuilder);
660 applicationBuilder.UseApiCompatibility();
663 applicationBuilder.UseAuthentication();
666 applicationBuilder.UseAuthorization();
669 applicationBuilder.UseDbConflictHandling();
672 applicationBuilder.UseEndpoints(endpoints =>
679 options.Transports = HttpTransportType.ServerSentEvents;
680 options.CloseOnAuthenticationExpiration =
true;
682 .RequireAuthorization()
683 .RequireCors(corsBuilder);
686 endpoints.MapControllers();
688 if (internalConfiguration.EnableGraphQL)
690 logger.LogWarning(
"Enabling GraphQL. This API is experimental and breaking changes may occur at any time!");
691 var gqlOptions =
new GraphQLServerOptions
693 EnableBatching =
true,
696 gqlOptions.Tool.Enable = generalConfiguration.HostApiDocumentation;
700 .WithOptions(gqlOptions);
703 if (generalConfiguration.PrometheusPort.HasValue)
704 if (generalConfiguration.PrometheusPort == generalConfiguration.ApiPort)
706 endpoints.MapMetrics();
707 logger.LogDebug(
"Prometheus being hosted alongside server");
710 logger.LogDebug(
"Prometheus being hosted on port {prometheusPort}", generalConfiguration.PrometheusPort);
712 logger.LogTrace(
"Prometheus disabled");
714 endpoints.MapHealthChecks(
"/health");
716 var oidcConfig = securityConfigurationOptions.Value.OpenIDConnect;
717 if (oidcConfig ==
null)
720 foreach (var kvp
in oidcConfig)
722 $
"/oidc/{kvp.Key}/signin",
723 context => context.ChallengeAsync(
724 GetOidcScheme(kvp.Key),
725 new AuthenticationProperties
727 RedirectUri = $
"/oidc/{kvp.Key}/landing",
735 if (controlPanelConfiguration.Enable)
738 logger.LogDebug(
"Starting hosting on port {httpApiPort}...", serverPortProvider.HttpApiPort);
742 protected override void ConfigureHostedService(IServiceCollection services)
750 void ConfigureAuthenticationPipeline(IServiceCollection services,
SecurityConfiguration securityConfiguration)
752 services.AddHttpContextAccessor();
766 services.AddScoped(provider => (provider
767 .GetRequiredService<IHttpContextAccessor>()
768 .HttpContext ??
throw new InvalidOperationException($
"Unable to resolve {nameof(IAuthenticationContext)} due to no HttpContext being available!"))
770 .GetRequiredService<AuthenticationContextFactory>()
771 .CurrentAuthenticationContext);
774 var authBuilder = services
775 .AddAuthentication(options =>
777 options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
779 .AddJwtBearer(jwtBearerOptions =>
783 jwtBearerOptions.TokenValidationParameters = tokenFactory?.
ValidationParameters ??
throw new InvalidOperationException(
"tokenFactory not initialized!");
784 jwtBearerOptions.MapInboundClaims =
false;
785 jwtBearerOptions.Events =
new JwtBearerEvents
787 OnMessageReceived = context =>
789 if (String.IsNullOrWhiteSpace(context.Token))
791 var accessToken = context.Request.Query[
"access_token"];
792 var path = context.HttpContext.Request.Path;
794 if (!String.IsNullOrWhiteSpace(accessToken) &&
795 path.StartsWithSegments(
Routes.
HubsRoot, StringComparison.OrdinalIgnoreCase))
797 context.Token = accessToken;
801 return Task.CompletedTask;
803 OnTokenValidated = context => context
815 services.AddAuthorization(options =>
820 .RequireAuthenticatedUser()
827 if (oidcConfig ==
null || oidcConfig.Count == 0)
830 authBuilder.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme);
832 foreach (var kvp
in oidcConfig)
834 var configName = kvp.Key;
837 GetOidcScheme(configName),
840 var config = kvp.Value;
842 options.Authority = config.Authority?.ToString();
843 options.ClientId = config.ClientId;
844 options.ClientSecret = config.ClientSecret;
846 options.Events =
new OpenIdConnectEvents
848 OnRemoteFailure = context =>
850 context.HandleResponse();
851 context.HttpContext.Response.Redirect($
"{config.ReturnPath}?error={HttpUtility.UrlEncode(context.Failure?.Message ?? $"{options.Events.OnRemoteFailure} was called without an {nameof(
Exception)}!
")}&state=oidc.{HttpUtility.UrlEncode(configName)}");
852 return Task.CompletedTask;
854 OnTicketReceived = context =>
856 var services = context
859 var tokenFactory = services
861 var authenticationContext = services
863 context.HandleResponse();
864 context.HttpContext.Response.Redirect($
"{config.ReturnPath}?code={HttpUtility.UrlEncode(tokenFactory.CreateToken(authenticationContext.User, true))}&state=oidc.{HttpUtility.UrlEncode(configName)}");
865 return Task.CompletedTask;
869 Task CompleteAuth(RemoteAuthenticationContext<OpenIdConnectOptions> context)
884 options.GetClaimsFromUserInfoEndpoint =
true;
885 options.ClaimActions.MapUniqueJsonKey(config.GroupIdClaim, config.GroupIdClaim);
886 options.TokenValidationParameters =
new Microsoft.IdentityModel.Tokens.TokenValidationParameters
888 NameClaimType = config.UsernameClaim,
889 RoleClaimType =
"roles",
892 options.Scope.Add(OpenIdConnectScope.Profile);
893 options.Events.OnUserInformationReceived = CompleteAuth;
896 options.Events.OnTokenValidated = CompleteAuth;
898 options.Scope.Add(OpenIdConnectScope.OpenId);
899 options.Scope.Add(OpenIdConnectScope.OfflineAccess);
901 options.RequireHttpsMetadata =
false;
902 options.SaveTokens =
true;
903 options.ResponseType = OpenIdConnectResponseType.Code;
904 options.MapInboundClaims =
false;
906 options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
908 var basePath = $
"/oidc/{configName}/";
909 options.CallbackPath =
new PathString(basePath +
"signin-callback");
910 options.SignedOutCallbackPath =
new PathString(basePath +
"signout-callback");
911 options.RemoteSignOutPath =
new PathString(basePath +
"signout");
Routes to a server actions.
const string GraphQL
The GraphQL route.
const string HubsRoot
The root route of all hubs.
const string JobsHub
The root route of all hubs.
Base implementation of IEngineInstaller for EngineType.Byond.
Implementation of IEngineInstaller that forwards calls to different IEngineInstaller based on their a...
Implementation of IEngineInstaller for EngineType.OpenDream.
IEngineInstaller for Posix systems.
IEngineInstaller for windows systems.
Implementation of OpenDreamInstaller for Windows systems.
No-op implementation of IEventConsumer.
Constants used for communication with the DMAPI.
static readonly Version InteropVersion
The DMAPI InteropVersion being used.
Configuration options for the web control panel.
DatabaseType DatabaseType
The Configuration.DatabaseType to create.
File logging configuration options.
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.
bool Disable
If file logging is disabled.
General configuration options.
static readonly Version CurrentConfigVersion
The current ConfigVersion.
bool HostApiDocumentation
If the swagger documentation and UI should be made avaiable.
uint RestartTimeoutMinutes
The timeout minutes for restarting the server.
ushort? PrometheusPort
The port Prometheus metrics are published on, if any.
ushort ApiPort
The port the TGS API listens on.
Unstable configuration options used internally by TGS.
bool UsingSystemD
If the server is running under SystemD.
Configuration options pertaining to user security.
IDictionary< string, OidcConfiguration >? OpenIDConnect
OIDC provider settings keyed by scheme name.
bool OidcStrictMode
If OIDC strict mode should be enabled. This mode enforces the existence of at least one OpenIDConnect...
Configuration options for the game sessions.
Configuration for the server swarm system.
Configuration for the automatic update system.
Controller for the web control panel.
const string ControlPanelRoute
Route to the ControlPanelController.
IActionResultExecutor<TResult> for LimitedStreamResults.
Backend abstract implementation of IDatabaseContext.
IIOManager that resolves paths to Environment.CurrentDirectory.
IFilesystemLinkFactory for POSIX systems.
IPostWriteHandler for POSIX systems.
IFilesystemLinkFactory for windows systems.
IPostWriteHandler for Windows systems.
Handles mapping groups for the JobsHub.
A SignalR Hub for pushing job updates.
Attribute for bringing in the master versions list from MSBuild that aren't embedded into assemblies ...
string RawWebpanelVersion
The Version string of the control panel version built.
static MasterVersionsAttribute Instance
Return the Assembly's instance of the MasterVersionsAttribute.
A IClaimsTransformation that maps Claims using an IAuthenticationContext.
An IHubFilter that denies method calls and connections if the IAuthenticationContext is not valid for...
IAuthorizationHandler for RightsConditional<TRights>s and UserSessionValidRequirements.
ISystemIdentityFactory for posix systems.
Helper for using the AuthorizeAttribute with the Api.Rights system.
const string PolicyName
Policy used to apply global requirement of UserEnabledRole.
const string UserEnabledRole
Role used to indicate access to the server is allowed.
ISystemIdentityFactory for windows systems. Uses long running tasks due to potential networked domain...
Implementation of IServerFactory.
DI root for configuring a SetupWizard.
Helps keep servers connected to the same database in sync by coordinating updates.
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.
const string DocumentationSiteRouteExtension
The path to the hosted documentation site.
static void Configure(SwaggerGenOptions swaggerGenOptions, string assemblyDocumentationPath, string apiDocumentationPath)
Configure the swagger settings.
JsonConverter and IYamlTypeConverter for serializing global::System.Versions in semver format.
SignalR client methods for receiving JobResponses.
IAuthority for administrative server operations.
IAuthority for manipulating chat bots.
Invokes TAuthority s from GraphQL endpoints.
IAuthority for authenticating with the server.
IAuthority for managing PermissionSets.
Invokes TAuthority methods and generates IActionResult responses.
IAuthority for managing Users.
IAuthority for managing UserGroups.
For creating IChatManagers.
Factory for creating IRemoteDeploymentManagers.
For downloading and installing game engines for a given system.
Factory for creating IInstances.
Task Ready
Task that completes when the IInstanceManager finishes initializing.
Handler for BridgeParameters.
Factory for creating IGitRemoteFeatures.
For low level interactions with a LibGit2Sharp.IRepository.
Factory for creating LibGit2Sharp.IRepositorys.
Factory for creating IRepositoryManagers.
Factory for ITopicClients.
Factory for scoping usage of IDatabaseContexts. Meant for use by Components.
For initially setting up a database.
Implementation of HotChocolate.Subscriptions.ITopicEventReceiver that works around the global::System...
For creating filesystem symbolic links.
Interface for using filesystems.
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.
IIOManager CreateResolverForSubdirectory(string subdirectoryPath)
Create a new IIOManager that resolves paths to the specified subdirectoryPath .
Handles changing file modes/permissions after writing.
For accessing the disk in a synchronous manner.
Manages the runtime of Jobs.
The service that manages everything to do with jobs.
Allows manually triggering jobs hub updates.
For creating and accessing authentication contexts.
Interface for accessing the current request's ClaimsPrincipal.
Contains various cryptographic functions.
For caching ISystemIdentitys.
Receives notifications about permissions updates.
Handles invalidating user sessions.
Factory for ISystemIdentitys.
For creating TokenResponses.
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory.
Handles validating authentication tokens.
Contains IOAuthValidators.
Set of objects needed to configure an Core.Application.
GeneralConfiguration GeneralConfiguration
The Configuration.GeneralConfiguration.
ElasticsearchConfiguration ElasticsearchConfiguration
The Configuration.ElasticsearchConfiguration.
FileLoggingConfiguration FileLoggingConfiguration
The Configuration.FileLoggingConfiguration.
DatabaseConfiguration DatabaseConfiguration
The Configuration.DatabaseConfiguration.
SecurityConfiguration SecurityConfiguration
The Configuration.SecurityConfiguration.
InternalConfiguration InternalConfiguration
The Configuration.InternalConfiguration.
IPlatformIdentifier PlatformIdentifier
The IPlatformIdentifier.
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.
Service for managing the dotnet-dump installation.
On Windows, DreamDaemon will show an unskippable prompt when using /world/proc/OpenPort()....
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.
EngineType
The type of engine the codebase is using.
@ Configuration
ConfigurationRights.
DatabaseType
Type of database to user.