Skip to content

Commit 4ddea9b

Browse files
committed
steamos-manager: better patch
1 parent 52f140c commit 4ddea9b

File tree

1 file changed

+112
-29
lines changed

1 file changed

+112
-29
lines changed
Lines changed: 112 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,130 @@
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<()> {
114
diff --git a/steamos-manager/src/session.rs b/steamos-manager/src/session.rs
2-
index c727d1d..73416af 100644
15+
index c727d1d..39772a2 100644
316
--- a/steamos-manager/src/session.rs
417
+++ b/steamos-manager/src/session.rs
5-
@@ -10,7 +10,9 @@
18+
@@ -10,15 +10,17 @@
619
use anyhow::anyhow;
720
use anyhow::{Result, ensure};
821
use serde::{Deserialize, Serialize};
9-
+use std::env;
22+
+use std::collections::HashSet;
1023
use std::ffi::OsStr;
11-
+use std::path::PathBuf;
1224
use strum::{Display, EnumString};
25+
+use tokio::fs::try_exists;
1326
#[cfg(test)]
1427
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 {
1638
true
1739
}
1840

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();
3043
- for dir in &["/usr/share/wayland-sessions/", "/usr/share/xsessions/"] {
3144
- 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+
- }
4177
- for dir in &["/usr/share/wayland-sessions/", "/usr/share/xsessions/"] {
4278
- 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+
);
47106
}
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

Comments
 (0)