Skip to content

fix: support GBK-encoded SSID display and match - #635

Merged
caixr23 merged 1 commit into
linuxdeepin:masterfrom
caixr23:master
Sep 24, 2026
Merged

caixr23 merged 1 commit into
linuxdeepin:masterfrom
caixr23:master

Conversation

@caixr23

@caixr23 caixr23 commented Sep 22, 2026

Copy link
Copy Markdown
Contributor
  1. Add ssidToUtf8() to netutils: a locale-aware SSID byte-to-UTF-8 decoder modeled on NetworkManager's nm_utils_ssid_to_utf8 (UTF-8 validate -> language encoding table, GB18030 for zh -> system charset/iso-8859-1/windows-1251 -> printable ASCII).
  2. Expose rawSsid() on AccessPointProxy (base + NM backend + DSS backend) and on the public AccessPoints wrapper so callers can obtain the AP's raw SSID bytes.
  3. Use rawSsid() as the primary match key in all connect/lookup paths (devicemanagerrealize, accesspointproxynm initState / updateHiddenInfo, netmanagerthreadprivate connect / available connections / hidden / portal, netwirelessconnect) and save new connections with the raw bytes; fall back to the UTF-8 display name for historical connections.
  4. Decode the hotspot SSID to UTF-8 in NetHotspotController::updateConfig so QML no longer renders a raw QByteArray as UTF-8 mojibake.

Log: Wi-Fi network names with GBK-encoded SSIDs now display correctly instead of garbled, and existing connections are matched properly.

Influence:

  1. Create a hotspot with a GBK-encoded SSID, open the control center / dock network list and verify the name shows correctly and the connection status / has-connection indicator is right.
  2. Scan a GBK-SSID AP and connect with a password: verify the password dialog appears, the connection succeeds, and a saved GBK connection is matched (shown as connected, not new).

fix: 支持 GBK 编码 SSID 的显示与匹配

  1. 在 netutils 新增 ssidToUtf8(),按 locale 感知将 SSID 原始字节 解码为 UTF-8,实现对齐 NetworkManager 的 nm_utils_ssid_to_utf8 (UTF-8 校验 -> 语言编码表,中文用 GB18030 -> 系统 charset/ iso-8859-1/windows-1251 -> 可打印 ASCII 兜底)。
  2. 在 AccessPointProxy(基类 + NM 后端 + DSS 后端)及公开的 AccessPoints 上暴露 rawSsid(),供调用方获取 AP 的原始字节。
  3. 所有连接/查找路径改用 rawSsid() 作为优先匹配键 (devicemanagerrealize、accesspointproxynm 的 initState/ updateHiddenInfo、netmanagerthreadprivate 的连接/可用连接/ 隐藏网络/门户、netwirelessconnect),新建连接保存原始字节, 历史连接回退按 UTF-8 显示名匹配。
  4. NetHotspotController::updateConfig 将热点 SSID 解码为 UTF-8,避免 QML 把原始 QByteArray 按 UTF-8 直读成乱码。

Log: GBK 编码的无线网络名不再显示为乱码,已有连接也能正确匹配。

Influence:

  1. 创建一个 GBK 编码 SSID 的热点,打开控制中心/dock 网络列表, 确认名称正常显示、连接状态与「已有连接」标识正确。
  2. 扫描 GBK SSID 的 AP 并用密码连接:确认密码框正常弹出、连接 成功,且已保存的 GBK 连接被匹配(显示为已连接而非新网络)。

PMS: BUG-357843

Summary by Sourcery

Support locale-encoded Wi-Fi SSIDs by decoding them for display and matching connections using their original bytes.

New Features:

  • Add locale-aware decoding of raw SSID bytes for correct UTF-8 display, including GBK/GB18030 networks.
  • Expose raw SSID bytes through access-point APIs for reliable network identification.

Bug Fixes:

  • Fix display, connection lookup, saved-network matching, hidden-network handling, and portal association for non-UTF-8 SSIDs.
  • Preserve raw SSID bytes when creating wireless connections while retaining compatibility with historical UTF-8-based connections.

@sourcery-ai

sourcery-ai Bot commented Sep 22, 2026

Copy link
Copy Markdown

Reviewer's Guide

The PR introduces locale-aware SSID display decoding, exposes raw SSID bytes across NM/DSS and public access-point APIs, and updates all wireless connection matching and persistence paths to use exact raw bytes with UTF-8 fallback for historical connections.

Sequence diagram for raw SSID matching and connection persistence

sequenceDiagram
    participant User
    participant AccessPoints
    participant NetWirelessConnect
    participant NetworkManager
    participant SavedConnection

    User->>AccessPoints: rawSsid()
    AccessPoints-->>NetWirelessConnect: raw SSID bytes
    NetWirelessConnect->>NetworkManager: availableConnections()
    NetworkManager-->>NetWirelessConnect: saved wireless settings
    alt raw SSID matches
        NetWirelessConnect->>SavedConnection: reuse connection
    else UTF-8 display name matches historical connection
        NetWirelessConnect->>SavedConnection: reuse historical connection
    else no match
        NetWirelessConnect->>SavedConnection: setSsid(rawSsid())
        NetWirelessConnect->>NetworkManager: create connection
    end
Loading

Flow diagram for locale-aware SSID display decoding

flowchart LR
    RawSSID[Raw SSID bytes] --> UTF8{Valid UTF-8?}
    UTF8 -->|Yes| Display[UTF-8 display string]
    UTF8 -->|No| Locale[Locale encoding candidates]
    Locale -->|Successful decode| Display
    Locale -->|All fail| ASCII[Printable ASCII fallback]
    ASCII --> Display
    Display --> UI[Control center, dock, or QML UI]
Loading

File-Level Changes

Change Details Files
Add locale-aware decoding for raw SSID bytes and use it for user-facing display.
  • Validate UTF-8 first, then try locale-specific encodings including GB18030 for simplified Chinese.
  • Add printable-ASCII replacement fallback when decoding fails.
  • Decode hotspot configuration SSIDs before exposing them to QML.
src/netutils.cpp
src/netutils.h
net-view/operation/private/nethotspotcontroller.cpp
Expose raw SSID bytes throughout the access-point abstraction and backend implementations.
  • Add rawSsid() to AccessPointProxy and the public AccessPoints wrapper.
  • Return NetworkManager reference-AP bytes in the NM backend.
  • Add DSS-side decoding support for optional RawSsid/base64 data, with a base64 Ssid fallback.
src/impl/netinterface.h
src/wirelessdevice.cpp
src/wirelessdevice.h
src/impl/networkmanager/accesspointproxynm.cpp
src/impl/networkmanager/accesspointproxynm.h
src/impl/serviceinter/accesspointsproxyinter.cpp
src/impl/serviceinter/accesspointsproxyinter.h
Switch wireless connection lookup, state, and persistence to raw-byte SSID matching while preserving historical compatibility.
  • Prefer exact raw-byte comparisons across connection, availability, hidden-network, portal, and active-state paths.
  • Fall back to the displayed SSID converted to UTF-8 for legacy saved connections.
  • Persist raw AP bytes for newly created NetworkManager connections, with UTF-8 fallback when unavailable.
net-view/operation/private/netmanagerthreadprivate.cpp
net-view/operation/private/netwirelessconnect.cpp
src/impl/networkmanager/devicemanagerrealize.cpp
src/impl/networkmanager/accesspointproxynm.cpp

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey - I've found 2 issues

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="src/impl/serviceinter/accesspointsproxyinter.cpp" line_range="33-35" />
<code_context>
     return m_json.value("Ssid").toString();
 }

+QByteArray AccessPointsProxyInter::rawSsid() const
+{
+    // DSS 服务目前仅下发显示用的 Ssid 字符串,未提供原始字节;
+    // 若服务端未来提供 RawSsid(base64)字段,在此解析返回。
+    if (m_json.contains("RawSsid")) {
+        return QByteArray::fromBase64(m_json.value("RawSsid").toString().toLatin1());
+    }
+    if (m_json.contains("Ssid")) {
+        return QByteArray::fromBase64(m_json.value("Ssid").toString().toLatin1());
+    }
+
+    return QByteArray();
+}
</code_context>
<issue_to_address>
**issue (bug_risk):** When the DSS payload contains only the documented display-name `Ssid` field, `rawSsid()` base64-decodes that ordinary string and returns unrelated bytes instead of an empty raw SSID. DSS connections created through this wrapper are therefore saved with corrupt SSID bytes, and exact raw-byte matching fails for DSS access points.

**Triggers:** When the DSS service has not yet added a separate `RawSsid` field.

**Suggested fix:** Return an empty `QByteArray` when only `Ssid` is present; decode only a documented raw-byte field, or update the DSS service to provide `RawSsid` explicitly.

```suggestion

```
</issue_to_address>

### Comment 2
<location path="src/impl/networkmanager/accesspointproxynm.cpp" line_range="150-152" />
<code_context>
                     return false;
-                return wirelessSetting->ssid() == tmpAp->ssid() && !connection->isUnsaved();
+                const QByteArray rawSsid = tmpAp->rawSsid();
+                // 优先按原始字节匹配(连接保存的是 AP 原始字节),其次兼容 UTF-8 显示名匹配历史连接
+                return ((!rawSsid.isEmpty() && wirelessSetting->ssid() == rawSsid)
+                        || wirelessSetting->ssid() == tmpAp->ssid().toUtf8())
</code_context>
<issue_to_address>
**issue (bug_risk):** Both callers dereference `m_network->referenceAccessPoint()` directly before obtaining its SSID, even though `rawSsid()` explicitly treats a null reference access point as a valid state and returns an empty byte array. If the reference AP disappears during network refresh or teardown, `initState()` or `updateHiddenInfo()` crashes.

**Triggers:** When a wireless network temporarily has no reference access point during an update or teardown.

**Suggested fix:** Use `rawSsid()` without dereferencing the reference AP directly, or check `referenceAccessPoint()` for null before accessing it.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨

Comment on lines +33 to +35
if (m_json.contains("Ssid")) {
return QByteArray::fromBase64(m_json.value("Ssid").toString().toLatin1());
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

issue (bug_risk): When the DSS payload contains only the documented display-name Ssid field, rawSsid() base64-decodes that ordinary string and returns unrelated bytes instead of an empty raw SSID. DSS connections created through this wrapper are therefore saved with corrupt SSID bytes, and exact raw-byte matching fails for DSS access points.

Triggers: When the DSS service has not yet added a separate RawSsid field.

Suggested fix: Return an empty QByteArray when only Ssid is present; decode only a documented raw-byte field, or update the DSS service to provide RawSsid explicitly.

Suggested change
if (m_json.contains("Ssid")) {
return QByteArray::fromBase64(m_json.value("Ssid").toString().toLatin1());
}

Comment on lines +150 to +152
// 优先按原始字节匹配(连接保存的是 AP 原始字节),其次兼容 UTF-8 显示名匹配历史连接
if (!((!rawSsid.isEmpty() && wirelessSetting->ssid() == rawSsid)
|| wirelessSetting->ssid() == ssid().toUtf8()))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

issue (bug_risk): Both callers dereference m_network->referenceAccessPoint() directly before obtaining its SSID, even though rawSsid() explicitly treats a null reference access point as a valid state and returns an empty byte array. If the reference AP disappears during network refresh or teardown, initState() or updateHiddenInfo() crashes.

Triggers: When a wireless network temporarily has no reference access point during an update or teardown.

Suggested fix: Use rawSsid() without dereferencing the reference AP directly, or check referenceAccessPoint() for null before accessing it.

@caixr23
caixr23 force-pushed the master branch 8 times, most recently from 1447664 to a141b83 Compare September 22, 2026 09:26
@deepin-bot

deepin-bot Bot commented Sep 22, 2026

Copy link
Copy Markdown
Contributor

TAG Bot

New tag: 2.0.102
DISTRIBUTION: unstable
Suggest: synchronizing this PR through rebase #637

@caixr23
caixr23 force-pushed the master branch 4 times, most recently from 223b4ac to 128b6e1 Compare September 23, 2026 09:20
1. Add ssidToUtf8() to netutils: a locale-aware SSID byte-to-UTF-8
   decoder modeled on NetworkManager's nm_utils_ssid_to_utf8
   (UTF-8 validate -> language encoding table, GB18030 for zh ->
   system charset/iso-8859-1/windows-1251 -> printable ASCII).
2. Expose rawSsid() on AccessPointProxy (base + NM backend + DSS
   backend) and on the public AccessPoints wrapper so callers can
   obtain the AP's raw SSID bytes.
3. Use rawSsid() as the primary match key in all connect/lookup
   paths (devicemanagerrealize, accesspointproxynm initState /
   updateHiddenInfo, netmanagerthreadprivate connect / available
   connections / hidden / portal, netwirelessconnect) and save new
   connections with the raw bytes; fall back to the UTF-8 display
   name for historical connections.
4. Decode the hotspot SSID to UTF-8 in
   NetHotspotController::updateConfig so QML no longer renders a
   raw QByteArray as UTF-8 mojibake.

Log: Wi-Fi network names with GBK-encoded SSIDs now display
correctly instead of garbled, and existing connections are matched
properly.

Influence:
1. Create a hotspot with a GBK-encoded SSID, open the control
   center / dock network list and verify the name shows correctly
   and the connection status / has-connection indicator is right.
2. Scan a GBK-SSID AP and connect with a password: verify the
   password dialog appears, the connection succeeds, and a saved
   GBK connection is matched (shown as connected, not new).

fix: 支持 GBK 编码 SSID 的显示与匹配

1. 在 netutils 新增 ssidToUtf8(),按 locale 感知将 SSID 原始字节
   解码为 UTF-8,实现对齐 NetworkManager 的 nm_utils_ssid_to_utf8
   (UTF-8 校验 -> 语言编码表,中文用 GB18030 -> 系统 charset/
   iso-8859-1/windows-1251 -> 可打印 ASCII 兜底)。
2. 在 AccessPointProxy(基类 + NM 后端 + DSS 后端)及公开的
   AccessPoints 上暴露 rawSsid(),供调用方获取 AP 的原始字节。
3. 所有连接/查找路径改用 rawSsid() 作为优先匹配键
   (devicemanagerrealize、accesspointproxynm 的 initState/
   updateHiddenInfo、netmanagerthreadprivate 的连接/可用连接/
   隐藏网络/门户、netwirelessconnect),新建连接保存原始字节,
   历史连接回退按 UTF-8 显示名匹配。
4. NetHotspotController::updateConfig 将热点 SSID 解码为
   UTF-8,避免 QML 把原始 QByteArray 按 UTF-8 直读成乱码。

Log: GBK 编码的无线网络名不再显示为乱码,已有连接也能正确匹配。

Influence:
1. 创建一个 GBK 编码 SSID 的热点,打开控制中心/dock 网络列表,
   确认名称正常显示、连接状态与「已有连接」标识正确。
2. 扫描 GBK SSID 的 AP 并用密码连接:确认密码框正常弹出、连接
   成功,且已保存的 GBK 连接被匹配(显示为已连接而非新网络)。

PMS: BUG-357843
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

🤖 AI 代码审查报告

总体评分: 96 分 (通过阈值: 70分)

Pass


📊 总体评价

项目 结果
审查结论 代码审查通过
评分详情 未发现安全漏洞,代码逻辑正确,实现方案合理,有效解决了GBK编码SSID的显示乱码和匹配失败问题。代码注释详尽,结构清晰。存在少量性能优化空间和结构改进建议。
项目名称 linuxdeepin/dde-network-core
PR 编号 #635
PR 标题 fix: support GBK-encoded SSID display and match
分析模式 全量分析
修改文件数 15
安全漏洞数 0

📋 代码目的分析

本 PR 修复 GBK 编码 SSID 在显示时出现乱码以及在连接匹配时失败的问题。核心实现方案:

  1. 新增 rawSsid() 接口,获取 SSID 原始字节,用于与 NetworkManager 侧字节精确匹配
  2. 新增 ssidToUtf8() 函数,实现 locale 感知的 SSID 解码(对齐 nm_utils_ssid_to_utf8),支持 GBK/GB18030/Big5 等多种编码
  3. 新增 ssidBytesMatch()ssidForSave() 函数,将 SSID 匹配从字符串比较改为字节级比较
  4. 重写 onNetworkDisappeared(),改用 rawSsid 集合差集检测消失的网络,不再依赖上游解码后的显示名
  5. NetWirelessConnect::setSsid(QString) 改为 setRawSsid(QByteArray),全链路使用原始字节

🔍 详细分析

1. 语法逻辑 ✅ (25/25分)

评价: 语法正确,逻辑清晰 ✅

潜在问题:
✅ 未发现明显问题

分析说明:

  • ssidToUtf8() 的三段式解码策略(UTF-8 直验 → locale 候选编码 → ASCII 兜底)逻辑严谨,与 NetworkManager 上游 nm_utils_ssid_to_utf8 语义一致
  • ssidBytesMatch() 优先原始字节匹配、回退 UTF-8 显示名匹配的设计合理,兼顾了 NM 后端和 DSS 后端两种场景
  • ssidForSave() 正确处理了 rawSsid 为空(隐藏网络)的回退情况
  • onNetworkDisappeared() 重写后的集合差集逻辑正确:先收集存活 rawSsid 集合,再遍历本端列表找出不在集合中的项
  • NetWirelessConnect::initConnection() 中将 wSetting->ssid() != m_rawSsid 改为字节比较,与 NM 侧一致
  • 所有文件的 #include 引入正确,新增 <netutils.h> 引入位置合理

2. 代码质量 ✅ (24/25分)

评价: 代码结构清晰,注释完整 ✅

潜在问题:

  1. src/impl/networkmanager/devicemanagerrealize.cppWirelessDeviceManagerRealize::onNetworkDisappeared (行 1151-1201):onNetworkDisappeared 函数重写后逻辑变长(约50行),包含了集合构建、遍历比对、删除清理等多个职责,可考虑将存活集合构建和删除逻辑提取为辅助函数以提升可读性

分析说明:

  • ssidToUtf8() 函数文档注释详尽,清晰说明了实现策略、与 nm_utils 的对应关系、使用注意事项
  • langEncodings()decodeCandidates() 放置在匿名命名空间中,封装合理
  • 新增 rawSsid() 虚函数在基类 AccessPointProxy 中提供了默认实现(返回空 QByteArray),符合接口设计规范
  • AccessPointsProxyInter::rawSsid() 对 DSS 服务端未提供 RawSsid 字段的情况做了兼容处理,包含未来扩展的 base64 解析逻辑
  • 代码风格一致,命名规范统一(rawSsid/ssidToUtf8/ssidBytesMatch/ssidForSave)

3. 代码性能 ✅ (17/20分)

评价: 算法复杂度合理 ✅

潜在问题:

  1. src/netutils.cppssidToUtf8 (行 110-139):ssidToUtf8() 每次调用都会通过 decodeCandidates() 重新构建候选编码列表,包括创建 QStringDecoder(System) 对象和多次字符串比较。由于系统 locale 在运行期间不会变化,可将 decodeCandidates() 结果缓存为 static 局部变量,避免重复计算

  2. src/netutils.cppssidToUtf8 (行 123-131):在候选编码遍历循环中,每次迭代都创建新的 QStringDecoder 对象。虽然 Qt 内部 ICU 解码器创建开销不大,但在高频调用场景下(如扫描大量 AP)可考虑预创建常用解码器

建议:

  • 建议将 decodeCandidates(QLocale::system()) 的结果缓存为 static const 局部变量,避免每次调用 ssidToUtf8() 时重复构建候选编码列表

优化代码示例:

QString ssidToUtf8(const QByteArray &raw)
{
    if (raw.isEmpty())
        return {};

    // 1) 已是 UTF-8 → 直接返回
    static const QStringDecoder u8Decoder(QStringDecoder::Utf8);
    QStringDecoder u8(u8Decoder);
    QString out = u8.decode(raw);
    if (!u8.hasError())
        return out;

    // 2) 缓存候选编码列表(系统 locale 不变)
    static const QStringList candidates = []() {
        return decodeCandidates(QLocale::system());
    }();

    for (const QString &enc : candidates) {
        QStringDecoder d(enc);
        if (!d.isValid())
            continue;
        d.resetState();
        out = d.decode(raw);
        if (!d.hasError())
            return out;
    }

    // 3) 兜底: 可打印 ASCII,其余 '?'
    QString ascii;
    ascii.reserve(raw.size());
    for (char c : raw)
        ascii += (c >= 0x20 && c <= 0x7E) ? QChar(c) : QChar('?');
    return ascii;
}

4. 代码安全 🔒 (30/30分)

评价: 存在0个安全漏洞 ✅ 安全合规

🔐 发现 0 个安全漏洞

安全漏洞详情:
✅ 未发现安全漏洞

安全分析:

  • SSID 原始字节作为数据流处理,不存在注入风险
  • QByteArray::fromBase64() 调用(AccessPointsProxyInter::rawSsid)用于解码服务端下发的 base64 数据,操作安全
  • 无硬编码密钥、无敏感信息泄露
  • 无用户输入未校验风险(SSID 字节由 NetworkManager/D-Bus 提供,非直接用户输入)
  • 无缓冲区溢出风险(QByteArray 自动管理内存)
  • 无不安全的密码算法使用

漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个


📈 维度评分汇总

维度 评分 满分 状态 评价词
语法逻辑 25 25 语法正确,逻辑清晰
代码质量 24 25 代码结构清晰,注释完整
代码性能 17 20 算法复杂度合理
代码安全 30 30 存在0个安全漏洞
总分 96 100 ✅ 通过 优秀

💡 改进建议汇总

  1. 性能优化:将 decodeCandidates(QLocale::system()) 结果缓存为 static const 局部变量,避免每次调用 ssidToUtf8() 时重复构建候选编码列表

  2. 结构优化:将 onNetworkDisappeared 中收集存活 rawSsid 集合的逻辑提取为独立的辅助函数(如 collectAliveRawSsids()),以降低单函数复杂度

  3. 解码器预创建:在高频调用场景下,可考虑预创建常用编码的 QStringDecoder 对象池


本报告由 AI 代码审查工具自动生成

审查时间: 2026-09-24 08:59:00
分析模式: 全量分析
项目: linuxdeepin/dde-network-core PR#635

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: 18202781743, caixr23, ut003640

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

@caixr23
caixr23 merged commit 860caf2 into linuxdeepin:master Sep 24, 2026
14 checks passed
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.

4 participants