Add traps; user registration

This commit is contained in:
garrettmills
2020-05-20 09:56:03 -05:00
parent 7663cea2ea
commit ea77402750
19 changed files with 493 additions and 24 deletions

View File

@@ -0,0 +1,61 @@
const { Middleware } = require('libflitter')
class TrapUtility {
constructor(req, res, configs) {
this.request = req
this.response = res
this.user = req.user
this.configs = configs
}
async begin(trap_name) {
this.user.trap = trap_name
this.request.trust.assume()
await this.user.save()
}
redirect() {
this.request.trust.assume()
return this.response.redirect(this.config().redirect_to)
}
async end() {
this.user.trap = ''
this.request.trust.unassume()
await this.user.save()
}
has_trap() {
return !!this.user.trap
}
get_trap() {
return this.user.trap
}
config() {
return this.configs[this.get_trap()]
}
allows(route) {
const config = this.config()
return route.startsWith('/assets') || config.allowed_routes.includes(route.toLowerCase().trim())
}
}
class TrapsMiddleware extends Middleware {
static get services() {
return [...super.services, 'models', 'configs']
}
async test(req, res, next, args = {}) {
if ( !req?.user ) return next()
req.trap = new TrapUtility(req, res, this.configs.get('traps.types'))
if ( !req.trap.has_trap() ) return next()
else if ( req.trap.allows(req.path) ) return next()
else return req.trap.redirect()
}
}
module.exports = exports = TrapsMiddleware

View File

@@ -3,6 +3,8 @@ const moment = require('moment')
const uuid = require('uuid/v4')
class TrustManager {
assume_trust = false
constructor(request, response) {
this.request = request
this.response = response
@@ -18,6 +20,19 @@ class TrustManager {
this.request.session.trust_tokens = this.request.session.trust_tokens.filter(x => {
return moment(new Date(x.expires)) > now
})
this.assume_trust = !!this.request.session.trust_assume_trust
}
assume() {
this.request.session.trust_assume_trust = true
this.assume_trust = true
}
unassume() {
this.request.session.trust_assume_trust = false
this.assume_trust = false
this.purge()
}
init_flow(scope, next) {
@@ -66,7 +81,7 @@ class TrustManager {
}
has(scope) {
return this.request.session.trust_tokens.some(x => x.scope === scope)
return this.assume_trust || this.request.session.trust_tokens.some(x => x.scope === scope)
}
grant(scope) {

View File

@@ -0,0 +1,19 @@
const { Middleware, HTTPError } = require('libflitter')
class SettingMiddleware extends Middleware {
static get services() {
return [...super.services, 'models']
}
async test(req, res, next, { key, value = true }) {
const Setting = this.models.get('Setting')
const actual_value = await Setting.get(key)
if ( actual_value !== value )
throw new HTTPError(404)
return next()
}
}
module.exports = exports = SettingMiddleware