NNID service tokens now check client_id for generation

This commit is contained in:
Jonathan Barrow 2023-06-14 12:58:09 -04:00
parent 08e0d9c436
commit 976c1bf21f
No known key found for this signature in database
GPG Key ID: E86E9FE9049C741F
4 changed files with 33 additions and 7 deletions

View File

@ -208,20 +208,28 @@ export async function getPNIDProfileJSONByPID(pid: number): Promise<PNIDProfile
};
}
export async function getServerByGameServerId(gameServerId: string, accessMode: string): Promise<HydratedServerDocument | null> {
export async function getServerByGameServerID(gameServerID: string, accessMode: string): Promise<HydratedServerDocument | null> {
return await Server.findOne({
game_server_id: gameServerId,
game_server_id: gameServerID,
access_mode: accessMode
});
}
export async function getServerByTitleId(titleId: string, accessMode: string): Promise<HydratedServerDocument | null> {
export async function getServerByTitleID(titleID: string, accessMode: string): Promise<HydratedServerDocument | null> {
return await Server.findOne({
title_ids: titleId,
title_ids: titleID,
access_mode: accessMode
});
}
export async function getServerByClientID(clientID: string, accessMode: string): Promise<HydratedServerDocument | null> {
return await Server.findOne({
client_id: clientID,
access_mode: accessMode
});
}
export async function addPNIDConnection(pnid: HydratedPNIDDocument, data: ConnectionData, type: string): Promise<ConnectionResponse | undefined> {
if (type === 'discord') {
return await addPNIDConnectionDiscord(pnid, data);

View File

@ -3,6 +3,7 @@ import uniqueValidator from 'mongoose-unique-validator';
import { IServer, IServerMethods, ServerModel } from '@/types/mongoose/server';
const ServerSchema = new Schema<IServer, ServerModel, IServerMethods>({
client_id: String,
ip: String,
port: Number,
service_name: String,

View File

@ -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({

View File

@ -1,6 +1,7 @@
import { Model, HydratedDocument } from 'mongoose';
export interface IServer {
client_id: string;
ip: string;
port: number;
service_name: string;