diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index cd99a271a..b1fcd6e89 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -36,6 +36,13 @@ typedef enum { NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192 = 0x00002000, } NM80211ApSecurityFlags; +#define FF_DBUS_ITER_CONTINUE(dbus, iterator) \ + { \ + if(!(dbus).lib->ffdbus_message_iter_next(iterator)) \ + break; \ + continue; \ + } + static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer) { FFDBusData dbus; @@ -72,24 +79,67 @@ static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer) if (!item->conn.status.length) ffStrbufSetStatic(&item->conn.status, "connected"); - if (!item->conn.ssid.length) - ffDBusGetPropertyString(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Ssid", &item->conn.ssid); + DBusMessage* reply = ffDBusGetAllProperties(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint"); + if(reply == NULL) + return "Failed to get access point properties"; - if (!item->conn.bssid.length) - ffDBusGetPropertyString(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "HwAddress", &item->conn.bssid); - - if (item->conn.signalQuality != item->conn.signalQuality) + DBusMessageIter rootIterator; + if(!dbus.lib->ffdbus_message_iter_init(reply, &rootIterator) && + dbus.lib->ffdbus_message_iter_get_arg_type(&rootIterator) != DBUS_TYPE_ARRAY) { - uint32_t strengthPercent; - if (ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Strength", &strengthPercent)) - item->conn.signalQuality = strengthPercent; + dbus.lib->ffdbus_message_unref(reply); + return "Invalid type of access point properties"; } + DBusMessageIter arrayIterator; + dbus.lib->ffdbus_message_iter_recurse(&rootIterator, &arrayIterator); + NM80211ApFlags flags; NM80211ApSecurityFlags wpaFlags, rsnFlags; - if (ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "Flags", &flags) && - ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars, "org.freedesktop.NetworkManager.AccessPoint", "WpaFlags", &wpaFlags) && - ffDBusGetPropertyUint(&dbus, "org.freedesktop.NetworkManager", apPath.chars , "org.freedesktop.NetworkManager.AccessPoint", "RsnFlags", &rsnFlags)) + int flagCount = 0; + + while(true) + { + if(dbus.lib->ffdbus_message_iter_get_arg_type(&arrayIterator) != DBUS_TYPE_DICT_ENTRY) + FF_DBUS_ITER_CONTINUE(dbus, &arrayIterator) + + DBusMessageIter dictIterator; + dbus.lib->ffdbus_message_iter_recurse(&arrayIterator, &dictIterator); + + const char* key; + dbus.lib->ffdbus_message_iter_get_basic(&dictIterator, &key); + + dbus.lib->ffdbus_message_iter_next(&dictIterator); + + if (ffStrEquals(key, "Ssid")) + { + if (!item->conn.ssid.length) + ffDBusGetString(&dbus, &dictIterator, &item->conn.ssid); + } + else if (ffStrEquals(key, "HwAddress")) + { + if (!item->conn.bssid.length) + ffDBusGetString(&dbus, &dictIterator, &item->conn.bssid); + } + else if (ffStrEquals(key, "Strength")) + { + if (item->conn.signalQuality != item->conn.signalQuality) + { + uint32_t strengthPercent; + if (ffDBusGetUint(&dbus, &dictIterator, &strengthPercent)) + item->conn.signalQuality = strengthPercent; + } + } + else if ((ffStrEquals(key, "Flags") && ffDBusGetUint(&dbus, &dictIterator, &flags)) || + (ffStrEquals(key, "WpaFlags") && ffDBusGetUint(&dbus, &dictIterator, &wpaFlags)) || + (ffStrEquals(key, "RsnFlags") && ffDBusGetUint(&dbus, &dictIterator, &rsnFlags)) + ) + ++flagCount; + + FF_DBUS_ITER_CONTINUE(dbus, &arrayIterator) + } + + if (flagCount == 3) { if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpaFlags == NM_802_11_AP_SEC_NONE) && (rsnFlags == NM_802_11_AP_SEC_NONE))