diff --git a/app/controllers/adminController.js b/app/controllers/adminController.js index 9cf85fd..97696de 100644 --- a/app/controllers/adminController.js +++ b/app/controllers/adminController.js @@ -1,7 +1,13 @@ const moment = require('moment'); +const bcrypt = require('bcryptjs'); +const crypto = require("crypto"); + const { insertSessions, insertSessionTracks } = require("../db/mongo/mongoSessions"); +const { createUserMongo, getUserMongo } = require('../db/mongo/mongoUsers'); const { getHistoricalSessions, getIvaoSessionTracks } = require("../requests/ivao/session"); +const saltRounds = 10; + async function initSessionsData(opts) { const { callsign, userId, from, clear = false } = opts; let to = opts.to; @@ -45,6 +51,39 @@ async function pause(millis) { await new Promise((resolve) => setTimeout(resolve, millis)); } +function getHashedPassword(password) { + const salt = bcrypt.genSaltSync(saltRounds); + return bcrypt.hashSync(password, salt); +} + +async function createUser(request) { + try { + const { username, password, roles, firstname, lastname, vid } = request.body; + const hash = getHashedPassword(password); + const id = crypto.randomBytes(16).toString("hex"); + return await createUserMongo({ id, username, hash, roles, firstname, lastname, vid }); + } catch (err) { + console.log('err :>> ', err); + } +} + +async function authenticate(username, password) { + try { + const user = await getUserMongo(username); + if (bcrypt.compareSync(password, user.hash)) { + delete user.hash; + return user; + } + return undefined; + } catch (err) { + console.log('err :>> ', err); + } +} + + module.exports = { initSessionsData, + createUser, + authenticate, + getHashedPassword, } \ No newline at end of file diff --git a/app/db/mongo/mongoDBPool.js b/app/db/mongo/mongoDBPool.js index 382d409..b41dbc5 100644 --- a/app/db/mongo/mongoDBPool.js +++ b/app/db/mongo/mongoDBPool.js @@ -19,18 +19,23 @@ const getMongoDatabase = (client, db) => { return client.db(DB); }; -const mongoExecute = async(fn, dbName = MONGO_DB) => { - let conn; +const mongoExecute = async function(fn, opts) { + const { dbName, colName } = { dbName: MONGO_DB, ...opts }; + let connection; try { - conn = await getMongoConnection(); - const db = conn.db(dbName); - const result = await fn(db, conn); - return result; + connection = await getMongoConnection(); + const database = connection.db(dbName); + if (colName) { + const collection = database.collection(colName); + return await fn({ collection, database, connection }); + } + return await fn({ database, connection }); } catch (err) { + console.log('err :>> ', err); console.log('MOMGODB ERROR:', err.message); } finally { - if (conn) { - await conn.close(); + if (connection) { + await connection.close(); } } }; diff --git a/app/db/mongo/mongoSessions.js b/app/db/mongo/mongoSessions.js index 889ddd4..1626007 100644 --- a/app/db/mongo/mongoSessions.js +++ b/app/db/mongo/mongoSessions.js @@ -1,8 +1,8 @@ const { mongoExecute } = require("./mongoDBPool"); async function insertSessions(sessions, clear) { - return mongoExecute(async(db) => { - const sessionsCollection = db.collection('sessions'); + return await mongoExecute(async({ database }) => { + const sessionsCollection = database.collection('sessions'); if (clear) { sessionsCollection.deleteMany({}); @@ -16,16 +16,16 @@ async function insertSessions(sessions, clear) { async function insertOneSessionTracks(sessionTracks) { - return mongoExecute(async(db) => { - const sessionsCollection = db.collection('sessionTracks'); + return await mongoExecute(async({ database }) => { + const sessionsCollection = database.collection('sessionTracks'); await sessionsCollection.insertOne(sessionTracks); }); } async function insertSessionTracks(sessionTracks, clear) { - return mongoExecute(async(db) => { - const sessionsCollection = db.collection('sessionTracks'); + return await mongoExecute(async({ database }) => { + const sessionsCollection = database.collection('sessionTracks'); if (clear) { sessionsCollection.deleteMany({}); @@ -36,8 +36,8 @@ async function insertSessionTracks(sessionTracks, clear) { } async function getSessions(start, end) { - return mongoExecute(async(db) => { - const sessionsCollection = db.collection('sessions'); + return await mongoExecute(async({ database }) => { + const sessionsCollection = database.collection('sessions'); const startDate = start + 'T00:00:00.000Z'; const endDate = end + 'T23:59:59.999Z'; const result = await sessionsCollection.aggregate([{ @@ -71,9 +71,9 @@ async function getSessions(start, end) { } async function getSessionTracks(sessionId) { - return mongoExecute( - async(db) => { - const tracksCollection = db.collection('sessionTracks'); + return await mongoExecute( + async({ database }) => { + const tracksCollection = database.collection('sessionTracks'); const tracks = await tracksCollection.findOne({ sessionId }); return tracks; } @@ -81,8 +81,8 @@ async function getSessionTracks(sessionId) { } async function updateSessionTracks(tracks) { - return mongoExecute(async(db) => { - const tracksCollection = db.collection('sessionTracks'); + return await mongoExecute(async({ database }) => { + const tracksCollection = database.collection('sessionTracks'); await tracksCollection.updateOne({ _id: tracks._id }, { $set: { calculatedTime: tracks.calculatedTime } }); }); } diff --git a/app/db/mongo/mongoUsers.js b/app/db/mongo/mongoUsers.js new file mode 100644 index 0000000..3a17673 --- /dev/null +++ b/app/db/mongo/mongoUsers.js @@ -0,0 +1,29 @@ +const { mongoExecute } = require('./mongoDBPool'); + +async function createUserMongo({ id, username, hash, roles = [], firstname, lastname, vid }) { + return await mongoExecute(async({ database }) => { + const usersCol = database.collection('users'); + const createdOn = new Date(); + await usersCol.insertOne({ + id, + username, + hash, + createdOn, + roles, + firstname, + lastname, + vid + }); + }); +} + +async function getUserMongo(username) { + return await mongoExecute(async({ collection }) => { + return await collection.findOne({ username }); + }, { colName: 'users' }) +} + +module.exports = { + createUserMongo, + getUserMongo, +}; \ No newline at end of file diff --git a/app/routes/admin.js b/app/routes/admin.js index 6fa1fb2..06a7aa2 100644 --- a/app/routes/admin.js +++ b/app/routes/admin.js @@ -1,7 +1,35 @@ const express = require('express'); -const { initSessionsData } = require('../controllers/adminController'); +const passport = require('passport') +const LocalStrategy = require('passport-local'); +const { initSessionsData, createUser, authenticate } = require('../controllers/adminController'); const router = express.Router(); +passport.use(new LocalStrategy(async function verify(username, password, cb) { + try { + const user = await authenticate(username, password); + delete user._id; + + if (user) { + return cb(null, user); + } + return cb(null, false, { message: 'Incorrect username or password.' }); + } catch (err) { + return cb(null, false, { message: 'Incorrect username or password.' }); + } +})); + +passport.serializeUser(function(user, cb) { + process.nextTick(function() { + const { id, username, roles, firstname, lastname, vid } = user; + cb(null, { id, username, roles, firstname, lastname, vid }); + }); +}); + +passport.deserializeUser(function(user, cb) { + process.nextTick(function() { + return cb(null, user); + }); +}); router.get('/init-sessions', async(req, res) => { @@ -13,4 +41,31 @@ router.get('/init-sessions', async(req, res) => { } }); +router.post('/user/create', async(req, res) => { + await createUser(req); + res.status(201); +}); + +router.post('/user/authenticate', + passport.authenticate('local'), + function(req, res) { + console.log('req.user :>> ', req.isAuthenticated(), req.user); + res.json(req.user); + }); + +router.get('/user/alive', + function(req, res) { + console.log('req.user :>> ', req.isAuthenticated()); + res.status(200).json(req.user); + }); + +router.get('/user/logout', function(req, res, next) { + req.logout(function(err) { + if (err) { return next(err); } + req.session.destroy(); + res.status(200).send(); + }); +}); + + module.exports = router; \ No newline at end of file diff --git a/app/routes/ivao.js b/app/routes/ivao.js index 2aeabd7..a17d430 100644 --- a/app/routes/ivao.js +++ b/app/routes/ivao.js @@ -43,7 +43,6 @@ router.get('/sessions/all/now', async(req, res) => { }); router.get('/flightplans/latest', async(req, res) => { - console.log('object :>> ', '/flightplans/latest'); try { const data = await getLatestsFlightPlans(); res.status(200).json(data); diff --git a/index.js b/index.js index 7e51f3a..116f0db 100644 --- a/index.js +++ b/index.js @@ -4,44 +4,84 @@ require('./app/tasks/sync')(); const express = require("express"); const bodyParser = require("body-parser"); +const cookieParser = require('cookie-parser'); const cors = require("cors"); const helmet = require("helmet"); +const session = require('express-session'); +const passport = require('passport'); + +const RedisStore = require("connect-redis")(session); const ivaoRoutes = require('./app/routes/ivao'); const ltsRoutes = require('./app/routes/lts'); const adminRoutes = require('./app/routes/admin'); + const app = express(); -// const whitelist = process.env.HOSTS_WHITELIST ? process.env.HOSTS_WHITELIST.split(',') : []; +const whitelist = process.env.HOSTS_WHITELIST ? process.env.HOSTS_WHITELIST.split(',') : []; // parse application/json app.use(bodyParser.json()); - +app.use(cookieParser()); // parse application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: true })); - -// var corsOptions = { -// origin: function(origin, callback) { -// if (whitelist.indexOf(origin) !== -1) { -// callback(null, true) -// } else { -// callback(new Error('Not allowed by CORS')) -// } -// } -// }; +var corsOptions = { + origin: function(origin, callback) { + if (whitelist.indexOf(origin) !== -1) { + callback(null, true) + } else { + callback(new Error('Not allowed by CORS')) + } + }, + credentials: true +}; // use cors options -app.use(cors()); +app.use(cors(corsOptions)); app.use(helmet.referrerPolicy({ policy: ["origin", "unsafe-url"], })); app.use(express.static('assets')); +const { createClient } = require("redis"); +const redisClient = createClient({ + socket: { + host: process.env.REDIS_HOST, + }, + legacyMode: true +}); +redisClient.connect().catch(console.error); + +app.use(session({ + secret: '94e353a57052a1bc1808a2010d74f8a5', + resave: false, + saveUninitialized: false, + store: new RedisStore({ client: redisClient }), + cookie: { + secure: false, + maxAge: 1000 * 60 * 60 * 24 + } +})); +app.use(passport.authenticate('session')); + // routes app.use('/api/v1/ivao', ivaoRoutes); app.use('/api/v1', ltsRoutes); app.use('/api/v1/admin', adminRoutes); +// app.use(function(req, res, next) { +// var msgs = req.session.messages || []; +// res.locals.messages = msgs; +// res.locals.hasMessages = !!msgs.length; +// req.session.messages = []; +// next(); +// }); + +// app.use(passport.initialize()); +// app.use(passport.session()); + + + // listening port const PORT = process.env.PORT || 3000; app.listen(PORT, () => { diff --git a/package-lock.json b/package-lock.json index 94e25e8..bc8c378 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,15 +10,22 @@ "license": "ISC", "dependencies": { "axios": "^1.2.2", + "bcryptjs": "^2.4.3", "body-parser": "^1.20.1", + "connect-redis": "^6.1.3", + "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", + "express-session": "^1.17.3", "helmet": "^6.0.1", "moment": "^2.29.4", "mongodb": "^4.13.0", "node": "^19.3.0", "node-cron": "^3.0.2", + "oauth2orize": "^1.11.1", + "passport": "^0.6.0", + "passport-local": "^1.0.0", "promise-mysql": "^5.2.0", "redis": "^4.5.1" }, @@ -1458,6 +1465,11 @@ } ] }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, "node_modules/bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -1701,6 +1713,14 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/connect-redis": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz", + "integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw==", + "engines": { + "node": ">=12" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1728,6 +1748,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -2101,6 +2141,32 @@ "node": ">= 0.10.0" } }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2888,6 +2954,23 @@ "node": ">=0.10.0" } }, + "node_modules/oauth2orize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/oauth2orize/-/oauth2orize-1.11.1.tgz", + "integrity": "sha512-9dSx/Gwm0J2Rvj4RH9+h7iXVnRXZ6biwWRgb2dCeQhCosODS0nYdM9I/G7BUGsjbgn0pHjGcn1zcCRtzj2SlRA==", + "dependencies": { + "debug": "2.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2915,6 +2998,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2991,6 +3082,42 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3023,6 +3150,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -3125,6 +3257,14 @@ } ] }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3600,6 +3740,22 @@ "node": ">= 0.6" } }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -4901,6 +5057,11 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, "bignumber.js": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", @@ -5075,6 +5236,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "connect-redis": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz", + "integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -5093,6 +5259,22 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -5377,6 +5559,28 @@ "vary": "~1.1.2" } }, + "express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "requires": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5947,6 +6151,16 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "oauth2orize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/oauth2orize/-/oauth2orize-1.11.1.tgz", + "integrity": "sha512-9dSx/Gwm0J2Rvj4RH9+h7iXVnRXZ6biwWRgb2dCeQhCosODS0nYdM9I/G7BUGsjbgn0pHjGcn1zcCRtzj2SlRA==", + "requires": { + "debug": "2.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5965,6 +6179,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6020,6 +6239,29 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "requires": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + } + }, + "passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "requires": { + "passport-strategy": "1.x.x" + } + }, + "passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6043,6 +6285,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -6110,6 +6357,11 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -6460,6 +6712,19 @@ "mime-types": "~2.1.24" } }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" + }, "undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", diff --git a/package.json b/package.json index 968ab1d..3e186eb 100644 --- a/package.json +++ b/package.json @@ -12,15 +12,22 @@ "license": "ISC", "dependencies": { "axios": "^1.2.2", + "bcryptjs": "^2.4.3", "body-parser": "^1.20.1", + "connect-redis": "^6.1.3", + "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.0.3", "express": "^4.18.2", + "express-session": "^1.17.3", "helmet": "^6.0.1", "moment": "^2.29.4", "mongodb": "^4.13.0", "node": "^19.3.0", "node-cron": "^3.0.2", + "oauth2orize": "^1.11.1", + "passport": "^0.6.0", + "passport-local": "^1.0.0", "promise-mysql": "^5.2.0", "redis": "^4.5.1" }, @@ -28,4 +35,4 @@ "eslint": "^8.31.0", "nodemon": "^2.0.20" } -} \ No newline at end of file +} diff --git a/test.js b/test.js index 9f13f7b..12c9385 100644 --- a/test.js +++ b/test.js @@ -6,6 +6,8 @@ const data = require('./testData/short.json'); const { analize, getShortStates, getAirTime } = require('./app/controllers/trackerAnalizer'); const { getSessions, getSessionTracks, updateSessionTracks } = require('./app/db/mongo/mongoSessions'); const { getIvaoPilotsNow } = require('./app/requests/ivao/session'); +const { createUserMongo } = require('./app/db/mongo/mongoUsers'); +const { getHashedPassword } = require('./app/controllers/adminController'); // const { getHistoricalSessions, getSessionTracks } = require('./app/requests/ivao/session'); @@ -45,7 +47,24 @@ async function recalculateTime() { } async function f() { - console.log((await getIvaoPilotsNow(true)).length); + + const crypto = require('crypto'); + await createUserMongo({ + id: crypto.randomBytes(16).toString("hex"), + username: 'admin', + hash: getHashedPassword('nevada98'), + roles: ['admin'] + }); + + await createUserMongo({ + id: crypto.randomBytes(16).toString("hex"), + username: 'capcabal', + hash: getHashedPassword('Kpitan123'), + roles: ['cabal'], + firstname: 'Carlos', + lastname: 'Cabal', + vid: 665507 + }); } f();