summaryrefslogtreecommitdiff
path: root/raveos-calamares-module/wifi/NetworkManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-calamares-module/wifi/NetworkManager.cpp')
-rw-r--r--raveos-calamares-module/wifi/NetworkManager.cpp95
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));