add sanity checks for user write access on x install
Signed-off-by: onur-ozkan <work@onurozkan.dev>
This commit is contained in:
parent
bf982631df
commit
350ead8720
@ -45,6 +45,23 @@ fn sanitize_sh(path: &Path) -> String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_dir_writable_for_user(dir: &PathBuf) -> bool {
|
||||||
|
let tmp_file = dir.join(".tmp");
|
||||||
|
match fs::File::create(&tmp_file) {
|
||||||
|
Ok(_) => {
|
||||||
|
fs::remove_file(tmp_file).unwrap();
|
||||||
|
true
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
if e.kind() == std::io::ErrorKind::PermissionDenied {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
panic!("Failed the write access check for the current user. {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn install_sh(
|
fn install_sh(
|
||||||
builder: &Builder<'_>,
|
builder: &Builder<'_>,
|
||||||
package: &str,
|
package: &str,
|
||||||
@ -56,6 +73,17 @@ fn install_sh(
|
|||||||
|
|
||||||
let prefix = default_path(&builder.config.prefix, "/usr/local");
|
let prefix = default_path(&builder.config.prefix, "/usr/local");
|
||||||
let sysconfdir = prefix.join(default_path(&builder.config.sysconfdir, "/etc"));
|
let sysconfdir = prefix.join(default_path(&builder.config.sysconfdir, "/etc"));
|
||||||
|
|
||||||
|
// Sanity check for the user write access on prefix and sysconfdir
|
||||||
|
assert!(
|
||||||
|
is_dir_writable_for_user(&prefix),
|
||||||
|
"User doesn't have write access on `install.prefix` path in the `config.toml`.",
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
is_dir_writable_for_user(&sysconfdir),
|
||||||
|
"User doesn't have write access on `install.sysconfdir` path in `config.toml`."
|
||||||
|
);
|
||||||
|
|
||||||
let datadir = prefix.join(default_path(&builder.config.datadir, "share"));
|
let datadir = prefix.join(default_path(&builder.config.datadir, "share"));
|
||||||
let docdir = prefix.join(default_path(&builder.config.docdir, "share/doc/rust"));
|
let docdir = prefix.join(default_path(&builder.config.docdir, "share/doc/rust"));
|
||||||
let mandir = prefix.join(default_path(&builder.config.mandir, "share/man"));
|
let mandir = prefix.join(default_path(&builder.config.mandir, "share/man"));
|
||||||
@ -92,6 +120,9 @@ fn prepare_dir(mut path: PathBuf) -> String {
|
|||||||
// More information on the environment variable is available here:
|
// More information on the environment variable is available here:
|
||||||
// https://www.gnu.org/prep/standards/html_node/DESTDIR.html
|
// https://www.gnu.org/prep/standards/html_node/DESTDIR.html
|
||||||
if let Some(destdir) = env::var_os("DESTDIR").map(PathBuf::from) {
|
if let Some(destdir) = env::var_os("DESTDIR").map(PathBuf::from) {
|
||||||
|
// Sanity check for the user write access on DESTDIR
|
||||||
|
assert!(is_dir_writable_for_user(&destdir), "User doesn't have write access on DESTDIR.");
|
||||||
|
|
||||||
let without_destdir = path.clone();
|
let without_destdir = path.clone();
|
||||||
path = destdir;
|
path = destdir;
|
||||||
// Custom .join() which ignores disk roots.
|
// Custom .join() which ignores disk roots.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user