| const { logger } = require('@librechat/data-schemas'); |
| const { PermissionBits, ResourceType } = require('librechat-data-provider'); |
| const { checkPermission } = require('~/server/services/PermissionService'); |
| const { getAgent } = require('~/models/Agent'); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const hasAccessToFilesViaAgent = async ({ userId, role, fileIds, agentId, isDelete }) => { |
| const accessMap = new Map(); |
|
|
| |
| fileIds.forEach((fileId) => accessMap.set(fileId, false)); |
|
|
| try { |
| const agent = await getAgent({ id: agentId }); |
|
|
| if (!agent) { |
| return accessMap; |
| } |
|
|
| |
| if (agent.author.toString() === userId.toString()) { |
| fileIds.forEach((fileId) => accessMap.set(fileId, true)); |
| return accessMap; |
| } |
|
|
| |
| const hasViewPermission = await checkPermission({ |
| userId, |
| role, |
| resourceType: ResourceType.AGENT, |
| resourceId: agent._id, |
| requiredPermission: PermissionBits.VIEW, |
| }); |
|
|
| if (!hasViewPermission) { |
| return accessMap; |
| } |
|
|
| if (isDelete) { |
| |
| const hasEditPermission = await checkPermission({ |
| userId, |
| role, |
| resourceType: ResourceType.AGENT, |
| resourceId: agent._id, |
| requiredPermission: PermissionBits.EDIT, |
| }); |
|
|
| |
| |
| if (!hasEditPermission) { |
| return accessMap; |
| } |
| } |
|
|
| const attachedFileIds = new Set(); |
| if (agent.tool_resources) { |
| for (const [_resourceType, resource] of Object.entries(agent.tool_resources)) { |
| if (resource?.file_ids && Array.isArray(resource.file_ids)) { |
| resource.file_ids.forEach((fileId) => attachedFileIds.add(fileId)); |
| } |
| } |
| } |
|
|
| |
| fileIds.forEach((fileId) => { |
| if (attachedFileIds.has(fileId)) { |
| accessMap.set(fileId, true); |
| } |
| }); |
|
|
| return accessMap; |
| } catch (error) { |
| logger.error('[hasAccessToFilesViaAgent] Error checking file access:', error); |
| return accessMap; |
| } |
| }; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const filterFilesByAgentAccess = async ({ files, userId, role, agentId }) => { |
| if (!userId || !agentId || !files || files.length === 0) { |
| return files; |
| } |
|
|
| |
| const filesToCheck = []; |
| const ownedFiles = []; |
|
|
| for (const file of files) { |
| if (file.user && file.user.toString() === userId.toString()) { |
| ownedFiles.push(file); |
| } else { |
| filesToCheck.push(file); |
| } |
| } |
|
|
| if (filesToCheck.length === 0) { |
| return ownedFiles; |
| } |
|
|
| |
| const fileIds = filesToCheck.map((f) => f.file_id); |
| const accessMap = await hasAccessToFilesViaAgent({ userId, role, fileIds, agentId }); |
|
|
| |
| const accessibleFiles = filesToCheck.filter((file) => accessMap.get(file.file_id)); |
|
|
| return [...ownedFiles, ...accessibleFiles]; |
| }; |
|
|
| module.exports = { |
| hasAccessToFilesViaAgent, |
| filterFilesByAgentAccess, |
| }; |
|
|