mirror of
https://github.com/uutils/coreutils
synced 2024-11-17 02:08:09 +00:00
ls: move SELinux String building logic to its own function
This commit is contained in:
parent
79d838b1c3
commit
8f229aad87
1 changed files with 45 additions and 39 deletions
|
@ -1259,45 +1259,7 @@ impl PathData {
|
||||||
None => OnceCell::new(),
|
None => OnceCell::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let substitute_string = "?".to_string();
|
let security_context = get_security_context(config, &p_buf, must_dereference);
|
||||||
let security_context = if config.context {
|
|
||||||
if config.selinux_supported {
|
|
||||||
#[cfg(feature = "selinux")]
|
|
||||||
{
|
|
||||||
match selinux::SecurityContext::of_path(&p_buf, must_dereference, false) {
|
|
||||||
Err(_r) => {
|
|
||||||
// TODO: show the actual reason why it failed
|
|
||||||
show_warning!("failed to get security context of: {}", p_buf.quote());
|
|
||||||
substitute_string
|
|
||||||
}
|
|
||||||
Ok(None) => substitute_string,
|
|
||||||
Ok(Some(context)) => {
|
|
||||||
let mut context = context.as_bytes();
|
|
||||||
if context.ends_with(&[0]) {
|
|
||||||
// TODO: replace with `strip_prefix()` when MSRV >= 1.51
|
|
||||||
context = &context[..context.len() - 1]
|
|
||||||
};
|
|
||||||
String::from_utf8(context.to_vec()).unwrap_or_else(|e| {
|
|
||||||
show_warning!(
|
|
||||||
"getting security context of: {}: {}",
|
|
||||||
p_buf.quote(),
|
|
||||||
e.to_string()
|
|
||||||
);
|
|
||||||
String::from_utf8_lossy(context).into_owned()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[cfg(not(feature = "selinux"))]
|
|
||||||
{
|
|
||||||
substitute_string
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
substitute_string
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
String::new()
|
|
||||||
};
|
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
md: OnceCell::new(),
|
md: OnceCell::new(),
|
||||||
|
@ -2124,3 +2086,47 @@ fn display_symlink_count(_metadata: &Metadata) -> String {
|
||||||
fn display_symlink_count(metadata: &Metadata) -> String {
|
fn display_symlink_count(metadata: &Metadata) -> String {
|
||||||
metadata.nlink().to_string()
|
metadata.nlink().to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This returns the SELinux security context as UTF8 `String`.
|
||||||
|
// In the long term this should be changed to `OsStr`, see discussions at #2621/#2656
|
||||||
|
fn get_security_context(config: &Config, p_buf: &PathBuf, must_dereference: bool) -> String {
|
||||||
|
let substitute_string = "?".to_string();
|
||||||
|
if config.context {
|
||||||
|
if config.selinux_supported {
|
||||||
|
#[cfg(feature = "selinux")]
|
||||||
|
{
|
||||||
|
match selinux::SecurityContext::of_path(p_buf, must_dereference, false) {
|
||||||
|
Err(_r) => {
|
||||||
|
// TODO: show the actual reason why it failed
|
||||||
|
show_warning!("failed to get security context of: {}", p_buf.quote());
|
||||||
|
substitute_string
|
||||||
|
}
|
||||||
|
Ok(None) => substitute_string,
|
||||||
|
Ok(Some(context)) => {
|
||||||
|
let mut context = context.as_bytes();
|
||||||
|
if context.ends_with(&[0]) {
|
||||||
|
// TODO: replace with `strip_prefix()` when MSRV >= 1.51
|
||||||
|
context = &context[..context.len() - 1]
|
||||||
|
};
|
||||||
|
String::from_utf8(context.to_vec()).unwrap_or_else(|e| {
|
||||||
|
show_warning!(
|
||||||
|
"getting security context of: {}: {}",
|
||||||
|
p_buf.quote(),
|
||||||
|
e.to_string()
|
||||||
|
);
|
||||||
|
String::from_utf8_lossy(context).into_owned()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "selinux"))]
|
||||||
|
{
|
||||||
|
substitute_string
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
substitute_string
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue