From e9dfb46d60b9970c5d44b6f481b0090521907d32 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sat, 29 Jun 2024 16:30:58 -0400 Subject: [PATCH 1/3] support: implement send_confirmation/pin/:email --- src/services/nnas/routes/support.ts | 31 ++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/services/nnas/routes/support.ts b/src/services/nnas/routes/support.ts index 46522a8..ec677a8 100644 --- a/src/services/nnas/routes/support.ts +++ b/src/services/nnas/routes/support.ts @@ -2,7 +2,7 @@ import dns from 'node:dns'; import express from 'express'; import xmlbuilder from 'xmlbuilder'; import moment from 'moment'; -import { getPNIDByPID } from '@/database'; +import { getPNIDByEmailAddress, getPNIDByPID } from '@/database'; import { sendEmailConfirmedEmail, sendConfirmationEmail, sendForgotPasswordEmail } from '@/util'; const router = express.Router(); @@ -125,6 +125,35 @@ router.get('/resend_confirmation', async (request: express.Request, response: ex response.status(200).send(''); }); +/** + * [GET] + * Replacement for: https://account.nintendo.net/v1/api/support/send_confirmation/pin/:email + * Description: Sends a users confirmation email + */ +router.get('/send_confirmation/pin/:email', async (request: express.Request, response: express.Response): Promise => { + const email = String(request.params.email) + + const pnid = await getPNIDByEmailAddress(email); + + if (!pnid) { + // TODO - Unsure if this is the right error + response.status(400).send(xmlbuilder.create({ + errors: { + error: { + code: '0130', + message: 'PID has not been registered yet' + } + } + }).end()); + + return; + } + + await sendConfirmationEmail(pnid); + + response.status(200).send(''); +}); + /** * [GET] * Replacement for: https://account.nintendo.net/v1/api/support/forgotten_password/PID From 0876e088c4bf32ecb73d53b94adeeba9a3efdee8 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sat, 29 Jun 2024 19:09:56 -0400 Subject: [PATCH 2/3] remove redundant String cast and add missing semicolon --- src/services/nnas/routes/support.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/nnas/routes/support.ts b/src/services/nnas/routes/support.ts index ec677a8..29454cf 100644 --- a/src/services/nnas/routes/support.ts +++ b/src/services/nnas/routes/support.ts @@ -131,7 +131,7 @@ router.get('/resend_confirmation', async (request: express.Request, response: ex * Description: Sends a users confirmation email */ router.get('/send_confirmation/pin/:email', async (request: express.Request, response: express.Response): Promise => { - const email = String(request.params.email) + const email = request.params.email; const pnid = await getPNIDByEmailAddress(email); @@ -185,4 +185,4 @@ router.get('/forgotten_password/:pid', async (request: express.Request, response response.status(200).send(''); }); -export default router; \ No newline at end of file +export default router; From 4058d427e0e7402a1e8f071188f668d9ed06c9c9 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Tue, 2 Jul 2024 15:10:42 -0400 Subject: [PATCH 3/3] Send a proper email when parental controls are confirmed --- src/services/nnas/routes/support.ts | 6 +++--- src/util.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/services/nnas/routes/support.ts b/src/services/nnas/routes/support.ts index 29454cf..6b4a3cc 100644 --- a/src/services/nnas/routes/support.ts +++ b/src/services/nnas/routes/support.ts @@ -3,7 +3,7 @@ import express from 'express'; import xmlbuilder from 'xmlbuilder'; import moment from 'moment'; import { getPNIDByEmailAddress, getPNIDByPID } from '@/database'; -import { sendEmailConfirmedEmail, sendConfirmationEmail, sendForgotPasswordEmail } from '@/util'; +import { sendEmailConfirmedEmail, sendConfirmationEmail, sendForgotPasswordEmail, sendEmailConfirmedParentalControlsEmail } from '@/util'; const router = express.Router(); @@ -128,7 +128,7 @@ router.get('/resend_confirmation', async (request: express.Request, response: ex /** * [GET] * Replacement for: https://account.nintendo.net/v1/api/support/send_confirmation/pin/:email - * Description: Sends a users confirmation email + * Description: Sends a users confirmation email that their email has been registered for parental controls */ router.get('/send_confirmation/pin/:email', async (request: express.Request, response: express.Response): Promise => { const email = request.params.email; @@ -149,7 +149,7 @@ router.get('/send_confirmation/pin/:email', async (request: express.Request, res return; } - await sendConfirmationEmail(pnid); + await sendEmailConfirmedParentalControlsEmail(pnid); response.status(200).send(''); }); diff --git a/src/util.ts b/src/util.ts index b59aa15..b7a4040 100644 --- a/src/util.ts +++ b/src/util.ts @@ -219,6 +219,18 @@ export async function sendEmailConfirmedEmail(pnid: mongoose.HydratedDocument): Promise { + const options = { + to: pnid.email.address, + subject: '[Pretendo Network] Email address confirmed for Parental Controls', + username: pnid.username, + paragraph: 'your email address has been confirmed for use with Parental Controls.', + text: `Dear ${pnid.username}, \r\n\r\nYour email address has been confirmed for use with Parental Controls.` + }; + + await sendMail(options); +} + export async function sendForgotPasswordEmail(pnid: mongoose.HydratedDocument): Promise { const tokenOptions = { system_type: 0xF, // * API