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;