/ src / Ryujinx.HLE / HOS / Services / Sockets / Nsd / Manager / FqdnResolver.cs
FqdnResolver.cs
 1  using System.Text;
 2  
 3  namespace Ryujinx.HLE.HOS.Services.Sockets.Nsd.Manager
 4  {
 5      class FqdnResolver
 6      {
 7          private const string DummyAddress = "unknown.dummy.nintendo.net";
 8  
 9          public ResultCode GetEnvironmentIdentifier(out string identifier)
10          {
11              if (IManager.NsdSettings.TestMode)
12              {
13                  identifier = "err";
14  
15                  return ResultCode.InvalidSettingsValue;
16              }
17              else
18              {
19                  identifier = IManager.NsdSettings.Environment;
20              }
21  
22              return ResultCode.Success;
23          }
24  
25          public static ResultCode Resolve(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("%", IManager.NsdSettings.Environment);
38  
39                  resolvedAddress = "";
40  
41                  if (IManager.NsdSettings == null)
42                  {
43                      return ResultCode.SettingsNotInitialized;
44                  }
45  
46                  if (!IManager.NsdSettings.Initialized)
47                  {
48                      return ResultCode.SettingsNotLoaded;
49                  }
50  
51                  resolvedAddress = address switch
52                  {
53  #pragma warning disable IDE0055 // Disable formatting
54                      "e97b8a9d672e4ce4845ec6947cd66ef6-sb-api.accounts.nintendo.com" => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // dp1 environment
55                      "api.accounts.nintendo.com"                                     => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com",    // dp1 environment
56                      "e97b8a9d672e4ce4845ec6947cd66ef6-sb.accounts.nintendo.com"     => "e97b8a9d672e4ce4845ec6947cd66ef6-sb.baas.nintendo.com", // lp1 environment
57                      "accounts.nintendo.com"                                         => "e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com",    // lp1 environment
58                      /*
59                          // TODO: Determine fields of the struct.
60                          this + 0xEB8  => this + 0xEB8 + 0x300
61                          this + 0x2BE8 => this + 0x2BE8 + 0x300
62                      */
63                      _ => address,
64  #pragma warning restore IDE0055
65                  };
66              }
67  
68              return ResultCode.Success;
69          }
70  
71          public ResultCode ResolveEx(ServiceCtx context, out ResultCode resultCode, out string resolvedAddress)
72          {
73              ulong inputPosition = context.Request.SendBuff[0].Position;
74              ulong inputSize = context.Request.SendBuff[0].Size;
75  
76              byte[] addressBuffer = new byte[inputSize];
77  
78              context.Memory.Read(inputPosition, addressBuffer);
79  
80              string address = Encoding.UTF8.GetString(addressBuffer).TrimEnd('\0');
81  
82              resultCode = Resolve(address, out resolvedAddress);
83  
84              if (resultCode != ResultCode.Success)
85              {
86                  resolvedAddress = DummyAddress;
87              }
88  
89              if (IManager.NsdSettings.TestMode)
90              {
91                  return ResultCode.Success;
92              }
93              else
94              {
95                  return resultCode;
96              }
97          }
98      }
99  }