@atproto/pds 0.5.12 → 0.5.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -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/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,143 +0,0 @@
|
|
|
1
|
-
import { parseCid } from '@atproto/lex-data'
|
|
2
|
-
import { InvalidRecordKeyError } from '@atproto/syntax'
|
|
3
|
-
import {
|
|
4
|
-
AuthRequiredError,
|
|
5
|
-
InvalidRequestError,
|
|
6
|
-
Server,
|
|
7
|
-
} from '@atproto/xrpc-server'
|
|
8
|
-
import { AppContext } from '../../../../context.js'
|
|
9
|
-
import { com } from '../../../../lexicons/index.js'
|
|
10
|
-
import { dbLogger } from '../../../../logger.js'
|
|
11
|
-
import {
|
|
12
|
-
BadCommitSwapError,
|
|
13
|
-
InvalidRecordError,
|
|
14
|
-
PreparedCreate,
|
|
15
|
-
prepareCreate,
|
|
16
|
-
prepareDelete,
|
|
17
|
-
} from '../../../../repo/index.js'
|
|
18
|
-
|
|
19
|
-
export default function (server: Server, ctx: AppContext) {
|
|
20
|
-
server.add(com.atproto.repo.createRecord, {
|
|
21
|
-
auth: ctx.authVerifier.authorization({
|
|
22
|
-
// @NOTE the "checkTakedown" and "checkDeactivated" checks are typically
|
|
23
|
-
// performed during auth. However, since this method's "repo" parameter
|
|
24
|
-
// can be a handle, we will need to fetch the account again to ensure that
|
|
25
|
-
// the handle matches the DID from the request's credentials. In order to
|
|
26
|
-
// avoid fetching the account twice (during auth, and then again in the
|
|
27
|
-
// controller), the checks are disabled here:
|
|
28
|
-
|
|
29
|
-
// checkTakedown: true,
|
|
30
|
-
// checkDeactivated: true,
|
|
31
|
-
authorize: () => {
|
|
32
|
-
// Performed in the handler as it requires the request body
|
|
33
|
-
},
|
|
34
|
-
}),
|
|
35
|
-
rateLimit: [
|
|
36
|
-
{
|
|
37
|
-
name: 'repo-write-hour',
|
|
38
|
-
calcKey: ({ auth }) => auth.credentials.did,
|
|
39
|
-
calcPoints: () => 3,
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: 'repo-write-day',
|
|
43
|
-
calcKey: ({ auth }) => auth.credentials.did,
|
|
44
|
-
calcPoints: () => 3,
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
opts: {
|
|
48
|
-
jsonLimit: 1_000_000,
|
|
49
|
-
},
|
|
50
|
-
handler: async ({ input, auth }) => {
|
|
51
|
-
const { repo, collection, rkey, record, swapCommit, validate } =
|
|
52
|
-
input.body
|
|
53
|
-
|
|
54
|
-
const account = await ctx.authVerifier.findAccount(repo, {
|
|
55
|
-
checkDeactivated: true,
|
|
56
|
-
checkTakedown: true,
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
const did = account.did
|
|
60
|
-
if (did !== auth.credentials.did) {
|
|
61
|
-
throw new AuthRequiredError()
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (auth.credentials.type === 'oauth') {
|
|
65
|
-
auth.credentials.permissions.assertRepo({
|
|
66
|
-
action: 'create',
|
|
67
|
-
collection,
|
|
68
|
-
})
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const swapCommitCid = swapCommit ? parseCid(swapCommit) : undefined
|
|
72
|
-
|
|
73
|
-
let write: PreparedCreate
|
|
74
|
-
try {
|
|
75
|
-
write = await prepareCreate({
|
|
76
|
-
did,
|
|
77
|
-
collection,
|
|
78
|
-
record,
|
|
79
|
-
rkey,
|
|
80
|
-
validate,
|
|
81
|
-
})
|
|
82
|
-
} catch (err) {
|
|
83
|
-
if (err instanceof InvalidRecordError) {
|
|
84
|
-
throw new InvalidRequestError(err.message)
|
|
85
|
-
}
|
|
86
|
-
if (err instanceof InvalidRecordKeyError) {
|
|
87
|
-
throw new InvalidRequestError(err.message)
|
|
88
|
-
}
|
|
89
|
-
throw err
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const commit = await ctx.actorStore.transact(did, async (actorTxn) => {
|
|
93
|
-
const backlinkConflicts =
|
|
94
|
-
validate !== false
|
|
95
|
-
? await actorTxn.record.getBacklinkConflicts(
|
|
96
|
-
write.uri,
|
|
97
|
-
write.record,
|
|
98
|
-
)
|
|
99
|
-
: []
|
|
100
|
-
const backlinkDeletions = backlinkConflicts.map((uri) =>
|
|
101
|
-
prepareDelete({
|
|
102
|
-
did: uri.did,
|
|
103
|
-
collection: uri.collectionSafe,
|
|
104
|
-
rkey: uri.rkeySafe,
|
|
105
|
-
}),
|
|
106
|
-
)
|
|
107
|
-
const writes = [...backlinkDeletions, write]
|
|
108
|
-
const commit = await actorTxn.repo
|
|
109
|
-
.processWrites(writes, swapCommitCid)
|
|
110
|
-
.catch((err) => {
|
|
111
|
-
if (err instanceof BadCommitSwapError) {
|
|
112
|
-
throw new InvalidRequestError(err.message, 'InvalidSwap')
|
|
113
|
-
}
|
|
114
|
-
throw err
|
|
115
|
-
})
|
|
116
|
-
await ctx.sequencer.sequenceCommit(did, commit)
|
|
117
|
-
return commit
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
await ctx.accountManager
|
|
121
|
-
.updateRepoRoot(did, commit.cid, commit.rev)
|
|
122
|
-
.catch((err) => {
|
|
123
|
-
dbLogger.error(
|
|
124
|
-
{ err, did, cid: commit.cid, rev: commit.rev },
|
|
125
|
-
'failed to update account root',
|
|
126
|
-
)
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
encoding: 'application/json' as const,
|
|
131
|
-
body: {
|
|
132
|
-
uri: write.uri.toString(),
|
|
133
|
-
cid: write.cid.toString(),
|
|
134
|
-
commit: {
|
|
135
|
-
cid: commit.cid.toString(),
|
|
136
|
-
rev: commit.rev,
|
|
137
|
-
},
|
|
138
|
-
validationStatus: write.validationStatus,
|
|
139
|
-
},
|
|
140
|
-
}
|
|
141
|
-
},
|
|
142
|
-
})
|
|
143
|
-
}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { parseCid } from '@atproto/lex-data'
|
|
2
|
-
import {
|
|
3
|
-
AuthRequiredError,
|
|
4
|
-
InvalidRequestError,
|
|
5
|
-
Server,
|
|
6
|
-
} from '@atproto/xrpc-server'
|
|
7
|
-
import { AppContext } from '../../../../context.js'
|
|
8
|
-
import { com } from '../../../../lexicons/index.js'
|
|
9
|
-
import { dbLogger } from '../../../../logger.js'
|
|
10
|
-
import {
|
|
11
|
-
BadCommitSwapError,
|
|
12
|
-
BadRecordSwapError,
|
|
13
|
-
prepareDelete,
|
|
14
|
-
} from '../../../../repo/index.js'
|
|
15
|
-
|
|
16
|
-
export default function (server: Server, ctx: AppContext) {
|
|
17
|
-
server.add(com.atproto.repo.deleteRecord, {
|
|
18
|
-
auth: ctx.authVerifier.authorization({
|
|
19
|
-
// @NOTE the "checkTakedown" and "checkDeactivated" checks are typically
|
|
20
|
-
// performed during auth. However, since this method's "repo" parameter
|
|
21
|
-
// can be a handle, we will need to fetch the account again to ensure that
|
|
22
|
-
// the handle matches the DID from the request's credentials. In order to
|
|
23
|
-
// avoid fetching the account twice (during auth, and then again in the
|
|
24
|
-
// controller), the checks are disabled here:
|
|
25
|
-
|
|
26
|
-
// checkTakedown: true,
|
|
27
|
-
// checkDeactivated: true,
|
|
28
|
-
authorize: () => {
|
|
29
|
-
// Performed in the handler as it requires the request body
|
|
30
|
-
},
|
|
31
|
-
}),
|
|
32
|
-
rateLimit: [
|
|
33
|
-
{
|
|
34
|
-
name: 'repo-write-hour',
|
|
35
|
-
calcKey: ({ auth }) => auth.credentials.did,
|
|
36
|
-
calcPoints: () => 1,
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
name: 'repo-write-day',
|
|
40
|
-
calcKey: ({ auth }) => auth.credentials.did,
|
|
41
|
-
calcPoints: () => 1,
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
handler: async ({ input: { body }, auth }) => {
|
|
45
|
-
const { repo, collection, rkey, swapCommit, swapRecord } = body
|
|
46
|
-
|
|
47
|
-
const account = await ctx.authVerifier.findAccount(repo, {
|
|
48
|
-
checkDeactivated: true,
|
|
49
|
-
checkTakedown: true,
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
const did = account.did
|
|
53
|
-
if (did !== auth.credentials.did) {
|
|
54
|
-
throw new AuthRequiredError()
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// We can't compute permissions based on the request payload ("input") in
|
|
58
|
-
// the 'auth' phase, so we do it here.
|
|
59
|
-
if (auth.credentials.type === 'oauth') {
|
|
60
|
-
auth.credentials.permissions.assertRepo({
|
|
61
|
-
action: 'delete',
|
|
62
|
-
collection,
|
|
63
|
-
})
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const swapCommitCid = swapCommit ? parseCid(swapCommit) : undefined
|
|
67
|
-
const swapRecordCid = swapRecord ? parseCid(swapRecord) : undefined
|
|
68
|
-
|
|
69
|
-
const write = prepareDelete({
|
|
70
|
-
did,
|
|
71
|
-
collection,
|
|
72
|
-
rkey,
|
|
73
|
-
swapCid: swapRecordCid,
|
|
74
|
-
})
|
|
75
|
-
const commit = await ctx.actorStore.transact(did, async (actorTxn) => {
|
|
76
|
-
const record = await actorTxn.record.getRecord(write.uri, null, true)
|
|
77
|
-
if (!record) {
|
|
78
|
-
return null // No-op if record already doesn't exist
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const commit = await actorTxn.repo
|
|
82
|
-
.processWrites([write], swapCommitCid)
|
|
83
|
-
.catch((err) => {
|
|
84
|
-
if (
|
|
85
|
-
err instanceof BadCommitSwapError ||
|
|
86
|
-
err instanceof BadRecordSwapError
|
|
87
|
-
) {
|
|
88
|
-
throw new InvalidRequestError(err.message, 'InvalidSwap')
|
|
89
|
-
} else {
|
|
90
|
-
throw err
|
|
91
|
-
}
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
await ctx.sequencer.sequenceCommit(did, commit)
|
|
95
|
-
return commit
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
if (commit !== null) {
|
|
99
|
-
await ctx.accountManager
|
|
100
|
-
.updateRepoRoot(did, commit.cid, commit.rev)
|
|
101
|
-
.catch((err) => {
|
|
102
|
-
dbLogger.error(
|
|
103
|
-
{ err, did, cid: commit.cid, rev: commit.rev },
|
|
104
|
-
'failed to update account root',
|
|
105
|
-
)
|
|
106
|
-
})
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return {
|
|
110
|
-
encoding: 'application/json' as const,
|
|
111
|
-
body: {
|
|
112
|
-
commit: commit
|
|
113
|
-
? {
|
|
114
|
-
cid: commit.cid.toString(),
|
|
115
|
-
rev: commit.rev,
|
|
116
|
-
}
|
|
117
|
-
: undefined,
|
|
118
|
-
},
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
})
|
|
122
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as id from '@atproto/identity'
|
|
2
|
-
import { HandleString, INVALID_HANDLE } from '@atproto/syntax'
|
|
3
|
-
import { InvalidRequestError, Server } from '@atproto/xrpc-server'
|
|
4
|
-
import { AppContext } from '../../../../context.js'
|
|
5
|
-
import { com } from '../../../../lexicons/index.js'
|
|
6
|
-
import { assertRepoAvailability } from '../sync/util.js'
|
|
7
|
-
|
|
8
|
-
export default function (server: Server, ctx: AppContext) {
|
|
9
|
-
server.add(
|
|
10
|
-
com.atproto.repo.describeRepo,
|
|
11
|
-
async ({ params }): Promise<com.atproto.repo.describeRepo.$Output> => {
|
|
12
|
-
const { repo } = params
|
|
13
|
-
|
|
14
|
-
const account = await assertRepoAvailability(ctx, repo, false)
|
|
15
|
-
|
|
16
|
-
let didDoc: id.DidDocument
|
|
17
|
-
try {
|
|
18
|
-
didDoc = await ctx.idResolver.did.ensureResolve(account.did)
|
|
19
|
-
} catch (err) {
|
|
20
|
-
throw new InvalidRequestError(`Could not resolve DID: ${err}`)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const handle = id.getHandle(didDoc)
|
|
24
|
-
const handleIsCorrect = handle === account.handle
|
|
25
|
-
|
|
26
|
-
const collections = await ctx.actorStore.read(account.did, (store) =>
|
|
27
|
-
store.record.listCollections(),
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
encoding: 'application/json' as const,
|
|
32
|
-
body: {
|
|
33
|
-
handle: (account.handle ?? INVALID_HANDLE) as HandleString,
|
|
34
|
-
did: account.did,
|
|
35
|
-
// @ts-expect-error https://github.com/bluesky-social/atproto/pull/4406
|
|
36
|
-
didDoc,
|
|
37
|
-
collections,
|
|
38
|
-
handleIsCorrect,
|
|
39
|
-
},
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
)
|
|
43
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { atUri } from '@atproto/lex'
|
|
2
|
-
import { InvalidRequestError, Server } from '@atproto/xrpc-server'
|
|
3
|
-
import { AppContext } from '../../../../context.js'
|
|
4
|
-
import { com } from '../../../../lexicons/index.js'
|
|
5
|
-
import { pipethrough } from '../../../../pipethrough.js'
|
|
6
|
-
|
|
7
|
-
export default function (server: Server, ctx: AppContext) {
|
|
8
|
-
server.add(com.atproto.repo.getRecord, async ({ req, params }) => {
|
|
9
|
-
const { repo, collection, rkey, cid } = params
|
|
10
|
-
const did = await ctx.accountManager.getDidForActor(repo)
|
|
11
|
-
|
|
12
|
-
// fetch from pds if available, if not then fetch from appview
|
|
13
|
-
if (did) {
|
|
14
|
-
const uri = atUri(did, collection, rkey)
|
|
15
|
-
const record = await ctx.actorStore.read(did, (store) =>
|
|
16
|
-
store.record.getRecord(uri, cid ?? null),
|
|
17
|
-
)
|
|
18
|
-
if (!record || record.takedownRef !== null) {
|
|
19
|
-
throw new InvalidRequestError(
|
|
20
|
-
`Could not locate record: ${uri}`,
|
|
21
|
-
'RecordNotFound',
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
return {
|
|
25
|
-
encoding: 'application/json' as const,
|
|
26
|
-
body: {
|
|
27
|
-
uri,
|
|
28
|
-
cid: record.cid,
|
|
29
|
-
value: record.value,
|
|
30
|
-
},
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (!ctx.cfg.bskyAppView) {
|
|
35
|
-
throw new InvalidRequestError(`Could not locate record`)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return pipethrough(ctx, req)
|
|
39
|
-
})
|
|
40
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { TID } from '@atproto/common'
|
|
2
|
-
import { LexMap, enumBlobRefs } from '@atproto/lex-data'
|
|
3
|
-
import {
|
|
4
|
-
BlockMap,
|
|
5
|
-
WriteOpAction,
|
|
6
|
-
getAndParseRecord,
|
|
7
|
-
readCarStream,
|
|
8
|
-
verifyDiff,
|
|
9
|
-
} from '@atproto/repo'
|
|
10
|
-
import { AtUri } from '@atproto/syntax'
|
|
11
|
-
import { InvalidRequestError, Server } from '@atproto/xrpc-server'
|
|
12
|
-
import { ACCESS_FULL } from '../../../../auth-scope.js'
|
|
13
|
-
import { AppContext } from '../../../../context.js'
|
|
14
|
-
import { com } from '../../../../lexicons/index.js'
|
|
15
|
-
|
|
16
|
-
export default function (server: Server, ctx: AppContext) {
|
|
17
|
-
server.add(com.atproto.repo.importRepo, {
|
|
18
|
-
opts: {
|
|
19
|
-
blobLimit: ctx.cfg.service.maxImportSize,
|
|
20
|
-
},
|
|
21
|
-
auth: ctx.authVerifier.authorization({
|
|
22
|
-
checkTakedown: true,
|
|
23
|
-
scopes: ACCESS_FULL,
|
|
24
|
-
authorize: (permissions) => {
|
|
25
|
-
permissions.assertAccount({ attr: 'repo', action: 'manage' })
|
|
26
|
-
},
|
|
27
|
-
}),
|
|
28
|
-
handler: async ({ input, auth }) => {
|
|
29
|
-
if (!ctx.cfg.service.acceptingImports) {
|
|
30
|
-
throw new InvalidRequestError('Service is not accepting repo imports')
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const { did } = auth.credentials
|
|
34
|
-
|
|
35
|
-
// @NOTE process as much as we can before the transaction, in particular
|
|
36
|
-
// the reading of the body stream.
|
|
37
|
-
const { roots, blocks } = await readCarStream(input.body)
|
|
38
|
-
if (roots.length !== 1) {
|
|
39
|
-
await blocks.dump()
|
|
40
|
-
throw new InvalidRequestError('expected one root')
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const blockMap = new BlockMap()
|
|
44
|
-
for await (const block of blocks) {
|
|
45
|
-
blockMap.set(block.cid, block.bytes)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
await ctx.actorStore.transact(did, async (store) => {
|
|
49
|
-
const now = new Date().toISOString()
|
|
50
|
-
const rev = TID.nextStr()
|
|
51
|
-
const did = store.repo.did
|
|
52
|
-
|
|
53
|
-
const currRepo = await store.repo.maybeLoadRepo()
|
|
54
|
-
const diff = await verifyDiff(
|
|
55
|
-
currRepo,
|
|
56
|
-
blockMap,
|
|
57
|
-
roots[0],
|
|
58
|
-
undefined,
|
|
59
|
-
undefined,
|
|
60
|
-
{ ensureLeaves: false },
|
|
61
|
-
)
|
|
62
|
-
diff.commit.rev = rev
|
|
63
|
-
await store.repo.storage.applyCommit(diff.commit, currRepo === null)
|
|
64
|
-
|
|
65
|
-
// @NOTE There is no point in performing the following concurrently
|
|
66
|
-
// since better-sqlite3 is synchronous.
|
|
67
|
-
for (const write of diff.writes) {
|
|
68
|
-
const uri = AtUri.make(did, write.collection, write.rkey)
|
|
69
|
-
if (write.action === WriteOpAction.Delete) {
|
|
70
|
-
await store.record.deleteRecord(uri)
|
|
71
|
-
} else {
|
|
72
|
-
let parsedRecord: LexMap
|
|
73
|
-
try {
|
|
74
|
-
// @NOTE getAndParseRecord returns a promise for historical
|
|
75
|
-
// reasons but it's internal processing is actually synchronous.
|
|
76
|
-
const parsed = await getAndParseRecord(blockMap, write.cid)
|
|
77
|
-
parsedRecord = parsed.record
|
|
78
|
-
} catch {
|
|
79
|
-
throw new InvalidRequestError(
|
|
80
|
-
`Could not parse record at '${write.collection}/${write.rkey}'`,
|
|
81
|
-
)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
await store.record.indexRecord(
|
|
85
|
-
uri,
|
|
86
|
-
write.cid,
|
|
87
|
-
parsedRecord,
|
|
88
|
-
write.action,
|
|
89
|
-
rev,
|
|
90
|
-
now,
|
|
91
|
-
)
|
|
92
|
-
const recordBlobs = Array.from(
|
|
93
|
-
enumBlobRefs(parsedRecord, { allowLegacy: true, strict: false }),
|
|
94
|
-
)
|
|
95
|
-
await store.repo.blob.insertBlobs(uri.toString(), recordBlobs)
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
})
|
|
99
|
-
},
|
|
100
|
-
})
|
|
101
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../../../context.js'
|
|
3
|
-
import applyWrites from './applyWrites.js'
|
|
4
|
-
import createRecord from './createRecord.js'
|
|
5
|
-
import deleteRecord from './deleteRecord.js'
|
|
6
|
-
import describeRepo from './describeRepo.js'
|
|
7
|
-
import getRecord from './getRecord.js'
|
|
8
|
-
import importRepo from './importRepo.js'
|
|
9
|
-
import listMissingBlobs from './listMissingBlobs.js'
|
|
10
|
-
import listRecords from './listRecords.js'
|
|
11
|
-
import putRecord from './putRecord.js'
|
|
12
|
-
import uploadBlob from './uploadBlob.js'
|
|
13
|
-
|
|
14
|
-
export default function (server: Server, ctx: AppContext) {
|
|
15
|
-
applyWrites(server, ctx)
|
|
16
|
-
createRecord(server, ctx)
|
|
17
|
-
deleteRecord(server, ctx)
|
|
18
|
-
describeRepo(server, ctx)
|
|
19
|
-
getRecord(server, ctx)
|
|
20
|
-
listRecords(server, ctx)
|
|
21
|
-
putRecord(server, ctx)
|
|
22
|
-
uploadBlob(server, ctx)
|
|
23
|
-
listMissingBlobs(server, ctx)
|
|
24
|
-
importRepo(server, ctx)
|
|
25
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Server } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../../../context.js'
|
|
3
|
-
import { com } from '../../../../lexicons/index.js'
|
|
4
|
-
|
|
5
|
-
export default function (server: Server, ctx: AppContext) {
|
|
6
|
-
server.add(com.atproto.repo.listMissingBlobs, {
|
|
7
|
-
auth: ctx.authVerifier.authorization({
|
|
8
|
-
authorize: () => {
|
|
9
|
-
// always allow
|
|
10
|
-
},
|
|
11
|
-
}),
|
|
12
|
-
handler: async ({ auth, params }) => {
|
|
13
|
-
const { did } = auth.credentials
|
|
14
|
-
const { limit, cursor } = params
|
|
15
|
-
|
|
16
|
-
const blobs = await ctx.actorStore.read(did, (store) =>
|
|
17
|
-
store.repo.blob.listMissingBlobs({ limit, cursor }),
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
return {
|
|
21
|
-
encoding: 'application/json' as const,
|
|
22
|
-
body: {
|
|
23
|
-
blobs,
|
|
24
|
-
cursor: blobs.at(-1)?.cid,
|
|
25
|
-
},
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
})
|
|
29
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { AtUri } from '@atproto/syntax'
|
|
2
|
-
import { InvalidRequestError, Server } from '@atproto/xrpc-server'
|
|
3
|
-
import { AppContext } from '../../../../context.js'
|
|
4
|
-
import { com } from '../../../../lexicons/index.js'
|
|
5
|
-
|
|
6
|
-
export default function (server: Server, ctx: AppContext) {
|
|
7
|
-
server.add(com.atproto.repo.listRecords, async ({ params }) => {
|
|
8
|
-
const { repo, collection, limit = 50, cursor, reverse = false } = params
|
|
9
|
-
|
|
10
|
-
const did = await ctx.accountManager.getDidForActor(repo)
|
|
11
|
-
if (!did) {
|
|
12
|
-
throw new InvalidRequestError(`Could not find repo: ${repo}`)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const records = await ctx.actorStore.read(did, (store) =>
|
|
16
|
-
store.record.listRecordsForCollection({
|
|
17
|
-
collection,
|
|
18
|
-
limit,
|
|
19
|
-
reverse,
|
|
20
|
-
cursor,
|
|
21
|
-
}),
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
const lastRecord = records.at(-1)
|
|
25
|
-
const lastUri = lastRecord && new AtUri(lastRecord?.uri)
|
|
26
|
-
|
|
27
|
-
return {
|
|
28
|
-
encoding: 'application/json' as const,
|
|
29
|
-
body: {
|
|
30
|
-
records,
|
|
31
|
-
// Paginate with `before` by default, paginate with `after` when using `reverse`.
|
|
32
|
-
cursor: lastUri?.rkey,
|
|
33
|
-
},
|
|
34
|
-
}
|
|
35
|
-
})
|
|
36
|
-
}
|