@atproto/pds 0.5.12 → 0.5.15

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.
Files changed (326) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/api/app/bsky/notification/index.d.ts.map +1 -1
  3. package/dist/api/app/bsky/notification/index.js +2 -0
  4. package/dist/api/app/bsky/notification/index.js.map +1 -1
  5. package/dist/api/app/bsky/notification/unregisterPush.d.ts +4 -0
  6. package/dist/api/app/bsky/notification/unregisterPush.d.ts.map +1 -0
  7. package/dist/api/app/bsky/notification/unregisterPush.js +48 -0
  8. package/dist/api/app/bsky/notification/unregisterPush.js.map +1 -0
  9. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +6 -0
  10. package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
  11. package/dist/lexicons/app/bsky/actor/defs.defs.js +1 -0
  12. package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
  13. package/package.json +42 -38
  14. package/build.templates.cjs +0 -22
  15. package/example.env +0 -42
  16. package/jest.config.cjs +0 -27
  17. package/src/account-manager/account-manager.ts +0 -916
  18. package/src/account-manager/db/index.ts +0 -21
  19. package/src/account-manager/db/migrations/001-init.ts +0 -115
  20. package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
  21. package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
  22. package/src/account-manager/db/migrations/004-oauth.ts +0 -122
  23. package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
  24. package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
  25. package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
  26. package/src/account-manager/db/migrations/index.ts +0 -17
  27. package/src/account-manager/db/schema/account-device.ts +0 -14
  28. package/src/account-manager/db/schema/account.ts +0 -16
  29. package/src/account-manager/db/schema/actor.ts +0 -17
  30. package/src/account-manager/db/schema/app-password.ts +0 -13
  31. package/src/account-manager/db/schema/authorization-request.ts +0 -30
  32. package/src/account-manager/db/schema/authorized-client.ts +0 -23
  33. package/src/account-manager/db/schema/device.ts +0 -18
  34. package/src/account-manager/db/schema/email-token.ts +0 -19
  35. package/src/account-manager/db/schema/index.ts +0 -43
  36. package/src/account-manager/db/schema/invite-code.ts +0 -24
  37. package/src/account-manager/db/schema/lexicon.ts +0 -15
  38. package/src/account-manager/db/schema/refresh-token.ts +0 -11
  39. package/src/account-manager/db/schema/repo-root.ts +0 -12
  40. package/src/account-manager/db/schema/token.ts +0 -38
  41. package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
  42. package/src/account-manager/helpers/account-device.ts +0 -63
  43. package/src/account-manager/helpers/account.ts +0 -355
  44. package/src/account-manager/helpers/auth.ts +0 -222
  45. package/src/account-manager/helpers/authorization-request.ts +0 -90
  46. package/src/account-manager/helpers/authorized-client.ts +0 -75
  47. package/src/account-manager/helpers/device.ts +0 -47
  48. package/src/account-manager/helpers/email-token.ts +0 -87
  49. package/src/account-manager/helpers/invite.ts +0 -263
  50. package/src/account-manager/helpers/lexicon.ts +0 -67
  51. package/src/account-manager/helpers/password.ts +0 -136
  52. package/src/account-manager/helpers/repo.ts +0 -24
  53. package/src/account-manager/helpers/scrypt.ts +0 -53
  54. package/src/account-manager/helpers/token.ts +0 -158
  55. package/src/account-manager/helpers/used-refresh-token.ts +0 -30
  56. package/src/account-manager/oauth-store.ts +0 -880
  57. package/src/account-manager/scope-reference-getter.ts +0 -106
  58. package/src/actor-store/actor-store-reader.ts +0 -45
  59. package/src/actor-store/actor-store-resources.ts +0 -8
  60. package/src/actor-store/actor-store-transactor.ts +0 -31
  61. package/src/actor-store/actor-store-writer.ts +0 -17
  62. package/src/actor-store/actor-store.ts +0 -210
  63. package/src/actor-store/blob/reader.ts +0 -160
  64. package/src/actor-store/blob/transactor.ts +0 -383
  65. package/src/actor-store/db/index.ts +0 -20
  66. package/src/actor-store/db/migrations/001-init.ts +0 -105
  67. package/src/actor-store/db/migrations/index.ts +0 -5
  68. package/src/actor-store/db/schema/account-pref.ts +0 -11
  69. package/src/actor-store/db/schema/backlink.ts +0 -9
  70. package/src/actor-store/db/schema/blob.ts +0 -14
  71. package/src/actor-store/db/schema/index.ts +0 -23
  72. package/src/actor-store/db/schema/record-blob.ts +0 -8
  73. package/src/actor-store/db/schema/record.ts +0 -14
  74. package/src/actor-store/db/schema/repo-block.ts +0 -10
  75. package/src/actor-store/db/schema/repo-root.ts +0 -10
  76. package/src/actor-store/migrate.ts +0 -39
  77. package/src/actor-store/preference/reader.ts +0 -48
  78. package/src/actor-store/preference/transactor.ts +0 -55
  79. package/src/actor-store/preference/util.ts +0 -39
  80. package/src/actor-store/record/reader.ts +0 -374
  81. package/src/actor-store/record/transactor.ts +0 -111
  82. package/src/actor-store/repo/reader.ts +0 -31
  83. package/src/actor-store/repo/sql-repo-reader.ts +0 -150
  84. package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
  85. package/src/actor-store/repo/transactor.ts +0 -227
  86. package/src/api/app/bsky/actor/getPreferences.ts +0 -57
  87. package/src/api/app/bsky/actor/getProfile.ts +0 -41
  88. package/src/api/app/bsky/actor/getProfiles.ts +0 -51
  89. package/src/api/app/bsky/actor/index.ts +0 -13
  90. package/src/api/app/bsky/actor/putPreferences.ts +0 -62
  91. package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
  92. package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
  93. package/src/api/app/bsky/feed/getFeed.ts +0 -47
  94. package/src/api/app/bsky/feed/getPostThread.ts +0 -251
  95. package/src/api/app/bsky/feed/getTimeline.ts +0 -50
  96. package/src/api/app/bsky/feed/index.ts +0 -15
  97. package/src/api/app/bsky/index.ts +0 -11
  98. package/src/api/app/bsky/notification/index.ts +0 -7
  99. package/src/api/app/bsky/notification/registerPush.ts +0 -71
  100. package/src/api/app/bsky/util/resolver.ts +0 -20
  101. package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
  102. package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
  103. package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
  104. package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
  105. package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
  106. package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
  107. package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
  108. package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
  109. package/src/api/com/atproto/admin/index.ts +0 -31
  110. package/src/api/com/atproto/admin/sendEmail.ts +0 -47
  111. package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
  112. package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
  113. package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
  114. package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
  115. package/src/api/com/atproto/admin/util.ts +0 -66
  116. package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
  117. package/src/api/com/atproto/identity/index.ts +0 -17
  118. package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
  119. package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
  120. package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
  121. package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
  122. package/src/api/com/atproto/identity/updateHandle.ts +0 -66
  123. package/src/api/com/atproto/index.ts +0 -19
  124. package/src/api/com/atproto/moderation/createReport.ts +0 -41
  125. package/src/api/com/atproto/moderation/index.ts +0 -7
  126. package/src/api/com/atproto/repo/applyWrites.ts +0 -226
  127. package/src/api/com/atproto/repo/createRecord.ts +0 -143
  128. package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
  129. package/src/api/com/atproto/repo/describeRepo.ts +0 -43
  130. package/src/api/com/atproto/repo/getRecord.ts +0 -40
  131. package/src/api/com/atproto/repo/importRepo.ts +0 -101
  132. package/src/api/com/atproto/repo/index.ts +0 -25
  133. package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
  134. package/src/api/com/atproto/repo/listRecords.ts +0 -36
  135. package/src/api/com/atproto/repo/putRecord.ts +0 -211
  136. package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
  137. package/src/api/com/atproto/server/activateAccount.ts +0 -37
  138. package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
  139. package/src/api/com/atproto/server/confirmEmail.ts +0 -39
  140. package/src/api/com/atproto/server/createAccount.ts +0 -327
  141. package/src/api/com/atproto/server/createAppPassword.ts +0 -53
  142. package/src/api/com/atproto/server/createInviteCode.ts +0 -38
  143. package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
  144. package/src/api/com/atproto/server/createSession.ts +0 -97
  145. package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
  146. package/src/api/com/atproto/server/deleteAccount.ts +0 -85
  147. package/src/api/com/atproto/server/deleteSession.ts +0 -23
  148. package/src/api/com/atproto/server/describeServer.ts +0 -29
  149. package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
  150. package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
  151. package/src/api/com/atproto/server/getSession.ts +0 -80
  152. package/src/api/com/atproto/server/index.ts +0 -55
  153. package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
  154. package/src/api/com/atproto/server/refreshSession.ts +0 -72
  155. package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
  156. package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
  157. package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
  158. package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
  159. package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
  160. package/src/api/com/atproto/server/resetPassword.ts +0 -50
  161. package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
  162. package/src/api/com/atproto/server/updateEmail.ts +0 -52
  163. package/src/api/com/atproto/server/util.ts +0 -136
  164. package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
  165. package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
  166. package/src/api/com/atproto/sync/getBlob.ts +0 -61
  167. package/src/api/com/atproto/sync/getBlocks.ts +0 -37
  168. package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
  169. package/src/api/com/atproto/sync/getRecord.ts +0 -49
  170. package/src/api/com/atproto/sync/getRepo.ts +0 -75
  171. package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
  172. package/src/api/com/atproto/sync/index.ts +0 -27
  173. package/src/api/com/atproto/sync/listBlobs.ts +0 -33
  174. package/src/api/com/atproto/sync/listRepos.ts +0 -74
  175. package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
  176. package/src/api/com/atproto/sync/util.ts +0 -37
  177. package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
  178. package/src/api/com/atproto/temp/index.ts +0 -7
  179. package/src/api/index.ts +0 -10
  180. package/src/api/proxy.ts +0 -44
  181. package/src/app-view.ts +0 -24
  182. package/src/auth-output.ts +0 -52
  183. package/src/auth-routes.ts +0 -64
  184. package/src/auth-scope.ts +0 -40
  185. package/src/auth-verifier.ts +0 -668
  186. package/src/background.ts +0 -65
  187. package/src/basic-routes.ts +0 -52
  188. package/src/bsky-app-view.ts +0 -33
  189. package/src/config/config.ts +0 -553
  190. package/src/config/env.ts +0 -167
  191. package/src/config/index.ts +0 -3
  192. package/src/config/secrets.ts +0 -54
  193. package/src/context.ts +0 -523
  194. package/src/crawlers.ts +0 -46
  195. package/src/db/cast.ts +0 -52
  196. package/src/db/db.ts +0 -140
  197. package/src/db/index.ts +0 -4
  198. package/src/db/migrator.ts +0 -40
  199. package/src/db/pagination.ts +0 -132
  200. package/src/db/tables/moderation.ts +0 -80
  201. package/src/db/util.ts +0 -108
  202. package/src/did-cache/db/index.ts +0 -21
  203. package/src/did-cache/db/migrations.ts +0 -17
  204. package/src/did-cache/db/schema.ts +0 -9
  205. package/src/did-cache/index.ts +0 -131
  206. package/src/disk-blobstore.ts +0 -172
  207. package/src/error.ts +0 -19
  208. package/src/handle/explicit-slurs.ts +0 -22
  209. package/src/handle/index.ts +0 -49
  210. package/src/handle/reserved.ts +0 -1059
  211. package/src/image/image-url-builder.ts +0 -16
  212. package/src/index.ts +0 -189
  213. package/src/lexicons.ts +0 -4
  214. package/src/logger.ts +0 -35
  215. package/src/mailer/index.ts +0 -111
  216. package/src/mailer/moderation.ts +0 -33
  217. package/src/mailer/templates/confirm-email.d.ts +0 -4
  218. package/src/mailer/templates/confirm-email.hbs +0 -158
  219. package/src/mailer/templates/delete-account.d.ts +0 -4
  220. package/src/mailer/templates/delete-account.hbs +0 -156
  221. package/src/mailer/templates/plc-operation.d.ts +0 -4
  222. package/src/mailer/templates/plc-operation.hbs +0 -153
  223. package/src/mailer/templates/reset-password.d.ts +0 -4
  224. package/src/mailer/templates/reset-password.hbs +0 -154
  225. package/src/mailer/templates/update-email.d.ts +0 -4
  226. package/src/mailer/templates/update-email.hbs +0 -153
  227. package/src/mailer/templates.ts +0 -17
  228. package/src/pipethrough.ts +0 -716
  229. package/src/rate-limits.ts +0 -59
  230. package/src/read-after-write/index.ts +0 -3
  231. package/src/read-after-write/types.ts +0 -35
  232. package/src/read-after-write/util.ts +0 -101
  233. package/src/read-after-write/viewer.ts +0 -290
  234. package/src/redis.ts +0 -25
  235. package/src/repo/index.ts +0 -2
  236. package/src/repo/prepare.ts +0 -266
  237. package/src/repo/types.ts +0 -65
  238. package/src/scripts/README.md +0 -40
  239. package/src/scripts/index.ts +0 -20
  240. package/src/scripts/publish-identity.ts +0 -60
  241. package/src/scripts/rebuild-repo.ts +0 -119
  242. package/src/scripts/rotate-keys.ts +0 -146
  243. package/src/scripts/sequencer-recovery/index.ts +0 -23
  244. package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
  245. package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
  246. package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
  247. package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
  248. package/src/scripts/util.ts +0 -7
  249. package/src/sequencer/db/index.ts +0 -21
  250. package/src/sequencer/db/migrations/001-init.ts +0 -35
  251. package/src/sequencer/db/migrations/index.ts +0 -5
  252. package/src/sequencer/db/schema.ts +0 -19
  253. package/src/sequencer/events.ts +0 -199
  254. package/src/sequencer/index.ts +0 -3
  255. package/src/sequencer/outbox.ts +0 -123
  256. package/src/sequencer/sequencer.ts +0 -290
  257. package/src/util/compression.ts +0 -16
  258. package/src/util/debug.ts +0 -10
  259. package/src/util/http.ts +0 -31
  260. package/src/util/types.ts +0 -7
  261. package/src/well-known.ts +0 -30
  262. package/test.env +0 -2
  263. package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
  264. package/tests/_oauth_client_assets_middleware.ts +0 -23
  265. package/tests/_puppeteer.ts +0 -147
  266. package/tests/_types.d.ts +0 -16
  267. package/tests/_util.ts +0 -191
  268. package/tests/account-deactivation.test.ts +0 -204
  269. package/tests/account-deletion.test.ts +0 -300
  270. package/tests/account-manager.test.ts +0 -462
  271. package/tests/account-migration.test.ts +0 -221
  272. package/tests/account-status.test.ts +0 -206
  273. package/tests/account.test.ts +0 -595
  274. package/tests/app-passwords.test.ts +0 -262
  275. package/tests/auth.test.ts +0 -405
  276. package/tests/blob-deletes.test.ts +0 -204
  277. package/tests/create-post.test.ts +0 -79
  278. package/tests/crud.test.ts +0 -1595
  279. package/tests/db.test.ts +0 -170
  280. package/tests/email-confirmation.test.ts +0 -227
  281. package/tests/entryway-mock.ts +0 -323
  282. package/tests/entryway.test.ts +0 -145
  283. package/tests/file-uploads.test.ts +0 -301
  284. package/tests/get-service-auth.test.ts +0 -81
  285. package/tests/handle-validation.test.ts +0 -56
  286. package/tests/handles.test.ts +0 -274
  287. package/tests/invite-codes.test.ts +0 -367
  288. package/tests/invites-admin.test.ts +0 -252
  289. package/tests/moderation.test.ts +0 -280
  290. package/tests/moderator-auth.test.ts +0 -177
  291. package/tests/oauth.test.ts +0 -334
  292. package/tests/plc-operations.test.ts +0 -239
  293. package/tests/preferences.test.ts +0 -352
  294. package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
  295. package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
  296. package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
  297. package/tests/proxied/admin.test.ts +0 -340
  298. package/tests/proxied/feedgen.test.ts +0 -66
  299. package/tests/proxied/notif.test.ts +0 -85
  300. package/tests/proxied/procedures.test.ts +0 -175
  301. package/tests/proxied/proxy-catchall.test.ts +0 -256
  302. package/tests/proxied/proxy-header.test.ts +0 -239
  303. package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
  304. package/tests/proxied/read-after-write.test.ts +0 -382
  305. package/tests/proxied/views.test.ts +0 -608
  306. package/tests/races.test.ts +0 -89
  307. package/tests/rate-limits.test.ts +0 -70
  308. package/tests/recovery.test.ts +0 -180
  309. package/tests/seeds/basic.ts +0 -165
  310. package/tests/seeds/follows.ts +0 -57
  311. package/tests/seeds/likes.ts +0 -14
  312. package/tests/seeds/reposts.ts +0 -18
  313. package/tests/seeds/thread.ts +0 -40
  314. package/tests/seeds/users-bulk.ts +0 -246
  315. package/tests/seeds/users.ts +0 -67
  316. package/tests/sequencer.test.ts +0 -251
  317. package/tests/server.test.ts +0 -151
  318. package/tests/sync/invertible-ops.test.ts +0 -99
  319. package/tests/sync/list.test.ts +0 -43
  320. package/tests/sync/subscribe-repos.test.ts +0 -672
  321. package/tests/sync/sync.test.ts +0 -316
  322. package/tests/takedown-appeal.test.ts +0 -166
  323. package/tsconfig.build.json +0 -9
  324. package/tsconfig.build.tsbuildinfo +0 -1
  325. package/tsconfig.json +0 -7
  326. package/tsconfig.tests.json +0 -8
@@ -1,22 +0,0 @@
1
- import { Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- server.add(com.atproto.admin.deleteAccount, {
7
- auth: ctx.authVerifier.adminToken,
8
- handler: async ({ input }) => {
9
- const { did } = input.body
10
-
11
- // @NOTE Order matters here: first "unlink" the account by removing it
12
- // from the account manager database ("source of truth"), then notify the
13
- // sequencer, and finally cleanup files from the file system.
14
- await ctx.accountManager.deleteAccount(did)
15
- try {
16
- await ctx.sequencer.sequenceAccountDeletion(did)
17
- } finally {
18
- await ctx.actorStore.destroy(did)
19
- }
20
- },
21
- })
22
- }
@@ -1,18 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- server.add(com.atproto.admin.disableAccountInvites, {
7
- auth: ctx.authVerifier.moderator,
8
- handler: async ({ input }) => {
9
- if (ctx.cfg.entryway) {
10
- throw new InvalidRequestError(
11
- 'Account invites are managed by the entryway service',
12
- )
13
- }
14
- const { account } = input.body
15
- await ctx.accountManager.setAccountInvitesDisabled(account, true)
16
- },
17
- })
18
- }
@@ -1,21 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- server.add(com.atproto.admin.disableInviteCodes, {
7
- auth: ctx.authVerifier.moderator,
8
- handler: async ({ input }) => {
9
- if (ctx.cfg.entryway) {
10
- throw new InvalidRequestError(
11
- 'Account invites are managed by the entryway service',
12
- )
13
- }
14
- const { codes = [], accounts = [] } = input.body
15
- if (accounts.includes('admin')) {
16
- throw new InvalidRequestError('cannot disable admin invite codes')
17
- }
18
- await ctx.accountManager.disableInviteCodes({ codes, accounts })
19
- },
20
- })
21
- }
@@ -1,18 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- server.add(com.atproto.admin.enableAccountInvites, {
7
- auth: ctx.authVerifier.moderator,
8
- handler: async ({ input }) => {
9
- if (ctx.cfg.entryway) {
10
- throw new InvalidRequestError(
11
- 'Account invites are managed by the entryway service',
12
- )
13
- }
14
- const { account } = input.body
15
- await ctx.accountManager.setAccountInvitesDisabled(account, false)
16
- },
17
- })
18
- }
@@ -1,32 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
- import { formatAccountInfo } from './util.js'
5
-
6
- export default function (server: Server, ctx: AppContext) {
7
- server.add(com.atproto.admin.getAccountInfo, {
8
- auth: ctx.authVerifier.moderator,
9
- handler: async ({ params }) => {
10
- const [account, invites, invitedBy] = await Promise.all([
11
- ctx.accountManager.getAccount(params.did, {
12
- includeDeactivated: true,
13
- includeTakenDown: true,
14
- }),
15
- ctx.accountManager.getAccountInvitesCodes(params.did),
16
- ctx.accountManager.getInvitedByForAccounts([params.did]),
17
- ])
18
- if (!account) {
19
- throw new InvalidRequestError('Account not found', 'NotFound')
20
- }
21
- const managesOwnInvites = !ctx.cfg.entryway
22
- return {
23
- encoding: 'application/json' as const,
24
- body: formatAccountInfo(account, {
25
- managesOwnInvites,
26
- invitedBy,
27
- invites,
28
- }),
29
- }
30
- },
31
- })
32
- }
@@ -1,34 +0,0 @@
1
- import { Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
- import { formatAccountInfo } from './util.js'
5
-
6
- export default function (server: Server, ctx: AppContext) {
7
- server.add(com.atproto.admin.getAccountInfos, {
8
- auth: ctx.authVerifier.moderator,
9
- handler: async ({ params }) => {
10
- const [accounts, invites, invitedBy] = await Promise.all([
11
- ctx.accountManager.getAccounts(params.dids, {
12
- includeDeactivated: true,
13
- includeTakenDown: true,
14
- }),
15
- ctx.accountManager.getAccountsInvitesCodes(params.dids),
16
- ctx.accountManager.getInvitedByForAccounts(params.dids),
17
- ])
18
-
19
- const managesOwnInvites = !ctx.cfg.entryway
20
- const infos = Array.from(accounts.values()).map((account) => {
21
- return formatAccountInfo(account, {
22
- managesOwnInvites,
23
- invitedBy,
24
- invites,
25
- })
26
- })
27
-
28
- return {
29
- encoding: 'application/json' as const,
30
- body: { infos },
31
- }
32
- },
33
- })
34
- }
@@ -1,126 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import {
3
- CodeDetail,
4
- selectInviteCodesQb,
5
- } from '../../../../account-manager/helpers/invite.js'
6
- import { AppContext } from '../../../../context.js'
7
- import {
8
- Cursor,
9
- GenericKeyset,
10
- LabeledResult,
11
- paginate,
12
- } from '../../../../db/pagination.js'
13
- import { com } from '../../../../lexicons/index.js'
14
-
15
- export default function (server: Server, ctx: AppContext) {
16
- if (ctx.cfg.entryway) {
17
- server.add(com.atproto.admin.getInviteCodes, () => {
18
- throw new InvalidRequestError(
19
- 'Account invites are managed by the entryway service',
20
- )
21
- })
22
- return
23
- }
24
-
25
- server.add(com.atproto.admin.getInviteCodes, {
26
- auth: ctx.authVerifier.moderator,
27
- handler: async ({
28
- params,
29
- }): Promise<com.atproto.admin.getInviteCodes.$Output> => {
30
- const { sort, limit, cursor } = params
31
- const db = ctx.accountManager.db
32
- const keyset = createKeyset(ctx, sort)
33
-
34
- const builder = selectInviteCodesQb(db)
35
-
36
- const res = await paginate(builder, {
37
- limit,
38
- cursor,
39
- keyset,
40
- }).execute()
41
-
42
- const codes = res.map((row) => row.code)
43
- const uses = await ctx.accountManager.getInviteCodesUses(codes)
44
-
45
- const resultCursor = keyset.packFromResult(res)
46
- const codeDetails = res.map(
47
- ({ disabled, createdAt, ...row }): CodeDetail => ({
48
- ...row,
49
- createdAt,
50
- disabled: disabled === 1,
51
- uses: uses[row.code] ?? [],
52
- }),
53
- )
54
-
55
- return {
56
- encoding: 'application/json' as const,
57
- body: {
58
- cursor: resultCursor,
59
- codes: codeDetails,
60
- },
61
- }
62
- },
63
- })
64
- }
65
-
66
- function createKeyset(ctx: AppContext, sort?: string): GenericKeyset<any, any> {
67
- const { ref } = ctx.accountManager.db.db.dynamic
68
-
69
- if (sort === 'recent') {
70
- return new TimeCodeKeyset(ref('createdAt'), ref('code'))
71
- }
72
-
73
- if (sort === 'usage') {
74
- return new UseCodeKeyset(ref('uses'), ref('code'))
75
- }
76
-
77
- throw new InvalidRequestError(`unknown sort method: ${sort}`)
78
- }
79
-
80
- type TimeCodeResult = { createdAt: string; code: string }
81
-
82
- export class TimeCodeKeyset extends GenericKeyset<TimeCodeResult, Cursor> {
83
- labelResult(result: TimeCodeResult): Cursor {
84
- return { primary: result.createdAt, secondary: result.code }
85
- }
86
- labeledResultToCursor(labeled: Cursor) {
87
- return {
88
- primary: new Date(labeled.primary).getTime().toString(),
89
- secondary: labeled.secondary,
90
- }
91
- }
92
- cursorToLabeledResult(cursor: Cursor) {
93
- const primaryDate = new Date(parseInt(cursor.primary, 10))
94
- if (isNaN(primaryDate.getTime())) {
95
- throw new InvalidRequestError('Malformed cursor')
96
- }
97
- return {
98
- primary: primaryDate.toISOString(),
99
- secondary: cursor.secondary,
100
- }
101
- }
102
- }
103
-
104
- type UseCodeResult = { uses: number; code: string }
105
-
106
- export class UseCodeKeyset extends GenericKeyset<UseCodeResult, LabeledResult> {
107
- labelResult(result: UseCodeResult): LabeledResult {
108
- return { primary: result.uses, secondary: result.code }
109
- }
110
- labeledResultToCursor(labeled: Cursor) {
111
- return {
112
- primary: labeled.primary.toString(),
113
- secondary: labeled.secondary,
114
- }
115
- }
116
- cursorToLabeledResult(cursor: Cursor) {
117
- const primaryCode = parseInt(cursor.primary, 10)
118
- if (isNaN(primaryCode)) {
119
- throw new InvalidRequestError('Malformed cursor')
120
- }
121
- return {
122
- primary: primaryCode,
123
- secondary: cursor.secondary,
124
- }
125
- }
126
- }
@@ -1,76 +0,0 @@
1
- import { parseCid } from '@atproto/lex-data'
2
- import { AtUri } from '@atproto/syntax'
3
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
4
- import { AppContext } from '../../../../context.js'
5
- import { com } from '../../../../lexicons/index.js'
6
-
7
- export default function (server: Server, ctx: AppContext) {
8
- server.add(com.atproto.admin.getSubjectStatus, {
9
- auth: ctx.authVerifier.moderator,
10
- handler: async ({ params }) => {
11
- const { did, uri, blob } = params
12
- let body: com.atproto.admin.getSubjectStatus.$OutputBody | null = null
13
- if (blob) {
14
- if (!did) {
15
- throw new InvalidRequestError(
16
- 'Must provide a did to request blob state',
17
- )
18
- }
19
- const takedown = await ctx.actorStore.read(did, (store) =>
20
- store.repo.blob.getBlobTakedownStatus(parseCid(blob)),
21
- )
22
- if (takedown) {
23
- body = {
24
- subject: {
25
- $type: 'com.atproto.admin.defs#repoBlobRef',
26
- did: did,
27
- cid: blob,
28
- },
29
- takedown,
30
- }
31
- }
32
- } else if (uri) {
33
- const parsedUri = new AtUri(uri)
34
- const [takedown, cid] = await ctx.actorStore.read(
35
- parsedUri.hostname,
36
- (store) =>
37
- Promise.all([
38
- store.record.getRecordTakedownStatus(parsedUri),
39
- store.record.getCurrentRecordCid(parsedUri),
40
- ]),
41
- )
42
- if (cid && takedown) {
43
- body = {
44
- subject: {
45
- $type: 'com.atproto.repo.strongRef',
46
- uri: parsedUri.toString(),
47
- cid: cid.toString(),
48
- },
49
- takedown,
50
- }
51
- }
52
- } else if (did) {
53
- const status = await ctx.accountManager.getAccountAdminStatus(did)
54
- if (status) {
55
- body = {
56
- subject: {
57
- $type: 'com.atproto.admin.defs#repoRef',
58
- did: did,
59
- },
60
- takedown: status.takedown,
61
- deactivated: status.deactivated,
62
- }
63
- }
64
- } else {
65
- throw new InvalidRequestError('No provided subject')
66
- }
67
- if (body === null) {
68
- throw new InvalidRequestError('Subject not found', 'NotFound')
69
- }
70
- return {
71
- encoding: 'application/json' as const,
72
- body,
73
- }
74
- },
75
- })
76
- }
@@ -1,31 +0,0 @@
1
- import { Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import deleteAccount from './deleteAccount.js'
4
- import disableAccountInvites from './disableAccountInvites.js'
5
- import disableInviteCodes from './disableInviteCodes.js'
6
- import enableAccountInvites from './enableAccountInvites.js'
7
- import getAccountInfo from './getAccountInfo.js'
8
- import getAccountInfos from './getAccountInfos.js'
9
- import getInviteCodes from './getInviteCodes.js'
10
- import getSubjectStatus from './getSubjectStatus.js'
11
- import sendEmail from './sendEmail.js'
12
- import updateAccountEmail from './updateAccountEmail.js'
13
- import updateAccountHandle from './updateAccountHandle.js'
14
- import updateAccountPassword from './updateAccountPassword.js'
15
- import updateSubjectStatus from './updateSubjectStatus.js'
16
-
17
- export default function (server: Server, ctx: AppContext) {
18
- updateSubjectStatus(server, ctx)
19
- getSubjectStatus(server, ctx)
20
- getAccountInfo(server, ctx)
21
- getAccountInfos(server, ctx)
22
- enableAccountInvites(server, ctx)
23
- disableAccountInvites(server, ctx)
24
- disableInviteCodes(server, ctx)
25
- getInviteCodes(server, ctx)
26
- updateAccountHandle(server, ctx)
27
- updateAccountEmail(server, ctx)
28
- updateAccountPassword(server, ctx)
29
- sendEmail(server, ctx)
30
- deleteAccount(server, ctx)
31
- }
@@ -1,47 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- server.add(com.atproto.admin.sendEmail, {
7
- auth: ctx.authVerifier.moderator,
8
- handler: async ({ input: { body }, req }) => {
9
- const { content, recipientDid, subject = 'Message via your PDS' } = body
10
-
11
- const account = await ctx.accountManager.getAccount(recipientDid, {
12
- includeDeactivated: true,
13
- includeTakenDown: true,
14
- })
15
- if (!account) {
16
- throw new InvalidRequestError('Recipient not found')
17
- }
18
-
19
- if (ctx.entrywayClient) {
20
- const { headers } = await ctx.entrywayAuthHeaders(
21
- req,
22
- recipientDid,
23
- com.atproto.admin.sendEmail.$lxm,
24
- )
25
-
26
- return ctx.entrywayClient.xrpc(com.atproto.admin.sendEmail, {
27
- headers,
28
- body,
29
- })
30
- }
31
-
32
- if (!account.email) {
33
- throw new InvalidRequestError('account does not have an email address')
34
- }
35
-
36
- await ctx.moderationMailer.send(
37
- { content },
38
- { subject, to: account.email },
39
- )
40
-
41
- return {
42
- encoding: 'application/json' as const,
43
- body: { sent: true },
44
- }
45
- },
46
- })
47
- }
@@ -1,32 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- server.add(com.atproto.admin.updateAccountEmail, {
7
- auth: ctx.authVerifier.adminToken,
8
- handler: async ({ input: { body }, req }) => {
9
- const account = await ctx.accountManager.getAccount(body.account, {
10
- includeDeactivated: true,
11
- includeTakenDown: true,
12
- })
13
- if (!account) {
14
- throw new InvalidRequestError(`Account does not exist: ${body.account}`)
15
- }
16
-
17
- if (ctx.entrywayClient) {
18
- const { headers } = ctx.entrywayPassthruHeaders(req)
19
- await ctx.entrywayClient.xrpc(com.atproto.admin.updateAccountEmail, {
20
- headers,
21
- body,
22
- })
23
- return
24
- }
25
-
26
- await ctx.accountManager.updateAccountEmail({
27
- did: account.did,
28
- email: body.email,
29
- })
30
- },
31
- })
32
- }
@@ -1,47 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { AppContext } from '../../../../context.js'
3
- import { com } from '../../../../lexicons/index.js'
4
-
5
- export default function (server: Server, ctx: AppContext) {
6
- const { entrywayClient } = ctx
7
-
8
- if (entrywayClient) {
9
- server.add(com.atproto.admin.updateAccountHandle, {
10
- auth: ctx.authVerifier.adminToken,
11
- handler: async ({ input: { body } }) => {
12
- const { did, handle } = await ctx.accountManager.validateHandleUpdate(
13
- body.did,
14
- body.handle,
15
- { allowAnyValid: true },
16
- )
17
-
18
- // the pds defers to the entryway for updating the handle in the user's
19
- // did doc. here was just check that the handle is already
20
- // bidirectionally confirmed.
21
- //
22
- // -> entryway(identity.updateHandle) [update handle, submit plc op]
23
- // -> pds(admin.updateAccountHandle) [track handle, sequence handle update]
24
- //
25
- // @TODO if handle is taken according to this PDS, should we force-update?
26
- const doc = await ctx.idResolver.did
27
- .resolveAtprotoData(did, true)
28
- .catch(() => undefined)
29
-
30
- if (!doc || doc.handle !== handle) {
31
- throw new InvalidRequestError('Handle does not match DID doc')
32
- }
33
-
34
- await ctx.accountManager.updateAccountHandle(did, handle)
35
- },
36
- })
37
- } else {
38
- server.add(com.atproto.admin.updateAccountHandle, {
39
- auth: ctx.authVerifier.adminToken,
40
- handler: async ({ input: { body } }) => {
41
- await ctx.accountManager.updateHandle(body.did, body.handle, {
42
- allowAnyValid: true,
43
- })
44
- },
45
- })
46
- }
47
- }
@@ -1,34 +0,0 @@
1
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
2
- import { NEW_PASSWORD_MAX_LENGTH } from '../../../../account-manager/helpers/scrypt.js'
3
- import { AppContext } from '../../../../context.js'
4
- import { com } from '../../../../lexicons/index.js'
5
-
6
- export default function (server: Server, ctx: AppContext) {
7
- const { entrywayClient } = ctx
8
-
9
- if (entrywayClient) {
10
- server.add(com.atproto.admin.updateAccountPassword, {
11
- auth: ctx.authVerifier.adminToken,
12
- handler: async ({ input: { body }, req }) => {
13
- const { headers } = ctx.entrywayPassthruHeaders(req)
14
- await entrywayClient.xrpc(com.atproto.admin.updateAccountPassword, {
15
- body,
16
- headers,
17
- })
18
- },
19
- })
20
- } else {
21
- server.add(com.atproto.admin.updateAccountPassword, {
22
- auth: ctx.authVerifier.adminToken,
23
- handler: async ({ input: { body } }) => {
24
- const { did, password } = body
25
-
26
- if (password.length > NEW_PASSWORD_MAX_LENGTH) {
27
- throw new InvalidRequestError('Invalid password length.')
28
- }
29
-
30
- await ctx.accountManager.updateAccountPassword({ did, password })
31
- },
32
- })
33
- }
34
- }
@@ -1,68 +0,0 @@
1
- import { parseCid } from '@atproto/lex-data'
2
- import { AtUri } from '@atproto/syntax'
3
- import { InvalidRequestError, Server } from '@atproto/xrpc-server'
4
- import { AppContext } from '../../../../context.js'
5
- import { com } from '../../../../lexicons/index.js'
6
-
7
- export default function (server: Server, ctx: AppContext) {
8
- server.add(com.atproto.admin.updateSubjectStatus, {
9
- auth: ctx.authVerifier.moderator,
10
- handler: async ({ input }) => {
11
- const { subject, takedown, deactivated } = input.body
12
-
13
- if (takedown?.applied && deactivated != null && !deactivated.applied) {
14
- throw new InvalidRequestError(
15
- `Cannot activate and takedown an account at the same time`,
16
- )
17
- }
18
-
19
- if (takedown) {
20
- if (com.atproto.admin.defs.repoRef.$isTypeOf(subject)) {
21
- await ctx.accountManager.takedownAccount(subject.did, takedown)
22
- } else if (com.atproto.repo.strongRef.$isTypeOf(subject)) {
23
- const uri = new AtUri(subject.uri)
24
- await ctx.actorStore.transact(uri.hostname, async (store) => {
25
- await store.record.updateRecordTakedownStatus(uri, takedown)
26
- })
27
- } else if (com.atproto.admin.defs.repoBlobRef.$isTypeOf(subject)) {
28
- await ctx.actorStore.transact(subject.did, async (store) => {
29
- await store.repo.blob.updateBlobTakedownStatus(
30
- parseCid(subject.cid),
31
- takedown,
32
- )
33
- })
34
- } else {
35
- throw new InvalidRequestError(`Invalid subject (${subject.$type})`)
36
- }
37
- }
38
-
39
- if (deactivated) {
40
- if (com.atproto.admin.defs.repoRef.$isTypeOf(subject)) {
41
- if (deactivated.applied) {
42
- await ctx.accountManager.deactivateAccount(subject.did)
43
- } else {
44
- await ctx.accountManager.activateAccount(subject.did)
45
- }
46
- }
47
- }
48
-
49
- // @NOTE accountManager will sequence an account status when updating the
50
- // status, so we don't *need* to sequence the account status here.
51
- // However, this endpoint historically has always sequenced the account
52
- // status.
53
- if (!takedown && !deactivated) {
54
- if (com.atproto.admin.defs.repoRef.$isTypeOf(subject)) {
55
- await ctx.accountManager.sequenceAccountStatus(subject.did)
56
- }
57
- }
58
-
59
- return {
60
- encoding: 'application/json' as const,
61
- body: {
62
- subject,
63
- takedown,
64
- },
65
- }
66
- },
67
- })
68
- }
@@ -1,66 +0,0 @@
1
- import express from 'express'
2
- import { l } from '@atproto/lex'
3
- import { INVALID_HANDLE } from '@atproto/syntax'
4
- import { ActorAccount } from '../../../../account-manager/helpers/account.js'
5
- import { CodeDetail } from '../../../../account-manager/helpers/invite.js'
6
- import { com } from '../../../../lexicons/index.js'
7
-
8
- // Output designed to passed as second arg to AtpAgent methods.
9
- // The encoding field here is a quirk of the AtpAgent.
10
- export function authPassthru(
11
- req: express.Request,
12
- withEncoding?: false,
13
- ): { headers: { authorization: string }; encoding: undefined } | undefined
14
-
15
- export function authPassthru(
16
- req: express.Request,
17
- withEncoding: true,
18
- ):
19
- | { headers: { authorization: string }; encoding: 'application/json' }
20
- | undefined
21
-
22
- export function authPassthru(req: express.Request, withEncoding?: boolean) {
23
- if (req.headers.authorization) {
24
- return {
25
- headers: { authorization: req.headers.authorization },
26
- encoding: withEncoding ? 'application/json' : undefined,
27
- }
28
- }
29
- }
30
-
31
- export function formatAccountInfo(
32
- account: ActorAccount,
33
- {
34
- managesOwnInvites,
35
- invitedBy,
36
- invites,
37
- }: {
38
- managesOwnInvites: boolean
39
- invites: Map<string, CodeDetail[]> | CodeDetail[]
40
- invitedBy: Record<string, CodeDetail>
41
- },
42
- ): com.atproto.admin.defs.AccountView {
43
- let invitesResults: CodeDetail[] | undefined
44
- if (managesOwnInvites) {
45
- if (Array.isArray(invites)) {
46
- invitesResults = invites
47
- } else {
48
- invitesResults = invites.get(account.did) || []
49
- }
50
- }
51
- return {
52
- did: account.did as l.DidString,
53
- handle: (account.handle ?? INVALID_HANDLE) as l.HandleString,
54
- email: account.email ?? undefined,
55
- indexedAt: account.createdAt as l.DatetimeString,
56
- emailConfirmedAt:
57
- (account.emailConfirmedAt as l.DatetimeString | undefined) ?? undefined,
58
- invitedBy: managesOwnInvites ? invitedBy[account.did] : undefined,
59
- invites: invitesResults,
60
- invitesDisabled: managesOwnInvites
61
- ? account.invitesDisabled === 1
62
- : undefined,
63
- deactivatedAt:
64
- (account.deactivatedAt as l.DatetimeString | undefined) ?? undefined,
65
- }
66
- }