Skip to content

Commit 2130171

Browse files
committed
Make target_user param of specify_host_user_runas optional
1 parent afcc7cb commit 2130171

File tree

3 files changed

+30
-17
lines changed

3 files changed

+30
-17
lines changed

src/sudoers/mod.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,23 +98,36 @@ impl Sudoers {
9898
&mut self,
9999
hostname: &system::Hostname,
100100
requesting_user: &User,
101-
target_user: &User,
101+
target_user: Option<&User>,
102102
) {
103103
let customisers = std::mem::take(&mut self.customisers.non_cmnd);
104104

105105
let host_matcher = &match_token(hostname);
106-
let user_matcher = &match_user(requesting_user);
107-
let runas_matcher = &match_user(target_user);
108-
109106
let host_aliases = get_aliases(&self.aliases.host, host_matcher);
107+
108+
let user_matcher = &match_user(requesting_user);
110109
let user_aliases = get_aliases(&self.aliases.user, user_matcher);
111-
let runas_aliases = get_aliases(&self.aliases.runas, runas_matcher);
110+
111+
let runas_matcher;
112+
let runas_matcher_aliases = if let Some(target_user) = target_user {
113+
runas_matcher = match_user(target_user);
114+
let runas_aliases = get_aliases(&self.aliases.runas, &runas_matcher);
115+
Some((runas_matcher, runas_aliases))
116+
} else {
117+
None
118+
};
112119

113120
let match_scope = |scope| match scope {
114121
ConfigScope::Generic => true,
115122
ConfigScope::Host(list) => find_item(&list, host_matcher, &host_aliases).is_some(),
116123
ConfigScope::User(list) => find_item(&list, user_matcher, &user_aliases).is_some(),
117-
ConfigScope::RunAs(list) => find_item(&list, runas_matcher, &runas_aliases).is_some(),
124+
ConfigScope::RunAs(list) => {
125+
if let Some((runas_matcher, runas_aliases)) = &runas_matcher_aliases {
126+
find_item(&list, runas_matcher, runas_aliases).is_some()
127+
} else {
128+
false
129+
}
130+
}
118131
ConfigScope::Command(_list) => {
119132
unreachable!("command-specific defaults are filtered out")
120133
}
@@ -150,7 +163,7 @@ impl Sudoers {
150163
on_host: &system::Hostname,
151164
request: Request<User, Group>,
152165
) -> Judgement {
153-
self.specify_host_user_runas(on_host, am_user, request.user);
166+
self.specify_host_user_runas(on_host, am_user, Some(request.user));
154167
self.specify_command(request.command, request.arguments);
155168

156169
// exception: if user is root or does not switch users, NOPASSWD is implied
@@ -219,7 +232,7 @@ impl Sudoers {
219232
invoking_user: &User,
220233
hostname: &system::Hostname,
221234
) -> Authorization {
222-
self.specify_host_user_runas(hostname, invoking_user, invoking_user);
235+
self.specify_host_user_runas(hostname, invoking_user, None);
223236

224237
// exception: if user is root, NOPASSWD is implied
225238
let skip_passwd = invoking_user.is_root();
@@ -285,7 +298,7 @@ impl Sudoers {
285298
am_user: &User,
286299
target_user: &User,
287300
) -> Option<PathBuf> {
288-
self.specify_host_user_runas(on_host, am_user, target_user);
301+
self.specify_host_user_runas(on_host, am_user, Some(target_user));
289302
if self.settings.env_editor() {
290303
for key in ["SUDO_EDITOR", "VISUAL", "EDITOR"] {
291304
if let Some(var) = std::env::var_os(key) {

src/sudoers/policy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ impl Sudoers {
124124
current_user: &User,
125125
target_user: &User,
126126
) -> Option<&str> {
127-
self.specify_host_user_runas(on_host, current_user, target_user);
127+
self.specify_host_user_runas(on_host, current_user, Some(target_user));
128128
self.settings.secure_path()
129129
}
130130
}

src/sudoers/test/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ fn default_bool_test() {
280280
sudoers.specify_host_user_runas(
281281
&system::Hostname::fake("host"),
282282
&Named("user"),
283-
&Named("root"),
283+
Some(&Named("root")),
284284
);
285285

286286
assert!(!sudoers.settings.env_editor());
@@ -307,7 +307,7 @@ fn default_set_test() {
307307
sudoers.specify_host_user_runas(
308308
&system::Hostname::fake("host"),
309309
&Named("user"),
310-
&Named("root"),
310+
Some(&Named("root")),
311311
);
312312

313313
assert_eq!(
@@ -340,7 +340,7 @@ fn default_multi_test() {
340340
sudoers.specify_host_user_runas(
341341
&system::Hostname::fake("host"),
342342
&Named("user"),
343-
&Named("root"),
343+
Some(&Named("root")),
344344
);
345345

346346
assert!(!sudoers.settings.env_editor());
@@ -514,7 +514,7 @@ fn default_specific_test() {
514514
base_sudoers.specify_host_user_runas(
515515
&system::Hostname::fake("generic"),
516516
&Named("generic"),
517-
&Named("generic"),
517+
Some(&Named("generic")),
518518
);
519519

520520
assert!(base_sudoers.settings.env_editor());
@@ -526,7 +526,7 @@ fn default_specific_test() {
526526
mod_sudoers.specify_host_user_runas(
527527
&system::Hostname::fake("host"),
528528
&Named("user"),
529-
&Named("root"),
529+
Some(&Named("root")),
530530
);
531531
assert!(!mod_sudoers.settings.env_editor());
532532
assert!(mod_sudoers.settings.use_pty());
@@ -537,7 +537,7 @@ fn default_specific_test() {
537537
mod_sudoers.specify_host_user_runas(
538538
&system::Hostname::fake("machine"),
539539
&Named("admin"),
540-
&Named("runas"),
540+
Some(&Named("runas")),
541541
);
542542
assert!(mod_sudoers.settings.env_editor());
543543
assert!(!mod_sudoers.settings.use_pty());
@@ -550,7 +550,7 @@ fn default_specific_test() {
550550
mod_sudoers.specify_host_user_runas(
551551
&system::Hostname::fake("machine"),
552552
&Named("admin"),
553-
&Named("self"),
553+
Some(&Named("self")),
554554
);
555555
mod_sudoers.specify_command(Path::new("/usr/bin/rr"), &["thrice".to_string()]);
556556
assert!(mod_sudoers.settings.env_editor());

0 commit comments

Comments
 (0)