Skip to content

Commit

Permalink
Made wifi connect to correct iface
Browse files Browse the repository at this point in the history
  • Loading branch information
András committed Aug 13, 2024
1 parent 1cb6618 commit 69bc740
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 27 deletions.
27 changes: 15 additions & 12 deletions cosmic-applet-network/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ impl CosmicNetworkApplet {

#[derive(Debug, Clone)]
pub(crate) enum Message {
ActivateKnownWifi(String),
ActivateKnownWifi(String, String),
Disconnect(String),
TogglePopup,
CloseRequested(window::Id),
Expand Down Expand Up @@ -317,7 +317,7 @@ impl cosmic::Application for CosmicNetworkApplet {
success,
req,
} => {
if let NetworkManagerRequest::SelectAccessPoint(ssid) = &req {
if let NetworkManagerRequest::SelectAccessPoint(ssid, iface) = &req {
let conn_match = self
.new_connection
.as_ref()
Expand All @@ -344,11 +344,11 @@ impl cosmic::Application for CosmicNetworkApplet {
{
self.failed_known_ssids.insert(ssid.clone());
}
} else if let NetworkManagerRequest::Password(ssid, _) = &req {
} else if let NetworkManagerRequest::Password(ssid, _, iface) = &req {
if let Some(NewConnectionState::Waiting(access_point)) =
self.new_connection.clone()
{
if !success && ssid == &access_point.ssid {
if !success && ssid == &access_point.ssid && iface == &access_point.interface {
self.new_connection =
Some(NewConnectionState::Failure(access_point.clone()));
} else {
Expand All @@ -359,7 +359,7 @@ impl cosmic::Application for CosmicNetworkApplet {
access_point, ..
}) = self.new_connection.clone()
{
if success && ssid == &access_point.ssid {
if success && ssid == &access_point.ssid && iface == &access_point.interface {
self.new_connection = None;
self.show_visible_networks = false;
}
Expand All @@ -369,7 +369,7 @@ impl cosmic::Application for CosmicNetworkApplet {
.as_ref()
.map(|c| c.ssid()).is_some_and(|ssid| {
state.active_conns.iter().any(|c|
matches!(c, ActiveConnectionInfo::WiFi { name, state: ActiveConnectionState::Activated, .. } if ssid == name)
matches!(c, ActiveConnectionInfo::WiFi { name, state: ActiveConnectionState::Activated, iface, .. } if ssid == name)
)
}) {
self.new_connection = None;
Expand Down Expand Up @@ -397,6 +397,7 @@ impl cosmic::Application for CosmicNetworkApplet {

let _ = tx.unbounded_send(NetworkManagerRequest::SelectAccessPoint(
access_point.ssid.clone(),
access_point.interface.clone(),
));

self.new_connection = Some(NewConnectionState::EnterPassword {
Expand Down Expand Up @@ -431,26 +432,27 @@ impl cosmic::Application for CosmicNetworkApplet {
let _ = tx.unbounded_send(NetworkManagerRequest::Password(
access_point.ssid.clone(),
password,
access_point.interface.clone(),
));
self.new_connection
.replace(NewConnectionState::Waiting(access_point));
};
}
Message::ActivateKnownWifi(ssid) => {
Message::ActivateKnownWifi(ssid, iface) => {
let tx = if let Some(tx) = self.nm_sender.as_ref() {
if let Some(ap) = self
.nm_state
.known_access_points
.iter_mut()
.find(|c| c.ssid == ssid)
.find(|c| c.ssid == ssid && c.interface == iface)
{
ap.working = true;
}
tx
} else {
return Command::none();
};
let _ = tx.unbounded_send(NetworkManagerRequest::SelectAccessPoint(ssid));
let _ = tx.unbounded_send(NetworkManagerRequest::SelectAccessPoint(ssid, iface));
}
Message::CancelNewConnection => {
self.new_connection = None;
Expand Down Expand Up @@ -800,9 +802,10 @@ impl cosmic::Application for CosmicNetworkApplet {
| DeviceState::Unknown
| DeviceState::Unmanaged
| DeviceState::Disconnected
| DeviceState::NeedAuth => {
btn.on_press(Message::ActivateKnownWifi(known.ssid.clone()))
}
| DeviceState::NeedAuth => btn.on_press(Message::ActivateKnownWifi(
known.ssid.clone(),
known.interface.clone(),
)),
DeviceState::Activated => btn.on_press(Message::Disconnect(known.ssid.clone())),
_ => btn,
};
Expand Down
43 changes: 28 additions & 15 deletions cosmic-applet-network/src/network_manager/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,19 @@ async fn start_listening(
};
_ = output.send(response).await;
}
Some(NetworkManagerRequest::Password(ssid, password)) => {
Some(NetworkManagerRequest::Password(ssid, password, iface)) => {
let nm_state = NetworkManagerState::new(&conn).await.unwrap_or_default();
let success = nm_state
.connect_wifi(&conn, &ssid, Some(&password))
.connect_wifi(&conn, &ssid, Some(&password), &iface)
.await
.is_ok();

let status = Some(NetworkManagerEvent::RequestResponse {
req: NetworkManagerRequest::Password(ssid.clone(), password.clone()),
req: NetworkManagerRequest::Password(
ssid.clone(),
password.clone(),
iface.clone(),
),
success,
state: NetworkManagerState::new(&conn).await.unwrap_or_default(),
});
Expand All @@ -184,25 +188,29 @@ async fn start_listening(
} else {
_ = output
.send(NetworkManagerEvent::RequestResponse {
req: NetworkManagerRequest::Password(ssid, password),
req: NetworkManagerRequest::Password(ssid, password, iface),
success: false,
state: NetworkManagerState::new(&conn).await.unwrap_or_default(),
})
.await;
}
}
Some(NetworkManagerRequest::SelectAccessPoint(ssid)) => {
Some(NetworkManagerRequest::SelectAccessPoint(ssid, iface)) => {
let state = NetworkManagerState::new(&conn).await.unwrap_or_default();
let success = if let Err(err) = state.connect_wifi(&conn, &ssid, None).await {
tracing::error!("Failed to connect to access point: {:?}", err);
false
} else {
true
};
let success =
if let Err(err) = state.connect_wifi(&conn, &ssid, None, &iface).await {
tracing::error!("Failed to connect to access point: {:?}", err);
false
} else {
true
};

_ = output
.send(NetworkManagerEvent::RequestResponse {
req: NetworkManagerRequest::SelectAccessPoint(ssid.clone()),
req: NetworkManagerRequest::SelectAccessPoint(
ssid.clone(),
iface.clone(),
),
success,
state: NetworkManagerState::new(&conn).await.unwrap_or_default(),
})
Expand Down Expand Up @@ -260,9 +268,9 @@ async fn start_listening(
pub enum NetworkManagerRequest {
SetAirplaneMode(bool),
SetWiFi(bool),
SelectAccessPoint(String),
SelectAccessPoint(String, String),
Disconnect(String),
Password(String, String),
Password(String, String, String),
Forget(String),
Reload,
}
Expand Down Expand Up @@ -401,6 +409,7 @@ impl NetworkManagerState {
conn: &Connection,
ssid: &str,
password: Option<&str>,
iface: &str,
) -> anyhow::Result<()> {
let nm = NetworkManager::new(conn).await?;

Expand All @@ -417,7 +426,7 @@ impl NetworkManagerState {
let Some(ap) = self
.wireless_access_points
.iter()
.find(|ap| ap.ssid == ssid)
.find(|ap| ap.ssid == ssid && ap.interface == iface)
else {
return Err(anyhow::anyhow!("Access point not found"));
};
Expand All @@ -431,6 +440,7 @@ impl NetworkManagerState {
"connection",
HashMap::from([
("id", Value::Str(ssid.into())),
("iface", Value::Str(iface.into())),
("type", Value::Str("802-11-wireless".into())),
]),
),
Expand All @@ -454,6 +464,9 @@ impl NetworkManagerState {
) {
continue;
}
if device.interface().await.unwrap_or("".to_string()) != iface {
continue;
}

let s = NetworkManagerSettings::new(conn).await?;
let known_conns = s.list_connections().await.unwrap_or_default();
Expand Down

0 comments on commit 69bc740

Please sign in to comment.