Files
dify/api/services/file_scan/__init__.py
JyongandClaude Fable 5.2 7d6c1845b8 feat(file-scan): scan uploaded knowledge base files for malware
Add a shared file malware-scanning module and use it in the Classic
Knowledge Base, RAG Pipeline local files and the Agent Knowledge Base.

- core/file_scan: scanner adapters for ClamAV (deployment-configured),
  Cloudmersive, Scanii, OPSWAT MetaDefender Cloud and API-based
  extensions (new `file.malware_scan` extension point).
- services/file_scan: FileScanService is the single entry point other
  modules call. Providers are workspace-wide; a policy belongs to a
  scope (dataset, knowledge_fs_space), so further modules can adopt
  scanning without schema changes.
- Each file is scanned on its own: a rejected file fails only its own
  document. Malware always blocks and deletes the stored original;
  invalid credentials and exhausted quota stop processing regardless of
  the "allow" fallback.
- Console: workspace scanner management and a per-knowledge-base
  policy section in both settings forms; the Agent Knowledge Base
  upload keeps going after a rejected file and explains each failure.
- Off by default behind FILE_SCAN_ENABLED.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 18:37:03 +08:00

38 lines
1.3 KiB
Python

"""Malware scanning of stored files, shared by every product module.
A module adopts scanning in three steps:
1. Pick a scope type (``ScanScope("dataset", dataset_id)``) and expose
``FileScanPolicyService`` behind its own settings route, guarded by its own permissions.
2. Call ``FileScanService().scan_upload_file(...)`` before it first reads an uploaded file, and
stop when ``outcome.allowed`` is false.
3. Call ``FileScanPolicyService().delete_scope(...)`` when the resource is deleted.
"""
from services.file_scan.entities import ScanErrorCode, ScanOutcome, ScanPolicy, ScanScope
from services.file_scan.errors import (
FileScanBlockedError,
FileScanError,
FileScanProviderInUseError,
FileScanProviderNotFoundError,
FileScanValidationError,
)
from services.file_scan.file_scan_service import FileScanService
from services.file_scan.policy_service import FileScanPolicyService
from services.file_scan.provider_service import FileScanProviderService
__all__ = [
"FileScanBlockedError",
"FileScanError",
"FileScanPolicyService",
"FileScanProviderInUseError",
"FileScanProviderNotFoundError",
"FileScanProviderService",
"FileScanService",
"FileScanValidationError",
"ScanErrorCode",
"ScanOutcome",
"ScanPolicy",
"ScanScope",
]