FqdnResolver.cs 4.3 KB

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