From 289a67e371bdba2c6b77d519c13ebbfabc626420 Mon Sep 17 00:00:00 2001 From: Alejandro Rosales Date: Mon, 31 Aug 2026 18:02:28 -0600 Subject: [PATCH] Add native online success smoke probe --- .../Program.cs | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/tests/SGU.CredentialProvider.SmokeProbe/Program.cs b/tests/SGU.CredentialProvider.SmokeProbe/Program.cs index 4c3729d..fe7708b 100644 --- a/tests/SGU.CredentialProvider.SmokeProbe/Program.cs +++ b/tests/SGU.CredentialProvider.SmokeProbe/Program.cs @@ -23,9 +23,9 @@ internal static class Program private static int Main(string[] args) { string mode = args.Length == 0 ? "enumeration" : args.Single(); - if (mode is not ("enumeration" or "direct-broker" or "online-rejection" or "offline-fallback")) + if (mode is not ("enumeration" or "direct-broker" or "online-rejection" or "online-success" or "offline-fallback")) { - Console.Error.WriteLine("Usage: SGU.CredentialProvider.SmokeProbe.exe [enumeration|direct-broker|online-rejection|offline-fallback]"); + Console.Error.WriteLine("Usage: SGU.CredentialProvider.SmokeProbe.exe [enumeration|direct-broker|online-rejection|online-success|offline-fallback]"); return 64; } @@ -135,10 +135,16 @@ internal static class Program string[] labelArray = labels.ToArray(); uint userNameFieldId = checked((uint)Array.IndexOf(labelArray, "Clave institucional")); uint passwordFieldId = checked((uint)Array.IndexOf(labelArray, "Contraseña")); - string userName = "DO000000"; - string password = mode == "offline-fallback" - ? $"Probe-{Guid.NewGuid():N}-áΩ" - : $"Probe-{Guid.NewGuid():N}"; + string userName = mode == "online-success" + ? Environment.GetEnvironmentVariable("SGU_TEST_USERNAME") + ?? throw new InvalidOperationException("SGU_TEST_USERNAME is required for online-success.") + : "DO000000"; + string password = mode == "online-success" + ? Environment.GetEnvironmentVariable("SGU_TEST_PASSWORD") + ?? throw new InvalidOperationException("SGU_TEST_PASSWORD is required for online-success.") + : mode == "offline-fallback" + ? $"Probe-{Guid.NewGuid():N}-áΩ" + : $"Probe-{Guid.NewGuid():N}"; IntPtr vtable = Marshal.ReadIntPtr(credential); SetStringValueDelegate setStringValue = Marshal.GetDelegateForFunctionPointer( @@ -162,20 +168,20 @@ internal static class Program if (mode == "online-rejection") { - bool passed = response == (int)SerializationResponse.NoCredentialNotFinished && + bool rejectionPassed = response == (int)SerializationResponse.NoCredentialNotFinished && serialization.SerializationData == IntPtr.Zero && statusIcon == (int)StatusIcon.Error && statusText == "Credenciales institucionales inválidas."; Console.WriteLine(JsonSerializer.Serialize(new { - passed, + passed = rejectionPassed, mode, response = (SerializationResponse)response, statusIcon = (StatusIcon)statusIcon, statusText, credentialReturned = serialization.SerializationData != IntPtr.Zero })); - return passed ? 0 : 1; + return rejectionPassed ? 0 : 1; } KerberosInteractiveUnlockLogon logon = serialization.SerializationData == IntPtr.Zero @@ -187,17 +193,20 @@ internal static class Program bool passwordPreserved = string.Equals(packedPassword, password, StringComparison.Ordinal); packedPassword = string.Empty; - bool fallbackPassed = response == (int)SerializationResponse.ReturnCredentialFinished && + bool serializedCredentialPassed = response == (int)SerializationResponse.ReturnCredentialFinished && serialization.SerializationData != IntPtr.Zero && serialization.SerializationSize > 0 && - statusIcon == (int)StatusIcon.Warning && - statusText == "Servicio institucional no disponible; Windows validará la última contraseña de dominio registrada." && string.Equals(packedDomain, "LCI", StringComparison.Ordinal) && string.Equals(packedUserName, userName, StringComparison.Ordinal) && passwordPreserved; + bool passed = mode == "online-success" + ? serializedCredentialPassed && statusIcon == (int)StatusIcon.None && string.IsNullOrEmpty(statusText) + : serializedCredentialPassed && + statusIcon == (int)StatusIcon.Warning && + statusText == "Servicio institucional no disponible; Windows validará la última contraseña de dominio registrada."; Console.WriteLine(JsonSerializer.Serialize(new { - passed = fallbackPassed, + passed, mode, response = (SerializationResponse)response, statusIcon = (StatusIcon)statusIcon, @@ -207,7 +216,7 @@ internal static class Program passwordPreserved, serializationSize = serialization.SerializationSize })); - return fallbackPassed ? 0 : 1; + return passed ? 0 : 1; } finally {