@atproto/pds 0.5.35 → 0.5.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +59 -0
- package/dist/account-manager/account-manager.d.ts +59 -8
- package/dist/account-manager/account-manager.d.ts.map +1 -1
- package/dist/account-manager/account-manager.js +154 -21
- package/dist/account-manager/account-manager.js.map +1 -1
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.d.ts +9 -0
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.d.ts.map +1 -0
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.js +16 -0
- package/dist/account-manager/db/migrations/008-account-email-auth-factor.js.map +1 -0
- package/dist/account-manager/db/migrations/index.d.ts +2 -0
- package/dist/account-manager/db/migrations/index.d.ts.map +1 -1
- package/dist/account-manager/db/migrations/index.js +2 -0
- package/dist/account-manager/db/migrations/index.js.map +1 -1
- package/dist/account-manager/db/schema/account-email-auth-factor.d.ts +20 -0
- package/dist/account-manager/db/schema/account-email-auth-factor.d.ts.map +1 -0
- package/dist/account-manager/db/schema/account-email-auth-factor.js +2 -0
- package/dist/account-manager/db/schema/account-email-auth-factor.js.map +1 -0
- package/dist/account-manager/db/schema/email-token.d.ts +1 -1
- package/dist/account-manager/db/schema/email-token.d.ts.map +1 -1
- package/dist/account-manager/db/schema/email-token.js.map +1 -1
- package/dist/account-manager/db/schema/index.d.ts +2 -1
- package/dist/account-manager/db/schema/index.d.ts.map +1 -1
- package/dist/account-manager/db/schema/index.js.map +1 -1
- package/dist/account-manager/helpers/account-device.d.ts +4 -2
- package/dist/account-manager/helpers/account-device.d.ts.map +1 -1
- package/dist/account-manager/helpers/account.d.ts +4 -1
- package/dist/account-manager/helpers/account.d.ts.map +1 -1
- package/dist/account-manager/helpers/account.js +4 -1
- package/dist/account-manager/helpers/account.js.map +1 -1
- package/dist/account-manager/helpers/email-auth-factor.d.ts +46 -0
- package/dist/account-manager/helpers/email-auth-factor.d.ts.map +1 -0
- package/dist/account-manager/helpers/email-auth-factor.js +77 -0
- package/dist/account-manager/helpers/email-auth-factor.js.map +1 -0
- package/dist/account-manager/helpers/invite.d.ts +1 -0
- package/dist/account-manager/helpers/invite.d.ts.map +1 -1
- package/dist/account-manager/helpers/token.d.ts +4 -2
- package/dist/account-manager/helpers/token.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.d.ts +4 -2
- package/dist/account-manager/oauth-store.d.ts.map +1 -1
- package/dist/account-manager/oauth-store.js +48 -14
- package/dist/account-manager/oauth-store.js.map +1 -1
- package/dist/actor-store/actor-store-reader.d.ts +3 -1
- package/dist/actor-store/actor-store-reader.d.ts.map +1 -1
- package/dist/actor-store/actor-store-reader.js +72 -5
- package/dist/actor-store/actor-store-reader.js.map +1 -1
- package/dist/actor-store/actor-store-transactor.d.ts +3 -1
- package/dist/actor-store/actor-store-transactor.d.ts.map +1 -1
- package/dist/actor-store/actor-store-transactor.js +6 -3
- package/dist/actor-store/actor-store-transactor.js.map +1 -1
- package/dist/actor-store/actor-store-writer.js +67 -3
- package/dist/actor-store/actor-store-writer.js.map +1 -1
- package/dist/actor-store/actor-store.d.ts +2 -2
- package/dist/actor-store/actor-store.d.ts.map +1 -1
- package/dist/actor-store/actor-store.js +125 -25
- package/dist/actor-store/actor-store.js.map +1 -1
- package/dist/api/com/atproto/admin/updateAccountEmail.d.ts.map +1 -1
- package/dist/api/com/atproto/admin/updateAccountEmail.js +1 -4
- package/dist/api/com/atproto/admin/updateAccountEmail.js.map +1 -1
- package/dist/api/com/atproto/repo/importRepo.d.ts.map +1 -1
- package/dist/api/com/atproto/repo/importRepo.js +7 -2
- package/dist/api/com/atproto/repo/importRepo.js.map +1 -1
- package/dist/api/com/atproto/server/createAccount.js +7 -2
- package/dist/api/com/atproto/server/createAccount.js.map +1 -1
- package/dist/api/com/atproto/server/createSession.d.ts.map +1 -1
- package/dist/api/com/atproto/server/createSession.js +8 -1
- package/dist/api/com/atproto/server/createSession.js.map +1 -1
- package/dist/api/com/atproto/server/getSession.d.ts.map +1 -1
- package/dist/api/com/atproto/server/getSession.js +1 -0
- package/dist/api/com/atproto/server/getSession.js.map +1 -1
- package/dist/api/com/atproto/server/refreshSession.d.ts.map +1 -1
- package/dist/api/com/atproto/server/refreshSession.js +1 -0
- package/dist/api/com/atproto/server/refreshSession.js.map +1 -1
- package/dist/api/com/atproto/server/updateEmail.d.ts.map +1 -1
- package/dist/api/com/atproto/server/updateEmail.js +45 -1
- package/dist/api/com/atproto/server/updateEmail.js.map +1 -1
- package/dist/api/com/atproto/sync/getRecord.d.ts.map +1 -1
- package/dist/api/com/atproto/sync/getRecord.js +4 -2
- package/dist/api/com/atproto/sync/getRecord.js.map +1 -1
- package/dist/api/com/atproto/sync/getRepo.d.ts.map +1 -1
- package/dist/api/com/atproto/sync/getRepo.js +3 -1
- package/dist/api/com/atproto/sync/getRepo.js.map +1 -1
- package/dist/auth-verifier.d.ts +1 -0
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/auth-verifier.js +1 -0
- package/dist/auth-verifier.js.map +1 -1
- package/dist/config/secrets.d.ts +2 -1
- package/dist/config/secrets.d.ts.map +1 -1
- package/dist/config/secrets.js +25 -18
- package/dist/config/secrets.js.map +1 -1
- package/dist/context.d.ts +4 -4
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +42 -20
- package/dist/context.js.map +1 -1
- package/dist/db/db.d.ts +5 -3
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +13 -7
- package/dist/db/db.js.map +1 -1
- package/dist/disk-blobstore.d.ts +3 -2
- package/dist/disk-blobstore.d.ts.map +1 -1
- package/dist/disk-blobstore.js +13 -4
- package/dist/disk-blobstore.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authFullApp.defs.js +10 -0
- package/dist/lexicons/app/bsky/authFullApp.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/authManageNotifications.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/authManageNotifications.defs.js +1 -0
- package/dist/lexicons/app/bsky/authManageNotifications.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/defs.defs.d.ts +8 -0
- package/dist/lexicons/app/bsky/feed/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/defs.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/defs.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/getListFeed.defs.d.ts +4 -0
- package/dist/lexicons/app/bsky/feed/getListFeed.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/getListFeed.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/getListFeed.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.d.ts +6 -0
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/getQuotes.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/feed/getTimeline.defs.d.ts +4 -0
- package/dist/lexicons/app/bsky/feed/getTimeline.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/feed/getTimeline.defs.js +2 -0
- package/dist/lexicons/app/bsky/feed/getTimeline.defs.js.map +1 -1
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.d.ts +3 -0
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.d.ts +299 -0
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.d.ts.map +1 -0
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.js +231 -0
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.defs.js.map +1 -0
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.js +6 -0
- package/dist/lexicons/app/bsky/notification/getGroupedNotifications.js.map +1 -0
- package/dist/lexicons/app/bsky/notification.d.ts +1 -0
- package/dist/lexicons/app/bsky/notification.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/notification.js +1 -0
- package/dist/lexicons/app/bsky/notification.js.map +1 -1
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.d.ts +3 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.d.ts +65 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.js +49 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.js +6 -0
- package/dist/lexicons/tools/ozone/inbox/appealActionedSubject.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.d.ts +2 -0
- package/dist/lexicons/tools/ozone/inbox/defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.d.ts +89 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.js +73 -0
- package/dist/lexicons/tools/ozone/inbox/defs.defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox/defs.js +5 -0
- package/dist/lexicons/tools/ozone/inbox/defs.js.map +1 -0
- package/dist/lexicons/tools/ozone/inbox.d.ts +3 -0
- package/dist/lexicons/tools/ozone/inbox.d.ts.map +1 -0
- package/dist/lexicons/tools/ozone/inbox.js +6 -0
- package/dist/lexicons/tools/ozone/inbox.js.map +1 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts +2 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.js +2 -0
- package/dist/lexicons/tools/ozone/queue/createQueue.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts +4 -0
- package/dist/lexicons/tools/ozone/queue/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/defs.defs.js +2 -0
- package/dist/lexicons/tools/ozone/queue/defs.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts +3 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js +3 -0
- package/dist/lexicons/tools/ozone/queue/updateQueue.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/defs.defs.d.ts +89 -9
- package/dist/lexicons/tools/ozone/report/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/defs.defs.js +20 -0
- package/dist/lexicons/tools/ozone/report/defs.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.d.ts +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.js +1 -1
- package/dist/lexicons/tools/ozone/report/getLiveStats.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.d.ts +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.js +1 -1
- package/dist/lexicons/tools/ozone/report/refreshStats.defs.js.map +1 -1
- package/dist/lexicons/tools/ozone.d.ts +1 -0
- package/dist/lexicons/tools/ozone.d.ts.map +1 -1
- package/dist/lexicons/tools/ozone.js +1 -0
- package/dist/lexicons/tools/ozone.js.map +1 -1
- package/dist/mailer/index.d.ts +7 -1
- package/dist/mailer/index.d.ts.map +1 -1
- package/dist/mailer/index.js +12 -1
- package/dist/mailer/index.js.map +1 -1
- package/dist/mailer/templates/sign-in-auth-factor.js +43 -0
- package/dist/mailer/templates/sign-in-auth-factor.js.map +1 -0
- package/dist/mailer/templates.d.ts +2 -0
- package/dist/mailer/templates.d.ts.map +1 -1
- package/dist/mailer/templates.js +1 -0
- package/dist/mailer/templates.js.map +1 -1
- package/dist/pipethrough.d.ts.map +1 -1
- package/dist/pipethrough.js +9 -2
- package/dist/pipethrough.js.map +1 -1
- package/package.json +21 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/account-manager/helpers/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { DAY } from '@atproto/common'\nimport {\n type AtIdentifierString,\n type DatetimeString,\n type DidString,\n type HandleString,\n currentDatetimeString,\n isDidIdentifier,\n} from '@atproto/lex'\nimport { isErrUniqueViolation, notSoftDeletedClause } from '../../db/index.js'\nimport type { com } from '../../lexicons/index.js'\nimport type { AccountDb, ActorEntry } from '../db/index.js'\n\nexport class UserAlreadyExistsError extends Error {\n name = 'UserAlreadyExistsError'\n constructor(\n message = 'This email address is already in use, please use a different email.',\n options?: ErrorOptions,\n ) {\n super(message, options)\n }\n}\n\nexport type ActorAccount = ActorEntry & {\n email: string | null\n emailConfirmedAt: string | null\n invitesDisabled: 0 | 1 | null\n}\n\nexport type AvailabilityFlags = {\n includeTakenDown?: boolean\n includeDeactivated?: boolean\n}\n\nexport enum AccountStatus {\n Active = 'active',\n Takendown = 'takendown',\n Suspended = 'suspended',\n Deleted = 'deleted',\n Deactivated = 'deactivated',\n}\n\nexport const selectAccountQB = (db: AccountDb, flags?: AvailabilityFlags) => {\n const { includeTakenDown = false, includeDeactivated = false } = flags ?? {}\n const { ref } = db.db.dynamic\n return db.db\n .selectFrom('actor')\n .leftJoin('account', 'actor.did', 'account.did')\n .$if(!includeTakenDown, (qb) =>\n qb.where(notSoftDeletedClause(ref('actor'))),\n )\n .$if(!includeDeactivated, (qb) =>\n qb.where('actor.deactivatedAt', 'is', null),\n )\n .select([\n 'actor.did',\n 'actor.handle',\n 'actor.createdAt',\n 'actor.takedownRef',\n 'actor.deactivatedAt',\n 'actor.deleteAfter',\n 'account.email',\n 'account.emailConfirmedAt',\n 'account.invitesDisabled',\n ])\n}\n\nexport const getAccount = async (\n db: AccountDb,\n handleOrDid: AtIdentifierString,\n flags?: AvailabilityFlags,\n): Promise<ActorAccount | null> => {\n const found = await selectAccountQB(db, flags)\n .where((eb) => {\n if (isDidIdentifier(handleOrDid)) {\n return eb('actor.did', '=', handleOrDid)\n } else {\n return eb('actor.handle', '=', handleOrDid)\n }\n })\n .executeTakeFirst()\n return found || null\n}\n\nexport const getAccounts = async (\n db: AccountDb,\n dids: DidString[],\n flags?: AvailabilityFlags,\n): Promise<Map<string, ActorAccount>> => {\n const results = new Map<string, ActorAccount>()\n\n if (!dids.length) {\n return results\n }\n\n const accounts = await selectAccountQB(db, flags)\n .where('actor.did', 'in', dids)\n .execute()\n\n accounts.forEach((account) => {\n results.set(account.did, account)\n })\n\n return results\n}\n\nexport const getAccountByEmail = async (\n db: AccountDb,\n email: string,\n flags?: AvailabilityFlags,\n): Promise<ActorAccount | null> => {\n const found = await selectAccountQB(db, flags)\n .where('email', '=', email.toLowerCase())\n .executeTakeFirst()\n return found || null\n}\n\nexport const registerActor = async (\n db: AccountDb,\n opts: {\n did: DidString\n handle: HandleString\n deactivated?: boolean\n },\n) => {\n const { did, handle, deactivated } = opts\n const now = Date.now()\n const createdAt = new Date(now).toISOString()\n const [registered] = await db.executeWithRetry(\n db.db\n .insertInto('actor')\n .values({\n did,\n handle,\n createdAt,\n deactivatedAt: deactivated ? createdAt : null,\n deleteAfter: deactivated ? new Date(now + 3 * DAY).toISOString() : null,\n })\n .onConflict((oc) => oc.doNothing())\n .returning('did'),\n )\n if (!registered) {\n throw new UserAlreadyExistsError()\n }\n}\n\nexport const registerAccount = async (\n db: AccountDb,\n opts: {\n did: string\n email: string\n passwordScrypt: string\n },\n) => {\n const { did, email, passwordScrypt } = opts\n const [registered] = await db.executeWithRetry(\n db.db\n .insertInto('account')\n .values({\n did,\n email: email.toLowerCase(),\n passwordScrypt,\n })\n .onConflict((oc) => oc.doNothing())\n .returning('did'),\n )\n if (!registered) {\n throw new UserAlreadyExistsError()\n }\n}\n\nexport const deleteAccount = async (\n db: AccountDb,\n did: DidString,\n): Promise<void> => {\n // Not done in transaction because it would be too long, prone to contention.\n // Also, this can safely be run multiple times if it fails.\n await db.executeWithRetry(\n db.db.deleteFrom('repo_root').where('did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('email_token').where('did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('refresh_token').where('did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('account').where('account.did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('actor').where('actor.did', '=', did),\n )\n}\n\nexport const updateHandle = async (\n db: AccountDb,\n did: DidString,\n handle: HandleString,\n) => {\n // No-op if the handle is the same, but still returns 1 row affected, so that\n // it can be used to check for existence of the account.\n const [res] = await db.executeWithRetry(\n db.db\n .updateTable('actor')\n .set({ handle })\n .where('did', '=', did)\n .where(({ not, exists }) =>\n not(\n exists(\n db.db\n .selectFrom('actor')\n .where('handle', '=', handle)\n .where('did', '!=', did)\n .selectAll(),\n ),\n ),\n ),\n )\n if (res.numUpdatedRows < 1) {\n throw new UserAlreadyExistsError(\n 'Handle is already in use, please choose a different handle.',\n )\n }\n}\n\nexport const updateEmail = async (\n db: AccountDb,\n did: DidString,\n email: string,\n) => {\n try {\n await db.executeWithRetry(\n db.db\n .updateTable('account')\n .set({\n email: email.toLowerCase(),\n emailConfirmedAt: null,\n })\n .where('did', '=', did),\n )\n } catch (err) {\n if (isErrUniqueViolation(err)) {\n throw new UserAlreadyExistsError()\n }\n throw err\n }\n}\n\nexport const setEmailConfirmedAt = async (\n db: AccountDb,\n did: DidString,\n emailConfirmedAt: DatetimeString,\n) => {\n await db.executeWithRetry(\n db.db\n .updateTable('account')\n .set({ emailConfirmedAt })\n .where('did', '=', did),\n )\n}\n\nexport const getAccountAdminStatus = async (\n db: AccountDb,\n did: DidString,\n): Promise<{\n takedown: com.atproto.admin.defs.StatusAttr\n deactivated: com.atproto.admin.defs.StatusAttr\n} | null> => {\n const res = await db.db\n .selectFrom('actor')\n .select(['takedownRef', 'deactivatedAt'])\n .where('did', '=', did)\n .executeTakeFirst()\n if (!res) return null\n const takedown = res.takedownRef\n ? { applied: true, ref: res.takedownRef }\n : { applied: false }\n const deactivated = res.deactivatedAt ? { applied: true } : { applied: false }\n return { takedown, deactivated }\n}\n\nexport const updateAccountTakedownStatus = async (\n db: AccountDb,\n did: DidString,\n takedown: com.atproto.admin.defs.StatusAttr,\n) => {\n const takedownRef = takedown.applied\n ? (takedown.ref ?? currentDatetimeString())\n : null\n await db.executeWithRetry(\n db.db.updateTable('actor').set({ takedownRef }).where('did', '=', did),\n )\n}\n\nexport const deactivateAccount = async (\n db: AccountDb,\n did: DidString,\n deleteAfter: string | null,\n): Promise<boolean> => {\n const [res] = await db.executeWithRetry(\n db.db\n .updateTable('actor')\n .set({\n deactivatedAt: currentDatetimeString(),\n deleteAfter,\n })\n .where('did', '=', did),\n )\n\n return res.numUpdatedRows > 0\n}\n\nexport const activateAccount = async (\n db: AccountDb,\n did: DidString,\n flags?: AvailabilityFlags,\n): Promise<boolean> => {\n const { includeTakenDown = false, includeDeactivated = true } = flags ?? {}\n const { ref } = db.db.dynamic\n\n const [res] = await db.executeWithRetry(\n db.db\n .updateTable('actor')\n .set({\n deactivatedAt: null,\n deleteAfter: null,\n })\n .where('did', '=', did)\n .$if(!includeTakenDown, (q) =>\n q.where(notSoftDeletedClause(ref('actor'))),\n )\n .$if(!includeDeactivated, (q) =>\n q.where('actor.deactivatedAt', 'is not', null),\n ),\n )\n\n return res.numUpdatedRows > 0\n}\n\nexport const formatAccountStatus = (\n account: null | {\n takedownRef: string | null\n deactivatedAt: string | null\n },\n) => {\n if (!account) {\n return { active: false, status: AccountStatus.Deleted } as const\n } else if (account.takedownRef) {\n return { active: false, status: AccountStatus.Takendown } as const\n } else if (account.deactivatedAt) {\n return { active: false, status: AccountStatus.Deactivated } as const\n } else {\n return { active: true, status: undefined } as const\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../src/account-manager/helpers/account.ts"],"names":[],"mappings":"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","sourcesContent":["import { DAY } from '@atproto/common'\nimport {\n type AtIdentifierString,\n type DatetimeString,\n type DidString,\n type HandleString,\n currentDatetimeString,\n isDidIdentifier,\n} from '@atproto/lex'\nimport { isErrUniqueViolation, notSoftDeletedClause } from '../../db/index.js'\nimport type { com } from '../../lexicons/index.js'\nimport type { AccountDb, ActorEntry } from '../db/index.js'\n\nexport class UserAlreadyExistsError extends Error {\n name = 'UserAlreadyExistsError'\n constructor(\n message = 'This email address is already in use, please use a different email.',\n options?: ErrorOptions,\n ) {\n super(message, options)\n }\n}\n\nexport type ActorAccount = ActorEntry & {\n email: string | null\n emailConfirmedAt: string | null\n emailAuthFactorAt: string | null\n invitesDisabled: 0 | 1 | null\n}\n\nexport type AvailabilityFlags = {\n includeTakenDown?: boolean\n includeDeactivated?: boolean\n}\n\nexport enum AccountStatus {\n Active = 'active',\n Takendown = 'takendown',\n Suspended = 'suspended',\n Deleted = 'deleted',\n Deactivated = 'deactivated',\n}\n\nexport const selectAccountQB = (db: AccountDb, flags?: AvailabilityFlags) => {\n const { includeTakenDown = false, includeDeactivated = false } = flags ?? {}\n const { ref } = db.db.dynamic\n return db.db\n .selectFrom('actor')\n .leftJoin('account', 'actor.did', 'account.did')\n .leftJoin(\n 'account_email_auth_factor',\n 'actor.did',\n 'account_email_auth_factor.did',\n )\n .$if(!includeTakenDown, (qb) =>\n qb.where(notSoftDeletedClause(ref('actor'))),\n )\n .$if(!includeDeactivated, (qb) =>\n qb.where('actor.deactivatedAt', 'is', null),\n )\n .select([\n 'actor.did',\n 'actor.handle',\n 'actor.createdAt',\n 'actor.takedownRef',\n 'actor.deactivatedAt',\n 'actor.deleteAfter',\n 'account.email',\n 'account.emailConfirmedAt',\n 'account.invitesDisabled',\n 'account_email_auth_factor.emailAuthFactorEnabledAt as emailAuthFactorAt',\n ])\n}\n\nexport const getAccount = async (\n db: AccountDb,\n handleOrDid: AtIdentifierString,\n flags?: AvailabilityFlags,\n): Promise<ActorAccount | null> => {\n const found = await selectAccountQB(db, flags)\n .where((eb) => {\n if (isDidIdentifier(handleOrDid)) {\n return eb('actor.did', '=', handleOrDid)\n } else {\n return eb('actor.handle', '=', handleOrDid)\n }\n })\n .executeTakeFirst()\n return found || null\n}\n\nexport const getAccounts = async (\n db: AccountDb,\n dids: DidString[],\n flags?: AvailabilityFlags,\n): Promise<Map<string, ActorAccount>> => {\n const results = new Map<string, ActorAccount>()\n\n if (!dids.length) {\n return results\n }\n\n const accounts = await selectAccountQB(db, flags)\n .where('actor.did', 'in', dids)\n .execute()\n\n accounts.forEach((account) => {\n results.set(account.did, account)\n })\n\n return results\n}\n\nexport const getAccountByEmail = async (\n db: AccountDb,\n email: string,\n flags?: AvailabilityFlags,\n): Promise<ActorAccount | null> => {\n const found = await selectAccountQB(db, flags)\n .where('email', '=', email.toLowerCase())\n .executeTakeFirst()\n return found || null\n}\n\nexport const registerActor = async (\n db: AccountDb,\n opts: {\n did: DidString\n handle: HandleString\n deactivated?: boolean\n },\n) => {\n const { did, handle, deactivated } = opts\n const now = Date.now()\n const createdAt = new Date(now).toISOString()\n const [registered] = await db.executeWithRetry(\n db.db\n .insertInto('actor')\n .values({\n did,\n handle,\n createdAt,\n deactivatedAt: deactivated ? createdAt : null,\n deleteAfter: deactivated ? new Date(now + 3 * DAY).toISOString() : null,\n })\n .onConflict((oc) => oc.doNothing())\n .returning('did'),\n )\n if (!registered) {\n throw new UserAlreadyExistsError(\n 'Handle is already in use, please choose a different handle.',\n )\n }\n}\n\nexport const registerAccount = async (\n db: AccountDb,\n opts: {\n did: string\n email: string\n passwordScrypt: string\n },\n) => {\n const { did, email, passwordScrypt } = opts\n const [registered] = await db.executeWithRetry(\n db.db\n .insertInto('account')\n .values({\n did,\n email: email.toLowerCase(),\n passwordScrypt,\n })\n .onConflict((oc) => oc.doNothing())\n .returning('did'),\n )\n if (!registered) {\n throw new UserAlreadyExistsError()\n }\n}\n\nexport const deleteAccount = async (\n db: AccountDb,\n did: DidString,\n): Promise<void> => {\n // Not done in transaction because it would be too long, prone to contention.\n // Also, this can safely be run multiple times if it fails.\n await db.executeWithRetry(\n db.db.deleteFrom('repo_root').where('did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('email_token').where('did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('account_email_auth_factor').where('did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('refresh_token').where('did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('account').where('account.did', '=', did),\n )\n await db.executeWithRetry(\n db.db.deleteFrom('actor').where('actor.did', '=', did),\n )\n}\n\nexport const updateHandle = async (\n db: AccountDb,\n did: DidString,\n handle: HandleString,\n) => {\n // No-op if the handle is the same, but still returns 1 row affected, so that\n // it can be used to check for existence of the account.\n const [res] = await db.executeWithRetry(\n db.db\n .updateTable('actor')\n .set({ handle })\n .where('did', '=', did)\n .where(({ not, exists }) =>\n not(\n exists(\n db.db\n .selectFrom('actor')\n .where('handle', '=', handle)\n .where('did', '!=', did)\n .selectAll(),\n ),\n ),\n ),\n )\n if (res.numUpdatedRows < 1) {\n throw new UserAlreadyExistsError(\n 'Handle is already in use, please choose a different handle.',\n )\n }\n}\n\nexport const updateEmail = async (\n db: AccountDb,\n did: DidString,\n email: string,\n) => {\n try {\n await db.executeWithRetry(\n db.db\n .updateTable('account')\n .set({\n email: email.toLowerCase(),\n emailConfirmedAt: null,\n })\n .where('did', '=', did),\n )\n } catch (err) {\n if (isErrUniqueViolation(err)) {\n throw new UserAlreadyExistsError()\n }\n throw err\n }\n}\n\nexport const setEmailConfirmedAt = async (\n db: AccountDb,\n did: DidString,\n emailConfirmedAt: DatetimeString,\n) => {\n await db.executeWithRetry(\n db.db\n .updateTable('account')\n .set({ emailConfirmedAt })\n .where('did', '=', did),\n )\n}\n\nexport const getAccountAdminStatus = async (\n db: AccountDb,\n did: DidString,\n): Promise<{\n takedown: com.atproto.admin.defs.StatusAttr\n deactivated: com.atproto.admin.defs.StatusAttr\n} | null> => {\n const res = await db.db\n .selectFrom('actor')\n .select(['takedownRef', 'deactivatedAt'])\n .where('did', '=', did)\n .executeTakeFirst()\n if (!res) return null\n const takedown = res.takedownRef\n ? { applied: true, ref: res.takedownRef }\n : { applied: false }\n const deactivated = res.deactivatedAt ? { applied: true } : { applied: false }\n return { takedown, deactivated }\n}\n\nexport const updateAccountTakedownStatus = async (\n db: AccountDb,\n did: DidString,\n takedown: com.atproto.admin.defs.StatusAttr,\n) => {\n const takedownRef = takedown.applied\n ? (takedown.ref ?? currentDatetimeString())\n : null\n await db.executeWithRetry(\n db.db.updateTable('actor').set({ takedownRef }).where('did', '=', did),\n )\n}\n\nexport const deactivateAccount = async (\n db: AccountDb,\n did: DidString,\n deleteAfter: string | null,\n): Promise<boolean> => {\n const [res] = await db.executeWithRetry(\n db.db\n .updateTable('actor')\n .set({\n deactivatedAt: currentDatetimeString(),\n deleteAfter,\n })\n .where('did', '=', did),\n )\n\n return res.numUpdatedRows > 0\n}\n\nexport const activateAccount = async (\n db: AccountDb,\n did: DidString,\n flags?: AvailabilityFlags,\n): Promise<boolean> => {\n const { includeTakenDown = false, includeDeactivated = true } = flags ?? {}\n const { ref } = db.db.dynamic\n\n const [res] = await db.executeWithRetry(\n db.db\n .updateTable('actor')\n .set({\n deactivatedAt: null,\n deleteAfter: null,\n })\n .where('did', '=', did)\n .$if(!includeTakenDown, (q) =>\n q.where(notSoftDeletedClause(ref('actor'))),\n )\n .$if(!includeDeactivated, (q) =>\n q.where('actor.deactivatedAt', 'is not', null),\n ),\n )\n\n return res.numUpdatedRows > 0\n}\n\nexport const formatAccountStatus = (\n account: null | {\n takedownRef: string | null\n deactivatedAt: string | null\n },\n) => {\n if (!account) {\n return { active: false, status: AccountStatus.Deleted } as const\n } else if (account.takedownRef) {\n return { active: false, status: AccountStatus.Takendown } as const\n } else if (account.deactivatedAt) {\n return { active: false, status: AccountStatus.Deactivated } as const\n } else {\n return { active: true, status: undefined } as const\n }\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type DatetimeString } from '@atproto/lex';
|
|
2
|
+
import type { AccountDb } from '../db/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Enables the email auth factor for `did`, provided `email` is still the
|
|
5
|
+
* account's address and is still confirmed.
|
|
6
|
+
*
|
|
7
|
+
* @NOTE `INSERT … SELECT` rather than a read followed by a write: the factor
|
|
8
|
+
* lives in its own table, so that guard would otherwise be a separate query
|
|
9
|
+
* with a window in between. Selecting *from* `account` keeps it a single
|
|
10
|
+
* statement, so it holds atomically against a concurrent email change.
|
|
11
|
+
*
|
|
12
|
+
* Enabling an already-enabled factor is idempotent and keeps the original
|
|
13
|
+
* timestamp: the conflict clause re-assigns the column to itself, which touches
|
|
14
|
+
* the row so `RETURNING` still yields it without moving the clock. `DO NOTHING`
|
|
15
|
+
* would skip the row and return nothing, making "already enabled" and "guard
|
|
16
|
+
* failed" indistinguishable.
|
|
17
|
+
*
|
|
18
|
+
* @returns the stored timestamp, so callers mirror what the database actually
|
|
19
|
+
* holds rather than a value they minted themselves. `null` means the guard
|
|
20
|
+
* failed — no row was written and the account is unchanged.
|
|
21
|
+
*/
|
|
22
|
+
export declare const enable: (db: AccountDb, did: string, email: string) => Promise<DatetimeString | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Disables the email auth factor for `did`, provided `email` is still the
|
|
25
|
+
* account's address. Disabling an already-disabled factor is a no-op.
|
|
26
|
+
*
|
|
27
|
+
* Unlike enabling there is no `emailConfirmedAt` guard — turning a factor off
|
|
28
|
+
* never needs the address to be confirmed.
|
|
29
|
+
*
|
|
30
|
+
* @returns whether a row was removed.
|
|
31
|
+
*/
|
|
32
|
+
export declare const disable: (db: AccountDb, did: string, email: string) => Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Drops the email auth factor for `did` unconditionally.
|
|
35
|
+
*
|
|
36
|
+
* For the paths where the account's own state makes the factor invalid rather
|
|
37
|
+
* than the user asking to turn it off: an email change (2FA on an unconfirmed
|
|
38
|
+
* address can lock the user out) and account deletion. Callers changing the
|
|
39
|
+
* email must do so in the same transaction as the email write, since the two
|
|
40
|
+
* are no longer one row.
|
|
41
|
+
*
|
|
42
|
+
* TODO: Store unconfirmed emails separately, see note in context.ts — at which
|
|
43
|
+
* point changing an email no longer needs to disable 2FA at all.
|
|
44
|
+
*/
|
|
45
|
+
export declare const deleteForDid: (db: AccountDb, did: string) => Promise<void>;
|
|
46
|
+
//# sourceMappingURL=email-auth-factor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-auth-factor.d.ts","sourceRoot":"","sources":["../../../src/account-manager/helpers/email-auth-factor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAyB,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,MAAM,OACb,SAAS,OACR,MAAM,SACJ,MAAM,KACZ,OAAO,CAAC,cAAc,GAAG,IAAI,CA+B/B,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,OAAO,OACd,SAAS,OACR,MAAM,SACJ,MAAM,KACZ,OAAO,CAAC,OAAO,CAgBjB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,OACnB,SAAS,OACR,MAAM,KACV,OAAO,CAAC,IAAI,CAId,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { currentDatetimeString } from '@atproto/lex';
|
|
2
|
+
/**
|
|
3
|
+
* Enables the email auth factor for `did`, provided `email` is still the
|
|
4
|
+
* account's address and is still confirmed.
|
|
5
|
+
*
|
|
6
|
+
* @NOTE `INSERT … SELECT` rather than a read followed by a write: the factor
|
|
7
|
+
* lives in its own table, so that guard would otherwise be a separate query
|
|
8
|
+
* with a window in between. Selecting *from* `account` keeps it a single
|
|
9
|
+
* statement, so it holds atomically against a concurrent email change.
|
|
10
|
+
*
|
|
11
|
+
* Enabling an already-enabled factor is idempotent and keeps the original
|
|
12
|
+
* timestamp: the conflict clause re-assigns the column to itself, which touches
|
|
13
|
+
* the row so `RETURNING` still yields it without moving the clock. `DO NOTHING`
|
|
14
|
+
* would skip the row and return nothing, making "already enabled" and "guard
|
|
15
|
+
* failed" indistinguishable.
|
|
16
|
+
*
|
|
17
|
+
* @returns the stored timestamp, so callers mirror what the database actually
|
|
18
|
+
* holds rather than a value they minted themselves. `null` means the guard
|
|
19
|
+
* failed — no row was written and the account is unchanged.
|
|
20
|
+
*/
|
|
21
|
+
export const enable = async (db, did, email) => {
|
|
22
|
+
const emailAuthFactorEnabledAt = currentDatetimeString();
|
|
23
|
+
const [row] = await db.executeWithRetry(db.db
|
|
24
|
+
.insertInto('account_email_auth_factor')
|
|
25
|
+
.columns(['did', 'emailAuthFactorEnabledAt'])
|
|
26
|
+
.expression((eb) => eb
|
|
27
|
+
.selectFrom('account')
|
|
28
|
+
.select((eb2) => [
|
|
29
|
+
'account.did',
|
|
30
|
+
eb2.val(emailAuthFactorEnabledAt).as('emailAuthFactorEnabledAt'),
|
|
31
|
+
])
|
|
32
|
+
.where('did', '=', did)
|
|
33
|
+
.where('email', '=', email.toLowerCase())
|
|
34
|
+
.where('emailConfirmedAt', 'is not', null))
|
|
35
|
+
.onConflict((oc) => oc.column('did').doUpdateSet((eb) => ({
|
|
36
|
+
// The bare column is the stored value; `excluded` would be the one
|
|
37
|
+
// just offered. Self-assigning preserves the original timestamp.
|
|
38
|
+
emailAuthFactorEnabledAt: eb.ref('account_email_auth_factor.emailAuthFactorEnabledAt'),
|
|
39
|
+
})))
|
|
40
|
+
.returning('emailAuthFactorEnabledAt'));
|
|
41
|
+
return row?.emailAuthFactorEnabledAt ?? null;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Disables the email auth factor for `did`, provided `email` is still the
|
|
45
|
+
* account's address. Disabling an already-disabled factor is a no-op.
|
|
46
|
+
*
|
|
47
|
+
* Unlike enabling there is no `emailConfirmedAt` guard — turning a factor off
|
|
48
|
+
* never needs the address to be confirmed.
|
|
49
|
+
*
|
|
50
|
+
* @returns whether a row was removed.
|
|
51
|
+
*/
|
|
52
|
+
export const disable = async (db, did, email) => {
|
|
53
|
+
const [res] = await db.executeWithRetry(db.db
|
|
54
|
+
.deleteFrom('account_email_auth_factor')
|
|
55
|
+
.where('did', '=', did)
|
|
56
|
+
.where(({ exists, selectFrom }) => exists(selectFrom('account')
|
|
57
|
+
.selectAll()
|
|
58
|
+
.where('account.did', '=', did)
|
|
59
|
+
.where('account.email', '=', email.toLowerCase()))));
|
|
60
|
+
return res.numDeletedRows > 0;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Drops the email auth factor for `did` unconditionally.
|
|
64
|
+
*
|
|
65
|
+
* For the paths where the account's own state makes the factor invalid rather
|
|
66
|
+
* than the user asking to turn it off: an email change (2FA on an unconfirmed
|
|
67
|
+
* address can lock the user out) and account deletion. Callers changing the
|
|
68
|
+
* email must do so in the same transaction as the email write, since the two
|
|
69
|
+
* are no longer one row.
|
|
70
|
+
*
|
|
71
|
+
* TODO: Store unconfirmed emails separately, see note in context.ts — at which
|
|
72
|
+
* point changing an email no longer needs to disable 2FA at all.
|
|
73
|
+
*/
|
|
74
|
+
export const deleteForDid = async (db, did) => {
|
|
75
|
+
await db.executeWithRetry(db.db.deleteFrom('account_email_auth_factor').where('did', '=', did));
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=email-auth-factor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-auth-factor.js","sourceRoot":"","sources":["../../../src/account-manager/helpers/email-auth-factor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAGzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,EAAa,EACb,GAAW,EACX,KAAa,EACmB,EAAE;IAClC,MAAM,wBAAwB,GAAG,qBAAqB,EAAE,CAAA;IAExD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,gBAAgB,CACrC,EAAE,CAAC,EAAE;SACF,UAAU,CAAC,2BAA2B,CAAC;SACvC,OAAO,CAAC,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;SAC5C,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CACjB,EAAE;SACC,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACf,aAAa;QACb,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,0BAA0B,CAAC;KACjE,CAAC;SACD,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;SACtB,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;SACxC,KAAK,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,CAAC,CAC7C;SACA,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CACjB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,mEAAmE;QACnE,iEAAiE;QACjE,wBAAwB,EAAE,EAAE,CAAC,GAAG,CAC9B,oDAAoD,CACrD;KACF,CAAC,CAAC,CACJ;SACA,SAAS,CAAC,0BAA0B,CAAC,CACzC,CAAA;IAED,OAAO,GAAG,EAAE,wBAAwB,IAAI,IAAI,CAAA;AAC9C,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,EAAa,EACb,GAAW,EACX,KAAa,EACK,EAAE;IACpB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,gBAAgB,CACrC,EAAE,CAAC,EAAE;SACF,UAAU,CAAC,2BAA2B,CAAC;SACvC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;SACtB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAChC,MAAM,CACJ,UAAU,CAAC,SAAS,CAAC;SAClB,SAAS,EAAE;SACX,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC;SAC9B,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CACpD,CACF,CACJ,CAAA;IAED,OAAO,GAAG,CAAC,cAAc,GAAG,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,EAAa,EACb,GAAW,EACI,EAAE;IACjB,MAAM,EAAE,CAAC,gBAAgB,CACvB,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CACrE,CAAA;AACH,CAAC,CAAA","sourcesContent":["import { type DatetimeString, currentDatetimeString } from '@atproto/lex'\nimport type { AccountDb } from '../db/index.js'\n\n/**\n * Enables the email auth factor for `did`, provided `email` is still the\n * account's address and is still confirmed.\n *\n * @NOTE `INSERT … SELECT` rather than a read followed by a write: the factor\n * lives in its own table, so that guard would otherwise be a separate query\n * with a window in between. Selecting *from* `account` keeps it a single\n * statement, so it holds atomically against a concurrent email change.\n *\n * Enabling an already-enabled factor is idempotent and keeps the original\n * timestamp: the conflict clause re-assigns the column to itself, which touches\n * the row so `RETURNING` still yields it without moving the clock. `DO NOTHING`\n * would skip the row and return nothing, making \"already enabled\" and \"guard\n * failed\" indistinguishable.\n *\n * @returns the stored timestamp, so callers mirror what the database actually\n * holds rather than a value they minted themselves. `null` means the guard\n * failed — no row was written and the account is unchanged.\n */\nexport const enable = async (\n db: AccountDb,\n did: string,\n email: string,\n): Promise<DatetimeString | null> => {\n const emailAuthFactorEnabledAt = currentDatetimeString()\n\n const [row] = await db.executeWithRetry(\n db.db\n .insertInto('account_email_auth_factor')\n .columns(['did', 'emailAuthFactorEnabledAt'])\n .expression((eb) =>\n eb\n .selectFrom('account')\n .select((eb2) => [\n 'account.did',\n eb2.val(emailAuthFactorEnabledAt).as('emailAuthFactorEnabledAt'),\n ])\n .where('did', '=', did)\n .where('email', '=', email.toLowerCase())\n .where('emailConfirmedAt', 'is not', null),\n )\n .onConflict((oc) =>\n oc.column('did').doUpdateSet((eb) => ({\n // The bare column is the stored value; `excluded` would be the one\n // just offered. Self-assigning preserves the original timestamp.\n emailAuthFactorEnabledAt: eb.ref(\n 'account_email_auth_factor.emailAuthFactorEnabledAt',\n ),\n })),\n )\n .returning('emailAuthFactorEnabledAt'),\n )\n\n return row?.emailAuthFactorEnabledAt ?? null\n}\n\n/**\n * Disables the email auth factor for `did`, provided `email` is still the\n * account's address. Disabling an already-disabled factor is a no-op.\n *\n * Unlike enabling there is no `emailConfirmedAt` guard — turning a factor off\n * never needs the address to be confirmed.\n *\n * @returns whether a row was removed.\n */\nexport const disable = async (\n db: AccountDb,\n did: string,\n email: string,\n): Promise<boolean> => {\n const [res] = await db.executeWithRetry(\n db.db\n .deleteFrom('account_email_auth_factor')\n .where('did', '=', did)\n .where(({ exists, selectFrom }) =>\n exists(\n selectFrom('account')\n .selectAll()\n .where('account.did', '=', did)\n .where('account.email', '=', email.toLowerCase()),\n ),\n ),\n )\n\n return res.numDeletedRows > 0\n}\n\n/**\n * Drops the email auth factor for `did` unconditionally.\n *\n * For the paths where the account's own state makes the factor invalid rather\n * than the user asking to turn it off: an email change (2FA on an unconfirmed\n * address can lock the user out) and account deletion. Callers changing the\n * email must do so in the same transaction as the email write, since the two\n * are no longer one row.\n *\n * TODO: Store unconfirmed emails separately, see note in context.ts — at which\n * point changing an email no longer needs to disable 2FA at all.\n */\nexport const deleteForDid = async (\n db: AccountDb,\n did: string,\n): Promise<void> => {\n await db.executeWithRetry(\n db.db.deleteFrom('account_email_auth_factor').where('did', '=', did),\n )\n}\n"]}
|
|
@@ -17,6 +17,7 @@ export declare const ensureInviteIsAvailable: (db: AccountDb, inviteCode: string
|
|
|
17
17
|
export declare const selectInviteCodesQb: (db: AccountDb) => import("kysely").SelectQueryBuilder<{
|
|
18
18
|
account: import("../db/index.js").Account;
|
|
19
19
|
account_device: import("../db/index.js").AccountDevice;
|
|
20
|
+
account_email_auth_factor: import("../db/schema/account-email-auth-factor.js").AccountEmailAuthFactor;
|
|
20
21
|
actor: import("../db/index.js").Actor;
|
|
21
22
|
app_password: import("../db/index.js").AppPassword;
|
|
22
23
|
authorization_request: import("../db/index.js").AuthorizationRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../../src/account-manager/helpers/invite.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,cAAc,CAAA;AAGrB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAA;AAC3D,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAA;AAE3D,eAAO,MAAM,iBAAiB,OACxB,SAAS,YACH;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,YACtC,MAAM,kBAkBjB,CAAA;AAED,eAAO,MAAM,wBAAwB,OAC/B,SAAS,cACD,MAAM,SACX,MAAM,EAAE,iBACA,MAAM,YACX,CAAC,GAAG,CAAC,KACd,OAAO,CAAC,UAAU,EAAE,CA+BtB,CAAA;AAED,eAAO,MAAM,eAAe,OACtB,SAAS,QACP;IACJ,GAAG,EAAE,SAAS,CAAA;IACd,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;CACpB,kBAUF,CAAA;AAED,eAAO,MAAM,uBAAuB,OAC9B,SAAS,cACD,MAAM,KACjB,OAAO,CAAC,IAAI,CA4Bd,CAAA;AAED,eAAO,MAAM,mBAAmB,OAAQ,SAAS
|
|
1
|
+
{"version":3,"file":"invite.d.ts","sourceRoot":"","sources":["../../../src/account-manager/helpers/invite.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,cAAc,CAAA;AAGrB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3D,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAA;AAC3D,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAA;AAE3D,eAAO,MAAM,iBAAiB,OACxB,SAAS,YACH;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,EAAE,YACtC,MAAM,kBAkBjB,CAAA;AAED,eAAO,MAAM,wBAAwB,OAC/B,SAAS,cACD,MAAM,SACX,MAAM,EAAE,iBACA,MAAM,YACX,CAAC,GAAG,CAAC,KACd,OAAO,CAAC,UAAU,EAAE,CA+BtB,CAAA;AAED,eAAO,MAAM,eAAe,OACtB,SAAS,QACP;IACJ,GAAG,EAAE,SAAS,CAAA;IACd,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;CACpB,kBAUF,CAAA;AAED,eAAO,MAAM,uBAAuB,OAC9B,SAAS,cACD,MAAM,KACjB,OAAO,CAAC,IAAI,CA4Bd,CAAA;AAED,eAAO,MAAM,mBAAmB,OAAQ,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBhD,CAAA;AAED,eAAO,MAAM,sBAAsB,OAC7B,SAAS,QACP,MAAM,EAAE,KACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAqBnC,CAAA;AAED,eAAO,MAAM,kBAAkB,OACzB,SAAS,SACN,MAAM,EAAE,KACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAgBnC,CAAA;AAED,eAAO,MAAM,uBAAuB,OAC9B,SAAS,QACP,SAAS,EAAE,KAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAiCpC,CAAA;AAED,eAAO,MAAM,kBAAkB,OACzB,SAAS,QACP;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,kBAmB9C,CAAA;AAED,eAAO,MAAM,yBAAyB,OAChC,SAAS,OACR,SAAS,YACJ,OAAO,kBAQlB,CAAA"}
|
|
@@ -16,6 +16,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
16
16
|
}) => import("kysely").SelectQueryBuilder<{
|
|
17
17
|
account: import("kysely").Nullable<import("../db/index.js").Account>;
|
|
18
18
|
account_device: import("../db/index.js").AccountDevice;
|
|
19
|
+
account_email_auth_factor: import("kysely").Nullable<import("../db/schema/account-email-auth-factor.js").AccountEmailAuthFactor>;
|
|
19
20
|
actor: import("../db/index.js").Actor;
|
|
20
21
|
app_password: import("../db/index.js").AppPassword;
|
|
21
22
|
authorization_request: import("../db/index.js").AuthorizationRequest;
|
|
@@ -29,12 +30,13 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
29
30
|
repo_root: import("../db/index.js").RepoRoot;
|
|
30
31
|
token: Token;
|
|
31
32
|
used_refresh_token: import("../db/index.js").UsedRefreshToken;
|
|
32
|
-
}, "account" | "actor" | "token", Partial<Omit<unknown, never>> & {
|
|
33
|
+
}, "account" | "account_email_auth_factor" | "actor" | "token", Partial<Omit<unknown, never>> & {
|
|
33
34
|
createdAt: string;
|
|
34
35
|
deactivatedAt: string | null;
|
|
35
36
|
deleteAfter: string | null;
|
|
36
37
|
did: `did:${string}:${string}`;
|
|
37
38
|
email: string | null;
|
|
39
|
+
emailAuthFactorAt: import("@atproto/syntax").DatetimeString | null;
|
|
38
40
|
emailConfirmedAt: import("@atproto/syntax").DatetimeString | null;
|
|
39
41
|
handle: `${string}.${string}` | null;
|
|
40
42
|
invitesDisabled: 0 | 1 | null;
|
|
@@ -91,7 +93,7 @@ export declare const findByQB: (db: AccountDb, search: {
|
|
|
91
93
|
scope: string | null;
|
|
92
94
|
tokenId: `tok-${string}`;
|
|
93
95
|
updatedAt: `${string}T${string}Z`;
|
|
94
|
-
} & Partial<Omit<unknown, "clientAuth" | "clientId" | "code" | "createdAt" | "currentRefreshToken" | "deactivatedAt" | "deleteAfter" | "details" | "deviceId" | "did" | "email" | "emailConfirmedAt" | "expiresAt" | "handle" | "id" | "invitesDisabled" | "parameters" | "scope" | "takedownRef" | "tokenId" | "updatedAt">>>;
|
|
96
|
+
} & Partial<Omit<unknown, "clientAuth" | "clientId" | "code" | "createdAt" | "currentRefreshToken" | "deactivatedAt" | "deleteAfter" | "details" | "deviceId" | "did" | "email" | "emailAuthFactorAt" | "emailConfirmedAt" | "expiresAt" | "handle" | "id" | "invitesDisabled" | "parameters" | "scope" | "takedownRef" | "tokenId" | "updatedAt">>>;
|
|
95
97
|
export declare const removeByDid: (db: AccountDb, did: Did) => Promise<void>;
|
|
96
98
|
export declare const rotateQB: (db: AccountDb, id: number, newTokenId: TokenId, newRefreshToken: RefreshToken, newData: NewTokenData) => import("kysely").UpdateQueryBuilder<import("../db/index.js").DatabaseSchema, "token", "token", import("kysely").UpdateResult>;
|
|
97
99
|
export declare const removeQB: (db: AccountDb, tokenId: TokenId) => import("kysely").DeleteQueryBuilder<import("../db/index.js").DatabaseSchema, "token", import("kysely").DeleteResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/account-manager/helpers/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,KAAK,EACV,IAAI,EACJ,GAAG,EACH,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACR,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAGtD,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS,CAa7D;AAuBD,eAAO,MAAM,QAAQ,OACf,SAAS,WACJ,OAAO,QACV,SAAS,iBACA,YAAY,yHAiB5B,CAAA;AAED,eAAO,MAAM,WAAW,OAAQ,SAAS,MAAM,OAAO;;;EAKZ,CAAA;AAE1C,eAAO,MAAM,QAAQ,OACf,SAAS,UACL;IACN,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mBAAmB,CAAC,EAAE,YAAY,CAAA;CACnC
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/account-manager/helpers/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,KAAK,EACV,IAAI,EACJ,GAAG,EACH,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,OAAO,EACR,MAAM,+BAA+B,CAAA;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAGtD,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS,CAa7D;AAuBD,eAAO,MAAM,QAAQ,OACf,SAAS,WACJ,OAAO,QACV,SAAS,iBACA,YAAY,yHAiB5B,CAAA;AAED,eAAO,MAAM,WAAW,OAAQ,SAAS,MAAM,OAAO;;;EAKZ,CAAA;AAE1C,eAAO,MAAM,QAAQ,OACf,SAAS,UACL;IACN,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mBAAmB,CAAC,EAAE,YAAY,CAAA;CACnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oVAoCF,CAAA;AAED,eAAO,MAAM,WAAW,OAAc,SAAS,OAAO,GAAG,kBAOxD,CAAA;AAED,eAAO,MAAM,QAAQ,OACf,SAAS,MACT,MAAM,cACE,OAAO,mBACF,YAAY,WACpB,YAAY,kIAcE,CAAA;AAEzB,eAAO,MAAM,QAAQ,OAAQ,SAAS,WAAW,OAAO,yHAEE,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Client } from '@did-plc/lib';
|
|
2
2
|
import { type Keypair } from '@atproto/crypto';
|
|
3
3
|
import { type HandleString } from '@atproto/lex';
|
|
4
|
-
import type { Account, AccountStore, AuthenticateAccountData, AuthorizedClientData, AuthorizedClients, ClientId, Code, DeactivateAccountData, DeleteAccountConfirmInput, DeleteAccountRequestInput, DeviceAccount, DeviceData, DeviceId, DeviceStore, Did, FoundRequestResult, LexiconData, LexiconStore, NewTokenData, ReactivateAccountData, RefreshToken, RequestData, RequestId, RequestStore, ResetPasswordConfirmInput, ResetPasswordRequestInput, SignUpData, TokenData, TokenId, TokenInfo, TokenStore, UpdateEmailConfirmInput, UpdateEmailRequestInput, UpdateEmailRequestOutput, UpdateHandleData, UpdateRequestData, VerifyEmailConfirmInput, VerifyEmailRequestInput } from '@atproto/oauth-provider/store';
|
|
4
|
+
import type { Account, AccountStore, AuthenticateAccountData, AuthorizedClientData, AuthorizedClients, ClientId, Code, DeactivateAccountData, DeleteAccountConfirmInput, DeleteAccountRequestInput, DeviceAccount, DeviceData, DeviceId, DeviceStore, Did, DisableEmailAuthFactorInput, EnableEmailAuthFactorInput, FoundRequestResult, LexiconData, LexiconStore, NewTokenData, ReactivateAccountData, RefreshToken, RequestData, RequestId, RequestStore, ResetPasswordConfirmInput, ResetPasswordRequestInput, SignUpData, TokenData, TokenId, TokenInfo, TokenStore, UpdateEmailConfirmInput, UpdateEmailRequestInput, UpdateEmailRequestOutput, UpdateHandleData, UpdateRequestData, VerifyEmailConfirmInput, VerifyEmailRequestInput } from '@atproto/oauth-provider/store';
|
|
5
5
|
import type { ActorStore } from '../actor-store/actor-store.js';
|
|
6
6
|
import type { BackgroundQueue } from '../background.js';
|
|
7
7
|
import type { ImageUrlBuilder } from '../image/image-url-builder.js';
|
|
@@ -31,7 +31,7 @@ export declare class OAuthStore implements AccountStore, RequestStore, DeviceSto
|
|
|
31
31
|
private verifyEmailAvailability;
|
|
32
32
|
private verifyInviteCode;
|
|
33
33
|
createAccount({ locale: _locale, inviteCode, handle, email, password, }: SignUpData): Promise<Account>;
|
|
34
|
-
authenticateAccount({ locale
|
|
34
|
+
authenticateAccount({ locale, username: identifier, password, emailOtp, }: AuthenticateAccountData): Promise<Account>;
|
|
35
35
|
setAuthorizedClient(did: Did, clientId: ClientId, data: AuthorizedClientData): Promise<void>;
|
|
36
36
|
getAccount(did: Did): Promise<{
|
|
37
37
|
account: Account;
|
|
@@ -71,6 +71,8 @@ export declare class OAuthStore implements AccountStore, RequestStore, DeviceSto
|
|
|
71
71
|
verifyEmailConfirm({ did, email, token, }: VerifyEmailConfirmInput): Promise<Account | null>;
|
|
72
72
|
updateEmailRequest({ did, locale, }: UpdateEmailRequestInput): Promise<UpdateEmailRequestOutput>;
|
|
73
73
|
updateEmailConfirm({ did, token, email, locale, }: UpdateEmailConfirmInput): Promise<Account | null>;
|
|
74
|
+
enableEmailAuthFactor({ did, }: EnableEmailAuthFactorInput): Promise<Account>;
|
|
75
|
+
disableEmailAuthFactor({ did, token, locale, }: DisableEmailAuthFactorInput): Promise<Account>;
|
|
74
76
|
updateHandle({ did, handle }: UpdateHandleData): Promise<Account>;
|
|
75
77
|
deactivateAccount({ did, deleteAfter, }: DeactivateAccountData): Promise<Account>;
|
|
76
78
|
reactivateAccount({ did }: ReactivateAccountData): Promise<Account>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../../src/account-manager/oauth-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAA2B,MAAM,cAAc,CAAA;AAEnE,OAAO,EAAE,KAAK,OAAO,EAAoB,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../../src/account-manager/oauth-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,11 @@ import assert from 'node:assert';
|
|
|
2
2
|
import { createOp as createPlcOp } from '@did-plc/lib';
|
|
3
3
|
import { Secp256k1Keypair } from '@atproto/crypto';
|
|
4
4
|
import { getBlobCidString, } from '@atproto/lex';
|
|
5
|
-
import { HandleUnavailableError, InvalidCredentialsError, InvalidRequestError, } from '@atproto/oauth-provider/errors';
|
|
5
|
+
import { HandleUnavailableError, InvalidCredentialsError, InvalidRequestError, SecondAuthenticationFactorRequiredError, } from '@atproto/oauth-provider/errors';
|
|
6
6
|
import { AuthRequiredError as XrpcAuthRequiredError, InvalidRequestError as XrpcInvalidRequestError, } from '@atproto/xrpc-server';
|
|
7
7
|
import { fromDateISO } from '../db/index.js';
|
|
8
8
|
import { dbLogger } from '../logger.js';
|
|
9
|
-
import { InvalidPasswordError } from './account-manager.js';
|
|
9
|
+
import { AuthFactorRequiredError, InvalidPasswordError, } from './account-manager.js';
|
|
10
10
|
import * as accountDeviceHelper from './helpers/account-device.js';
|
|
11
11
|
import { UserAlreadyExistsError } from './helpers/account.js';
|
|
12
12
|
import * as authRequestHelper from './helpers/authorization-request.js';
|
|
@@ -151,16 +151,15 @@ export class OAuthStore {
|
|
|
151
151
|
throw err;
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
|
-
async authenticateAccount({ locale
|
|
155
|
-
// Not supported by the PDS (yet?)
|
|
156
|
-
emailOtp = undefined, }) {
|
|
154
|
+
async authenticateAccount({ locale, username: identifier, password, emailOtp, }) {
|
|
157
155
|
// @TODO (?) Send an email to the user to notify them of the login attempt
|
|
158
156
|
try {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
157
|
+
const { user, appPassword, isSoftDeleted } = await this.accountManager.login({
|
|
158
|
+
identifier,
|
|
159
|
+
password,
|
|
160
|
+
authFactorToken: emailOtp,
|
|
161
|
+
locale,
|
|
162
|
+
});
|
|
164
163
|
if (isSoftDeleted) {
|
|
165
164
|
throw new InvalidRequestError('Account was taken down');
|
|
166
165
|
}
|
|
@@ -170,13 +169,20 @@ export class OAuthStore {
|
|
|
170
169
|
return this.buildAccount(user);
|
|
171
170
|
}
|
|
172
171
|
catch (err) {
|
|
173
|
-
// `InvalidPasswordError`
|
|
174
|
-
// so
|
|
175
|
-
// `sub` lets the oauth-provider's `onSignInFailed` hook distinguish
|
|
176
|
-
// "identifier known, credentials wrong" from "identifier unknown".
|
|
172
|
+
// `InvalidPasswordError` and `AuthFactorRequiredError` are both
|
|
173
|
+
// subclasses of `XrpcAuthRequiredError`, so both must be checked first.
|
|
177
174
|
if (err instanceof InvalidPasswordError) {
|
|
175
|
+
// Surfacing the matched `did` as the `sub` lets the oauth-provider's
|
|
176
|
+
// `onSignInFailed` hook distinguish "identifier known, credentials wrong"
|
|
177
|
+
// from "identifier unknown".
|
|
178
178
|
throw new InvalidCredentialsError(err.message, err.did, err);
|
|
179
179
|
}
|
|
180
|
+
// @NOTE The credentials were valid here — the account simply owes a
|
|
181
|
+
// second factor, and `login()` has already sent the code. This is the
|
|
182
|
+
// XRPC → OAuth translation that keeps `AccountManager` OAuth-free.
|
|
183
|
+
if (err instanceof AuthFactorRequiredError) {
|
|
184
|
+
throw new SecondAuthenticationFactorRequiredError(err.factor, err.hint, err);
|
|
185
|
+
}
|
|
180
186
|
if (err instanceof XrpcAuthRequiredError) {
|
|
181
187
|
throw new InvalidCredentialsError(err.message, undefined, err);
|
|
182
188
|
}
|
|
@@ -449,6 +455,33 @@ export class OAuthStore {
|
|
|
449
455
|
throw cause;
|
|
450
456
|
}
|
|
451
457
|
}
|
|
458
|
+
async enableEmailAuthFactor({ did, }) {
|
|
459
|
+
try {
|
|
460
|
+
const account = await this.accountManager.enableEmailAuthFactor({ did });
|
|
461
|
+
return this.buildAccount(account);
|
|
462
|
+
}
|
|
463
|
+
catch (err) {
|
|
464
|
+
if (err instanceof XrpcInvalidRequestError) {
|
|
465
|
+
throw new InvalidRequestError(err.message, err);
|
|
466
|
+
}
|
|
467
|
+
throw err;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
async disableEmailAuthFactor({ did, token, locale, }) {
|
|
471
|
+
const account = await this.accountManager
|
|
472
|
+
.disableEmailAuthFactor({ did, token, locale })
|
|
473
|
+
.catch((err) => {
|
|
474
|
+
if (err instanceof XrpcInvalidRequestError) {
|
|
475
|
+
if (err.error === 'TokenRequired') {
|
|
476
|
+
throw new SecondAuthenticationFactorRequiredError('emailOtp', '***', err.message);
|
|
477
|
+
}
|
|
478
|
+
throw new InvalidRequestError(err.message, err);
|
|
479
|
+
}
|
|
480
|
+
// Unexpected error (should not happen)
|
|
481
|
+
throw err;
|
|
482
|
+
});
|
|
483
|
+
return this.buildAccount(account);
|
|
484
|
+
}
|
|
452
485
|
async updateHandle({ did, handle }) {
|
|
453
486
|
try {
|
|
454
487
|
const account = await this.accountManager.updateHandle(did, handle);
|
|
@@ -536,6 +569,7 @@ export class OAuthStore {
|
|
|
536
569
|
pds: this.serviceDid,
|
|
537
570
|
email: row.email || undefined,
|
|
538
571
|
emailVerified: row.email ? row.emailConfirmedAt != null : undefined,
|
|
572
|
+
emailAuthFactor: row.email ? row.emailAuthFactorAt != null : undefined,
|
|
539
573
|
handle: row.handle || undefined,
|
|
540
574
|
deactivated: row.deactivatedAt != null,
|
|
541
575
|
};
|