Skip to content

Commit d1cb160

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 d1cb160

6 files changed

Lines changed: 42 additions & 11 deletions

File tree

src/impl/networkmanager/accesspointproxynm.cpp

Lines changed: 11 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

@@ -18,6 +18,7 @@ AccessPointProxyNM::AccessPointProxyNM(NetworkManager::WirelessDevice::Ptr devic
1818
, m_strength(0)
1919
, m_secured(false)
2020
{
21+
updateSsid();
2122
initState();
2223
initConnection();
2324
updateInfo();
@@ -40,6 +41,7 @@ void AccessPointProxyNM::updateStatus(ConnectionStatus status)
4041
void AccessPointProxyNM::updateNetwork(NetworkManager::WirelessNetwork::Ptr network)
4142
{
4243
m_network = network;
44+
updateSsid();
4345
}
4446

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

5860
QString AccessPointProxyNM::ssid() const
5961
{
60-
return m_network->ssid();
62+
return m_ssid;
6163
}
6264

6365
int AccessPointProxyNM::strength() const
@@ -134,7 +136,7 @@ void AccessPointProxyNM::initState()
134136
if (wirelessSetting.isNull())
135137
return;
136138

137-
if (wirelessSetting->ssid() != m_network->ssid())
139+
if (wirelessSetting->ssid() != ssid())
138140
return;
139141

140142
updateStatus(convertStateFromNetworkManager(activeConnection->state()));
@@ -181,7 +183,7 @@ void AccessPointProxyNM::updateHiddenInfo()
181183
if (wirelessSetting.isNull())
182184
return false;
183185

184-
return wirelessSetting->ssid() == m_network->ssid();
186+
return wirelessSetting->ssid() == ssid();
185187
});
186188
// 如果没有找到连接,就是非隐藏网络
187189
if (itConnection == connections.end())
@@ -195,6 +197,11 @@ void AccessPointProxyNM::updateHiddenInfo()
195197
qCDebug(DNC) << "update accesspoint hidden info, ssid:" << m_isHidden << ", hidden:" << m_isHidden;
196198
}
197199

200+
void AccessPointProxyNM::updateSsid()
201+
{
202+
m_ssid = (m_network && m_network->referenceAccessPoint()) ? decodeByteArray(m_network->referenceAccessPoint()->rawSsid()) : QString();
203+
}
204+
198205
void AccessPointProxyNM::onUpdateNetwork()
199206
{
200207
int strength = m_strength;

src/impl/networkmanager/accesspointproxynm.h

Lines changed: 3 additions & 1 deletion
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

@@ -47,6 +47,7 @@ class AccessPointProxyNM : public AccessPointProxy
4747
void updateInfo();
4848
void updateConnection();
4949
void updateHiddenInfo();
50+
void updateSsid();
5051

5152
private slots:
5253
void onUpdateNetwork();
@@ -55,6 +56,7 @@ private slots:
5556
NetworkManager::WirelessDevice::Ptr m_device;
5657
NetworkManager::WirelessNetwork::Ptr m_network;
5758
ConnectionStatus m_status;
59+
QString m_ssid;
5860
bool m_isHidden;
5961
int m_strength;
6062
bool m_secured;

src/impl/networkmanager/devicemanagerrealize.cpp

Lines changed: 3 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,8 @@ 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+
QString ssid = decodeByteArray(network->referenceAccessPoint()->rawSsid());
1085+
QList<AccessPointInfo *>::iterator itApInfo = std::find_if(m_accessPointInfos.begin(), m_accessPointInfos.end(), [ ssid ](AccessPointInfo *accessPoint) { return accessPoint->accessPoint()->ssid() == ssid; });
10851086
if (itApInfo == m_accessPointInfos.end()) {
10861087
// 新增的无线网络
10871088
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: 18 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,21 @@ 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+
QString utf8Result = utf8Decoder(data);
87+
if (utf8Result.contains(QChar::ReplacementCharacter)) {
88+
QStringDecoder gbkDecoder("GBK");
89+
if (gbkDecoder.isValid()) {
90+
return gbkDecoder.decode(data);
91+
}
92+
}
93+
return utf8Result;
94+
}
7895
}
7996
}

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)