Skip to content

Commit

Permalink
Fix body processing for clearnet requests
Browse files Browse the repository at this point in the history
  • Loading branch information
VityaSchel committed Jan 2, 2025
1 parent a20dc55 commit f9772b3
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/router/add-reaction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import { z } from 'zod'
*/
export async function addReaction(req: SogsRequest): Promise<SogsResponse> {
const roomToken = req.params?.['token']
if (!roomToken) {
if (!roomToken || Array.isArray(roomToken)) {
return { status: 400, response: null }
}

Expand Down
2 changes: 1 addition & 1 deletion src/router/dm/send-message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export async function sendDmMessage(req: SogsRequest): Promise<SogsResponse> {
}
}
}
const parsedBody = SJSON.parse(req.body.toString('utf-8'))
const parsedBody = req.body
const body = await z.object({
message: z.string().max(24000),
}).parse(parsedBody)
Expand Down
46 changes: 34 additions & 12 deletions src/router/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { User } from '@/user'
import SJSON from 'secure-json-parse'
import { getCapabilities } from '@/router/get-capabilities'
import { getRoomsRoute } from '@/router/get-rooms'
import { getRoom } from '@/router/get-room'
Expand Down Expand Up @@ -31,7 +32,7 @@ import { match } from 'path-to-regexp'
export type SogsRequest = {
endpoint: string
method: string
body: Buffer | null
body: Buffer | any | null
params?: Partial<Record<string, string | string[]>>
headers?: { [key: string]: string }
searchParams?: { [k: string]: string }
Expand All @@ -45,7 +46,7 @@ export type SogsResponse = {
headers?: Record<string, string>
}

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

router.push({ method: 'GET', route: '/capabilities', handler: getCapabilities })
Expand All @@ -55,22 +56,22 @@ router.push({ method: 'GET', route: '/room/:token/pollInfo/:info_updates', handl
router.push({ method: 'DELETE', route: '/room/:token/all/:session_id', handler: deleteAllFromUser })
router.push({ method: 'GET', route: '/room/:token/messages/recent', handler: getRoomRecentMessages })
router.push({ method: 'GET', route: '/room/:token/messages/since/:since_seqno', handler: getRoomMessagesSince })
router.push({ method: 'POST', route: '/room/:token/message', handler: postRoomMessage })
router.push({ method: 'POST', route: '/room/:token/message', handler: postRoomMessage, bodyType: 'json' })
router.push({ method: 'DELETE', route: '/room/:token/message/:message_id', handler: deleteRoomMessage })
router.push({ method: 'POST', route: '/room/:token/file', handler: uploadFileToRoom })
router.push({ method: 'POST', route: '/room/:token/file', handler: uploadFileToRoom, bodyType: 'buffer' })
router.push({ method: 'GET', route: '/room/:token/file/:file_id', handler: retrieveFileInRoom })
router.push({ method: 'GET', route: '/room/:token/file/:file_id/:filename', handler: retrieveFileInRoom })
router.push({ method: 'POST', route: '/user/:session_id/ban', handler: banUser })
router.push({ method: 'POST', route: '/user/:session_id/unban', handler: unbanUser })
router.push({ method: 'POST', route: '/user/:session_id/moderator', handler: appointModerator })
router.push({ method: 'POST', route: '/room/:token/pin/:message_id', handler: pinMessage })
router.push({ method: 'POST', route: '/room/:token/unpin/all', handler: unpinAllMessages })
router.push({ method: 'POST', route: '/room/:token/unpin/:message_id', handler: unpinMessage })
router.push({ method: 'POST', route: '/user/:session_id/ban', handler: banUser, bodyType: 'json' })
router.push({ method: 'POST', route: '/user/:session_id/unban', handler: unbanUser, bodyType: 'json' })
router.push({ method: 'POST', route: '/user/:session_id/moderator', handler: appointModerator, bodyType: 'json' })
router.push({ method: 'POST', route: '/room/:token/pin/:message_id', handler: pinMessage, bodyType: 'json' })
router.push({ method: 'POST', route: '/room/:token/unpin/all', handler: unpinAllMessages, bodyType: 'json' })
router.push({ method: 'POST', route: '/room/:token/unpin/:message_id', handler: unpinMessage, bodyType: 'json' })
router.push({ method: 'GET', route: '/inbox', handler: getDmInbox })
router.push({ method: 'GET', route: '/inbox/since/:message_id', handler: getDmInboxSince })
router.push({ method: 'GET', route: '/outbox', handler: getDmOutbox })
router.push({ method: 'GET', route: '/outbox/since/:message_id', handler: getDmOutboxSince })
router.push({ method: 'POST', route: '/inbox/:session_id', handler: sendDmMessage })
router.push({ method: 'POST', route: '/inbox/:session_id', handler: sendDmMessage, bodyType: 'json' })
router.push({ method: 'DELETE', route: '/inbox', handler: deleteDmInbox })
router.push({ method: 'PUT', route: '/room/:token/reaction/:message_id/:reaction', handler: addReaction })
router.push({ method: 'DELETE', route: '/room/:token/reaction/:message_id/:reaction', handler: deleteReaction })
Expand Down Expand Up @@ -98,7 +99,28 @@ export async function handleIncomingRequest(req: SogsRequest): Promise<SogsRespo

const request = findRoute(req.method, req.endpoint)
if (request) {
return await request.route.handler({ ...req, params: request.params, searchParams: request.searchParams })
let parsedBody: any
if (request.route.bodyType === 'json') {
if (typeof req.body === 'string') {
parsedBody = SJSON.parse(req.body)
} else if(Buffer.isBuffer(req.body)) {
parsedBody = SJSON.parse(req.body.toString('utf-8'))
} else {
parsedBody = req.body
}
} else if (request.route.bodyType === 'buffer') {
if(Buffer.isBuffer(req.body)) {
parsedBody = req.body
} else {
return {
response: null,
status: 400
}
}
} else {
parsedBody = req.body
}
return await request.route.handler({ ...req, body: parsedBody, params: request.params, searchParams: request.searchParams })
} else {
if(process.env.BUNSOGS_DEV === 'true') {
console.warn('Unknown route', req.method, req.endpoint)
Expand Down
3 changes: 2 additions & 1 deletion src/router/post-room-message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ export async function postRoomMessage(req: SogsRequest): Promise<SogsResponse> {
if (req.body === null) {
return { status: 400, response: null }
}
const parsedBody = SJSON.parse(req.body.toString('utf-8'))
const parsedBody = req.body
console.log(parsedBody)
const body = await z.object({
data: z.string().min(1).base64(),
signature: z.string().length(88).base64(),
Expand Down

0 comments on commit f9772b3

Please sign in to comment.