From 859980af026f163ca112170589bf49de9f206299 Mon Sep 17 00:00:00 2001 From: gamer147 Date: Wed, 27 May 2026 14:11:47 -0400 Subject: [PATCH] wire: echo UDID in DataHeaders on every response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SignUpTask.Parse validates data_headers.udid against Certification.Udid; mismatch discards the response. Sourced from the same mappedUdid the translation middleware uses to decrypt — never controller state. Other endpoints carry the extra key; SignUpTask is the only reader. Co-Authored-By: Claude Opus 4.7 --- .../Middlewares/ShadowverseTranslationMiddleware.cs | 6 +++++- .../Models/Dtos/Internal/DataHeaders.cs | 13 ++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs b/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs index 230406f..2ffc0e6 100644 --- a/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs +++ b/SVSim.EmulatedEntrypoint/Middlewares/ShadowverseTranslationMiddleware.cs @@ -166,7 +166,11 @@ public class ShadowverseTranslationMiddleware : IMiddleware // populated (prod sends real numbers for the title check too, but 0 / 0 satisfies // the client's BaseTask.Parse which only reads result_code + servertime here). ShortUdid = viewer?.ShortUdid ?? 0, - ViewerId = viewer?.Id ?? 0 + ViewerId = viewer?.Id ?? 0, + // Echo the decrypted-against UDID. Most clients ignore this field; SignUpTask.Parse + // requires it (validates against Certification.Udid on the response). Comes from + // mappedUdid (the value used for AES); never from controller state. + Udid = mappedUdid?.ToString() ?? "" } }; diff --git a/SVSim.EmulatedEntrypoint/Models/Dtos/Internal/DataHeaders.cs b/SVSim.EmulatedEntrypoint/Models/Dtos/Internal/DataHeaders.cs index 5cac025..e39bd61 100644 --- a/SVSim.EmulatedEntrypoint/Models/Dtos/Internal/DataHeaders.cs +++ b/SVSim.EmulatedEntrypoint/Models/Dtos/Internal/DataHeaders.cs @@ -21,4 +21,15 @@ public class DataHeaders [JsonPropertyName("result_code")] [Key("result_code")] public int ResultCode { get; set; } -} \ No newline at end of file + + /// + /// Echoed UDID. Read by SignUpTask.Parse to validate response identity (client logs + /// udid一致しません and discards the response on mismatch); ignored by every other + /// client task. Always set by ShadowverseTranslationMiddleware from the request's + /// resolved UDID — never from controller state. Empty string when the SID→UDID lookup misses + /// (request without UDID/SID headers). + /// + [JsonPropertyName("udid")] + [Key("udid")] + public string Udid { get; set; } = ""; +}