Skip to content

feat: add --disable-xdp flag to disable xdp integration#1652

Merged
dengbo11 merged 1 commit into
OpenAtom-Linyaps:masterfrom
reddevillg:enable_xdp
Apr 30, 2026
Merged

feat: add --disable-xdp flag to disable xdp integration#1652
dengbo11 merged 1 commit into
OpenAtom-Linyaps:masterfrom
reddevillg:enable_xdp

Conversation

@reddevillg

Copy link
Copy Markdown
Collaborator

Add xdp document support

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces support for enabling or disabling XDG Desktop Portal (XDP) integration within the sandbox. Changes include updates to the API schema, CLI flags, and runtime configuration to support a new disable_xdp option. The implementation fetches the XDP document mount point via DBus and configures the OCI container with appropriate mounts and environment variables when XDP is active. Feedback was provided regarding an incorrect use of std::move on a raw pointer during path construction.

Comment thread libs/linglong/src/linglong/runtime/container_builder.cpp Outdated
Add xdp document support

Signed-off-by: reddevillg <reddevillg@gmail.com>
@codecov

codecov Bot commented Apr 30, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 17.39130% with 38 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...inglong/src/linglong/runtime/container_builder.cpp 18.75% 26 Missing ⚠️
...glong/oci-cfg-generators/container_cfg_builder.cpp 0.00% 6 Missing and 2 partials ⚠️
apps/ll-cli/src/main.cpp 0.00% 4 Missing ⚠️
Files with missing lines Coverage Δ
libs/linglong/src/linglong/cli/cli.h 8.33% <ø> (ø)
...inglong/oci-cfg-generators/container_cfg_builder.h 34.14% <ø> (ø)
libs/utils/src/linglong/utils/runtime_config.cpp 29.03% <100.00%> (+2.36%) ⬆️
apps/ll-cli/src/main.cpp 0.00% <0.00%> (ø)
...glong/oci-cfg-generators/container_cfg_builder.cpp 11.84% <0.00%> (-1.11%) ⬇️
...inglong/src/linglong/runtime/container_builder.cpp 8.69% <18.75%> (+1.79%) ⬆️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@deepin-ci-robot

Copy link
Copy Markdown
Collaborator

deepin pr auto review

这份代码 diff 主要实现了一个新功能:允许用户通过命令行参数或运行时配置来禁用 XDG Desktop Portal (XDP) 集成。以下是针对语法逻辑、代码质量、性能和安全的审查意见:

1. 语法逻辑

优点:

  • 类型定义一致:在 JSON Schema (v1.json/v1.yaml)、C++ 结构体 (RuntimeConfigure, RunOptions, RunContainerOptions) 中,disableXdp 均被定义为 optional<bool>,保持了类型系统的一致性。
  • 逻辑覆盖完整:代码实现了从 CLI 参数解析、JSON 序列化/反序列化、配置合并到最终应用配置的完整数据流。
  • 测试覆盖良好container_builder_test.cppruntime_config_test.cpp 中添加了针对新功能的单元测试,包括默认行为、覆盖行为和配置合并行为。

改进建议:

  • CLI 参数默认值逻辑
    ll-cli/src/main.cpp 中:

    ->add_flag("--enable-xdp{false},!--disable-xdp{true}", runOptions.disableXdp, ...)

    这里的逻辑是:--enable-xdpdisableXdp 设为 false--disable-xdp 将其设为 true
    建议:虽然逻辑正确,但这种双重否定的命名(disableXdp 为 true 表示禁用)在 CLI 选项中容易引起混淆。建议在代码内部保持 disableXdp,但在 CLI 解析层增加注释明确说明这一点,或者确保帮助文档极其清晰。目前的实现是可接受的,但需注意文档维护。

  • 配置合并逻辑
    MergeRuntimeConfig 中:

    if (config.disableXdp.has_value()) {
        result.disableXdp = config.disableXdp;
    }

    这会采用最后一个配置文件中的值。对于布尔开关,这通常是预期的行为(后加载的配置覆盖先加载的)。逻辑正确。

2. 代码质量

优点:

  • 错误处理getXDPDocumentsMountPoint 函数使用了 LINGLONG_TRACELINGLONG_ERR 宏进行了完善的错误追踪和返回值处理。
  • 代码复用与重构
    • disableGenerateContainerInfo 重构为 xdpOption (std::optional<XdpOption>)。这是一个很好的改进,将"禁用"的布尔状态改为"启用"的配置对象,使得语义更清晰(有配置即启用,无配置即禁用)。
    • ContainerCfgBuilder::enableXDP 替代了 disableContainerInfo,接口命名更符合其功能。
  • 命名规范:变量名 disableXdp 清晰表达了其用途。

改进建议:

  • getXDPDocumentsMountPoint 中的类型转换
    const auto &value = reply.arguments().constFirst();
    if (!value.canConvert<QByteArray>()) { ... }
    auto mountPoint = value.toByteArray().toStdString();
    return std::filesystem::path{ mountPoint.c_str() };
    代码中先检查是否可转换为 QByteArray,然后转换。这里略显冗余,因为 QDBusArgumentQVariant 返回的字符串类型通常是 QString。D-Bus 的 GetMountPoint 方法通常返回 String (UTF-8)。
    建议:确认 org.freedesktop.portal.DocumentsGetMountPoint 返回类型。如果是 String,直接使用 toString() 可能更直接。如果确实是 Byte Array,当前代码是正确的。目前的实现使用了 c_str() 来处理潜在的 \0 结尾问题,这是一个很好的细节。

3. 代码性能

优点:

  • 延迟计算getXDPDocumentsMountPoint 仅在 !options.isXdpDisabled() 时被调用,避免了不必要的 D-Bus 通信开销。

改进建议:

  • D-Bus 调用getXDPDocumentsMountPoint 执行的是同步 D-Bus 调用 (QDBus::Block)。在容器启动阶段,这通常是可接受的。但如果此代码路径可能在高频或延迟敏感的上下文中调用,应考虑异步调用或缓存结果。鉴于这是容器构建阶段,当前实现是合理的。

4. 代码安全

优点:

  • 路径处理:使用 std::filesystem::path 处理挂载点路径,并且使用了 c_str() 来构造路径,避免了 std::string 中可能包含的空字节导致的问题。
  • 输入验证:在 getXDPDocumentsMountPoint 中检查了 D-Bus 回复是否为空、类型是否正确、挂载点字符串是否为空。

改进建议:

  • 路径拼接安全性
    container_cfg_builder.cpp 中:

    .source = xdpOption->docMountPoint / "by-app" / appId,

    使用了 std::filesystem::path 的重载运算符 / 进行路径拼接,这是安全的,能正确处理分隔符。

  • 潜在的注入风险
    appId 被直接拼接到路径中。虽然 appId 通常来自受信任的包元数据或配置文件,但如果 appId 包含 ../ 序列,可能会导致目录遍历。
    建议:确保 appId 在传入此处之前已经过验证(例如,符合反向域名命名规范且不包含路径分隔符)。查看 ContainerCfgBuilder 的上下文,appId 应该是成员变量,通常在构造时由受信任源设置。如果 appId 来源不可控,建议添加校验逻辑。

总结

整体代码质量很高,实现逻辑清晰,测试覆盖充分。主要改进点集中在:

  1. CLI 参数的语义清晰度:确保用户理解 --disable-xdp 的作用。
  2. D-Bus 类型处理:确认 GetMountPoint 的确切返回类型以优化转换逻辑。
  3. 路径拼接安全:确认 appId 的来源和验证机制,防止潜在的路径遍历(虽然风险较低)。

代码可以合并,但建议在合并前确认上述几点。

@deepin-ci-robot

Copy link
Copy Markdown
Collaborator

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: dengbo11, reddevillg

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@dengbo11 dengbo11 merged commit d35ecc6 into OpenAtom-Linyaps:master Apr 30, 2026
16 of 17 checks passed
@reddevillg reddevillg deleted the enable_xdp branch May 2, 2026 02:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants