diff --git a/packages/pds/src/api/com/atproto/server/requestAccountDelete.ts b/packages/pds/src/api/com/atproto/server/requestAccountDelete.ts index ca895852f4f..8cd5d614127 100644 --- a/packages/pds/src/api/com/atproto/server/requestAccountDelete.ts +++ b/packages/pds/src/api/com/atproto/server/requestAccountDelete.ts @@ -1,9 +1,22 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { DAY, HOUR } from '@atproto/common' import { Server } from '../../../../lexicon' import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.com.atproto.server.requestAccountDelete({ + rateLimit: [ + { + durationMs: DAY, + points: 15, + calcKey: ({ auth }) => auth.credentials.did, + }, + { + durationMs: HOUR, + points: 5, + calcKey: ({ auth }) => auth.credentials.did, + }, + ], auth: ctx.authVerifier.accessCheckTakedown, handler: async ({ auth }) => { const did = auth.credentials.did diff --git a/packages/pds/src/api/com/atproto/server/requestEmailConfirmation.ts b/packages/pds/src/api/com/atproto/server/requestEmailConfirmation.ts index 97b2e53cc7a..b4cb6f366c0 100644 --- a/packages/pds/src/api/com/atproto/server/requestEmailConfirmation.ts +++ b/packages/pds/src/api/com/atproto/server/requestEmailConfirmation.ts @@ -1,9 +1,22 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { DAY, HOUR } from '@atproto/common' import { Server } from '../../../../lexicon' import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.com.atproto.server.requestEmailConfirmation({ + rateLimit: [ + { + durationMs: DAY, + points: 15, + calcKey: ({ auth }) => auth.credentials.did, + }, + { + durationMs: HOUR, + points: 5, + calcKey: ({ auth }) => auth.credentials.did, + }, + ], auth: ctx.authVerifier.accessCheckTakedown, handler: async ({ auth }) => { const did = auth.credentials.did diff --git a/packages/pds/src/api/com/atproto/server/requestEmailUpdate.ts b/packages/pds/src/api/com/atproto/server/requestEmailUpdate.ts index 5402fa6b887..a604b96baf2 100644 --- a/packages/pds/src/api/com/atproto/server/requestEmailUpdate.ts +++ b/packages/pds/src/api/com/atproto/server/requestEmailUpdate.ts @@ -1,9 +1,22 @@ import { InvalidRequestError } from '@atproto/xrpc-server' +import { DAY, HOUR } from '@atproto/common' import { Server } from '../../../../lexicon' import AppContext from '../../../../context' export default function (server: Server, ctx: AppContext) { server.com.atproto.server.requestEmailUpdate({ + rateLimit: [ + { + durationMs: DAY, + points: 15, + calcKey: ({ auth }) => auth.credentials.did, + }, + { + durationMs: HOUR, + points: 5, + calcKey: ({ auth }) => auth.credentials.did, + }, + ], auth: ctx.authVerifier.accessCheckTakedown, handler: async ({ auth }) => { const did = auth.credentials.did diff --git a/packages/pds/src/api/com/atproto/server/requestPasswordReset.ts b/packages/pds/src/api/com/atproto/server/requestPasswordReset.ts index 61b17ebb9a9..d5fb4333a58 100644 --- a/packages/pds/src/api/com/atproto/server/requestPasswordReset.ts +++ b/packages/pds/src/api/com/atproto/server/requestPasswordReset.ts @@ -1,20 +1,35 @@ +import { DAY, HOUR } from '@atproto/common' import AppContext from '../../../../context' import { Server } from '../../../../lexicon' export default function (server: Server, ctx: AppContext) { - server.com.atproto.server.requestPasswordReset(async ({ input }) => { - const email = input.body.email.toLowerCase() + server.com.atproto.server.requestPasswordReset({ + rateLimit: [ + { + durationMs: DAY, + points: 15, + calcKey: ({ input }) => input.body.email.toLowerCase(), + }, + { + durationMs: HOUR, + points: 5, + calcKey: ({ input }) => input.body.email.toLowerCase(), + }, + ], + handler: async ({ input }) => { + const email = input.body.email.toLowerCase() - const user = await ctx.services.account(ctx.db).getAccountByEmail(email) + const user = await ctx.services.account(ctx.db).getAccountByEmail(email) - if (user) { - const token = await ctx.services - .account(ctx.db) - .createEmailToken(user.did, 'reset_password') - await ctx.mailer.sendResetPassword( - { handle: user.handle, token }, - { to: user.email }, - ) - } + if (user) { + const token = await ctx.services + .account(ctx.db) + .createEmailToken(user.did, 'reset_password') + await ctx.mailer.sendResetPassword( + { handle: user.handle, token }, + { to: user.email }, + ) + } + }, }) }