FqdnResolver.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. private NsdSettings _nsdSettings;
  8. public FqdnResolver(NsdSettings nsdSettings)
  9. {
  10. _nsdSettings = nsdSettings;
  11. }
  12. public ResultCode GetEnvironmentIdentifier(out string identifier)
  13. {
  14. if (_nsdSettings.TestMode)
  15. {
  16. identifier = "err";
  17. return ResultCode.InvalidSettingsValue;
  18. }
  19. else
  20. {
  21. identifier = _nsdSettings.Environment;
  22. }
  23. return ResultCode.Success;
  24. }
  25. public ResultCode Resolve(ServiceCtx context, 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("%", _nsdSettings.Environment);
  38. resolvedAddress = "";
  39. if (_nsdSettings == null)
  40. {
  41. return ResultCode.SettingsNotInitialized;
  42. }
  43. if (!_nsdSettings.Initialized)
  44. {
  45. return ResultCode.SettingsNotLoaded;
  46. }
  47. resolvedAddress = address switch
  48. {
  49. "e97b8a9d672e4ce4845ec6947cd66ef6-sb-api.accounts.nintendo.com" => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // dp1 environment
  50. "api.accounts.nintendo.com" => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com", // dp1 environment
  51. "e97b8a9d672e4ce4845ec6947cd66ef6-sb.accounts.nintendo.com" => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // lp1 environment
  52. "accounts.nintendo.com" => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com", // lp1 environment
  53. /*
  54. // TODO: Determine fields of the struct.
  55. this + 0xEB8 => this + 0xEB8 + 0x300
  56. this + 0x2BE8 => this + 0x2BE8 + 0x300
  57. */
  58. _ => address,
  59. };
  60. }
  61. return ResultCode.Success;
  62. }
  63. public ResultCode ResolveEx(ServiceCtx context, out ResultCode resultCode, out string resolvedAddress)
  64. {
  65. ulong inputPosition = context.Request.SendBuff[0].Position;
  66. ulong inputSize = context.Request.SendBuff[0].Size;
  67. byte[] addressBuffer = new byte[inputSize];
  68. context.Memory.Read(inputPosition, addressBuffer);
  69. string address = Encoding.UTF8.GetString(addressBuffer).TrimEnd('\0');
  70. resultCode = Resolve(context, address, out resolvedAddress);
  71. if (resultCode != ResultCode.Success)
  72. {
  73. resolvedAddress = _dummyAddress;
  74. }
  75. if (_nsdSettings.TestMode)
  76. {
  77. return ResultCode.Success;
  78. }
  79. else
  80. {
  81. return resultCode;
  82. }
  83. }
  84. }
  85. }