Skip to content

Commit b0aca7c

Browse files
committed
fix(audit-log): resolve user for password reset, add CREDENTIAL_SET_INVITATION_RESENT action
1 parent 241e56e commit b0aca7c

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

apps/sim/app/api/auth/reset-password/route.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import { db } from '@sim/db'
2+
import { user, verification } from '@sim/db/schema'
13
import { createLogger } from '@sim/logger'
4+
import { eq } from 'drizzle-orm'
25
import { type NextRequest, NextResponse } from 'next/server'
36
import { z } from 'zod'
47
import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log'
@@ -38,6 +41,30 @@ export async function POST(request: NextRequest) {
3841

3942
const { token, newPassword } = validationResult.data
4043

44+
// Resolve the user from the reset token before consuming it
45+
let actorId = 'unknown'
46+
let actorName: string | null = null
47+
let actorEmail: string | null = null
48+
try {
49+
const [verificationRecord] = await db
50+
.select({ value: verification.value })
51+
.from(verification)
52+
.where(eq(verification.identifier, `reset-password:${token}`))
53+
.limit(1)
54+
if (verificationRecord?.value) {
55+
actorId = verificationRecord.value
56+
const [userRecord] = await db
57+
.select({ name: user.name, email: user.email })
58+
.from(user)
59+
.where(eq(user.id, actorId))
60+
.limit(1)
61+
actorName = userRecord?.name ?? null
62+
actorEmail = userRecord?.email ?? null
63+
}
64+
} catch {
65+
logger.debug('Could not resolve user from reset token for audit')
66+
}
67+
4168
await auth.api.resetPassword({
4269
body: {
4370
newPassword,
@@ -47,7 +74,9 @@ export async function POST(request: NextRequest) {
4774
})
4875

4976
recordAudit({
50-
actorId: 'system',
77+
actorId,
78+
actorName,
79+
actorEmail,
5180
action: AuditAction.PASSWORD_RESET,
5281
resourceType: AuditResourceType.PASSWORD,
5382
description: 'Password reset completed',

apps/sim/app/api/credential-sets/[id]/invite/[invitationId]/route.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,12 @@ export async function POST(
153153
actorId: session.user.id,
154154
actorName: session.user.name,
155155
actorEmail: session.user.email,
156-
action: AuditAction.CREDENTIAL_SET_INVITATION_CREATED,
156+
action: AuditAction.CREDENTIAL_SET_INVITATION_RESENT,
157157
resourceType: AuditResourceType.CREDENTIAL_SET,
158158
resourceId: id,
159159
resourceName: result.set.name,
160160
description: `Resent credential set invitation to ${invitation.email}`,
161-
metadata: { invitationId, email: invitation.email, resend: true },
161+
metadata: { invitationId, email: invitation.email },
162162
request: req,
163163
})
164164

apps/sim/lib/audit/log.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export const AuditAction = {
3535
CREDENTIAL_SET_MEMBER_LEFT: 'credential_set_member.left',
3636
CREDENTIAL_SET_INVITATION_CREATED: 'credential_set_invitation.created',
3737
CREDENTIAL_SET_INVITATION_ACCEPTED: 'credential_set_invitation.accepted',
38+
CREDENTIAL_SET_INVITATION_RESENT: 'credential_set_invitation.resent',
3839
CREDENTIAL_SET_INVITATION_REVOKED: 'credential_set_invitation.revoked',
3940

4041
// Documents

packages/testing/src/mocks/audit.mock.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const auditMock = {
3030
CREDENTIAL_SET_MEMBER_LEFT: 'credential_set_member.left',
3131
CREDENTIAL_SET_INVITATION_CREATED: 'credential_set_invitation.created',
3232
CREDENTIAL_SET_INVITATION_ACCEPTED: 'credential_set_invitation.accepted',
33+
CREDENTIAL_SET_INVITATION_RESENT: 'credential_set_invitation.resent',
3334
CREDENTIAL_SET_INVITATION_REVOKED: 'credential_set_invitation.revoked',
3435
DOCUMENT_UPLOADED: 'document.uploaded',
3536
DOCUMENT_UPDATED: 'document.updated',

0 commit comments

Comments
 (0)