dc7fd16dd5
CLI-40: port the exact-secret credential scrub to Rust/Java/.NET (Go/Python
already did it). AuthenticateUser/WriteSecured(2) helpers now redact the exact
caller-supplied secret from any surfaced error, as defense-in-depth on top of the
by-construction guarantee. Rust hand-writes a redacting Debug (derived Debug would
leak the reply); Java/.NET rebuild the same exception type with the redacted
message and do not carry the secret-bearing original forward (so ToString/stack
traces stay clean too).
CLI-41: uniform malformed-reply contract for AuthenticateUser/ArchestrAUserToId/
AddBufferedItem across all five clients — typed payload, else a present int32
return_value, else a typed malformed-reply error. Fixes Go/Java silent-0, .NET
NRE, and Rust's own internal inconsistency.
CLI-44: the Go event goroutine's Recv-error path now uses a non-blocking
sendTerminalEventResult on the reserved slot, so a genuine terminal stream error
is reported as itself instead of being mislabeled ErrSlowConsumer under overflow.
Riders from the CLI-37/38 review: (a) .NET ToDiagnosticSummary and Python
_mxaccess_message surface the raw success member (diagnostics-only parity with
Rust); (b) the status-conversion fixture carries an independent wantSuccess
boolean and the Go/.NET fixture tests assert against it instead of recomputing
the formula under test.
Shared fixtures (authenticate-user.{echoed-credential,missing-payload,
return-value-only}.reply.json) + manifest + ClientBehaviorFixtures.md +
ClientLibrariesDesign.md updated in the same change. Tracking: CLI-40/41/44 -> Done.
36 lines
1.5 KiB
C#
36 lines
1.5 KiB
C#
using ZB.MOM.WW.MxGateway.Contracts.Proto;
|
|
|
|
namespace ZB.MOM.WW.MxGateway.Client;
|
|
|
|
/// <summary>Extension methods for MxStatusProxy values.</summary>
|
|
public static class MxStatusProxyExtensions
|
|
{
|
|
/// <summary>
|
|
/// Returns whether the status indicates success, which the wire contract defines as
|
|
/// <see cref="MxStatusCategory.Ok"/>. The raw <c>Success</c> member is a verbatim COM
|
|
/// diagnostic, not a boolean, so it never participates in the verdict.
|
|
/// </summary>
|
|
/// <param name="status">The status to check.</param>
|
|
/// <returns><see langword="true"/> if the status indicates success; otherwise <see langword="false"/>.</returns>
|
|
public static bool IsSuccess(this MxStatusProxy status)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(status);
|
|
|
|
return status.Category is MxStatusCategory.Ok;
|
|
}
|
|
|
|
/// <summary>Returns a formatted summary of the status for diagnostic output.</summary>
|
|
/// <param name="status">The status to summarize.</param>
|
|
/// <returns>A formatted diagnostic summary string.</returns>
|
|
public static string ToDiagnosticSummary(this MxStatusProxy status)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(status);
|
|
|
|
string diagnosticText = string.IsNullOrWhiteSpace(status.DiagnosticText)
|
|
? "no diagnostic text"
|
|
: status.DiagnosticText;
|
|
|
|
return $"success={status.Success}; {status.Category} by {status.DetectedBy}; detail={status.Detail}; {diagnosticText}";
|
|
}
|
|
}
|