diff --git a/src/detection/wifi/wifi.h b/src/detection/wifi/wifi.h index 375299a76..5db32a009 100644 --- a/src/detection/wifi/wifi.h +++ b/src/detection/wifi/wifi.h @@ -22,9 +22,16 @@ struct FFWifiConnection double txRate; }; +enum FFWifiSecurityType +{ + FF_WIFI_SECURITY_UNKNOWN, + FF_WIFI_SECURITY_ENABLED, + FF_WIFI_SECURITY_DISABLED, +}; + struct FFWifiSecurity { - bool enabled; + enum FFWifiSecurityType type; bool oneXEnabled; FFstrbuf algorithm; }; diff --git a/src/detection/wifi/wifi_apple.m b/src/detection/wifi/wifi_apple.m index 4f09ae1a7..4c8906dee 100644 --- a/src/detection/wifi/wifi_apple.m +++ b/src/detection/wifi/wifi_apple.m @@ -25,7 +25,7 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) 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.type = FF_WIFI_SECURITY_UNKNOWN; item->security.oneXEnabled = false; ffStrbufInit(&item->security.algorithm); @@ -72,7 +72,7 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) } 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; + item->security.type = inf.security != kCWSecurityNone ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED; switch(inf.security) { case kCWSecurityNone: diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index 32bc40d00..905581682 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -1,57 +1,82 @@ #include "wifi.h" #include "common/io.h" -#include "common/processing.h" -#include "common/properties.h" #include +#include +#include +#include static const char* detectInf(char* ifName, FFWifiResult* wifi) { - const char* error = NULL; - FF_STRBUF_AUTO_DESTROY output; - ffStrbufInit(&output); - if((error = ffProcessAppendStdOut(&output, (char* const[]){ - "iw", - "dev", - ifName, - "link", - NULL - }))) - return error; + int sock = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0); + if(sock < 0) + return "socket() failed"; - if(output.length == 0) - return "iw command execution failed"; + struct iwreq iwr; - if(!ffParsePropLines(output.chars, "Connected to ", &wifi->conn.macAddress)) + strncpy(iwr.ifr_name, ifName, IFNAMSIZ); + ffStrbufEnsureFree(&wifi->conn.ssid, IW_ESSID_MAX_SIZE); + iwr.u.essid.pointer = (caddr_t) wifi->conn.ssid.chars; + iwr.u.essid.length = IW_ESSID_MAX_SIZE + 1; + iwr.u.essid.flags = 0; + if(ioctl(sock, SIOCGIWESSID, &iwr) >= 0) + ffStrbufRecalculateLength(&wifi->conn.ssid); + + if(ioctl(sock, SIOCGIWNAME, &iwr) >= 0) { - ffStrbufAppendS(&wifi->conn.status, "Disconnected"); - return NULL; - } - - FF_STRBUF_AUTO_DESTROY temp; - ffStrbufInit(&temp); - - ffStrbufAppendS(&wifi->conn.status, "Connected"); - ffStrbufSubstrBefore(&wifi->conn.macAddress, ' '); - ffParsePropLines(output.chars, "SSID: ", &wifi->conn.ssid); - - if(ffParsePropLines(output.chars, "signal: ", &temp)) - wifi->conn.signalQuality = ffStrbufToDouble(&temp); - - if(ffParsePropLines(output.chars, "tx bitrate: ", &temp)) - { - if(ffStrbufContainS(&temp, " HE-MCS ")) - ffStrbufAppendS(&wifi->conn.phyType, "802.11ax (Wi-Fi 6)"); - else if(ffStrbufContainS(&temp, " VHT-MCS ")) - ffStrbufAppendS(&wifi->conn.phyType, "802.11ac (Wi-Fi 5)"); - else if(ffStrbufContainS(&temp, " MCS ")) - ffStrbufAppendS(&wifi->conn.phyType, "802.11n (Wi-Fi 4)"); + if(strncasecmp(iwr.u.name, "IEEE ", 5) == 0) + ffStrbufSetS(&wifi->conn.phyType, iwr.u.name + 5); else - ffStrbufAppendS(&wifi->conn.phyType, "802.11a/b/g"); + ffStrbufSetS(&wifi->conn.phyType, iwr.u.name); } - wifi->security.enabled = true; //FIXME: Unable to find this info. Set it true so that fastfetch won't print `insecure` + if(ioctl(sock, SIOCGIWAP, &iwr) >= 0) + { + for(int i = 0; i < 6; ++i) + ffStrbufAppendF(&wifi->conn.macAddress, "%.2X-", (uint8_t) iwr.u.ap_addr.sa_data[i]); + ffStrbufTrimRight(&wifi->conn.macAddress, '-'); + } + + //FIXME: doesn't work + if(ioctl(sock, SIOCGIWSPY, &iwr) >= 0) + wifi->conn.signalQuality = iwr.u.qual.level; + + //FIXME: doesn't work + struct iw_encode_ext iwe; + iwr.u.data.pointer = &iwe; + iwr.u.data.length = sizeof(iwe); + iwr.u.data.flags = 0; + 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 + { + 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; + } + } + } + + close(sock); return NULL; } @@ -83,7 +108,7 @@ const char* ffDetectWifi(const FFinstance* instance, FFlist* result) 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.type = FF_WIFI_SECURITY_UNKNOWN; item->security.oneXEnabled = false; ffStrbufInit(&item->security.algorithm); diff --git a/src/detection/wifi/wifi_windows.c b/src/detection/wifi/wifi_windows.c index a972939d7..c59375419 100644 --- a/src/detection/wifi/wifi_windows.c +++ b/src/detection/wifi/wifi_windows.c @@ -86,7 +86,7 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res 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.type = FF_WIFI_SECURITY_UNKNOWN; item->security.oneXEnabled = false; ffStrbufInit(&item->security.algorithm); @@ -162,7 +162,7 @@ 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.enabled = connInfo->wlanSecurityAttributes.bSecurityEnabled; + item->security.type = connInfo->wlanSecurityAttributes.bSecurityEnabled ? FF_WIFI_SECURITY_ENABLED : FF_WIFI_SECURITY_DISABLED; item->security.oneXEnabled = connInfo->wlanSecurityAttributes.bOneXEnabled; switch (connInfo->wlanSecurityAttributes.dot11AuthAlgorithm) { diff --git a/src/modules/wifi.c b/src/modules/wifi.c index 5a791e4fd..ef3d4cfb5 100644 --- a/src/modules/wifi.c +++ b/src/modules/wifi.c @@ -25,7 +25,7 @@ void ffPrintWifi(FFinstance* instance) if(item->conn.ssid.length) { printf("%s - %s", item->conn.ssid.chars, item->conn.phyType.chars); - if(!item->security.enabled) + if(item->security.type == FF_WIFI_SECURITY_DISABLED) puts(" - insecure"); else putchar('\n'); @@ -47,7 +47,7 @@ void ffPrintWifi(FFinstance* instance) {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_BOOL, &item->security.enabled}, + {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}, });