Files added to repository
This commit is contained in:
commit
bf9b20499b
1
ArchivosCompartidos/id.txt
Executable file
1
ArchivosCompartidos/id.txt
Executable file
@ -0,0 +1 @@
|
|||||||
|
0
|
24
README.md
Executable file
24
README.md
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
## Versions
|
||||||
|
|
||||||
|
* Node 14.15.4
|
||||||
|
* npm 6.14.10
|
||||||
|
|
||||||
|
## Deploy in developer mode
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone http://git.wacanal.cloud/ernie/api-secure-databank.git
|
||||||
|
cd api-secure-databank
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm start
|
||||||
|
```
|
21
cert/cert.pem
Executable file
21
cert/cert.pem
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDizCCAnMCFGFRXtJkI+531C6b760kiL1eW2mIMA0GCSqGSIb3DQEBCwUAMIGB
|
||||||
|
MQswCQYDVQQGEwJFUzERMA8GA1UECAwIQWxpY2FudGUxETAPBgNVBAcMCEFsaWNh
|
||||||
|
bnRlMQswCQYDVQQKDAJVQTELMAkGA1UECwwCVUExETAPBgNVBAMMCEdydXBvNEVT
|
||||||
|
MR8wHQYJKoZIhvcNAQkBFhBhanByM0BhbHUudWEbWzJ+MB4XDTIxMDQxNzEzNTIx
|
||||||
|
NFoXDTQ4MDkwMTEzNTIxNFowgYExCzAJBgNVBAYTAkVTMREwDwYDVQQIDAhBbGlj
|
||||||
|
YW50ZTERMA8GA1UEBwwIQWxpY2FudGUxCzAJBgNVBAoMAlVBMQswCQYDVQQLDAJV
|
||||||
|
QTERMA8GA1UEAwwIR3J1cG80RVMxHzAdBgkqhkiG9w0BCQEWEGFqcHIzQGFsdS51
|
||||||
|
YRtbMn4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDzJWGtpDhOynpI
|
||||||
|
tdQcO2PjwoRRal2fbRnN3rzxWoxfJCZ+IQIld7pf3dOYKe7SfBJuCrt6AEKvbRmS
|
||||||
|
exSheMPV+G3dz8z+TZZKj60vI5KTTF8f+TKhOXYeUVI42ysiSXWZGsh6LcxN8hds
|
||||||
|
qKqj1qDO4Lb02Jlfbp5JfEumMwUdagvHiiSHyv13J0aYcnZrXk5ZwoFEBYt3ntvE
|
||||||
|
YhY+EyfPLAv+3VyReXKod9Kj+H+elnokz7C/By+69mBRPZPenA9ItjUzUGof65wV
|
||||||
|
zZlMosF7UeLda9vA1yvuZqV5o+Q8fjktT7S7FRSyT3WPpBZpZYVJxGSwYSw6IXR6
|
||||||
|
U79ppob5AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFtrDeezbHusnGQfD+py4nIf
|
||||||
|
9WLDv8+o5ttWiSNtfIJ7nXzmCVMHxWWbknYGgrRqllw16cuJd7AjiwPqMFmgCc4X
|
||||||
|
uUFUDEqcbaCj4DXL1VEwt/3WMxX1vSwb6JWc+6reR+B3uuUPk6PYtTOuMPFG0DDk
|
||||||
|
DF+znAV3mufWofm5AHUVyGqR6znw/xccSJn5FXU05eTVeS5Q6pii+fUuPUhyMlc+
|
||||||
|
AV8gC57YCrEi693z8lNliCVTWn4oG+VeKVfAF2aBiZIZJqAu2QY/1/p6B9JIG43o
|
||||||
|
WlqxV/Sl3x23eI+ASTBc1DS+9Oiv2htgjQlxqOHJBJVhlXGQ8mHK6ajK/P6su1Y=
|
||||||
|
-----END CERTIFICATE-----
|
27
cert/key.pem
Executable file
27
cert/key.pem
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEA8yVhraQ4Tsp6SLXUHDtj48KEUWpdn20Zzd688VqMXyQmfiEC
|
||||||
|
JXe6X93TmCnu0nwSbgq7egBCr20ZknsUoXjD1fht3c/M/k2WSo+tLyOSk0xfH/ky
|
||||||
|
oTl2HlFSONsrIkl1mRrIei3MTfIXbKiqo9agzuC29NiZX26eSXxLpjMFHWoLx4ok
|
||||||
|
h8r9dydGmHJ2a15OWcKBRAWLd57bxGIWPhMnzywL/t1ckXlyqHfSo/h/npZ6JM+w
|
||||||
|
vwcvuvZgUT2T3pwPSLY1M1BqH+ucFc2ZTKLBe1Hi3WvbwNcr7maleaPkPH45LU+0
|
||||||
|
uxUUsk91j6QWaWWFScRksGEsOiF0elO/aaaG+QIDAQABAoIBAFzsDlZkCjjiXLVo
|
||||||
|
9/UKJXSnpBXRRpJlCZWJ6D980WSS1jshtkZHaWy1w+XFMMY0MH7pjxhi/Rk54qn+
|
||||||
|
a7YCByXA2YwJnFgborJAEnmPaLbuWvRHMjg3U5LmlTuxVty1okGu4KsA0bGAMb+O
|
||||||
|
/he7MJ2fd4w/Mu4rwkZnQCn2GaBRZhiGc2hM3Bk5PyRfuV3mAVPwgZtrzrMtqJuo
|
||||||
|
vB2AUJ9ERAADAT8Kwq/UbiYFMIrl0OmlQU04iMlQbG2YU66ErK1xPPyI2xQcYnlm
|
||||||
|
Vy5Q+e8OGhUI1U7foPgROf8nBBztao/ZGV6Wa1TUFpNwsmx5U2cggZU1L0iq0iUa
|
||||||
|
e2AQZ5kCgYEA+mAHjpeTs6ktvL9K3Hfiz0todJOqGXtG0Lnv5DdpsjPhm085+hpj
|
||||||
|
jsr7LBgNw9e5Lcxf+fEdojw646oqk2px4UBWNtLI+421cIHu/L5KL+iieIEEdJef
|
||||||
|
dAb/PZsBS5fAx3db/r3zC1o+7bYXHiO/MlSsw4Uf04qujP7en9HTnJsCgYEA+JvG
|
||||||
|
k+gosDhX2xxRzA8q9hJ7maPPwt287bFIeY0wW4GGOKFWtnufp3Ovp5BmjBqx6+Ii
|
||||||
|
c98A+sgWdUsOKhDaHX5eibG6USUIyDrVrBshjj2VTIYeEpgGuDayrIgiD+JwoH2O
|
||||||
|
DxR1unwmvLf4pCj99jnhwbIbF/yY6zQbcBG0IfsCgYBA2cS7U1mHjIdzPx0V09uk
|
||||||
|
k8SfhWvmo76o67BOLWgsJzIFd1TuCg3Fe5/pQOW311V4nloxtBlX3z/lnjre6hBL
|
||||||
|
Js3t71Ttizv2w0DyqBsxI5GJoulThb5gYDuWamLAgLMHN0xVxD+CrkJkcei0/s9U
|
||||||
|
KwiAsCeZNG+Xx6BERyYHhwKBgQCeSJ/v/7oYKGdXa/pwT5/st+vV8EQRL5hgRaV9
|
||||||
|
LnWBbUAFwkMxQBhwRumpZ/jCbySkqH+DApLfGJGj8Dt+cOhOKu0KAgw8KbYjtcHh
|
||||||
|
KAz/QRpTdHilIgH1O24bBzmYn3VR2V6fH0mth+op8X/vFOJM6KFh74HsjbjW14A4
|
||||||
|
pCzqDQKBgQD0JAgR1+Q+i04Vcsxn3dlmQyDQ8R1YuzzlL06xjKfZDUPHh8f7eqKX
|
||||||
|
tLPl+n0ZTUvuwckIZfPc6NRsGxCqVvcOpkfGcoknE/7+hIfIp0sU3jGX7+ztQMIY
|
||||||
|
Ne28jrw+sKx4TtEnwXReUaVwYBF+k+p8nj4Be7UeAAyy5q5VUULtdg==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
3
config/config.js
Executable file
3
config/config.js
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
module.exports = {
|
||||||
|
TOKEN_SECRET: process.env.TOKEN_SECRET || "Master2023" //Clave para codificar token
|
||||||
|
};
|
13
config/services.js
Executable file
13
config/services.js
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
const jwt = require('jwt-simple');
|
||||||
|
const moment = require('moment');
|
||||||
|
const config = require('./config');
|
||||||
|
|
||||||
|
exports.createToken = function(user, TFA) {
|
||||||
|
var payload = {
|
||||||
|
sub: user,
|
||||||
|
TFA: TFA,
|
||||||
|
iat: moment().unix(),
|
||||||
|
exp: moment().add(5, 'm').unix(), //5 minutillos
|
||||||
|
};
|
||||||
|
return jwt.encode(payload, config.TOKEN_SECRET, 'HS512');
|
||||||
|
};
|
112
controllers/CompartidosController.js
Executable file
112
controllers/CompartidosController.js
Executable file
@ -0,0 +1,112 @@
|
|||||||
|
const mongoose = require('mongoose');
|
||||||
|
const fsp = require("fs/promises");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const service = require('../config/services');
|
||||||
|
const { type } = require('os');
|
||||||
|
const log = require('../middlewares/log');
|
||||||
|
|
||||||
|
|
||||||
|
/*function plantillaUsuarios(usuario, listUsuarios){
|
||||||
|
if(usuario != ""){
|
||||||
|
this.usuario = usuario;
|
||||||
|
}
|
||||||
|
if(listUsuarios != ""){
|
||||||
|
this.listUsuarios = listUsuarios;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
var compartidosController = {};
|
||||||
|
|
||||||
|
compartidosController.listaUsuarios = async function (req, res) {
|
||||||
|
let usuarios = {usuarios: []};
|
||||||
|
fs.readdirSync(path.join(__dirname, '../UsuariosRegistrados/')).forEach(file => {
|
||||||
|
usuarios.usuarios.push(file);
|
||||||
|
});
|
||||||
|
log.serverActionInfo(req,"Listar los usuarios de la aplicación");
|
||||||
|
return res.status(200).send(usuarios);
|
||||||
|
};
|
||||||
|
|
||||||
|
compartidosController.listaCompartidos = async function (req, res) {
|
||||||
|
//let nombre = req.query.usuario;
|
||||||
|
let nombre = req.usuario;
|
||||||
|
let ficheros = {ficheros: []};
|
||||||
|
fs.readdirSync(path.join(__dirname, '../ArchivosCompartidos/Usuarios/' + nombre + '/')).forEach(file => {
|
||||||
|
if(file.split('-')[1].split('.')[0] === nombre){
|
||||||
|
ficheros.ficheros.push(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
log.serverActionInfo(req,"Listar los archivos compartidos");
|
||||||
|
return res.status(200).send(ficheros);
|
||||||
|
};
|
||||||
|
|
||||||
|
compartidosController.listaCompartidosConmigo = async function (req, res) {
|
||||||
|
//let nombre = req.query.usuario;
|
||||||
|
let nombre = req.usuario;
|
||||||
|
let ficheros = {ficheros: []};
|
||||||
|
fs.readdirSync(path.join(__dirname, '../ArchivosCompartidos/Usuarios/' + nombre + '/')).forEach(file => {
|
||||||
|
if(file.split('-')[1].split('.')[0] !== nombre){
|
||||||
|
ficheros.ficheros.push(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
log.serverActionInfo(req,"Listar los archivos compartidos conmigo");
|
||||||
|
return res.status(200).send(ficheros);
|
||||||
|
};
|
||||||
|
|
||||||
|
compartidosController.guardarArchivoCompartido = async function (req, res) {
|
||||||
|
let ficheroCompartido=req.body.ficheroCompartido;
|
||||||
|
let objetoContraseñas=req.body.contraseñas;
|
||||||
|
//let usuario=req.body.usuario;
|
||||||
|
let usuario = req.usuario;
|
||||||
|
|
||||||
|
|
||||||
|
if(!fs.existsSync(path.join(__dirname, '../ArchivosCompartidos/Usuarios/' + usuario))){
|
||||||
|
log.errorMensaje(req,"No existe la carpeta archivos compartidos del usuario");
|
||||||
|
return res.status(200).send({result:null,error:"No existe la carpeta archivos compartidos del usuario"});
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
let id = fs.readFileSync('ArchivosCompartidos/id.txt', 'utf-8');
|
||||||
|
let idNuevo = parseInt(id);
|
||||||
|
idNuevo ++;
|
||||||
|
await fsp.writeFile('ArchivosCompartidos/id.txt', idNuevo.toString());
|
||||||
|
await fsp.writeFile('ArchivosCompartidos/Ficheros/' + id + '-' + usuario + '.enc', ficheroCompartido);
|
||||||
|
|
||||||
|
for (const propiedad in objetoContraseñas) {
|
||||||
|
await fsp.writeFile('ArchivosCompartidos/Usuarios/' + propiedad + '/' + id + '-' + usuario + '.enc', objetoContraseñas[propiedad]);
|
||||||
|
}
|
||||||
|
log.serverActionInfo(req,"Archivo compartido guardado");
|
||||||
|
res.status(200).send({result:{status:'Archivo compartido correctamente'},error:null});
|
||||||
|
}catch (err){
|
||||||
|
console.log(err);
|
||||||
|
log.errorMensaje(req,"Error al compartir archivo");
|
||||||
|
res.status(200).send({result:null,error:"Error al compartir archivo"});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
compartidosController.obtenerPublicas = async function (req, res) {
|
||||||
|
let publicas = {};
|
||||||
|
for(let i = 0; i<req.body.usuarios.length; i++){
|
||||||
|
let publica = fs.readFileSync('UsuariosRegistrados/' + req.body.usuarios[i] + '/clavePublica.enc', 'utf-8');
|
||||||
|
publicas[req.body.usuarios[i]] = publica;
|
||||||
|
}
|
||||||
|
log.serverActionInfo(req,"Listado claves públicas devuelto");
|
||||||
|
res.status(200).send({result:publicas,error:null});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
compartidosController.recuperarFicheroCompartido = async function (req, res) {
|
||||||
|
let fichero = req.query.fichero;
|
||||||
|
let usuario = req.usuario;
|
||||||
|
let privada = fs.readFileSync('UsuariosRegistrados/' + usuario + '/clavePrivada.enc', 'utf-8');
|
||||||
|
let claveRandom = fs.readFileSync('ArchivosCompartidos/Usuarios/' + usuario + '/' + fichero , 'utf-8');
|
||||||
|
let ficheroA = fs.readFileSync('ArchivosCompartidos/Ficheros/' + fichero , 'utf-8');
|
||||||
|
|
||||||
|
log.serverActionInfo(req,"Fichero compartido y claves devueltas");
|
||||||
|
res.status(200).send({privada:privada,claveRandom:claveRandom, fichero: ficheroA });
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* Other actions
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = compartidosController;
|
57
controllers/DatosController.js
Executable file
57
controllers/DatosController.js
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
const mongoose = require("mongoose");
|
||||||
|
const fsp = require("fs/promises");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const service = require("../config/services");
|
||||||
|
const log = require('../middlewares/log');
|
||||||
|
|
||||||
|
|
||||||
|
var datosController = {};
|
||||||
|
|
||||||
|
datosController.recuperarDatos = async function (req, res) {
|
||||||
|
//let nombre = req.query.nombre;
|
||||||
|
let nombre = req.usuario;
|
||||||
|
|
||||||
|
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" });
|
||||||
|
}
|
||||||
|
let datos = fs.readFileSync(
|
||||||
|
"UsuariosRegistrados/" + nombre + "/datos.json.enc",
|
||||||
|
"utf-8"
|
||||||
|
);
|
||||||
|
log.serverActionInfo(req,"Datos devueltos");
|
||||||
|
return res
|
||||||
|
.status(200)
|
||||||
|
.send({ result: { status: "ok", datos: datos }, error: null });
|
||||||
|
};
|
||||||
|
|
||||||
|
datosController.subirDatos = async function (req, res) {
|
||||||
|
//let nombre = req.body.usuario;
|
||||||
|
let nombre = req.usuario;
|
||||||
|
|
||||||
|
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" });
|
||||||
|
}
|
||||||
|
await fsp.writeFile('UsuariosRegistrados/' + nombre + '/datos.json.enc', req.body.fichero);
|
||||||
|
log.serverActionInfo(req,"Datos subidos");
|
||||||
|
return res
|
||||||
|
.status(200)
|
||||||
|
.send({ result: "ok", error: null });
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Other actions
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = datosController;
|
133
controllers/UsuarioController.js
Executable file
133
controllers/UsuarioController.js
Executable file
@ -0,0 +1,133 @@
|
|||||||
|
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;
|
61
index.js
Executable file
61
index.js
Executable file
@ -0,0 +1,61 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
|
||||||
|
const port = process.env.PORT || 4000; //Puerto
|
||||||
|
|
||||||
|
const https = require('https'); ///HTTPS
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const OPTIONS_HTTPS = {
|
||||||
|
key: fs.readFileSync('./cert/key.pem'),
|
||||||
|
cert: fs.readFileSync('./cert/cert.pem')
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const express = require('express');
|
||||||
|
var cors = require('cors'); //Peticiones cruzadas, por si
|
||||||
|
const logger = require('morgan');
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
// protege la aplicación de algunas vulnerabilidades web conocidas mediante el establecimiento correcto de cabeceras HTTP.
|
||||||
|
const helmet = require('helmet');
|
||||||
|
app.use(helmet());
|
||||||
|
|
||||||
|
//Archivos estaticos
|
||||||
|
app.use(express.static('public'));
|
||||||
|
|
||||||
|
//declaracion
|
||||||
|
app.use(logger('dev')); //opciones : tiny, short, dev, common, combined
|
||||||
|
app.use(express.urlencoded({ extended: false })); //body generado desde form o postman
|
||||||
|
app.use(express.json()); // body con objetos json
|
||||||
|
|
||||||
|
|
||||||
|
var usuarios = require('./routes/usuario');
|
||||||
|
app.use('/', usuarios);
|
||||||
|
|
||||||
|
var datos = require('./routes/datos');
|
||||||
|
app.use('/', datos);
|
||||||
|
|
||||||
|
var compartidos = require('./routes/compartidos');
|
||||||
|
app.use('/', compartidos);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
app.get('*', (req, res, next) => {
|
||||||
|
res.writeHead(301,
|
||||||
|
{Location: `https://192.168.10.2:${port}/home.html`}
|
||||||
|
);
|
||||||
|
res.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
//HTTPS
|
||||||
|
https.createServer(OPTIONS_HTTPS, app).listen(port, '0.0.0.0', () => {
|
||||||
|
console.log(`API REST ejecutándose en https://localhost:${port}/`);
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// Iniciamos la aplicación
|
||||||
|
/*app.listen(port, 'localhost', () => {
|
||||||
|
console.log(`API REST ejecutándose en http://localhost:${port}/`);
|
||||||
|
});*/
|
74
middlewares/auth.js
Executable file
74
middlewares/auth.js
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
const jwt = require('jwt-simple');
|
||||||
|
const config = require('../config/config');
|
||||||
|
const moment = require('moment');
|
||||||
|
|
||||||
|
|
||||||
|
exports.Authenticated = function(req, res, next) {
|
||||||
|
if(req.headers.authorization === "") {
|
||||||
|
res.status(401);
|
||||||
|
return res.json({error: "No has iniciado sesión"});
|
||||||
|
}
|
||||||
|
|
||||||
|
let token = req.headers.authorization;
|
||||||
|
|
||||||
|
try{
|
||||||
|
let payload = jwt.decode(token, config.TOKEN_SECRET, 'HS512');
|
||||||
|
if(payload.exp < moment().unix()){
|
||||||
|
return res.json({error: "Sesión Finalizada"});
|
||||||
|
}
|
||||||
|
req.usuario = payload.sub.split('-')[0];
|
||||||
|
req.TFA = payload.TFA;
|
||||||
|
if(payload.TFA){
|
||||||
|
throw new Error("TOken no valid");
|
||||||
|
}
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
catch(error){
|
||||||
|
res.status(401);
|
||||||
|
return res.json({error: "Token no válido"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.AuthenticatedFA = function(req, res, next) {
|
||||||
|
if(req.headers.authorization === "") {
|
||||||
|
res.status(401);
|
||||||
|
return res.json({error: "No has iniciado sesión"});
|
||||||
|
}
|
||||||
|
|
||||||
|
let token = req.headers.authorization;
|
||||||
|
|
||||||
|
try{
|
||||||
|
let payload = jwt.decode(token, config.TOKEN_SECRET, 'HS512');
|
||||||
|
if(payload.exp < moment().unix()){
|
||||||
|
return res.json({error: "Sesión Finalizada"});
|
||||||
|
}
|
||||||
|
if(!payload.TFA){
|
||||||
|
throw new Error("TOken no valid");
|
||||||
|
}
|
||||||
|
req.usuario = payload.sub.split('-')[0];
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
catch(error){
|
||||||
|
res.status(401);
|
||||||
|
return res.json({error: "Token no válido"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*exports.AlreadyToken = function(req, res, next) {
|
||||||
|
if(req.headers.authorization === "") {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
|
||||||
|
let token = req.headers.authorization;
|
||||||
|
|
||||||
|
try{
|
||||||
|
let payload = jwt.decode(token, config.TOKEN_SECRET, 'HS512'); //Nueva version, ahora no suelta una excepcion cuando expira el token...
|
||||||
|
if(payload.exp < moment().unix()){
|
||||||
|
throw Error();
|
||||||
|
}
|
||||||
|
return res.status(204).end();
|
||||||
|
}
|
||||||
|
catch(error){
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}*/
|
52
middlewares/log.js
Executable file
52
middlewares/log.js
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
let winston = require('winston');
|
||||||
|
|
||||||
|
var loggerW = winston.createLogger({
|
||||||
|
level: 'info',
|
||||||
|
format: winston.format.combine(
|
||||||
|
winston.format.timestamp(),
|
||||||
|
winston.format.printf(info => {
|
||||||
|
return `${info.timestamp} ${info.level}: ${info.message}`;
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
return `${error.timestamp} ${error.level}: ${error.message}`;
|
||||||
|
})
|
||||||
|
),
|
||||||
|
transports: [
|
||||||
|
//new winston.transports.Console(),
|
||||||
|
new winston.transports.File({ filename: 'combined.log' })
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
exports.errorMensaje=function (req,er){
|
||||||
|
let usuario = req.usuario;
|
||||||
|
if(req.body.usuario){
|
||||||
|
usuario= req.body.usuario;
|
||||||
|
}
|
||||||
|
let ipUsuario=req.headers['user-agent'] ||null;
|
||||||
|
//console.log(ipUsuario+" ip");
|
||||||
|
let mensaje = "ERROR--"+er+"--ERROR El usuario: |"+usuario +"| solicita "+req.originalUrl+" en el Dispositivo: "+ipUsuario;
|
||||||
|
loggerW.error(mensaje);
|
||||||
|
}
|
||||||
|
exports.serverActionInfo=function (req,serverAction){
|
||||||
|
let usuario = req.usuario;
|
||||||
|
if(req.body.usuario){
|
||||||
|
usuario= req.body.usuario;
|
||||||
|
}
|
||||||
|
let ipUsuario=req.headers['user-agent'] ||null;
|
||||||
|
let mensaje = "ACCION DEL SERVIDOR--"+serverAction+"-- Para el usuario: |"+usuario +"|" +" en el Dispositivo: "+ipUsuario;
|
||||||
|
loggerW.info(mensaje);
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.log = function(req, res, next) {
|
||||||
|
let usuario = req.usuario;
|
||||||
|
if(req.body.usuario){
|
||||||
|
usuario= req.body.usuario;
|
||||||
|
}
|
||||||
|
let ipUsuario=req.headers['user-agent'] ||null;
|
||||||
|
//console.log(ipUsuario+" ip");
|
||||||
|
;
|
||||||
|
let mensaje = "El usuario: |"+usuario +"| solicita "+req.originalUrl+" en el Dispositivo: "+ipUsuario;
|
||||||
|
loggerW.info(mensaje);
|
||||||
|
//loggerW.error(mensaje);
|
||||||
|
next();
|
||||||
|
}
|
33
package.json
Executable file
33
package.json
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "es",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Proyecto practicas ES",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "nodemon index.js",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"node",
|
||||||
|
"express"
|
||||||
|
],
|
||||||
|
"author": "SAE",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"bcrypt": "^5.0.1",
|
||||||
|
"cors": "^2.8.5",
|
||||||
|
"crypto-js": "^4.0.0",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"helmet": "^4.4.1",
|
||||||
|
"jwt-simple": "^0.5.6",
|
||||||
|
"moment": "^2.29.1",
|
||||||
|
"mongoose": "^5.12.3",
|
||||||
|
"morgan": "^1.10.0",
|
||||||
|
"nodejs-base64-encode": "^1.1.0",
|
||||||
|
"speakeasy": "^2.0.0",
|
||||||
|
"winston": "^3.0.0-rc3"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"nodemon": "^2.0.7"
|
||||||
|
}
|
||||||
|
}
|
7
public/home.html
Executable file
7
public/home.html
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>ES</title>
|
||||||
|
</head>
|
||||||
|
<h1>ES</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
19
routes/compartidos.js
Executable file
19
routes/compartidos.js
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
const auth = require('../middlewares/auth');
|
||||||
|
const log = require('../middlewares/log');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var compartidos = require('../controllers/CompartidosController.js');
|
||||||
|
|
||||||
|
|
||||||
|
router.get('/listaUsuarios', auth.Authenticated,log.log, compartidos.listaUsuarios);
|
||||||
|
router.get('/listaCompartidos', auth.Authenticated,log.log, compartidos.listaCompartidos);
|
||||||
|
router.get('/listaCompartidosConmigo', auth.Authenticated,log.log, compartidos.listaCompartidosConmigo);
|
||||||
|
router.get('/recuperarFicheroCompartido', auth.Authenticated,log.log, compartidos.recuperarFicheroCompartido);
|
||||||
|
router.post('/guardarArchivoCompartido', auth.Authenticated,log.log, compartidos.guardarArchivoCompartido);
|
||||||
|
router.post('/obtenerPublicas', auth.Authenticated,log.log, compartidos.obtenerPublicas);
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = router;
|
13
routes/datos.js
Executable file
13
routes/datos.js
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
const auth = require('../middlewares/auth');
|
||||||
|
const log = require('../middlewares/log');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var datos = require('../controllers/DatosController.js');
|
||||||
|
|
||||||
|
router.get('/recuperarDatos', auth.Authenticated,log.log, datos.recuperarDatos);
|
||||||
|
router.post('/subirDatos', auth.Authenticated,log.log, datos.subirDatos);
|
||||||
|
|
||||||
|
module.exports = router;
|
15
routes/usuario.js
Executable file
15
routes/usuario.js
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
var express = require('express');
|
||||||
|
var router = express.Router();
|
||||||
|
const auth = require('../middlewares/auth');
|
||||||
|
const log = require('../middlewares/log');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var usuario = require('../controllers/UsuarioController.js');
|
||||||
|
|
||||||
|
router.post('/registrar', log.log,usuario.registrar);
|
||||||
|
router.post('/iniciarSesion', log.log,usuario.iniciarSesion);
|
||||||
|
router.post('/iniciarSesionFA', auth.AuthenticatedFA, log.log,usuario.iniciarSesionFA);
|
||||||
|
router.post('/activar2FA', auth.Authenticated, log.log,usuario.activar2FA);
|
||||||
|
|
||||||
|
module.exports = router;
|
Loading…
Reference in New Issue
Block a user