diff options
Diffstat (limited to 'raveos-calamares-module/wifi/NetworkManager.cpp')
| -rw-r--r-- | raveos-calamares-module/wifi/NetworkManager.cpp | 95 |
1 files changed, 53 insertions, 42 deletions
diff --git a/raveos-calamares-module/wifi/NetworkManager.cpp b/raveos-calamares-module/wifi/NetworkManager.cpp index cb88698..94abe2b 100644 --- a/raveos-calamares-module/wifi/NetworkManager.cpp +++ b/raveos-calamares-module/wifi/NetworkManager.cpp @@ -1,5 +1,7 @@ #include "NetworkManager.h" +#include <algorithm> + #include <QDBusInterface> #include <QDBusReply> #include <QDBusObjectPath> @@ -17,6 +19,13 @@ typedef QMap<QString, QVariantMap> NMConnectionSettings; static const QString LOG_FILE = "/tmp/calamares-wifi.log"; +static constexpr uint NmDeviceTypeWifi = 2; +static constexpr uint NmApFlagPrivacy = 0x1; +static constexpr uint NmKeyMgmtPsk = 0x100; +static constexpr uint NmKeyMgmt8021x = 0x200; +static constexpr uint NmKeyMgmtSae = 0x400; +static constexpr int NmPmfRequired = 3; + static void wifiLog(const QString& message) { QString timestamp = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"); @@ -55,11 +64,6 @@ NetworkManager::NetworkManager(QObject* parent) timer->start(3000); } -QStringList NetworkManager::networks() const -{ - return m_networks; -} - bool NetworkManager::isConnected() const { return m_connected; @@ -142,7 +146,6 @@ void NetworkManager::updateConnectionState() void NetworkManager::scan() { - m_networks.clear(); wifiLog("Starting scan..."); QDBusInterface nm( @@ -189,7 +192,7 @@ void NetworkManager::scan() uint deviceType = typeReply.isValid() ? typeReply.value().toUInt() : 0; wifiLog(QString("Device %1 type: %2").arg(dev.path()).arg(deviceType)); - if (deviceType != 2) // Not WiFi + if (deviceType != NmDeviceTypeWifi) continue; foundWireless = true; @@ -219,7 +222,6 @@ void NetworkManager::scan() void NetworkManager::fetchAccessPoints() { - m_networks.clear(); wifiLog("Fetching access points..."); QDBusInterface nm( @@ -232,6 +234,7 @@ void NetworkManager::fetchAccessPoints() if (!nm.isValid()) { wifiLog("NM interface not valid in fetchAccessPoints"); + m_accessPoints.clear(); emit networksChanged(); return; } @@ -241,10 +244,13 @@ void NetworkManager::fetchAccessPoints() if (!devices.isValid()) { wifiLog("GetDevices failed in fetchAccessPoints"); + m_accessPoints.clear(); emit networksChanged(); return; } + QMap<QString, QVariantMap> strongest; + for (const auto& dev : devices.value()) { QDBusInterface devProps( @@ -260,8 +266,8 @@ void NetworkManager::fetchAccessPoints() "DeviceType" ); - if (!typeReply.isValid() || typeReply.value().toUInt() != 2) - continue; // Not WiFi + if (!typeReply.isValid() || typeReply.value().toUInt() != NmDeviceTypeWifi) + continue; QDBusInterface wirelessIf( "org.freedesktop.NetworkManager", @@ -289,22 +295,41 @@ void NetworkManager::fetchAccessPoints() QDBusConnection::systemBus() ); - QByteArray ssidRaw = apIf.property("Ssid").toByteArray(); - QString ssid = QString::fromUtf8(ssidRaw); + const QString ssid = QString::fromUtf8(apIf.property("Ssid").toByteArray()); + if (ssid.isEmpty()) + continue; - uint frequency = apIf.property("Frequency").toUInt(); - QString band = (frequency > 4000) ? "5GHz" : "2.4GHz"; + const uint frequency = apIf.property("Frequency").toUInt(); + const int strength = apIf.property("Strength").toInt(); + const bool secured = (apIf.property("Flags").toUInt() & NmApFlagPrivacy) != 0 + || apIf.property("WpaFlags").toUInt() != 0 + || apIf.property("RsnFlags").toUInt() != 0; - wifiLog(QString("Found SSID: %1 (%2, %3 MHz)").arg(ssid, band).arg(frequency)); + wifiLog(QString("Found SSID: %1 (%2 MHz, %3%)").arg(ssid).arg(frequency).arg(strength)); - if (!ssid.isEmpty() && !m_networks.contains(ssid)) - m_networks << ssid; + if (strongest.contains(ssid) && strongest[ssid].value("strength").toInt() >= strength) + continue; + + QVariantMap item; + item.insert("ssid", ssid); + item.insert("strength", strength); + item.insert("secured", secured); + item.insert("band", frequency > 5900 ? QStringLiteral("6 GHz") : frequency > 4000 ? QStringLiteral("5 GHz") : QStringLiteral("2.4 GHz")); + strongest.insert(ssid, item); } } - m_networks.sort(Qt::CaseInsensitive); + QList<QVariantMap> sorted = strongest.values(); + std::sort(sorted.begin(), sorted.end(), [](const QVariantMap& a, const QVariantMap& b) + { + return a.value("strength").toInt() > b.value("strength").toInt(); + }); + + m_accessPoints.clear(); + for (const auto& item : sorted) + m_accessPoints << item; - wifiLog(QString("Total networks found: %1").arg(m_networks.size())); + wifiLog(QString("Total networks found: %1").arg(m_accessPoints.size())); emit networksChanged(); } @@ -402,12 +427,12 @@ void NetworkManager::connectTo(const QString& ssid, const QString& password) } - bool apSupportsPsk = ((apWpaFlags & 0x100) != 0) || ((apRsnFlags & 0x100) != 0); - bool apSupportsSae = (apRsnFlags & 0x400) != 0; // WPA3 - bool apSupportsEnterprise = ((apWpaFlags & 0x200) != 0) || ((apRsnFlags & 0x200) != 0); + bool apSupportsPsk = ((apWpaFlags & NmKeyMgmtPsk) != 0) || ((apRsnFlags & NmKeyMgmtPsk) != 0); + bool apSupportsSae = (apRsnFlags & NmKeyMgmtSae) != 0; + bool apSupportsEnterprise = ((apWpaFlags & NmKeyMgmt8021x) != 0) || ((apRsnFlags & NmKeyMgmt8021x) != 0); bool apIsOpen = (apFlags == 0) && (apWpaFlags == 0) && (apRsnFlags == 0); - bool apHasPrivacy = (apFlags & 0x1) != 0; + bool apHasPrivacy = (apFlags & NmApFlagPrivacy) != 0; wifiLog(QString("Security detection: PSK=%1, SAE=%2, Enterprise=%3, Open=%4, Privacy=%5") .arg(apSupportsPsk).arg(apSupportsSae).arg(apSupportsEnterprise).arg(apIsOpen).arg(apHasPrivacy)); @@ -448,23 +473,13 @@ void NetworkManager::connectTo(const QString& ssid, const QString& password) wifiLog("Using WPA3-SAE security"); wifiSecurity["key-mgmt"] = QString("sae"); wifiSecurity["psk"] = password; - wifiSecurity["pmf"] = 3; + wifiSecurity["pmf"] = NmPmfRequired; } else if (apSupportsPsk) { - if (apSupportsSae) - { - wifiLog("Using WPA3-SAE (transition mode - both PSK and SAE available)"); - wifiSecurity["key-mgmt"] = QString("sae"); - wifiSecurity["psk"] = password; - wifiSecurity["pmf"] = 3; // Required for SAE - } - else - { - wifiLog("Using WPA-PSK security"); - wifiSecurity["key-mgmt"] = QString("wpa-psk"); - wifiSecurity["psk"] = password; - } + wifiLog("Using WPA-PSK security"); + wifiSecurity["key-mgmt"] = QString("wpa-psk"); + wifiSecurity["psk"] = password; } else if (isHiddenNetwork) { @@ -540,17 +555,13 @@ void NetworkManager::connectTo(const QString& ssid, const QString& password) { m_lastSecurityType = "sae"; } - else if (apSupportsPsk && apSupportsSae) - { - m_lastSecurityType = "sae"; // Transition mode, we used SAE - } else if (apSupportsPsk) { m_lastSecurityType = "wpa-psk"; } else { - m_lastSecurityType = ""; // Open network + m_lastSecurityType = ""; } wifiLog(QString("Stored security type: '%1'").arg(m_lastSecurityType)); |