FqdnResolver.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. resolvedAddress = address switch
  61. {
  62. "e97b8a9d672e4ce4845ec6947cd66ef6-sb-api.accounts.nintendo.com" => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // dp1 environment
  63. "api.accounts.nintendo.com" => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com", // dp1 environment
  64. "e97b8a9d672e4ce4845ec6947cd66ef6-sb.accounts.nintendo.com" => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // lp1 environment
  65. "accounts.nintendo.com" => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com", // lp1 environment
  66. /*
  67. // TODO: Determine fields of the struct.
  68. this + 0xEB8 => this + 0xEB8 + 0x300
  69. this + 0x2BE8 => this + 0x2BE8 + 0x300
  70. */
  71. _ => address,
  72. };
  73. }
  74. else
  75. {
  76. resolvedAddress = address;
  77. }
  78. return ResultCode.Success;
  79. }
  80. public ResultCode ResolveEx(ServiceCtx context, out ResultCode resultCode, out string resolvedAddress)
  81. {
  82. ulong inputPosition = context.Request.SendBuff[0].Position;
  83. ulong inputSize = context.Request.SendBuff[0].Size;
  84. byte[] addressBuffer = new byte[inputSize];
  85. context.Memory.Read(inputPosition, addressBuffer);
  86. string address = Encoding.UTF8.GetString(addressBuffer).TrimEnd('\0');
  87. resultCode = Resolve(context, address, out resolvedAddress);
  88. if (resultCode != ResultCode.Success)
  89. {
  90. resolvedAddress = _dummyAddress;
  91. }
  92. if (_nsdSettings.TestMode)
  93. {
  94. return ResultCode.Success;
  95. }
  96. else
  97. {
  98. return resultCode;
  99. }
  100. }
  101. }
  102. }