FqdnResolver.cs 3.4 KB

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