From 6a02c328bc9f4df395ab95c157a032b8dc1faca8 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Wed, 15 Jul 2026 16:58:46 -0400 Subject: [PATCH] feat: delete tokens when password is successfully reset --- src/models/pnid.ts | 13 +++++++++++++ src/services/api/routes/v1/resetPassword.ts | 1 + src/services/grpc/api/v1/reset-password.ts | 1 + src/services/grpc/api/v2/reset-password.ts | 1 + src/services/nnas/routes/people.ts | 2 ++ src/types/mongoose/pnid.ts | 1 + 6 files changed, 19 insertions(+) diff --git a/src/models/pnid.ts b/src/models/pnid.ts index 142de96..e15dcf8 100644 --- a/src/models/pnid.ts +++ b/src/models/pnid.ts @@ -12,6 +12,10 @@ import { DeviceSchema } from '@/models/device'; import { uploadCDNAsset } from '@/util'; import { LOG_ERROR, LOG_WARN } from '@/logger'; import { config } from '@/config-manager'; +import { IndependentServiceToken } from '@/models/independent-service-token'; +import { NEXToken } from '@/models/nex-token'; +import { OAuthToken } from '@/models/oauth-token'; +import { PasswordResetToken } from '@/models/password-reset-token'; import type { IPNID, IPNIDMethods, PNIDModel } from '@/types/mongoose/pnid'; import type { PNIDPermissionFlag } from '@/types/common/permission-flags'; @@ -368,6 +372,15 @@ PNIDSchema.method('scrub', async function scrub() { await this.save(); }); +PNIDSchema.method('removeAllTokens', async function removeAllTokens() { + await Promise.all([ + IndependentServiceToken.deleteMany({ pid: this.pid }), + NEXToken.deleteMany({ pid: this.pid }), + OAuthToken.deleteMany({ pid: this.pid }), + PasswordResetToken.deleteMany({ pid: this.pid }) + ]); +}); + PNIDSchema.method('hasPermission', function hasPermission(flag: PNIDPermissionFlag): boolean { return (this.permissions & flag) === flag; }); diff --git a/src/services/api/routes/v1/resetPassword.ts b/src/services/api/routes/v1/resetPassword.ts index 5d83a88..5d4ebdf 100644 --- a/src/services/api/routes/v1/resetPassword.ts +++ b/src/services/api/routes/v1/resetPassword.ts @@ -173,6 +173,7 @@ router.post('/', async (request: express.Request, response: express.Response): P pnid.password = passwordHash; + await pnid.removeAllTokens(); await pnid.save(); response.json({ diff --git a/src/services/grpc/api/v1/reset-password.ts b/src/services/grpc/api/v1/reset-password.ts index 39058d8..2ed2e5c 100644 --- a/src/services/grpc/api/v1/reset-password.ts +++ b/src/services/grpc/api/v1/reset-password.ts @@ -89,6 +89,7 @@ export async function resetPassword(request: ResetPasswordRequest): Promise; markForDeletion(): void; scrub(): Promise; + removeAllTokens(): Promise; hasPermission(flag: PNIDPermissionFlag): boolean; addPermission(flag: PNIDPermissionFlag): void; clearPermission(flag: PNIDPermissionFlag): void;