@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,340 +0,0 @@
1
- import { AtpAgent } from '@atproto/api'
2
- import { SeedClient, TestNetwork } from '@atproto/dev-env'
3
- import type { DidString } from '@atproto/syntax'
4
- import { forSnapshot } from '../_util.js'
5
- import basicSeed from '../seeds/basic.js'
6
-
7
- describe('proxies admin requests', () => {
8
- let network: TestNetwork
9
- let agent: AtpAgent
10
- let sc: SeedClient
11
-
12
- let moderator: DidString
13
-
14
- beforeAll(async () => {
15
- network = await TestNetwork.create({
16
- dbPostgresSchema: 'proxy_admin',
17
- pds: {
18
- inviteRequired: true,
19
- },
20
- })
21
- agent = network.pds.getAgent()
22
- sc = network.getSeedClient()
23
- const { data: invite } =
24
- await agent.api.com.atproto.server.createInviteCode(
25
- { useCount: 10 },
26
- {
27
- encoding: 'application/json',
28
- headers: network.pds.adminAuthHeaders(),
29
- },
30
- )
31
- await basicSeed(sc, {
32
- inviteCode: invite.code,
33
- addModLabels: network.bsky,
34
- })
35
- const modAccount = await sc.createAccount('moderator', {
36
- handle: 'testmod.test',
37
- email: 'testmod@test.com',
38
- password: 'testmod-pass',
39
- inviteCode: invite.code,
40
- })
41
- moderator = modAccount.did
42
- await network.ozone.addModeratorDid(moderator)
43
-
44
- await network.processAll()
45
- })
46
-
47
- beforeAll(async () => {
48
- const { data: invite } =
49
- await agent.api.com.atproto.server.createInviteCode(
50
- { useCount: 1, forAccount: sc.dids.alice },
51
- {
52
- headers: network.pds.adminAuthHeaders(),
53
- encoding: 'application/json',
54
- },
55
- )
56
- await agent.api.com.atproto.admin.disableAccountInvites(
57
- { account: sc.dids.bob },
58
- { headers: network.pds.adminAuthHeaders(), encoding: 'application/json' },
59
- )
60
- await sc.createAccount('eve', {
61
- handle: 'eve.test',
62
- email: 'eve@test.com',
63
- password: 'password',
64
- inviteCode: invite.code,
65
- })
66
- })
67
-
68
- beforeEach(async () => {
69
- await network.processAll()
70
- })
71
-
72
- afterAll(async () => {
73
- await network?.close()
74
- })
75
-
76
- it('creates reports of a repo.', async () => {
77
- const { data: reportA } =
78
- await agent.api.com.atproto.moderation.createReport(
79
- {
80
- reasonType: 'com.atproto.moderation.defs#reasonSpam',
81
- subject: {
82
- $type: 'com.atproto.admin.defs#repoRef',
83
- did: sc.dids.bob,
84
- },
85
- },
86
- {
87
- headers: sc.getHeaders(sc.dids.alice),
88
- encoding: 'application/json',
89
- },
90
- )
91
- const { data: reportB } =
92
- await agent.api.com.atproto.moderation.createReport(
93
- {
94
- reasonType: 'com.atproto.moderation.defs#reasonOther',
95
- reason: 'impersonation',
96
- subject: {
97
- $type: 'com.atproto.admin.defs#repoRef',
98
- did: sc.dids.bob,
99
- },
100
- },
101
- {
102
- headers: sc.getHeaders(sc.dids.carol),
103
- encoding: 'application/json',
104
- },
105
- )
106
- expect(forSnapshot([reportA, reportB])).toMatchSnapshot()
107
- })
108
-
109
- it('takes actions and resolves reports', async () => {
110
- const post = sc.posts[sc.dids.bob][1]
111
- const { data: actionA } = await agent.api.tools.ozone.moderation.emitEvent(
112
- {
113
- event: { $type: 'tools.ozone.moderation.defs#modEventAcknowledge' },
114
- subject: {
115
- $type: 'com.atproto.repo.strongRef',
116
- uri: post.ref.uriStr,
117
- cid: post.ref.cidStr,
118
- },
119
- createdBy: 'did:example:admin',
120
- // @ts-expect-error
121
- reason: 'Y',
122
- },
123
- {
124
- headers: sc.getHeaders(moderator),
125
- encoding: 'application/json',
126
- },
127
- )
128
- expect(forSnapshot(actionA)).toMatchSnapshot()
129
- const { data: actionB } = await agent.api.tools.ozone.moderation.emitEvent(
130
- {
131
- event: { $type: 'tools.ozone.moderation.defs#modEventAcknowledge' },
132
- subject: {
133
- $type: 'com.atproto.admin.defs#repoRef',
134
- did: sc.dids.bob,
135
- },
136
- createdBy: 'did:example:admin',
137
- // @ts-expect-error
138
- reason: 'Y',
139
- },
140
- {
141
- headers: sc.getHeaders(moderator),
142
- encoding: 'application/json',
143
- },
144
- )
145
- expect(forSnapshot(actionB)).toMatchSnapshot()
146
- })
147
-
148
- it('fetches moderation events.', async () => {
149
- const { data: result } = await agent.api.tools.ozone.moderation.queryEvents(
150
- {
151
- subject: sc.posts[sc.dids.bob][1].ref.uriStr,
152
- },
153
- { headers: sc.getHeaders(moderator) },
154
- )
155
- expect(forSnapshot(result.events)).toMatchSnapshot()
156
- })
157
-
158
- it('fetches repo details.', async () => {
159
- const { data: result } = await agent.api.tools.ozone.moderation.getRepo(
160
- { did: sc.dids.eve },
161
- { headers: sc.getHeaders(moderator) },
162
- )
163
- expect(forSnapshot(result)).toMatchSnapshot()
164
- })
165
-
166
- it('fetches record details.', async () => {
167
- const post = sc.posts[sc.dids.bob][1]
168
- const { data: result } = await agent.api.tools.ozone.moderation.getRecord(
169
- { uri: post.ref.uriStr },
170
- { headers: sc.getHeaders(moderator) },
171
- )
172
- expect(forSnapshot(result)).toMatchSnapshot()
173
- })
174
-
175
- it('fetches event details.', async () => {
176
- const { data: result } = await agent.api.tools.ozone.moderation.getEvent(
177
- { id: 2 },
178
- { headers: sc.getHeaders(moderator) },
179
- )
180
- expect(forSnapshot(result)).toMatchSnapshot()
181
- })
182
-
183
- it('fetches a list of events.', async () => {
184
- const { data: result } = await agent.api.tools.ozone.moderation.queryEvents(
185
- { subject: sc.dids.bob },
186
- { headers: sc.getHeaders(moderator) },
187
- )
188
- expect(forSnapshot(result.events)).toMatchSnapshot()
189
- })
190
-
191
- it('searches repos.', async () => {
192
- const { data: result } = await agent.api.tools.ozone.moderation.searchRepos(
193
- { term: 'alice' },
194
- { headers: sc.getHeaders(moderator) },
195
- )
196
- expect(forSnapshot(result.repos)).toMatchSnapshot()
197
- })
198
-
199
- it('passes through errors.', async () => {
200
- const tryGetRepo = agent.api.tools.ozone.moderation.getRepo(
201
- { did: 'did:does:not:exist' },
202
- { headers: sc.getHeaders(moderator) },
203
- )
204
- await expect(tryGetRepo).rejects.toThrow('Repo not found')
205
- const tryGetRecord = agent.api.tools.ozone.moderation.getRecord(
206
- { uri: 'at://did:does:not:exist/bad.collection.name/badrkey' },
207
- { headers: sc.getHeaders(moderator) },
208
- )
209
- await expect(tryGetRecord).rejects.toThrow('Could not locate record')
210
- })
211
-
212
- it('takesdown and labels repos, and reverts.', async () => {
213
- // takedown repo
214
- await agent.api.tools.ozone.moderation.emitEvent(
215
- {
216
- event: { $type: 'tools.ozone.moderation.defs#modEventTakedown' },
217
- subject: {
218
- $type: 'com.atproto.admin.defs#repoRef',
219
- did: sc.dids.alice,
220
- },
221
- createdBy: 'did:example:admin',
222
- // @ts-expect-error
223
- reason: 'Y',
224
- createLabelVals: ['dogs'],
225
- negateLabelVals: ['cats'],
226
- },
227
- {
228
- headers: sc.getHeaders(moderator),
229
- encoding: 'application/json',
230
- },
231
- )
232
- await network.processAll()
233
- // check profile and labels
234
- const tryGetProfileAppview = agent.api.app.bsky.actor.getProfile(
235
- { actor: sc.dids.alice },
236
- {
237
- headers: { ...sc.getHeaders(sc.dids.carol) },
238
- },
239
- )
240
- await expect(tryGetProfileAppview).rejects.toThrow(
241
- 'Account has been suspended',
242
- )
243
- // reverse action
244
- await agent.api.tools.ozone.moderation.emitEvent(
245
- {
246
- subject: {
247
- $type: 'com.atproto.admin.defs#repoRef',
248
- did: sc.dids.alice,
249
- },
250
- event: {
251
- $type: 'tools.ozone.moderation.defs#modEventReverseTakedown',
252
- },
253
- createdBy: 'did:example:admin',
254
- // @ts-expect-error
255
- reason: 'X',
256
- },
257
- {
258
- headers: sc.getHeaders(moderator),
259
- encoding: 'application/json',
260
- },
261
- )
262
- await network.processAll()
263
- // check profile and labels
264
- const { data: profileAppview } = await agent.api.app.bsky.actor.getProfile(
265
- { actor: sc.dids.alice },
266
- {
267
- headers: { ...sc.getHeaders(sc.dids.carol) },
268
- },
269
- )
270
- expect(profileAppview).toEqual(
271
- expect.objectContaining({ did: sc.dids.alice, handle: 'alice.test' }),
272
- )
273
- })
274
-
275
- it('takesdown and labels records, and reverts.', async () => {
276
- const post = sc.posts[sc.dids.alice][0]
277
- // takedown post
278
- await agent.api.tools.ozone.moderation.emitEvent(
279
- {
280
- event: { $type: 'tools.ozone.moderation.defs#modEventTakedown' },
281
- subject: {
282
- $type: 'com.atproto.repo.strongRef',
283
- uri: post.ref.uriStr,
284
- cid: post.ref.cidStr,
285
- },
286
- createdBy: 'did:example:admin',
287
- // @ts-expect-error
288
- reason: 'Y',
289
- createLabelVals: ['dogs'],
290
- negateLabelVals: ['cats'],
291
- },
292
- {
293
- headers: sc.getHeaders(moderator),
294
- encoding: 'application/json',
295
- },
296
- )
297
- await network.processAll()
298
-
299
- // check takedown label has been created
300
- const label = await network.ozone.ctx.db.db
301
- .selectFrom('label')
302
- .selectAll()
303
- .where('val', '=', '!takedown')
304
- .where('uri', '=', post.ref.uriStr)
305
- .where('cid', '=', post.ref.cidStr)
306
- .executeTakeFirst()
307
- expect(label).toBeDefined()
308
- expect(label?.neg).toBe(false)
309
-
310
- // reverse action
311
- await agent.api.tools.ozone.moderation.emitEvent(
312
- {
313
- subject: {
314
- $type: 'com.atproto.repo.strongRef',
315
- uri: post.ref.uriStr,
316
- cid: post.ref.cidStr,
317
- },
318
- event: { $type: 'tools.ozone.moderation.defs#modEventReverseTakedown' },
319
- createdBy: 'did:example:admin',
320
- // @ts-expect-error
321
- reason: 'X',
322
- },
323
- {
324
- headers: sc.getHeaders(moderator),
325
- encoding: 'application/json',
326
- },
327
- )
328
- await network.processAll()
329
-
330
- // check takedown label has been negated
331
- const labelNeg = await network.ozone.ctx.db.db
332
- .selectFrom('label')
333
- .selectAll()
334
- .where('val', '=', '!takedown')
335
- .where('uri', '=', post.ref.uriStr)
336
- .where('cid', '=', post.ref.cidStr)
337
- .executeTakeFirst()
338
- expect(labelNeg?.neg).toBe(true)
339
- })
340
- })
@@ -1,66 +0,0 @@
1
- import { AtUri, AtpAgent } from '@atproto/api'
2
- import { SeedClient, TestNetwork } from '@atproto/dev-env'
3
- import { InvalidRequestError } from '@atproto/xrpc-server'
4
- import { forSnapshot } from '../_util.js'
5
- import basicSeed from '../seeds/basic.js'
6
-
7
- describe('feedgen proxy view', () => {
8
- let network: TestNetwork
9
- let agent: AtpAgent
10
- let sc: SeedClient
11
- let feedUri: AtUri
12
-
13
- beforeAll(async () => {
14
- network = await TestNetwork.create({
15
- dbPostgresSchema: 'proxy_feedgen',
16
- })
17
- agent = network.pds.getAgent()
18
- sc = network.getSeedClient()
19
- await basicSeed(sc, { addModLabels: network.bsky })
20
-
21
- feedUri = AtUri.make(sc.dids.alice, 'app.bsky.feed.generator', 'mutuals')
22
-
23
- const feedGen = await network.createFeedGen({
24
- [feedUri.toString()]: ({ params }) => {
25
- if (params.feed !== feedUri.toString()) {
26
- throw new InvalidRequestError('Unknown feed')
27
- }
28
- return {
29
- encoding: 'application/json',
30
- body: {
31
- feed: [
32
- { post: sc.posts[sc.dids.alice][0].ref.uriStr },
33
- { post: sc.posts[sc.dids.carol][0].ref.uriStr },
34
- ],
35
- },
36
- }
37
- },
38
- })
39
-
40
- // publish feed
41
- await agent.api.app.bsky.feed.generator.create(
42
- { repo: sc.dids.alice, rkey: feedUri.rkey },
43
- {
44
- did: feedGen.did,
45
- displayName: 'Test feed',
46
- createdAt: new Date().toISOString(),
47
- },
48
- sc.getHeaders(sc.dids.alice),
49
- )
50
- await network.processAll()
51
- })
52
-
53
- afterAll(async () => {
54
- await network?.close()
55
- })
56
-
57
- it('performs basic proxy of getFeed', async () => {
58
- const { data: feed } = await agent.api.app.bsky.feed.getFeed(
59
- { feed: feedUri.toString() },
60
- {
61
- headers: { ...sc.getHeaders(sc.dids.alice) },
62
- },
63
- )
64
- expect(forSnapshot(feed)).toMatchSnapshot()
65
- })
66
- })
@@ -1,85 +0,0 @@
1
- import { AtpAgent } from '@atproto/api'
2
- import { SeedClient, TestNetworkNoAppView } from '@atproto/dev-env'
3
- import { createServer, verifyJwt } from '@atproto/xrpc-server'
4
- import { app } from '../../src/lexicons/index.js'
5
- import { startServer } from '../_util.js'
6
- import usersSeed from '../seeds/users.js'
7
-
8
- describe('notif service proxy', () => {
9
- let network: TestNetworkNoAppView
10
- let notifServer: AsyncDisposable & { port: number }
11
- let notifDid: string
12
- let agent: AtpAgent
13
- let sc: SeedClient
14
- const spy: { current: unknown } = { current: null }
15
-
16
- beforeAll(async () => {
17
- network = await TestNetworkNoAppView.create({
18
- dbPostgresSchema: 'proxy_notifs',
19
- })
20
- const plc = network.plc.getClient()
21
- agent = network.pds.getAgent()
22
- sc = network.getSeedClient()
23
- await usersSeed(sc)
24
- await network.processAll()
25
- // piggybacking existing plc did, turn it into a notif service
26
- notifServer = await createMockNotifService(spy)
27
- notifDid = sc.dids.dan
28
- await plc.updateData(notifDid, network.pds.ctx.plcRotationKey, (x) => {
29
- x.services['bsky_notif'] = {
30
- type: 'BskyNotificationService',
31
- endpoint: `http://localhost:${notifServer.port}`,
32
- }
33
- return x
34
- })
35
- await network.pds.ctx.idResolver.did.resolve(notifDid, true)
36
- }, 20_000) // @NOTE seeding can take a while
37
-
38
- afterAll(async () => {
39
- await notifServer?.[Symbol.asyncDispose]()
40
- await network?.close()
41
- })
42
-
43
- it('proxies to notif service.', async () => {
44
- await agent.api.app.bsky.notification.registerPush(
45
- {
46
- serviceDid: notifDid,
47
- token: 'tok1',
48
- platform: 'web',
49
- appId: 'app1',
50
- },
51
- {
52
- headers: sc.getHeaders(sc.dids.bob),
53
- encoding: 'application/json',
54
- },
55
- )
56
- expect(spy.current?.['input']).toEqual({
57
- serviceDid: notifDid,
58
- token: 'tok1',
59
- platform: 'web',
60
- appId: 'app1',
61
- })
62
-
63
- const auth = await verifyJwt(
64
- spy.current?.['jwt'] as string,
65
- notifDid,
66
- 'app.bsky.notification.registerPush',
67
- async (did) => {
68
- const keypair = await network.pds.ctx.actorStore.keypair(did)
69
- return keypair.did()
70
- },
71
- )
72
- expect(auth.iss).toEqual(sc.dids.bob)
73
- })
74
- })
75
-
76
- async function createMockNotifService(ref: { current: unknown }) {
77
- const svc = createServer()
78
- svc.add(app.bsky.notification.registerPush, ({ input, req }) => {
79
- ref.current = {
80
- input: input.body,
81
- jwt: req.headers.authorization?.replace('Bearer ', ''),
82
- }
83
- })
84
- return startServer(svc.router)
85
- }
@@ -1,175 +0,0 @@
1
- import { AtpAgent } from '@atproto/api'
2
- import { SeedClient, TestNetwork } from '@atproto/dev-env'
3
- import type { DidString } from '@atproto/syntax'
4
- import basicSeed from '../seeds/basic.js'
5
-
6
- describe('proxies appview procedures', () => {
7
- let network: TestNetwork
8
- let agent: AtpAgent
9
- let sc: SeedClient
10
-
11
- let alice: DidString
12
- let bob: DidString
13
- let carol: DidString
14
-
15
- beforeAll(async () => {
16
- network = await TestNetwork.create({
17
- dbPostgresSchema: 'proxy_procedures',
18
- })
19
- agent = network.pds.getAgent()
20
- sc = network.getSeedClient()
21
- await basicSeed(sc, { addModLabels: network.bsky })
22
- await network.processAll()
23
- alice = sc.dids.alice
24
- bob = sc.dids.bob
25
- carol = sc.dids.carol
26
- })
27
-
28
- afterAll(async () => {
29
- await network?.close()
30
- })
31
-
32
- it('maintains muted actors.', async () => {
33
- // mute actors
34
- await agent.api.app.bsky.graph.muteActor(
35
- { actor: bob },
36
- {
37
- headers: sc.getHeaders(alice),
38
- encoding: 'application/json',
39
- },
40
- )
41
- await agent.api.app.bsky.graph.muteActor(
42
- { actor: carol },
43
- {
44
- headers: sc.getHeaders(alice),
45
- encoding: 'application/json',
46
- },
47
- )
48
- // check
49
- const { data: result1 } = await agent.api.app.bsky.graph.getMutes(
50
- {},
51
- { headers: sc.getHeaders(alice) },
52
- )
53
- expect(result1.mutes.map((x) => x.handle)).toEqual([
54
- 'carol.test',
55
- 'bob.test',
56
- ])
57
- // unmute actors
58
- await agent.api.app.bsky.graph.unmuteActor(
59
- { actor: bob },
60
- {
61
- headers: sc.getHeaders(alice),
62
- encoding: 'application/json',
63
- },
64
- )
65
- // check
66
- const { data: result2 } = await agent.api.app.bsky.graph.getMutes(
67
- {},
68
- { headers: sc.getHeaders(alice) },
69
- )
70
- expect(result2.mutes.map((x) => x.handle)).toEqual(['carol.test'])
71
- })
72
-
73
- it('maintains muted actor lists.', async () => {
74
- // setup lists
75
- const bobList = await agent.api.app.bsky.graph.list.create(
76
- { repo: bob },
77
- {
78
- name: 'bob mutes',
79
- purpose: 'app.bsky.graph.defs#modlist',
80
- description: "bob's list of mutes",
81
- createdAt: new Date().toISOString(),
82
- },
83
- sc.getHeaders(bob),
84
- )
85
- const carolList = await agent.api.app.bsky.graph.list.create(
86
- { repo: carol },
87
- {
88
- name: 'carol mutes',
89
- purpose: 'app.bsky.graph.defs#modlist',
90
- description: "carol's list of mutes",
91
- createdAt: new Date().toISOString(),
92
- },
93
- sc.getHeaders(carol),
94
- )
95
- await network.processAll()
96
-
97
- // mute lists
98
- await agent.api.app.bsky.graph.muteActorList(
99
- { list: bobList.uri },
100
- {
101
- headers: sc.getHeaders(alice),
102
- encoding: 'application/json',
103
- },
104
- )
105
- await agent.api.app.bsky.graph.muteActorList(
106
- { list: carolList.uri },
107
- {
108
- headers: sc.getHeaders(alice),
109
- encoding: 'application/json',
110
- },
111
- )
112
- await network.processAll()
113
- // check
114
- const { data: result1 } = await agent.api.app.bsky.graph.getListMutes(
115
- {},
116
- { headers: sc.getHeaders(alice) },
117
- )
118
- expect(result1.lists.map((x) => x.uri)).toEqual([
119
- carolList.uri,
120
- bobList.uri,
121
- ])
122
- // unmute lists
123
- await agent.api.app.bsky.graph.unmuteActorList(
124
- { list: bobList.uri },
125
- {
126
- headers: sc.getHeaders(alice),
127
- encoding: 'application/json',
128
- },
129
- )
130
- // check
131
- const { data: result2 } = await agent.api.app.bsky.graph.getListMutes(
132
- {},
133
- { headers: sc.getHeaders(alice) },
134
- )
135
- expect(result2.lists.map((x) => x.uri)).toEqual([carolList.uri])
136
- })
137
-
138
- it('maintains notification last seen state.', async () => {
139
- // check original notifs
140
- const { data: result1 } =
141
- await agent.api.app.bsky.notification.listNotifications(
142
- {},
143
- { headers: sc.getHeaders(alice) },
144
- )
145
- expect(result1.notifications.length).toBeGreaterThanOrEqual(5)
146
- expect(
147
- result1.notifications.every((n, i) => {
148
- return (i === 0 && !n.isRead) || (i !== 0 && n.isRead)
149
- }),
150
- ).toBe(true)
151
- // update last seen
152
- const { indexedAt: lastSeenAt } = result1.notifications[2]
153
- await agent.api.app.bsky.notification.updateSeen(
154
- { seenAt: lastSeenAt },
155
- {
156
- headers: sc.getHeaders(alice),
157
- encoding: 'application/json',
158
- },
159
- )
160
- // check
161
- const { data: result2 } =
162
- await agent.api.app.bsky.notification.listNotifications(
163
- {},
164
- { headers: sc.getHeaders(alice) },
165
- )
166
- expect(result2.notifications.some((n) => n.isRead)).toBe(true)
167
- expect(result2.notifications.some((n) => !n.isRead)).toBe(true)
168
- expect(result2.notifications).toEqual(
169
- result1.notifications.map((n) => ({
170
- ...n,
171
- isRead: n.indexedAt < lastSeenAt,
172
- })),
173
- )
174
- })
175
- })