@@ -102,8 +102,11 @@ test('viewer can search images (read-only)', (t) => {
|
||||
test('invites are admin-only (not viewer or operator)', (t) => {
|
||||
t.ok(roleAllows(Roles.admin, Methods.invitePeer))
|
||||
t.ok(roleAllows(Roles.admin, Methods.listInvites))
|
||||
t.ok(roleAllows(Roles.admin, Methods.deleteInvite))
|
||||
t.absent(roleAllows(Roles.viewer, Methods.invitePeer))
|
||||
t.absent(roleAllows(Roles.viewer, Methods.listInvites))
|
||||
t.absent(roleAllows(Roles.viewer, Methods.deleteInvite))
|
||||
t.absent(roleAllows(Roles.operator, Methods.invitePeer))
|
||||
t.absent(roleAllows(Roles.operator, Methods.listInvites))
|
||||
t.absent(roleAllows(Roles.operator, Methods.deleteInvite))
|
||||
})
|
||||
|
||||
@@ -16,6 +16,7 @@ const {
|
||||
redeemInvite,
|
||||
redeemCapability,
|
||||
mintCapability,
|
||||
deleteInvite,
|
||||
revokePeer,
|
||||
isPeerAllowed,
|
||||
isPeerRevoked,
|
||||
@@ -93,3 +94,14 @@ test('seed/capability auth modes bypass allowlist', (t) => {
|
||||
t.ok(isPeerAllowed(unknown, { authMode: 'capability' }))
|
||||
delete process.env.PEARDOCK_PEER_ALLOWLIST
|
||||
})
|
||||
|
||||
test('deleteInvite revokes capability jti so redeem fails', (t) => {
|
||||
const peerD = '55'.repeat(32)
|
||||
const cap = mintCapability({ role: 'operator', maxUses: 5, ttlHours: 1 })
|
||||
t.ok(listInvites().some((i) => i.jti === cap.jti))
|
||||
const res = deleteInvite({ jti: cap.jti })
|
||||
t.ok(res.success)
|
||||
t.ok(res.deleted.length > 0)
|
||||
t.absent(listInvites().some((i) => i.jti === cap.jti))
|
||||
t.exception(() => redeemCapability(cap.capability, peerD))
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user