@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
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,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
|
-
}
|
package/tests/_puppeteer.ts
DELETED
|
@@ -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
|
-
})
|