Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clean up role-based auth #2255

Merged
merged 82 commits into from
Mar 7, 2024
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
6a26396
tidy bsky auth
dholms Feb 29, 2024
125f721
hook up new auth verifier
dholms Feb 29, 2024
36da1d9
update auth throughout ozone
dholms Feb 29, 2024
32b3de8
handle mod signing keys
dholms Feb 29, 2024
b1f07d5
add client proxy heads to pds
dholms Feb 29, 2024
ef236a4
hook up rest of routes
dholms Feb 29, 2024
bfbb586
simplify pipethrough & add some SSRF protection
dholms Feb 29, 2024
92d9268
tests
dholms Feb 29, 2024
199b754
fix bad var
dholms Feb 29, 2024
d1d39ff
merge main
dholms Feb 29, 2024
5cea30c
remove basic auth in ozone
dholms Feb 29, 2024
7561b93
wip
dholms Feb 29, 2024
cb53fdc
fix key parsing in pds
dholms Feb 29, 2024
f8145ec
Merge branch 'ozone-acls-take2' into rm-basic-auth
dholms Feb 29, 2024
26b3557
fix up all ozone tests
dholms Mar 1, 2024
e3bfb17
fix admin auth test
dholms Mar 1, 2024
a642063
rename test
dholms Mar 1, 2024
e2c0949
Merge branch 'ozone-acls-take2' into rm-basic-auth
dholms Mar 1, 2024
bac2b57
fix ozone test
dholms Mar 1, 2024
d599dd7
clean up tokens in pds
dholms Mar 1, 2024
08dc9a9
fix up pds tests
dholms Mar 1, 2024
8747869
fix up ozone tests
dholms Mar 1, 2024
88c2412
add pipethrough to write routes
dholms Mar 1, 2024
a30ac47
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 1, 2024
648cf62
merge
dholms Mar 1, 2024
a52f7b6
reenable proxied admin test
dholms Mar 1, 2024
9b322c7
add moderator accounts to ozone in dev-env
dholms Mar 4, 2024
f7ef546
update did doc id values
dholms Mar 4, 2024
dbe9aff
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 4, 2024
6eb72bf
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 4, 2024
0482a92
null creds string -> `none`
dholms Mar 4, 2024
cccade6
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 4, 2024
8a38742
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 4, 2024
5df31de
fix fetchLabels auth check
dholms Mar 5, 2024
04dc443
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
9e290ca
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 5, 2024
dd891d4
:sparkles: Add a couple more proxied requests that we use in ozone ui
foysalit Mar 5, 2024
2ca4fee
Add runit to the services/bsky Dockerfile (#2254)
Jacob2161 Feb 29, 2024
6ba5f6c
Improve tag detection (#2260)
estrattonbailey Mar 1, 2024
9b2500e
Version packages (#2261)
github-actions[bot] Mar 1, 2024
c76fd03
:bug: Increment attempt count after each attempt to push ozone event …
foysalit Mar 4, 2024
87f00f2
Ozone delegates email sending to actor's pds (#2272)
devinivy Mar 5, 2024
ccfc4d9
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
1b1d1a4
merge
dholms Mar 5, 2024
c273f46
add dev dep for nodemailer in ozone
dholms Mar 5, 2024
8341c7a
fix auth verifier method
dholms Mar 5, 2024
207e208
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
9ddf283
merge
dholms Mar 5, 2024
f936105
build branch
dholms Mar 5, 2024
d7682f9
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 5, 2024
971b4b7
build branch
dholms Mar 5, 2024
11b7af2
merge main
dholms Mar 5, 2024
abe4b03
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
3a9661f
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 5, 2024
5f3c91b
fix url check
dholms Mar 5, 2024
037f163
better error handling for get account infos
dholms Mar 5, 2024
fc1c40d
fix labeler service id
dholms Mar 5, 2024
483b71f
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
5e1c5fd
fix iss on auth headers
dholms Mar 5, 2024
64d99dd
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
82acea2
fix dev-env ozone did
dholms Mar 5, 2024
4c7db5c
fix tests & another jwt issuer
dholms Mar 5, 2024
514b437
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
d697105
merge
dholms Mar 5, 2024
9d5d762
fix proxy auth
dholms Mar 5, 2024
81f9d69
ozone: fix ip check
devinivy Mar 5, 2024
c74fd23
Merge remote-tracking branch 'origin/ozone-acls-take2' into pds-proxy…
devinivy Mar 5, 2024
7be8445
fix aud check on pds mod service auth
dholms Mar 5, 2024
7a490d2
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
592518c
tidy
dholms Mar 5, 2024
402cc7b
Merge branch 'ozone-acls-take2' into pds-proxy-headers
dholms Mar 5, 2024
5b6b9ee
Merge branch 'main' into pds-proxy-headers
dholms Mar 6, 2024
f583ba9
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 6, 2024
1ce9e00
Update packages/pds/tests/proxied/admin.test.ts
dholms Mar 6, 2024
5aec85f
merge main
dholms Mar 7, 2024
c5c7a4c
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 7, 2024
b4211ea
fix pipethrough of headers
dholms Mar 7, 2024
0ab7500
Merge branch 'pds-proxy-headers' into rm-basic-auth
dholms Mar 7, 2024
e46397d
fix moderation status tests
dholms Mar 7, 2024
d9b62b9
fix auth on ozone routes
dholms Mar 7, 2024
4d2c17f
update iss on daemon
dholms Mar 7, 2024
accb2a6
merge main
dholms Mar 7, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lexicons/com/atproto/admin/defs.json
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,10 @@
"type": "string",
"description": "The subject line of the email sent to the user."
},
"content": {
"type": "string",
"description": "The content of the email sent to the user."
},
"comment": {
"type": "string",
"description": "Additional comment about the outgoing comm."
Expand Down
10 changes: 10 additions & 0 deletions packages/api/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# @atproto/api

## 0.10.4

### Patch Changes

- [#2260](https://github.com/bluesky-social/atproto/pull/2260) [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Export regex from rich text detection

- [#2260](https://github.com/bluesky-social/atproto/pull/2260) [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Disallow rare unicode whitespace characters from tags

- [#2260](https://github.com/bluesky-social/atproto/pull/2260) [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f) Thanks [@estrattonbailey](https://github.com/estrattonbailey)! - Allow tags to lead with numbers

## 0.10.3

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@atproto/api",
"version": "0.10.3",
"version": "0.10.4",
"license": "MIT",
"description": "Client library for atproto and Bluesky",
"keywords": [
Expand Down
4 changes: 4 additions & 0 deletions packages/api/src/client/lexicons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -897,6 +897,10 @@ export const schemaDict = {
type: 'string',
description: 'The subject line of the email sent to the user.',
},
content: {
type: 'string',
description: 'The content of the email sent to the user.',
},
comment: {
type: 'string',
description: 'Additional comment about the outgoing comm.',
Expand Down
2 changes: 2 additions & 0 deletions packages/api/src/client/types/com/atproto/admin/defs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,8 @@ export function validateModEventUnmute(v: unknown): ValidationResult {
export interface ModEventEmail {
/** The subject line of the email sent to the user. */
subjectLine: string
/** The content of the email sent to the user. */
content?: string
/** Additional comment about the outgoing comm. */
comment?: string
[k: string]: unknown
Expand Down
1 change: 1 addition & 0 deletions packages/api/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export * from './agent'
export * from './rich-text/rich-text'
export * from './rich-text/sanitization'
export * from './rich-text/unicode'
export * from './rich-text/util'
export * from './moderation'
export * from './moderation/types'
export { LABELS } from './moderation/const/labels'
Expand Down
18 changes: 13 additions & 5 deletions packages/api/src/rich-text/detection.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import TLDs from 'tlds'
import { AppBskyRichtextFacet } from '../client'
import { UnicodeString } from './unicode'
import {
URL_REGEX,
MENTION_REGEX,
TAG_REGEX,
TRAILING_PUNCTUATION_REGEX,
} from './util'

export type Facet = AppBskyRichtextFacet.Main

Expand All @@ -9,7 +15,7 @@
const facets: Facet[] = []
{
// mentions
const re = /(^|\s|\()(@)([a-zA-Z0-9.-]+)(\b)/g
const re = MENTION_REGEX
while ((match = re.exec(text.utf16))) {
if (!isValidDomain(match[3]) && !match[3].endsWith('.test')) {
continue // probably not a handle
Expand All @@ -33,8 +39,7 @@
}
{
// links
const re =
/(^|\s|\()((https?:\/\/[\S]+)|((?<domain>[a-z][a-z0-9]*(\.[a-z0-9]+)+)[\S]*))/gim
const re = URL_REGEX
while ((match = re.exec(text.utf16))) {
let uri = match[2]
if (!uri.startsWith('http')) {
Expand Down Expand Up @@ -70,11 +75,14 @@
}
}
{
const re = /(^|\s)#((?!\ufe0f)[^\d\s]\S*)(?=\s)?/g
const re = TAG_REGEX
while ((match = re.exec(text.utf16))) {
let [, leading, tag] = match

Check warning on line 80 in packages/api/src/rich-text/detection.ts

View workflow job for this annotation

GitHub Actions / Verify

'leading' is never reassigned. Use 'const' instead

tag = tag.trim().replace(/\p{P}+$/gu, '') // strip ending punctuation
if (!tag) continue

// strip ending punctuation and any spaces
tag = tag.trim().replace(TRAILING_PUNCTUATION_REGEX, '')

if (tag.length === 0 || tag.length > 64) continue

Expand Down
11 changes: 11 additions & 0 deletions packages/api/src/rich-text/util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export const MENTION_REGEX = /(^|\s|\()(@)([a-zA-Z0-9.-]+)(\b)/g
export const URL_REGEX =
/(^|\s|\()((https?:\/\/[\S]+)|((?<domain>[a-z][a-z0-9]*(\.[a-z0-9]+)+)[\S]*))/gim
export const TRAILING_PUNCTUATION_REGEX = /\p{P}+$/gu

/**
* `\ufe0f` emoji modifier
* `\u00AD\u2060\u200A\u200B\u200C\u200D\u20e2` zero-width spaces (likely incomplete)
*/
export const TAG_REGEX =
/(^|\s)[##]((?!\ufe0f)[^\s\u00AD\u2060\u200A\u200B\u200C\u200D\u20e2]*[^\d\s\p{P}\u00AD\u2060\u200A\u200B\u200C\u200D\u20e2]+[^\s\u00AD\u2060\u200A\u200B\u200C\u200D\u20e2]*)?/gu

Check warning on line 11 in packages/api/src/rich-text/util.ts

View workflow job for this annotation

GitHub Actions / Verify

Unexpected combined character in character class

Check warning on line 11 in packages/api/src/rich-text/util.ts

View workflow job for this annotation

GitHub Actions / Verify

Unexpected joined character sequence in character class
31 changes: 28 additions & 3 deletions packages/api/tests/rich-text-detection.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ describe('detectFacets', () => {
}
})

it('correctly detects tags inline', async () => {
describe('correctly detects tags inline', () => {
const inputs: [
string,
string[],
Expand All @@ -234,11 +234,13 @@ describe('detectFacets', () => {
],
],
['#1', [], []],
['#1a', ['1a'], [{ byteStart: 0, byteEnd: 3 }]],
['#tag', ['tag'], [{ byteStart: 0, byteEnd: 4 }]],
['body #tag', ['tag'], [{ byteStart: 5, byteEnd: 9 }]],
['#tag body', ['tag'], [{ byteStart: 0, byteEnd: 4 }]],
['body #tag body', ['tag'], [{ byteStart: 5, byteEnd: 9 }]],
['body #1', [], []],
['body #1a', ['1a'], [{ byteStart: 5, byteEnd: 8 }]],
['body #a1', ['a1'], [{ byteStart: 5, byteEnd: 8 }]],
['#', [], []],
['#?', [], []],
Expand All @@ -254,12 +256,18 @@ describe('detectFacets', () => {
[],
[],
],
[
'body #thisisa64characterstring_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!',
['thisisa64characterstring_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'],
[{ byteStart: 5, byteEnd: 70 }],
],
[
'its a #double#rainbow',
['double#rainbow'],
[{ byteStart: 6, byteEnd: 21 }],
],
['##hashash', ['#hashash'], [{ byteStart: 0, byteEnd: 9 }]],
['##', [], []],
['some #n0n3s@n5e!', ['n0n3s@n5e'], [{ byteStart: 5, byteEnd: 15 }]],
[
'works #with,punctuation',
Expand Down Expand Up @@ -319,9 +327,26 @@ describe('detectFacets', () => {
},
],
],
['no match (\\u200B): #​', [], []],
['no match (\\u200Ba): #​a', [], []],
['match (a\\u200Bb): #a​b', ['a'], [{ byteStart: 18, byteEnd: 20 }]],
['match (ab\\u200B): #ab​', ['ab'], [{ byteStart: 18, byteEnd: 21 }]],
['no match (\\u20e2tag): #⃢tag', [], []],
['no match (a\\u20e2b): #a⃢b', ['a'], [{ byteStart: 21, byteEnd: 23 }]],
[
'match full width number sign (tag): #tag',
['tag'],
[{ byteStart: 36, byteEnd: 42 }],
],
[
'match full width number sign (tag): ##️⃣tag',
['#️⃣tag'],
[{ byteStart: 36, byteEnd: 49 }],
],
['no match 1?: #1?', [], []],
]

for (const [input, tags, indices] of inputs) {
it.each(inputs)('%s', async (input, tags, indices) => {
const rt = new RichText({ text: input })
await rt.detectFacets(agent)

Expand All @@ -340,7 +365,7 @@ describe('detectFacets', () => {

expect(detectedTags).toEqual(tags)
expect(detectedIndices).toEqual(indices)
}
})
})
})

Expand Down
7 changes: 7 additions & 0 deletions packages/bsky/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# @atproto/bsky

## 0.0.36

### Patch Changes

- Updated dependencies [[`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f), [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f), [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f)]:
- @atproto/[email protected]

## 0.0.35

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/bsky/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@atproto/bsky",
"version": "0.0.35",
"version": "0.0.36",
"license": "MIT",
"description": "Reference implementation of app.bsky App View (Bluesky API)",
"keywords": [
Expand Down
4 changes: 4 additions & 0 deletions packages/bsky/src/lexicon/lexicons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -897,6 +897,10 @@ export const schemaDict = {
type: 'string',
description: 'The subject line of the email sent to the user.',
},
content: {
type: 'string',
description: 'The content of the email sent to the user.',
},
comment: {
type: 'string',
description: 'Additional comment about the outgoing comm.',
Expand Down
2 changes: 2 additions & 0 deletions packages/bsky/src/lexicon/types/com/atproto/admin/defs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,8 @@ export function validateModEventUnmute(v: unknown): ValidationResult {
export interface ModEventEmail {
/** The subject line of the email sent to the user. */
subjectLine: string
/** The content of the email sent to the user. */
content?: string
/** Additional comment about the outgoing comm. */
comment?: string
[k: string]: unknown
Expand Down
10 changes: 10 additions & 0 deletions packages/dev-env/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# @atproto/dev-env

## 0.2.36

### Patch Changes

- Updated dependencies [[`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f), [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f), [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f)]:
- @atproto/[email protected]
- @atproto/[email protected]
- @atproto/[email protected]
- @atproto/[email protected]

## 0.2.35

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/dev-env/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@atproto/dev-env",
"version": "0.2.35",
"version": "0.2.36",
"license": "MIT",
"description": "Local development environment helper for atproto development",
"keywords": [
Expand Down
1 change: 1 addition & 0 deletions packages/dev-env/src/ozone.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ export class TestOzone {
const port = config.port || (await getPort())
const url = `http://localhost:${port}`
const env: ozone.OzoneEnvironment = {
devMode: true,
version: '0.0.0',
port,
didPlcUrl: config.plcUrl,
Expand Down
7 changes: 7 additions & 0 deletions packages/ozone/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
# @atproto/ozone

## 0.0.15

### Patch Changes

- Updated dependencies [[`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f), [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f), [`6ec885992`](https://github.com/bluesky-social/atproto/commit/6ec8859929a16f9725319cc398b716acf913b01f)]:
- @atproto/[email protected]

## 0.0.14

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/ozone/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@atproto/ozone",
"version": "0.0.14",
"version": "0.0.15",
"license": "MIT",
"description": "Backend service for moderating the Bluesky network.",
"keywords": [
Expand Down
19 changes: 19 additions & 0 deletions packages/ozone/src/api/admin/emitModerationEvent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
import { Server } from '../../lexicon'
import AppContext from '../../context'
import {
isModEventEmail,
isModEventLabel,
isModEventReverseTakedown,
isModEventTakedown,
} from '../../lexicon/types/com/atproto/admin/defs'
import { subjectFromInput } from '../../mod-service/subject'
import { ModerationLangService } from '../../mod-service/lang'
import { retryHttp } from '../../util'

export default function (server: Server, ctx: AppContext) {
server.com.atproto.admin.emitModerationEvent({
Expand Down Expand Up @@ -76,6 +78,23 @@ export default function (server: Server, ctx: AppContext) {
}
}

if (isModEventEmail(event) && event.content) {
// sending email prior to logging the event to avoid a long transaction below
if (!subject.isRepo()) {
throw new InvalidRequestError(
'Email can only be sent to a repo subject',
)
}
const { content, subjectLine } = event
await retryHttp(() =>
ctx.modService(db).sendEmail({
subject: subjectLine,
content,
recipientDid: subject.did,
}),
)
}

const moderationEvent = await db.transaction(async (dbTxn) => {
const moderationTxn = ctx.modService(dbTxn)

Expand Down
42 changes: 42 additions & 0 deletions packages/ozone/src/api/proxied.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,20 @@ export default function (server: Server, ctx: AppContext) {
},
})

server.app.bsky.actor.getProfiles({
auth: ctx.authVerifier.modOrRole,
handler: async (request) => {
const res = await ctx.appviewAgent.api.app.bsky.actor.getProfiles(
request.params,
await ctx.appviewAuth(),
)
return {
encoding: 'application/json',
body: res.data,
}
},
})

server.app.bsky.feed.getAuthorFeed({
auth: ctx.authVerifier.moderator,
handler: async (request) => {
Expand Down Expand Up @@ -44,6 +58,20 @@ export default function (server: Server, ctx: AppContext) {
},
})

server.app.bsky.feed.getFeedGenerator({
auth: ctx.authVerifier.modOrRole,
handler: async (request) => {
const res = await ctx.appviewAgent.api.app.bsky.feed.getFeedGenerator(
request.params,
await ctx.appviewAuth(),
)
return {
encoding: 'application/json',
body: res.data,
}
},
})

server.app.bsky.graph.getFollows({
auth: ctx.authVerifier.moderator,
handler: async (request) => {
Expand Down Expand Up @@ -71,4 +99,18 @@ export default function (server: Server, ctx: AppContext) {
}
},
})

server.app.bsky.graph.getList({
auth: ctx.authVerifier.modOrRole,
handler: async (request) => {
const res = await ctx.appviewAgent.api.app.bsky.graph.getList(
request.params,
await ctx.appviewAuth(),
)
return {
encoding: 'application/json',
body: res.data,
}
},
})
}
Loading
Loading