diff --git a/src/util/network/manager.cpp b/src/util/network/manager.cpp index fb2d25bb..2be92a40 100644 --- a/src/util/network/manager.cpp +++ b/src/util/network/manager.cpp @@ -566,27 +566,26 @@ void NetworkManager::activate_connection(std::string p1, std::string p2, std::st Glib::VariantStringBase::create_object_path(path2, p2); Glib::VariantStringBase::create_object_path(path3, p3); auto paths = Glib::VariantContainerBase::create_tuple({path1, path2, path3}); - // auto data = Glib::VariantContainerBase::create_tuple(paths); try { nm_proxy->call("ActivateConnection", paths); } catch (...) + {} +} + +void NetworkManager::request_password(std::string device_path, std::string ap_path) +{ + if (device_path.find("/Devices/") != std::string::npos) { - /* It's most likely a WIFI AP with no password set. Let's ask */ - std::cout << p2 << std::endl; - /* No, it's not a regex */ - if (p2.find("/Devices/") != std::string::npos) + auto device = std::dynamic_pointer_cast(all_devices[device_path]); + if (device) { - auto device = std::dynamic_pointer_cast(all_devices[p2]); - if (device) - { - popup_cache_p2 = p2; - popup_cache_p3 = p3; - auto ap = device->get_access_points()[p3]; - popup_label.set_label("Preshared Key required for Access Point '" + ap->get_ssid() + "'"); - popup_window.present(); - popup_window.get_focus(); - } + popup_cache_device = device_path; + popup_cache_ap = ap_path; + auto ap = device->get_access_points()[ap_path]; + popup_label.set_label("Preshared Key required for Access Point '" + ap->get_ssid() + "'"); + popup_window.present(); + popup_window.get_focus(); } } } @@ -717,13 +716,13 @@ void NetworkManager::submit_password() } popup_entry.set_text(""); - auto wifi = std::dynamic_pointer_cast(all_devices[popup_cache_p2]); + auto wifi = std::dynamic_pointer_cast(all_devices[popup_cache_device]); if (!wifi) { return; } - auto ap = wifi->get_access_points()[popup_cache_p3]; + auto ap = wifi->get_access_points()[popup_cache_ap]; if (!ap) { return; @@ -789,7 +788,7 @@ void NetworkManager::submit_password() // Object paths (o) // ------------------------ auto device_path = - Glib::Variant::create(popup_cache_p2); + Glib::Variant::create(popup_cache_device); // Access point path is "/" → NM autoselects AP matching SSID auto ap_path = Glib::Variant::create("/"); // ------------------------ diff --git a/src/util/network/manager.hpp b/src/util/network/manager.hpp index fb7c69fb..5c80fd48 100644 --- a/src/util/network/manager.hpp +++ b/src/util/network/manager.hpp @@ -61,7 +61,7 @@ class NetworkManager Gtk::Label popup_label; Gtk::Entry popup_entry; - std::string popup_cache_p2 = "", popup_cache_p3 = ""; + std::string popup_cache_device = "", popup_cache_ap = ""; inline static std::weak_ptr instance; public: @@ -178,6 +178,7 @@ class NetworkManager void mobile_global_set(bool value); void networking_global_set(bool value); void submit_password(); + void request_password(std::string device_path, std::string ap_path); std::shared_ptr get_setting_for_ssid(std::string ssid); }; diff --git a/src/util/network/network-widget.cpp b/src/util/network/network-widget.cpp index 9d4816ca..786fd1d0 100644 --- a/src/util/network/network-widget.cpp +++ b/src/util/network/network-widget.cpp @@ -257,9 +257,9 @@ void DeviceControlWidget::add_access_point(std::shared_ptr ap) auto click = Gtk::GestureClick::create(); auto sig = click->signal_released().connect( - [this, path] (int, double, double) + [this, path, widget] (int, double, double) { - selected_access_point(path); + selected_access_point(path, widget); }); widget->add_controller(click); widget->signals.push_back(sig); @@ -268,7 +268,7 @@ void DeviceControlWidget::add_access_point(std::shared_ptr ap) sort_access_points(); } -void DeviceControlWidget::selected_access_point(std::string path) +void DeviceControlWidget::selected_access_point(std::string path, std::shared_ptr widget) { auto wifi = std::dynamic_pointer_cast(network); if (!wifi) @@ -286,7 +286,13 @@ void DeviceControlWidget::selected_access_point(std::string path) wifi->disconnect(); } else { - wifi->connect(path); + if (widget->get_ap()->has_saved_password()) + { + wifi->connect(path); + } else + { + NetworkManager::getInstance()->request_password(wifi->get_path(), path); + } } } diff --git a/src/util/network/network-widget.hpp b/src/util/network/network-widget.hpp index a28441af..c596dda2 100644 --- a/src/util/network/network-widget.hpp +++ b/src/util/network/network-widget.hpp @@ -41,7 +41,7 @@ class DeviceControlWidget : public Gtk::Box ~DeviceControlWidget(); void add_access_point(std::shared_ptr ap); void remove_access_point(std::string path); - void selected_access_point(std::string path); + void selected_access_point(std::string path, std::shared_ptr widget); void sort_access_points(); std::string type; };