fix(launcher): close Campaign LA LA1 review findings
This commit is contained in:
parent
4edc122085
commit
d511e4c348
12 changed files with 413 additions and 65 deletions
|
|
@ -29,11 +29,12 @@ internal sealed class AppCredentialResolver
|
|||
private readonly bool _isLinux;
|
||||
|
||||
/// <summary>
|
||||
/// <paramref name="isLinux"/> is caller-supplied, never detected in this
|
||||
/// file — <c>LinuxPlatformBoundaryTests</c>'s platform-owner guard
|
||||
/// requires every OS-family check to live under <c>Platform/</c>;
|
||||
/// callers pass <c>GraphicalHostPlatformServices</c>'s already-detected
|
||||
/// value instead of this file re-detecting it itself.
|
||||
/// <paramref name="isLinux"/> is the caller-supplied platform-policy
|
||||
/// value from <c>GraphicalHostPlatformServices</c>. This file still uses
|
||||
/// <c>RuntimePlatformGuard.IsLinuxRuntime</c> below as the narrow
|
||||
/// CA1416-recognized runtime guard required before calling
|
||||
/// <c>File.GetUnixFileMode</c>; it does not independently select the host
|
||||
/// platform or bypass the platform-services owner.
|
||||
/// </summary>
|
||||
internal AppCredentialResolver(
|
||||
TextReader standardInput,
|
||||
|
|
|
|||
|
|
@ -1665,7 +1665,7 @@ public sealed class GameWindow :
|
|||
// OnClosing() native-window-close-request pass) represents the
|
||||
// process actually being done.
|
||||
if (releaseNativeWindow)
|
||||
_statusWriter.Exited(_options.SessionId ?? "app", 0, "disposed");
|
||||
_statusWriter.Exited(_options.SessionId ?? "app", 0, "graceful");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using AcDream.App.Configuration;
|
||||
using AcDream.App.Rendering.Residency;
|
||||
using AcDream.App.Streaming;
|
||||
|
|
@ -266,6 +268,44 @@ public sealed record RuntimeOptions(
|
|||
selector.Id,
|
||||
selector.Name);
|
||||
|
||||
private static readonly PropertyInfo[] PrintableProperties =
|
||||
typeof(RuntimeOptions)
|
||||
.GetProperties(
|
||||
BindingFlags.Instance
|
||||
| BindingFlags.Public
|
||||
| BindingFlags.DeclaredOnly)
|
||||
.Where(static property =>
|
||||
property.GetMethod is not null
|
||||
&& property.GetIndexParameters().Length == 0)
|
||||
.OrderBy(static property => property.MetadataToken)
|
||||
.ToArray();
|
||||
|
||||
/// <summary>
|
||||
/// Campaign LA LA1 defense in depth: positional records normally print
|
||||
/// every public property, including the live password. Preserve that
|
||||
/// ordinary diagnostic property set while substituting the one sensitive
|
||||
/// value before it can reach a log, debugger display, or exception.
|
||||
/// Reflection is cached once and runs only on the diagnostic
|
||||
/// <see cref="object.ToString"/> path.
|
||||
/// </summary>
|
||||
private bool PrintMembers(StringBuilder builder)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(builder);
|
||||
for (int index = 0; index < PrintableProperties.Length; index++)
|
||||
{
|
||||
PropertyInfo property = PrintableProperties[index];
|
||||
if (index != 0)
|
||||
builder.Append(", ");
|
||||
builder.Append(property.Name);
|
||||
builder.Append(" = ");
|
||||
builder.Append(
|
||||
property.Name == nameof(LivePass) && LivePass is not null
|
||||
? "<redacted>"
|
||||
: property.GetValue(this));
|
||||
}
|
||||
return PrintableProperties.Length != 0;
|
||||
}
|
||||
|
||||
/// <summary>True iff live-mode credentials are present and valid for connecting.</summary>
|
||||
public bool HasLiveCredentials =>
|
||||
LiveMode && !string.IsNullOrEmpty(LiveUser) && !string.IsNullOrEmpty(LivePass);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue