Authetication, logger middleware, db create tool

This commit is contained in:
MrFry 2020-04-07 09:26:45 +02:00
parent 5f0b17a0db
commit ebd27f93c1
11 changed files with 164 additions and 94 deletions

View file

@ -33,7 +33,8 @@ const logger = require('../../utils/logger.js')
const utils = require('../../utils/utils.js')
const actions = require('../../utils/actions.js')
const dbtools = require('../../utils/dbtools.js')
const auth = require('../../modules/api/auth.middleware.js')
const auth = require('../../middlewares/auth.middleware.js')
const reqlogger = require('../../middlewares/reqlogger.middleware.js')
const recivedFiles = 'public/recivedfiles'
const uloadFiles = 'public/f'
@ -45,34 +46,11 @@ const passwordFile = 'data/dataEditorPasswords.json'
const dataEditsLog = 'stats/dataEdits'
const dailyDataCountFile = 'stats/dailyDataCount'
const usersDBPath = 'data/dbs/users.db'
const dbStructPath = './modules/api/apiDBStruct.json'
let authDB
function CreateDB () {
const dbStruct = utils.ReadJSON(dbStructPath)
// TODO: check if path exists, create it if not
authDB = dbtools.GetDB(usersDBPath)
// TODO: foreign key
Object.keys(dbStruct).forEach((tableName) => {
const tableData = dbStruct[tableName]
dbtools.CreateTable(authDB, tableName, tableData.tableStruct)
})
// TODO: fill with data
dbtools.Insert(authDB, 'users', {
pw: 2,
id: 2,
notes: 'hemnlo'
})
dbtools.Insert(authDB, 'users', {
pw: 1,
id: 1,
notes: 'hemnlo'
})
// console.log(dbtools.TableInfo(authDB, 'users'))
if (!utils.FileExists(usersDBPath)) {
throw new Error('No user DB exists yet! please run utils/dbSetup.js first!')
}
CreateDB()
const authDB = dbtools.GetDB(usersDBPath)
const cookieSecret = uuidv4()
app.use(cookieParser(cookieSecret))
@ -92,6 +70,9 @@ app.use(auth({
authDB: authDB,
jsonResponse: true
}))
app.use(reqlogger([
'stable.user.js' // TODO
]))
app.use(express.static('public'))
app.use(busboy({
limits: {
@ -130,9 +111,7 @@ Load()
// -------------------------------------------------------------
app.post('/login', (req, res) => {
// TODO: user.logincount update in db
logger.LogReq(req)
const isScript = req.body.script
const pw = req.body.pw
const ip = req.headers['cf-connecting-ip'] || req.connection.remoteAddress
const user = dbtools.Select(authDB, 'users', {
@ -174,15 +153,10 @@ app.post('/login', (req, res) => {
// TODO: cookie age
res.cookie('sessionID', sessionID)
if (isScript) {
res.json({
result: 'success',
sessionID: sessionID
})
} else {
// FIXME: redirect to original url
res.redirect('/')
}
res.json({
result: 'success',
sessionID: sessionID
})
logger.Log(`Successfull login with user ID: #${user.id}`, logger.GetColor('cyan'))
} else {
@ -202,8 +176,9 @@ app.post('/logout', (req, res) => {
id: sessionID
})
// TODO: remove old sessions every once in a while
// FIXME: redirect to original url
res.clearCookie('sessionID').redirect('/')
res.clearCookie('sessionID').json({
result: 'success'
})
})
// --------------------------------------------------------------

View file

@ -1,13 +1,15 @@
{
"users": {
"tableStruct": {
"id": {
"type": "integer",
"primary": true,
"autoIncrement": true
},
"pw": {
"type": "text",
"primary": true,
"notNull": true
},
"id": {
"type": "number"
"notNull": true,
"unique": true
},
"lastIP": {
"type": "text"
@ -27,6 +29,15 @@
}
},
"sessions": {
"foreignKey": {
"keysFrom": [
"userID"
],
"table": "users",
"keysTo": [
"id"
]
},
"tableStruct": {
"id": {
"type": "text",

View file

@ -1,87 +0,0 @@
const logger = require('../../utils/logger.js')
const dbtools = require('../../utils/dbtools.js')
const exceptions = [
'favicon',
'/login'
]
module.exports = function (options) {
const { authDB, jsonResponse } = options
const renderLogin = (res) => {
if (jsonResponse) {
res.json({
result: 'nouser',
msg: 'You are not logged in'
})
} else {
res.render('login')
}
}
return function (req, res, next) {
const ip = req.headers['cf-connecting-ip'] || req.connection.remoteAddress
const sessionID = req.cookies.sessionID
const isException = exceptions.some((exc) => {
return req.url === exc
})
if (isException) {
logger.DebugLog(`EXCEPTION: ${req.url}`, 'auth', 1)
next()
return
}
if (!sessionID) {
logger.DebugLog(`No session ID: ${req.url}`, 'auth', 1)
renderLogin(res)
return
}
const user = GetUserBySessionID(authDB, sessionID, req)
if (!user) {
logger.DebugLog(`No user:${req.url}`, 'auth', 1)
renderLogin(res)
return
}
logger.DebugLog(`ID #${user.id}: ${req.url}`, 'auth', 1)
dbtools.Update(authDB, 'sessions', {
lastAccess: new Date().toString()
}, {
id: sessionID
})
dbtools.Update(authDB, 'users', {
lastIP: ip,
lastAccess: new Date().toString()
}, {
id: user.id
})
next()
}
}
function GetUserBySessionID (db, sessionID, req) {
logger.DebugLog(`Getting user from db`, 'auth', 2)
const session = dbtools.Select(db, 'sessions', {
id: sessionID
})[0]
if (!session) {
return
}
const user = dbtools.Select(db, 'users', {
id: session.userID
})[0]
if (user) {
return user
}
}