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