Skip to content

Commit e56cb1c

Browse files
committed
fix(security): resolve credentialId guard on OneDrive, use assertToolFileAccess in WordPress, memoize body buffer to prevent silent empty reads, fix ArrayBuffer type cast
1 parent 988ce33 commit e56cb1c

3 files changed

Lines changed: 19 additions & 27 deletions

File tree

apps/sim/app/api/tools/onedrive/folders/route.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export const GET = withRouteHandler(async (request: NextRequest) => {
4747
credentialId,
4848
requireWorkflowIdForInternal: false,
4949
})
50-
if (!authz.ok || !authz.credentialOwnerUserId) {
50+
if (!authz.ok || !authz.credentialOwnerUserId || !authz.resolvedCredentialId) {
5151
return NextResponse.json({ error: authz.error || 'Unauthorized' }, { status: 403 })
5252
}
5353

apps/sim/app/api/tools/wordpress/upload/route.ts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
processSingleFileToUserFile,
1212
} from '@/lib/uploads/utils/file-utils'
1313
import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server'
14-
import { verifyFileAccess } from '@/app/api/files/authorization'
14+
import { assertToolFileAccess } from '@/app/api/files/authorization'
1515

1616
export const dynamic = 'force-dynamic'
1717

@@ -78,22 +78,8 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
7878
)
7979
}
8080

81-
if (typeof userFile.key !== 'string' || userFile.key.length === 0) {
82-
logger.warn(`[${requestId}] File access check rejected: missing key`)
83-
return NextResponse.json({ success: false, error: 'File not found' }, { status: 404 })
84-
}
85-
if (!authResult.userId) {
86-
logger.warn(`[${requestId}] File access check requires userId but none available`)
87-
return NextResponse.json({ success: false, error: 'File not found' }, { status: 404 })
88-
}
89-
const hasAccess = await verifyFileAccess(userFile.key, authResult.userId)
90-
if (!hasAccess) {
91-
logger.warn(`[${requestId}] File access denied for user`, {
92-
userId: authResult.userId,
93-
key: userFile.key,
94-
})
95-
return NextResponse.json({ success: false, error: 'File not found' }, { status: 404 })
96-
}
81+
const denied = await assertToolFileAccess(userFile.key, authResult.userId, requestId, logger)
82+
if (denied) return denied
9783

9884
logger.info(`[${requestId}] Downloading file from storage`, {
9985
fileName: userFile.name,

apps/sim/lib/core/security/input-validation.server.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,21 @@ export async function secureFetchWithPinnedIP(
409409
},
410410
})
411411

412-
async function readBodyAsBuffer(): Promise<Buffer> {
413-
const reader = body.getReader()
414-
const buffers: Uint8Array[] = []
415-
while (true) {
416-
const { done, value } = await reader.read()
417-
if (done) break
418-
if (value) buffers.push(value)
412+
let bodyBufferPromise: Promise<Buffer> | null = null
413+
function readBodyAsBuffer(): Promise<Buffer> {
414+
if (!bodyBufferPromise) {
415+
bodyBufferPromise = (async () => {
416+
const reader = body.getReader()
417+
const buffers: Uint8Array[] = []
418+
while (true) {
419+
const { done, value } = await reader.read()
420+
if (done) break
421+
if (value) buffers.push(value)
422+
}
423+
return Buffer.concat(buffers.map((b) => Buffer.from(b)))
424+
})()
419425
}
420-
return Buffer.concat(buffers.map((b) => Buffer.from(b)))
426+
return bodyBufferPromise
421427
}
422428

423429
settledResolve({
@@ -430,7 +436,7 @@ export async function secureFetchWithPinnedIP(
430436
json: async () => JSON.parse((await readBodyAsBuffer()).toString('utf-8')),
431437
arrayBuffer: async () => {
432438
const buf = await readBodyAsBuffer()
433-
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)
439+
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer
434440
},
435441
})
436442
})

0 commit comments

Comments
 (0)