From f28805fb940b6be10784372989c06fb6c754a6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 17 Jan 2023 12:45:26 +0800 Subject: [PATCH] Wifi: detect more information using libnm (Linux) --- CHANGELOG.md | 2 +- CMakeLists.txt | 5 + README.md | 1 + src/common/init.c | 2 + src/detection/wifi/wifi.h | 18 +-- src/detection/wifi/wifi_apple.m | 61 ++++---- src/detection/wifi/wifi_linux.c | 251 ++++++++++++++++++++++++++---- src/detection/wifi/wifi_windows.c | 158 +++++++------------ src/fastfetch.c | 8 +- src/fastfetch.h | 1 + src/modules/wifi.c | 22 ++- 11 files changed, 334 insertions(+), 195 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d5ebd2b8..558a90dcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ Features: * Support `WezTerm` terminal font detection (requires [`wezterm` executable](https://wezfurlong.org/wezterm/cli/general.html) being available) * Add `--shell-version` and `--terminal-version` options to disable shell / terminal version detection * Enhance `--percent-type` to allow hiding other texts (#387) -* Add Wifi module basic support for Linux +* Add Wifi module support for Linux Logos: * Raspbian (@IamNoRobot, #373) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2aeeef888..be70a5e01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ cmake_dependent_option(ENABLE_GLX "Enable glx" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_OSMESA "Enable osmesa" ON "LINUX OR BSD" OFF) cmake_dependent_option(ENABLE_OPENCL "Enable opencl" ON "LINUX OR BSD OR WIN32" OFF) cmake_dependent_option(ENABLE_LIBCJSON "Enable libcjson" ON "LINUX OR WIN32" OFF) +cmake_dependent_option(ENABLE_LIBNM "Enable libnm" ON "LINUX" OFF) cmake_dependent_option(ENABLE_FREETYPE "Enable freetype" ON "ANDROID" OFF) cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND AND NOT ANDROID" OFF) cmake_dependent_option(ENABLE_BUFFER "Enable stdout buffer" ON "LINUX OR APPLE OR BSD OR WIN32 OR ANDROID" OFF) @@ -637,6 +638,10 @@ ff_lib_enable(LIBCJSON "libcjson" "CJson" ) +ff_lib_enable(LIBNM + "libnm" + "libnm" +) ff_lib_enable(FREETYPE "freetype2" "FreeType2" diff --git a/README.md b/README.md index 339993501..a7bc7b580 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,7 @@ The following libraries are used if present at runtime: * [`libsqlite3`](https://www.sqlite.org/index.html): Needed for pkg & rpm package count. * [`librpm`](http://rpm.org/): Slower fallback for rpm package count. Needed on openSUSE. * [`libcJSON`](https://github.com/DaveGamble/cJSON): Needed for Windows Terminal font ( WSL ). +* [`libnm`](https://networkmanager.dev/docs/libnm/latest/): Used for Wifi detection on Linux. ### macOS diff --git a/src/common/init.c b/src/common/init.c index efef9190a..de797fe82 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -139,6 +139,7 @@ static void defaultConfig(FFinstance* instance) ffStrbufInitA(&instance->config.libcJSON, 0); ffStrbufInitA(&instance->config.libfreetype, 0); ffStrbufInit(&instance->config.libwlanapi); + ffStrbufInit(&instance->config.libnm); instance->config.cpuTemp = false; instance->config.gpuTemp = false; @@ -400,6 +401,7 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libcJSON); ffStrbufDestroy(&instance->config.libfreetype); ffStrbufDestroy(&instance->config.libwlanapi); + ffStrbufDestroy(&instance->config.libnm); ffStrbufDestroy(&instance->config.diskFolders); ffStrbufDestroy(&instance->config.batteryDir); diff --git a/src/detection/wifi/wifi.h b/src/detection/wifi/wifi.h index 5db32a009..fae5c46ce 100644 --- a/src/detection/wifi/wifi.h +++ b/src/detection/wifi/wifi.h @@ -16,31 +16,17 @@ struct FFWifiConnection FFstrbuf status; FFstrbuf ssid; FFstrbuf macAddress; - FFstrbuf phyType; + FFstrbuf protocol; + FFstrbuf security; double signalQuality; // Percentage double rxRate; double txRate; }; -enum FFWifiSecurityType -{ - FF_WIFI_SECURITY_UNKNOWN, - FF_WIFI_SECURITY_ENABLED, - FF_WIFI_SECURITY_DISABLED, -}; - -struct FFWifiSecurity -{ - enum FFWifiSecurityType type; - bool oneXEnabled; - FFstrbuf algorithm; -}; - typedef struct FFWifiResult { struct FFWifiInterface inf; struct FFWifiConnection conn; - struct FFWifiSecurity security; } FFWifiResult; const char* ffDetectWifi(const FFinstance* instance, FFlist* result /*list of FFWifiItem*/); diff --git a/src/detection/wifi/wifi_apple.m b/src/detection/wifi/wifi_apple.m index 4c8906dee..0616130e6 100644 --- a/src/detection/wifi/wifi_apple.m +++ b/src/detection/wifi/wifi_apple.m @@ -21,13 +21,11 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) ffStrbufInit(&item->conn.status); ffStrbufInit(&item->conn.ssid); ffStrbufInit(&item->conn.macAddress); - ffStrbufInit(&item->conn.phyType); + ffStrbufInit(&item->conn.protocol); + ffStrbufInit(&item->conn.security); item->conn.signalQuality = 0.0/0.0; item->conn.rxRate = 0.0/0.0; item->conn.txRate = 0.0/0.0; - item->security.type = FF_WIFI_SECURITY_UNKNOWN; - item->security.oneXEnabled = false; - ffStrbufInit(&item->security.algorithm); ffStrbufAppendS(&item->inf.description, inf.interfaceName.UTF8String); ffStrbufAppendS(&item->inf.status, inf.powerOn ? "Power On" : "Power Off"); @@ -43,88 +41,85 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) switch(inf.activePHYMode) { case kCWPHYModeNone: - ffStrbufAppendS(&item->conn.phyType, "none"); + ffStrbufAppendS(&item->conn.protocol, "none"); break; case kCWPHYMode11a: - ffStrbufAppendS(&item->conn.phyType, "802.11a"); + ffStrbufAppendS(&item->conn.protocol, "802.11a"); break; case kCWPHYMode11b: - ffStrbufAppendS(&item->conn.phyType, "802.11b"); + ffStrbufAppendS(&item->conn.protocol, "802.11b"); break; case kCWPHYMode11g: - ffStrbufAppendS(&item->conn.phyType, "802.11g"); + ffStrbufAppendS(&item->conn.protocol, "802.11g"); break; case kCWPHYMode11n: - ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)"); + ffStrbufAppendS(&item->conn.protocol, "802.11n (Wi-Fi 4)"); break; case kCWPHYMode11ac: - ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)"); + ffStrbufAppendS(&item->conn.protocol, "802.11ac (Wi-Fi 5)"); break; case 6 /*kCWPHYMode11ax*/: - ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)"); + ffStrbufAppendS(&item->conn.protocol, "802.11ax (Wi-Fi 6)"); break; case 7 /*kCWPHYMode11be?*/: - ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)"); + ffStrbufAppendS(&item->conn.protocol, "802.11be (Wi-Fi 7)"); break; default: - ffStrbufAppendF(&item->conn.phyType, "Unknown (%ld)", inf.activePHYMode); + ffStrbufAppendF(&item->conn.protocol, "Unknown (%ld)", inf.activePHYMode); break; } item->conn.signalQuality = inf.rssiValue >= -50 ? 100 : inf.rssiValue <= -100 ? 0 : (inf.rssiValue + 100) * 2; item->conn.txRate = inf.transmitRate; - item->security.type = inf.security != kCWSecurityNone ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED; + switch(inf.security) { - case kCWSecurityNone: - ffStrbufAppendS(&item->security.algorithm, "None"); - break; case kCWSecurityWEP: - ffStrbufAppendS(&item->security.algorithm, "WEP"); + ffStrbufAppendS(&item->conn.security, "WEP"); break; case kCWSecurityWPAPersonal: - ffStrbufAppendS(&item->security.algorithm, "WPA Personal"); + ffStrbufAppendS(&item->conn.security, "WPA Personal"); break; case kCWSecurityWPAPersonalMixed: - ffStrbufAppendS(&item->security.algorithm, "WPA Persional Mixed"); + ffStrbufAppendS(&item->conn.security, "WPA Persional Mixed"); break; case kCWSecurityWPA2Personal: - ffStrbufAppendS(&item->security.algorithm, "WPA2 Personal"); + ffStrbufAppendS(&item->conn.security, "WPA2 Personal"); break; case kCWSecurityPersonal: - ffStrbufAppendS(&item->security.algorithm, "Personal"); + ffStrbufAppendS(&item->conn.security, "Personal"); break; case kCWSecurityDynamicWEP: - ffStrbufAppendS(&item->security.algorithm, "Dynamic WEP"); + ffStrbufAppendS(&item->conn.security, "Dynamic WEP"); break; case kCWSecurityWPAEnterprise: - ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise"); + ffStrbufAppendS(&item->conn.security, "WPA Enterprise"); break; case kCWSecurityWPAEnterpriseMixed: - ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise Mixed"); + ffStrbufAppendS(&item->conn.security, "WPA Enterprise Mixed"); break; case kCWSecurityWPA2Enterprise: - ffStrbufAppendS(&item->security.algorithm, "WPA2 Enterprise"); + ffStrbufAppendS(&item->conn.security, "WPA2 Enterprise"); break; case kCWSecurityEnterprise: - ffStrbufAppendS(&item->security.algorithm, "Enterprise"); + ffStrbufAppendS(&item->conn.security, "Enterprise"); break; case kCWSecurityWPA3Personal: - ffStrbufAppendS(&item->security.algorithm, "WPA3 Personal"); + ffStrbufAppendS(&item->conn.security, "WPA3 Personal"); break; case kCWSecurityWPA3Enterprise: - ffStrbufAppendS(&item->security.algorithm, "WPA3 Enterprise"); + ffStrbufAppendS(&item->conn.security, "WPA3 Enterprise"); break; case kCWSecurityWPA3Transition: - ffStrbufAppendS(&item->security.algorithm, "WPA3 Transition"); + ffStrbufAppendS(&item->conn.security, "WPA3 Transition"); break; case 14 /*kCWSecurityOWE*/: - ffStrbufAppendS(&item->security.algorithm, "OWE"); + ffStrbufAppendS(&item->conn.security, "OWE"); break; case 15 /*kCWSecurityOWETransition*/: - ffStrbufAppendS(&item->security.algorithm, "OWE Transition"); + ffStrbufAppendS(&item->conn.security, "OWE Transition"); break; default: - ffStrbufAppendF(&item->security.algorithm, "Unknown (%ld)", inf.security); + ffStrbufAppendF(&item->conn.security, "Unknown (%ld)", inf.security); break; } } diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index 905581682..65487218b 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -1,5 +1,204 @@ #include "wifi.h" +#include "common/processing.h" +#include "common/properties.h" +#include "common/library.h" + +#include +#include + +#ifdef FF_HAVE_LIBNM + +#include +#define NM_NO_INCLUDE_EXTRA_HEADERS 1 +#include + +const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* result) +{ + FF_LIBRARY_LOAD(nm, &instance->config.libnm, "dlopen libnm failed", "libnm" FF_LIBRARY_EXTENSION, 0); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_client_new); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_client_get_devices); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_get_iface); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_get_state); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_wifi_get_type); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_device_wifi_get_active_access_point); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_ssid); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_utils_ssid_to_utf8); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_bssid); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_strength); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_max_bitrate); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_flags); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_wpa_flags); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, nm_access_point_get_rsn_flags); + + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_type_check_instance_is_a); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_bytes_get_size); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_bytes_get_data); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_free); + FF_LIBRARY_LOAD_SYMBOL_MESSAGE(nm, g_object_unref); + + NMClient* client = ffnm_client_new(NULL, NULL); + if(!client) + { + dlclose(nm); + return "Could not create NMClient"; + } + + /* Get all devices managed by NetworkManager */ + const GPtrArray* devices = ffnm_client_get_devices(client); + + /* Go through the array and process Wi-Fi devices */ + for (guint i = 0; i < devices->len; i++) + { + NMDevice *device = g_ptr_array_index(devices, i); + if (!({ + GTypeInstance *__inst = (GTypeInstance*) device; GType __t = ffnm_device_wifi_get_type(); gboolean __r; + if (!__inst) + __r = FALSE; + else if (__inst->g_class && __inst->g_class->g_type == __t) + __r = TRUE; + else + __r = ffg_type_check_instance_is_a (__inst, __t); + __r; + }) //NM_IS_DEVICE_WIFI(device) + ) + continue; + + FFWifiResult* item = (FFWifiResult*) ffListAdd(result); + ffStrbufInit(&item->inf.description); + ffStrbufInit(&item->inf.status); + ffStrbufInit(&item->conn.status); + ffStrbufInit(&item->conn.ssid); + ffStrbufInit(&item->conn.macAddress); + ffStrbufInit(&item->conn.protocol); + ffStrbufInit(&item->conn.security); + item->conn.signalQuality = 0.0/0.0; + item->conn.rxRate = 0.0/0.0; + item->conn.txRate = 0.0/0.0; + + ffStrbufAppendS(&item->inf.description, ffnm_device_get_iface(device)); + NMDeviceState state = ffnm_device_get_state(device); + switch(state) + { + case NM_DEVICE_STATE_UNKNOWN: + ffStrbufAppendS(&item->inf.status, "Unknown"); + break; + case NM_DEVICE_STATE_UNMANAGED: + ffStrbufAppendS(&item->inf.status, "Unmanaged"); + break; + case NM_DEVICE_STATE_UNAVAILABLE: + ffStrbufAppendS(&item->inf.status, "Unavailable"); + break; + case NM_DEVICE_STATE_DISCONNECTED: + ffStrbufAppendS(&item->inf.status, "Disconnected"); + break; + case NM_DEVICE_STATE_PREPARE: + ffStrbufAppendS(&item->inf.status, "Prepare"); + break; + case NM_DEVICE_STATE_CONFIG: + ffStrbufAppendS(&item->inf.status, "Config"); + break; + case NM_DEVICE_STATE_NEED_AUTH: + ffStrbufAppendS(&item->inf.status, "Need auth"); + break; + case NM_DEVICE_STATE_IP_CONFIG: + ffStrbufAppendS(&item->inf.status, "IP config"); + break; + case NM_DEVICE_STATE_IP_CHECK: + ffStrbufAppendS(&item->inf.status, "IP check"); + break; + case NM_DEVICE_STATE_SECONDARIES: + ffStrbufAppendS(&item->inf.status, "Secondaries"); + break; + case NM_DEVICE_STATE_ACTIVATED: + ffStrbufAppendS(&item->inf.status, "Activated"); + break; + case NM_DEVICE_STATE_DEACTIVATING: + ffStrbufAppendS(&item->inf.status, "Deactivating"); + break; + case NM_DEVICE_STATE_FAILED: + ffStrbufAppendS(&item->inf.status, "Failed"); + break; + } + if(state != NM_DEVICE_STATE_ACTIVATED) + continue; + + NMAccessPoint* ap = ffnm_device_wifi_get_active_access_point((NMDeviceWifi *) device); + if (!ap) + continue; + + GBytes* activeSsid = ffnm_access_point_get_ssid(ap); + if (activeSsid) + { + char* ssid = ffnm_utils_ssid_to_utf8(ffg_bytes_get_data(activeSsid, NULL), ffg_bytes_get_size(activeSsid)); + ffStrbufAppendS(&item->conn.ssid, ssid); + ffg_free(ssid); + } + + ffStrbufAppendS(&item->conn.macAddress, ffnm_access_point_get_bssid(ap)); + item->conn.signalQuality = ffnm_access_point_get_strength(ap); + item->conn.rxRate = ffnm_access_point_get_max_bitrate(ap); + + if(instance->config.allowSlowOperations) + { + FF_STRBUF_AUTO_DESTROY output; + ffStrbufInit(&output); + if(!ffProcessAppendStdOut(&output, (char* const[]){ + "iw", + "dev", + item->inf.description.chars, + "link", + NULL + }) && ffParsePropLines(output.chars, "tx bitrate: ", &item->conn.protocol)) + { + if(ffStrbufContainS(&item->conn.protocol, " HE-MCS ")) + ffStrbufSetS(&item->conn.protocol, "802.11ax (Wi-Fi 6)"); + else if(ffStrbufContainS(&item->conn.protocol, " VHT-MCS ")) + ffStrbufSetS(&item->conn.protocol, "802.11ac (Wi-Fi 5)"); + else if(ffStrbufContainS(&item->conn.protocol, " MCS ")) + ffStrbufSetS(&item->conn.protocol, "802.11n (Wi-Fi 4)"); + else + ffStrbufSetS(&item->conn.protocol, "802.11a/b/g"); + } + } + if(!item->conn.protocol.length) + ffStrbufAppendS(&item->conn.protocol, "802.11"); + + NM80211ApFlags flags = ffnm_access_point_get_flags(ap); + NM80211ApSecurityFlags wpaFlags = ffnm_access_point_get_wpa_flags(ap); + NM80211ApSecurityFlags rsnFlags = ffnm_access_point_get_rsn_flags(ap); + + if ((flags & NM_802_11_AP_FLAGS_PRIVACY) && (wpaFlags == NM_802_11_AP_SEC_NONE) + && (rsnFlags == NM_802_11_AP_SEC_NONE)) + ffStrbufAppendS(&item->conn.security, "WEP "); + if (wpaFlags != NM_802_11_AP_SEC_NONE) + ffStrbufAppendS(&item->conn.security, "WPA "); + if ((rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_PSK) + || (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { + ffStrbufAppendS(&item->conn.security, "WPA2 "); + } + if (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_SAE) { + ffStrbufAppendS(&item->conn.security, "WPA3 "); + } + if ((rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_OWE) + || (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_OWE_TM)) { + ffStrbufAppendS(&item->conn.security, "OWE "); + } + if ((wpaFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) + || (rsnFlags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { + ffStrbufAppendS(&item->conn.security, "802.1X "); + } + ffStrbufTrimRight(&item->conn.security, ' '); + } + + ffg_object_unref(client); + dlclose(nm); + + return NULL; +} + +#else + #include "common/io.h" #include @@ -26,9 +225,9 @@ static const char* detectInf(char* ifName, FFWifiResult* wifi) if(ioctl(sock, SIOCGIWNAME, &iwr) >= 0) { if(strncasecmp(iwr.u.name, "IEEE ", 5) == 0) - ffStrbufSetS(&wifi->conn.phyType, iwr.u.name + 5); + ffStrbufSetS(&wifi->conn.protocol, iwr.u.name + 5); else - ffStrbufSetS(&wifi->conn.phyType, iwr.u.name); + ffStrbufSetS(&wifi->conn.protocol, iwr.u.name); } if(ioctl(sock, SIOCGIWAP, &iwr) >= 0) @@ -50,30 +249,26 @@ static const char* detectInf(char* ifName, FFWifiResult* wifi) if(ioctl(sock, SIOCGIWENCODEEXT, &iwr) >= 0) { struct iw_encode_ext* iwe = iwr.u.data.pointer; - if(iwe->alg == IW_ENCODE_ALG_NONE) - wifi->security.type = FF_WIFI_SECURITY_DISABLED; - else + switch(iwe->alg) { - wifi->security.type = FF_WIFI_SECURITY_ENABLED; - switch(iwe->alg) - { - case IW_ENCODE_ALG_WEP: - ffStrbufAppendS(&wifi->security.algorithm, "WEP"); - break; - case IW_ENCODE_ALG_TKIP: - ffStrbufAppendS(&wifi->security.algorithm, "TKIP"); - break; - case IW_ENCODE_ALG_CCMP: - ffStrbufAppendS(&wifi->security.algorithm, "CCMP"); - break; - case IW_ENCODE_ALG_PMK: - ffStrbufAppendS(&wifi->security.algorithm, "PMK"); - break; - case IW_ENCODE_ALG_AES_CMAC: - ffStrbufAppendS(&wifi->security.algorithm, "CMAC"); - break; - } + case IW_ENCODE_ALG_WEP: + ffStrbufAppendS(&wifi->conn.security, "WEP"); + break; + case IW_ENCODE_ALG_TKIP: + ffStrbufAppendS(&wifi->conn.security, "TKIP"); + break; + case IW_ENCODE_ALG_CCMP: + ffStrbufAppendS(&wifi->conn.security, "CCMP"); + break; + case IW_ENCODE_ALG_PMK: + ffStrbufAppendS(&wifi->conn.security, "PMK"); + break; + case IW_ENCODE_ALG_AES_CMAC: + ffStrbufAppendS(&wifi->conn.security, "CMAC"); + break; } + } else { + ffStrbufAppendS(&wifi->conn.security, "unknown"); } close(sock); @@ -104,13 +299,11 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) ffStrbufInit(&item->conn.status); ffStrbufInit(&item->conn.ssid); ffStrbufInit(&item->conn.macAddress); - ffStrbufInit(&item->conn.phyType); + ffStrbufInit(&item->conn.protocol); + ffStrbufInit(&item->conn.security); item->conn.signalQuality = 0.0/0.0; item->conn.rxRate = 0.0/0.0; item->conn.txRate = 0.0/0.0; - item->security.type = FF_WIFI_SECURITY_UNKNOWN; - item->security.oneXEnabled = false; - ffStrbufInit(&item->security.algorithm); ffStrbufSetF(&path, "/sys/class/net/%s/operstate", i->if_name); if(!ffAppendFileBuffer(path.chars, &item->inf.status) || !ffStrbufEqualS(&item->inf.status, "up")) @@ -126,3 +319,5 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) return NULL; } + +#endif diff --git a/src/detection/wifi/wifi_windows.c b/src/detection/wifi/wifi_windows.c index c59375419..143c1845a 100644 --- a/src/detection/wifi/wifi_windows.c +++ b/src/detection/wifi/wifi_windows.c @@ -82,13 +82,11 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res ffStrbufInit(&item->conn.status); ffStrbufInit(&item->conn.ssid); ffStrbufInit(&item->conn.macAddress); - ffStrbufInit(&item->conn.phyType); + ffStrbufInit(&item->conn.protocol); + ffStrbufInit(&item->conn.security); item->conn.signalQuality = 0.0/0.0; item->conn.rxRate = 0.0/0.0; item->conn.txRate = 0.0/0.0; - item->security.type = FF_WIFI_SECURITY_UNKNOWN; - item->security.oneXEnabled = false; - ffStrbufInit(&item->security.algorithm); ffStrbufSetWS(&item->inf.description, ifInfo->strInterfaceDescription); convertIfStateToString(ifInfo->isState, &item->inf.status); @@ -121,40 +119,40 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res switch (connInfo->wlanAssociationAttributes.dot11PhyType) { case dot11_phy_type_fhss: - ffStrbufAppendS(&item->conn.phyType, "802.11 (FHSS)"); + ffStrbufAppendS(&item->conn.protocol, "802.11 (FHSS)"); break; case dot11_phy_type_dsss: - ffStrbufAppendS(&item->conn.phyType, "802.11 (DSSS)"); + ffStrbufAppendS(&item->conn.protocol, "802.11 (DSSS)"); break; case dot11_phy_type_irbaseband: - ffStrbufAppendS(&item->conn.phyType, "802.11 (IR)"); + ffStrbufAppendS(&item->conn.protocol, "802.11 (IR)"); break; case dot11_phy_type_ofdm: - ffStrbufAppendS(&item->conn.phyType, "802.11a"); + ffStrbufAppendS(&item->conn.protocol, "802.11a"); break; case dot11_phy_type_hrdsss: - ffStrbufAppendS(&item->conn.phyType, "802.11b"); + ffStrbufAppendS(&item->conn.protocol, "802.11b"); break; case dot11_phy_type_erp: - ffStrbufAppendS(&item->conn.phyType, "802.11g"); + ffStrbufAppendS(&item->conn.protocol, "802.11g"); break; case dot11_phy_type_ht: - ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)"); + ffStrbufAppendS(&item->conn.protocol, "802.11n (Wi-Fi 4)"); break; case 8 /*dot11_phy_type_vht*/: - ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)"); + ffStrbufAppendS(&item->conn.protocol, "802.11ac (Wi-Fi 5)"); break; case 9 /*dot11_phy_type_dmg*/: - ffStrbufAppendS(&item->conn.phyType, "802.11ad (WiGig)"); + ffStrbufAppendS(&item->conn.protocol, "802.11ad (WiGig)"); break; case 10 /*dot11_phy_type_he*/: - ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)"); + ffStrbufAppendS(&item->conn.protocol, "802.11ax (Wi-Fi 6)"); break; case 11 /*dot11_phy_type_eht*/: - ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)"); + ffStrbufAppendS(&item->conn.protocol, "802.11be (Wi-Fi 7)"); break; default: - ffStrbufAppendF(&item->conn.phyType, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType); + ffStrbufAppendF(&item->conn.protocol, "Unknown (%u)", (unsigned)connInfo->wlanAssociationAttributes.dot11PhyType); break; } @@ -162,93 +160,51 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res item->conn.rxRate = connInfo->wlanAssociationAttributes.ulRxRate; item->conn.txRate = connInfo->wlanAssociationAttributes.ulTxRate; - item->security.type = connInfo->wlanSecurityAttributes.bSecurityEnabled ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED; - item->security.oneXEnabled = connInfo->wlanSecurityAttributes.bOneXEnabled; - switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm) + if(connInfo->wlanSecurityAttributes.bSecurityEnabled) { - case DOT11_AUTH_ALGO_80211_OPEN: - ffStrbufAppendS(&item->security.algorithm, "802.11 Open"); - break; - case DOT11_AUTH_ALGO_80211_SHARED_KEY: - ffStrbufAppendS(&item->security.algorithm, "802.11 Shared"); - break; - case DOT11_AUTH_ALGO_WPA: - ffStrbufAppendS(&item->security.algorithm, "WPA"); - break; - case DOT11_AUTH_ALGO_WPA_PSK: - ffStrbufAppendS(&item->security.algorithm, "WPA-PSK"); - break; - case DOT11_AUTH_ALGO_WPA_NONE: - ffStrbufAppendS(&item->security.algorithm, "WPA-None"); - break; - case DOT11_AUTH_ALGO_RSNA: - ffStrbufAppendS(&item->security.algorithm, "RSNA"); - break; - case DOT11_AUTH_ALGO_RSNA_PSK: - ffStrbufAppendS(&item->security.algorithm, "RSNA with PSK"); - break; - case 8 /* DOT11_AUTH_ALGO_WPA3 */: - ffStrbufAppendS(&item->security.algorithm, "WPA3"); - break; - case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */: - ffStrbufAppendS(&item->security.algorithm, "WPA3-SAE"); - break; - case 10 /* DOT11_AUTH_ALGO_OWE */: - ffStrbufAppendS(&item->security.algorithm, "OWE"); - break; - case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */: - ffStrbufAppendS(&item->security.algorithm, "OWE-ENT"); - break; - default: - ffStrbufAppendF(&item->security.algorithm, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm); - break; - } - ffStrbufAppendS(&item->security.algorithm, " - "); - switch (connInfo->wlanSecurityAttributes.dot11CipherAlgorithm) - { - case DOT11_CIPHER_ALGO_NONE: - ffStrbufAppendS(&item->security.algorithm, "None"); - break; - case DOT11_CIPHER_ALGO_WEP40: - ffStrbufAppendS(&item->security.algorithm, "WEP-40"); - break; - case DOT11_CIPHER_ALGO_TKIP: - ffStrbufAppendS(&item->security.algorithm, "TKIP"); - break; - case DOT11_CIPHER_ALGO_CCMP: - ffStrbufAppendS(&item->security.algorithm, "CCMP"); - break; - case DOT11_CIPHER_ALGO_WEP104: - ffStrbufAppendS(&item->security.algorithm, "WEP-104"); - break; - case 0x06 /* DOT11_CIPHER_ALGO_BIP */: - ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-128"); - break; - case 0x08 /* DOT11_CIPHER_ALGO_GCMP */: - ffStrbufAppendS(&item->security.algorithm, "GCMP-128"); - break; - case 0x09 /* DOT11_CIPHER_ALGO_GCMP_256 */: - ffStrbufAppendS(&item->security.algorithm, "GCMP-256"); - break; - case 0x0a /* DOT11_CIPHER_ALGO_CCMP_256 */: - ffStrbufAppendS(&item->security.algorithm, "CCMP-256"); - break; - case 0x0b /* DOT11_CIPHER_ALGO_BIP_GMAC_128 */: - ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-128"); - break; - case 0x0c /* DOT11_CIPHER_ALGO_BIP_GMAC_256 */: - ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-256"); - break; - case 0x0d /* DOT11_CIPHER_ALGO_BIP_CMAC_256 */: - ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-256"); - break; - case DOT11_CIPHER_ALGO_WEP: - ffStrbufAppendS(&item->security.algorithm, "WEP"); - break; - default: - ffStrbufAppendF(&item->security.algorithm, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm); - break; + switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm) + { + case DOT11_AUTH_ALGO_80211_OPEN: + ffStrbufAppendS(&item->conn.security, "802.11 Open"); + break; + case DOT11_AUTH_ALGO_80211_SHARED_KEY: + ffStrbufAppendS(&item->conn.security, "802.11 Shared"); + break; + case DOT11_AUTH_ALGO_WPA: + ffStrbufAppendS(&item->conn.security, "WPA"); + break; + case DOT11_AUTH_ALGO_WPA_PSK: + ffStrbufAppendS(&item->conn.security, "WPA-PSK"); + break; + case DOT11_AUTH_ALGO_WPA_NONE: + ffStrbufAppendS(&item->conn.security, "WPA-None"); + break; + case DOT11_AUTH_ALGO_RSNA: + ffStrbufAppendS(&item->conn.security, "WPA2"); + break; + case DOT11_AUTH_ALGO_RSNA_PSK: + ffStrbufAppendS(&item->conn.security, "WPA2-PSK"); + break; + case 8 /* DOT11_AUTH_ALGO_WPA3 */: + ffStrbufAppendS(&item->conn.security, "WPA3"); + break; + case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */: + ffStrbufAppendS(&item->conn.security, "WPA3-SAE"); + break; + case 10 /* DOT11_AUTH_ALGO_OWE */: + ffStrbufAppendS(&item->conn.security, "OWE"); + break; + case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */: + ffStrbufAppendS(&item->conn.security, "OWE-ENT"); + break; + default: + ffStrbufAppendF(&item->conn.security, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm); + break; + } + if(connInfo->wlanSecurityAttributes.bOneXEnabled) + ffStrbufAppendS(&item->conn.security, " 802.11X"); } + ffWlanFreeMemory(connInfo); } diff --git a/src/fastfetch.c b/src/fastfetch.c index 486245dd2..d31fbf7e2 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -373,13 +373,11 @@ static inline void printCommandHelp(const char* command) "Connection status", "Connection SSID", "Connection mac address", - "Connection PHY type", + "Connection protocol", "Connection signal quality (percentage)", "Connection RX rate", "Connection TX rate", - "Security enabled", - "Security 802.1X enabled", - "Security algorithm" + "Connection Security algorithm" ); } else if(strcasecmp(command, "player-format") == 0) @@ -1236,6 +1234,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con optionParseString(key, value, &instance->config.libcJSON); else if(strcasecmp(subkey, "-wlanapi") == 0) optionParseString(key, value, &instance->config.libwlanapi); + else if(strcasecmp(subkey, "-nm") == 0) + optionParseString(key, value, &instance->config.libnm); else goto error; } diff --git a/src/fastfetch.h b/src/fastfetch.h index 084ec26f3..2f3b20753 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -163,6 +163,7 @@ typedef struct FFconfig FFstrbuf libcJSON; FFstrbuf libfreetype; FFstrbuf libwlanapi; + FFstrbuf libnm; bool cpuTemp; bool gpuTemp; diff --git a/src/modules/wifi.c b/src/modules/wifi.c index ef3d4cfb5..95c59a3b5 100644 --- a/src/modules/wifi.c +++ b/src/modules/wifi.c @@ -3,7 +3,7 @@ #include "detection/wifi/wifi.h" #define FF_WIFI_MODULE_NAME "Wifi" -#define FF_WIFI_NUM_FORMAT_ARGS 12 +#define FF_WIFI_NUM_FORMAT_ARGS 10 void ffPrintWifi(FFinstance* instance) { @@ -24,11 +24,11 @@ void ffPrintWifi(FFinstance* instance) ffPrintLogoAndKey(instance, FF_WIFI_MODULE_NAME, moduleIndex, &instance->config.wifi.key); if(item->conn.ssid.length) { - printf("%s - %s", item->conn.ssid.chars, item->conn.phyType.chars); - if(item->security.type == FF_WIFI_SECURITY_DISABLED) - puts(" - insecure"); - else - putchar('\n'); + printf("%s - %s - %s\n", + item->conn.ssid.chars, + item->conn.protocol.chars, + item->conn.security.length > 0 ? item->conn.security.chars : "insecure" + ); } else { @@ -43,13 +43,11 @@ void ffPrintWifi(FFinstance* instance) {FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.status}, {FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.ssid}, {FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.macAddress}, - {FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.phyType}, + {FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.protocol}, {FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.signalQuality}, {FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.rxRate}, {FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.txRate}, - {FF_FORMAT_ARG_TYPE_STRING, item->security.type == FF_WIFI_SECURITY_UNKNOWN ? "Unknown" : item->security.type == FF_WIFI_SECURITY_ENABLED ? "Secure" : "Insecure"}, - {FF_FORMAT_ARG_TYPE_BOOL, &item->security.oneXEnabled}, - {FF_FORMAT_ARG_TYPE_STRBUF, &item->security.algorithm}, + {FF_FORMAT_ARG_TYPE_STRBUF, &item->conn.security}, }); } @@ -58,8 +56,8 @@ void ffPrintWifi(FFinstance* instance) ffStrbufDestroy(&item->conn.status); ffStrbufDestroy(&item->conn.ssid); ffStrbufDestroy(&item->conn.macAddress); - ffStrbufDestroy(&item->conn.phyType); - ffStrbufDestroy(&item->security.algorithm); + ffStrbufDestroy(&item->conn.protocol); + ffStrbufDestroy(&item->conn.security); } } else