Skip to content

Commit e94c41d

Browse files
authored
Respect Defaults in validate (#1126)
2 parents 4f6e03b + 8b7aa17 commit e94c41d

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

src/sudo/pipeline.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ pub fn run(mut cmd_opts: SudoRunOptions) -> Result<(), Error> {
133133
}
134134

135135
pub fn run_validate(cmd_opts: SudoValidateOptions) -> Result<(), Error> {
136-
let policy = read_sudoers()?;
136+
let mut policy = read_sudoers()?;
137137

138138
let context = Context::from_validate_opts(cmd_opts)?;
139139

src/sudoers/mod.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,23 +98,34 @@ 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_aliases = target_user.map(|target_user| {
112+
let runas_matcher = match_user(target_user);
113+
let runas_aliases = get_aliases(&self.aliases.runas, &runas_matcher);
114+
115+
(runas_matcher, runas_aliases)
116+
});
112117

113118
let match_scope = |scope| match scope {
114119
ConfigScope::Generic => true,
115120
ConfigScope::Host(list) => find_item(&list, host_matcher, &host_aliases).is_some(),
116121
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(),
122+
ConfigScope::RunAs(list) => {
123+
runas_matcher_aliases
124+
.as_ref()
125+
.is_some_and(|(runas_matcher, runas_aliases)| {
126+
find_item(&list, runas_matcher, runas_aliases).is_some()
127+
})
128+
}
118129
ConfigScope::Command(_list) => {
119130
unreachable!("command-specific defaults are filtered out")
120131
}
@@ -150,7 +161,7 @@ impl Sudoers {
150161
on_host: &system::Hostname,
151162
request: Request<User, Group>,
152163
) -> Judgement {
153-
self.specify_host_user_runas(on_host, am_user, request.user);
164+
self.specify_host_user_runas(on_host, am_user, Some(request.user));
154165
self.specify_command(request.command, request.arguments);
155166

156167
// exception: if user is root or does not switch users, NOPASSWD is implied
@@ -215,10 +226,12 @@ impl Sudoers {
215226
}
216227

217228
pub fn check_validate_permission<User: UnixUser + PartialEq<User>>(
218-
&self,
229+
&mut self,
219230
invoking_user: &User,
220231
hostname: &system::Hostname,
221232
) -> Authorization {
233+
self.specify_host_user_runas(hostname, invoking_user, None);
234+
222235
// exception: if user is root, NOPASSWD is implied
223236
let skip_passwd = invoking_user.is_root();
224237

@@ -283,7 +296,7 @@ impl Sudoers {
283296
am_user: &User,
284297
target_user: &User,
285298
) -> Option<PathBuf> {
286-
self.specify_host_user_runas(on_host, am_user, target_user);
299+
self.specify_host_user_runas(on_host, am_user, Some(target_user));
287300
if self.settings.env_editor() {
288301
for key in ["SUDO_EDITOR", "VISUAL", "EDITOR"] {
289302
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)