FqdnResolver.cs
1 using System.Text; 2 3 namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager 4 { 5 class FqdnResolver 6 { 7 private const string DummyAddress = "unknown.dummy.nintendo.net"; 8 9 public ResultCode GetEnvironmentIdentifier(out string identifier) 10 { 11 if (IManager.NsdSettings.TestMode) 12 { 13 identifier = "err"; 14 15 return ResultCode.InvalidSettingsValue; 16 } 17 else 18 { 19 identifier = IManager.NsdSettings.Environment; 20 } 21 22 return ResultCode.Success; 23 } 24 25 public static ResultCode Resolve(string address, out string resolvedAddress) 26 { 27 if (address == "api.sect.srv.nintendo.net" || 28 address == "ctest.cdn.nintendo.net" || 29 address == "ctest.cdn.n.nintendoswitch.cn" || 30 address == "unknown.dummy.nintendo.net") 31 { 32 resolvedAddress = address; 33 } 34 else 35 { 36 // TODO: Load Environment from the savedata. 37 address = address.Replace("%", IManager.NsdSettings.Environment); 38 39 resolvedAddress = ""; 40 41 if (IManager.NsdSettings == null) 42 { 43 return ResultCode.SettingsNotInitialized; 44 } 45 46 if (!IManager.NsdSettings.Initialized) 47 { 48 return ResultCode.SettingsNotLoaded; 49 } 50 51 resolvedAddress = address switch 52 { 53 #pragma warning disable IDE0055 // Disable formatting 54 "e97b8a9d672e4ce4845ec6947cd66ef6-sb-api.accounts.nintendo.com" => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // dp1 environment 55 "api.accounts.nintendo.com" => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com", // dp1 environment 56 "e97b8a9d672e4ce4845ec6947cd66ef6-sb.accounts.nintendo.com" => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // lp1 environment 57 "accounts.nintendo.com" => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com", // lp1 environment 58 /* 59 // TODO: Determine fields of the struct. 60 this + 0xEB8 => this + 0xEB8 + 0x300 61 this + 0x2BE8 => this + 0x2BE8 + 0x300 62 */ 63 _ => address, 64 #pragma warning restore IDE0055 65 }; 66 } 67 68 return ResultCode.Success; 69 } 70 71 public ResultCode ResolveEx(ServiceCtx context, out ResultCode resultCode, out string resolvedAddress) 72 { 73 ulong inputPosition = context.Request.SendBuff[0].Position; 74 ulong inputSize = context.Request.SendBuff[0].Size; 75 76 byte[] addressBuffer = new byte[inputSize]; 77 78 context.Memory.Read(inputPosition, addressBuffer); 79 80 string address = Encoding.UTF8.GetString(addressBuffer).TrimEnd('\0'); 81 82 resultCode = Resolve(address, out resolvedAddress); 83 84 if (resultCode != ResultCode.Success) 85 { 86 resolvedAddress = DummyAddress; 87 } 88 89 if (IManager.NsdSettings.TestMode) 90 { 91 return ResultCode.Success; 92 } 93 else 94 { 95 return resultCode; 96 } 97 } 98 } 99 }