Files added to repository

This commit is contained in:
Ernesto Canales Pereña 2023-06-18 20:46:04 +02:00
commit bf9b20499b
17 changed files with 665 additions and 0 deletions

1
ArchivosCompartidos/id.txt Executable file
View File

@ -0,0 +1 @@
0

24
README.md Executable file
View 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
View 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
View 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
View File

@ -0,0 +1,3 @@
module.exports = {
TOKEN_SECRET: process.env.TOKEN_SECRET || "Master2023" //Clave para codificar token
};

13
config/services.js Executable file
View 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');
};

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View File

@ -0,0 +1,7 @@
<html>
<head>
<title>ES</title>
</head>
<h1>ES</h1>
</body>
</html>

19
routes/compartidos.js Executable file
View 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
View 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
View 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;