CoreID/app/classes/oidc/CoreIDAdapter.js
garrettmills 084ec7bbc1
All checks were successful
continuous-integration/drone/push Build is passing
inflate OpenID UID to case-sensitive on lookup
2020-10-19 09:39:28 -05:00

105 lines
2.4 KiB
JavaScript

const Connection = require('flitter-orm/src/services/Connection')
const { ObjectId } = require('mongodb')
let DB
/**
* An OpenID Connect provider adapter with some CoreID specific tweaks.
*/
class CoreIDAdapter {
constructor(name) {
this.name = 'openid_' + name
}
async upsert(_id, payload, expiresIn) {
let expiresAt
if (expiresIn) {
expiresAt = new Date(Date.now() + (expiresIn * 1000))
}
if ( payload.uid ) {
payload.originalUid = payload.uid
payload.uid = payload.uid.toLowerCase()
}
await this.coll().updateOne(
{ _id },
{ $set: { payload, ...(expiresAt ? { expiresAt } : undefined) } },
{ upsert: true },
)
}
async find(_id) {
if ( this.name === 'openid_Client' ) _id = ObjectId(_id)
const result = await this.coll().find(
{ _id },
{ payload: 1 },
).limit(1).next()
if (!result) return undefined
if ( result?.payload?.originalUid ) {
result.payload.uid = result.payload.originalUid
}
return result.payload
}
async findByUserCode(userCode) {
const result = await this.coll().find(
{ 'payload.userCode': userCode },
{ payload: 1 },
).limit(1).next()
if (!result) return undefined
return result.payload
}
async findByUid(uid) {
const result = await this.coll().find(
{ 'payload.uid': uid.toLowerCase() },
{ payload: 1 },
).limit(1).next()
if (!result) return undefined
if ( result?.payload?.originalUid ) {
result.payload.uid = result.payload.originalUid
}
return result.payload
}
async destroy(_id) {
await this.coll().deleteOne({ _id })
}
async revokeByGrantId(grantId) {
await this.coll().deleteMany({ 'payload.grantId': grantId })
}
async consume(_id) {
await this.coll().findOneAndUpdate(
{ _id },
{ $set: { 'payload.consumed': Math.floor(Date.now() / 1000) } },
)
}
coll(name) {
return this.constructor.coll(name || this.name)
}
static coll(name) {
return DB.collection(name)
}
static connect(app) {
DB = app.di().get(Connection.name)
}
}
module.exports = CoreIDAdapter