@@ -36,6 +36,13 @@ typedef enum {
3636 NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192 = 0x00002000 ,
3737} NM80211ApSecurityFlags ;
3838
39+ #define FF_DBUS_ITER_CONTINUE (dbus , iterator ) \
40+ { \
41+ if(!(dbus).lib->ffdbus_message_iter_next(iterator)) \
42+ break; \
43+ continue; \
44+ }
45+
3946static const char * detectWifiWithNm (FFWifiResult * item , FFstrbuf * buffer )
4047{
4148 FFDBusData dbus ;
@@ -72,24 +79,67 @@ static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer)
7279 if (!item -> conn .status .length )
7380 ffStrbufSetStatic (& item -> conn .status , "connected" );
7481
75- if (!item -> conn .ssid .length )
76- ffDBusGetPropertyString (& dbus , "org.freedesktop.NetworkManager" , apPath .chars , "org.freedesktop.NetworkManager.AccessPoint" , "Ssid" , & item -> conn .ssid );
77-
78- if (!item -> conn .bssid .length )
79- ffDBusGetPropertyString (& dbus , "org.freedesktop.NetworkManager" , apPath .chars , "org.freedesktop.NetworkManager.AccessPoint" , "HwAddress" , & item -> conn .bssid );
82+ DBusMessage * reply = ffDBusGetAllProperties (& dbus , "org.freedesktop.NetworkManager" , apPath .chars , "org.freedesktop.NetworkManager.AccessPoint" );
83+ if (reply == NULL )
84+ return "Failed to get access point properties" ;
8085
81- if (item -> conn .signalQuality != item -> conn .signalQuality )
86+ DBusMessageIter rootIterator ;
87+ if (!dbus .lib -> ffdbus_message_iter_init (reply , & rootIterator ) &&
88+ dbus .lib -> ffdbus_message_iter_get_arg_type (& rootIterator ) != DBUS_TYPE_ARRAY )
8289 {
83- uint32_t strengthPercent ;
84- if (ffDBusGetPropertyUint (& dbus , "org.freedesktop.NetworkManager" , apPath .chars , "org.freedesktop.NetworkManager.AccessPoint" , "Strength" , & strengthPercent ))
85- item -> conn .signalQuality = strengthPercent ;
90+ dbus .lib -> ffdbus_message_unref (reply );
91+ return "Invalid type of access point properties" ;
8692 }
8793
94+ DBusMessageIter arrayIterator ;
95+ dbus .lib -> ffdbus_message_iter_recurse (& rootIterator , & arrayIterator );
96+
8897 NM80211ApFlags flags ;
8998 NM80211ApSecurityFlags wpaFlags , rsnFlags ;
90- if (ffDBusGetPropertyUint (& dbus , "org.freedesktop.NetworkManager" , apPath .chars , "org.freedesktop.NetworkManager.AccessPoint" , "Flags" , & flags ) &&
91- ffDBusGetPropertyUint (& dbus , "org.freedesktop.NetworkManager" , apPath .chars , "org.freedesktop.NetworkManager.AccessPoint" , "WpaFlags" , & wpaFlags ) &&
92- ffDBusGetPropertyUint (& dbus , "org.freedesktop.NetworkManager" , apPath .chars , "org.freedesktop.NetworkManager.AccessPoint" , "RsnFlags" , & rsnFlags ))
99+ int flagCount = 0 ;
100+
101+ while (true)
102+ {
103+ if (dbus .lib -> ffdbus_message_iter_get_arg_type (& arrayIterator ) != DBUS_TYPE_DICT_ENTRY )
104+ FF_DBUS_ITER_CONTINUE (dbus , & arrayIterator )
105+
106+ DBusMessageIter dictIterator ;
107+ dbus .lib -> ffdbus_message_iter_recurse (& arrayIterator , & dictIterator );
108+
109+ const char * key ;
110+ dbus .lib -> ffdbus_message_iter_get_basic (& dictIterator , & key );
111+
112+ dbus .lib -> ffdbus_message_iter_next (& dictIterator );
113+
114+ if (ffStrEquals (key , "Ssid" ))
115+ {
116+ if (!item -> conn .ssid .length )
117+ ffDBusGetString (& dbus , & dictIterator , & item -> conn .ssid );
118+ }
119+ else if (ffStrEquals (key , "HwAddress" ))
120+ {
121+ if (!item -> conn .bssid .length )
122+ ffDBusGetString (& dbus , & dictIterator , & item -> conn .bssid );
123+ }
124+ else if (ffStrEquals (key , "Strength" ))
125+ {
126+ if (item -> conn .signalQuality != item -> conn .signalQuality )
127+ {
128+ uint32_t strengthPercent ;
129+ if (ffDBusGetUint (& dbus , & dictIterator , & strengthPercent ))
130+ item -> conn .signalQuality = strengthPercent ;
131+ }
132+ }
133+ else if ((ffStrEquals (key , "Flags" ) && ffDBusGetUint (& dbus , & dictIterator , & flags )) ||
134+ (ffStrEquals (key , "WpaFlags" ) && ffDBusGetUint (& dbus , & dictIterator , & wpaFlags )) ||
135+ (ffStrEquals (key , "RsnFlags" ) && ffDBusGetUint (& dbus , & dictIterator , & rsnFlags ))
136+ )
137+ ++ flagCount ;
138+
139+ FF_DBUS_ITER_CONTINUE (dbus , & arrayIterator )
140+ }
141+
142+ if (flagCount == 3 )
93143 {
94144 if ((flags & NM_802_11_AP_FLAGS_PRIVACY ) && (wpaFlags == NM_802_11_AP_SEC_NONE )
95145 && (rsnFlags == NM_802_11_AP_SEC_NONE ))
0 commit comments