133 lines
5.4 KiB
JavaScript
Executable File
133 lines
5.4 KiB
JavaScript
Executable File
const mongoose = require('mongoose');
|
|
const fsp = require("fs/promises");
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const service = require('../config/services');
|
|
const CryptoJS = require("crypto-js");
|
|
const log = require('../middlewares/log');
|
|
var speakeasy = require("speakeasy");
|
|
|
|
|
|
|
|
var usuarioController = {};
|
|
|
|
usuarioController.registrar = async function (req, res) {
|
|
let nombre = req.body.usuario; let token = "";
|
|
|
|
if(fs.existsSync(path.join(__dirname, '../UsuariosRegistrados/' + nombre))){
|
|
log.errorMensaje(req,"Ya existe el usuario");
|
|
return res.status(200).send({result:null,error:"Ya existe el usuario"});
|
|
}
|
|
try{
|
|
//creacion carpeta archivos compartidos
|
|
fs.mkdir(path.join(__dirname, '../ArchivosCompartidos/Usuarios/' + nombre),
|
|
{ recursive: true }, async (err) => {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
log.serverActionInfo(req,"Carpeta Archivos Compartidos del usuario creada");
|
|
});
|
|
//creación carpeta usuario y sus archivos
|
|
fs.mkdir(path.join(__dirname, '../UsuariosRegistrados/' + nombre),
|
|
{ recursive: true }, async (err) => {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
console.log('Carpeta usuario creada!');
|
|
const hashPassword = CryptoJS.SHA512(req.body.contraseña).toString();
|
|
await fsp.writeFile('UsuariosRegistrados/' + nombre + '/datos.json.enc', req.body.fichero);
|
|
await fsp.writeFile('UsuariosRegistrados/' + nombre + '/contraseña.enc', hashPassword);
|
|
await fsp.writeFile('UsuariosRegistrados/' + nombre + '/clavePublica.enc', req.body.clavePublica);
|
|
await fsp.writeFile('UsuariosRegistrados/' + nombre + '/clavePrivada.enc', req.body.clavePrivada);
|
|
let newId = new mongoose.mongo.ObjectId();
|
|
let user = nombre + '-' + newId.toString();
|
|
token = service.createToken(user);
|
|
log.serverActionInfo(req,"Carpeta del usuario y sus archivos creados");
|
|
res.status(200).send({result:{status:'Usuario creado correctamente',token: token},error:null});
|
|
});
|
|
|
|
}catch (err){
|
|
console.log(err);
|
|
log.errorMensaje(req,"Error al crear usuario");
|
|
res.status(200).send({result:null,error:"Error al crear usuario"});
|
|
}
|
|
};
|
|
|
|
|
|
usuarioController.iniciarSesion = async function (req, res) {
|
|
let nombre = req.body.usuario;
|
|
let newId = new mongoose.mongo.ObjectId();
|
|
let user = nombre + '-' + newId.toString();
|
|
if (!fs.existsSync(path.join(__dirname, '../UsuariosRegistrados/' + nombre))){
|
|
log.errorMensaje(req,"No existe el usuario");
|
|
return res.status(200).send({result:null,error:"No existe el usuario"}); //400
|
|
}
|
|
let contraseña = fs.readFileSync('UsuariosRegistrados/' + nombre + '/contraseña.enc', 'utf-8');
|
|
const hashPassword = CryptoJS.SHA512(req.body.contraseña).toString();
|
|
if(contraseña !== hashPassword){
|
|
log.errorMensaje(req,"Contraseña incorrecta");
|
|
return res.status(200).send({result:null,error:"Error Contraseña"});
|
|
}
|
|
//let datos = fs.readFileSync('UsuariosRegistrados/' + nombre + '/datos.json.enc', 'utf-8');
|
|
|
|
//Check TOTP
|
|
if(fs.existsSync(path.join(__dirname, '../UsuariosRegistrados/' + nombre + '/secreto.enc'))){
|
|
token = service.createToken(user,1);
|
|
return res.status(200).send({result:{status:'ok', token: token, TFA: 1},error:null});
|
|
}
|
|
else{
|
|
token = service.createToken(user,0);
|
|
return res.status(200).send({result:{status:'ok', token: token, TFA: 0},error:null});
|
|
}
|
|
|
|
};
|
|
|
|
usuarioController.iniciarSesionFA = async function (req, res) {
|
|
let user = req.usuario;
|
|
token = service.createToken(user,0);
|
|
log.serverActionInfo(req,"Inicia sesión");
|
|
let dataTFA;
|
|
if(fs.existsSync(path.join(__dirname, '../UsuariosRegistrados/' + user + '/secreto.enc'))){
|
|
dataTFA = fs.readFileSync(
|
|
"UsuariosRegistrados/" + user + "/secreto.enc",
|
|
"utf-8"
|
|
);
|
|
var verified = speakeasy.totp.verify({ secret: dataTFA,
|
|
token: req.body.tokSecret });
|
|
if(verified){
|
|
let urlQR = speakeasy.otpauthURL({ secret: dataTFA, label: 'ES' });
|
|
return res.status(200).send({result:{status:'ok', token: token, TFA: 1, urlQR: urlQR},error:null});
|
|
}
|
|
else{
|
|
return res.status(200).send({result:null,error:"Prueba otra vez"});
|
|
}
|
|
|
|
}
|
|
else{
|
|
return res.status(200).send({result:null,error:"Error doble factor no activo"});
|
|
}
|
|
}
|
|
|
|
usuarioController.activar2FA = async function (req, res) {
|
|
let nombre = req.usuario;
|
|
if (fs.existsSync(path.join(__dirname, '../UsuariosRegistrados/' + nombre + '/secreto.enc'))){
|
|
log.errorMensaje(req,"Ya esta activado el doble factor");
|
|
return res.status(200).send({result:null,error:"Ya existe el doble factor para esta cuenta"}); //400
|
|
}
|
|
|
|
//const hashsecreto = CryptoJS.SHA512(req.body.secreto).toString();
|
|
await fsp.writeFile('UsuariosRegistrados/' + nombre + '/secreto.enc', req.body.secreto);
|
|
let dataTFA = fs.readFileSync(
|
|
"UsuariosRegistrados/" + nombre + "/secreto.enc",
|
|
"utf-8"
|
|
);
|
|
let urlQR = speakeasy.otpauthURL({ secret: dataTFA, label: 'ES' });
|
|
return res.status(200).send({result:{status:'Activación completa', TFA: 1, urlQR: urlQR},error:null});
|
|
};
|
|
|
|
|
|
/*
|
|
* Other actions
|
|
*/
|
|
|
|
module.exports = usuarioController; |