Skip to content

Commit a690e55

Browse files
committed
fix: revocation token list for users + groups
1 parent c9f3105 commit a690e55

3 files changed

Lines changed: 55 additions & 2 deletions

File tree

server/core/auth.js

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module.exports = {
1919
},
2020
groups: {},
2121
validApiKeys: [],
22+
revokationList: require('./cache').init(),
2223

2324
/**
2425
* Initialize the authentication module
@@ -111,10 +112,28 @@ module.exports = {
111112
authenticate(req, res, next) {
112113
WIKI.auth.passport.authenticate('jwt', {session: false}, async (err, user, info) => {
113114
if (err) { return next() }
115+
let mustRevalidate = false
114116

115117
// Expired but still valid within N days, just renew
116-
if (info instanceof Error && info.name === 'TokenExpiredError' &&
117-
moment().subtract(ms(WIKI.config.auth.tokenRenewal), 'ms').isBefore(info.expiredAt)) {
118+
if (info instanceof Error && info.name === 'TokenExpiredError' && moment().subtract(ms(WIKI.config.auth.tokenRenewal), 'ms').isBefore(info.expiredAt)) {
119+
mustRevalidate = true
120+
}
121+
122+
// Check if user / group is in revokation list
123+
if (user) {
124+
if (WIKI.auth.revokationList.has(`u${_.toString(user.id)}`)) {
125+
mustRevalidate = true
126+
}
127+
for (const gid of user.groups) {
128+
if (WIKI.auth.revokationList.has(`g${_.toString(gid)}`)) {
129+
mustRevalidate = true
130+
}
131+
}
132+
}
133+
134+
// Revalidate and renew token
135+
if (mustRevalidate) {
136+
console.info('MUST REVALIDATE')
118137
const jwtPayload = jwt.decode(securityHelper.extractJWT(req))
119138
try {
120139
const newToken = await WIKI.models.users.refreshToken(jwtPayload.id)
@@ -380,6 +399,9 @@ module.exports = {
380399
WIKI.events.inbound.on('reloadAuthStrategies', () => {
381400
WIKI.auth.activateStrategies()
382401
})
402+
WIKI.events.inbound.on('addAuthRevoke', (args) => {
403+
WIKI.auth.revokeUserTokens(args)
404+
})
383405
},
384406

385407
/**
@@ -410,5 +432,13 @@ module.exports = {
410432
manage: WIKI.auth.checkAccess(req.user, ['manage:system'], page)
411433
}
412434
}
435+
},
436+
437+
/**
438+
* Add user / group ID to JWT revokation list, forcing all requests to be validated against the latest permissions
439+
*/
440+
revokeUserTokens ({ id, kind = 'u' }) {
441+
console.info(Math.ceil(ms(WIKI.config.auth.tokenRenewal) / 1000))
442+
WIKI.auth.revokationList.set(`${kind}${_.toString(id)}`, true, Math.ceil(ms(WIKI.config.auth.tokenRenewal) / 1000))
413443
}
414444
}

server/graph/resolvers/group.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ module.exports = {
4242
throw new gql.GraphQLError('User is already assigned to group.')
4343
}
4444
await grp.$relatedQuery('users').relate(usr.id)
45+
46+
WIKI.auth.revokeUserTokens({ id: usr.id, kind: 'u' })
47+
WIKI.events.outbound.emit('addAuthRevoke', { id: usr.id, kind: 'u' })
48+
4549
return {
4650
responseResult: graphHelper.generateSuccess('User has been assigned to group.')
4751
}
@@ -62,8 +66,13 @@ module.exports = {
6266
},
6367
async delete(obj, args) {
6468
await WIKI.models.groups.query().deleteById(args.id)
69+
70+
WIKI.auth.revokeUserTokens({ id: args.id, kind: 'g' })
71+
WIKI.events.outbound.emit('addAuthRevoke', { id: args.id, kind: 'g' })
72+
6573
await WIKI.auth.reloadGroups()
6674
WIKI.events.outbound.emit('reloadGroups')
75+
6776
return {
6877
responseResult: graphHelper.generateSuccess('Group has been deleted.')
6978
}
@@ -78,6 +87,10 @@ module.exports = {
7887
throw new gql.GraphQLError('Invalid User ID')
7988
}
8089
await grp.$relatedQuery('users').unrelate().where('userId', usr.id)
90+
91+
WIKI.auth.revokeUserTokens({ id: usr.id, kind: 'u' })
92+
WIKI.events.outbound.emit('addAuthRevoke', { id: usr.id, kind: 'u' })
93+
8194
return {
8295
responseResult: graphHelper.generateSuccess('User has been unassigned from group.')
8396
}
@@ -95,6 +108,9 @@ module.exports = {
95108
pageRules: JSON.stringify(args.pageRules)
96109
}).where('id', args.id)
97110

111+
WIKI.auth.revokeUserTokens({ id: args.id, kind: 'g' })
112+
WIKI.events.outbound.emit('addAuthRevoke', { id: args.id, kind: 'g' })
113+
98114
await WIKI.auth.reloadGroups()
99115
WIKI.events.outbound.emit('reloadGroups')
100116

server/graph/resolvers/user.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ module.exports = {
7373
throw new WIKI.Error.UserDeleteProtected()
7474
}
7575
await WIKI.models.users.deleteUser(args.id, args.replaceId)
76+
77+
WIKI.auth.revokeUserTokens({ id: args.id, kind: 'u' })
78+
WIKI.events.outbound.emit('addAuthRevoke', { id: args.id, kind: 'u' })
79+
7680
return {
7781
responseResult: graphHelper.generateSuccess('User deleted successfully')
7882
}
@@ -124,6 +128,9 @@ module.exports = {
124128
}
125129
await WIKI.models.users.query().patch({ isActive: false }).findById(args.id)
126130

131+
WIKI.auth.revokeUserTokens({ id: args.id, kind: 'u' })
132+
WIKI.events.outbound.emit('addAuthRevoke', { id: args.id, kind: 'u' })
133+
127134
return {
128135
responseResult: graphHelper.generateSuccess('User deactivated successfully')
129136
}

0 commit comments

Comments
 (0)