1use super::{command_mechanism, ActionMechanism, ActionSpec};
2use sysknife_types::RiskLevel;
3
4pub fn specs() -> Vec<ActionSpec> {
5 vec![
6 install_flatpak("testuser", "app-id", "flathub"),
7 remove_flatpak("testuser", "app-id"),
8 search_flatpak_apps("search-term"),
9 list_flatpak_remotes("testuser"),
10 list_installed_flatpaks("testuser"),
11 add_flatpak_remote("testuser", "remote", "https://example.invalid"),
12 remove_flatpak_remote("testuser", "remote"),
13 get_flatpak_app_info("testuser", "app-id"),
14 update_flatpak("testuser", Some("com.example.App")),
15 ubuntu_install_flatpak("testuser", "app-id", "flathub"),
16 ubuntu_remove_flatpak("testuser", "app-id"),
17 ubuntu_update_flatpak("testuser", Some("com.example.App")),
18 ubuntu_list_flatpaks("testuser"),
19 ]
20}
21
22fn flatpak_as(username: &str, args: &[&str]) -> ActionMechanism {
39 let mut argv: Vec<String> = vec![
40 "runuser".to_string(),
41 "-u".to_string(),
42 username.to_string(),
43 "--".to_string(),
44 "flatpak".to_string(),
45 ];
46 argv.extend(args.iter().map(|s| s.to_string()));
47 ActionMechanism::Command {
48 program: "sudo",
49 args: argv,
50 }
51}
52
53pub fn install_flatpak(username: &str, app_id: &str, remote: &str) -> ActionSpec {
54 ActionSpec {
55 action_name: "InstallFlatpak",
56 mechanism: flatpak_as(username, &["install", "--user", "-y", remote, app_id]),
57 risk_level: RiskLevel::Medium,
58 reboot_required: false,
59 rollback_available: false,
60 }
61}
62
63pub fn remove_flatpak(username: &str, app_id: &str) -> ActionSpec {
64 ActionSpec {
65 action_name: "RemoveFlatpak",
66 mechanism: flatpak_as(username, &["uninstall", "--user", "-y", app_id]),
67 risk_level: RiskLevel::Medium,
68 reboot_required: false,
69 rollback_available: false,
70 }
71}
72
73pub fn search_flatpak_apps(term: &str) -> ActionSpec {
76 ActionSpec {
77 action_name: "SearchFlatpakApps",
78 mechanism: command_mechanism("flatpak", ["search", term]),
79 risk_level: RiskLevel::Low,
80 reboot_required: false,
81 rollback_available: false,
82 }
83}
84
85pub fn list_flatpak_remotes(username: &str) -> ActionSpec {
86 ActionSpec {
87 action_name: "ListFlatpakRemotes",
88 mechanism: flatpak_as(username, &["remotes", "--user", "--columns=name,url"]),
89 risk_level: RiskLevel::Low,
90 reboot_required: false,
91 rollback_available: false,
92 }
93}
94
95pub fn add_flatpak_remote(username: &str, remote: &str, url: &str) -> ActionSpec {
96 ActionSpec {
97 action_name: "AddFlatpakRemote",
98 mechanism: flatpak_as(
99 username,
100 &["remote-add", "--user", "--if-not-exists", remote, url],
101 ),
102 risk_level: RiskLevel::Medium,
103 reboot_required: false,
104 rollback_available: false,
105 }
106}
107
108pub fn remove_flatpak_remote(username: &str, remote: &str) -> ActionSpec {
109 ActionSpec {
110 action_name: "RemoveFlatpakRemote",
111 mechanism: flatpak_as(username, &["remote-delete", "--user", remote]),
112 risk_level: RiskLevel::Medium,
113 reboot_required: false,
114 rollback_available: false,
115 }
116}
117
118pub fn list_installed_flatpaks(username: &str) -> ActionSpec {
119 ActionSpec {
120 action_name: "ListInstalledFlatpaks",
121 mechanism: flatpak_as(
122 username,
123 &[
124 "list",
125 "--user",
126 "--app",
127 "--columns=application,name,version,origin",
128 ],
129 ),
130 risk_level: RiskLevel::Low,
131 reboot_required: false,
132 rollback_available: false,
133 }
134}
135
136pub fn update_flatpak(username: &str, app_id: Option<&str>) -> ActionSpec {
137 let mechanism = match app_id {
138 Some(id) => flatpak_as(username, &["update", "--user", "-y", id]),
139 None => flatpak_as(username, &["update", "--user", "-y"]),
140 };
141 ActionSpec {
142 action_name: "UpdateFlatpak",
143 mechanism,
144 risk_level: RiskLevel::Medium,
145 reboot_required: false,
146 rollback_available: false,
147 }
148}
149
150pub fn get_flatpak_app_info(username: &str, app_id: &str) -> ActionSpec {
151 ActionSpec {
152 action_name: "GetFlatpakAppInfo",
153 mechanism: flatpak_as(username, &["info", "--user", app_id]),
154 risk_level: RiskLevel::Low,
155 reboot_required: false,
156 rollback_available: false,
157 }
158}
159
160pub fn ubuntu_install_flatpak(username: &str, app_id: &str, remote: &str) -> ActionSpec {
178 ActionSpec {
179 action_name: "UbuntuInstallFlatpak",
180 mechanism: flatpak_as(username, &["install", "--user", "-y", remote, app_id]),
181 risk_level: RiskLevel::Medium,
182 reboot_required: false,
183 rollback_available: false,
184 }
185}
186
187pub fn ubuntu_remove_flatpak(username: &str, app_id: &str) -> ActionSpec {
191 ActionSpec {
192 action_name: "UbuntuRemoveFlatpak",
193 mechanism: flatpak_as(username, &["uninstall", "--user", "-y", app_id]),
194 risk_level: RiskLevel::Medium,
195 reboot_required: false,
196 rollback_available: false,
197 }
198}
199
200pub fn ubuntu_update_flatpak(username: &str, app_id: Option<&str>) -> ActionSpec {
207 let mechanism = match app_id {
208 Some(id) => flatpak_as(username, &["update", "--user", "-y", id]),
209 None => flatpak_as(username, &["update", "--user", "-y"]),
210 };
211 ActionSpec {
212 action_name: "UbuntuUpdateFlatpak",
213 mechanism,
214 risk_level: RiskLevel::Medium,
215 reboot_required: false,
216 rollback_available: false,
217 }
218}
219
220pub fn ubuntu_list_flatpaks(username: &str) -> ActionSpec {
224 ActionSpec {
225 action_name: "UbuntuListFlatpaks",
226 mechanism: flatpak_as(
227 username,
228 &[
229 "list",
230 "--user",
231 "--app",
232 "--columns=application,name,version,origin",
233 ],
234 ),
235 risk_level: RiskLevel::Low,
236 reboot_required: false,
237 rollback_available: false,
238 }
239}