diff --git a/src/models/nex-account.ts b/src/models/nex-account.ts index abfa407..cddd72b 100644 --- a/src/models/nex-account.ts +++ b/src/models/nex-account.ts @@ -43,7 +43,7 @@ NEXAccountSchema.method('generatePID', async function generatePID(): Promise { - // TODO - strict mode yells here - fileName = RE_FILE_NAME.exec(header['content-disposition'][0])[1]; + const contentDisposition = header['content-disposition' as keyof object]; + const regexResult = RE_FILE_NAME.exec(contentDisposition); + + if (regexResult) { + fileName = regexResult[0]; + } }); part.on('data', (data: Buffer | string) => { diff --git a/src/services/nnid/routes/admin.ts b/src/services/nnid/routes/admin.ts index c5f44d6..6a4437c 100644 --- a/src/services/nnid/routes/admin.ts +++ b/src/services/nnid/routes/admin.ts @@ -39,10 +39,10 @@ router.get('/mapped_ids', async (request: express.Request, response: express.Res queryOutput = 'pid'; } - // This is slower than PNID.where() - // but it ensures that each input - // ALWAYS has an output and filters - // out unwanted input/output types + // * This is slower than PNID.where() + // * but it ensures that each input + // * ALWAYS has an output and filters + // * out unwanted input/output types const results: { in_id: string; out_id: string; @@ -64,8 +64,19 @@ router.get('/mapped_ids', async (request: express.Request, response: express.Res pid?: number; } = {}; - // TODO - TS strict mode...what? - query[queryInput] = input; + if (queryInput === 'usernameLower') { + query.usernameLower = input; + } + + if (queryInput === 'pid') { + query.pid = Number(input); + + if (isNaN(query.pid)) { + // * Bail early + results.push(result); + continue; + } + } const searchResult: HydratedPNIDDocument | null = await PNID.findOne(query); diff --git a/src/services/nnid/routes/content.ts b/src/services/nnid/routes/content.ts index 5d45aa6..56dc2f5 100644 --- a/src/services/nnid/routes/content.ts +++ b/src/services/nnid/routes/content.ts @@ -154,7 +154,7 @@ router.get('/time_zones/:countryCode/:language', (request: express.Request, resp const countryCode: string = request.params.countryCode; const language: string = request.params.language; - const regionLanguages: RegionLanguages = timezones[countryCode]; + const regionLanguages: RegionLanguages = timezones[countryCode as keyof typeof timezones]; const regionTimezones: RegionTimezones = regionLanguages[language] ? regionLanguages[language] : Object.values(regionLanguages)[0]; response.send(xmlbuilder.create({ diff --git a/src/services/nnid/routes/people.ts b/src/services/nnid/routes/people.ts index 239c9a0..3258375 100644 --- a/src/services/nnid/routes/people.ts +++ b/src/services/nnid/routes/people.ts @@ -56,7 +56,7 @@ router.get('/:username', async (request: express.Request, response: express.Resp * Description: Registers a new NNID */ router.post('/', ratelimit, deviceCertificateMiddleware, async (request: express.Request, response: express.Response) => { - if (!request.certificate.valid) { + if (!request.certificate || !request.certificate.valid) { // TODO: Change this to a different error response.status(400); @@ -118,9 +118,20 @@ router.post('/', ratelimit, deviceCertificateMiddleware, async (request: express const language: string = person.get('language'); const timezoneName: string = person.get('tz_name'); - const regionLanguages: RegionLanguages = timezones[countryCode]; + const regionLanguages: RegionLanguages = timezones[countryCode as keyof typeof timezones]; const regionTimezones: RegionTimezones = regionLanguages[language] ? regionLanguages[language] : Object.values(regionLanguages)[0]; - const timezone: RegionTimezone = regionTimezones.find(tz => tz.area === timezoneName); + let timezone: RegionTimezone | undefined = regionTimezones.find(tz => tz.area === timezoneName); + + if (!timezone) { + // TODO - Change this, handle the error + timezone = { + area: 'America/New_York', + language: 'en', + name: 'Eastern Time (US & Canada)', + order: '11', + utc_offset: '-14400' + }; + } pnid = new PNID({ pid: nexAccount.get('pid'), @@ -475,9 +486,20 @@ router.put('/@me', async (request: express.Request, response: express.Response) const marketingFlag: boolean = person.get('marketing_flag') ? person.get('marketing_flag') === 'Y' : pnid.get('flags.marketing'); const offDeviceFlag: boolean = person.get('off_device_flag') ? person.get('off_device_flag') === 'Y' : pnid.get('flags.off_device'); - const regionLanguages: RegionLanguages = timezones[countryCode]; + const regionLanguages: RegionLanguages = timezones[countryCode as keyof typeof timezones]; const regionTimezones: RegionTimezones = regionLanguages[language] ? regionLanguages[language] : Object.values(regionLanguages)[0]; - const timezone: RegionTimezone = regionTimezones.find(tz => tz.area === timezoneName); + let timezone: RegionTimezone | undefined = regionTimezones.find(tz => tz.area === timezoneName); + + if (!timezone) { + // TODO - Change this, handle the error + timezone = { + area: 'America/New_York', + language: 'en', + name: 'Eastern Time (US & Canada)', + order: '11', + utc_offset: '-14400' + }; + } if (person.get('password')) { const primaryPasswordHash: string = nintendoPasswordHash(person.get('password'), pnid.get('pid')); diff --git a/src/types/mii-js.d.ts b/src/types/mii-js.d.ts index 9421b0f..a63a5b8 100644 --- a/src/types/mii-js.d.ts +++ b/src/types/mii-js.d.ts @@ -94,5 +94,6 @@ type Mii = { creatorName: string; checksum: number; - studioUrl: (options: MiiStudioURLOptions) => string + studioUrl: (options: MiiStudioURLOptions) => string; + encode: () => Buffer; }; \ No newline at end of file