贡献指南

代码结构

参考如下代码文件结构可以帮助你更好地理解代码的组织方式。

[cmd/]
├── server                // Enterpoint for starting the server.
├── lib                   // Enterpoint for Shared libraries.
└── test                  // Common test scripts.
[build/]                  // build scripts for different architectures and platforms.
[internal/]               // Internal packages.
├── controller            // HTTP request handlers.
├── middleware            // Middleware for request processing.
├── server                // Server setup and configuration.
├── service               // Provides service for controller.
├── static                // Configuration files.
│   ├── nodejs_syscall    // Whitelist for nodejs syscall.
│   └── python_syscall    // Whitelist for python syscall.
├── types                 // Entities
├── core                  // Core logic for isolation and execution.
│   ├── lib               // Shared libraries.
│   ├── runner            // Code execution.
│   │   ├── nodejs        // Nodejs runner.
|   |   └── python        // Python runner.
└── tests                 // Tests for CI/CD.

原理

目前来说,核心逻辑的入口部分有两个,一个是DifySandboxHTTP服务入口,另一个是动态链接库的入口,在Sandbox尝试运行代码时,它会首先生产一个临时代码文件,在这个文件的最开始,会调用动态链接库来初始化运行环境,也就是Sandbox,随后才是用户代码的执行,最终执行代码时并不会直接执行用户提交的代码,而是执行这个临时文件,从而确保不会被用户提交的代码破坏系统。

其中,动态链接库中就是使用了Seccomp来限制系统调用,其中运行的系统调用位于static目录下的nodejs_syscallpython_syscall文件中,并分别提供了ARM64AMD64两种架构的系统调用白名单,一共四份文件,在没有特殊需求的情况下,请不要随意修改这些文件。

如何贡献

首先,对于TypoBug等问题,欢迎直接提交PR,如果是较大的改动或Feature级别的提交,请先提交Issue,以便我们更好地讨论。

待办事项

这里是一些我们目前正在考虑的待办事项,如果你有兴趣,可以选择其中一个来贡献。

最后更新于