diff --git a/.M001-SUMMARY.md b/docs/M001-SUMMARY.md similarity index 100% rename from .M001-SUMMARY.md rename to docs/M001-SUMMARY.md diff --git a/docs/M002-security-framework-completion.md b/docs/M002-security-framework-completion.md new file mode 100644 index 0000000..875ff72 --- /dev/null +++ b/docs/M002-security-framework-completion.md @@ -0,0 +1,125 @@ +# M002 安全框架基础实现 - 任务完成报告 + +## 任务概述 + +**任务 ID:** M002 +**任务名称:** 安全框架基础实现 +**优先级:** 高 (🔴) +**预计完成时间:** 2026-05-15 +**实际完成时间:** 2026-04-05 +**状态:** ✅ 已完成 + +## 任务目标 + +实现 MoDa Browser Core 的安全框架基础,包括: +1. 能力系统设计与实现 +2. 安全原语实现 +3. 安全策略定义 + +## 实现内容 + +### 1. 能力系统设计 + +**文件:** `src/security/capabilities.rs` + +- 实现了 `Capability` 枚举,支持以下能力: + - `NetworkAccess` - 网络访问权限 + - `FileSystemRead` - 文件系统读取权限 + - `FileSystemWrite` - 文件系统写入权限 + - `ProcessSpawn` - 进程创建权限 + - `SystemCall(String)` - 系统调用权限 + - `Custom(String)` - 自定义权限 + +- 实现了 `CapabilityToken` 结构体,支持: + - 能力的添加和管理 + - 令牌过期检查 + - 能力验证机制 + +### 2. 权限管理系统 + +**文件:** `src/security/permissions.rs` + +- 实现了 `PermissionPolicy` 结构体,定义了: + - 允许的能力列表 + - 拒绝的能力列表 + +- 实现了 `PermissionManager` 类,支持: + - 策略的添加和移除 + - 线程安全的权限检查 + - 详细的错误处理 + +### 3. 验证框架 + +**文件:** `src/security/validation.rs` + +- 实现了 `Validator` trait,定义了验证接口 + +- 实现了多种验证器: + - `StringValidator` - 字符串长度和字符集验证 + - `PathValidator` - 路径安全性验证(防止路径遍历攻击) + +### 4. 安全错误处理 + +**文件:** `src/security/lib.rs` + +- 定义了 `SecurityError` 枚举,包含: + - `InvalidToken` - 无效的能力令牌 + - `PermissionDenied(String)` - 权限拒绝 + - `ValidationFailed(String)` - 验证失败 + +- 提供了统一的 `Result` 类型 + +## 技术实现特点 + +1. **内存安全**:使用 Rust 语言实现,利用其内存安全特性 +2. **模块化设计**:清晰的模块划分,代码结构合理 +3. **线程安全**:权限管理支持多线程环境 +4. **完整的测试**:每个模块都包含单元测试 +5. **遵循最佳实践**:采用 Rust 安全编码最佳实践 + +## 测试覆盖 + +| 模块 | 测试用例 | 覆盖情况 | +|------|----------|----------| +| 能力系统 | 令牌创建、验证 | ✅ 完整 | +| 权限管理 | 权限检查 | ✅ 完整 | +| 验证框架 | 字符串验证、路径验证 | ✅ 完整 | + +## 技术要求满足情况 + +| 技术要求 | 满足情况 | +|----------|----------| +| 使用 Rust 实现安全关键代码 | ✅ 是 | +| 遵循安全编码最佳实践 | ✅ 是 | +| 实现安全的错误处理 | ✅ 是 | +| 避免常见安全漏洞 | ✅ 是 | + +## 测试要点验证 + +| 测试要点 | 验证结果 | +|----------|----------| +| 安全机制有效性 | ✅ 通过 | +| 权限验证准确性 | ✅ 通过 | +| 安全策略执行正确性 | ✅ 通过 | + +## 依赖项 + +| 依赖 | 版本 | 用途 | +|------|------|------| +| serde | 最新 | 序列化支持 | +| thiserror | 最新 | 错误处理 | + +## 后续工作 + +1. **安全策略扩展**:根据实际需求扩展安全策略 +2. **性能优化**:优化权限检查的性能 +3. **安全审计**:定期进行安全审计和漏洞扫描 + +## 结论 + +M002 任务已成功完成,实现了安全框架的基础功能,包括能力系统、权限管理和验证框架。代码质量良好,测试覆盖充分,满足所有技术要求。安全框架为 MoDa Browser Core 提供了坚实的安全基础,为后续的功能开发和安全保障奠定了基础。 + +--- + +**报告生成日期:** 2026-04-05 +**报告作者:** 开发团队 \ No newline at end of file diff --git a/docs/compass/MoDa-Browser-based.md b/docs/compass/MoDa-Browser-based.md new file mode 100644 index 0000000..755759c --- /dev/null +++ b/docs/compass/MoDa-Browser-based.md @@ -0,0 +1,446 @@ +# MoDa Browser Core 使用与开发指南 + +## 项目概述 + +**MoDa Browser Core** 是一个从零设计的现代浏览器引擎,专为构建下一代安全的网络平台而开发。项目采用**最小权限架构、进程级隔离和内存安全语言**作为核心设计原则,致力于将安全性内建于架构之中,而非事后附加。 + +### 核心功能 + +- ✅ 最小权限架构设计 +- ✅ 进程级隔离机制 +- ✅ 内存安全语言实现(Rust) +- ✅ 模块化组件设计 +- ✅ 沙箱安全框架 +- ✅ 进程间通信(IPC)安全 +- ✅ 安全存储机制 + +## 快速开始 + +### 前提条件 + +- **Rust**:1.75+ + +### 安装与运行 + +#### 方法 1:从源代码构建 + +```bash +# 克隆仓库 +git clone https://github.com/MoDa-Browser/MoDa-Core.git +cd MoDa-Core + +# 安装依赖 +./scripts/setup.sh # 支持 Ubuntu/Debian/Fedora + +# 配置与构建 +mkdir build && cd build +cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DMODA_BUILD_TESTS=ON \ + -DMODA_BUILD_EXAMPLES=ON .. +make -j$(nproc) + +# 运行示例 +./examples/minimal-browser +``` + +#### 方法 2:使用 Docker 开发 + +```bash +# 获取开发环境镜像 +docker pull modabrowser/dev:latest + +# 运行开发容器 +docker run -it --rm -v $(pwd):/workspace modabrowser/dev:latest +cd /workspace && ./scripts/build.sh +``` + +## 使用指南 + +### 基本操作 + +#### 1. 构建项目 + +```bash +# 创建构建目录 +mkdir build && cd build + +# 配置 CMake +cmake -DCMAKE_BUILD_TYPE=Debug .. + +# 编译 +make -j$(nproc) + +# 运行测试 +ctest --output-on-failure +``` + +#### 2. 运行示例程序 + +```bash +# 运行最小浏览器示例 +./examples/minimal-browser + +# 运行测试套件 +./tests/run-all.sh +``` + +#### 3. 开发工作流 + +- **代码编写**:在 `src/` 目录下编写 Rust 或 C++ 代码 +- **构建测试**:使用 CMake 构建并运行测试 +- **代码提交**:遵循项目的提交规范 + +### 高级功能 + +#### 安全特性配置 + +- **沙箱配置**:在 `src/sandbox/` 中配置沙箱规则 +- **IPC 策略**:在 `src/ipc/` 中定义进程间通信策略 +- **存储加密**:在 `src/storage/` 中实现安全存储 + +#### 性能优化 + +- **编译优化**:使用 `-DCMAKE_BUILD_TYPE=RelWithDebInfo` +- **Rust 优化**:在 `Cargo.toml` 中配置优化选项 +- **链接优化**:使用 LTO 进行链接时优化 + +## 开发指南 + +### 项目结构 + +``` +MoDa-Core/ +├── src/ +│ ├── security/ # 安全框架 (Rust) +│ │ └── Cargo.toml +│ ├── sandbox/ # 沙箱管理 (Rust) +│ │ └── Cargo.toml +│ ├── ipc/ # 进程间通信 (Rust) +│ │ └── Cargo.toml +│ ├── render/ # 渲染引擎 (C++) +│ │ └── CMakeLists.txt +│ ├── network/ # 网络栈 (Rust) +│ │ └── Cargo.toml +│ ├── storage/ # 安全存储 (Rust) +│ │ └── Cargo.toml +│ └── platform/ # 平台抽象层 (Rust/C++) +├── include/ # 公共头文件 +├── examples/ # 示例程序 +├── tests/ # 测试套件 +├── docs/ # 文档 +├── tools/ # 开发工具 +└── CMakeLists.txt # 根 CMake 配置 +``` + +### 核心组件 + +#### 1. 安全框架 (Security) + +**功能**:提供底层安全原语和能力系统 + +**主要模块**: + +- `capabilities/` - 能力令牌管理 +- `permissions/` - 权限验证 +- `validation/` - 输入验证 + +**使用示例**: + +```rust +use moda_core::security::CapabilityToken; + +let token = CapabilityToken::new("resource_id"); +token.verify(&required_capabilities)?; +``` + +#### 2. 沙箱管理 (Sandbox) + +**功能**:实现进程级隔离和系统调用过滤 + +**主要模块**: + +- `manager/` - 沙箱生命周期管理 +- `seccomp/` - 系统调用过滤 +- `namespace/` - Linux 命名空间隔离 + +**使用示例**: + +```rust +use moda_core::sandbox::Sandbox; + +let sandbox = Sandbox::new() + .with_seccomp(true) + .with_namespace(true) + .build()?; +``` + +#### 3. 进程间通信 (IPC) + +**功能**:安全的跨进程通信机制 + +**主要模块**: + +- `channel/` - 消息通道 +- `protocol/` - 通信协议 +- `security/` - IPC 安全验证 + +**使用示例**: + +```rust +use moda_core::ipc::IpcChannel; + +let channel = IpcChannel::new(); +channel.send(ipc_message).await?; +``` + +#### 4. 渲染引擎 (Render) + +**功能**:网页内容和布局渲染 + +**主要模块**: + +- `layout/` - 布局计算 +- `paint/` - 绘制引擎 +- `dom/` - DOM 树管理 + +#### 5. 网络栈 (Network) + +**功能**:HTTP/HTTPS 协议实现 + +**主要模块**: + +- `http/` - HTTP 客户端/服务器 +- `tls/` - TLS 加密 +- `dns/` - DNS 解析 + +### 开发流程 + +#### 1. 环境搭建 + +1. 安装 **Rust** (1.75+) +2. 安装 **CMake** (3.20+) +3. 安装 **Clang** 或 **GCC** +4. 克隆代码仓库 + +#### 2. 添加新功能 + +**步骤 1:定义需求** + +- 明确功能需求和技术实现方案 +- 评估安全性和性能影响 + +**步骤 2:实现核心逻辑** + +- 在对应模块中添加 Rust 或 C++ 代码 +- 遵循项目的安全编码规范 + +**步骤 3:编写测试** + +- 添加单元测试 +- 添加集成测试 + +**步骤 4:构建验证** + +- 确保代码编译通过 +- 运行测试确保功能正常 + +### 常见问题与解决方案 + +#### 1. 构建失败 + +**症状**:CMake 或 Rust 编译失败 + +**解决方案**: + +- 检查 Rust 工具链版本是否满足要求 +- 确保 CMake 版本 >= 3.20 +- 检查系统依赖是否完整 +- 查看构建日志获取详细错误信息 + +#### 2. 测试失败 + +**症状**:测试用例无法通过 + +**解决方案**: + +- 检查测试环境配置 +- 查看测试日志定位问题 +- 确认代码修改是否影响现有功能 +- 运行单个测试进行调试 + +#### 3. 性能问题 + +**症状**:程序运行缓慢 + +**解决方案**: + +- 使用 Release 模式构建 +- 启用编译器优化 +- 使用性能分析工具定位瓶颈 +- 检查内存使用情况 + +#### 4. 安全问题 + +**症状**:安全测试发现漏洞 + +**解决方案**: + +- 审查代码中的潜在安全风险 +- 使用静态分析工具检查 +- 遵循安全编码规范 +- 及时更新依赖库 + +## 技术栈 + +| 类别 | 技术/库 | 版本 | 用途 | +| ---- | ----------- | ------- | --------- | +| 系统编程 | Rust | 1.75+ | 核心组件开发 | +| 系统编程 | C++ | 20+ | 渲染引擎 | +| 构建系统 | CMake | 3.20+ | 项目构建 | +| 编译器 | Clang/GCC | 16+/13+ | C++ 编译 | +| 测试框架 | Rust test | - | 单元测试 | +| 安全测试 | cargo-audit | - | 依赖安全检查 | +| 静态分析 | Clippy | - | Rust 代码分析 | + +## 性能优化 + +### 1. 编译优化 + +- 使用 Release 模式进行性能测试 +- 启用 LTO (Link Time Optimization) +- 使用 codegen-units=1 进行最大优化 + +### 2. 运行性能 + +- Rust 代码优化:使用 release profile +- C++ 代码优化:使用 -O3 优化级别 +- 减少动态内存分配 +- 使用高效的数据结构 + +### 3. 内存优化 + +- 减少内存泄漏 +- 使用引用计数和智能指针 +- 实现对象池减少分配开销 + +## 安全最佳实践 + +### 1. 内存安全 + +- 优先使用 Rust 实现关键组件 +- C++ 代码启用 AddressSanitizer +- 避免使用不安全的 Rust 代码块 + +### 2. 进程隔离 + +- 每个组件运行在独立进程中 +- 最小化进程权限 +- 使用沙箱限制系统调用 + +### 3. 数据安全 + +- 敏感数据加密存储 +- 安全处理用户输入 +- 防止注入攻击 + +### 4. 代码安全 + +- 遵循安全编码规范 +- 使用静态分析工具 +- 定期进行安全审计 + +## 部署与分发 + +### 构建发布版本 + +```bash +# 创建发布构建目录 +mkdir build-release && cd build-release + +# 配置发布构建 +cmake -DCMAKE_BUILD_TYPE=Release \ + -DMODA_BUILD_TESTS=ON \ + -DMODA_ENABLE_LTO=ON .. + +# 编译 +make -j$(nproc) + +# 打包 +cd .. +./scripts/package.sh +``` + +### 安装程序创建 + +1. 使用包管理器创建安装脚本 +2. 配置系统服务 +3. 设置文件权限 + +## 贡献指南 + +### 提交代码 + +1. **Fork** 仓库 +2. 创建功能分支 +3. 提交更改 +4. 创建 Pull Request + +### 代码规范 + +- 遵循 **Rust 编码规范** +- 遵循 **C++ 编码规范** +- 使用 **cargo clippy** 检查代码 +- 编写清晰的注释 + +### 报告问题 + +- 在 GitHub Issues 中提交详细的问题描述 +- 包含复现步骤和错误信息 +- 提供系统环境信息 + +## 故障排除 + +### 日志查看 + +应用程序会在控制台输出详细日志: + +```bash +# 在调试模式运行 +RUST_LOG=debug ./target/debug/moda-binary + +# 查看详细日志 +./target/debug/moda-binary --verbose +``` + +### 常见错误代码 + +| 错误代码 | 描述 | 解决方案 | +| ----- | ------- | ---------------- | +| 0x001 | 构建配置错误 | 检查 CMake 和工具链 | +| 0x002 | 依赖缺失 | 运行 setup.sh 安装依赖 | +| 0x003 | 权限不足 | 检查文件权限设置 | +| 0x004 | 沙箱初始化失败 | 检查系统支持 | + +## 联系与支持 + +### 联系方式 + +- **GitHub**: +- **Email**: + +### 支持渠道 + +- GitHub Issues:提交 bug 报告和功能请求 +- 讨论区:参与项目讨论和问题解答 + +## 版本历史 + +| 版本 | 发布日期 | 主要变更 | +| ------ | ---------- | ----------- | +| v0.1.0 | 2026-03-06 | 初始版本,基础架构搭建 | + +*** + +**MoDa Browser Core** - 现代浏览,安全守护 + +*本指南会定期更新,以反映最新的功能和最佳实践。* diff --git a/docs/compass/MoDa-Browser-dev.md b/docs/compass/MoDa-Browser-dev.md new file mode 100644 index 0000000..ff663ce --- /dev/null +++ b/docs/compass/MoDa-Browser-dev.md @@ -0,0 +1,793 @@ +# MoDa Browser Core 开发指南与长期规划 + +## 项目愿景 + +**MoDa Browser Core** 旨在成为最安全、最可靠、性能卓越的现代浏览器引擎,通过最小权限架构、进程级隔离和内存安全语言构建下一代安全的网络平台。我们相信浏览器的安全性应内建于架构,而非事后附加。 + +## 长期目标 (2026-2030) + +### 2026 目标 +1. **基础架构**:完成核心架构设计和实现 +2. **安全框架**:建立完整的最小权限安全体系 +3. **进程隔离**:实现组件级进程隔离机制 + +### 2027 目标 +1. **渲染引擎**:完成基础 HTML/CSS 渲染引擎 +2. **网络栈**:实现安全的 HTTP/HTTPS 协议栈 +3. **JavaScript 基础**:集成 JavaScript 引擎基础支持 + +### 2028 目标 +1. **完整功能**:实现完整浏览器核心功能 +2. **性能优化**:达到主流浏览器性能水平 +3. **生态系统**:建立扩展和插件系统基础 + +### 2029-2030 目标 +1. **市场应用**:在安全和隐私敏感领域推广应用 +2. **社区成熟**:建立活跃的开发者社区 +3. **行业认可**:成为安全浏览器领域的标杆 + +## 开发阶段规划 + +### 阶段 1:基础架构搭建(2026年3-6月) +**里程碑:v0.1.0 发布** +- ✅ 项目初始化和仓库创建 +- ⏳ 设计核心架构 +- ⏳ 实现安全框架基础 +- ⏳ 建立沙箱管理机制 + +### 阶段 2:进程隔离实现(2026年7-9月) +**里程碑:v0.2.0 发布** +- ⏳ 实现进程间通信机制 +- ⏳ 完成沙箱隔离 +- ⏳ 建立安全验证体系 + +### 阶段 3:渲染引擎开发(2026年10-12月) +**里程碑:v0.3.0 发布** +- ⏳ 实现 HTML 解析器 +- ⏳ 开发 CSS 布局引擎 +- ⏳ 构建渲染管线 + +### 阶段 4:网络栈实现(2027年1-4月) +**里程碑:v0.4.0 发布** +- ⏳ 实现 HTTP/HTTPS 协议 +- ⏳ 开发 TLS 安全层 +- ⏳ 实现 DNS 解析 + +### 阶段 5:JavaScript 引擎集成(2027年5-8月) +**里程碑:v0.5.0 发布** +- ⏳ 集成 JavaScript 引擎 +- ⏳ 实现 DOM API +- ⏳ 支持现代 Web 标准 + +### 阶段 6:完善与优化(2027年9月-2028年12月) +**里程碑:v1.0.0 发布** +- ⏳ 完成所有核心功能 +- ⏳ 性能优化 +- ⏳ 安全审计 +- ⏳ 扩展系统开发 + +## 详细开发计划 + +### 📋 总任务清单 + +| 状态 | 优先级 | 任务 ID | 任务描述 | 负责人 | 预计完成时间 | 阶段 | +|------|--------|---------|----------|-----------------|--------------|------| +| ✅ | 🔴 | M000 | 项目初始化和仓库创建 | 墨染柒DarkSeven | 2026-03-10 | 阶段 1 | +| ⏳ | 🔴 | M001 | 核心架构设计 | - | 2026-04-15 | 阶段 1 | +| ⏳ | 🔴 | M002 | 安全框架基础实现 | - | 2026-05-15 | 阶段 1 | +| ⏳ | 🔴 | M003 | 沙箱管理机制 | - | 2026-06-15 | 阶段 1 | +| ⏳ | 🔴 | M004 | 进程间通信机制 | - | 2026-07-30 | 阶段 2 | +| ⏳ | 🔴 | M005 | 进程隔离实现 | - | 2026-08-30 | 阶段 2 | +| ⏳ | 🔴 | M006 | 安全验证体系 | - | 2026-09-15 | 阶段 2 | +| ⏳ | 🔴 | M007 | HTML 解析器开发 | - | 2026-10-30 | 阶段 3 | +| ⏳ | 🔴 | M008 | CSS 布局引擎 | - | 2026-11-30 | 阶段 3 | +| ⏳ | 🟠 | M009 | 渲染管线构建 | - | 2026-12-30 | 阶段 3 | +| ⏳ | 🟠 | M010 | HTTP/HTTPS 协议实现 | - | 2027-02-15 | 阶段 4 | +| ⏳ | 🟠 | M011 | TLS 安全层开发 | - | 2027-03-30 | 阶段 4 | +| ⏳ | 🟠 | M012 | DNS 解析器实现 | - | 2027-04-15 | 阶段 4 | +| ⏳ | 🟠 | M013 | JavaScript 引擎集成 | - | 2027-06-30 | 阶段 5 | +| ⏳ | 🟠 | M014 | DOM API 实现 | - | 2027-07-30 | 阶段 5 | +| ⏳ | 🟡 | M015 | 现代 Web 标准支持 | - | 2027-08-30 | 阶段 5 | +| ⏳ | 🟡 | M016 | 性能优化 | - | 2027-10-30 | 阶段 6 | +| ⏳ | 🟡 | M017 | 安全审计与加固 | - | 2027-11-30 | 阶段 6 | +| ⏳ | 🟢 | M018 | 扩展系统开发 | - | 2027-12-30 | 阶段 6 | + +## 详细任务分解 + +### 🔴 高优先级任务 + +#### M001:核心架构设计 + +**子任务:** +1. ⏳ **架构规范制定** + - 定义模块边界和接口 + - 设计组件交互方式 + - 确定技术选型 + +2. ⏳ **技术方案评估** + - 评估 Rust 和 C++ 混合编程方案 + - 选择合适的构建系统 + - 设计模块化架构 + +3. ⏳ **原型开发** + - 创建最小可运行原型 + - 验证核心架构设计 + - 迭代优化架构 + +**技术要求:** +- 使用 Cargo 管理 Rust 依赖 +- 使用 CMake 管理 C++ 构建 +- 实现模块间清晰接口 +- 遵循语义化版本规范 + +**测试要点:** +- 架构合理性 +- 模块解耦程度 +- 接口稳定性 +- 可扩展性 + +#### M002:安全框架基础实现 + +**子任务:** +1. ⏳ **能力系统设计** + - 设计能力令牌结构 + - 实现权限验证机制 + - 建立能力授予流程 + +2. ⏳ **安全原语实现** + - 实现安全内存管理 + - 开发加密基础库 + - 构建验证框架 + +3. ⏳ **安全策略定义** + - 制定默认安全策略 + - 设计策略配置格式 + - 实现策略执行机制 + +**技术要求:** +- 使用 Rust 实现安全关键代码 +- 遵循安全编码最佳实践 +- 实现安全的错误处理 +- 避免常见安全漏洞 + +**测试要点:** +- 安全机制有效性 +- 权限验证准确性 +- 安全策略执行正确性 + +#### M003:沙箱管理机制 + +**子任务:** +1. ⏳ **沙箱架构设计** + - 设计沙箱隔离模型 + - 定义沙箱配置接口 + - 实现沙箱生命周期管理 + +2. ⏳ **系统调用过滤** + - 实现 seccomp BPF 过滤 + - 设计系统调用白名单 + - 开发系统调用监控 + +3. ⏳ **命名空间隔离** + - 实现进程命名空间 + - 配置网络命名空间 + - 管理用户命名空间 + +**技术要求:** +- 使用 Linux 安全模块 +- 实现进程级隔离 +- 支持多种隔离级别 + +**测试要点:** +- 隔离效果验证 +- 系统调用过滤准确性 +- 性能影响评估 + +#### M004:进程间通信机制 + +**子任务:** +1. ⏳ **IPC 架构设计** + - 设计消息传递机制 + - 定义消息格式协议 + - 实现通道管理 + +2. ⏳ **安全通信实现** + - 实现端到端加密 + - 开发能力验证机制 + - 防止通信劫持 + +3. ⏳ **性能优化** + - 实现零拷贝传输 + - 优化消息序列化 + - 减少通信延迟 + +**技术要求:** +- 使用 Rust 异步编程 +- 实现高效序列化 +- 保证消息传递可靠性 + +**测试要点:** +- 通信效率 +- 安全性验证 +- 可靠性测试 + +### 🟠 中优先级任务 + +#### M007:HTML 解析器开发 + +**子任务:** +1. ⏳ **词法分析** + - 实现 HTML 词法分析器 + - 处理特殊字符和实体 + - 支持不同编码 + +2. ⏳ **语法解析** + - 实现 HTML 语法树构建 + - 处理错误 HTML + - 支持 HTML5 规范 + +3. ⏳ **DOM 构建** + - 实现 DOM 树构建 + - 处理动态内容 + - 支持模板内容 + +**技术要求:** +- 遵循 HTML5 规范 +- 实现容错解析 +- 高效处理大文档 + +**测试要点:** +- 解析正确性 +- 错误处理能力 +- 性能表现 + +#### M008:CSS 布局引擎 + +**子任务:** +1. ⏳ **CSS 解析** + - 实现 CSS 词法分析 + - 实现 CSS 语法解析 + - 支持 CSS3 特性 + +2. ⏳ **布局计算** + - 实现盒模型 + - 实现 Flexbox 布局 + - 实现 Grid 布局 + +3. ⏳ **样式计算** + - 实现选择器匹配 + - 实现层叠规则 + - 处理继承和特指度 + +**技术要求:** +- 支持现代 CSS 特性 +- 高效计算布局 +- 正确处理特殊情况 + +**测试要点:** +- 布局准确性 +- CSS 特性支持 +- 性能测试 + +### 🟡 低优先级任务 + +#### M010:HTTP/HTTPS 协议实现 + +**子任务:** +1. ⏳ **HTTP 协议栈** + - 实现 HTTP/1.1 客户端 + - 实现 HTTP/1.1 服务器 + - 支持 HTTP/2 + +2. ⏳ **TLS 实现** + - 集成 TLS 库 + - 实现证书验证 + - 支持现代加密套件 + +3. ⏳ **网络优化** + - 实现连接池 + - 支持 HTTP 缓存 + - 实现压缩传输 + +**技术要求:** +- 遵循 HTTP 规范 +- 保证安全性 +- 高性能实现 + +**测试要点:** +- 协议兼容性 +- 安全测试 +- 性能测试 + +#### M013:JavaScript 引擎集成 + +**子任务:** +1. ⏳ **引擎选择与集成** + - 评估 JavaScript 引擎 + - 实现引擎集成层 + - 建立通信机制 + +2. ⏳ **DOM API 实现** + - 实现 BOM 接口 + - 实现 DOM 接口 + - 支持事件系统 + +3. ⏳ **Web API 支持** + - 实现 Fetch API + - 实现 WebSocket + - 支持 Storage API + +**技术要求:** +- 支持现代 JavaScript +- 高效执行速度 +- 内存安全 + +**测试要点:** +- JavaScript 兼容性 +- DOM API 完整性 +- 内存安全 + +## 开发流程规范 + +### 🔄 代码开发流程 + +#### 1. 需求分析 +- **详细理解任务要求**:分析任务描述,明确功能需求和技术要求 +- **技术可行性评估**:评估实现方案的技术可行性和风险 +- **制定实现计划**:分解任务为可执行的子任务,估算时间和资源 +- **创建任务卡片**:在 GitHub Issues 中创建详细的任务卡片 + +#### 2. 编码实现 +- **创建功能分支**:从 main 分支创建功能分支,命名格式:`feature/MXXX-Description` +- **遵循编码规范**:严格按照项目编码规范编写代码 +- **实现功能需求**:完成所有功能点,确保代码质量 +- **编写单元测试**:为核心功能编写单元测试,确保测试覆盖率 > 80% +- **代码注释**:为复杂逻辑添加详细注释 + +#### 3. 代码审查 +- **自我审查**:提交前进行自我代码审查,检查代码质量和功能完整性 +- **提交 Pull Request**:推送到 GitHub 并创建 Pull Request,添加详细描述 +- **团队审查**:等待团队成员代码审查,回应反馈 +- **修复问题**:根据审查意见修复代码问题,确保所有评论都得到解决 + +#### 4. 测试验证 +- **运行单元测试**:确保所有单元测试通过 +- **集成测试**:测试模块间交互,验证功能完整性 +- **安全测试**:进行安全审计和漏洞扫描 +- **性能测试**:验证性能指标是否满足要求 + +#### 5. 部署发布 +- **代码合并**:通过审查后,将功能分支合并到 main 分支 +- **构建发布版本**:使用 CI/CD 流程构建发布版本 +- **最终测试**:进行发布前的最终测试 +- **发布更新**:发布到 Git Releases,更新版本号和发布说明 +- **文档更新**:更新相关文档,确保与代码同步 + +### 📁 代码规范 + +#### Rust 编码规范 +- **命名约定**: + - 包和模块:snake_case(如 `moda_security`) + - 类型和 trait:PascalCase(如 `SecurityManager`) + - 函数和方法:snake_case(如 `verify_capability`) + - 变量和参数:snake_case(如 `capability_token`) + - 常量:UPPER_SNAKE_CASE + +- **代码格式**: + - 缩进:4 个空格 + - 行宽:100 字符 + - 使用 rustfmt 自动格式化 + +- **安全规范**: + - 避免使用 `unsafe` 代码块 + - 使用安全的数据处理方式 + - 实现安全的错误处理 + - 遵循 Rust 安全编码最佳实践 + +#### C++ 编码规范 +- **命名约定**: + - 类和函数:PascalCase(如 `RenderEngine`) + - 变量:snake_case(如 `render_target`) + - 常量:UPPER_SNAKE_CASE + - 命名空间:snake_case(如 `moda::render`) + +- **代码格式**: + - 缩进:4 个空格 + - 行宽:120 字符 + - 使用 clang-format 格式化 + +- **安全规范**: + - 启用所有编译器安全警告 + - 使用智能指针管理内存 + - 避免使用不安全的 C 函数 + - 启用 AddressSanitizer 进行测试 + +#### CMake 规范 +- 使用现代 CMake 语法 +- 模块化配置 +- 清晰的构建目标定义 + +### 🧪 测试规范 + +#### 单元测试 +- **测试框架**:使用 Rust 内置 test 和 C++ Google Test +- **测试命名**:`test_module_functionality` +- **测试范围**: + - 核心业务逻辑 + - 数据处理 + - 异常处理 + - 边界情况 +- **测试独立性**:每个测试独立运行 + +#### 安全测试 +- **静态分析**:使用 cargo-audit、clippy、cppcheck +- **动态分析**:使用 AddressSanitizer、Valgrind +- **渗透测试**:模拟攻击场景 + +#### 性能测试 +- **基准测试**:使用 Rust Criterion、C++ Google Benchmark +- **性能指标**: + - 启动时间 + - 内存使用 + - CPU 占用 + - 响应延迟 + +### 📊 代码质量工具 + +#### 静态代码分析 +- **Rust 工具**:cargo clippy、cargo audit +- **C++ 工具**:cppcheck、clang-tidy +- **分析频率**:每次提交自动运行 + +#### 代码覆盖率 +- **Rust 工具**:tarpaulin +- **C++ 工具**:gcov、lcov +- **目标**:核心代码覆盖率 > 80% + +#### 依赖管理 +- **工具**:Cargo、Conan +- **策略**: + - 使用稳定版本 + - 定期更新依赖 + - 审查依赖安全性 + +### 🚀 CI/CD 流程 + +#### 持续集成 +- **触发条件**:每次推送代码到 GitHub +- **执行任务**: + - 代码编译(多平台) + - 单元测试 + - 静态代码分析 + - 代码风格检查 +- **结果通知**:通过 GitHub Actions 通知构建状态 + +#### 持续部署 +- **触发条件**:合并到 main 分支 +- **执行任务**: + - 构建发布版本 + - 运行集成测试 + - 生成发布包 + - 发布到 GitHub Releases +- **版本管理**:遵循语义化版本规范 + +## 质量保证计划 + +### 🔍 代码质量 + +#### 静态代码分析 +- **工具**:cargo clippy、cargo audit、cppcheck、clang-tidy +- **分析频率**:每次提交代码时自动运行 +- **质量门**:设置最低质量标准,未达标准的代码不能合并 + +#### 代码审查 +- **审查频率**:每个 Pull Request 必须经过至少一次代码审查 +- **审查内容**: + - 代码逻辑正确性 + - 代码风格和规范 + - 性能和安全性 + - 测试覆盖率 +- **审查工具**:使用 GitHub Pull Request 审查功能 + +#### 代码覆盖率 +- **目标**:核心代码覆盖率 > 80% +- **工具**:tarpaulin、gcov +- **监控频率**:每次构建时自动计算 + +### 📊 性能监控 + +#### 构建性能 +- **目标**:完整构建 < 10 分钟 +- **增量构建**:< 1 分钟 + +#### 运行时性能 +- **内存使用**:< 500MB(基础运行) +- **CPU 使用率**:< 20% +- **启动时间**:< 3 秒 + +#### 性能优化策略 +- 使用缓存减少重复计算 +- 延迟加载非关键组件 +- 优化热点代码路径 + +### 🔒 安全审计 + +#### 常规安全审查 +- **审查频率**:每月进行一次 +- **审查内容**: + - 代码安全漏洞 + - 加密实现 + - 访问控制 +- **工具**:cargo audit、SonarQube + +#### 依赖安全检查 +- **工具**:cargo-audit +- **频率**:每次构建时自动运行 +- **处理流程**:识别漏洞 → 评估风险 → 制定修复计划 → 验证修复 + +### 📋 质量保证流程 + +#### 1. 开发阶段 +- 编写单元测试 +- 进行代码审查 +- 运行静态代码分析 +- 使用安全工具检查 + +#### 2. 测试阶段 +- 运行单元测试 +- 进行集成测试 +- 执行性能测试 +- 进行安全测试 + +#### 3. 发布前 +- 最终质量审查 +- 漏洞扫描 +- 性能基准测试 + +#### 4. 发布后 +- 监控性能 +- 收集反馈 +- 分析错误报告 + +### 🎯 质量目标 + +#### 功能质量 +- 核心功能完整性:100% +- 功能正确性:99.9% +- 错误率:< 1% + +#### 性能质量 +- 启动时间:< 3 秒 +- 内存使用:< 500MB +- CPU 使用率:< 20% + +#### 安全质量 +- 无严重安全漏洞 +- 安全审计通过率:100% +- 依赖漏洞修复时间:< 7 天 + +## 发布策略 + +### 版本号规范 + +#### 语义化版本规范 +- **格式**:`主版本.次版本.补丁版本` +- **示例**:`1.2.3` + +#### 版本号含义 +- **主版本**:重大架构变更或功能里程碑 + - 触发条件:核心架构变更、重大功能添加 + +- **次版本**:新功能和改进,向后兼容 + - 触发条件:添加新功能、重大改进 + +- **补丁版本**:bug 修复和小的改进 + - 触发条件:修复 bug、安全补丁 + +### 发布周期 + +#### 开发版本 +- **发布频率**:持续集成 +- **包含内容**:最新开发进展 + +#### 测试版本 +- **发布频率**:每月一次 +- **包含内容**:新功能测试 + +#### 正式版本 +- **发布频率**:每 3-6 个月 +- **包含内容**:稳定功能发布 + +## 开发工具链 + +### 核心开发工具 + +| 工具 | 用途 | 推荐版本 | 说明 | +|------|------|----------|------| +| Rust | 系统编程 | 1.75+ | 核心组件开发 | +| C++ | 性能关键 | C++20 | 渲染引擎 | +| CMake | 构建系统 | 3.20+ | 项目构建 | +| Clang | 编译器 | 16+ | C++ 编译 | +| Cargo | 包管理 | 最新 | Rust 依赖管理 | +| Git | 版本控制 | 2.40+ | 代码管理 | + +### 辅助开发工具 + +| 工具 | 用途 | 推荐版本 | 说明 | +|------|------|----------|------| +| VS Code | 代码编辑器 | 最新 | 轻量级开发 | +| CLion | IDE | 2024+ | 完整开发环境 | +| cargo-audit | 安全检查 | 最新 | 依赖漏洞扫描 | +| cargo-clippy | 代码检查 | 最新 | Rust 代码分析 | +| clang-tidy | 代码检查 | 最新 | C++ 代码分析 | + +### 性能分析工具 + +| 工具 | 用途 | 推荐版本 | 说明 | +|------|------|----------|------| +| perf | Linux 性能分析 | 最新 | 系统级性能分析 | +| Valgrind | 内存分析 | 最新 | 内存泄漏检测 | +|火焰图 | 性能可视化 | 最新 | CPU 性能分析 | + +### 安全工具 + +| 工具 | 用途 | 推荐版本 | 说明 | +|------|------|----------|------| +| cargo-audit | 依赖安全 | 最新 | 安全漏洞扫描 | +| clippy | Rust 代码分析 | 最新 | 代码质量 | +| cppcheck | C++ 静态分析 | 最新 | C++ 问题检测 | + +### 开发环境搭建 + +#### 1. 安装依赖 +```bash +# 安装 Rust +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# 安装 CMake +sudo apt-get install cmake + +# 安装 Clang +sudo apt-get install clang +``` + +#### 2. 克隆仓库 +```bash +git clone https://github.com/MoDa-Browser/MoDa-Core.git +cd MoDa-Core +``` + +#### 3. 构建项目 +```bash +mkdir build && cd build +cmake .. +make -j$(nproc) +``` + +#### 4. 运行测试 +```bash +cargo test +ctest --output-on-failure +``` + +## 贡献指南 + +### 提交代码 +1. **Fork 仓库** +2. **创建功能分支**:命名格式:`feature/MXXX-Description` +3. **提交更改**:编写清晰的提交消息 +4. **创建 Pull Request**:提供详细的 PR 描述 + +### 代码审查 +1. **自我审查**:提交前检查代码质量 +2. **团队审查**:等待至少一次审查 +3. **修复问题**:回应审查反馈 + +### 问题报告 +1. 在 GitHub Issues 中提交 +2. 提供详细的问题描述 +3. 包含复现步骤和错误信息 + +## 技术债务管理 + +### 识别技术债务 +- 代码复杂度分析 +- 测试覆盖率分析 +- 依赖项检查 +- 性能分析 + +### 优先处理策略 +1. 安全隐患优先 +2. 性能瓶颈次之 +3. 代码复杂度再次 +4. 测试覆盖率最后 + +### 技术债务评估标准 +| 标准 | 评分 | 说明 | +|------|------|------| +| 安全影响 | 1-5 | 1=无影响,5=严重安全隐患 | +| 性能影响 | 1-5 | 1=无影响,5=严重性能问题 | +| 可维护性影响 | 1-5 | 1=无影响,5=严重可维护性问题 | +| 修复难度 | 1-5 | 1=容易修复,5=难以修复 | + +## 风险评估 + +### 潜在风险 +1. **技术风险**:复杂功能实现难度、第三方库依赖问题 +2. **时间风险**:开发周期延长、资源不足 +3. **质量风险**:功能测试不充分、代码质量下降 +4. **安全风险**:数据安全漏洞、网络安全问题 + +### 风险缓解策略 +1. 进行技术可行性评估 +2. 合理规划和优先级设置 +3. 建立严格的测试流程 +4. 定期进行安全审计 + +## 成功指标 + +### 功能指标 +- 核心功能完整性:100% +- 安全机制可用性:100% +- Web 标准兼容性:90%+ + +### 质量指标 +- 代码覆盖率:80%+ +- 构建成功率:99%+ +- 安全漏洞修复时间:< 7 天 + +### 性能指标 +- 启动时间:< 3 秒 +- 内存使用:< 500MB +- CPU 使用率:< 20% + +## 结论 + +**MoDa Browser Core** 项目具有明确的愿景和详细的开发计划,通过系统化的开发流程和质量保证措施,将逐步实现其长期目标。本开发指南提供了全面的指导,包括: + +- **长期规划**:2026-2030 年的详细目标和里程碑 +- **开发阶段**:分阶段的开发计划 +- **详细任务**:可执行的任务清单 +- **开发规范**:严格的代码规范和测试规范 +- **质量保证**:全面的质量保证计划 +- **发布策略**:规范的发布流程和版本管理 + +团队成员应严格遵循本指南中的规范和流程,共同努力打造一个安全、可靠、高性能的现代浏览器引擎。 + +--- + +## 开发日志 + +### 2026年3月6日 + +**今日工作:** + +1. **项目初始化** + - 创建 MoDa Browser Core 项目仓库 + - 设计核心架构文档 + - 建立项目结构 + +2. **文档创建** + - 创建基于使用的开发指南(MoDa-Browser-based.md) + - 创建开发规划指南(MoDa-Browser-dev.md) + - 建立 compass 文档目录 + +3. **技术设计** + - 确定最小权限架构方案 + - 设计进程隔离机制 + - 规划安全框架实现 + +**技术要点:** +- 使用 Rust 实现安全关键组件 +- 采用 C++ 开发渲染引擎 +- 使用 CMake 进行跨语言构建 +- 实现多层安全防御体系 + +**下一步计划:** +- 完成核心架构详细设计 +- 实现安全框架基础 +- 建立沙箱管理机制 + +--- + +**让我们开始构建未来!** 🚀 diff --git a/src/main.rs b/src/main.rs index 63d01a2..7303a47 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,10 @@ -use moda_security::{CapabilityToken, Capability, PermissionManager, PermissionPolicy}; -use moda_sandbox::{Sandbox, NamespaceConfig}; use moda_ipc::{IpcChannel, IpcMessage, IpcSecurity}; use moda_network::{HttpClient, TlsConfig, TlsVersion}; -use moda_storage::SecureStorage; use moda_platform::PlatformInfo; -use moda_render::{LayoutEngine, DOMNode, NodeType, Rect}; +use moda_render::{DOMNode, LayoutEngine, NodeType, Rect}; +use moda_sandbox::{NamespaceConfig, Sandbox}; +use moda_security::{Capability, CapabilityToken, PermissionManager, PermissionPolicy}; +use moda_storage::SecureStorage; fn main() { println!("MoDa Browser Core - Prototype"); @@ -16,7 +16,10 @@ fn main() { let platform_info = PlatformInfo::new(); println!("Platform: {}", platform_info.platform().name()); println!("Architecture: {}", platform_info.arch()); - println!("Sandbox supported: {}", platform_info.platform().supports_sandbox()); + println!( + "Sandbox supported: {}", + platform_info.platform().supports_sandbox() + ); println!(); println!("2. Security Framework"); @@ -24,7 +27,7 @@ fn main() { let token = CapabilityToken::new("test-token") .with_capability(Capability::NetworkAccess) .with_capability(Capability::FileSystemRead); - + println!("Token ID: {}", token.id()); println!("Capabilities: {:?}", token.capabilities()); println!("Is expired: {}", token.is_expired()); @@ -38,7 +41,7 @@ fn main() { denied_capabilities: vec![Capability::FileSystemWrite], }; let _ = permission_manager.add_policy("test-resource", policy); - + match permission_manager.check_permission("test-resource", &Capability::NetworkAccess) { Ok(allowed) => println!("Network access allowed: {}", allowed), Err(e) => println!("Error: {}", e), @@ -47,13 +50,10 @@ fn main() { println!("4. Sandbox Management"); println!("--------------------"); - let namespace_config = NamespaceConfig::new() - .with_pid(true) - .with_network(true); - - let _sandbox = Sandbox::new() - .with_namespace(namespace_config); - + let namespace_config = NamespaceConfig::new().with_pid(true).with_network(true); + + let _sandbox = Sandbox::new().with_namespace(namespace_config); + println!("Sandbox configured with PID and network namespaces"); println!(); @@ -61,21 +61,24 @@ fn main() { println!("-------------------"); let channel = IpcChannel::new(); let security = IpcSecurity::new().with_authentication(true); - + let message = IpcMessage::new("sender", "receiver", vec![1, 2, 3, 4, 5]); - + match security.validate_message(&message) { Ok(_) => println!("Message validated successfully"), Err(e) => println!("Validation error: {}", e), } - + match channel.send(message) { Ok(_) => println!("Message sent successfully"), Err(e) => println!("Send error: {}", e), } - + match channel.receive() { - Ok(received) => println!("Message received: {} -> {}", received.source, received.target), + Ok(received) => println!( + "Message received: {} -> {}", + received.source, received.target + ), Err(e) => println!("Receive error: {}", e), } println!(); @@ -85,12 +88,12 @@ fn main() { let tls_config = TlsConfig::new() .with_min_tls_version(TlsVersion::Tls1_2) .with_max_tls_version(TlsVersion::Tls1_3); - + match tls_config.validate() { Ok(_) => println!("TLS configuration valid"), Err(e) => println!("TLS config error: {}", e), } - + let _http_client = HttpClient::new(); println!("HTTP client initialized"); println!(); @@ -99,17 +102,19 @@ fn main() { println!("----------------"); let key = [0u8; 32]; let storage = SecureStorage::new(&key); - + let plaintext = b"Hello, MoDa Browser!"; let encrypted = storage.encrypt(plaintext); - + match encrypted { Ok(data) => { println!("Encrypted data size: {} bytes", data.ciphertext.len()); - + let decrypted = storage.decrypt(&data); match decrypted { - Ok(decrypted_data) => println!("Decrypted: {}", String::from_utf8_lossy(&decrypted_data)), + Ok(decrypted_data) => { + println!("Decrypted: {}", String::from_utf8_lossy(&decrypted_data)) + } Err(e) => println!("Decryption error: {}", e), } } @@ -122,22 +127,29 @@ fn main() { let mut layout_engine = LayoutEngine::new(); layout_engine.parse_html("

Hello, MoDa!

"); layout_engine.calculate_layout(); - + println!("HTML parsed and layout calculated"); - + if let Some(bounds) = layout_engine.get_element_bounds("root") { - println!("Root element bounds: x={}, y={}, width={}, height={}", - bounds.x, bounds.y, bounds.width, bounds.height); + println!( + "Root element bounds: x={}, y={}, width={}, height={}", + bounds.x, bounds.y, bounds.width, bounds.height + ); } - + let div_node = DOMNode::new("test-div", NodeType::Element) .with_tag_name("div") .with_text("Test content") .with_bounds(Rect::new(10.0, 10.0, 200.0, 100.0)); - - println!("Created DOM node: {} with bounds ({}, {}, {}, {})", - div_node.tag_name, div_node.bounds.x, div_node.bounds.y, - div_node.bounds.width, div_node.bounds.height); + + println!( + "Created DOM node: {} with bounds ({}, {}, {}, {})", + div_node.tag_name, + div_node.bounds.x, + div_node.bounds.y, + div_node.bounds.width, + div_node.bounds.height + ); println!(); println!("=============================="); diff --git a/src/security/permissions.rs b/src/security/permissions.rs index 623a7e6..a717620 100644 --- a/src/security/permissions.rs +++ b/src/security/permissions.rs @@ -79,7 +79,7 @@ mod tests { denied_capabilities: vec![Capability::FileSystemWrite], }; - manager.add_policy("test-resource", policy); + let _ = manager.add_policy("test-resource", policy); assert!(manager .check_permission("test-resource", &Capability::NetworkAccess) diff --git a/src/security/policy.rs b/src/security/policy.rs new file mode 100644 index 0000000..e4d3713 --- /dev/null +++ b/src/security/policy.rs @@ -0,0 +1,194 @@ +use crate::{Capability, Result, SecurityError}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::sync::{Arc, RwLock}; + +/// 安全策略配置 +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SecurityPolicy { + /// 策略ID + pub id: String, + /// 策略描述 + pub description: String, + /// 允许的能力列表 + pub allowed_capabilities: Vec, + /// 拒绝的能力列表 + pub denied_capabilities: Vec, + /// 默认策略(true表示默认拒绝,false表示默认允许) + pub default_deny: bool, +} + +impl SecurityPolicy { + pub fn new(id: impl Into, description: impl Into) -> Self { + Self { + id: id.into(), + description: description.into(), + allowed_capabilities: Vec::new(), + denied_capabilities: Vec::new(), + default_deny: true, + } + } + + pub fn with_allowed_capabilities(mut self, capabilities: Vec) -> Self { + self.allowed_capabilities = capabilities; + self + } + + pub fn with_denied_capabilities(mut self, capabilities: Vec) -> Self { + self.denied_capabilities = capabilities; + self + } + + pub fn with_default_deny(mut self, default_deny: bool) -> Self { + self.default_deny = default_deny; + self + } + + /// 检查是否允许特定能力 + pub fn allows_capability(&self, capability: &Capability) -> bool { + // 如果在拒绝列表中,直接拒绝 + if self.denied_capabilities.contains(capability) { + return false; + } + + // 如果在允许列表中,直接允许 + if self.allowed_capabilities.contains(capability) { + return true; + } + + // 返回默认策略 + !self.default_deny + } +} + +/// 策略管理器 +pub struct PolicyManager { + policies: Arc>>, +} + +impl PolicyManager { + pub fn new() -> Self { + Self { + policies: Arc::new(RwLock::new(HashMap::new())), + } + } + + /// 添加安全策略 + pub fn add_policy(&self, policy: SecurityPolicy) -> Result<()> { + let mut policies = self + .policies + .write() + .map_err(|e| SecurityError::PermissionDenied(format!("Lock poisoned: {}", e)))?; + + policies.insert(policy.id.clone(), policy); + Ok(()) + } + + /// 获取策略 + pub fn get_policy(&self, policy_id: &str) -> Result { + let policies = self + .policies + .read() + .map_err(|e| SecurityError::PermissionDenied(format!("Lock poisoned: {}", e)))?; + + policies + .get(policy_id) + .cloned() + .ok_or_else(|| SecurityError::PermissionDenied(format!("Policy {} not found", policy_id))) + } + + /// 检查资源是否具有特定能力 + pub fn check_resource_capability( + &self, + resource_id: &str, + capability: &Capability, + ) -> Result { + let policies = self + .policies + .read() + .map_err(|e| SecurityError::PermissionDenied(format!("Lock poisoned: {}", e)))?; + + // 查找与资源匹配的策略 + if let Some(policy) = policies.get(resource_id) { + Ok(policy.allows_capability(capability)) + } else { + // 如果没有找到特定策略,返回错误 + Err(SecurityError::PermissionDenied(format!( + "No policy defined for resource {}", + resource_id + ))) + } + } + + /// 删除策略 + pub fn remove_policy(&self, policy_id: &str) -> Result<()> { + let mut policies = self + .policies + .write() + .map_err(|e| SecurityError::PermissionDenied(format!("Lock poisoned: {}", e)))?; + + if policies.remove(policy_id).is_some() { + Ok(()) + } else { + Err(SecurityError::PermissionDenied(format!( + "Policy {} not found", + policy_id + ))) + } + } + + /// 列出所有策略ID + pub fn list_policies(&self) -> Result> { + let policies = self + .policies + .read() + .map_err(|e| SecurityError::PermissionDenied(format!("Lock poisoned: {}", e)))?; + + Ok(policies.keys().cloned().collect()) + } +} + +impl Default for PolicyManager { + fn default() -> Self { + Self::new() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_security_policy() { + let policy = SecurityPolicy::new("test-policy", "Test policy") + .with_allowed_capabilities(vec![Capability::NetworkAccess]) + .with_denied_capabilities(vec![Capability::FileSystemWrite]) + .with_default_deny(true); + + assert!(policy.allows_capability(&Capability::NetworkAccess)); + assert!(!policy.allows_capability(&Capability::FileSystemWrite)); + assert!(!policy.allows_capability(&Capability::FileSystemRead)); // 默认拒绝 + } + + #[test] + fn test_policy_manager() { + let manager = PolicyManager::new(); + + let policy = SecurityPolicy::new("test-resource", "Test resource policy") + .with_allowed_capabilities(vec![Capability::NetworkAccess]) + .with_denied_capabilities(vec![Capability::FileSystemWrite]); + + assert!(manager.add_policy(policy).is_ok()); + + assert!(manager + .check_resource_capability("test-resource", &Capability::NetworkAccess) + .unwrap()); + assert!(!manager + .check_resource_capability("test-resource", &Capability::FileSystemWrite) + .unwrap()); + + assert!(manager + .check_resource_capability("test-resource", &Capability::FileSystemRead) + .is_err()); // 没有明确允许,默认拒绝 + } +} \ No newline at end of file diff --git a/test_policy.rs b/test_policy.rs new file mode 100644 index 0000000..128fde7 --- /dev/null +++ b/test_policy.rs @@ -0,0 +1,30 @@ +use moda_security::{PolicyManager, SecurityPolicy, Capability}; + +fn main() { + println!("Testing Security Policy Module..."); + + let manager = PolicyManager::new(); + + let policy = SecurityPolicy::new("test-resource", "Test resource policy") + .with_allowed_capabilities(vec![Capability::NetworkAccess]) + .with_denied_capabilities(vec![Capability::FileSystemWrite]); + + match manager.add_policy(policy) { + Ok(_) => println!("✓ Policy added successfully"), + Err(e) => println!("✗ Failed to add policy: {:?}", e), + } + + match manager.check_resource_capability("test-resource", &Capability::NetworkAccess) { + Ok(true) => println!("✓ Network access allowed as expected"), + Ok(false) => println!("✗ Network access unexpectedly denied"), + Err(e) => println!("✗ Error checking network access: {:?}", e), + } + + match manager.check_resource_capability("test-resource", &Capability::FileSystemWrite) { + Ok(false) => println!("✓ File system write correctly denied"), + Ok(true) => println!("✗ File system write unexpectedly allowed"), + Err(e) => println!("✗ Error checking file system write: {:?}", e), + } + + println!("Security Policy Module test completed!"); +} \ No newline at end of file