Skip to main content

snarkos_cli/
lib.rs

1// Copyright (c) 2019-2026 Provable Inc.
2// This file is part of the snarkOS library.
3
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at:
7
8// http://www.apache.org/licenses/LICENSE-2.0
9
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16// See https://github.com/ProvableHQ/snarkVM/issues/2775
17#![forbid(unsafe_code)]
18#![recursion_limit = "256"]
19
20#[macro_use]
21extern crate thiserror;
22
23#[cfg(feature = "metrics")]
24extern crate snarkos_node_metrics as metrics;
25
26pub mod commands;
27pub use commands::CLI;
28
29pub mod helpers;
30
31use anyhow::Result;
32use std::{
33    fs::{File, Permissions},
34    path::Path,
35};
36
37/// Checks whether the parent directory of a file can only be read and modified by the owner.
38#[cfg(unix)]
39pub fn check_parent_permissions<T: AsRef<Path>>(path: T) -> Result<()> {
40    use anyhow::{bail, ensure};
41    use std::os::unix::fs::PermissionsExt;
42
43    if let Some(parent) = path.as_ref().parent() {
44        let permissions = parent.metadata()?.permissions().mode();
45        ensure!(
46            permissions & 0o777 == 0o700,
47            "The folder {} must be readable and writeable only by the owner (0700)",
48            parent.display()
49        );
50    } else {
51        let path = path.as_ref();
52        bail!("Parent does not exist for path={}", path.display());
53    }
54
55    Ok(())
56}
57
58#[cfg(windows)]
59pub fn check_parent_permissions<T: AsRef<Path>>(_path: T) -> Result<()> {
60    Ok(())
61}
62
63#[cfg(unix)]
64fn set_user_read_only(file: &File) -> Result<()> {
65    use std::os::unix::fs::PermissionsExt;
66
67    let permissions = Permissions::from_mode(0o400);
68    file.set_permissions(permissions)?;
69    Ok(())
70}
71
72#[cfg(windows)]
73fn set_user_read_only(file: &File) -> Result<()> {
74    let mut permissions = file.metadata()?.permissions();
75    permissions.set_readonly(true);
76    file.set_permissions(permissions)?;
77    Ok(())
78}