Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions api/app/clients/BaseClient.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const {
getLangfuseTraceMessageFields,
isContentFilterError,
assertModelBoundProviderContent,
reportLocatorTraversalFailure,
collectModelBoundHistoricalFileIdState,
projectModelBoundSourceFiles,
isModelBoundAttachmentFile,
Expand Down Expand Up @@ -302,6 +303,7 @@ class BaseClient {
: [{ role: 'user', content: payload, isCreatedByUser: true, isUserSubmitted: true }];
const fileProjection = this.getModelBoundFileProjection();
assertModelBoundProviderContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req?.config?.filters,
legacyPii: this.options.req?.config?.messageFilter?.pii,
providerMessages: messages,
Expand Down
13 changes: 13 additions & 0 deletions api/server/controllers/agents/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ const {
decrementPendingRequest,
maybePrewarmCodeSandbox,
assertModelBoundContent,
reportLocatorTraversalFailure,
filterFilesByEndpointRuntimeConfig,
createModelBoundChatModelCallback: createModelBoundContentCallback,
createInitialModelBoundAdmissionCallback,
Expand Down Expand Up @@ -516,6 +517,7 @@ class AgentClient extends BaseClient {
admitSteerAttachments(files, steerId) {
const modelBoundFiles = files.filter(isModelBoundAttachmentFile);
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req?.config?.filters,
files: modelBoundFiles,
});
Expand Down Expand Up @@ -2047,6 +2049,7 @@ class AgentClient extends BaseClient {
return;
}
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
legacyPii,
storedMessages: this.modelBoundStoredMessages,
});
Expand All @@ -2063,6 +2066,7 @@ class AgentClient extends BaseClient {
const persistence = BaseClient.prototype.getModelBoundUserMessagePersistence.call(this);
return createModelBoundContentCallback(
{
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req?.config?.filters,
legacyPii: this.options.req?.config?.messageFilter?.pii,
storedMessages: this.modelBoundStoredMessages,
Expand Down Expand Up @@ -2393,6 +2397,7 @@ class AgentClient extends BaseClient {
]);
void earlySharedContextPromise.catch(() => {});
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req.config?.filters,
legacyPii: this.options.req.config?.messageFilter?.pii,
agents: allAgents.map(({ agent }) => agent),
Expand Down Expand Up @@ -2473,6 +2478,7 @@ class AgentClient extends BaseClient {
this.modelBoundCurrentFiles = [...modelBoundRequestAttachments];

assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req.config?.filters,
files: modelBoundRequestAttachments,
});
Expand Down Expand Up @@ -2720,6 +2726,7 @@ class AgentClient extends BaseClient {
* user payload so strict file policy cannot be skipped by a late media
* adapter. */
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req.config?.filters,
legacyPii: this.options.req.config?.messageFilter?.pii,
submittedMessages: [{ role: 'user', content: latestFormatted.content }],
Expand Down Expand Up @@ -3013,6 +3020,7 @@ class AgentClient extends BaseClient {
});
if (assertLateBoundContent) {
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req.config?.filters,
legacyPii: this.options.req.config?.messageFilter?.pii,
agents: [agent],
Expand Down Expand Up @@ -3041,6 +3049,7 @@ class AgentClient extends BaseClient {
this.modelBoundMemoryContexts = [...modelBoundMemoryContexts];
this.modelBoundFileContexts = [...modelBoundFileContexts];
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req.config?.filters,
legacyPii: this.options.req.config?.messageFilter?.pii,
agents: allAgents.map(({ agent }) => agent),
Expand Down Expand Up @@ -4676,6 +4685,7 @@ class AgentClient extends BaseClient {
}

assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: appConfig?.filters,
legacyPii: appConfig?.messageFilter?.pii,
agents: reachableAgents,
Expand Down Expand Up @@ -5346,6 +5356,7 @@ class AgentClient extends BaseClient {
},
{
getAgentCheckpointer,
onTraversalFailure: reportLocatorTraversalFailure,
getMessages: db.getMessages,
getFiles: db.getFiles,
},
Expand Down Expand Up @@ -5433,6 +5444,7 @@ class AgentClient extends BaseClient {
agent === this.options.agent ? this.options.req.body.ephemeralAgent : undefined,
});
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req.config?.filters,
legacyPii: this.options.req.config?.messageFilter?.pii,
agents: [agent],
Expand Down Expand Up @@ -5531,6 +5543,7 @@ class AgentClient extends BaseClient {
sharedRunContext: scopedContext ?? '',
});
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: this.options.req.config?.filters,
legacyPii: this.options.req.config?.messageFilter?.pii,
agents: [agent],
Expand Down
2 changes: 2 additions & 0 deletions api/server/controllers/agents/openai.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ const {
isContentTraversalProtected,
isContentTraversalLimitError,
assertModelBoundContent,
reportLocatorTraversalFailure,
hasModelBoundContentProtection,
isContentFilterError,
getSafeErrorMetadata,
Expand Down Expand Up @@ -750,6 +751,7 @@ const executeOpenAIChatCompletion = async (envelope, { req, res }) => {
const manualSkillPrimes = primaryConfig.manualSkillPrimes;
const alwaysApplySkillPrimes = primaryConfig.alwaysApplySkillPrimes;
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: appConfig?.filters,
legacyPii: appConfig?.messageFilter?.pii,
submittedMessages: request.messages,
Expand Down
4 changes: 4 additions & 0 deletions api/server/controllers/agents/responses.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ const {
isContentTraversalLimitError,
prependContentTraversalFragments,
assertModelBoundContent,
reportLocatorTraversalFailure,
hasModelBoundContentProtection,
isContentFilterError,
getSafeErrorMetadata,
Expand Down Expand Up @@ -710,6 +711,7 @@ const executeResponse = async (envelope, { req, res }) => {
: [];
if (request.previous_response_id) {
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: appConfig?.filters,
legacyPii: appConfig?.messageFilter?.pii,
storedMessages: previousMessages,
Expand Down Expand Up @@ -1000,6 +1002,7 @@ const executeResponse = async (envelope, { req, res }) => {
const modelBoundAgents = [...modelBoundAgentsById.values()];
const mergedMCPAuthMap = discoveredMCPAuthMap ?? primaryConfig.userMCPAuthMap;
assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: appConfig?.filters,
legacyPii: appConfig?.messageFilter?.pii,
agents: modelBoundAgents,
Expand Down Expand Up @@ -1094,6 +1097,7 @@ const executeResponse = async (envelope, { req, res }) => {
}

assertModelBoundContent({
onTraversalFailure: reportLocatorTraversalFailure,
filters: appConfig?.filters,
legacyPii: appConfig?.messageFilter?.pii,
submittedMessages: inputMessages,
Expand Down
2 changes: 2 additions & 0 deletions api/server/controllers/agents/resume.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ const {
getAgentCheckpointer,
isContentFilterError,
preflightResumeContent,
reportLocatorTraversalFailure,
getResumeProvenance,
getUserFacingResumeError,
decrementPendingRequest,
Expand Down Expand Up @@ -197,6 +198,7 @@ async function deleteFailedResumeCheckpoint(args, context) {
const GENERIC_RESUME_ERROR = 'Resume failed';

const resumeContentProtectionDependencies = {
onTraversalFailure: reportLocatorTraversalFailure,
getAgentCheckpointer,
checkAccess,
getMessages,
Expand Down
2 changes: 2 additions & 0 deletions api/server/controllers/agents/v1.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const {
isContentTraversalProtected,
isContentTraversalLimitError,
resolveCanonicalFileReferences,
reportLocatorTraversalFailure,
} = require('@librechat/api');
const {
Time,
Expand Down Expand Up @@ -176,6 +177,7 @@ const blockFilteredAgentContent = async (req, res, agentData) => {
if (filePolicyActive) {
try {
const fileInspection = await resolveCanonicalFileReferences({
onTraversalFailure: reportLocatorTraversalFailure,
filters,
input: agentData,
user: req.user,
Expand Down
4 changes: 4 additions & 0 deletions api/server/controllers/assistants/chatV1.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const {
isContentFilterError,
hasActiveFilePolicy,
preflightAssistantRunContent,
reportLocatorTraversalFailure,
preflightAssistantUserMessageContent,
} = require('@librechat/api');
const {
Expand Down Expand Up @@ -335,6 +336,7 @@ const chatV1 = async (req, res) => {
let persistedAssistant;
try {
persistedAssistant = await preflightAssistantRunContent({
onTraversalFailure: reportLocatorTraversalFailure,
config: req.config,
openai,
user: req.user,
Expand Down Expand Up @@ -546,6 +548,7 @@ const chatV1 = async (req, res) => {
await getRequestFileIds();
try {
await preflightAssistantUserMessageContent({
onTraversalFailure: reportLocatorTraversalFailure,
config: req.config,
user: req.user,
message: userMessage,
Expand Down Expand Up @@ -651,6 +654,7 @@ const chatV1 = async (req, res) => {

try {
await preflightAssistantRunContent({
onTraversalFailure: reportLocatorTraversalFailure,
config: req.config,
openai,
user: req.user,
Expand Down
4 changes: 4 additions & 0 deletions api/server/controllers/assistants/chatV2.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const {
isContentFilterError,
hasActiveFilePolicy,
preflightAssistantRunContent,
reportLocatorTraversalFailure,
preflightAssistantUserMessageContent,
} = require('@librechat/api');
const {
Expand Down Expand Up @@ -206,6 +207,7 @@ const chatV2 = async (req, res) => {
await validateAuthor({ req, openai });
try {
await preflightAssistantRunContent({
onTraversalFailure: reportLocatorTraversalFailure,
config: req.config,
openai,
user: req.user,
Expand Down Expand Up @@ -377,6 +379,7 @@ const chatV2 = async (req, res) => {
await getRequestFileIds();
try {
await preflightAssistantUserMessageContent({
onTraversalFailure: reportLocatorTraversalFailure,
config: req.config,
user: req.user,
message: userMessage,
Expand Down Expand Up @@ -489,6 +492,7 @@ const chatV2 = async (req, res) => {

try {
await preflightAssistantRunContent({
onTraversalFailure: reportLocatorTraversalFailure,
config: req.config,
openai,
user: req.user,
Expand Down
2 changes: 2 additions & 0 deletions api/server/routes/agents/chat.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const express = require('express');
const { logger } = require('@librechat/data-schemas');
const {
createMessageFilterPii,
reportLocatorTraversalFailure,
generateCheckAccess,
skipAgentCheck,
applyResumeContext,
Expand Down Expand Up @@ -72,6 +73,7 @@ const restoreResumeContext = async (req, res, next) => {
router.use(restoreResumeContext);
router.use(
createMessageFilterPii({
onTraversalFailure: reportLocatorTraversalFailure,
getConfig: (req) => req.config?.messageFilter?.pii,
getFilters: (req) => req.config?.filters,
getFiles,
Expand Down
4 changes: 4 additions & 0 deletions api/server/routes/agents/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const express = require('express');
const {
reportLocatorTraversalFailure,
isEnabled,
GenerationJobManager,
TERMINAL_PUBLICATION_RECONNECT_ERROR,
Expand Down Expand Up @@ -1054,6 +1055,7 @@ router.post(
configMiddleware,
...steerLimiters,
createMessageFilterPii({
onTraversalFailure: reportLocatorTraversalFailure,
getConfig: (req) => req.config?.messageFilter?.pii,
getFilters: (req) => req.config?.filters,
getFiles,
Expand All @@ -1074,6 +1076,7 @@ router.post(
configMiddleware,
...steerLimiters,
createMessageFilterPii({
onTraversalFailure: reportLocatorTraversalFailure,
getConfig: (req) => req.config?.messageFilter?.pii,
getFilters: (req) => req.config?.filters,
getFiles,
Expand Down Expand Up @@ -1113,6 +1116,7 @@ router.post(
configMiddleware,
...steerLimiters,
createMessageFilterPii({
onTraversalFailure: reportLocatorTraversalFailure,
getConfig: (req) => req.config?.messageFilter?.pii,
getFilters: (req) => req.config?.filters,
getFiles,
Expand Down
6 changes: 5 additions & 1 deletion api/server/routes/agents/openai.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
*/
const express = require('express');
const {
reportLocatorTraversalFailure,
createAgentEventBindingHandlers,
createAgentTriggerIngressHandlers,
createMessageFilterPii,
Expand Down Expand Up @@ -82,7 +83,10 @@ router.post(
router.post(
'/events',
agentEventUserLimiter,
createMessageFilterPii({ getConfig: (req) => req.config?.messageFilter?.pii }),
createMessageFilterPii({
onTraversalFailure: reportLocatorTraversalFailure,
getConfig: (req) => req.config?.messageFilter?.pii,
}),
eventBindingHandlers.resolve,
checkAgentTriggerPermission,
eventHandlers.enqueueEvent,
Expand Down
7 changes: 6 additions & 1 deletion api/server/routes/agents/tools.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
const express = require('express');
const { createContentFilter, extractToolArgumentContent } = require('@librechat/api');
const {
reportLocatorTraversalFailure,
createContentFilter,
extractToolArgumentContent,
} = require('@librechat/api');
const { callTool, verifyToolAuth, getToolCalls } = require('~/server/controllers/tools');
const { getAvailableTools } = require('~/server/controllers/PluginController');
const { toolCallLimiter } = require('~/server/middleware');

const router = express.Router();
const filterToolArguments = createContentFilter({
onTraversalFailure: reportLocatorTraversalFailure,
getFilters: (req) => req.config?.filters,
extract: (req) => {
const {
Expand Down
3 changes: 2 additions & 1 deletion api/server/routes/assistants/chatV1.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const express = require('express');
const { createMessageFilterPii } = require('@librechat/api');
const { createMessageFilterPii, reportLocatorTraversalFailure } = require('@librechat/api');

const router = express.Router();
const { handleAbort, validateModel, buildEndpointOption } = require('~/server/middleware');
Expand All @@ -12,6 +12,7 @@ const { getFiles } = require('~/models');
router.post('/abort', handleAbort());

const filterMessageContent = createMessageFilterPii({
onTraversalFailure: reportLocatorTraversalFailure,
getConfig: (req) => req.config?.messageFilter?.pii,
getFilters: (req) => req.config?.filters,
getFiles,
Expand Down
3 changes: 2 additions & 1 deletion api/server/routes/assistants/chatV2.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const express = require('express');
const { createMessageFilterPii } = require('@librechat/api');
const { createMessageFilterPii, reportLocatorTraversalFailure } = require('@librechat/api');

const router = express.Router();
const { handleAbort, validateModel, buildEndpointOption } = require('~/server/middleware');
Expand All @@ -12,6 +12,7 @@ const { getFiles } = require('~/models');
router.post('/abort', handleAbort());

const filterMessageContent = createMessageFilterPii({
onTraversalFailure: reportLocatorTraversalFailure,
getConfig: (req) => req.config?.messageFilter?.pii,
getFilters: (req) => req.config?.filters,
getFiles,
Expand Down
7 changes: 6 additions & 1 deletion api/server/routes/assistants/v1.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
const express = require('express');
const { createContentFilter, extractAssistantContent } = require('@librechat/api');
const {
reportLocatorTraversalFailure,
createContentFilter,
extractAssistantContent,
} = require('@librechat/api');
const controllers = require('~/server/controllers/assistants/v1');
const { getFiles } = require('~/models');
const documents = require('./documents');
Expand All @@ -9,6 +13,7 @@ const tools = require('./tools');
const router = express.Router();
const avatar = express.Router();
const filterAssistantContent = createContentFilter({
onTraversalFailure: reportLocatorTraversalFailure,
getFilters: (req) => req.config?.filters,
extract: (req) => extractAssistantContent(req.body),
getOpaqueFileInput: (req) => req.body,
Expand Down
Loading
Loading