Hi all, I'm trying to port my Windows program WiFi Password Recovery to Linux. WiFi Password Recovery is a simple tool which scans all wireless networks stored on the device and then returns their info (such as SSID, Auth algorithm, *password...*). To keep portability I'm developing it in C++ using wxWidgets library. In particular on Linux I'm trying to use libnm to interface the program with NetworkManager. Before starting the port I decided to write a small C console program to learn libnm API and NetworkManager basis. I'm trying to get the passwords of all wireless networks saved on Ubuntu using libnm but when i call the function *nm_setting_wireless_security_get_psk *it returns null. It doesn't work with debug dump functions of libnm too. I think I should do something with NMSecretAgentOld but I don't understand what exactly and how. I also did not find any example on the Internet. I slightly modified a C example about using libnm available on internet and this is my current test code:
/* * The example shows how to list connections. Contrast this example with * list-connections-gdbus.c, which is a bit lower level and talks directly to NM * using GDBus. * * Compile with: * gcc -Wall test.cpp -o test `pkg-config --libs --cflags libnm` */ #include <glib.h>#include <stdio.h>#include <stdlib.h> #include <NetworkManager.h>#include <nm-secret-agent-old.h> /* Print details of connection */static voidshow_connection (NMConnection *connection){ printf("--- CONNECTION ---\n"); NMSettingWireless* s_con; NMSettingWirelessSecurity* wifiSec; const char* interfce; interfce = nm_connection_get_interface_name(connection); s_con = nm_connection_get_setting_wireless(connection); if (s_con) { GBytes* ssidBytes = nm_setting_wireless_get_ssid(s_con); const char* ssid = nm_utils_ssid_to_utf8((guint8 *)g_bytes_get_data(ssidBytes, NULL), g_bytes_get_size(ssidBytes)); printf("SSID: %s\nInterface: %s\n", ssid, interfce); wifiSec = nm_connection_get_setting_wireless_security(connection); if(wifiSec){ const char* auth = nm_setting_wireless_security_get_auth_alg(wifiSec); const char* encrypt = nm_setting_wireless_security_get_key_mgmt(wifiSec); const char* psk = nm_setting_wireless_security_get_psk(wifiSec); //THIS RETURNS NULL! BUT THE WPA-PSK PASSWORD IS SET! printf("Auth: %s\nEncryption: %s\nPassword: %s\n", auth, encrypt, psk); nm_connection_dump(connection); //Also in debug dump no password field } } } intmain (int argc, char *argv[]){ NMClient *client; GError *error = NULL; const GPtrArray *connections; int i; #if !GLIB_CHECK_VERSION (2, 35, 0) /* Initialize GType system */ g_type_init ();#endif if (!(client = nm_client_new (NULL, &error))) { g_message ("Error: Could not connect to NetworkManager: %s.", error->message); g_error_free (error); return EXIT_FAILURE; } if (!nm_client_get_nm_running (client)) { g_message ("Error: Can't obtain connections: NetworkManager is not running."); return EXIT_FAILURE; } /* Now the connections can be listed. */ connections = nm_client_get_connections (client); printf ("Connections:\n===================\n"); for (i = 0; i < connections->len; i++) show_connection ((NMConnection*) connections->pdata[i]); g_object_unref (client); return EXIT_SUCCESS; } This is the interesting part of program output: Program output image <https://i.stack.imgur.com/GTGHY.png> And this is the etc/NetworkManager/system_connections dump (where the psk field is set): Wireless Network file dump image <https://i.stack.imgur.com/A6qq2.png> Thanks in advance and Best Regards, Flavio
_______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org https://mail.gnome.org/mailman/listinfo/networkmanager-list