fix(security): SSRF guard on search baseUrl, default-password remote login, and request-details redaction
- resolveBaseUrl() rejects client-supplied non-public baseUrls via assertPublicUrl (SSRF guard on /v1/search) - fresh-install remote login with default password returns 403 without issuing a JWT - /api/usage/request-details redacts request/providerRequest/providerResponse/response payloads - declare chalk and prop-types in package.json (used but previously undeclared)
This commit is contained in:
1 parent
70ba0024b0
commit
8a527fec91
6 files changed
+167
-5
No files matched your search
@@ -47,8 +47,23 @@ export async function GET(request) {
|
||||
if (endDate) filter.endDate = endDate;
|
||||
|
||||
const result = await getRequestDetails(filter);
|
||||
|
||||
return NextResponse.json(result);
|
||||
|
||||
// Redact conversation payloads: the stored details include full request
|
||||
// bodies (user prompts, tool calls) and provider responses. Returning them
|
||||
// wholesale lets any dashboard-authenticated user (or, if requireLogin is
|
||||
// disabled, anyone) read every user's conversation history. Keep the
|
||||
// metadata (model, tokens, latency, status) but drop message content.
|
||||
const redactedDetails = (result.details || []).map((d) => {
|
||||
const redacted = { ...d };
|
||||
for (const key of ["request", "providerRequest", "providerResponse", "response"]) {
|
||||
if (redacted[key] !== undefined) {
|
||||
redacted[key] = { redacted: true };
|
||||
}
|
||||
}
|
||||
return redacted;
|
||||
});
|
||||
|
||||
return NextResponse.json({ ...result, details: redactedDetails });
|
||||
} catch (error) {
|
||||
console.error("[API] Failed to get request details:", error);
|
||||
return NextResponse.json(
|
||||
|
||||
Reference in new issue
Block a user