@atproto/pds 0.5.12 → 0.5.14

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 (322) hide show
  1. package/CHANGELOG.md +36 -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/package.json +42 -38
  10. package/build.templates.cjs +0 -22
  11. package/example.env +0 -42
  12. package/jest.config.cjs +0 -27
  13. package/src/account-manager/account-manager.ts +0 -916
  14. package/src/account-manager/db/index.ts +0 -21
  15. package/src/account-manager/db/migrations/001-init.ts +0 -115
  16. package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
  17. package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
  18. package/src/account-manager/db/migrations/004-oauth.ts +0 -122
  19. package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
  20. package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
  21. package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
  22. package/src/account-manager/db/migrations/index.ts +0 -17
  23. package/src/account-manager/db/schema/account-device.ts +0 -14
  24. package/src/account-manager/db/schema/account.ts +0 -16
  25. package/src/account-manager/db/schema/actor.ts +0 -17
  26. package/src/account-manager/db/schema/app-password.ts +0 -13
  27. package/src/account-manager/db/schema/authorization-request.ts +0 -30
  28. package/src/account-manager/db/schema/authorized-client.ts +0 -23
  29. package/src/account-manager/db/schema/device.ts +0 -18
  30. package/src/account-manager/db/schema/email-token.ts +0 -19
  31. package/src/account-manager/db/schema/index.ts +0 -43
  32. package/src/account-manager/db/schema/invite-code.ts +0 -24
  33. package/src/account-manager/db/schema/lexicon.ts +0 -15
  34. package/src/account-manager/db/schema/refresh-token.ts +0 -11
  35. package/src/account-manager/db/schema/repo-root.ts +0 -12
  36. package/src/account-manager/db/schema/token.ts +0 -38
  37. package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
  38. package/src/account-manager/helpers/account-device.ts +0 -63
  39. package/src/account-manager/helpers/account.ts +0 -355
  40. package/src/account-manager/helpers/auth.ts +0 -222
  41. package/src/account-manager/helpers/authorization-request.ts +0 -90
  42. package/src/account-manager/helpers/authorized-client.ts +0 -75
  43. package/src/account-manager/helpers/device.ts +0 -47
  44. package/src/account-manager/helpers/email-token.ts +0 -87
  45. package/src/account-manager/helpers/invite.ts +0 -263
  46. package/src/account-manager/helpers/lexicon.ts +0 -67
  47. package/src/account-manager/helpers/password.ts +0 -136
  48. package/src/account-manager/helpers/repo.ts +0 -24
  49. package/src/account-manager/helpers/scrypt.ts +0 -53
  50. package/src/account-manager/helpers/token.ts +0 -158
  51. package/src/account-manager/helpers/used-refresh-token.ts +0 -30
  52. package/src/account-manager/oauth-store.ts +0 -880
  53. package/src/account-manager/scope-reference-getter.ts +0 -106
  54. package/src/actor-store/actor-store-reader.ts +0 -45
  55. package/src/actor-store/actor-store-resources.ts +0 -8
  56. package/src/actor-store/actor-store-transactor.ts +0 -31
  57. package/src/actor-store/actor-store-writer.ts +0 -17
  58. package/src/actor-store/actor-store.ts +0 -210
  59. package/src/actor-store/blob/reader.ts +0 -160
  60. package/src/actor-store/blob/transactor.ts +0 -383
  61. package/src/actor-store/db/index.ts +0 -20
  62. package/src/actor-store/db/migrations/001-init.ts +0 -105
  63. package/src/actor-store/db/migrations/index.ts +0 -5
  64. package/src/actor-store/db/schema/account-pref.ts +0 -11
  65. package/src/actor-store/db/schema/backlink.ts +0 -9
  66. package/src/actor-store/db/schema/blob.ts +0 -14
  67. package/src/actor-store/db/schema/index.ts +0 -23
  68. package/src/actor-store/db/schema/record-blob.ts +0 -8
  69. package/src/actor-store/db/schema/record.ts +0 -14
  70. package/src/actor-store/db/schema/repo-block.ts +0 -10
  71. package/src/actor-store/db/schema/repo-root.ts +0 -10
  72. package/src/actor-store/migrate.ts +0 -39
  73. package/src/actor-store/preference/reader.ts +0 -48
  74. package/src/actor-store/preference/transactor.ts +0 -55
  75. package/src/actor-store/preference/util.ts +0 -39
  76. package/src/actor-store/record/reader.ts +0 -374
  77. package/src/actor-store/record/transactor.ts +0 -111
  78. package/src/actor-store/repo/reader.ts +0 -31
  79. package/src/actor-store/repo/sql-repo-reader.ts +0 -150
  80. package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
  81. package/src/actor-store/repo/transactor.ts +0 -227
  82. package/src/api/app/bsky/actor/getPreferences.ts +0 -57
  83. package/src/api/app/bsky/actor/getProfile.ts +0 -41
  84. package/src/api/app/bsky/actor/getProfiles.ts +0 -51
  85. package/src/api/app/bsky/actor/index.ts +0 -13
  86. package/src/api/app/bsky/actor/putPreferences.ts +0 -62
  87. package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
  88. package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
  89. package/src/api/app/bsky/feed/getFeed.ts +0 -47
  90. package/src/api/app/bsky/feed/getPostThread.ts +0 -251
  91. package/src/api/app/bsky/feed/getTimeline.ts +0 -50
  92. package/src/api/app/bsky/feed/index.ts +0 -15
  93. package/src/api/app/bsky/index.ts +0 -11
  94. package/src/api/app/bsky/notification/index.ts +0 -7
  95. package/src/api/app/bsky/notification/registerPush.ts +0 -71
  96. package/src/api/app/bsky/util/resolver.ts +0 -20
  97. package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
  98. package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
  99. package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
  100. package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
  101. package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
  102. package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
  103. package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
  104. package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
  105. package/src/api/com/atproto/admin/index.ts +0 -31
  106. package/src/api/com/atproto/admin/sendEmail.ts +0 -47
  107. package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
  108. package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
  109. package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
  110. package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
  111. package/src/api/com/atproto/admin/util.ts +0 -66
  112. package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
  113. package/src/api/com/atproto/identity/index.ts +0 -17
  114. package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
  115. package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
  116. package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
  117. package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
  118. package/src/api/com/atproto/identity/updateHandle.ts +0 -66
  119. package/src/api/com/atproto/index.ts +0 -19
  120. package/src/api/com/atproto/moderation/createReport.ts +0 -41
  121. package/src/api/com/atproto/moderation/index.ts +0 -7
  122. package/src/api/com/atproto/repo/applyWrites.ts +0 -226
  123. package/src/api/com/atproto/repo/createRecord.ts +0 -143
  124. package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
  125. package/src/api/com/atproto/repo/describeRepo.ts +0 -43
  126. package/src/api/com/atproto/repo/getRecord.ts +0 -40
  127. package/src/api/com/atproto/repo/importRepo.ts +0 -101
  128. package/src/api/com/atproto/repo/index.ts +0 -25
  129. package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
  130. package/src/api/com/atproto/repo/listRecords.ts +0 -36
  131. package/src/api/com/atproto/repo/putRecord.ts +0 -211
  132. package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
  133. package/src/api/com/atproto/server/activateAccount.ts +0 -37
  134. package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
  135. package/src/api/com/atproto/server/confirmEmail.ts +0 -39
  136. package/src/api/com/atproto/server/createAccount.ts +0 -327
  137. package/src/api/com/atproto/server/createAppPassword.ts +0 -53
  138. package/src/api/com/atproto/server/createInviteCode.ts +0 -38
  139. package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
  140. package/src/api/com/atproto/server/createSession.ts +0 -97
  141. package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
  142. package/src/api/com/atproto/server/deleteAccount.ts +0 -85
  143. package/src/api/com/atproto/server/deleteSession.ts +0 -23
  144. package/src/api/com/atproto/server/describeServer.ts +0 -29
  145. package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
  146. package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
  147. package/src/api/com/atproto/server/getSession.ts +0 -80
  148. package/src/api/com/atproto/server/index.ts +0 -55
  149. package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
  150. package/src/api/com/atproto/server/refreshSession.ts +0 -72
  151. package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
  152. package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
  153. package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
  154. package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
  155. package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
  156. package/src/api/com/atproto/server/resetPassword.ts +0 -50
  157. package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
  158. package/src/api/com/atproto/server/updateEmail.ts +0 -52
  159. package/src/api/com/atproto/server/util.ts +0 -136
  160. package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
  161. package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
  162. package/src/api/com/atproto/sync/getBlob.ts +0 -61
  163. package/src/api/com/atproto/sync/getBlocks.ts +0 -37
  164. package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
  165. package/src/api/com/atproto/sync/getRecord.ts +0 -49
  166. package/src/api/com/atproto/sync/getRepo.ts +0 -75
  167. package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
  168. package/src/api/com/atproto/sync/index.ts +0 -27
  169. package/src/api/com/atproto/sync/listBlobs.ts +0 -33
  170. package/src/api/com/atproto/sync/listRepos.ts +0 -74
  171. package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
  172. package/src/api/com/atproto/sync/util.ts +0 -37
  173. package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
  174. package/src/api/com/atproto/temp/index.ts +0 -7
  175. package/src/api/index.ts +0 -10
  176. package/src/api/proxy.ts +0 -44
  177. package/src/app-view.ts +0 -24
  178. package/src/auth-output.ts +0 -52
  179. package/src/auth-routes.ts +0 -64
  180. package/src/auth-scope.ts +0 -40
  181. package/src/auth-verifier.ts +0 -668
  182. package/src/background.ts +0 -65
  183. package/src/basic-routes.ts +0 -52
  184. package/src/bsky-app-view.ts +0 -33
  185. package/src/config/config.ts +0 -553
  186. package/src/config/env.ts +0 -167
  187. package/src/config/index.ts +0 -3
  188. package/src/config/secrets.ts +0 -54
  189. package/src/context.ts +0 -523
  190. package/src/crawlers.ts +0 -46
  191. package/src/db/cast.ts +0 -52
  192. package/src/db/db.ts +0 -140
  193. package/src/db/index.ts +0 -4
  194. package/src/db/migrator.ts +0 -40
  195. package/src/db/pagination.ts +0 -132
  196. package/src/db/tables/moderation.ts +0 -80
  197. package/src/db/util.ts +0 -108
  198. package/src/did-cache/db/index.ts +0 -21
  199. package/src/did-cache/db/migrations.ts +0 -17
  200. package/src/did-cache/db/schema.ts +0 -9
  201. package/src/did-cache/index.ts +0 -131
  202. package/src/disk-blobstore.ts +0 -172
  203. package/src/error.ts +0 -19
  204. package/src/handle/explicit-slurs.ts +0 -22
  205. package/src/handle/index.ts +0 -49
  206. package/src/handle/reserved.ts +0 -1059
  207. package/src/image/image-url-builder.ts +0 -16
  208. package/src/index.ts +0 -189
  209. package/src/lexicons.ts +0 -4
  210. package/src/logger.ts +0 -35
  211. package/src/mailer/index.ts +0 -111
  212. package/src/mailer/moderation.ts +0 -33
  213. package/src/mailer/templates/confirm-email.d.ts +0 -4
  214. package/src/mailer/templates/confirm-email.hbs +0 -158
  215. package/src/mailer/templates/delete-account.d.ts +0 -4
  216. package/src/mailer/templates/delete-account.hbs +0 -156
  217. package/src/mailer/templates/plc-operation.d.ts +0 -4
  218. package/src/mailer/templates/plc-operation.hbs +0 -153
  219. package/src/mailer/templates/reset-password.d.ts +0 -4
  220. package/src/mailer/templates/reset-password.hbs +0 -154
  221. package/src/mailer/templates/update-email.d.ts +0 -4
  222. package/src/mailer/templates/update-email.hbs +0 -153
  223. package/src/mailer/templates.ts +0 -17
  224. package/src/pipethrough.ts +0 -716
  225. package/src/rate-limits.ts +0 -59
  226. package/src/read-after-write/index.ts +0 -3
  227. package/src/read-after-write/types.ts +0 -35
  228. package/src/read-after-write/util.ts +0 -101
  229. package/src/read-after-write/viewer.ts +0 -290
  230. package/src/redis.ts +0 -25
  231. package/src/repo/index.ts +0 -2
  232. package/src/repo/prepare.ts +0 -266
  233. package/src/repo/types.ts +0 -65
  234. package/src/scripts/README.md +0 -40
  235. package/src/scripts/index.ts +0 -20
  236. package/src/scripts/publish-identity.ts +0 -60
  237. package/src/scripts/rebuild-repo.ts +0 -119
  238. package/src/scripts/rotate-keys.ts +0 -146
  239. package/src/scripts/sequencer-recovery/index.ts +0 -23
  240. package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
  241. package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
  242. package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
  243. package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
  244. package/src/scripts/util.ts +0 -7
  245. package/src/sequencer/db/index.ts +0 -21
  246. package/src/sequencer/db/migrations/001-init.ts +0 -35
  247. package/src/sequencer/db/migrations/index.ts +0 -5
  248. package/src/sequencer/db/schema.ts +0 -19
  249. package/src/sequencer/events.ts +0 -199
  250. package/src/sequencer/index.ts +0 -3
  251. package/src/sequencer/outbox.ts +0 -123
  252. package/src/sequencer/sequencer.ts +0 -290
  253. package/src/util/compression.ts +0 -16
  254. package/src/util/debug.ts +0 -10
  255. package/src/util/http.ts +0 -31
  256. package/src/util/types.ts +0 -7
  257. package/src/well-known.ts +0 -30
  258. package/test.env +0 -2
  259. package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
  260. package/tests/_oauth_client_assets_middleware.ts +0 -23
  261. package/tests/_puppeteer.ts +0 -147
  262. package/tests/_types.d.ts +0 -16
  263. package/tests/_util.ts +0 -191
  264. package/tests/account-deactivation.test.ts +0 -204
  265. package/tests/account-deletion.test.ts +0 -300
  266. package/tests/account-manager.test.ts +0 -462
  267. package/tests/account-migration.test.ts +0 -221
  268. package/tests/account-status.test.ts +0 -206
  269. package/tests/account.test.ts +0 -595
  270. package/tests/app-passwords.test.ts +0 -262
  271. package/tests/auth.test.ts +0 -405
  272. package/tests/blob-deletes.test.ts +0 -204
  273. package/tests/create-post.test.ts +0 -79
  274. package/tests/crud.test.ts +0 -1595
  275. package/tests/db.test.ts +0 -170
  276. package/tests/email-confirmation.test.ts +0 -227
  277. package/tests/entryway-mock.ts +0 -323
  278. package/tests/entryway.test.ts +0 -145
  279. package/tests/file-uploads.test.ts +0 -301
  280. package/tests/get-service-auth.test.ts +0 -81
  281. package/tests/handle-validation.test.ts +0 -56
  282. package/tests/handles.test.ts +0 -274
  283. package/tests/invite-codes.test.ts +0 -367
  284. package/tests/invites-admin.test.ts +0 -252
  285. package/tests/moderation.test.ts +0 -280
  286. package/tests/moderator-auth.test.ts +0 -177
  287. package/tests/oauth.test.ts +0 -334
  288. package/tests/plc-operations.test.ts +0 -239
  289. package/tests/preferences.test.ts +0 -352
  290. package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
  291. package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
  292. package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
  293. package/tests/proxied/admin.test.ts +0 -340
  294. package/tests/proxied/feedgen.test.ts +0 -66
  295. package/tests/proxied/notif.test.ts +0 -85
  296. package/tests/proxied/procedures.test.ts +0 -175
  297. package/tests/proxied/proxy-catchall.test.ts +0 -256
  298. package/tests/proxied/proxy-header.test.ts +0 -239
  299. package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
  300. package/tests/proxied/read-after-write.test.ts +0 -382
  301. package/tests/proxied/views.test.ts +0 -608
  302. package/tests/races.test.ts +0 -89
  303. package/tests/rate-limits.test.ts +0 -70
  304. package/tests/recovery.test.ts +0 -180
  305. package/tests/seeds/basic.ts +0 -165
  306. package/tests/seeds/follows.ts +0 -57
  307. package/tests/seeds/likes.ts +0 -14
  308. package/tests/seeds/reposts.ts +0 -18
  309. package/tests/seeds/thread.ts +0 -40
  310. package/tests/seeds/users-bulk.ts +0 -246
  311. package/tests/seeds/users.ts +0 -67
  312. package/tests/sequencer.test.ts +0 -251
  313. package/tests/server.test.ts +0 -151
  314. package/tests/sync/invertible-ops.test.ts +0 -99
  315. package/tests/sync/list.test.ts +0 -43
  316. package/tests/sync/subscribe-repos.test.ts +0 -672
  317. package/tests/sync/sync.test.ts +0 -316
  318. package/tests/takedown-appeal.test.ts +0 -166
  319. package/tsconfig.build.json +0 -9
  320. package/tsconfig.build.tsbuildinfo +0 -1
  321. package/tsconfig.json +0 -7
  322. 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
- }