From d1cb1608033ec6c56502b51ee95f4193d63bb8e5 Mon Sep 17 00:00:00 2001 From: caixiangrong Date: Thu, 23 Apr 2026 13:08:29 +0800 Subject: [PATCH] fix: fix SSID encoding issues with GBK/UTF-8 detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add decodeByteArray() utility function to handle mixed GBK and UTF-8 encoded SSIDs 2. Replace direct ssid() calls with decodeByteArray(rawSsid()) in NetworkManager backend 3. Update copyright years to 2026 in affected files 4. Fix potential SSID mismatch issues when comparing wireless settings with network SSIDs The NetworkManager Qt API's ssid() method may return incorrectly decoded strings when access points use GBK encoding (common with Chinese routers). This change introduces intelligent encoding detection that tries UTF-8 first, then falls back to GBK if invalid characters are detected, ensuring proper display and matching of SSIDs with non-ASCII characters. Influence: 1. Test WiFi scanning with access points using Chinese SSID names (GBK encoded) 2. Test WiFi scanning with access points using UTF-8 encoded SSIDs 3. Verify SSID matching for saved connections with non-ASCII characters 4. Test hidden network detection with various SSID encodings 5. Verify active connection status display shows correct SSID names 6. Test hotspot functionality with non-ASCII SSID names fix: 修复 SSID 编码问题,支持 GBK/UTF-8 自动检测 1. 添加 decodeByteArray() 工具函数处理混合 GBK 和 UTF-8 编码的 SSID 2. 在 NetworkManager 后端中将直接调用 ssid() 替换为 decodeByteArray(rawSsid()) 3. 更新受影响文件的版权年份至 2026 4. 修复无线设置与网络 SSID 比较时可能出现的编码不匹配问题 NetworkManager Qt API 的 ssid() 方法在接入点使用 GBK 编码时(常见于中文 路由器) 可能返回错误解码的字符串。此变更引入智能编码检测,优先尝试 UTF-8 解码, 检测到无效字符时回退到 GBK 解码,确保非 ASCII 字符的 SSID 正确显示和 匹配。 Influence: 1. 测试使用中文 SSID 名称(GBK 编码)的 WiFi 扫描功能 2. 测试使用 UTF-8 编码 SSID 的 WiFi 扫描功能 3. 验证非 ASCII 字符的已保存连接 SSID 匹配功能 4. 测试各种 SSID 编码下的隐藏网络检测功能 5. 验证活动连接状态显示正确的 SSID 名称 6. 测试使用非 ASCII SSID 名称的热点功能 PMS: BUG-357843 --- .../networkmanager/accesspointproxynm.cpp | 15 +++++++++++---- src/impl/networkmanager/accesspointproxynm.h | 4 +++- .../networkmanager/devicemanagerrealize.cpp | 5 +++-- .../networkmanager/networkdetailnmrealize.cpp | 5 +++-- src/netutils.cpp | 19 ++++++++++++++++++- src/netutils.h | 5 ++++- 6 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/impl/networkmanager/accesspointproxynm.cpp b/src/impl/networkmanager/accesspointproxynm.cpp index 06363fd7..6dd71136 100644 --- a/src/impl/networkmanager/accesspointproxynm.cpp +++ b/src/impl/networkmanager/accesspointproxynm.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -18,6 +18,7 @@ AccessPointProxyNM::AccessPointProxyNM(NetworkManager::WirelessDevice::Ptr devic , m_strength(0) , m_secured(false) { + updateSsid(); initState(); initConnection(); updateInfo(); @@ -40,6 +41,7 @@ void AccessPointProxyNM::updateStatus(ConnectionStatus status) void AccessPointProxyNM::updateNetwork(NetworkManager::WirelessNetwork::Ptr network) { m_network = network; + updateSsid(); } bool AccessPointProxyNM::contains(const QString &uni) const @@ -57,7 +59,7 @@ bool AccessPointProxyNM::contains(const QString &uni) const QString AccessPointProxyNM::ssid() const { - return m_network->ssid(); + return m_ssid; } int AccessPointProxyNM::strength() const @@ -134,7 +136,7 @@ void AccessPointProxyNM::initState() if (wirelessSetting.isNull()) return; - if (wirelessSetting->ssid() != m_network->ssid()) + if (wirelessSetting->ssid() != ssid()) return; updateStatus(convertStateFromNetworkManager(activeConnection->state())); @@ -181,7 +183,7 @@ void AccessPointProxyNM::updateHiddenInfo() if (wirelessSetting.isNull()) return false; - return wirelessSetting->ssid() == m_network->ssid(); + return wirelessSetting->ssid() == ssid(); }); // 如果没有找到连接,就是非隐藏网络 if (itConnection == connections.end()) @@ -195,6 +197,11 @@ void AccessPointProxyNM::updateHiddenInfo() qCDebug(DNC) << "update accesspoint hidden info, ssid:" << m_isHidden << ", hidden:" << m_isHidden; } +void AccessPointProxyNM::updateSsid() +{ + m_ssid = (m_network && m_network->referenceAccessPoint()) ? decodeByteArray(m_network->referenceAccessPoint()->rawSsid()) : QString(); +} + void AccessPointProxyNM::onUpdateNetwork() { int strength = m_strength; diff --git a/src/impl/networkmanager/accesspointproxynm.h b/src/impl/networkmanager/accesspointproxynm.h index aa06dfaa..bb9a2e96 100644 --- a/src/impl/networkmanager/accesspointproxynm.h +++ b/src/impl/networkmanager/accesspointproxynm.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -47,6 +47,7 @@ class AccessPointProxyNM : public AccessPointProxy void updateInfo(); void updateConnection(); void updateHiddenInfo(); + void updateSsid(); private slots: void onUpdateNetwork(); @@ -55,6 +56,7 @@ private slots: NetworkManager::WirelessDevice::Ptr m_device; NetworkManager::WirelessNetwork::Ptr m_network; ConnectionStatus m_status; + QString m_ssid; bool m_isHidden; int m_strength; bool m_secured; diff --git a/src/impl/networkmanager/devicemanagerrealize.cpp b/src/impl/networkmanager/devicemanagerrealize.cpp index d9a34eea..61c825fe 100644 --- a/src/impl/networkmanager/devicemanagerrealize.cpp +++ b/src/impl/networkmanager/devicemanagerrealize.cpp @@ -718,7 +718,7 @@ QString WirelessDeviceManagerRealize::activeAp() const NetworkManager::WirelessDevice::Ptr wirelessDevice = m_device.staticCast(); NetworkManager::AccessPoint::Ptr ap = wirelessDevice->activeAccessPoint(); if (ap) - return ap->ssid(); + return decodeByteArray(ap->rawSsid()); return QString(); } @@ -1081,7 +1081,8 @@ bool WirelessDeviceManagerRealize::hotspotEnabled() void WirelessDeviceManagerRealize::addNetwork(const NetworkManager::WirelessNetwork::Ptr &network) { // 在当前的网络列表中查找同名SSID的网络,如果查找到了,就更新数据,没有查找到,就新增一条网络 - QList::iterator itApInfo = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ network ](AccessPointInfo *accessPoint) { return accessPoint->accessPoint()->ssid() == network->ssid(); }); + QString ssid = decodeByteArray(network->referenceAccessPoint()->rawSsid()); + QList::iterator itApInfo = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ ssid ](AccessPointInfo *accessPoint) { return accessPoint->accessPoint()->ssid() == ssid; }); if (itApInfo == m_accessPointInfos.end()) { // 新增的无线网络 AccessPointInfo *apInfo = new AccessPointInfo(m_device, network); diff --git a/src/impl/networkmanager/networkdetailnmrealize.cpp b/src/impl/networkmanager/networkdetailnmrealize.cpp index 1ad02645..24e96e04 100644 --- a/src/impl/networkmanager/networkdetailnmrealize.cpp +++ b/src/impl/networkmanager/networkdetailnmrealize.cpp @@ -1,9 +1,10 @@ -// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2011 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later #include "networkdetailnmrealize.h" #include "devicemanagerrealize.h" #include "ipmanager.h" +#include "netutils.h" #include #include @@ -61,7 +62,7 @@ void NetworkDetailNMRealize::initProperties() QString frequencyBand = tr("automatic"); NetworkManager::AccessPoint::Ptr activeAccessPoint = wirelessDevice->activeAccessPoint(); if (activeAccessPoint) { - ssid = activeAccessPoint->ssid(); + ssid = decodeByteArray(activeAccessPoint->rawSsid()); switch (NetworkManager::findFrequencyBand(static_cast(activeAccessPoint->frequency()))) { case NetworkManager::WirelessSetting::FrequencyBand::A: frequencyBand = "5 GHz"; diff --git a/src/netutils.cpp b/src/netutils.cpp index 60aa0e5e..fec2cfdc 100644 --- a/src/netutils.cpp +++ b/src/netutils.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -6,6 +6,7 @@ #include #include +#include namespace dde { namespace network { @@ -75,5 +76,21 @@ ConnectionStatus convertStateFromNetworkManager(NetworkManager::ActiveConnection return ConnectionStatus::Deactivated; } +QString decodeByteArray(const QByteArray &data) +{ + if (data.isEmpty()) { + return QString(); + } + + QStringDecoder utf8Decoder(QStringDecoder::Utf8); + QString utf8Result = utf8Decoder(data); + if (utf8Result.contains(QChar::ReplacementCharacter)) { + QStringDecoder gbkDecoder("GBK"); + if (gbkDecoder.isValid()) { + return gbkDecoder.decode(data); + } + } + return utf8Result; +} } } diff --git a/src/netutils.h b/src/netutils.h index d44dcff8..8525936c 100644 --- a/src/netutils.h +++ b/src/netutils.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -36,6 +36,9 @@ Connectivity connectivityValue(uint sourceConnectivity); DeviceStatus convertDeviceStatus(int sourceDeviceStatus); ConnectionStatus convertConnectionStatus(int sourceConnectionStatus); ConnectionStatus convertStateFromNetworkManager(NetworkManager::ActiveConnection::State state); + +// 检测并转换 SSID 编码,处理 GBK 和 UTF-8 编码 +QString decodeByteArray(const QByteArray &rawSsid); } } #endif // NETUTILS_H