@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.
- package/CHANGELOG.md +53 -0
- package/dist/api/app/bsky/notification/index.d.ts.map +1 -1
- package/dist/api/app/bsky/notification/index.js +2 -0
- package/dist/api/app/bsky/notification/index.js.map +1 -1
- package/dist/api/app/bsky/notification/unregisterPush.d.ts +4 -0
- package/dist/api/app/bsky/notification/unregisterPush.d.ts.map +1 -0
- package/dist/api/app/bsky/notification/unregisterPush.js +48 -0
- package/dist/api/app/bsky/notification/unregisterPush.js.map +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts +6 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.d.ts.map +1 -1
- package/dist/lexicons/app/bsky/actor/defs.defs.js +1 -0
- package/dist/lexicons/app/bsky/actor/defs.defs.js.map +1 -1
- package/package.json +42 -38
- package/build.templates.cjs +0 -22
- package/example.env +0 -42
- package/jest.config.cjs +0 -27
- package/src/account-manager/account-manager.ts +0 -916
- package/src/account-manager/db/index.ts +0 -21
- package/src/account-manager/db/migrations/001-init.ts +0 -115
- package/src/account-manager/db/migrations/002-account-deactivation.ts +0 -17
- package/src/account-manager/db/migrations/003-privileged-app-passwords.ts +0 -12
- package/src/account-manager/db/migrations/004-oauth.ts +0 -122
- package/src/account-manager/db/migrations/005-oauth-account-management.ts +0 -136
- package/src/account-manager/db/migrations/006-oauth-permission-sets.ts +0 -20
- package/src/account-manager/db/migrations/007-lexicon-failures-index.ts +0 -14
- package/src/account-manager/db/migrations/index.ts +0 -17
- package/src/account-manager/db/schema/account-device.ts +0 -14
- package/src/account-manager/db/schema/account.ts +0 -16
- package/src/account-manager/db/schema/actor.ts +0 -17
- package/src/account-manager/db/schema/app-password.ts +0 -13
- package/src/account-manager/db/schema/authorization-request.ts +0 -30
- package/src/account-manager/db/schema/authorized-client.ts +0 -23
- package/src/account-manager/db/schema/device.ts +0 -18
- package/src/account-manager/db/schema/email-token.ts +0 -19
- package/src/account-manager/db/schema/index.ts +0 -43
- package/src/account-manager/db/schema/invite-code.ts +0 -24
- package/src/account-manager/db/schema/lexicon.ts +0 -15
- package/src/account-manager/db/schema/refresh-token.ts +0 -11
- package/src/account-manager/db/schema/repo-root.ts +0 -12
- package/src/account-manager/db/schema/token.ts +0 -38
- package/src/account-manager/db/schema/used-refresh-token.ts +0 -13
- package/src/account-manager/helpers/account-device.ts +0 -63
- package/src/account-manager/helpers/account.ts +0 -355
- package/src/account-manager/helpers/auth.ts +0 -222
- package/src/account-manager/helpers/authorization-request.ts +0 -90
- package/src/account-manager/helpers/authorized-client.ts +0 -75
- package/src/account-manager/helpers/device.ts +0 -47
- package/src/account-manager/helpers/email-token.ts +0 -87
- package/src/account-manager/helpers/invite.ts +0 -263
- package/src/account-manager/helpers/lexicon.ts +0 -67
- package/src/account-manager/helpers/password.ts +0 -136
- package/src/account-manager/helpers/repo.ts +0 -24
- package/src/account-manager/helpers/scrypt.ts +0 -53
- package/src/account-manager/helpers/token.ts +0 -158
- package/src/account-manager/helpers/used-refresh-token.ts +0 -30
- package/src/account-manager/oauth-store.ts +0 -880
- package/src/account-manager/scope-reference-getter.ts +0 -106
- package/src/actor-store/actor-store-reader.ts +0 -45
- package/src/actor-store/actor-store-resources.ts +0 -8
- package/src/actor-store/actor-store-transactor.ts +0 -31
- package/src/actor-store/actor-store-writer.ts +0 -17
- package/src/actor-store/actor-store.ts +0 -210
- package/src/actor-store/blob/reader.ts +0 -160
- package/src/actor-store/blob/transactor.ts +0 -383
- package/src/actor-store/db/index.ts +0 -20
- package/src/actor-store/db/migrations/001-init.ts +0 -105
- package/src/actor-store/db/migrations/index.ts +0 -5
- package/src/actor-store/db/schema/account-pref.ts +0 -11
- package/src/actor-store/db/schema/backlink.ts +0 -9
- package/src/actor-store/db/schema/blob.ts +0 -14
- package/src/actor-store/db/schema/index.ts +0 -23
- package/src/actor-store/db/schema/record-blob.ts +0 -8
- package/src/actor-store/db/schema/record.ts +0 -14
- package/src/actor-store/db/schema/repo-block.ts +0 -10
- package/src/actor-store/db/schema/repo-root.ts +0 -10
- package/src/actor-store/migrate.ts +0 -39
- package/src/actor-store/preference/reader.ts +0 -48
- package/src/actor-store/preference/transactor.ts +0 -55
- package/src/actor-store/preference/util.ts +0 -39
- package/src/actor-store/record/reader.ts +0 -374
- package/src/actor-store/record/transactor.ts +0 -111
- package/src/actor-store/repo/reader.ts +0 -31
- package/src/actor-store/repo/sql-repo-reader.ts +0 -150
- package/src/actor-store/repo/sql-repo-transactor.ts +0 -105
- package/src/actor-store/repo/transactor.ts +0 -227
- package/src/api/app/bsky/actor/getPreferences.ts +0 -57
- package/src/api/app/bsky/actor/getProfile.ts +0 -41
- package/src/api/app/bsky/actor/getProfiles.ts +0 -51
- package/src/api/app/bsky/actor/index.ts +0 -13
- package/src/api/app/bsky/actor/putPreferences.ts +0 -62
- package/src/api/app/bsky/feed/getActorLikes.ts +0 -63
- package/src/api/app/bsky/feed/getAuthorFeed.ts +0 -84
- package/src/api/app/bsky/feed/getFeed.ts +0 -47
- package/src/api/app/bsky/feed/getPostThread.ts +0 -251
- package/src/api/app/bsky/feed/getTimeline.ts +0 -50
- package/src/api/app/bsky/feed/index.ts +0 -15
- package/src/api/app/bsky/index.ts +0 -11
- package/src/api/app/bsky/notification/index.ts +0 -7
- package/src/api/app/bsky/notification/registerPush.ts +0 -71
- package/src/api/app/bsky/util/resolver.ts +0 -20
- package/src/api/com/atproto/admin/deleteAccount.ts +0 -22
- package/src/api/com/atproto/admin/disableAccountInvites.ts +0 -18
- package/src/api/com/atproto/admin/disableInviteCodes.ts +0 -21
- package/src/api/com/atproto/admin/enableAccountInvites.ts +0 -18
- package/src/api/com/atproto/admin/getAccountInfo.ts +0 -32
- package/src/api/com/atproto/admin/getAccountInfos.ts +0 -34
- package/src/api/com/atproto/admin/getInviteCodes.ts +0 -126
- package/src/api/com/atproto/admin/getSubjectStatus.ts +0 -76
- package/src/api/com/atproto/admin/index.ts +0 -31
- package/src/api/com/atproto/admin/sendEmail.ts +0 -47
- package/src/api/com/atproto/admin/updateAccountEmail.ts +0 -32
- package/src/api/com/atproto/admin/updateAccountHandle.ts +0 -47
- package/src/api/com/atproto/admin/updateAccountPassword.ts +0 -34
- package/src/api/com/atproto/admin/updateSubjectStatus.ts +0 -68
- package/src/api/com/atproto/admin/util.ts +0 -66
- package/src/api/com/atproto/identity/getRecommendedDidCredentials.ts +0 -50
- package/src/api/com/atproto/identity/index.ts +0 -17
- package/src/api/com/atproto/identity/requestPlcOperationSignature.ts +0 -59
- package/src/api/com/atproto/identity/resolveHandle.ts +0 -50
- package/src/api/com/atproto/identity/signPlcOperation.ts +0 -85
- package/src/api/com/atproto/identity/submitPlcOperation.ts +0 -65
- package/src/api/com/atproto/identity/updateHandle.ts +0 -66
- package/src/api/com/atproto/index.ts +0 -19
- package/src/api/com/atproto/moderation/createReport.ts +0 -41
- package/src/api/com/atproto/moderation/index.ts +0 -7
- package/src/api/com/atproto/repo/applyWrites.ts +0 -226
- package/src/api/com/atproto/repo/createRecord.ts +0 -143
- package/src/api/com/atproto/repo/deleteRecord.ts +0 -122
- package/src/api/com/atproto/repo/describeRepo.ts +0 -43
- package/src/api/com/atproto/repo/getRecord.ts +0 -40
- package/src/api/com/atproto/repo/importRepo.ts +0 -101
- package/src/api/com/atproto/repo/index.ts +0 -25
- package/src/api/com/atproto/repo/listMissingBlobs.ts +0 -29
- package/src/api/com/atproto/repo/listRecords.ts +0 -36
- package/src/api/com/atproto/repo/putRecord.ts +0 -211
- package/src/api/com/atproto/repo/uploadBlob.ts +0 -60
- package/src/api/com/atproto/server/activateAccount.ts +0 -37
- package/src/api/com/atproto/server/checkAccountStatus.ts +0 -51
- package/src/api/com/atproto/server/confirmEmail.ts +0 -39
- package/src/api/com/atproto/server/createAccount.ts +0 -327
- package/src/api/com/atproto/server/createAppPassword.ts +0 -53
- package/src/api/com/atproto/server/createInviteCode.ts +0 -38
- package/src/api/com/atproto/server/createInviteCodes.ts +0 -42
- package/src/api/com/atproto/server/createSession.ts +0 -97
- package/src/api/com/atproto/server/deactivateAccount.ts +0 -41
- package/src/api/com/atproto/server/deleteAccount.ts +0 -85
- package/src/api/com/atproto/server/deleteSession.ts +0 -23
- package/src/api/com/atproto/server/describeServer.ts +0 -29
- package/src/api/com/atproto/server/getAccountInviteCodes.ts +0 -142
- package/src/api/com/atproto/server/getServiceAuth.ts +0 -111
- package/src/api/com/atproto/server/getSession.ts +0 -80
- package/src/api/com/atproto/server/index.ts +0 -55
- package/src/api/com/atproto/server/listAppPasswords.ts +0 -45
- package/src/api/com/atproto/server/refreshSession.ts +0 -72
- package/src/api/com/atproto/server/requestAccountDelete.ts +0 -66
- package/src/api/com/atproto/server/requestEmailConfirmation.ts +0 -68
- package/src/api/com/atproto/server/requestEmailUpdate.ts +0 -86
- package/src/api/com/atproto/server/requestPasswordReset.ts +0 -52
- package/src/api/com/atproto/server/reserveSigningKey.ts +0 -15
- package/src/api/com/atproto/server/resetPassword.ts +0 -50
- package/src/api/com/atproto/server/revokeAppPassword.ts +0 -42
- package/src/api/com/atproto/server/updateEmail.ts +0 -52
- package/src/api/com/atproto/server/util.ts +0 -136
- package/src/api/com/atproto/sync/deprecated/getCheckout.ts +0 -27
- package/src/api/com/atproto/sync/deprecated/getHead.ts +0 -33
- package/src/api/com/atproto/sync/getBlob.ts +0 -61
- package/src/api/com/atproto/sync/getBlocks.ts +0 -37
- package/src/api/com/atproto/sync/getLatestCommit.ts +0 -33
- package/src/api/com/atproto/sync/getRecord.ts +0 -49
- package/src/api/com/atproto/sync/getRepo.ts +0 -75
- package/src/api/com/atproto/sync/getRepoStatus.ts +0 -34
- package/src/api/com/atproto/sync/index.ts +0 -27
- package/src/api/com/atproto/sync/listBlobs.ts +0 -33
- package/src/api/com/atproto/sync/listRepos.ts +0 -74
- package/src/api/com/atproto/sync/subscribeRepos.ts +0 -73
- package/src/api/com/atproto/sync/util.ts +0 -37
- package/src/api/com/atproto/temp/checkSignupQueue.ts +0 -34
- package/src/api/com/atproto/temp/index.ts +0 -7
- package/src/api/index.ts +0 -10
- package/src/api/proxy.ts +0 -44
- package/src/app-view.ts +0 -24
- package/src/auth-output.ts +0 -52
- package/src/auth-routes.ts +0 -64
- package/src/auth-scope.ts +0 -40
- package/src/auth-verifier.ts +0 -668
- package/src/background.ts +0 -65
- package/src/basic-routes.ts +0 -52
- package/src/bsky-app-view.ts +0 -33
- package/src/config/config.ts +0 -553
- package/src/config/env.ts +0 -167
- package/src/config/index.ts +0 -3
- package/src/config/secrets.ts +0 -54
- package/src/context.ts +0 -523
- package/src/crawlers.ts +0 -46
- package/src/db/cast.ts +0 -52
- package/src/db/db.ts +0 -140
- package/src/db/index.ts +0 -4
- package/src/db/migrator.ts +0 -40
- package/src/db/pagination.ts +0 -132
- package/src/db/tables/moderation.ts +0 -80
- package/src/db/util.ts +0 -108
- package/src/did-cache/db/index.ts +0 -21
- package/src/did-cache/db/migrations.ts +0 -17
- package/src/did-cache/db/schema.ts +0 -9
- package/src/did-cache/index.ts +0 -131
- package/src/disk-blobstore.ts +0 -172
- package/src/error.ts +0 -19
- package/src/handle/explicit-slurs.ts +0 -22
- package/src/handle/index.ts +0 -49
- package/src/handle/reserved.ts +0 -1059
- package/src/image/image-url-builder.ts +0 -16
- package/src/index.ts +0 -189
- package/src/lexicons.ts +0 -4
- package/src/logger.ts +0 -35
- package/src/mailer/index.ts +0 -111
- package/src/mailer/moderation.ts +0 -33
- package/src/mailer/templates/confirm-email.d.ts +0 -4
- package/src/mailer/templates/confirm-email.hbs +0 -158
- package/src/mailer/templates/delete-account.d.ts +0 -4
- package/src/mailer/templates/delete-account.hbs +0 -156
- package/src/mailer/templates/plc-operation.d.ts +0 -4
- package/src/mailer/templates/plc-operation.hbs +0 -153
- package/src/mailer/templates/reset-password.d.ts +0 -4
- package/src/mailer/templates/reset-password.hbs +0 -154
- package/src/mailer/templates/update-email.d.ts +0 -4
- package/src/mailer/templates/update-email.hbs +0 -153
- package/src/mailer/templates.ts +0 -17
- package/src/pipethrough.ts +0 -716
- package/src/rate-limits.ts +0 -59
- package/src/read-after-write/index.ts +0 -3
- package/src/read-after-write/types.ts +0 -35
- package/src/read-after-write/util.ts +0 -101
- package/src/read-after-write/viewer.ts +0 -290
- package/src/redis.ts +0 -25
- package/src/repo/index.ts +0 -2
- package/src/repo/prepare.ts +0 -266
- package/src/repo/types.ts +0 -65
- package/src/scripts/README.md +0 -40
- package/src/scripts/index.ts +0 -20
- package/src/scripts/publish-identity.ts +0 -60
- package/src/scripts/rebuild-repo.ts +0 -119
- package/src/scripts/rotate-keys.ts +0 -146
- package/src/scripts/sequencer-recovery/index.ts +0 -23
- package/src/scripts/sequencer-recovery/recoverer.ts +0 -297
- package/src/scripts/sequencer-recovery/recovery-db.ts +0 -65
- package/src/scripts/sequencer-recovery/repair-repos.ts +0 -49
- package/src/scripts/sequencer-recovery/user-queues.ts +0 -44
- package/src/scripts/util.ts +0 -7
- package/src/sequencer/db/index.ts +0 -21
- package/src/sequencer/db/migrations/001-init.ts +0 -35
- package/src/sequencer/db/migrations/index.ts +0 -5
- package/src/sequencer/db/schema.ts +0 -19
- package/src/sequencer/events.ts +0 -199
- package/src/sequencer/index.ts +0 -3
- package/src/sequencer/outbox.ts +0 -123
- package/src/sequencer/sequencer.ts +0 -290
- package/src/util/compression.ts +0 -16
- package/src/util/debug.ts +0 -10
- package/src/util/http.ts +0 -31
- package/src/util/types.ts +0 -7
- package/src/well-known.ts +0 -30
- package/test.env +0 -2
- package/tests/__snapshots__/takedown-appeal.test.ts.snap +0 -43
- package/tests/_oauth_client_assets_middleware.ts +0 -23
- package/tests/_puppeteer.ts +0 -147
- package/tests/_types.d.ts +0 -16
- package/tests/_util.ts +0 -191
- package/tests/account-deactivation.test.ts +0 -204
- package/tests/account-deletion.test.ts +0 -300
- package/tests/account-manager.test.ts +0 -462
- package/tests/account-migration.test.ts +0 -221
- package/tests/account-status.test.ts +0 -206
- package/tests/account.test.ts +0 -595
- package/tests/app-passwords.test.ts +0 -262
- package/tests/auth.test.ts +0 -405
- package/tests/blob-deletes.test.ts +0 -204
- package/tests/create-post.test.ts +0 -79
- package/tests/crud.test.ts +0 -1595
- package/tests/db.test.ts +0 -170
- package/tests/email-confirmation.test.ts +0 -227
- package/tests/entryway-mock.ts +0 -323
- package/tests/entryway.test.ts +0 -145
- package/tests/file-uploads.test.ts +0 -301
- package/tests/get-service-auth.test.ts +0 -81
- package/tests/handle-validation.test.ts +0 -56
- package/tests/handles.test.ts +0 -274
- package/tests/invite-codes.test.ts +0 -367
- package/tests/invites-admin.test.ts +0 -252
- package/tests/moderation.test.ts +0 -280
- package/tests/moderator-auth.test.ts +0 -177
- package/tests/oauth.test.ts +0 -334
- package/tests/plc-operations.test.ts +0 -239
- package/tests/preferences.test.ts +0 -352
- package/tests/proxied/__snapshots__/admin.test.ts.snap +0 -516
- package/tests/proxied/__snapshots__/feedgen.test.ts.snap +0 -215
- package/tests/proxied/__snapshots__/views.test.ts.snap +0 -4456
- package/tests/proxied/admin.test.ts +0 -340
- package/tests/proxied/feedgen.test.ts +0 -66
- package/tests/proxied/notif.test.ts +0 -85
- package/tests/proxied/procedures.test.ts +0 -175
- package/tests/proxied/proxy-catchall.test.ts +0 -256
- package/tests/proxied/proxy-header.test.ts +0 -239
- package/tests/proxied/proxy-oauth-aud.test.ts +0 -182
- package/tests/proxied/read-after-write.test.ts +0 -382
- package/tests/proxied/views.test.ts +0 -608
- package/tests/races.test.ts +0 -89
- package/tests/rate-limits.test.ts +0 -70
- package/tests/recovery.test.ts +0 -180
- package/tests/seeds/basic.ts +0 -165
- package/tests/seeds/follows.ts +0 -57
- package/tests/seeds/likes.ts +0 -14
- package/tests/seeds/reposts.ts +0 -18
- package/tests/seeds/thread.ts +0 -40
- package/tests/seeds/users-bulk.ts +0 -246
- package/tests/seeds/users.ts +0 -67
- package/tests/sequencer.test.ts +0 -251
- package/tests/server.test.ts +0 -151
- package/tests/sync/invertible-ops.test.ts +0 -99
- package/tests/sync/list.test.ts +0 -43
- package/tests/sync/subscribe-repos.test.ts +0 -672
- package/tests/sync/sync.test.ts +0 -316
- package/tests/takedown-appeal.test.ts +0 -166
- package/tsconfig.build.json +0 -9
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
|
@@ -1,462 +0,0 @@
|
|
|
1
|
-
import { jest } from '@jest/globals'
|
|
2
|
-
import { type Browser, launch } from 'puppeteer'
|
|
3
|
-
import { TestNetworkNoAppView } from '@atproto/dev-env'
|
|
4
|
-
import { PageHelper } from './_puppeteer.js'
|
|
5
|
-
|
|
6
|
-
describe('account manager', () => {
|
|
7
|
-
let browser: Browser
|
|
8
|
-
let network: TestNetworkNoAppView
|
|
9
|
-
|
|
10
|
-
// @NOTE We are using another language than "en" as default language to
|
|
11
|
-
// test the language negotiation.
|
|
12
|
-
const languages = ['fr-BE', 'fr', 'en-US', 'en']
|
|
13
|
-
|
|
14
|
-
beforeAll(async () => {
|
|
15
|
-
browser = await launch({
|
|
16
|
-
browser: 'chrome', // "firefox"
|
|
17
|
-
|
|
18
|
-
// For debugging:
|
|
19
|
-
// headless: false,
|
|
20
|
-
// devtools: true,
|
|
21
|
-
// slowMo: 25,
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
network = await TestNetworkNoAppView.create({
|
|
25
|
-
dbPostgresSchema: 'account-manager',
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
const sc = network.getSeedClient()
|
|
29
|
-
|
|
30
|
-
await sc.createAccount('alice', {
|
|
31
|
-
email: 'alice@test.com',
|
|
32
|
-
handle: 'alice.test',
|
|
33
|
-
password: 'alice-pass',
|
|
34
|
-
})
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
afterEach(async () => {
|
|
38
|
-
await network.processAll()
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
afterAll(async () => {
|
|
42
|
-
await network?.close()
|
|
43
|
-
await browser?.close()
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('allows creating an account', async () => {
|
|
47
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
48
|
-
|
|
49
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
50
|
-
|
|
51
|
-
await page.assertTitle(`Se connecter`)
|
|
52
|
-
|
|
53
|
-
await page.clickOnText('Créer un nouveau compte')
|
|
54
|
-
|
|
55
|
-
await page.typeInInput('handle', 'bob')
|
|
56
|
-
|
|
57
|
-
await page.clickOnText('Suivant')
|
|
58
|
-
|
|
59
|
-
await page.typeInInput('email', 'bob@test.com')
|
|
60
|
-
await page.typeInInput('password', 'bob-pass')
|
|
61
|
-
|
|
62
|
-
await page.clickOnText('Inscription')
|
|
63
|
-
|
|
64
|
-
await page.waitForNetworkIdle()
|
|
65
|
-
|
|
66
|
-
await page.ensureTextVisibility('bob.test', 'span')
|
|
67
|
-
await page.ensureTextVisibility('Votre compte Atmosphère est hébergé chez')
|
|
68
|
-
|
|
69
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
it('allows switching accounts', async () => {
|
|
73
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
74
|
-
|
|
75
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
76
|
-
|
|
77
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
78
|
-
|
|
79
|
-
await page.clickOnAriaLabel(`Sélecteur de compte`)
|
|
80
|
-
await page.clickOnText('Sélectionner un autre compte')
|
|
81
|
-
await page.clickOnText('Un autre compte', '*')
|
|
82
|
-
|
|
83
|
-
await page.typeInInput('username', 'alice.test')
|
|
84
|
-
const input = await page.typeInInput('password', 'alice-pass')
|
|
85
|
-
|
|
86
|
-
input.press('Enter')
|
|
87
|
-
|
|
88
|
-
await page.ensureTextVisibility('alice.test', 'span')
|
|
89
|
-
|
|
90
|
-
await page.clickOnAriaLabel(`Sélecteur de compte`)
|
|
91
|
-
await page.clickOnText('Sélectionner un autre compte')
|
|
92
|
-
|
|
93
|
-
await page.ensureTextVisibility('alice.test', 'span')
|
|
94
|
-
await page.ensureTextVisibility('bob.test', 'span')
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
it('forgot about the ephemeral session when loading the page again', async () => {
|
|
98
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
99
|
-
|
|
100
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
101
|
-
|
|
102
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
103
|
-
|
|
104
|
-
await page.ensureTextVisibility('bob.test', 'span')
|
|
105
|
-
|
|
106
|
-
await expect(async () => {
|
|
107
|
-
await page.ensureTextVisibility('alice.test', 'span', 500)
|
|
108
|
-
}).rejects.toThrow('Waiting for selector')
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
it('allows changing the password', async () => {
|
|
112
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
113
|
-
|
|
114
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
115
|
-
|
|
116
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
117
|
-
|
|
118
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
119
|
-
|
|
120
|
-
await page.clickOnText('Mot de passe')
|
|
121
|
-
|
|
122
|
-
using sendResetPasswordMock = jest
|
|
123
|
-
.spyOn(network.pds.ctx.mailer, 'sendResetPassword')
|
|
124
|
-
.mockImplementation(async () => {
|
|
125
|
-
// noop
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
await page.clickOnText('Envoyer le code de vérification')
|
|
129
|
-
|
|
130
|
-
await page.waitForNetworkIdle()
|
|
131
|
-
|
|
132
|
-
expect(sendResetPasswordMock).toHaveBeenCalledTimes(1)
|
|
133
|
-
|
|
134
|
-
const [params] = sendResetPasswordMock.mock.lastCall!
|
|
135
|
-
expect(params).toEqual({
|
|
136
|
-
handle: 'bob.test',
|
|
137
|
-
locale: 'fr',
|
|
138
|
-
token: expect.any(String),
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
await page.typeInInput('code', params.token)
|
|
142
|
-
await page.typeInInput('password', 'bob-new-pass')
|
|
143
|
-
|
|
144
|
-
await page.clickOnText('Valider')
|
|
145
|
-
|
|
146
|
-
await page.ensureNotification('Réinitialisation du mot de passe réussie')
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
it('allows verifying the email address', async () => {
|
|
150
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
151
|
-
|
|
152
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
153
|
-
|
|
154
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
155
|
-
|
|
156
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
157
|
-
|
|
158
|
-
await page.ensureTextVisibility('Votre adresse email doit être vérifiée.')
|
|
159
|
-
|
|
160
|
-
await page.clickOnText('Vérifier')
|
|
161
|
-
|
|
162
|
-
using sendConfirmEmailMock = jest
|
|
163
|
-
.spyOn(network.pds.ctx.mailer, 'sendConfirmEmail')
|
|
164
|
-
.mockImplementation(async () => {
|
|
165
|
-
// noop
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
await page.clickOnText('Envoyer le code de vérification', 'button')
|
|
169
|
-
|
|
170
|
-
await page.waitForNetworkIdle()
|
|
171
|
-
|
|
172
|
-
expect(sendConfirmEmailMock).toHaveBeenCalledTimes(1)
|
|
173
|
-
|
|
174
|
-
const [params] = sendConfirmEmailMock.mock.lastCall!
|
|
175
|
-
expect(params).toEqual({
|
|
176
|
-
locale: 'fr',
|
|
177
|
-
token: expect.any(String),
|
|
178
|
-
})
|
|
179
|
-
|
|
180
|
-
await page.typeInInput('code', params.token)
|
|
181
|
-
await page.clickOnText('Valider')
|
|
182
|
-
|
|
183
|
-
await page.ensureNotification('Adresse email vérifiée')
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
it('allows changing the username', async () => {
|
|
187
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
188
|
-
|
|
189
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
190
|
-
|
|
191
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
192
|
-
|
|
193
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
194
|
-
|
|
195
|
-
await page.clickOnText("Nom d'utilisateur")
|
|
196
|
-
|
|
197
|
-
await page.clickOnText("Utiliser un nom d'utilisateur par défaut")
|
|
198
|
-
|
|
199
|
-
await page.typeInInput('handle', 'bob-renamed')
|
|
200
|
-
|
|
201
|
-
await page.clickOnText('Valider')
|
|
202
|
-
|
|
203
|
-
await page.waitForNetworkIdle()
|
|
204
|
-
|
|
205
|
-
await page.ensureTextVisibility('bob-renamed.test', 'span')
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
it('allows changing the email address', async () => {
|
|
209
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
210
|
-
|
|
211
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
212
|
-
|
|
213
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
214
|
-
|
|
215
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
216
|
-
|
|
217
|
-
await page.clickOnText('Adresse email')
|
|
218
|
-
|
|
219
|
-
using sendUpdateEmailMock = jest
|
|
220
|
-
.spyOn(network.pds.ctx.mailer, 'sendUpdateEmail')
|
|
221
|
-
.mockImplementation(async () => {
|
|
222
|
-
// noop
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
const emailInput = await page.typeInInput(
|
|
226
|
-
'email',
|
|
227
|
-
'bob-new-email@example.com',
|
|
228
|
-
)
|
|
229
|
-
emailInput.press('Enter')
|
|
230
|
-
|
|
231
|
-
await page.waitForNetworkIdle()
|
|
232
|
-
|
|
233
|
-
expect(sendUpdateEmailMock).toHaveBeenCalledTimes(1)
|
|
234
|
-
|
|
235
|
-
const [updateParams] = sendUpdateEmailMock.mock.lastCall!
|
|
236
|
-
expect(updateParams).toEqual({
|
|
237
|
-
locale: 'fr',
|
|
238
|
-
token: expect.any(String),
|
|
239
|
-
})
|
|
240
|
-
|
|
241
|
-
const codeInput = await page.typeInInput('code', updateParams.token)
|
|
242
|
-
codeInput.press('Enter')
|
|
243
|
-
|
|
244
|
-
await page.ensureNotification("Modification de l'adresse email réussie")
|
|
245
|
-
|
|
246
|
-
// The email needs to be verified again
|
|
247
|
-
await page.ensureTextVisibility('Votre adresse email doit être vérifiée.')
|
|
248
|
-
})
|
|
249
|
-
|
|
250
|
-
it('allows signing out & signing back in', async () => {
|
|
251
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
252
|
-
|
|
253
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
254
|
-
|
|
255
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
256
|
-
|
|
257
|
-
await page.clickOnAriaLabel(`Sélecteur de compte`)
|
|
258
|
-
await page.clickOnText('Se déconnecter')
|
|
259
|
-
|
|
260
|
-
await page.assertTitle(`Se connecter`)
|
|
261
|
-
await page.clickOnText('Se connecter')
|
|
262
|
-
|
|
263
|
-
await page.clickOnText('Se souvenir de ce compte sur cet appareil', 'label')
|
|
264
|
-
await page.typeInInput('username', 'bob-new-email@example.com')
|
|
265
|
-
const input = await page.typeInInput('password', 'bob-new-pass')
|
|
266
|
-
|
|
267
|
-
input.press('Enter')
|
|
268
|
-
|
|
269
|
-
await page.ensureTextVisibility('bob-renamed.test', 'span')
|
|
270
|
-
})
|
|
271
|
-
|
|
272
|
-
it('does not ask for a token when changing a non-verified email', async () => {
|
|
273
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
274
|
-
|
|
275
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
276
|
-
|
|
277
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
278
|
-
|
|
279
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
280
|
-
|
|
281
|
-
await page.clickOnText('Adresse email')
|
|
282
|
-
|
|
283
|
-
using sendUpdateEmailMock = jest
|
|
284
|
-
.spyOn(network.pds.ctx.mailer, 'sendUpdateEmail')
|
|
285
|
-
.mockImplementation(async () => {
|
|
286
|
-
// noop
|
|
287
|
-
})
|
|
288
|
-
|
|
289
|
-
const emailInput = await page.typeInInput(
|
|
290
|
-
'email',
|
|
291
|
-
'bob-new-email@example.com',
|
|
292
|
-
)
|
|
293
|
-
emailInput.press('Enter')
|
|
294
|
-
|
|
295
|
-
await page.waitForNetworkIdle()
|
|
296
|
-
|
|
297
|
-
expect(sendUpdateEmailMock).not.toHaveBeenCalled()
|
|
298
|
-
|
|
299
|
-
await page.clickOnText('Plus tard')
|
|
300
|
-
|
|
301
|
-
await page.ensureNotification("Modification de l'adresse email réussie")
|
|
302
|
-
|
|
303
|
-
// The email needs to be verified again
|
|
304
|
-
await page.ensureTextVisibility('Votre adresse email doit être vérifiée.')
|
|
305
|
-
})
|
|
306
|
-
|
|
307
|
-
it('rejects racial slurs when changing username', async () => {
|
|
308
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
309
|
-
|
|
310
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
311
|
-
|
|
312
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
313
|
-
|
|
314
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
315
|
-
|
|
316
|
-
await page.clickOnText("Nom d'utilisateur")
|
|
317
|
-
|
|
318
|
-
await page.clickOnText("Utiliser un nom d'utilisateur par défaut")
|
|
319
|
-
|
|
320
|
-
// Try to change username to a racial slur
|
|
321
|
-
await page.typeInInput('handle', 'nigger')
|
|
322
|
-
|
|
323
|
-
await page.clickOnText('Valider')
|
|
324
|
-
|
|
325
|
-
await page.waitForNetworkIdle()
|
|
326
|
-
|
|
327
|
-
// Should display appropriate error message
|
|
328
|
-
await page.ensureTextVisibility(
|
|
329
|
-
"Le nom d'utilisateur contient un langage inapproprié",
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
// Username should not have changed
|
|
333
|
-
await page.clickOnText('Retour')
|
|
334
|
-
await page.ensureTextVisibility('bob-renamed.test', 'span')
|
|
335
|
-
})
|
|
336
|
-
|
|
337
|
-
it('rejects custom domain when not configured', async () => {
|
|
338
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
339
|
-
|
|
340
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
341
|
-
|
|
342
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
343
|
-
|
|
344
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
345
|
-
|
|
346
|
-
await page.clickOnText("Nom d'utilisateur")
|
|
347
|
-
|
|
348
|
-
await page.clickOnText('Utiliser un nom de domaine que je possède')
|
|
349
|
-
|
|
350
|
-
// DNS is the default verification method
|
|
351
|
-
await page.ensureTextVisibility(
|
|
352
|
-
'Ajoutez le champ suivant à la configuration DNS de votre domaine.',
|
|
353
|
-
)
|
|
354
|
-
await page.ensureTextVisibility('_atproto.<votre-domaine>', 'code')
|
|
355
|
-
await page.ensureTextVisibility('TXT', 'code')
|
|
356
|
-
|
|
357
|
-
// Switch to HTTP verification method
|
|
358
|
-
await page.clickOnText('HTTP', 'span')
|
|
359
|
-
|
|
360
|
-
await page.ensureTextVisibility(
|
|
361
|
-
"Rendez un fichier texte avec le contenu ci-dessous disponible à l'URL suivante.",
|
|
362
|
-
)
|
|
363
|
-
await page.ensureTextVisibility(
|
|
364
|
-
'https://<votre-domaine>/.well-known/atproto-did',
|
|
365
|
-
'code',
|
|
366
|
-
)
|
|
367
|
-
|
|
368
|
-
// Try to use an unconfigured domain
|
|
369
|
-
await page.typeInInput('domain', 'notconfigured.com')
|
|
370
|
-
|
|
371
|
-
await page.clickOnText('Vérifier et enregistrer')
|
|
372
|
-
|
|
373
|
-
await page.waitForNetworkIdle()
|
|
374
|
-
|
|
375
|
-
// Should display appropriate error message
|
|
376
|
-
await page.ensureTextVisibility(
|
|
377
|
-
"Le nom d'utilisateur n'a pas pu être résolu",
|
|
378
|
-
)
|
|
379
|
-
|
|
380
|
-
// Username should not have changed
|
|
381
|
-
await page.clickOnText('Retour')
|
|
382
|
-
await page.ensureTextVisibility('bob-renamed.test', 'span')
|
|
383
|
-
})
|
|
384
|
-
|
|
385
|
-
it('allows deactivating & reactivating the account', async () => {
|
|
386
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
387
|
-
|
|
388
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
389
|
-
|
|
390
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
391
|
-
|
|
392
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
393
|
-
|
|
394
|
-
await page.clickOnText('Désactiver le compte')
|
|
395
|
-
|
|
396
|
-
await page.ensureTextVisibility(
|
|
397
|
-
'limite de temps pour la désactivation du compte',
|
|
398
|
-
)
|
|
399
|
-
|
|
400
|
-
await page.clickOnText('Oui, désactiver')
|
|
401
|
-
|
|
402
|
-
await page.waitForNetworkIdle()
|
|
403
|
-
|
|
404
|
-
// The row should now offer re-activation
|
|
405
|
-
await page.ensureTextVisibility('Réactiver le compte', 'span')
|
|
406
|
-
|
|
407
|
-
await page.clickOnText('Réactiver le compte')
|
|
408
|
-
|
|
409
|
-
// @NOTE The dialog's submit label ("Réactiver") is a substring of the
|
|
410
|
-
// trigger row ("Réactiver le compte"), which comes first in DOM order, so
|
|
411
|
-
// we target the dialog's submit button instead of using its text.
|
|
412
|
-
await page.clickOn('[role="dialog"] button[type="submit"]')
|
|
413
|
-
|
|
414
|
-
await page.waitForNetworkIdle()
|
|
415
|
-
|
|
416
|
-
await page.ensureTextVisibility('Désactiver le compte', 'span')
|
|
417
|
-
})
|
|
418
|
-
|
|
419
|
-
it('allows deleting the account', async () => {
|
|
420
|
-
await using page = await PageHelper.from(browser, { languages })
|
|
421
|
-
|
|
422
|
-
await page.goto(new URL('/account', network.pds.url))
|
|
423
|
-
|
|
424
|
-
await page.assertTitle('Mon compte Atmosphère')
|
|
425
|
-
|
|
426
|
-
await page.clickOnText('Compte utilisateur', 'a')
|
|
427
|
-
|
|
428
|
-
await page.clickOnText('Supprimer le compte')
|
|
429
|
-
|
|
430
|
-
using sendAccountDeleteMock = jest
|
|
431
|
-
.spyOn(network.pds.ctx.mailer, 'sendAccountDelete')
|
|
432
|
-
.mockImplementation(async () => {
|
|
433
|
-
// noop
|
|
434
|
-
})
|
|
435
|
-
|
|
436
|
-
await page.clickOnText("Envoyer l'email")
|
|
437
|
-
|
|
438
|
-
await page.waitForNetworkIdle()
|
|
439
|
-
|
|
440
|
-
expect(sendAccountDeleteMock).toHaveBeenCalledTimes(1)
|
|
441
|
-
|
|
442
|
-
const [params] = sendAccountDeleteMock.mock.lastCall!
|
|
443
|
-
expect(params).toEqual({
|
|
444
|
-
locale: 'fr',
|
|
445
|
-
token: expect.any(String),
|
|
446
|
-
})
|
|
447
|
-
|
|
448
|
-
await page.typeInInput('code', params.token)
|
|
449
|
-
await page.typeInInput('password', 'bob-new-pass')
|
|
450
|
-
|
|
451
|
-
await page.clickOnText('Supprimer mon compte')
|
|
452
|
-
|
|
453
|
-
// A final confirmation step is displayed
|
|
454
|
-
await page.ensureTextVisibility('Êtes-vous vraiment, vraiment sûr ?', 'h2')
|
|
455
|
-
|
|
456
|
-
await page.clickOnText('Oui, supprimer mon compte')
|
|
457
|
-
|
|
458
|
-
// Once the account is deleted, the session is gone and the user is
|
|
459
|
-
// brought back to the sign-in page.
|
|
460
|
-
await page.assertTitle('Se connecter')
|
|
461
|
-
})
|
|
462
|
-
})
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { AtUri, AtpAgent } from '@atproto/api'
|
|
3
|
-
import {
|
|
4
|
-
SeedClient,
|
|
5
|
-
TestNetworkNoAppView,
|
|
6
|
-
TestPds,
|
|
7
|
-
mockNetworkUtilities,
|
|
8
|
-
} from '@atproto/dev-env'
|
|
9
|
-
import { readCar } from '@atproto/repo'
|
|
10
|
-
import { DidString } from '@atproto/syntax'
|
|
11
|
-
|
|
12
|
-
describe('account migration', () => {
|
|
13
|
-
let network: TestNetworkNoAppView
|
|
14
|
-
let newPds: TestPds
|
|
15
|
-
|
|
16
|
-
let sc: SeedClient
|
|
17
|
-
let oldAgent: AtpAgent
|
|
18
|
-
let newAgent: AtpAgent
|
|
19
|
-
|
|
20
|
-
let alice: DidString
|
|
21
|
-
|
|
22
|
-
beforeAll(async () => {
|
|
23
|
-
network = await TestNetworkNoAppView.create({
|
|
24
|
-
dbPostgresSchema: 'account_migration',
|
|
25
|
-
})
|
|
26
|
-
newPds = await TestPds.create({
|
|
27
|
-
didPlcUrl: network.plc.url,
|
|
28
|
-
})
|
|
29
|
-
mockNetworkUtilities(newPds)
|
|
30
|
-
|
|
31
|
-
sc = network.getSeedClient()
|
|
32
|
-
oldAgent = network.pds.getAgent()
|
|
33
|
-
newAgent = newPds.getAgent()
|
|
34
|
-
|
|
35
|
-
await sc.createAccount('alice', {
|
|
36
|
-
email: 'alice@test.com',
|
|
37
|
-
handle: 'alice.test',
|
|
38
|
-
password: 'alice-pass',
|
|
39
|
-
})
|
|
40
|
-
alice = sc.dids.alice
|
|
41
|
-
|
|
42
|
-
for (let i = 0; i < 100; i++) {
|
|
43
|
-
await sc.post(alice, 'test post')
|
|
44
|
-
}
|
|
45
|
-
const img1 = await sc.uploadFile(
|
|
46
|
-
alice,
|
|
47
|
-
'../dev-env/assets/at.png',
|
|
48
|
-
'image/png',
|
|
49
|
-
)
|
|
50
|
-
const img2 = await sc.uploadFile(
|
|
51
|
-
alice,
|
|
52
|
-
'../dev-env/assets/key-alt.jpg',
|
|
53
|
-
'image/jpeg',
|
|
54
|
-
)
|
|
55
|
-
const img3 = await sc.uploadFile(
|
|
56
|
-
alice,
|
|
57
|
-
'../dev-env/assets/key-landscape-small.jpg',
|
|
58
|
-
'image/jpeg',
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
await sc.post(alice, 'test', undefined, [img1])
|
|
62
|
-
await sc.post(alice, 'test', undefined, [img1, img2])
|
|
63
|
-
await sc.post(alice, 'test', undefined, [img3])
|
|
64
|
-
|
|
65
|
-
await network.processAll()
|
|
66
|
-
|
|
67
|
-
await oldAgent.login({
|
|
68
|
-
identifier: sc.accounts[alice].handle,
|
|
69
|
-
password: sc.accounts[alice].password,
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
afterAll(async () => {
|
|
74
|
-
await newPds?.close()
|
|
75
|
-
await network?.close()
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it('migrates an account', async () => {
|
|
79
|
-
const describeRes = await newAgent.api.com.atproto.server.describeServer()
|
|
80
|
-
const newServerDid = describeRes.data.did
|
|
81
|
-
|
|
82
|
-
const serviceJwtRes = await oldAgent.com.atproto.server.getServiceAuth({
|
|
83
|
-
aud: newServerDid,
|
|
84
|
-
lxm: 'com.atproto.server.createAccount',
|
|
85
|
-
})
|
|
86
|
-
const serviceJwt = serviceJwtRes.data.token
|
|
87
|
-
|
|
88
|
-
await newAgent.api.com.atproto.server.createAccount(
|
|
89
|
-
{
|
|
90
|
-
handle: 'new-alice.test',
|
|
91
|
-
email: 'alice@test.com',
|
|
92
|
-
password: 'alice-pass',
|
|
93
|
-
did: alice,
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
headers: { authorization: `Bearer ${serviceJwt}` },
|
|
97
|
-
encoding: 'application/json',
|
|
98
|
-
},
|
|
99
|
-
)
|
|
100
|
-
await newAgent.login({
|
|
101
|
-
identifier: 'new-alice.test',
|
|
102
|
-
password: 'alice-pass',
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
const statusRes1 = await newAgent.com.atproto.server.checkAccountStatus()
|
|
106
|
-
expect(statusRes1.data).toMatchObject({
|
|
107
|
-
activated: false,
|
|
108
|
-
validDid: false,
|
|
109
|
-
repoBlocks: 2, // commit & empty data root
|
|
110
|
-
indexedRecords: 0,
|
|
111
|
-
privateStateValues: 0,
|
|
112
|
-
expectedBlobs: 0,
|
|
113
|
-
importedBlobs: 0,
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
const repoRes = await oldAgent.com.atproto.sync.getRepo({ did: alice })
|
|
117
|
-
const carBlocks = await readCar(repoRes.data)
|
|
118
|
-
|
|
119
|
-
await newAgent.com.atproto.repo.importRepo(repoRes.data, {
|
|
120
|
-
encoding: 'application/vnd.ipld.car',
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
const statusRes2 = await newAgent.com.atproto.server.checkAccountStatus()
|
|
124
|
-
expect(statusRes2.data).toMatchObject({
|
|
125
|
-
activated: false,
|
|
126
|
-
validDid: false,
|
|
127
|
-
indexedRecords: 103,
|
|
128
|
-
privateStateValues: 0,
|
|
129
|
-
expectedBlobs: 3,
|
|
130
|
-
importedBlobs: 0,
|
|
131
|
-
})
|
|
132
|
-
expect(statusRes2.data.repoBlocks).toBe(carBlocks.blocks.size)
|
|
133
|
-
|
|
134
|
-
const missingBlobs = await newAgent.com.atproto.repo.listMissingBlobs()
|
|
135
|
-
expect(missingBlobs.data.blobs.length).toBe(3)
|
|
136
|
-
|
|
137
|
-
let blobCursor: string | undefined = undefined
|
|
138
|
-
do {
|
|
139
|
-
const listedBlobs = await oldAgent.com.atproto.sync.listBlobs({
|
|
140
|
-
did: alice,
|
|
141
|
-
cursor: blobCursor,
|
|
142
|
-
})
|
|
143
|
-
for (const cid of listedBlobs.data.cids) {
|
|
144
|
-
const blobRes = await oldAgent.com.atproto.sync.getBlob({
|
|
145
|
-
did: alice,
|
|
146
|
-
cid,
|
|
147
|
-
})
|
|
148
|
-
await newAgent.com.atproto.repo.uploadBlob(blobRes.data, {
|
|
149
|
-
encoding: blobRes.headers['content-type'],
|
|
150
|
-
})
|
|
151
|
-
}
|
|
152
|
-
blobCursor = listedBlobs.data.cursor
|
|
153
|
-
} while (blobCursor)
|
|
154
|
-
|
|
155
|
-
const statusRes3 = await newAgent.com.atproto.server.checkAccountStatus()
|
|
156
|
-
expect(statusRes3.data.expectedBlobs).toBe(3)
|
|
157
|
-
expect(statusRes3.data.importedBlobs).toBe(3)
|
|
158
|
-
|
|
159
|
-
const prefs = await oldAgent.api.app.bsky.actor.getPreferences()
|
|
160
|
-
await newAgent.api.app.bsky.actor.putPreferences(prefs.data)
|
|
161
|
-
|
|
162
|
-
const getDidCredentials =
|
|
163
|
-
await newAgent.com.atproto.identity.getRecommendedDidCredentials()
|
|
164
|
-
|
|
165
|
-
await oldAgent.com.atproto.identity.requestPlcOperationSignature()
|
|
166
|
-
const res = await network.pds.ctx.accountManager.db.db
|
|
167
|
-
.selectFrom('email_token')
|
|
168
|
-
.selectAll()
|
|
169
|
-
.where('did', '=', alice)
|
|
170
|
-
.where('purpose', '=', 'plc_operation')
|
|
171
|
-
.executeTakeFirst()
|
|
172
|
-
const token = res?.token
|
|
173
|
-
assert(token)
|
|
174
|
-
|
|
175
|
-
const plcOp = await oldAgent.com.atproto.identity.signPlcOperation({
|
|
176
|
-
token,
|
|
177
|
-
...getDidCredentials.data,
|
|
178
|
-
})
|
|
179
|
-
|
|
180
|
-
await newAgent.com.atproto.identity.submitPlcOperation({
|
|
181
|
-
operation: plcOp.data.operation,
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
await newAgent.com.atproto.server.activateAccount()
|
|
185
|
-
|
|
186
|
-
const statusRes4 = await newAgent.com.atproto.server.checkAccountStatus()
|
|
187
|
-
expect(statusRes4.data).toMatchObject({
|
|
188
|
-
activated: true,
|
|
189
|
-
validDid: true,
|
|
190
|
-
indexedRecords: 103,
|
|
191
|
-
privateStateValues: 0,
|
|
192
|
-
expectedBlobs: 3,
|
|
193
|
-
importedBlobs: 3,
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
await oldAgent.com.atproto.server.deactivateAccount({})
|
|
197
|
-
|
|
198
|
-
const statusResOldPds =
|
|
199
|
-
await oldAgent.com.atproto.server.checkAccountStatus()
|
|
200
|
-
expect(statusResOldPds.data).toMatchObject({
|
|
201
|
-
activated: false,
|
|
202
|
-
validDid: false,
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
const postRes = await newAgent.api.app.bsky.feed.post.create(
|
|
206
|
-
{ repo: alice },
|
|
207
|
-
{
|
|
208
|
-
text: 'new pds!',
|
|
209
|
-
createdAt: new Date().toISOString(),
|
|
210
|
-
},
|
|
211
|
-
)
|
|
212
|
-
const postUri = new AtUri(postRes.uri)
|
|
213
|
-
const fetchedPost = await newAgent.api.app.bsky.feed.post.get({
|
|
214
|
-
repo: postUri.hostname,
|
|
215
|
-
rkey: postUri.rkey,
|
|
216
|
-
})
|
|
217
|
-
expect(fetchedPost.value.text).toEqual('new pds!')
|
|
218
|
-
const statusRes5 = await newAgent.com.atproto.server.checkAccountStatus()
|
|
219
|
-
expect(statusRes5.data.indexedRecords).toBe(104)
|
|
220
|
-
})
|
|
221
|
-
})
|