Changes to email verification

This commit is contained in:
RedDucks 2018-02-22 01:51:49 -05:00
commit 4796def5d2
5 changed files with 136 additions and 28 deletions

View file

@ -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('<I', pid);
let buff2 = Buffer.from(password).toString('ascii');
@ -219,5 +248,7 @@ module.exports = {
generateRefreshToken: generateRefreshToken,
getUser: getUser,
getUserBasic: getUserBasic,
mapUser: mapUser
mapUser: mapUser,
generateEmailToken: generateEmailToken,
generateEmailCode: generateEmailCode,
}

View file

@ -1,12 +1,13 @@
let nodemailer = require('nodemailer');
let nodemailer = require('nodemailer'),
config = JSON.parse(require('fs').readFileSync('./config.json').toString());
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'removed',
pass: 'removed'
}
});
service: 'gmail',
auth: {
user: config.email.address,
pass: config.email.password
}
});
function send(email, subject = 'No email subject provided', message = 'No email body provided') {
let options = {

View file

@ -0,0 +1,52 @@
let routes = require('express').Router(),
database = require('../../db');
/**
* [GET]
* Replacement for: https://id.nintendo.net/account/email-confirmation
* Description: Verifies a user email via token
*/
routes.get('/email-confirmation', async (request, response) => {
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.<br>
The confirmation process is now complete.
```);
});
module.exports = routes;

View file

@ -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 + `>>`
)*/
&lt;&lt;Confirmation code: ` + email_code + `&gt;&gt;`
)
response.send(json2xml({
person: {

View file

@ -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
}));
});