diff --git a/CMakeLists.txt b/CMakeLists.txt index 073c07e3c..a2049b950 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -437,7 +437,7 @@ elseif(APPLE) src/detection/terminalshell/terminalshell_linux.c src/detection/uptime/uptime_bsd.c src/detection/users/users_linux.c - src/detection/wifi/wifi_nosupport.c + src/detection/wifi/wifi_apple.m src/detection/wmtheme/wmtheme_apple.m src/util/apple/cf_helpers.c src/util/apple/osascript.m @@ -641,6 +641,7 @@ if(APPLE) PRIVATE "-framework OpenGL" PRIVATE "-framework OpenCL" PRIVATE "-framework Cocoa" + PRIVATE "-framework CoreWLAN" PRIVATE "-weak_framework MediaRemote -F /System/Library/PrivateFrameworks" ) elseif(WIN32) diff --git a/src/detection/wifi/wifi.h b/src/detection/wifi/wifi.h index e16c95e7d..375299a76 100644 --- a/src/detection/wifi/wifi.h +++ b/src/detection/wifi/wifi.h @@ -26,8 +26,7 @@ struct FFWifiSecurity { bool enabled; bool oneXEnabled; - FFstrbuf authAlgo; - FFstrbuf cipherAlgo; + FFstrbuf algorithm; }; typedef struct FFWifiResult diff --git a/src/detection/wifi/wifi_apple.m b/src/detection/wifi/wifi_apple.m new file mode 100644 index 000000000..8d96778f1 --- /dev/null +++ b/src/detection/wifi/wifi_apple.m @@ -0,0 +1,132 @@ +#include "wifi.h" + +#import + +const char* ffDetectWifi(const FFinstance* instance, FFlist* result) +{ + FF_UNUSED(instance); + + NSArray* interfaces = CWWiFiClient.sharedWiFiClient.interfaces; + if(!interfaces) + return "CWWiFiClient.sharedWiFiClient.interfaces is nil"; + + if(interfaces.count == 0) + return "No wifi interfaces found"; + + for(CWInterface* inf in interfaces) + { + 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.phyType); + item->conn.signalQuality = 0.0/0.0; + item->conn.rxRate = 0.0/0.0; + item->conn.txRate = 0.0/0.0; + item->security.enabled = false; + 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"); + if(!inf.powerOn) + continue; + + ffStrbufAppendS(&item->conn.status, inf.serviceActive ? "Active" : "Inactive"); + if(!inf.serviceActive) + continue; + + ffStrbufAppendS(&item->conn.ssid, inf.ssid.UTF8String); + ffStrbufAppendS(&item->conn.macAddress, inf.hardwareAddress.UTF8String); + switch(inf.activePHYMode) + { + case kCWPHYModeNone: + ffStrbufAppendS(&item->conn.phyType, "none"); + break; + case kCWPHYMode11a: + ffStrbufAppendS(&item->conn.phyType, "802.11a"); + break; + case kCWPHYMode11b: + ffStrbufAppendS(&item->conn.phyType, "802.11b"); + break; + case kCWPHYMode11g: + ffStrbufAppendS(&item->conn.phyType, "802.11g"); + break; + case kCWPHYMode11n: + ffStrbufAppendS(&item->conn.phyType, "802.11n (Wi-Fi 4)"); + break; + case kCWPHYMode11ac: + ffStrbufAppendS(&item->conn.phyType, "802.11ac (Wi-Fi 5)"); + break; + case kCWPHYMode11ax: + ffStrbufAppendS(&item->conn.phyType, "802.11ax (Wi-Fi 6)"); + break; + case 7 /*kCWPHYMode11be?*/: + ffStrbufAppendS(&item->conn.phyType, "802.11be (Wi-Fi 7)"); + break; + default: + ffStrbufAppendF(&item->conn.phyType, "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.enabled = inf.security != kCWSecurityNone; + switch(inf.security) + { + case kCWSecurityNone: + ffStrbufAppendS(&item->security.algorithm, "None"); + break; + case kCWSecurityWEP: + ffStrbufAppendS(&item->security.algorithm, "WEP"); + break; + case kCWSecurityWPAPersonal: + ffStrbufAppendS(&item->security.algorithm, "WPA Personal"); + break; + case kCWSecurityWPAPersonalMixed: + ffStrbufAppendS(&item->security.algorithm, "WPA Persional Mixed"); + break; + case kCWSecurityWPA2Personal: + ffStrbufAppendS(&item->security.algorithm, "WPA2 Personal"); + break; + case kCWSecurityPersonal: + ffStrbufAppendS(&item->security.algorithm, "Personal"); + break; + case kCWSecurityDynamicWEP: + ffStrbufAppendS(&item->security.algorithm, "Dynamic WEP"); + break; + case kCWSecurityWPAEnterprise: + ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise"); + break; + case kCWSecurityWPAEnterpriseMixed: + ffStrbufAppendS(&item->security.algorithm, "WPA Enterprise Mixed"); + break; + case kCWSecurityWPA2Enterprise: + ffStrbufAppendS(&item->security.algorithm, "WPA2 Enterprise"); + break; + case kCWSecurityEnterprise: + ffStrbufAppendS(&item->security.algorithm, "Enterprise"); + break; + case kCWSecurityWPA3Personal: + ffStrbufAppendS(&item->security.algorithm, "WPA3 Personal"); + break; + case kCWSecurityWPA3Enterprise: + ffStrbufAppendS(&item->security.algorithm, "WPA3 Enterprise"); + break; + case kCWSecurityWPA3Transition: + ffStrbufAppendS(&item->security.algorithm, "WPA3 Transition"); + break; + case 14 /*kCWSecurityOWE*/: + ffStrbufAppendS(&item->security.algorithm, "OWE"); + break; + case 15 /*kCWSecurityOWETransition*/: + ffStrbufAppendS(&item->security.algorithm, "OWE Transition"); + break; + default: + ffStrbufAppendF(&item->security.algorithm, "Unknown (%ld)", inf.security); + break; + } + } + return NULL; +} diff --git a/src/detection/wifi/wifi_windows.c b/src/detection/wifi/wifi_windows.c index 4e5dc5e2a..f113197f5 100644 --- a/src/detection/wifi/wifi_windows.c +++ b/src/detection/wifi/wifi_windows.c @@ -88,8 +88,7 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) item->conn.txRate = 0.0/0.0; item->security.enabled = false; item->security.oneXEnabled = false; - ffStrbufInit(&item->security.authAlgo); - ffStrbufInit(&item->security.cipherAlgo); + ffStrbufInit(&item->security.algorithm); ffStrbufSetWS(&item->inf.description, ifInfo->strInterfaceDescription); convertIfStateToString(ifInfo->isState, &item->inf.status); @@ -168,85 +167,86 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm) { case DOT11_AUTH_ALGO_80211_OPEN: - ffStrbufAppendS(&item->security.authAlgo, "802.11 Open"); + ffStrbufAppendS(&item->security.algorithm, "802.11 Open"); break; case DOT11_AUTH_ALGO_80211_SHARED_KEY: - ffStrbufAppendS(&item->security.authAlgo, "802.11 Shared"); + ffStrbufAppendS(&item->security.algorithm, "802.11 Shared"); break; case DOT11_AUTH_ALGO_WPA: - ffStrbufAppendS(&item->security.authAlgo, "WPA"); + ffStrbufAppendS(&item->security.algorithm, "WPA"); break; case DOT11_AUTH_ALGO_WPA_PSK: - ffStrbufAppendS(&item->security.authAlgo, "WPA-PSK"); + ffStrbufAppendS(&item->security.algorithm, "WPA-PSK"); break; case DOT11_AUTH_ALGO_WPA_NONE: - ffStrbufAppendS(&item->security.authAlgo, "WPA-None"); + ffStrbufAppendS(&item->security.algorithm, "WPA-None"); break; case DOT11_AUTH_ALGO_RSNA: - ffStrbufAppendS(&item->security.authAlgo, "RSNA"); + ffStrbufAppendS(&item->security.algorithm, "RSNA"); break; case DOT11_AUTH_ALGO_RSNA_PSK: - ffStrbufAppendS(&item->security.authAlgo, "RSNA with PSK"); + ffStrbufAppendS(&item->security.algorithm, "RSNA with PSK"); break; case 8 /* DOT11_AUTH_ALGO_WPA3 */: - ffStrbufAppendS(&item->security.authAlgo, "WPA3"); + ffStrbufAppendS(&item->security.algorithm, "WPA3"); break; case 9 /* DOT11_AUTH_ALGO_WPA3_SAE */: - ffStrbufAppendS(&item->security.authAlgo, "WPA3-SAE"); + ffStrbufAppendS(&item->security.algorithm, "WPA3-SAE"); break; case 10 /* DOT11_AUTH_ALGO_OWE */: - ffStrbufAppendS(&item->security.authAlgo, "OWE"); + ffStrbufAppendS(&item->security.algorithm, "OWE"); break; case 11 /* DOT11_AUTH_ALGO_WPA3_ENT */: - ffStrbufAppendS(&item->security.authAlgo, "OWE-ENT"); + ffStrbufAppendS(&item->security.algorithm, "OWE-ENT"); break; default: - ffStrbufAppendF(&item->security.authAlgo, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11AuthAlgorithm); + 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.cipherAlgo, "None"); + ffStrbufAppendS(&item->security.algorithm, "None"); break; case DOT11_CIPHER_ALGO_WEP40: - ffStrbufAppendS(&item->security.cipherAlgo, "WEP-40"); + ffStrbufAppendS(&item->security.algorithm, "WEP-40"); break; case DOT11_CIPHER_ALGO_TKIP: - ffStrbufAppendS(&item->security.cipherAlgo, "TKIP"); + ffStrbufAppendS(&item->security.algorithm, "TKIP"); break; case DOT11_CIPHER_ALGO_CCMP: - ffStrbufAppendS(&item->security.cipherAlgo, "CCMP"); + ffStrbufAppendS(&item->security.algorithm, "CCMP"); break; case DOT11_CIPHER_ALGO_WEP104: - ffStrbufAppendS(&item->security.cipherAlgo, "WEP-104"); + ffStrbufAppendS(&item->security.algorithm, "WEP-104"); break; case 0x06 /* DOT11_CIPHER_ALGO_BIP */: - ffStrbufAppendS(&item->security.cipherAlgo, "BIP-CMAC-128"); + ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-128"); break; case 0x08 /* DOT11_CIPHER_ALGO_GCMP */: - ffStrbufAppendS(&item->security.cipherAlgo, "GCMP-128"); + ffStrbufAppendS(&item->security.algorithm, "GCMP-128"); break; case 0x09 /* DOT11_CIPHER_ALGO_GCMP_256 */: - ffStrbufAppendS(&item->security.cipherAlgo, "GCMP-256"); + ffStrbufAppendS(&item->security.algorithm, "GCMP-256"); break; case 0x0a /* DOT11_CIPHER_ALGO_CCMP_256 */: - ffStrbufAppendS(&item->security.cipherAlgo, "CCMP-256"); + ffStrbufAppendS(&item->security.algorithm, "CCMP-256"); break; case 0x0b /* DOT11_CIPHER_ALGO_BIP_GMAC_128 */: - ffStrbufAppendS(&item->security.cipherAlgo, "BIP-GMAC-128"); + ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-128"); break; case 0x0c /* DOT11_CIPHER_ALGO_BIP_GMAC_256 */: - ffStrbufAppendS(&item->security.cipherAlgo, "BIP-GMAC-256"); + ffStrbufAppendS(&item->security.algorithm, "BIP-GMAC-256"); break; case 0x0d /* DOT11_CIPHER_ALGO_BIP_CMAC_256 */: - ffStrbufAppendS(&item->security.cipherAlgo, "BIP-CMAC-256"); + ffStrbufAppendS(&item->security.algorithm, "BIP-CMAC-256"); break; case DOT11_CIPHER_ALGO_WEP: - ffStrbufAppendS(&item->security.cipherAlgo, "WEP"); + ffStrbufAppendS(&item->security.algorithm, "WEP"); break; default: - ffStrbufAppendF(&item->security.cipherAlgo, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm); + ffStrbufAppendF(&item->security.algorithm, "Unknown (%u)", (unsigned)connInfo->wlanSecurityAttributes.dot11CipherAlgorithm); break; } ffWlanFreeMemory(connInfo); diff --git a/src/fastfetch.c b/src/fastfetch.c index 44b492cca..f0815cae4 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -364,8 +364,7 @@ static inline void printCommandHelp(const char* command) "Connection TX rate", "Security enabled", "Security 802.1X enabled", - "Security auth algorithm", - "Security cipher algorithm" + "Security algorithm" ); } else if(strcasecmp(command, "player-format") == 0) diff --git a/src/modules/wifi.c b/src/modules/wifi.c index 7f075d4b4..596c18baa 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 13 +#define FF_WIFI_NUM_FORMAT_ARGS 12 void ffPrintWifi(FFinstance* instance) { @@ -49,8 +49,7 @@ void ffPrintWifi(FFinstance* instance) {FF_FORMAT_ARG_TYPE_DOUBLE, &item->conn.txRate}, {FF_FORMAT_ARG_TYPE_BOOL, &item->security.enabled}, {FF_FORMAT_ARG_TYPE_BOOL, &item->security.oneXEnabled}, - {FF_FORMAT_ARG_TYPE_STRBUF, &item->security.authAlgo}, - {FF_FORMAT_ARG_TYPE_STRBUF, &item->security.cipherAlgo}, + {FF_FORMAT_ARG_TYPE_STRBUF, &item->security.algorithm}, }); } @@ -60,8 +59,7 @@ void ffPrintWifi(FFinstance* instance) ffStrbufDestroy(&item->conn.ssid); ffStrbufDestroy(&item->conn.macAddress); ffStrbufDestroy(&item->conn.phyType); - ffStrbufDestroy(&item->security.authAlgo); - ffStrbufDestroy(&item->security.cipherAlgo); + ffStrbufDestroy(&item->security.algorithm); } } else