FqdnResolver.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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 GetSettingName(ServiceCtx context, out string settingName)
  13. {
  14. if (_nsdSettings.TestMode)
  15. {
  16. settingName = "";
  17. return ResultCode.NotImplemented;
  18. }
  19. else
  20. {
  21. settingName = "";
  22. if (true) // TODO: Determine field (struct + 0x2C)
  23. {
  24. settingName = _nsdSettings.Environment;
  25. return ResultCode.Success;
  26. }
  27. return ResultCode.NullOutputObject;
  28. }
  29. }
  30. public ResultCode GetEnvironmentIdentifier(ServiceCtx context, out string identifier)
  31. {
  32. if (_nsdSettings.TestMode)
  33. {
  34. identifier = "rre";
  35. return ResultCode.NotImplemented;
  36. }
  37. else
  38. {
  39. identifier = _nsdSettings.Environment;
  40. }
  41. return ResultCode.Success;
  42. }
  43. public ResultCode Resolve(ServiceCtx context, string address, out string resolvedAddress)
  44. {
  45. if (address != "api.sect.srv.nintendo.net" || address != "conntest.nintendowifi.net")
  46. {
  47. // TODO: Load Environment from the savedata.
  48. address = address.Replace("%", _nsdSettings.Environment);
  49. resolvedAddress = "";
  50. if (_nsdSettings == null)
  51. {
  52. return ResultCode.SettingsNotInitialized;
  53. }
  54. if (!_nsdSettings.Initialized)
  55. {
  56. return ResultCode.SettingsNotLoaded;
  57. }
  58. switch (address)
  59. {
  60. case "e97b8a9d672e4ce4845ec6947cd66ef6-sb-api.accounts.nintendo.com": // dp1 environment
  61. resolvedAddress = "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com";
  62. break;
  63. case "api.accounts.nintendo.com": // dp1 environment
  64. resolvedAddress = "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com";
  65. break;
  66. case "e97b8a9d672e4ce4845ec6947cd66ef6-sb.accounts.nintendo.com": // lp1 environment
  67. resolvedAddress = "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com";
  68. break;
  69. case "accounts.nintendo.com": // lp1 environment
  70. resolvedAddress = "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com";
  71. break;
  72. /*
  73. // TODO: Determine fields of the struct.
  74. case "": // + 0xEB8 || + 0x2BE8
  75. resolvedAddress = ""; // + 0xEB8 + 0x300 || + 0x2BE8 + 0x300
  76. break;
  77. */
  78. default:
  79. resolvedAddress = address;
  80. break;
  81. }
  82. }
  83. else
  84. {
  85. resolvedAddress = address;
  86. }
  87. return ResultCode.Success;
  88. }
  89. public ResultCode ResolveEx(ServiceCtx context, out ResultCode resultCode, out string resolvedAddress)
  90. {
  91. (long inputPosition, long inputSize) = context.Request.GetBufferType0x21();
  92. byte[] addressBuffer = context.Memory.ReadBytes(inputPosition, inputSize);
  93. string address = Encoding.UTF8.GetString(addressBuffer);
  94. resultCode = Resolve(context, address, out resolvedAddress);
  95. if (resultCode != ResultCode.Success)
  96. {
  97. resolvedAddress = _dummyAddress;
  98. }
  99. if (_nsdSettings.TestMode)
  100. {
  101. return ResultCode.Success;
  102. }
  103. else
  104. {
  105. return resultCode;
  106. }
  107. }
  108. }
  109. }