diff --git a/account.nintendo.net/helpers.js b/account.nintendo.net/helpers.js index d2d71f4..d7dcc01 100644 --- a/account.nintendo.net/helpers.js +++ b/account.nintendo.net/helpers.js @@ -1,7 +1,8 @@ let constants = require('./constants'), database = require('./db'), pythonStruct = require('python-struct'), - bcrypt = require('bcryptjs') + bcrypt = require('bcryptjs'), + randtoken = require('rand-token'), crypto = require('crypto'); async function generatePID() { @@ -29,6 +30,34 @@ function generateRandID(length = 10) { return id; } +async function generateEmailToken() { + let token = randtoken.generate(32); + + let user = await database.user_collection.findOne({ + 'sensitive.email_confirms.token': token + }); + + if (user) { + return await generateEmailToken(); + } + + return token; +} + +async function generateEmailCode() { + let code = generateRandID(6); + + let user = await database.user_collection.findOne({ + 'sensitive.email_confirms.code': code + }); + + if (user) { + return await generateEmailCode(); + } + + return code; +} + function generateNintendoHashedPWrd(password, pid) { let buff1 = pythonStruct.pack(' { + let _GET = request.query; + + if (!_GET.token) { + return response.send('ERROR: Invalid token'); + } + + let user = await database.user_collection.findOne({ + 'sensitive.email_confirms.token': _GET.token + }); + + if (!user) { + return response.send('ERROR: Invalid token'); + } + + user.email.reachable = 'Y'; + user.email.validated = 'Y'; + + await database.user_collection.update({ + pid: user.pid + }, { + $set: { + email: user.email + } + }); + + user.sensitive.email_confirms.token = null; + user.sensitive.email_confirms.code = null; + + await database.user_collection.update({ + pid: user.pid + }, { + $set: { + sensitive: user.sensitive + } + }); + + response.send(``` + It has been confirmed that you can receive e-mails from Pretenod.
+ The confirmation process is now complete. + ```); +}); + +module.exports = routes; \ No newline at end of file diff --git a/account.nintendo.net/routes/people/index.js b/account.nintendo.net/routes/people/index.js index b8bd423..83bc808 100644 --- a/account.nintendo.net/routes/people/index.js +++ b/account.nintendo.net/routes/people/index.js @@ -4,7 +4,6 @@ let routes = require('express').Router(), database = require('../../db'), mailer = require('../../mailer'), RateLimit = require('express-rate-limit'), - randtoken = require('rand-token'), json2xml = require('json2xml'), bcrypt = require('bcryptjs'), moment = require('moment'), @@ -87,8 +86,8 @@ routes.post('/', new RateLimit({ password = bcrypt.hashSync(helpers.generateNintendoHashedPWrd(user_data.password, pid), 10), create_date = moment().format('YYYY-MM-DDTHH:MM:SS'), mii_hash = new puid(true).generate(), - email_code = helpers.generateRandID(6), - email_token = randtoken.generate(32); + email_code = await helpers.generateEmailCode(), + email_token = await helpers.generateEmailToken(); let document = { accounts: [ // WTF even is this?? @@ -162,7 +161,7 @@ routes.post('/', new RateLimit({ token: '' }, }, - email_confims: { + email_confirms: { token: email_token, code: email_code, }, @@ -185,19 +184,19 @@ routes.post('/', new RateLimit({ await database.user_collection.insert(document); - /*mailer.send( + mailer.send( user_data.email, '[Prentendo Network] Please confirm your e-mail address', `Hello, Your Prentendo Network ID activation is almost complete. Please click the link below to confirm your e-mail address and complete the activation process. - id.prentendo.cc/account/email-confirmation?token=` + email_token + ` + http://account.prentendo.cc/account/email-confirmation?token=` + email_token + ` If you are unable to connect to the above URL, please enter the following confirmation code on the device to which your Prentendo Network ID is linked. - <>` - )*/ + <<Confirmation code: ` + email_code + `>>` + ) response.send(json2xml({ person: { diff --git a/account.nintendo.net/routes/support/index.js b/account.nintendo.net/routes/support/index.js index f73ea8d..9198659 100644 --- a/account.nintendo.net/routes/support/index.js +++ b/account.nintendo.net/routes/support/index.js @@ -102,35 +102,60 @@ routes.put('/email_confirmation/:pid/:code', async (request, response) => { response.set('Server', 'Nintendo 3DS (http)'); response.set('X-Nintendo-Date', new Date().getTime()); - let user = await helpers.getUser(request.params.pid); + let user = await database.user_collection.findOne({ + pid: Number(request.params.pid) + }); if (!user) { let error = { errors: { error: { - cause: 'no user found', - code: '9999', - message: 'Bad pid received; pid: ' + request.params.pid + code: '0130', + message: 'PID has not been registered yet' } } } return response.send(json2xml(error)); } - if(user.sensitive.email_confims.code == request.params.code){ - database.user_collection.update(user._id, {$set:{'address[0].validated':'Y'}}); - }else{ - let error = { + if (user.sensitive.email_confirms.code !== request.params.code) { + let error = { errors: { error: { - cause: 'Bad code', - code: '9999', - message: 'Bad code received; code: ' + request.params.code + code: '0116', + message: 'Missing or invalid verification code' } } } + return response.send(json2xml(error)); } + + user.email.reachable = 'Y'; + user.email.validated = 'Y'; + + await database.user_collection.update({ + pid: user.pid + }, { + $set: { + email: user.email + } + }); + + user.sensitive.email_confirms.token = null; + user.sensitive.email_confirms.code = null; + + await database.user_collection.update({ + pid: user.pid + }, { + $set: { + sensitive: user.sensitive + } + }); + + response.send(json2xml({ + email: null + })); });