Skip to content

Commit

Permalink
add rate limits to email routes
Browse files Browse the repository at this point in the history
  • Loading branch information
dholms committed Feb 3, 2024
1 parent 6f66197 commit c268df2
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 12 deletions.
12 changes: 12 additions & 0 deletions packages/pds/src/api/com/atproto/server/requestAccountDelete.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
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: 10,
calcKey: ({ auth }) => auth.credentials.did,
},
{
durationMs: HOUR,
points: 10,
},
],
auth: ctx.authVerifier.accessCheckTakedown,
handler: async ({ auth }) => {
const did = auth.credentials.did
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
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: 10,
calcKey: ({ auth }) => auth.credentials.did,
},
{
durationMs: HOUR,
points: 10,
},
],
auth: ctx.authVerifier.accessCheckTakedown,
handler: async ({ auth }) => {
const did = auth.credentials.did
Expand Down
12 changes: 12 additions & 0 deletions packages/pds/src/api/com/atproto/server/requestEmailUpdate.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
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: 10,
calcKey: ({ auth }) => auth.credentials.did,
},
{
durationMs: HOUR,
points: 10,
},
],
auth: ctx.authVerifier.accessCheckTakedown,
handler: async ({ auth }) => {
const did = auth.credentials.did
Expand Down
38 changes: 26 additions & 12 deletions packages/pds/src/api/com/atproto/server/requestPasswordReset.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
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: 10,
calcKey: ({ input }) => input.body.email.toLowerCase(),
},
{
durationMs: HOUR,
points: 10,
},
],
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 },
)
}
},
})
}

0 comments on commit c268df2

Please sign in to comment.