api-secure-databank/controllers/UsuarioController.js

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;