@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
package/src/well-known.ts DELETED
@@ -1,30 +0,0 @@
1
- import { Router } from 'express'
2
- import { HandleString } from '@atproto/syntax'
3
- import { AppContext } from './context.js'
4
-
5
- export const createRouter = (ctx: AppContext): Router => {
6
- const router = Router()
7
-
8
- router.get('/.well-known/atproto-did', async function (req, res) {
9
- const handle = req.hostname as HandleString
10
- const supportedHandle = ctx.cfg.identity.serviceHandleDomains.some(
11
- (host) => handle.endsWith(host) || handle === host.slice(1),
12
- )
13
- if (!supportedHandle) {
14
- return res.status(404).send('User not found')
15
- }
16
- let did: string | undefined
17
- try {
18
- const user = await ctx.accountManager.getAccount(handle)
19
- did = user?.did
20
- } catch (err) {
21
- return res.status(500).send('Internal Server Error')
22
- }
23
- if (!did) {
24
- return res.status(404).send('User not found')
25
- }
26
- res.type('text/plain').send(did)
27
- })
28
-
29
- return router
30
- }
package/test.env DELETED
@@ -1,2 +0,0 @@
1
- LOG_ENABLED=true
2
- LOG_DESTINATION=test.log
@@ -1,43 +0,0 @@
1
- // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
2
-
3
- exports[`appeal account takedown actor takedown allows appeal request. 1`] = `
4
- {
5
- "accountStats": {
6
- "$type": "tools.ozone.moderation.defs#accountStats",
7
- "appealCount": 0,
8
- "escalateCount": 0,
9
- "reportCount": 0,
10
- "suspendCount": 0,
11
- "takedownCount": 1,
12
- },
13
- "ageAssuranceState": "unknown",
14
- "appealed": true,
15
- "createdAt": "1970-01-01T00:00:00.000Z",
16
- "hosting": {
17
- "$type": "tools.ozone.moderation.defs#accountHosting",
18
- "status": "unknown",
19
- },
20
- "id": 1,
21
- "lastAppealedAt": "1970-01-01T00:00:00.000Z",
22
- "lastReportedAt": "1970-01-01T00:00:00.000Z",
23
- "lastReviewedAt": "1970-01-01T00:00:00.000Z",
24
- "lastReviewedBy": "user(0)",
25
- "priorityScore": 0,
26
- "recordsStats": {
27
- "$type": "tools.ozone.moderation.defs#recordsStats",
28
- },
29
- "reviewState": "tools.ozone.moderation.defs#reviewEscalated",
30
- "subject": {
31
- "$type": "com.atproto.admin.defs#repoRef",
32
- "did": "user(1)",
33
- },
34
- "subjectBlobCids": [],
35
- "subjectRepoHandle": "jeff.test",
36
- "tags": [
37
- "lang:und",
38
- "report:appeal",
39
- ],
40
- "takendown": true,
41
- "updatedAt": "1970-01-01T00:00:00.000Z",
42
- }
43
- `;
@@ -1,23 +0,0 @@
1
- import { IncomingMessage, ServerResponse } from 'node:http'
2
- import files from '@atproto/oauth-client-browser-example' with { type: 'json' }
3
-
4
- export function oauthClientAssetsMiddleware(
5
- req: IncomingMessage,
6
- res: ServerResponse,
7
- next?: (err?: unknown) => void,
8
- ): void {
9
- const path = req.url?.split('?')[0].slice(1) || 'index.html'
10
- const file = Object.hasOwn(files, path) ? files[path] : null
11
-
12
- if (file) {
13
- res
14
- .writeHead(200, 'OK', { 'content-type': file.mime })
15
- .end(Buffer.from(file.data, 'base64'))
16
- } else if (next) {
17
- next()
18
- } else {
19
- res
20
- .writeHead(404, 'Not Found', { 'content-type': 'text/plain' })
21
- .end('Page not found')
22
- }
23
- }
@@ -1,147 +0,0 @@
1
- import assert from 'node:assert'
2
- import { type Browser, Handler, type Page, Target, TargetType } from 'puppeteer'
3
-
4
- export class PageHelper implements AsyncDisposable {
5
- constructor(protected readonly page: Page) {}
6
-
7
- async goto(url: string | URL) {
8
- await this.page.goto(url.toString())
9
- }
10
-
11
- isClosed() {
12
- return this.page.isClosed()
13
- }
14
-
15
- async title() {
16
- await this.waitForNetworkIdle()
17
- return this.page.title()
18
- }
19
-
20
- async waitForNetworkIdle() {
21
- await this.page.waitForNetworkIdle()
22
- }
23
-
24
- async waitForPopup(run: () => Promise<unknown>): Promise<PageHelper> {
25
- const browser = this.page.browser()
26
- const popupPromise = new Promise<Page | null>((resolve, reject) => {
27
- const cleanup = () => {
28
- clearTimeout(timeout)
29
- browser.off('targetcreated', targetcreated)
30
- }
31
-
32
- const timeout = setTimeout(() => {
33
- cleanup()
34
- reject(new Error('Timeout waiting for popup'))
35
- }, 5_000)
36
-
37
- const targetcreated: Handler<Target> = async (target) => {
38
- switch (target.type()) {
39
- case TargetType.BACKGROUND_PAGE:
40
- case TargetType.PAGE: {
41
- cleanup()
42
- resolve(target.page())
43
- }
44
- }
45
- }
46
-
47
- browser.once('targetcreated', targetcreated)
48
- })
49
-
50
- await run()
51
- const popup = await popupPromise
52
- assert(popup, 'Popup page not found')
53
-
54
- return new PageHelper(popup)
55
- }
56
-
57
- async navigationAction(run: () => unknown | Promise<unknown>): Promise<void> {
58
- const promise = this.page.waitForNavigation({ timeout: 10_000 })
59
- await run()
60
- await promise
61
- }
62
-
63
- async navigationClick(text: string, tag = 'button') {
64
- return this.navigationAction(() => this.clickOnText(text, tag))
65
- }
66
-
67
- async assertTitle(expected: string) {
68
- await expect(this.title()).resolves.toBe(expected)
69
- }
70
-
71
- async clickOn(selector: string) {
72
- const elementHandle = await this.getVisibleElement(selector)
73
- await elementHandle.click()
74
- return elementHandle
75
- }
76
-
77
- async clickOnText(text: string, tag = 'button') {
78
- return this.clickOn(`${tag}::-p-text(${JSON.stringify(text)})`)
79
- }
80
-
81
- async clickOnAriaLabel(label: string, tag = 'button') {
82
- return this.clickOn(`${tag}[aria-label=${JSON.stringify(label)}]`)
83
- }
84
-
85
- async typeIn(selector: string, text: string) {
86
- const elementHandle = await this.getVisibleElement(selector)
87
- elementHandle.focus()
88
- await elementHandle.click({ clickCount: 3 }) // Select all existing text
89
- await elementHandle.press('Backspace') // Clear the input
90
- await elementHandle.type(text)
91
- return elementHandle
92
- }
93
-
94
- async typeInInput(name: string, text: string) {
95
- return this.typeIn(`input[name=${JSON.stringify(name)}]`, text)
96
- }
97
-
98
- async ensureTextVisibility(text: string, tag = 'p', timeout = 5_000) {
99
- await this.page.waitForSelector(
100
- `${tag}::-p-text(${JSON.stringify(text)})`,
101
- {
102
- visible: true,
103
- timeout,
104
- },
105
- )
106
- }
107
-
108
- async ensureNotification(text: string) {
109
- return this.ensureTextVisibility(text, 'div')
110
- }
111
-
112
- protected async getVisibleElement(selector: string) {
113
- const elementHandle = await this.page.waitForSelector(selector, {
114
- visible: true,
115
- timeout: 5_000,
116
- })
117
-
118
- assert(elementHandle, `Element not found: ${selector}`)
119
-
120
- return elementHandle
121
- }
122
-
123
- async [Symbol.asyncDispose]() {
124
- return this.page.close()
125
- }
126
-
127
- static async from(
128
- browser: Browser,
129
- options?: { languages?: readonly string[] },
130
- ) {
131
- const page = await browser.newPage()
132
-
133
- if (options?.languages?.length) {
134
- // Spoof navigator language settings
135
- await page.evaluateOnNewDocument(`
136
- Object.defineProperty(navigator, 'languages', {
137
- get: () => ${JSON.stringify(options.languages)},
138
- })
139
- Object.defineProperty(navigator, 'language', {
140
- get: () => ${JSON.stringify(options.languages[0])},
141
- })
142
- `)
143
- }
144
-
145
- return new PageHelper(page)
146
- }
147
- }
package/tests/_types.d.ts DELETED
@@ -1,16 +0,0 @@
1
- declare module 'nodemailer/lib/mailer' {
2
- namespace Mail {
3
- interface Options {
4
- from?: string | { name?: string; address: string }
5
- to?: string | string[]
6
- subject?: string
7
- text?: string
8
- html?: string
9
- [key: string]: any
10
- }
11
- }
12
- class Mail {
13
- constructor(transporter: any)
14
- }
15
- export = Mail
16
- }
package/tests/_util.ts DELETED
@@ -1,191 +0,0 @@
1
- import { RequestListener, createServer } from 'node:http'
2
- import { AddressInfo } from 'node:net'
3
- // eslint-disable-next-line import/default
4
- import httpTerminator from 'http-terminator'
5
- import { ToolsOzoneModerationDefs, lexToJson } from '@atproto/api'
6
- import { isCidString } from '@atproto/lex'
7
- import { isCid, isPlainObject } from '@atproto/lex-data'
8
- import { AtUri } from '@atproto/syntax'
9
-
10
- // Swap out identifiers and dates with stable
11
- // values for the purpose of snapshot testing
12
- export const forSnapshot = (obj: unknown) => {
13
- const records = { [kTake]: 'record' }
14
- const collections = { [kTake]: 'collection' }
15
- const users = { [kTake]: 'user' }
16
- const cids = { [kTake]: 'cids' }
17
- const unknown = { [kTake]: 'unknown' }
18
- const toWalk = lexToJson(obj as any) // remove any blobrefs/cids
19
- return mapLeafValues(toWalk, (item) => {
20
- if (isCid(item)) {
21
- return take(cids, item.toString())
22
- }
23
- if (typeof item !== 'string') {
24
- return item
25
- }
26
- const str = item.startsWith('did:plc:') ? `at://${item}` : item
27
- if (str.startsWith('at://')) {
28
- const uri = new AtUri(str)
29
- if (uri.rkey) {
30
- return take(records, str)
31
- }
32
- if (uri.collection) {
33
- return take(collections, str)
34
- }
35
- if (uri.hostname) {
36
- return take(users, str)
37
- }
38
- return take(unknown, str)
39
- }
40
- if (str.match(/^\d{4}-\d{2}-\d{2}T/)) {
41
- if (str.match(/\d{6}Z$/)) {
42
- return constantDate.replace('Z', '000Z') // e.g. microseconds in record createdAt
43
- } else if (str.endsWith('+00:00')) {
44
- return constantDate.replace('Z', '+00:00') // e.g. timezone in record createdAt
45
- } else {
46
- return constantDate
47
- }
48
- }
49
- // handles both pds and appview cursor separators
50
- if (str.match(/^\d+(?:__|::)bafy/)) {
51
- return constantKeysetCursor
52
- }
53
- if (str.match(/^\d+(?:__|::)did:plc/)) {
54
- return constantDidCursor
55
- }
56
- if (str.match(/\/image\/[^/]+\/.+\/did:plc:[^/]+\/[^/@]+(?:@[\w]+)?$/)) {
57
- // Match image urls (pds), stripping optional format suffix (e.g. @webp) for stable snapshots
58
- const match = str.match(
59
- /\/image\/([^/]+)\/.+\/(did:plc:[^/]+)\/([^/@]+)(?:@[\w]+)?$/,
60
- )
61
- if (!match) return str
62
- const [, sig, did, cid] = match
63
- return str
64
- .replace(sig, 'sig()')
65
- .replace(did, take(users, did))
66
- .replace(new RegExp(`${cid}(?:@\\w+)?`), take(cids, cid))
67
- }
68
- if (str.match(/\/img\/[^/]+\/.+\/did:plc:[^/]+\/[^/@]+(?:@[\w]+)?$/)) {
69
- // Match image urls (bsky w/ presets), stripping optional format suffix (e.g. @webp) for stable snapshots
70
- const match = str.match(
71
- /\/img\/[^/]+\/.+\/(did:plc:[^/]+)\/([^/@]+)(?:@[\w]+)?$/,
72
- )
73
- if (!match) return str
74
- const [, did, cid] = match
75
- return str
76
- .replace(did, take(users, did))
77
- .replace(new RegExp(`${cid}(?:@\\w+)?`), take(cids, cid))
78
- }
79
- if (str.startsWith('localhost-')) {
80
- return 'invite-code'
81
- }
82
- if (str.match(/^\d+::pds-public-url-/)) {
83
- return '0000000000000::invite-code'
84
- }
85
- if (isCidString(str)) {
86
- return take(cids, str)
87
- }
88
- return item
89
- })
90
- }
91
-
92
- // Feed testing utils
93
-
94
- // Useful for remapping ids in snapshot testing, to make snapshots deterministic.
95
- // E.g. you may use this to map this:
96
- // [{ uri: 'did://rad'}, { uri: 'did://bad' }, { uri: 'did://rad'}]
97
- // to this:
98
- // [{ uri: '0'}, { uri: '1' }, { uri: '0'}]
99
- const kTake = Symbol('take')
100
- export function take(obj, value: string): string
101
- export function take(obj, value: string | undefined): string | undefined
102
- export function take(
103
- obj: { [s: string]: number; [kTake]?: string },
104
- value: string | undefined,
105
- ): string | undefined {
106
- if (value === undefined) {
107
- return
108
- }
109
- if (!(value in obj)) {
110
- obj[value] = Object.keys(obj).length
111
- }
112
- const kind = obj[kTake]
113
- return typeof kind === 'string'
114
- ? `${kind}(${obj[value]})`
115
- : String(obj[value])
116
- }
117
-
118
- export const constantDate = new Date(0).toISOString()
119
- export const constantKeysetCursor = '0000000000000::bafycid'
120
- export const constantDidCursor = '0000000000000::did'
121
-
122
- const mapLeafValues = (obj: unknown, fn: (val: unknown) => unknown) => {
123
- if (Array.isArray(obj)) {
124
- return obj.map((item) => mapLeafValues(item, fn))
125
- }
126
- if (isPlainObject(obj)) {
127
- return Object.entries(obj).reduce(
128
- (collect, [name, value]) =>
129
- Object.assign(collect, { [name]: mapLeafValues(value, fn) }),
130
- {},
131
- )
132
- }
133
- return fn(obj)
134
- }
135
-
136
- export const paginateAll = async <T extends { cursor?: string }>(
137
- fn: (cursor?: string) => Promise<T>,
138
- limit = Infinity,
139
- ): Promise<T[]> => {
140
- const results: T[] = []
141
- let cursor
142
- do {
143
- const res = await fn(cursor)
144
- results.push(res)
145
- cursor = res.cursor
146
- } while (cursor && results.length < limit)
147
- return results
148
- }
149
-
150
- export async function startServer(listener: RequestListener) {
151
- return new Promise<AsyncDisposable & { port: number }>((resolve, reject) => {
152
- const onListen = () => {
153
- const port = (server.address() as AddressInfo).port
154
- resolve({ port, [Symbol.asyncDispose]: () => terminator.terminate() })
155
- cleanup()
156
- }
157
- const onError = (err: Error) => {
158
- reject(err)
159
- cleanup()
160
- }
161
- const cleanup = () => {
162
- server.removeListener('listening', onListen)
163
- server.removeListener('error', onError)
164
- }
165
-
166
- const server = createServer(listener)
167
- .listen(0)
168
- .once('listening', onListen)
169
- .once('error', onError)
170
-
171
- const terminator = httpTerminator.createHttpTerminator({ server })
172
- })
173
- }
174
-
175
- const normalizeSubjectStatus = (
176
- subject: ToolsOzoneModerationDefs.SubjectStatusView,
177
- ) => {
178
- return { ...subject, tags: subject.tags?.sort() }
179
- }
180
-
181
- export const forSubjectStatusSnapshot = (
182
- status:
183
- | ToolsOzoneModerationDefs.SubjectStatusView
184
- | ToolsOzoneModerationDefs.SubjectStatusView[],
185
- ) => {
186
- if (Array.isArray(status)) {
187
- return forSnapshot(status.map(normalizeSubjectStatus))
188
- }
189
-
190
- return forSnapshot(normalizeSubjectStatus(status))
191
- }
@@ -1,204 +0,0 @@
1
- import { AtpAgent } from '@atproto/api'
2
- import {
3
- ImageRef,
4
- SeedClient,
5
- TestNetworkNoAppView,
6
- basicSeed,
7
- } from '@atproto/dev-env'
8
- import type { DidString } from '@atproto/syntax'
9
-
10
- describe('account deactivation', () => {
11
- let network: TestNetworkNoAppView
12
-
13
- let sc: SeedClient
14
- let agent: AtpAgent
15
-
16
- let alice: DidString
17
- let aliceAvatar: ImageRef
18
-
19
- beforeAll(async () => {
20
- network = await TestNetworkNoAppView.create({
21
- dbPostgresSchema: 'account_deactivation',
22
- })
23
-
24
- sc = network.getSeedClient()
25
- agent = network.pds.getAgent()
26
-
27
- await basicSeed(sc)
28
- alice = sc.dids.alice
29
-
30
- aliceAvatar = await sc.uploadFile(
31
- alice,
32
- '../dev-env/assets/key-portrait-small.jpg',
33
- 'image/jpeg',
34
- )
35
- await sc.updateProfile(alice, {
36
- avatar: aliceAvatar.image,
37
- })
38
-
39
- await network.processAll()
40
- })
41
-
42
- afterAll(async () => {
43
- await network?.close()
44
- })
45
-
46
- it('deactivates account', async () => {
47
- await agent.com.atproto.server.deactivateAccount(
48
- {},
49
- { encoding: 'application/json', headers: sc.getHeaders(alice) },
50
- )
51
- })
52
-
53
- it('returns deactivated status', async () => {
54
- const res = await agent.com.atproto.sync.getRepoStatus({ did: alice })
55
- expect(res.data).toEqual({
56
- did: alice,
57
- active: false,
58
- status: 'deactivated',
59
- })
60
-
61
- const adminRes = await agent.com.atproto.admin.getAccountInfo(
62
- {
63
- did: alice,
64
- },
65
- { headers: network.pds.adminAuthHeaders() },
66
- )
67
- expect(typeof adminRes.data.deactivatedAt).toBeDefined()
68
- })
69
-
70
- it('no longer serves repo data', async () => {
71
- await expect(
72
- agent.com.atproto.sync.getRepo({ did: alice }),
73
- ).rejects.toThrow(/Repo has been deactivated/)
74
- await expect(
75
- agent.com.atproto.sync.getLatestCommit({ did: alice }),
76
- ).rejects.toThrow(/Repo has been deactivated/)
77
- await expect(
78
- agent.com.atproto.sync.listBlobs({ did: alice }),
79
- ).rejects.toThrow(/Repo has been deactivated/)
80
- const recordUri = sc.posts[alice][0].ref.uri
81
- await expect(
82
- agent.com.atproto.sync.getRecord({
83
- did: alice,
84
- collection: recordUri.collection,
85
- rkey: recordUri.rkey,
86
- }),
87
- ).rejects.toThrow(/Repo has been deactivated/)
88
- await expect(
89
- agent.com.atproto.repo.getRecord({
90
- repo: alice,
91
- collection: recordUri.collection,
92
- rkey: recordUri.rkey,
93
- }),
94
- ).rejects.toThrow()
95
- await expect(
96
- agent.com.atproto.repo.describeRepo({
97
- repo: alice,
98
- }),
99
- ).rejects.toThrow(/Repo has been deactivated/)
100
-
101
- await expect(
102
- agent.com.atproto.sync.getBlob({
103
- did: alice,
104
- cid: aliceAvatar.image.ref.toString(),
105
- }),
106
- ).rejects.toThrow(/Repo has been deactivated/)
107
- const listedRepos = await agent.com.atproto.sync.listRepos()
108
- const listedAlice = listedRepos.data.repos.find((r) => r.did === alice)
109
- expect(listedAlice?.active).toBe(false)
110
- expect(listedAlice?.status).toBe('deactivated')
111
- })
112
-
113
- it('no longer resolves handle', async () => {
114
- await expect(
115
- agent.com.atproto.identity.resolveHandle({
116
- handle: sc.accounts[alice].handle,
117
- }),
118
- ).rejects.toThrow()
119
- })
120
-
121
- it('still allows login and returns status', async () => {
122
- const res = await agent.com.atproto.server.createSession({
123
- identifier: alice,
124
- password: sc.accounts[alice].password,
125
- })
126
- expect(res.data.status).toEqual('deactivated')
127
- })
128
-
129
- it('returns status on getSession', async () => {
130
- const res = await agent.com.atproto.server.getSession(undefined, {
131
- headers: sc.getHeaders(alice),
132
- })
133
- expect(res.data.status).toEqual('deactivated')
134
- })
135
-
136
- it('does not allow writes', async () => {
137
- const createAttempt = agent.com.atproto.repo.createRecord(
138
- {
139
- repo: alice,
140
- collection: 'app.bsky.feed.post',
141
- record: {
142
- text: 'blah',
143
- createdAt: new Date().toISOString(),
144
- },
145
- },
146
- {
147
- encoding: 'application/json',
148
- headers: sc.getHeaders(alice),
149
- },
150
- )
151
- const uri = sc.posts[alice][0].ref.uri
152
- await expect(createAttempt).rejects.toThrow('Account is deactivated')
153
-
154
- const putAttempt = agent.com.atproto.repo.putRecord(
155
- {
156
- repo: alice,
157
- collection: uri.collection,
158
- rkey: uri.rkey,
159
- record: {
160
- text: 'blah',
161
- createdAt: new Date().toISOString(),
162
- },
163
- },
164
- {
165
- encoding: 'application/json',
166
- headers: sc.getHeaders(alice),
167
- },
168
- )
169
- await expect(putAttempt).rejects.toThrow('Account is deactivated')
170
-
171
- const deleteAttempt = agent.com.atproto.repo.deleteRecord(
172
- {
173
- repo: alice,
174
- collection: uri.collection,
175
- rkey: uri.rkey,
176
- },
177
- {
178
- encoding: 'application/json',
179
- headers: sc.getHeaders(alice),
180
- },
181
- )
182
- await expect(deleteAttempt).rejects.toThrow('Account is deactivated')
183
- })
184
-
185
- it('reactivates', async () => {
186
- await agent.com.atproto.server.activateAccount(undefined, {
187
- headers: sc.getHeaders(alice),
188
- })
189
-
190
- await agent.com.atproto.sync.getRepo({ did: alice })
191
-
192
- const statusRes = await agent.com.atproto.sync.getRepoStatus({ did: alice })
193
- expect(statusRes.data.active).toBe(true)
194
- expect(statusRes.data.status).toBeUndefined()
195
-
196
- const adminRes = await agent.com.atproto.admin.getAccountInfo(
197
- {
198
- did: alice,
199
- },
200
- { headers: network.pds.adminAuthHeaders() },
201
- )
202
- expect(adminRes.data.deactivatedAt).toBeUndefined()
203
- })
204
- })