diff --git a/src/database.ts b/src/database.ts index 84d6024..a301b92 100644 --- a/src/database.ts +++ b/src/database.ts @@ -208,20 +208,28 @@ export async function getPNIDProfileJSONByPID(pid: number): Promise { +export async function getServerByGameServerID(gameServerID: string, accessMode: string): Promise { return await Server.findOne({ - game_server_id: gameServerId, + game_server_id: gameServerID, access_mode: accessMode }); } -export async function getServerByTitleId(titleId: string, accessMode: string): Promise { +export async function getServerByTitleID(titleID: string, accessMode: string): Promise { return await Server.findOne({ - title_ids: titleId, + title_ids: titleID, access_mode: accessMode }); } +export async function getServerByClientID(clientID: string, accessMode: string): Promise { + return await Server.findOne({ + client_id: clientID, + access_mode: accessMode + }); +} + + export async function addPNIDConnection(pnid: HydratedPNIDDocument, data: ConnectionData, type: string): Promise { if (type === 'discord') { return await addPNIDConnectionDiscord(pnid, data); diff --git a/src/models/server.ts b/src/models/server.ts index c953323..afdd9af 100644 --- a/src/models/server.ts +++ b/src/models/server.ts @@ -3,6 +3,7 @@ import uniqueValidator from 'mongoose-unique-validator'; import { IServer, IServerMethods, ServerModel } from '@/types/mongoose/server'; const ServerSchema = new Schema({ + client_id: String, ip: String, port: Number, service_name: String, diff --git a/src/services/nnid/routes/provider.ts b/src/services/nnid/routes/provider.ts index 6756221..6b7f69f 100644 --- a/src/services/nnid/routes/provider.ts +++ b/src/services/nnid/routes/provider.ts @@ -1,6 +1,6 @@ import express from 'express'; import xmlbuilder from 'xmlbuilder'; -import { getServerByTitleId, getServerByGameServerId } from '@/database'; +import { getServerByClientID, getServerByGameServerID } from '@/database'; import { generateToken, getValueFromHeaders, getValueFromQueryString } from '@/util'; import { NEXAccount } from '@/models/nex-account'; import { TokenOptions } from '@/types/common/token-options'; @@ -32,6 +32,22 @@ router.get('/service_token/@me', async (request: express.Request, response: expr return; } + const clientID: string | undefined = getValueFromQueryString(request.query, 'client_id'); + + if (!clientID) { + // TODO - Research this error more + response.send(xmlbuilder.create({ + errors: { + error: { + code: '1021', + message: 'The requested game server was not found' + } + } + }).end()); + + return; + } + const titleID: string | undefined = getValueFromHeaders(request.headers, 'x-nintendo-title-id'); if (!titleID) { @@ -49,7 +65,7 @@ router.get('/service_token/@me', async (request: express.Request, response: expr } const serverAccessLevel: string = pnid.server_access_level; - const server: HydratedServerDocument | null = await getServerByTitleId(titleID, serverAccessLevel); + const server: HydratedServerDocument | null = await getServerByClientID(clientID, serverAccessLevel); if (!server || !server.aes_key) { response.send(xmlbuilder.create({ @@ -156,7 +172,7 @@ router.get('/nex_token/@me', async (request: express.Request, response: express. } const serverAccessLevel: string = pnid.server_access_level; - const server: HydratedServerDocument | null = await getServerByGameServerId(gameServerID, serverAccessLevel); + const server: HydratedServerDocument | null = await getServerByGameServerID(gameServerID, serverAccessLevel); if (!server || !server.aes_key) { response.send(xmlbuilder.create({ diff --git a/src/types/mongoose/server.ts b/src/types/mongoose/server.ts index 02fc372..a7c8f6e 100644 --- a/src/types/mongoose/server.ts +++ b/src/types/mongoose/server.ts @@ -1,6 +1,7 @@ import { Model, HydratedDocument } from 'mongoose'; export interface IServer { + client_id: string; ip: string; port: number; service_name: string;