Skip to content

Commit e07f3ec

Browse files
committed
fix: fix SSID encoding issues with GBK/UTF-8 detection
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
1 parent 4911489 commit e07f3ec

5 files changed

Lines changed: 30 additions & 10 deletions

File tree

src/impl/networkmanager/accesspointproxynm.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -57,7 +57,7 @@ bool AccessPointProxyNM::contains(const QString &uni) const
5757

5858
QString AccessPointProxyNM::ssid() const
5959
{
60-
return m_network->ssid();
60+
return decodeByteArray(m_network->referenceAccessPoint()->rawSsid());
6161
}
6262

6363
int AccessPointProxyNM::strength() const
@@ -134,7 +134,7 @@ void AccessPointProxyNM::initState()
134134
if (wirelessSetting.isNull())
135135
return;
136136

137-
if (wirelessSetting->ssid() != m_network->ssid())
137+
if (wirelessSetting->ssid() != ssid())
138138
return;
139139

140140
updateStatus(convertStateFromNetworkManager(activeConnection->state()));
@@ -181,7 +181,7 @@ void AccessPointProxyNM::updateHiddenInfo()
181181
if (wirelessSetting.isNull())
182182
return false;
183183

184-
return wirelessSetting->ssid() == m_network->ssid();
184+
return wirelessSetting->ssid() == ssid();
185185
});
186186
// 如果没有找到连接,就是非隐藏网络
187187
if (itConnection == connections.end())

src/impl/networkmanager/devicemanagerrealize.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -718,7 +718,7 @@ QString WirelessDeviceManagerRealize::activeAp() const
718718
NetworkManager::WirelessDevice::Ptr wirelessDevice = m_device.staticCast<NetworkManager::WirelessDevice>();
719719
NetworkManager::AccessPoint::Ptr ap = wirelessDevice->activeAccessPoint();
720720
if (ap)
721-
return ap->ssid();
721+
return decodeByteArray(ap->rawSsid());
722722

723723
return QString();
724724
}
@@ -1081,7 +1081,7 @@ bool WirelessDeviceManagerRealize::hotspotEnabled()
10811081
void WirelessDeviceManagerRealize::addNetwork(const NetworkManager::WirelessNetwork::Ptr &network)
10821082
{
10831083
// 在当前的网络列表中查找同名SSID的网络,如果查找到了,就更新数据,没有查找到,就新增一条网络
1084-
QList<AccessPointInfo *>::iterator itApInfo = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ network ](AccessPointInfo *accessPoint) { return accessPoint->accessPoint()->ssid() == network->ssid(); });
1084+
QList<AccessPointInfo *>::iterator itApInfo = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ network ](AccessPointInfo *accessPoint) { return accessPoint->accessPoint()->ssid() == decodeByteArray(network->referenceAccessPoint()->rawSsid()); });
10851085
if (itApInfo == m_accessPointInfos.end()) {
10861086
// 新增的无线网络
10871087
AccessPointInfo *apInfo = new AccessPointInfo(m_device, network);

src/impl/networkmanager/networkdetailnmrealize.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
// SPDX-FileCopyrightText: 2011 - 2022 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2011 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: LGPL-3.0-or-later
44
#include "networkdetailnmrealize.h"
55
#include "devicemanagerrealize.h"
66
#include "ipmanager.h"
7+
#include "netutils.h"
78

89
#include <NetworkManagerQt/WirelessDevice>
910
#include <NetworkManagerQt/WirelessSecuritySetting>
@@ -61,7 +62,7 @@ void NetworkDetailNMRealize::initProperties()
6162
QString frequencyBand = tr("automatic");
6263
NetworkManager::AccessPoint::Ptr activeAccessPoint = wirelessDevice->activeAccessPoint();
6364
if (activeAccessPoint) {
64-
ssid = activeAccessPoint->ssid();
65+
ssid = decodeByteArray(activeAccessPoint->rawSsid());
6566
switch (NetworkManager::findFrequencyBand(static_cast<int>(activeAccessPoint->frequency()))) {
6667
case NetworkManager::WirelessSetting::FrequencyBand::A:
6768
frequencyBand = "5 GHz";

src/netutils.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

55
#include "netutils.h"
66

77
#include <QMetaType>
88
#include <QDBusMetaType>
9+
#include <QStringConverter>
910

1011
namespace dde {
1112
namespace network {
@@ -75,5 +76,20 @@ ConnectionStatus convertStateFromNetworkManager(NetworkManager::ActiveConnection
7576
return ConnectionStatus::Deactivated;
7677
}
7778

79+
QString decodeByteArray(const QByteArray &data)
80+
{
81+
if (data.isEmpty()) {
82+
return QString();
83+
}
84+
85+
QStringDecoder utf8Decoder(QStringDecoder::Utf8);
86+
bool isValidUtf8 = utf8Decoder.isValid();
87+
QString utf8Result = utf8Decoder(data);
88+
if (isValidUtf8 && !utf8Result.contains(QChar(0xFFFD))) {
89+
return utf8Result;
90+
}
91+
QStringDecoder gbkDecoder("GBK");
92+
return gbkDecoder.decode(data);
93+
}
7894
}
7995
}

src/netutils.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -36,6 +36,9 @@ Connectivity connectivityValue(uint sourceConnectivity);
3636
DeviceStatus convertDeviceStatus(int sourceDeviceStatus);
3737
ConnectionStatus convertConnectionStatus(int sourceConnectionStatus);
3838
ConnectionStatus convertStateFromNetworkManager(NetworkManager::ActiveConnection::State state);
39+
40+
// 检测并转换 SSID 编码,处理 GBK 和 UTF-8 编码
41+
QString decodeByteArray(const QByteArray &rawSsid);
3942
}
4043
}
4144
#endif // NETUTILS_H

0 commit comments

Comments
 (0)