[package]
edition = "2024"
rust-version = "1.95"
name = "nfswolf"
version = "1.0.0"
build = false
include = [
"/src/**/*",
"/tests/**/*",
"/Cargo.toml",
"/Cargo.lock",
"/README.md",
"/LICENSE",
"/CHANGELOG.md",
]
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "Pure-Rust NFS (v2/v3/v4) security toolkit: recon, analysis, export-escape, FUSE mount, and an interactive shell for authorized red-team and pentest work."
homepage = "https://strongwind.dev/NFSWolf"
documentation = "https://docs.rs/nfswolf"
readme = "README.md"
keywords = [
"nfs",
"security",
"pentest",
"scanner",
"rpc",
]
categories = [
"command-line-utilities",
"network-programming",
"filesystem",
]
license = "Apache-2.0"
repository = "https://github.com/StrongWind1/NFSWolf"
[package.metadata.docs.rs]
all-features = true
rustdoc-args = [
"--cfg",
"docsrs",
]
[features]
default = ["fuse"]
fuse = ["dep:fuser"]
[[bin]]
name = "nfswolf"
path = "src/main.rs"
[[test]]
name = "analyzer_test"
path = "tests/integration/analyzer_test.rs"
[[test]]
name = "credential_test"
path = "tests/integration/credential_test.rs"
[[test]]
name = "escape_test"
path = "tests/integration/escape_test.rs"
[[test]]
name = "nfs3_protocol_test"
path = "tests/integration/nfs3_protocol_test.rs"
[[test]]
name = "scan_test"
path = "tests/integration/scan_test.rs"
[[test]]
name = "xdr_fuzz_test"
path = "tests/integration/xdr_fuzz_test.rs"
[dependencies.anyhow]
version = "1"
[dependencies.clap]
version = "4"
features = [
"derive",
"env",
"wrap_help",
]
[dependencies.clap_complete]
version = "4"
[dependencies.colored]
version = "3"
[dependencies.dashmap]
version = "6"
[dependencies.fuser]
version = "0.18"
optional = true
[dependencies.indicatif]
version = "0.18"
[dependencies.ipnet]
version = "2"
[dependencies.libc]
version = "0.2"
[dependencies.nfs-mount]
version = "1.0.0"
[dependencies.nfs-v2]
version = "1.0.0"
[dependencies.nfs-v3]
version = "1.0.0"
[dependencies.nfs-v4]
version = "1.0.0"
[dependencies.onc-rpc-client]
version = "1.0.0"
[dependencies.onc-rpcbind]
version = "1.0.0"
[dependencies.onc-xdr]
version = "1.0.0"
[dependencies.rand]
version = "0.10"
[dependencies.rustyline]
version = "18"
[dependencies.serde]
version = "1"
features = ["derive"]
[dependencies.serde_json]
version = "1"
[dependencies.sha2]
version = "0.11"
[dependencies.tabled]
version = "0.21"
features = ["ansi"]
default-features = false
[dependencies.tokio]
version = "1"
features = ["full"]
[dependencies.tracing]
version = "0.1"
[dependencies.tracing-subscriber]
version = "0.3"
features = ["env-filter"]
[dev-dependencies.assert_cmd]
version = "2"
[dev-dependencies.nfs3_server]
version = "0.11"
features = ["memfs"]
[dev-dependencies.predicates]
version = "3"
[dev-dependencies.proptest]
version = "1"
[lints.clippy]
allow_attributes = "warn"
allow_attributes_without_reason = "warn"
cognitive_complexity = "warn"
create_dir = "warn"
dbg_macro = "deny"
doc_markdown = "allow"
empty_drop = "warn"
exit = "deny"
expect_used = "warn"
get_unwrap = "warn"
indexing_slicing = "warn"
large_include_file = "warn"
mem_forget = "deny"
missing_asserts_for_indexing = "warn"
missing_errors_doc = "allow"
missing_panics_doc = "allow"
mixed_read_write_in_expression = "warn"
multiple_crate_versions = "allow"
multiple_unsafe_ops_per_block = "warn"
mutex_atomic = "warn"
mutex_integer = "warn"
needless_raw_strings = "warn"
non_zero_suggestions = "warn"
panic = "warn"
panic_in_result_fn = "warn"
pathbuf_init_then_push = "warn"
precedence_bits = "warn"
rc_buffer = "warn"
rc_mutex = "warn"
renamed_function_params = "warn"
str_to_string = "warn"
string_lit_chars_any = "warn"
suspicious_xor_used_as_pow = "warn"
todo = "deny"
undocumented_unsafe_blocks = "warn"
unimplemented = "deny"
unnecessary_safety_comment = "warn"
unnecessary_safety_doc = "warn"
unused_result_ok = "warn"
unwrap_in_result = "deny"
unwrap_used = "warn"
use_self = "warn"
wildcard_imports = "deny"
[lints.clippy.all]
level = "deny"
priority = -2
[lints.clippy.cargo]
level = "deny"
priority = -1
[lints.clippy.complexity]
level = "deny"
priority = -1
[lints.clippy.correctness]
level = "deny"
priority = -1
[lints.clippy.nursery]
level = "allow"
priority = -1
[lints.clippy.pedantic]
level = "deny"
priority = -1
[lints.clippy.perf]
level = "deny"
priority = -1
[lints.clippy.restriction]
level = "allow"
priority = -1
[lints.clippy.style]
level = "deny"
priority = -1
[lints.clippy.suspicious]
level = "deny"
priority = -1
[lints.rust]
absolute_paths_not_starting_with_crate = "warn"
ambiguous_associated_items = "deny"
ambiguous_glob_imports = "forbid"
ambiguous_negative_literals = "warn"
arithmetic_overflow = "forbid"
binary_asm_labels = "deny"
bindings_with_variant_name = "deny"
closure_returning_async_block = "warn"
conflicting_repr_hints = "forbid"
dangerous_implicit_autorefs = "deny"
dependency_on_unit_never_type_fallback = "deny"
deprecated_in_future = "warn"
deprecated_safe_2024 = "warn"
deref_into_dyn_supertrait = "warn"
deref_nullptr = "forbid"
duplicate_features = "deny"
edition_2024_expr_fragment_specifier = "warn"
elided_lifetimes_in_associated_constant = "deny"
elided_lifetimes_in_paths = "warn"
enum_intrinsics_non_enums = "deny"
explicit_builtin_cfgs_in_flags = "deny"
explicit_outlives_requirements = "warn"
ffi_unwind_calls = "warn"
if_let_rescope = "warn"
ill_formed_attribute_input = "deny"
impl_trait_overcaptures = "warn"
impl_trait_redundant_captures = "warn"
incomplete_include = "deny"
ineffective_unstable_trait_impl = "deny"
invalid_atomic_ordering = "forbid"
invalid_from_utf8_unchecked = "deny"
invalid_macro_export_arguments = "deny"
invalid_null_arguments = "forbid"
invalid_reference_casting = "forbid"
invalid_type_param_default = "deny"
keyword_idents_2018 = "warn"
keyword_idents_2024 = "warn"
legacy_derive_helpers = "deny"
let_underscore_drop = "warn"
let_underscore_lock = "forbid"
linker_info = "warn"
linker_messages = "warn"
long_running_const_eval = "deny"
macro_expanded_macro_exports_accessed_by_absolute_paths = "deny"
macro_use_extern_crate = "warn"
meta_variable_misuse = "warn"
missing_copy_implementations = "warn"
missing_debug_implementations = "warn"
missing_docs = "warn"
missing_unsafe_on_extern = "warn"
mutable_transmutes = "forbid"
named_asm_labels = "deny"
never_type_fallback_flowing_into_unsafe = "deny"
no_mangle_const_items = "deny"
non_ascii_idents = "forbid"
out_of_scope_macro_calls = "deny"
overflowing_literals = "forbid"
patterns_in_fns_without_body = "deny"
proc_macro_derive_resolution_fallback = "deny"
pub_use_of_private_extern_crate = "deny"
redundant_imports = "warn"
redundant_lifetimes = "warn"
repr_transparent_non_zst_fields = "deny"
rust_2021_incompatible_closure_captures = "warn"
rust_2021_incompatible_or_patterns = "warn"
rust_2021_prefixes_incompatible_syntax = "warn"
rust_2021_prelude_collisions = "warn"
rust_2024_guarded_string_incompatible_syntax = "warn"
rust_2024_incompatible_pat = "warn"
rust_2024_prelude_collisions = "warn"
semicolon_in_expressions_from_macros = "deny"
single_use_lifetimes = "warn"
tail_expr_drop_order = "warn"
text_direction_codepoint_in_comment = "forbid"
text_direction_codepoint_in_literal = "forbid"
trivial_casts = "warn"
trivial_numeric_casts = "warn"
unconditional_panic = "forbid"
undropped_manually_drops = "deny"
uninhabited_static = "deny"
unit_bindings = "warn"
unknown_crate_types = "deny"
unnameable_types = "warn"
unreachable_pub = "warn"
unsafe_attr_outside_unsafe = "warn"
unsafe_code = "deny"
unsafe_op_in_unsafe_fn = "warn"
unstable_features = "warn"
unused_crate_dependencies = "warn"
unused_import_braces = "warn"
unused_lifetimes = "warn"
unused_qualifications = "warn"
unused_results = "warn"
useless_deprecated = "deny"
variant_size_differences = "warn"
[lints.rust.unused]
level = "deny"
priority = -1
[profile.dev]
overflow-checks = true
[profile.release]
opt-level = 3
lto = true
codegen-units = 1
panic = "unwind"
overflow-checks = true
strip = "symbols"
[profile.test]
overflow-checks = true