mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
chown: allow setting arbitrary numeric user ID
Update `chown` to allow setting the owner of a file to a numeric user ID regardless of whether a corresponding username exists on the system. For example, $ touch f && sudo chown 12345 f succeeds even though there is no named user with ID 12345. Fixes #3380.
This commit is contained in:
parent
08b6dd4975
commit
55550e1a6e
2 changed files with 34 additions and 4 deletions
|
@ -197,10 +197,17 @@ fn parse_spec(spec: &str, sep: char) -> UResult<(Option<u32>, Option<u32>)> {
|
||||||
// So, try to parse it this way
|
// So, try to parse it this way
|
||||||
return parse_spec(spec, '.');
|
return parse_spec(spec, '.');
|
||||||
} else {
|
} else {
|
||||||
|
// It's possible that the `user` string contains a
|
||||||
|
// numeric user ID, in which case, we respect that.
|
||||||
|
match user.parse() {
|
||||||
|
Ok(uid) => uid,
|
||||||
|
Err(_) => {
|
||||||
return Err(USimpleError::new(
|
return Err(USimpleError::new(
|
||||||
1,
|
1,
|
||||||
format!("invalid user: {}", spec.quote()),
|
format!("invalid user: {}", spec.quote()),
|
||||||
));
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -418,6 +418,29 @@ fn test_chown_only_user_id() {
|
||||||
.stderr_contains(&"failed to change");
|
.stderr_contains(&"failed to change");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Test for setting the owner to a user ID for a user that does not exist.
|
||||||
|
///
|
||||||
|
/// For example:
|
||||||
|
///
|
||||||
|
/// $ touch f && chown 12345 f
|
||||||
|
///
|
||||||
|
/// succeeds with exit status 0 and outputs nothing. The owner of the
|
||||||
|
/// file is set to 12345, even though no user with that ID exists.
|
||||||
|
///
|
||||||
|
/// This test must be run as root, because only the root user can
|
||||||
|
/// transfer ownership of a file.
|
||||||
|
#[test]
|
||||||
|
fn test_chown_only_user_id_nonexistent_user() {
|
||||||
|
let ts = TestScenario::new(util_name!());
|
||||||
|
let at = ts.fixtures.clone();
|
||||||
|
at.touch("f");
|
||||||
|
if let Ok(result) = run_ucmd_as_root(&ts, &["12345", "f"]) {
|
||||||
|
result.success().no_stdout().no_stderr();
|
||||||
|
} else {
|
||||||
|
print!("Test skipped; requires root user");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
// FixME: stderr = chown: ownership of 'test_chown_file1' retained as cuuser:wheel
|
// FixME: stderr = chown: ownership of 'test_chown_file1' retained as cuuser:wheel
|
||||||
#[cfg(not(target_os = "freebsd"))]
|
#[cfg(not(target_os = "freebsd"))]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue