/* eslint operator-linebreak: 0 */ const jwt = require('jsonwebtoken') const camelcase = require('camelcase') const ObjectId = require('mongodb').ObjectId const CFG = require('../../config') const TOL = require('../../tools/common') module.exports = function (pCtx) { const services = {} let dbUsers = pCtx.db.collection('users') services.login = function (req, res, next) { dbUsers .find({username: req.body.user}) .limit(1) .next(function (pErr, pUser) { if (pErr) { return res.done(555, pErr) } if (!pUser) { return res.done(401, new Error('User:NotFound')) } if (!pUser.multipass || pUser.multipass.hash !== req.body.pass) { return res.done(401, new Error('User:WrongPassword')) } let payload = buildDefaultPayload(req, pUser) let token = jwt.sign({data: payload}, CFG.jwt.jwtAuth.secret, { expiresIn: CFG.jwt.jwtAuth.expiresIn }) res.done(null, {user: pUser, token: token}) }) } // services.access = function (req, res, next) { // if (!req.body.jwtAuth) { // return res.done(401, new Error('jwtAuth:Missing')) // } // jwt.verify(req.body.jwtAuth, CFG.jwt.jwtAuth.secret, function (pErr, pDecoded) { // if (pErr) { // return res.done(401, new Error(`jwtAuth:${camelcase(pErr.message, {pascalCase: true})}`)) // } // let payloadState = TOL.jwt.checkPayload(req, pDecoded.data) // if (payloadState) { // return res.done(401, 'jwtAuth:CorruptedPayload:' + payloadState) // } // dbUsers // .find({_id: ObjectId(pDecoded.data.user.id)}) // .limit(1) // .next(function (pErr, pUser) { // if (pErr || !pUser) { // return res.done(401, 'User:NotFound') // } // let hashPass = TOL.createHash(pUser.multipass.hash, null, CFG.jwt.jwtAuth.passSalt) // if (pDecoded.data.user.pass !== hashPass) { // return res.done(401, 'User:PasswordChanged') // } // let payload = buildDefaultPayload(req, pUser) // let jwtAuth = jwt.sign({data: payload}, CFG.jwt.jwtAuth.secret, { expiresIn: CFG.jwt.jwtAuth.expiresIn }) // payload.user.rights = pUser.rights // let jwtAccess = jwt.sign({data: payload}, CFG.jwt.jwtAccess.secret, { expiresIn: CFG.jwt.jwtAccess.expiresIn }) // res.done(null, {jwtAuth, jwtAccess}) // }) // }) // } services.me = function (req, res, next) { res.done(null, {user: req.user}) } services.filtersGet = function (req, res, next) { let restOp = pCtx.restapi['users-filters'].__buildRestOp() restOp.filter = { '__metadata.owner': req.user._id } pCtx.restapi['users-filters'].__services.read(restOp, res.done) } services.filtersCreate = function (req, res, next) { pCtx.restapi['users-filters'].__services.create(req.body, req.user, res.done) } return services } function buildDefaultPayload (req, pUser) { return { user: { id: pUser._id, username: pUser.username, details: pUser.details, pass: TOL.createHash(pUser.multipass.hash, null, CFG.jwt.jwtAuth.passSalt) }, sid: CFG.jwt.sid, clientInfo: TOL.buildClientInfo(req) } }