|
| 1 | +diff --git a/steamos-manager/src/manager/user.rs b/steamos-manager/src/manager/user.rs |
| 2 | +index 47d4432..7db7274 100644 |
| 3 | +--- a/steamos-manager/src/manager/user.rs |
| 4 | ++++ b/steamos-manager/src/manager/user.rs |
| 5 | +@@ -1172,7 +1172,7 @@ impl SessionManagement1 { |
| 6 | + } |
| 7 | + |
| 8 | + async fn valid_desktop_sessions(&self) -> fdo::Result<Vec<String>> { |
| 9 | +- valid_desktop_sessions().await.map_err(to_zbus_fdo_error) |
| 10 | ++ Ok(valid_desktop_sessions().into_iter().collect()) |
| 11 | + } |
| 12 | + |
| 13 | + async fn clean_temporary_sessions(&self) -> fdo::Result<()> { |
1 | 14 | diff --git a/steamos-manager/src/session.rs b/steamos-manager/src/session.rs |
2 | | -index c727d1d..73416af 100644 |
| 15 | +index c727d1d..39772a2 100644 |
3 | 16 | --- a/steamos-manager/src/session.rs |
4 | 17 | +++ b/steamos-manager/src/session.rs |
5 | | -@@ -10,7 +10,9 @@ |
| 18 | +@@ -10,15 +10,17 @@ |
6 | 19 | use anyhow::anyhow; |
7 | 20 | use anyhow::{Result, ensure}; |
8 | 21 | use serde::{Deserialize, Serialize}; |
9 | | -+use std::env; |
| 22 | ++use std::collections::HashSet; |
10 | 23 | use std::ffi::OsStr; |
11 | | -+use std::path::PathBuf; |
12 | 24 | use strum::{Display, EnumString}; |
| 25 | ++use tokio::fs::try_exists; |
13 | 26 | #[cfg(test)] |
14 | 27 | use tokio::fs::{create_dir_all, write}; |
15 | | -@@ -114,10 +116,19 @@ fn is_valid_desktop_session_name(path: &str) -> bool { |
| 28 | +-use tokio::fs::{read_dir, try_exists}; |
| 29 | + use tokio::sync::mpsc::Sender; |
| 30 | + use tokio::sync::{broadcast, oneshot}; |
| 31 | + use tokio_stream::StreamExt; |
| 32 | + use tracing::debug; |
| 33 | ++use xdg::BaseDirectories; |
| 34 | + use zbus::proxy::PropertyChanged; |
| 35 | + use zbus::{Connection, fdo}; |
| 36 | + |
| 37 | +@@ -114,34 +116,25 @@ fn is_valid_desktop_session_name(path: &str) -> bool { |
16 | 38 | true |
17 | 39 | } |
18 | 40 |
|
19 | | -+fn all_session_paths() -> Vec<PathBuf> { |
20 | | -+ ["/usr/local/share", "/usr/share"] |
21 | | -+ .into_iter() |
22 | | -+ .chain(env::var("XDG_DATA_DIRS").unwrap_or_default().split(':')) |
23 | | -+ .map(path) |
24 | | -+ .flat_map(|p| [p.join("wayland-sessions"), p.join("xsessions")]) |
25 | | -+ .collect() |
26 | | -+} |
27 | | -+ |
28 | | - pub(crate) async fn valid_desktop_sessions() -> Result<Vec<String>> { |
29 | | - let mut sessions = Vec::new(); |
| 41 | +-pub(crate) async fn valid_desktop_sessions() -> Result<Vec<String>> { |
| 42 | +- let mut sessions = Vec::new(); |
30 | 43 | - for dir in &["/usr/share/wayland-sessions/", "/usr/share/xsessions/"] { |
31 | 44 | - let mut entries = read_dir(path(dir)).await?; |
32 | | -+ for dir in all_session_paths() { |
33 | | -+ let mut entries = read_dir(dir).await?; |
34 | | - while let Some(entry) = entries.next_entry().await? { |
35 | | - let path = entry.path(); |
36 | | - let Some(name) = path.file_name().and_then(OsStr::to_str) else { |
37 | | -@@ -136,8 +147,8 @@ pub(crate) async fn is_valid_desktop_session(session: &str) -> Result<bool> { |
38 | | - if !is_valid_desktop_session_name(session) { |
39 | | - return Ok(false); |
40 | | - } |
| 45 | +- while let Some(entry) = entries.next_entry().await? { |
| 46 | +- let path = entry.path(); |
| 47 | +- let Some(name) = path.file_name().and_then(OsStr::to_str) else { |
| 48 | +- continue; |
| 49 | +- }; |
| 50 | ++pub(crate) fn valid_desktop_sessions() -> HashSet<String> { |
| 51 | ++ let xdg_base = BaseDirectories::new(); |
| 52 | ++ |
| 53 | ++ ["wayland-sessions", "xsessions"] |
| 54 | ++ .iter() |
| 55 | ++ .flat_map(|path| xdg_base.list_data_files(path)) |
| 56 | ++ .filter_map(|path| { |
| 57 | ++ let name = path.file_name().and_then(OsStr::to_str)?; |
| 58 | + if !is_valid_desktop_session_name(name) { |
| 59 | +- continue; |
| 60 | +- } |
| 61 | +- sessions.push(name.to_string()); |
| 62 | +- } |
| 63 | +- } |
| 64 | +- Ok(sessions) |
| 65 | ++ return None; |
| 66 | ++ }; |
| 67 | ++ |
| 68 | ++ Some(name.to_string()) |
| 69 | ++ }) |
| 70 | ++ .collect() |
| 71 | + } |
| 72 | + |
| 73 | +-pub(crate) async fn is_valid_desktop_session(session: &str) -> Result<bool> { |
| 74 | +- if !is_valid_desktop_session_name(session) { |
| 75 | +- return Ok(false); |
| 76 | +- } |
41 | 77 | - for dir in &["/usr/share/wayland-sessions/", "/usr/share/xsessions/"] { |
42 | 78 | - if try_exists(path(dir).join(session)).await? { |
43 | | -+ for dir in all_session_paths() { |
44 | | -+ if try_exists(dir.join(session)).await? { |
45 | | - return Ok(true); |
46 | | - } |
| 79 | +- return Ok(true); |
| 80 | +- } |
| 81 | +- } |
| 82 | +- Ok(false) |
| 83 | ++pub(crate) fn is_valid_desktop_session(session: &str) -> bool { |
| 84 | ++ valid_desktop_sessions().contains(session) |
| 85 | + } |
| 86 | + |
| 87 | + impl SessionManager { |
| 88 | +@@ -244,7 +237,7 @@ impl SessionManager { |
| 89 | + |
| 90 | + pub(crate) async fn set_default_desktop_session(&self, session: &str) -> Result<()> { |
| 91 | + ensure!( |
| 92 | +- is_valid_desktop_session(session).await?, |
| 93 | ++ is_valid_desktop_session(session), |
| 94 | + "Invalid desktop session {session}" |
| 95 | + ); |
| 96 | + let mut state = self.get_state().await?; |
| 97 | +@@ -454,8 +447,8 @@ mod test { |
| 98 | + write(path("/usr/share/xsessions/fake"), b"").await.unwrap(); |
| 99 | + |
| 100 | + assert_eq!( |
| 101 | +- valid_desktop_sessions().await.unwrap(), |
| 102 | +- &["plasma.desktop", "plasmax11.desktop"] |
| 103 | ++ valid_desktop_sessions(), |
| 104 | ++ HashSet::from(["plasma.desktop".into(), "plasmax11.desktop".into()]) |
| 105 | + ); |
47 | 106 | } |
| 107 | + |
| 108 | +@@ -482,16 +475,12 @@ mod test { |
| 109 | + .unwrap(); |
| 110 | + write(path("/usr/share/xsessions/fake"), b"").await.unwrap(); |
| 111 | + |
| 112 | +- assert!(is_valid_desktop_session("plasma.desktop").await.unwrap()); |
| 113 | +- assert!(is_valid_desktop_session("plasmax11.desktop").await.unwrap()); |
| 114 | +- assert!(!is_valid_desktop_session("gamescope.desktop").await.unwrap()); |
| 115 | +- assert!( |
| 116 | +- !is_valid_desktop_session("doesnotexist.desktop") |
| 117 | +- .await |
| 118 | +- .unwrap() |
| 119 | +- ); |
| 120 | +- assert!(!is_valid_desktop_session(".fake.desktop").await.unwrap()); |
| 121 | +- assert!(!is_valid_desktop_session("fake").await.unwrap()); |
| 122 | ++ assert!(is_valid_desktop_session("plasma.desktop")); |
| 123 | ++ assert!(is_valid_desktop_session("plasmax11.desktop")); |
| 124 | ++ assert!(!is_valid_desktop_session("gamescope.desktop")); |
| 125 | ++ assert!(!is_valid_desktop_session("doesnotexist.desktop")); |
| 126 | ++ assert!(!is_valid_desktop_session(".fake.desktop")); |
| 127 | ++ assert!(!is_valid_desktop_session("fake")); |
| 128 | + } |
| 129 | + |
| 130 | + #[tokio::test] |
0 commit comments