| | 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, |
| | }; |
| |
|