@atproto/pds 0.4.0 → 0.4.1
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 +7 -0
- package/dist/account-manager/index.d.ts +4 -0
- package/dist/api/com/atproto/admin/updateAccountPassword.d.ts +3 -0
- package/dist/config/config.d.ts +2 -1
- package/dist/config/env.d.ts +1 -0
- package/dist/index.js +310 -212
- package/dist/index.js.map +3 -3
- package/dist/lexicon/index.d.ts +2 -0
- package/dist/lexicon/lexicons.d.ts +27 -0
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts +1 -1
- package/dist/lexicon/types/com/atproto/admin/updateAccountPassword.d.ts +26 -0
- package/package.json +5 -5
- package/src/account-manager/index.ts +5 -0
- package/src/api/com/atproto/admin/index.ts +2 -0
- package/src/api/com/atproto/admin/updateAccountPassword.ts +28 -0
- package/src/config/config.ts +3 -1
- package/src/config/env.ts +2 -0
- package/src/index.ts +1 -1
- package/src/lexicon/index.ts +12 -0
- package/src/lexicon/lexicons.ts +31 -0
- package/src/lexicon/types/app/bsky/actor/defs.ts +2 -0
- package/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts +39 -0
- package/tests/account.test.ts +42 -0
package/dist/lexicon/index.d.ts
CHANGED
@@ -20,6 +20,7 @@ import * as ComAtprotoAdminSearchRepos from './types/com/atproto/admin/searchRep
|
|
20
20
|
import * as ComAtprotoAdminSendEmail from './types/com/atproto/admin/sendEmail';
|
21
21
|
import * as ComAtprotoAdminUpdateAccountEmail from './types/com/atproto/admin/updateAccountEmail';
|
22
22
|
import * as ComAtprotoAdminUpdateAccountHandle from './types/com/atproto/admin/updateAccountHandle';
|
23
|
+
import * as ComAtprotoAdminUpdateAccountPassword from './types/com/atproto/admin/updateAccountPassword';
|
23
24
|
import * as ComAtprotoAdminUpdateCommunicationTemplate from './types/com/atproto/admin/updateCommunicationTemplate';
|
24
25
|
import * as ComAtprotoAdminUpdateSubjectStatus from './types/com/atproto/admin/updateSubjectStatus';
|
25
26
|
import * as ComAtprotoIdentityGetRecommendedDidCredentials from './types/com/atproto/identity/getRecommendedDidCredentials';
|
@@ -192,6 +193,7 @@ export declare class ComAtprotoAdminNS {
|
|
192
193
|
sendEmail<AV extends AuthVerifier>(cfg: ConfigOf<AV, ComAtprotoAdminSendEmail.Handler<ExtractAuth<AV>>, ComAtprotoAdminSendEmail.HandlerReqCtx<ExtractAuth<AV>>>): void;
|
193
194
|
updateAccountEmail<AV extends AuthVerifier>(cfg: ConfigOf<AV, ComAtprotoAdminUpdateAccountEmail.Handler<ExtractAuth<AV>>, ComAtprotoAdminUpdateAccountEmail.HandlerReqCtx<ExtractAuth<AV>>>): void;
|
194
195
|
updateAccountHandle<AV extends AuthVerifier>(cfg: ConfigOf<AV, ComAtprotoAdminUpdateAccountHandle.Handler<ExtractAuth<AV>>, ComAtprotoAdminUpdateAccountHandle.HandlerReqCtx<ExtractAuth<AV>>>): void;
|
196
|
+
updateAccountPassword<AV extends AuthVerifier>(cfg: ConfigOf<AV, ComAtprotoAdminUpdateAccountPassword.Handler<ExtractAuth<AV>>, ComAtprotoAdminUpdateAccountPassword.HandlerReqCtx<ExtractAuth<AV>>>): void;
|
195
197
|
updateCommunicationTemplate<AV extends AuthVerifier>(cfg: ConfigOf<AV, ComAtprotoAdminUpdateCommunicationTemplate.Handler<ExtractAuth<AV>>, ComAtprotoAdminUpdateCommunicationTemplate.HandlerReqCtx<ExtractAuth<AV>>>): void;
|
196
198
|
updateSubjectStatus<AV extends AuthVerifier>(cfg: ConfigOf<AV, ComAtprotoAdminUpdateSubjectStatus.Handler<ExtractAuth<AV>>, ComAtprotoAdminUpdateSubjectStatus.HandlerReqCtx<ExtractAuth<AV>>>): void;
|
197
199
|
}
|
@@ -1695,6 +1695,32 @@ export declare const schemaDict: {
|
|
1695
1695
|
};
|
1696
1696
|
};
|
1697
1697
|
};
|
1698
|
+
ComAtprotoAdminUpdateAccountPassword: {
|
1699
|
+
lexicon: number;
|
1700
|
+
id: string;
|
1701
|
+
defs: {
|
1702
|
+
main: {
|
1703
|
+
type: string;
|
1704
|
+
description: string;
|
1705
|
+
input: {
|
1706
|
+
encoding: string;
|
1707
|
+
schema: {
|
1708
|
+
type: string;
|
1709
|
+
required: string[];
|
1710
|
+
properties: {
|
1711
|
+
did: {
|
1712
|
+
type: string;
|
1713
|
+
format: string;
|
1714
|
+
};
|
1715
|
+
password: {
|
1716
|
+
type: string;
|
1717
|
+
};
|
1718
|
+
};
|
1719
|
+
};
|
1720
|
+
};
|
1721
|
+
};
|
1722
|
+
};
|
1723
|
+
};
|
1698
1724
|
ComAtprotoAdminUpdateCommunicationTemplate: {
|
1699
1725
|
lexicon: number;
|
1700
1726
|
id: string;
|
@@ -8205,6 +8231,7 @@ export declare const ids: {
|
|
8205
8231
|
ComAtprotoAdminSendEmail: string;
|
8206
8232
|
ComAtprotoAdminUpdateAccountEmail: string;
|
8207
8233
|
ComAtprotoAdminUpdateAccountHandle: string;
|
8234
|
+
ComAtprotoAdminUpdateAccountPassword: string;
|
8208
8235
|
ComAtprotoAdminUpdateCommunicationTemplate: string;
|
8209
8236
|
ComAtprotoAdminUpdateSubjectStatus: string;
|
8210
8237
|
ComAtprotoIdentityGetRecommendedDidCredentials: string;
|
@@ -54,7 +54,7 @@ export interface ViewerState {
|
|
54
54
|
}
|
55
55
|
export declare function isViewerState(v: unknown): v is ViewerState;
|
56
56
|
export declare function validateViewerState(v: unknown): ValidationResult;
|
57
|
-
export type Preferences = (AdultContentPref | ContentLabelPref | SavedFeedsPref | PersonalDetailsPref | FeedViewPref | ThreadViewPref | InterestsPref | {
|
57
|
+
export type Preferences = (AdultContentPref | ContentLabelPref | SavedFeedsPref | PersonalDetailsPref | FeedViewPref | ThreadViewPref | InterestsPref | MutedWordsPref | HiddenPostsPref | {
|
58
58
|
$type: string;
|
59
59
|
[k: string]: unknown;
|
60
60
|
})[];
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import express from 'express';
|
2
|
+
import { HandlerAuth } from '@atproto/xrpc-server';
|
3
|
+
export interface QueryParams {
|
4
|
+
}
|
5
|
+
export interface InputSchema {
|
6
|
+
did: string;
|
7
|
+
password: string;
|
8
|
+
[k: string]: unknown;
|
9
|
+
}
|
10
|
+
export interface HandlerInput {
|
11
|
+
encoding: 'application/json';
|
12
|
+
body: InputSchema;
|
13
|
+
}
|
14
|
+
export interface HandlerError {
|
15
|
+
status: number;
|
16
|
+
message?: string;
|
17
|
+
}
|
18
|
+
export type HandlerOutput = HandlerError | void;
|
19
|
+
export type HandlerReqCtx<HA extends HandlerAuth = never> = {
|
20
|
+
auth: HA;
|
21
|
+
params: QueryParams;
|
22
|
+
input: HandlerInput;
|
23
|
+
req: express.Request;
|
24
|
+
res: express.Response;
|
25
|
+
};
|
26
|
+
export type Handler<HA extends HandlerAuth = never> = (ctx: HandlerReqCtx<HA>) => Promise<HandlerOutput> | HandlerOutput;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@atproto/pds",
|
3
|
-
"version": "0.4.
|
3
|
+
"version": "0.4.1",
|
4
4
|
"license": "MIT",
|
5
5
|
"description": "Reference implementation of atproto Personal Data Server (PDS)",
|
6
6
|
"keywords": [
|
@@ -44,7 +44,7 @@
|
|
44
44
|
"typed-emitter": "^2.1.0",
|
45
45
|
"uint8arrays": "3.0.0",
|
46
46
|
"zod": "^3.21.4",
|
47
|
-
"@atproto/api": "^0.10.
|
47
|
+
"@atproto/api": "^0.10.1",
|
48
48
|
"@atproto/aws": "^0.1.7",
|
49
49
|
"@atproto/common": "^0.3.3",
|
50
50
|
"@atproto/crypto": "^0.3.0",
|
@@ -68,9 +68,9 @@
|
|
68
68
|
"axios": "^0.27.2",
|
69
69
|
"get-port": "^6.1.2",
|
70
70
|
"ws": "^8.12.0",
|
71
|
-
"@atproto/api": "^0.10.
|
72
|
-
"@atproto/bsky": "^0.0.
|
73
|
-
"@atproto/dev-env": "^0.2.
|
71
|
+
"@atproto/api": "^0.10.1",
|
72
|
+
"@atproto/bsky": "^0.0.33",
|
73
|
+
"@atproto/dev-env": "^0.2.33",
|
74
74
|
"@atproto/lex-cli": "^0.3.0"
|
75
75
|
},
|
76
76
|
"scripts": {
|
@@ -370,6 +370,11 @@ export class AccountManager {
|
|
370
370
|
'reset_password',
|
371
371
|
opts.token,
|
372
372
|
)
|
373
|
+
await this.updateAccountPassword({ did, password: opts.password })
|
374
|
+
}
|
375
|
+
|
376
|
+
async updateAccountPassword(opts: { did: string; password: string }) {
|
377
|
+
const { did } = opts
|
373
378
|
const passwordScrypt = await scrypt.genSaltAndHash(opts.password)
|
374
379
|
await this.db.transaction(async (dbTxn) =>
|
375
380
|
Promise.all([
|
@@ -15,6 +15,7 @@ import disableInviteCodes from './disableInviteCodes'
|
|
15
15
|
import getInviteCodes from './getInviteCodes'
|
16
16
|
import updateAccountHandle from './updateAccountHandle'
|
17
17
|
import updateAccountEmail from './updateAccountEmail'
|
18
|
+
import updateAccountPassword from './updateAccountPassword'
|
18
19
|
import sendEmail from './sendEmail'
|
19
20
|
import deleteAccount from './deleteAccount'
|
20
21
|
import queryModerationStatuses from './queryModerationStatuses'
|
@@ -40,6 +41,7 @@ export default function (server: Server, ctx: AppContext) {
|
|
40
41
|
getInviteCodes(server, ctx)
|
41
42
|
updateAccountHandle(server, ctx)
|
42
43
|
updateAccountEmail(server, ctx)
|
44
|
+
updateAccountPassword(server, ctx)
|
43
45
|
sendEmail(server, ctx)
|
44
46
|
deleteAccount(server, ctx)
|
45
47
|
listCommunicationTemplates(server, ctx)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import { AuthRequiredError } from '@atproto/xrpc-server'
|
2
|
+
import { Server } from '../../../../lexicon'
|
3
|
+
import AppContext from '../../../../context'
|
4
|
+
import { authPassthru } from '../../../proxy'
|
5
|
+
|
6
|
+
export default function (server: Server, ctx: AppContext) {
|
7
|
+
server.com.atproto.admin.updateAccountPassword({
|
8
|
+
auth: ctx.authVerifier.role,
|
9
|
+
handler: async ({ input, auth, req }) => {
|
10
|
+
if (!auth.credentials.admin) {
|
11
|
+
throw new AuthRequiredError(
|
12
|
+
'Must be an admin to update an account password',
|
13
|
+
)
|
14
|
+
}
|
15
|
+
|
16
|
+
if (ctx.entrywayAgent) {
|
17
|
+
await ctx.entrywayAgent.com.atproto.admin.updateAccountPassword(
|
18
|
+
input.body,
|
19
|
+
authPassthru(req, true),
|
20
|
+
)
|
21
|
+
return
|
22
|
+
}
|
23
|
+
|
24
|
+
const { did, password } = input.body
|
25
|
+
await ctx.accountManager.updateAccountPassword({ did, password })
|
26
|
+
},
|
27
|
+
})
|
28
|
+
}
|
package/src/config/config.ts
CHANGED
@@ -23,6 +23,7 @@ export const envToCfg = (env: ServerEnvironment): ServerConfig => {
|
|
23
23
|
privacyPolicyUrl: env.privacyPolicyUrl,
|
24
24
|
termsOfServiceUrl: env.termsOfServiceUrl,
|
25
25
|
acceptingImports: env.acceptingImports ?? true,
|
26
|
+
blobUploadLimit: env.blobUploadLimit ?? 5 * 1024 * 1024, // 5mb
|
26
27
|
}
|
27
28
|
|
28
29
|
const dbLoc = (name: string) => {
|
@@ -275,9 +276,10 @@ export type ServiceConfig = {
|
|
275
276
|
publicUrl: string
|
276
277
|
did: string
|
277
278
|
version?: string
|
278
|
-
acceptingImports: boolean
|
279
279
|
privacyPolicyUrl?: string
|
280
280
|
termsOfServiceUrl?: string
|
281
|
+
acceptingImports: boolean
|
282
|
+
blobUploadLimit: number
|
281
283
|
}
|
282
284
|
|
283
285
|
export type DatabaseConfig = {
|
package/src/config/env.ts
CHANGED
@@ -10,6 +10,7 @@ export const readEnv = (): ServerEnvironment => {
|
|
10
10
|
privacyPolicyUrl: envStr('PDS_PRIVACY_POLICY_URL'),
|
11
11
|
termsOfServiceUrl: envStr('PDS_TERMS_OF_SERVICE_URL'),
|
12
12
|
acceptingImports: envBool('PDS_ACCEPTING_REPO_IMPORTS'),
|
13
|
+
blobUploadLimit: envInt('PDS_BLOB_UPLOAD_LIMIT'),
|
13
14
|
|
14
15
|
// database
|
15
16
|
dataDirectory: envStr('PDS_DATA_DIRECTORY'),
|
@@ -116,6 +117,7 @@ export type ServerEnvironment = {
|
|
116
117
|
privacyPolicyUrl?: string
|
117
118
|
termsOfServiceUrl?: string
|
118
119
|
acceptingImports?: boolean
|
120
|
+
blobUploadLimit?: number
|
119
121
|
|
120
122
|
// database
|
121
123
|
dataDirectory?: string
|
package/src/index.ts
CHANGED
package/src/lexicon/index.ts
CHANGED
@@ -30,6 +30,7 @@ import * as ComAtprotoAdminSearchRepos from './types/com/atproto/admin/searchRep
|
|
30
30
|
import * as ComAtprotoAdminSendEmail from './types/com/atproto/admin/sendEmail'
|
31
31
|
import * as ComAtprotoAdminUpdateAccountEmail from './types/com/atproto/admin/updateAccountEmail'
|
32
32
|
import * as ComAtprotoAdminUpdateAccountHandle from './types/com/atproto/admin/updateAccountHandle'
|
33
|
+
import * as ComAtprotoAdminUpdateAccountPassword from './types/com/atproto/admin/updateAccountPassword'
|
33
34
|
import * as ComAtprotoAdminUpdateCommunicationTemplate from './types/com/atproto/admin/updateCommunicationTemplate'
|
34
35
|
import * as ComAtprotoAdminUpdateSubjectStatus from './types/com/atproto/admin/updateSubjectStatus'
|
35
36
|
import * as ComAtprotoIdentityGetRecommendedDidCredentials from './types/com/atproto/identity/getRecommendedDidCredentials'
|
@@ -444,6 +445,17 @@ export class ComAtprotoAdminNS {
|
|
444
445
|
return this._server.xrpc.method(nsid, cfg)
|
445
446
|
}
|
446
447
|
|
448
|
+
updateAccountPassword<AV extends AuthVerifier>(
|
449
|
+
cfg: ConfigOf<
|
450
|
+
AV,
|
451
|
+
ComAtprotoAdminUpdateAccountPassword.Handler<ExtractAuth<AV>>,
|
452
|
+
ComAtprotoAdminUpdateAccountPassword.HandlerReqCtx<ExtractAuth<AV>>
|
453
|
+
>,
|
454
|
+
) {
|
455
|
+
const nsid = 'com.atproto.admin.updateAccountPassword' // @ts-ignore
|
456
|
+
return this._server.xrpc.method(nsid, cfg)
|
457
|
+
}
|
458
|
+
|
447
459
|
updateCommunicationTemplate<AV extends AuthVerifier>(
|
448
460
|
cfg: ConfigOf<
|
449
461
|
AV,
|
package/src/lexicon/lexicons.ts
CHANGED
@@ -1863,6 +1863,33 @@ export const schemaDict = {
|
|
1863
1863
|
},
|
1864
1864
|
},
|
1865
1865
|
},
|
1866
|
+
ComAtprotoAdminUpdateAccountPassword: {
|
1867
|
+
lexicon: 1,
|
1868
|
+
id: 'com.atproto.admin.updateAccountPassword',
|
1869
|
+
defs: {
|
1870
|
+
main: {
|
1871
|
+
type: 'procedure',
|
1872
|
+
description:
|
1873
|
+
'Update the password for a user account as an administrator.',
|
1874
|
+
input: {
|
1875
|
+
encoding: 'application/json',
|
1876
|
+
schema: {
|
1877
|
+
type: 'object',
|
1878
|
+
required: ['did', 'password'],
|
1879
|
+
properties: {
|
1880
|
+
did: {
|
1881
|
+
type: 'string',
|
1882
|
+
format: 'did',
|
1883
|
+
},
|
1884
|
+
password: {
|
1885
|
+
type: 'string',
|
1886
|
+
},
|
1887
|
+
},
|
1888
|
+
},
|
1889
|
+
},
|
1890
|
+
},
|
1891
|
+
},
|
1892
|
+
},
|
1866
1893
|
ComAtprotoAdminUpdateCommunicationTemplate: {
|
1867
1894
|
lexicon: 1,
|
1868
1895
|
id: 'com.atproto.admin.updateCommunicationTemplate',
|
@@ -5075,6 +5102,8 @@ export const schemaDict = {
|
|
5075
5102
|
'lex:app.bsky.actor.defs#feedViewPref',
|
5076
5103
|
'lex:app.bsky.actor.defs#threadViewPref',
|
5077
5104
|
'lex:app.bsky.actor.defs#interestsPref',
|
5105
|
+
'lex:app.bsky.actor.defs#mutedWordsPref',
|
5106
|
+
'lex:app.bsky.actor.defs#hiddenPostsPref',
|
5078
5107
|
],
|
5079
5108
|
},
|
5080
5109
|
},
|
@@ -8860,6 +8889,8 @@ export const ids = {
|
|
8860
8889
|
ComAtprotoAdminSendEmail: 'com.atproto.admin.sendEmail',
|
8861
8890
|
ComAtprotoAdminUpdateAccountEmail: 'com.atproto.admin.updateAccountEmail',
|
8862
8891
|
ComAtprotoAdminUpdateAccountHandle: 'com.atproto.admin.updateAccountHandle',
|
8892
|
+
ComAtprotoAdminUpdateAccountPassword:
|
8893
|
+
'com.atproto.admin.updateAccountPassword',
|
8863
8894
|
ComAtprotoAdminUpdateCommunicationTemplate:
|
8864
8895
|
'com.atproto.admin.updateCommunicationTemplate',
|
8865
8896
|
ComAtprotoAdminUpdateSubjectStatus: 'com.atproto.admin.updateSubjectStatus',
|
@@ -0,0 +1,39 @@
|
|
1
|
+
/**
|
2
|
+
* GENERATED CODE - DO NOT MODIFY
|
3
|
+
*/
|
4
|
+
import express from 'express'
|
5
|
+
import { ValidationResult, BlobRef } from '@atproto/lexicon'
|
6
|
+
import { lexicons } from '../../../../lexicons'
|
7
|
+
import { isObj, hasProp } from '../../../../util'
|
8
|
+
import { CID } from 'multiformats/cid'
|
9
|
+
import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
|
10
|
+
|
11
|
+
export interface QueryParams {}
|
12
|
+
|
13
|
+
export interface InputSchema {
|
14
|
+
did: string
|
15
|
+
password: string
|
16
|
+
[k: string]: unknown
|
17
|
+
}
|
18
|
+
|
19
|
+
export interface HandlerInput {
|
20
|
+
encoding: 'application/json'
|
21
|
+
body: InputSchema
|
22
|
+
}
|
23
|
+
|
24
|
+
export interface HandlerError {
|
25
|
+
status: number
|
26
|
+
message?: string
|
27
|
+
}
|
28
|
+
|
29
|
+
export type HandlerOutput = HandlerError | void
|
30
|
+
export type HandlerReqCtx<HA extends HandlerAuth = never> = {
|
31
|
+
auth: HA
|
32
|
+
params: QueryParams
|
33
|
+
input: HandlerInput
|
34
|
+
req: express.Request
|
35
|
+
res: express.Response
|
36
|
+
}
|
37
|
+
export type Handler<HA extends HandlerAuth = never> = (
|
38
|
+
ctx: HandlerReqCtx<HA>,
|
39
|
+
) => Promise<HandlerOutput> | HandlerOutput
|
package/tests/account.test.ts
CHANGED
@@ -559,4 +559,46 @@ describe('account', () => {
|
|
559
559
|
}),
|
560
560
|
).resolves.toBeDefined()
|
561
561
|
})
|
562
|
+
|
563
|
+
it('allows an admin to update password', async () => {
|
564
|
+
const tryUnauthed = agent.api.com.atproto.admin.updateAccountPassword({
|
565
|
+
did,
|
566
|
+
password: 'new-admin-pass',
|
567
|
+
})
|
568
|
+
await expect(tryUnauthed).rejects.toThrow('Authentication Required')
|
569
|
+
|
570
|
+
const tryAsModerator = agent.api.com.atproto.admin.updateAccountPassword(
|
571
|
+
{ did, password: 'new-admin-pass' },
|
572
|
+
{
|
573
|
+
headers: network.pds.adminAuthHeaders('moderator'),
|
574
|
+
encoding: 'application/json',
|
575
|
+
},
|
576
|
+
)
|
577
|
+
await expect(tryAsModerator).rejects.toThrow(
|
578
|
+
'Must be an admin to update an account password',
|
579
|
+
)
|
580
|
+
|
581
|
+
await agent.api.com.atproto.admin.updateAccountPassword(
|
582
|
+
{ did, password: 'new-admin-password' },
|
583
|
+
{
|
584
|
+
headers: network.pds.adminAuthHeaders('admin'),
|
585
|
+
encoding: 'application/json',
|
586
|
+
},
|
587
|
+
)
|
588
|
+
|
589
|
+
// old password fails
|
590
|
+
await expect(
|
591
|
+
agent.api.com.atproto.server.createSession({
|
592
|
+
identifier: did,
|
593
|
+
password,
|
594
|
+
}),
|
595
|
+
).rejects.toThrow('Invalid identifier or password')
|
596
|
+
|
597
|
+
await expect(
|
598
|
+
agent.api.com.atproto.server.createSession({
|
599
|
+
identifier: did,
|
600
|
+
password: 'new-admin-password',
|
601
|
+
}),
|
602
|
+
).resolves.toBeDefined()
|
603
|
+
})
|
562
604
|
})
|