var confi = require('./confi.json'); var express = require('express'); var session = require('express-session'); var bodyParser = require('body-parser'); var validator = require('validator'); var fs = require('fs'); var ursa = require('ursa'); var key = ursa.createPrivateKey(fs.readFileSync('./rsaprivada.pem')); var sqlite3 = require('sqlite3'); var crypto = require('crypto'); var bandera = 0; var app = express(); // Templates/vistas ejs app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); // Servir directorio public app.use(express.static('./public')); // Sesiones app.use(session({ name: '', secret: confi.secreto, resave: false, saveUninitialized: false })); // Body-parser app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false})); // Función SQLITE var sentencia = function(lacontra, retrollamada) { bandera = 1; var db = new sqlite3.Database(confi.bd); db.get("SELECT MAX(id) AS id FROM subscriber", function(err, row) { if (row.id == null) { var id = 1; } else { var id = row.id + 1; } var aha1 = id +':'+ confi.dominio +':'+ lacontra; var aha1b = id +'@'+ confi.dominio +':'+ confi.dominio +':'+ lacontra; var ha1 = crypto.createHash('md5').update(aha1).digest('hex'); var ha1b = crypto.createHash('md5').update(aha1b).digest('hex'); db.run("INSERT INTO subscriber(username, domain, ha1, ha1b) VALUES (?, ?, ?, ?)", [ id, confi.dominio, ha1, ha1b ], function(error) { bandera = 0; retrollamada({ 'estado': 1, 'n': id }); }); }); db.close(); }; // banderas var vamosalla = function(lacontra,retrollamada) { if (bandera == 0) { sentencia(lacontra,retrollamada); } else { setTimeout(vamosalla, 50); } }; // Sirve index app.get('/', function(req, res) { //Sesión sess = req.session; // Creamos una variable con una cadena alfanumérica aleatoria. var aleatori = Math.random().toString(36).slice(2); //Creamos variable de sesión sess.aleatori = aleatori; // Se renderiza la vista enviando variable res.render('index', { aleatori: aleatori }); }); // Procesa alta var cosa = { 'estado': 0 }; app.post('/t', function(req, res) { if ( (Object.keys(req.body).length == 3) && (validator.isBase64(req.body.contrasena)) && (validator.isBase64(req.body.paso)) && (validator.isBase64(req.body.aleatori)) ) { var paso = key.decrypt(req.body.paso,'base64', 'utf8', ursa.RSA_PKCS1_PADDING); if ( validator.isEmpty(paso) ) { // Puede que no sea un bot var aleatori = key.decrypt(req.body.aleatori,'base64', 'utf8', ursa.RSA_PKCS1_PADDING); //descifrar aleatori, comprobar que es alfanumérico y comprobar que es igual a la session. if ( validator.isAlphanumeric(aleatori) ) { sess = req.session; if (sess.aleatori && sess.aleatori == aleatori) { var contrasena = key.decrypt(req.body.contrasena,'base64', 'utf8', ursa.RSA_PKCS1_PADDING); //mayor a 1 y menor a 25 if ( validator.isLength(contrasena, 1, 25) ) { //SQLITE vamosalla(contrasena, function(numerito){ res.send(numerito); }); req.session.destroy(); } else { res.send(cosa); } } else { res.send(cosa); } } else { res.send(cosa); } } else { res.send(cosa); } } }); // A funcionar app.listen(confi.puerto, confi.ip);