Skip to content
This repository was archived by the owner on Sep 14, 2025. It is now read-only.

Commit f9772b3

Browse files
committed
Fix body processing for clearnet requests
1 parent a20dc55 commit f9772b3

File tree

4 files changed

+38
-15
lines changed

4 files changed

+38
-15
lines changed

src/router/add-reaction.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import { z } from 'zod'
4949
*/
5050
export async function addReaction(req: SogsRequest): Promise<SogsResponse> {
5151
const roomToken = req.params?.['token']
52-
if (!roomToken) {
52+
if (!roomToken || Array.isArray(roomToken)) {
5353
return { status: 400, response: null }
5454
}
5555

src/router/dm/send-message.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export async function sendDmMessage(req: SogsRequest): Promise<SogsResponse> {
5555
}
5656
}
5757
}
58-
const parsedBody = SJSON.parse(req.body.toString('utf-8'))
58+
const parsedBody = req.body
5959
const body = await z.object({
6060
message: z.string().max(24000),
6161
}).parse(parsedBody)

src/router/index.ts

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { User } from '@/user'
2+
import SJSON from 'secure-json-parse'
23
import { getCapabilities } from '@/router/get-capabilities'
34
import { getRoomsRoute } from '@/router/get-rooms'
45
import { getRoom } from '@/router/get-room'
@@ -31,7 +32,7 @@ import { match } from 'path-to-regexp'
3132
export type SogsRequest = {
3233
endpoint: string
3334
method: string
34-
body: Buffer | null
35+
body: Buffer | any | null
3536
params?: Partial<Record<string, string | string[]>>
3637
headers?: { [key: string]: string }
3738
searchParams?: { [k: string]: string }
@@ -45,7 +46,7 @@ export type SogsResponse = {
4546
headers?: Record<string, string>
4647
}
4748

48-
type Route = { method: string, route: string, handler: (req: SogsRequest) => SogsResponse | Promise<SogsResponse> }
49+
type Route = { method: string, route: string, handler: (req: SogsRequest) => SogsResponse | Promise<SogsResponse>, bodyType?: 'buffer' | 'json' | 'any' }
4950
const router: Route[] = []
5051

5152
router.push({ method: 'GET', route: '/capabilities', handler: getCapabilities })
@@ -55,22 +56,22 @@ router.push({ method: 'GET', route: '/room/:token/pollInfo/:info_updates', handl
5556
router.push({ method: 'DELETE', route: '/room/:token/all/:session_id', handler: deleteAllFromUser })
5657
router.push({ method: 'GET', route: '/room/:token/messages/recent', handler: getRoomRecentMessages })
5758
router.push({ method: 'GET', route: '/room/:token/messages/since/:since_seqno', handler: getRoomMessagesSince })
58-
router.push({ method: 'POST', route: '/room/:token/message', handler: postRoomMessage })
59+
router.push({ method: 'POST', route: '/room/:token/message', handler: postRoomMessage, bodyType: 'json' })
5960
router.push({ method: 'DELETE', route: '/room/:token/message/:message_id', handler: deleteRoomMessage })
60-
router.push({ method: 'POST', route: '/room/:token/file', handler: uploadFileToRoom })
61+
router.push({ method: 'POST', route: '/room/:token/file', handler: uploadFileToRoom, bodyType: 'buffer' })
6162
router.push({ method: 'GET', route: '/room/:token/file/:file_id', handler: retrieveFileInRoom })
6263
router.push({ method: 'GET', route: '/room/:token/file/:file_id/:filename', handler: retrieveFileInRoom })
63-
router.push({ method: 'POST', route: '/user/:session_id/ban', handler: banUser })
64-
router.push({ method: 'POST', route: '/user/:session_id/unban', handler: unbanUser })
65-
router.push({ method: 'POST', route: '/user/:session_id/moderator', handler: appointModerator })
66-
router.push({ method: 'POST', route: '/room/:token/pin/:message_id', handler: pinMessage })
67-
router.push({ method: 'POST', route: '/room/:token/unpin/all', handler: unpinAllMessages })
68-
router.push({ method: 'POST', route: '/room/:token/unpin/:message_id', handler: unpinMessage })
64+
router.push({ method: 'POST', route: '/user/:session_id/ban', handler: banUser, bodyType: 'json' })
65+
router.push({ method: 'POST', route: '/user/:session_id/unban', handler: unbanUser, bodyType: 'json' })
66+
router.push({ method: 'POST', route: '/user/:session_id/moderator', handler: appointModerator, bodyType: 'json' })
67+
router.push({ method: 'POST', route: '/room/:token/pin/:message_id', handler: pinMessage, bodyType: 'json' })
68+
router.push({ method: 'POST', route: '/room/:token/unpin/all', handler: unpinAllMessages, bodyType: 'json' })
69+
router.push({ method: 'POST', route: '/room/:token/unpin/:message_id', handler: unpinMessage, bodyType: 'json' })
6970
router.push({ method: 'GET', route: '/inbox', handler: getDmInbox })
7071
router.push({ method: 'GET', route: '/inbox/since/:message_id', handler: getDmInboxSince })
7172
router.push({ method: 'GET', route: '/outbox', handler: getDmOutbox })
7273
router.push({ method: 'GET', route: '/outbox/since/:message_id', handler: getDmOutboxSince })
73-
router.push({ method: 'POST', route: '/inbox/:session_id', handler: sendDmMessage })
74+
router.push({ method: 'POST', route: '/inbox/:session_id', handler: sendDmMessage, bodyType: 'json' })
7475
router.push({ method: 'DELETE', route: '/inbox', handler: deleteDmInbox })
7576
router.push({ method: 'PUT', route: '/room/:token/reaction/:message_id/:reaction', handler: addReaction })
7677
router.push({ method: 'DELETE', route: '/room/:token/reaction/:message_id/:reaction', handler: deleteReaction })
@@ -98,7 +99,28 @@ export async function handleIncomingRequest(req: SogsRequest): Promise<SogsRespo
9899

99100
const request = findRoute(req.method, req.endpoint)
100101
if (request) {
101-
return await request.route.handler({ ...req, params: request.params, searchParams: request.searchParams })
102+
let parsedBody: any
103+
if (request.route.bodyType === 'json') {
104+
if (typeof req.body === 'string') {
105+
parsedBody = SJSON.parse(req.body)
106+
} else if(Buffer.isBuffer(req.body)) {
107+
parsedBody = SJSON.parse(req.body.toString('utf-8'))
108+
} else {
109+
parsedBody = req.body
110+
}
111+
} else if (request.route.bodyType === 'buffer') {
112+
if(Buffer.isBuffer(req.body)) {
113+
parsedBody = req.body
114+
} else {
115+
return {
116+
response: null,
117+
status: 400
118+
}
119+
}
120+
} else {
121+
parsedBody = req.body
122+
}
123+
return await request.route.handler({ ...req, body: parsedBody, params: request.params, searchParams: request.searchParams })
102124
} else {
103125
if(process.env.BUNSOGS_DEV === 'true') {
104126
console.warn('Unknown route', req.method, req.endpoint)

src/router/post-room-message.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ export async function postRoomMessage(req: SogsRequest): Promise<SogsResponse> {
6666
if (req.body === null) {
6767
return { status: 400, response: null }
6868
}
69-
const parsedBody = SJSON.parse(req.body.toString('utf-8'))
69+
const parsedBody = req.body
70+
console.log(parsedBody)
7071
const body = await z.object({
7172
data: z.string().min(1).base64(),
7273
signature: z.string().length(88).base64(),

0 commit comments

Comments
 (0)