@atproto/pds 0.4.39 → 0.4.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/account-manager/index.d.ts +3 -4
  3. package/dist/account-manager/index.d.ts.map +1 -1
  4. package/dist/account-manager/index.js +2 -3
  5. package/dist/account-manager/index.js.map +1 -1
  6. package/dist/auth-verifier.d.ts.map +1 -1
  7. package/dist/auth-verifier.js +11 -9
  8. package/dist/auth-verifier.js.map +1 -1
  9. package/dist/config/config.d.ts.map +1 -1
  10. package/dist/config/config.js +2 -1
  11. package/dist/config/config.js.map +1 -1
  12. package/dist/config/env.d.ts +2 -1
  13. package/dist/config/env.d.ts.map +1 -1
  14. package/dist/config/env.js +2 -1
  15. package/dist/config/env.js.map +1 -1
  16. package/dist/lexicon/lexicons.d.ts +5 -0
  17. package/dist/lexicon/lexicons.d.ts.map +1 -1
  18. package/dist/lexicon/lexicons.js +9 -0
  19. package/dist/lexicon/lexicons.js.map +1 -1
  20. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +1 -1
  21. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  22. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  23. package/dist/lexicon/types/app/bsky/embed/record.d.ts +1 -1
  24. package/dist/lexicon/types/app/bsky/embed/record.d.ts.map +1 -1
  25. package/dist/lexicon/types/app/bsky/embed/record.js.map +1 -1
  26. package/dist/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.d.ts +2 -0
  27. package/dist/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.d.ts.map +1 -1
  28. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +2 -2
  29. package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
  30. package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
  31. package/dist/logger.d.ts +3 -1
  32. package/dist/logger.d.ts.map +1 -1
  33. package/dist/logger.js +9 -76
  34. package/dist/logger.js.map +1 -1
  35. package/dist/oauth/detailed-account-store.d.ts +2 -2
  36. package/dist/oauth/detailed-account-store.d.ts.map +1 -1
  37. package/dist/oauth/detailed-account-store.js.map +1 -1
  38. package/package.json +9 -9
  39. package/src/account-manager/index.ts +4 -5
  40. package/src/auth-verifier.ts +18 -9
  41. package/src/config/config.ts +2 -1
  42. package/src/config/env.ts +4 -2
  43. package/src/lexicon/lexicons.ts +10 -0
  44. package/src/lexicon/types/app/bsky/actor/defs.ts +1 -0
  45. package/src/lexicon/types/app/bsky/embed/record.ts +1 -0
  46. package/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +2 -0
  47. package/src/lexicon/types/tools/ozone/moderation/defs.ts +2 -0
  48. package/src/logger.ts +11 -81
  49. package/src/oauth/detailed-account-store.ts +2 -2
@@ -4167,6 +4167,7 @@ export const schemaDict = {
4167
4167
  'lex:app.bsky.actor.defs#mutedWordsPref',
4168
4168
  'lex:app.bsky.actor.defs#hiddenPostsPref',
4169
4169
  'lex:app.bsky.actor.defs#bskyAppStatePref',
4170
+ 'lex:app.bsky.actor.defs#labelersPref',
4170
4171
  ],
4171
4172
  },
4172
4173
  },
@@ -4957,6 +4958,7 @@ export const schemaDict = {
4957
4958
  'lex:app.bsky.feed.defs#generatorView',
4958
4959
  'lex:app.bsky.graph.defs#listView',
4959
4960
  'lex:app.bsky.labeler.defs#labelerView',
4961
+ 'lex:app.bsky.graph.defs#starterPackViewBasic',
4960
4962
  ],
4961
4963
  },
4962
4964
  },
@@ -8710,6 +8712,12 @@ export const schemaDict = {
8710
8712
  cursor: {
8711
8713
  type: 'string',
8712
8714
  },
8715
+ relativeToDid: {
8716
+ type: 'string',
8717
+ format: 'did',
8718
+ description:
8719
+ 'DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer.',
8720
+ },
8713
8721
  },
8714
8722
  },
8715
8723
  output: {
@@ -10112,6 +10120,7 @@ export const schemaDict = {
10112
10120
  'lex:tools.ozone.moderation.defs#modEventEmail',
10113
10121
  'lex:tools.ozone.moderation.defs#modEventResolveAppeal',
10114
10122
  'lex:tools.ozone.moderation.defs#modEventDivert',
10123
+ 'lex:tools.ozone.moderation.defs#modEventTag',
10115
10124
  ],
10116
10125
  },
10117
10126
  subject: {
@@ -10175,6 +10184,7 @@ export const schemaDict = {
10175
10184
  'lex:tools.ozone.moderation.defs#modEventEmail',
10176
10185
  'lex:tools.ozone.moderation.defs#modEventResolveAppeal',
10177
10186
  'lex:tools.ozone.moderation.defs#modEventDivert',
10187
+ 'lex:tools.ozone.moderation.defs#modEventTag',
10178
10188
  ],
10179
10189
  },
10180
10190
  subject: {
@@ -185,6 +185,7 @@ export type Preferences = (
185
185
  | MutedWordsPref
186
186
  | HiddenPostsPref
187
187
  | BskyAppStatePref
188
+ | LabelersPref
188
189
  | { $type: string; [k: string]: unknown }
189
190
  )[]
190
191
 
@@ -41,6 +41,7 @@ export interface View {
41
41
  | AppBskyFeedDefs.GeneratorView
42
42
  | AppBskyGraphDefs.ListView
43
43
  | AppBskyLabelerDefs.LabelerView
44
+ | AppBskyGraphDefs.StarterPackViewBasic
44
45
  | { $type: string; [k: string]: unknown }
45
46
  [k: string]: unknown
46
47
  }
@@ -14,6 +14,8 @@ export interface QueryParams {
14
14
  viewer?: string
15
15
  limit: number
16
16
  cursor?: string
17
+ /** DID of the account to get suggestions relative to. If not provided, suggestions will be based on the viewer. */
18
+ relativeToDid?: string
17
19
  }
18
20
 
19
21
  export type InputSchema = undefined
@@ -29,6 +29,7 @@ export interface ModEventView {
29
29
  | ModEventEmail
30
30
  | ModEventResolveAppeal
31
31
  | ModEventDivert
32
+ | ModEventTag
32
33
  | { $type: string; [k: string]: unknown }
33
34
  subject:
34
35
  | ComAtprotoAdminDefs.RepoRef
@@ -72,6 +73,7 @@ export interface ModEventViewDetail {
72
73
  | ModEventEmail
73
74
  | ModEventResolveAppeal
74
75
  | ModEventDivert
76
+ | ModEventTag
75
77
  | { $type: string; [k: string]: unknown }
76
78
  subject:
77
79
  | RepoView
package/src/logger.ts CHANGED
@@ -1,6 +1,7 @@
1
+ import { type IncomingMessage } from 'node:http'
1
2
  import { stdSerializers } from 'pino'
2
3
  import pinoHttp from 'pino-http'
3
- import { subsystemLogger } from '@atproto/common'
4
+ import { obfuscateHeaders, subsystemLogger } from '@atproto/common'
4
5
 
5
6
  export const dbLogger = subsystemLogger('pds:db')
6
7
  export const didCacheLogger = subsystemLogger('pds:did-cache')
@@ -17,85 +18,14 @@ export const oauthLogger = subsystemLogger('pds:oauth')
17
18
  export const loggerMiddleware = pinoHttp({
18
19
  logger: httpLogger,
19
20
  serializers: {
20
- err: errSerializer,
21
- req: reqSerializer,
21
+ err: (err: unknown) => ({
22
+ code: err?.['code'],
23
+ message: err?.['message'],
24
+ }),
25
+ req: (req: IncomingMessage) => {
26
+ const serialized = stdSerializers.req(req)
27
+ const headers = obfuscateHeaders(serialized.headers)
28
+ return { ...serialized, headers }
29
+ },
22
30
  },
23
31
  })
24
-
25
- function errSerializer(err: any) {
26
- return {
27
- code: err?.code,
28
- message: err?.message,
29
- }
30
- }
31
-
32
- function reqSerializer(req: any) {
33
- const serialized = stdSerializers.req(req)
34
- serialized.headers = obfuscateHeaders(serialized.headers)
35
- return serialized
36
- }
37
-
38
- function obfuscateHeaders(headers: Record<string, string>) {
39
- const obfuscatedHeaders: Record<string, string> = {}
40
- for (const key in headers) {
41
- if (key.toLowerCase() === 'authorization') {
42
- obfuscatedHeaders[key] = obfuscateAuthHeader(headers[key])
43
- } else if (key.toLowerCase() === 'dpop') {
44
- obfuscatedHeaders[key] = obfuscateJws(headers[key]) || 'Invalid'
45
- } else {
46
- obfuscatedHeaders[key] = headers[key]
47
- }
48
- }
49
- return obfuscatedHeaders
50
- }
51
-
52
- function obfuscateAuthHeader(authHeader: string): string {
53
- // This is a hot path (runs on every request). Avoid using split() or regex.
54
-
55
- const spaceIdx = authHeader.indexOf(' ')
56
- if (spaceIdx === -1) return 'Invalid'
57
-
58
- const type = authHeader.slice(0, spaceIdx)
59
- switch (type.toLowerCase()) {
60
- case 'bearer':
61
- return `${type} ${obfuscateBearer(authHeader.slice(spaceIdx + 1))}`
62
- case 'dpop':
63
- return `${type} ${obfuscateJws(authHeader.slice(spaceIdx + 1)) || 'Invalid'}`
64
- case 'basic':
65
- return `${type} ${obfuscateBasic(authHeader.slice(spaceIdx + 1)) || 'Invalid'}`
66
- default:
67
- return `Invalid`
68
- }
69
- }
70
-
71
- function obfuscateBasic(token: string): null | string {
72
- if (!token) return null
73
- const buffer = Buffer.from(token, 'base64')
74
- if (!buffer.length) return null // Buffer.from will silently ignore invalid base64 chars
75
- const authHeader = buffer.toString('utf8')
76
- const colIdx = authHeader.indexOf(':')
77
- if (colIdx === -1) return null
78
- const username = authHeader.slice(0, colIdx)
79
- return `${username}:***`
80
- }
81
-
82
- function obfuscateBearer(token: string): string {
83
- return obfuscateJws(token) || obfuscateToken(token)
84
- }
85
-
86
- function obfuscateToken(token: string): string {
87
- return token ? '***' : ''
88
- }
89
-
90
- function obfuscateJws(token: string): null | string {
91
- const firstDot = token.indexOf('.')
92
- if (firstDot === -1) return null
93
-
94
- const secondDot = token.indexOf('.', firstDot + 1)
95
- if (secondDot === -1) return null
96
-
97
- if (token.indexOf('.', secondDot + 1) !== -1) return null
98
-
99
- // Strip the signature
100
- return token.slice(0, secondDot) + '.obfuscated'
101
- }
@@ -2,7 +2,7 @@ import {
2
2
  AccountInfo,
3
3
  AccountStore,
4
4
  DeviceId,
5
- LoginCredentials,
5
+ SignInCredentials,
6
6
  } from '@atproto/oauth-provider'
7
7
 
8
8
  import { AccountManager } from '../account-manager/index'
@@ -50,7 +50,7 @@ export class DetailedAccountStore implements AccountStore {
50
50
  }
51
51
 
52
52
  async authenticateAccount(
53
- credentials: LoginCredentials,
53
+ credentials: SignInCredentials,
54
54
  deviceId: DeviceId,
55
55
  ): Promise<AccountInfo | null> {
56
56
  const accountInfo = await this.accountManager.authenticateAccount(