diff --git a/.env b/.env index 1083523..2c3f6e7 100644 --- a/.env +++ b/.env @@ -7,3 +7,11 @@ USERDB = censoDev PASSDB = holaC3ns0 HOSTDB = localhost + +TOKEN_SEED = seedAcatlan + +TOKEN_EXP = 1d + +EMAIL = 'alfredo.jl323@gmail.com' + +EMAILPASS = 'Everybody56.' \ No newline at end of file diff --git a/helpers/sendEmail.js b/helpers/sendEmail.js new file mode 100644 index 0000000..3734efd --- /dev/null +++ b/helpers/sendEmail.js @@ -0,0 +1,48 @@ +const symbols = require('log-symbols'); +const generator = require('generate-password'); +const admin = require('../server/models/tablas/Admin'); +const bcrypt = require('bcrypt'); + +const send = require('gmail-send')({ + user: process.env.EMAIL, + pass: process.env.EMAILPASS, + subject: 'Credenciales para ingreso a sistema de censo.' +}); + +const emails = [ + 'alfredo.lima@acatlan.unam.mx', + '312047278@pcpuma.acatlan.unam.mx' +]; + +emails.forEach(async(email, index) => { + + // Para pruebas + await admin.sync({ force: true }); + + let tempPass = generator.generate({ + length: 8, + numbers: true, + symbols: true, + exclude: `"`, + strict: true + }); + console.log(symbols.info, `Creating user ${email}...`); + let tempUser = await admin.create({ + name: email, + password: bcrypt.hashSync(tempPass, 10), + isAdmin: false + }); + if (!tempUser) + return console.log(symbols.error, 'Error creating user. Exiting.'); + console.log(`Sending email to ${email}`); + await send({ + to: email, + text: `Usuario: ${email}\nContraseña: ${tempPass}\nSaludos.` + }, + async(err, res, resFull) => { + if (err) + return console.log(symbols.error, err); + console.log(symbols.success, 'User created. Email sent.'); + }); + +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2166a56..70b06bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -761,6 +761,12 @@ "is-property": "^1.0.2" } }, + "generate-password": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/generate-password/-/generate-password-1.5.1.tgz", + "integrity": "sha512-XdsyfiF4mKoOEuzA44w9jSNav50zOurdWOV3V8DbA7SJIxR3Xm9ob14HKYTnMQOPX3ylqiJMnQF0wEa8gXZIMw==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -801,6 +807,16 @@ "ini": "^1.3.5" } }, + "gmail-send": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/gmail-send/-/gmail-send-1.8.10.tgz", + "integrity": "sha512-QMpWwzeA64U69HzOEzI37UNc73xXkhTg8LuqsfKX9W7LjiQY3yRvViVn7ZhuJWLTV4136vsLJf2sXiZKmdykbw==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "nodemailer": "^6.3.0" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -823,8 +839,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "has-flag": { "version": "3.0.0", @@ -899,8 +914,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflection": { "version": "1.12.0", @@ -1390,6 +1404,26 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==" }, + "node-localstorage": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.1.6.tgz", + "integrity": "sha512-yE7AycE5G2hU55d+F7Ona9nx97C+enJzWWx6jrsji7fuPZFJOvuW3X/LKKAcXRBcEIJPDOKt8ZiFWFmShR/irg==", + "requires": { + "write-file-atomic": "^1.1.4" + }, + "dependencies": { + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + } + } + }, "node-pre-gyp": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", @@ -1407,6 +1441,12 @@ "tar": "^4.4.2" } }, + "nodemailer": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz", + "integrity": "sha512-BVZBDi+aJV4O38rxsUh164Dk1NCqgh6Cm0rQSb9SK/DHGll/DrCMnycVDD7msJgZCnmVa8ASo8EZzR7jsgTukQ==", + "dev": true + }, "nodemon": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", @@ -1891,6 +1931,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", diff --git a/package.json b/package.json index adb93e3..ccdd166 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,33 @@ { - "name": "censo2020back", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "test:db": "node server/config/test", - "install:db": "node server/models/install" - }, - "author": "", - "license": "ISC", - "dependencies": { - "bcrypt": "^5.0.0", - "colors": "^1.4.0", - "cors": "^2.8.5", - "dotenv": "^8.2.0", - "express": "^4.17.1", - "jsonwebtoken": "^8.5.1", - "log-symbols": "^4.0.0", - "mariadb": "^2.4.2", - "moment": "^2.27.0", - "mysql2": "^2.1.0", - "sequelize": "^6.3.4" - }, - "devDependencies": { - "nodemon": "^2.0.4" - } + "name": "censo2020back", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "test:db": "node server/config/test", + "install:db": "node server/models/install", + "sendemail": "node helpers/sendEmail" + }, + "author": "", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.0.0", + "colors": "^1.4.0", + "cors": "^2.8.5", + "dotenv": "^8.2.0", + "express": "^4.17.1", + "jsonwebtoken": "^8.5.1", + "log-symbols": "^4.0.0", + "mariadb": "^2.4.2", + "moment": "^2.27.0", + "mysql2": "^2.1.0", + "node-localstorage": "^2.1.6", + "sequelize": "^6.3.4" + }, + "devDependencies": { + "generate-password": "^1.5.1", + "gmail-send": "^1.8.10", + "nodemon": "^2.0.4" + } } diff --git a/scratch/token b/scratch/token new file mode 100644 index 0000000..c3060ef --- /dev/null +++ b/scratch/token @@ -0,0 +1 @@ +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkQWRtaW4iOjEsIm5hbWUiOiJhbGZyZWRvLmxpbWFAYWNhdGxhbi51bmFtLm14IiwicGFzc3dvcmQiOiIkMmIkMTAkVVJYZzUvYXVCeG1McEY4L21CRzRmLklhZTFjd1dKeTZPSUNwYllhY2dNWHN6NVgvRmRQR3kiLCJpc0FkbWluIjpmYWxzZSwiY3JlYXRlZEF0IjoiMjAyMC0wOC0yMVQwMjo0OToyNS4wMDBaIiwidXBkYXRlZEF0IjoiMjAyMC0wOC0yMVQwMjo0OToyNS4wMDBaIn0sImlhdCI6MTU5Nzk3ODM4MSwiZXhwIjoxNTk4MDY0NzgxfQ.U7kSEbe6KwJ-olk-GUMBt4y10VT80D1ICOzyGB8OINs \ No newline at end of file diff --git a/server/config/test.js b/server/config/test.js index b480aa1..96c81a9 100644 --- a/server/config/test.js +++ b/server/config/test.js @@ -4,12 +4,12 @@ const sequelize = require("./sequelize.conf"); const colors = require("colors"); sequelize - .authenticate() - .then(() => { - console.log("Conexión establecida con éxito.".green); - process.exit(); - }) - .catch(err => { - console.error("No se ha podido establacer conexión con la base de datos:".red, err); - process.exit(); - }); + .authenticate() + .then(() => { + console.log("Conexion establecida con exito.".green); + process.exit(); + }) + .catch(err => { + console.error("No se ha podido establacer conexion con la base de datos:".red, err); + process.exit(); + }); \ No newline at end of file diff --git a/server/controller/login/post.js b/server/controller/login/post.js index 131e242..b15178b 100644 --- a/server/controller/login/post.js +++ b/server/controller/login/post.js @@ -1,15 +1,54 @@ -// const post = async () => { - -// return { -// message: 'Mensaje del post' -// } -// } - -// module.exports = post; - const Admin = require("../../models/tablas/Admin"); const bcrypt = require("bcrypt"); const jwt = require("jsonwebtoken"); -// module.exports = const equis; \ No newline at end of file + +const post = async(req, res) => { + + const body = req.body; + + const user = await Admin.findOne({ + where: { + name: body.name, + }, + }); + + if (user == null) { + console.log("Invalid user or password"); + return res.status(500).json({ + err: { + message: "Invalid user or password" + } + }) + } + + if (!bcrypt.compareSync(body.password, user.password)) { + console.log('Invalid user or password'); + return res.json({ + err: { + message: 'Invalid user or password' + } + }) + } + + let token = jwt.sign({ + user + }, process.env.TOKEN_SEED, { expiresIn: process.env.TOKEN_EXP }); + + if (typeof localStorage === "undefined" || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + localStorage.setItem('token', token); + + + res.json({ + user, + token + }) + + +} + +module.exports = post; \ No newline at end of file diff --git a/server/middlewares/authentication.js b/server/middlewares/authentication.js new file mode 100644 index 0000000..71731cd --- /dev/null +++ b/server/middlewares/authentication.js @@ -0,0 +1,28 @@ +const jwt = require('jsonwebtoken'); + +const verifyToken = (req, res, next) => { + + if (typeof localStorage === "undefined" || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + let localToken = localStorage.getItem('token'); + + console.log(localToken); + + jwt.verify(localToken, process.env.TOKEN_SEED, (err, decoded) => { + if (err) { + return res.status(401).json({ + err: { + message: 'Invalid token.' + } + }) + } + + req.user = decoded.user; + + next(); + }) +} + +module.exports = verifyToken; \ No newline at end of file diff --git a/server/models/install.js b/server/models/install.js index 2beaf77..74be3d1 100644 --- a/server/models/install.js +++ b/server/models/install.js @@ -20,6 +20,8 @@ require("../config/config"); async function remove() { console.log(logSymbols.info, "Paso 1 : Borrando base de datos \n".blue.bold); + await admin.drop(); + console.log(logSymbols.success, "admin"); await equipo.drop(); console.log(logSymbols.success, "equipo"); await printers.drop(); @@ -84,11 +86,32 @@ async function install() { // foreignKey: "idResponsable", // }); +}; + +async function createFirstUsers() { + console.log( + logSymbols.info, + "Paso 3 : Creating first users in database...\n".blue.bold + ); + + await admin.create({ + name: 'alima', + password: bcrypt.hashSync('contraseña', 10), + isAdmin: true + }); + + await admin.create({ + name: 'alfredojl', + password: bcrypt.hashSync('contraseña', 10), + isAdmin: false + }); + } async function exec() { await remove(); await install(); + await createFirstUsers(); console.log(logSymbols.success, "Éxito al instalar \n".underline.bold.green); process.exit(); diff --git a/server/models/tablas/Admin.js b/server/models/tablas/Admin.js index 5c543ff..04c07e2 100644 --- a/server/models/tablas/Admin.js +++ b/server/models/tablas/Admin.js @@ -2,27 +2,28 @@ const Sequelize = require("sequelize"); const sequelize = require("../../config/sequelize.conf"); class Admin extends Sequelize.Model {} -Admin.init( - { +Admin.init({ idAdmin: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, }, - nombre: { - type: Sequelize.STRING(50), - allowNull: false, + name: { + type: Sequelize.STRING(50), + allowNull: false, }, password: { - type: Sequelize.STRING(100), - allowNull: false, + type: Sequelize.STRING(100), + allowNull: false, }, - }, - { + isAdmin: { + type: Sequelize.BOOLEAN, + allowNull: false + } +}, { sequelize, - tableName: "admin", - } -); + tableName: "users", +}); -module.exports = Admin; +module.exports = Admin; \ No newline at end of file diff --git a/server/routes/login.js b/server/routes/login.js index 3fd6c6c..11ab44f 100644 --- a/server/routes/login.js +++ b/server/routes/login.js @@ -1,38 +1,18 @@ let express = require("express"); let app = express(); +let verifyToken = require('../middlewares/authentication'); const route = '/login' //logica del login, ejemplo -let post = require('../controller/login/post') +let post = require('../controller/login/post'); +const Admin = require("../models/tablas/Admin"); //let get = require('../controller/login/get') -app.post(route, (req, res) => { - console.log(req.query) - console.log(req.body) - return post() - .then(data => { - res.status(200).json(data) - }) - .catch(err => { - console.log(err) - res.status(400).json({ - err: err.message - }) - }) -}) +app.post(route, async(req, res) => { + return post(req, res); -// app.get(route, (req, res) => { -// return get() -// .then(data => { -// res.status(200).json(data) -// }) -// .catch(err => { -// res.status(400).json({ -// err: err.message -// }) -// }) -// }) +}); module.exports = app \ No newline at end of file