From 8418d1795d9ead40a58c13fbbaeb2f2c47ee005f Mon Sep 17 00:00:00 2001 From: oupson Date: Tue, 31 May 2022 22:56:51 +0200 Subject: [PATCH] Add mount command on linux --- Cargo.lock | 100 ++++++++++++++++++++++++++++++++++++++++ rustcryptfs/Cargo.toml | 5 +- rustcryptfs/src/args.rs | 20 +++++++- rustcryptfs/src/main.rs | 18 +++++++- 4 files changed, 140 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5d282e3..6d5f73f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,6 +116,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + [[package]] name = "cfg-if" version = "1.0.0" @@ -241,6 +247,22 @@ dependencies = [ "termcolor", ] +[[package]] +name = "fuser" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "104ed58f182bc2975062cd3fab229e82b5762de420e26cf5645f661402694599" +dependencies = [ + "libc", + "log", + "memchr", + "page_size", + "pkg-config", + "smallvec", + "users", + "zerocopy", +] + [[package]] name = "generic-array" version = "0.14.5" @@ -382,6 +404,16 @@ version = "6.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" +[[package]] +name = "page_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "password-hash" version = "0.3.2" @@ -402,6 +434,12 @@ dependencies = [ "digest", ] +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + [[package]] name = "polyval" version = "0.5.3" @@ -491,6 +529,7 @@ dependencies = [ "env_logger", "log", "rustcryptfs-lib", + "rustcryptfs-linux", "serde", "serde_json", ] @@ -515,6 +554,12 @@ dependencies = [ [[package]] name = "rustcryptfs-linux" version = "0.1.0" +dependencies = [ + "fuser", + "log", + "rustcryptfs-lib", + "thiserror", +] [[package]] name = "ryu" @@ -586,6 +631,12 @@ dependencies = [ "digest", ] +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + [[package]] name = "strsim" version = "0.10.0" @@ -609,6 +660,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -656,6 +719,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + [[package]] name = "universal-hash" version = "0.4.1" @@ -666,6 +735,16 @@ dependencies = [ "subtle", ] +[[package]] +name = "users" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24cc0f6d6f267b73e5a2cadf007ba8f9bc39c6a6f9666f8cf25ea809a153b032" +dependencies = [ + "libc", + "log", +] + [[package]] name = "version_check" version = "0.9.4" @@ -708,3 +787,24 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "zerocopy" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0fbc82b82efe24da867ee52e015e58178684bd9dd64c34e66bdf21da2582a9f" +dependencies = [ + "proc-macro2", + "syn", + "synstructure", +] diff --git a/rustcryptfs/Cargo.toml b/rustcryptfs/Cargo.toml index 0d74ac6..4445f85 100644 --- a/rustcryptfs/Cargo.toml +++ b/rustcryptfs/Cargo.toml @@ -12,4 +12,7 @@ serde_json = "1.0.78" clap = { version = "3.1.18", features = ["derive"] } log = "0.4.17" rustcryptfs-lib = { path = "../rustcryptfs-lib" } -env_logger = "0.9.0" \ No newline at end of file +env_logger = "0.9.0" + +[target.'cfg(target_os = "linux")'.dependencies] +rustcryptfs-linux = { path = "../rustcryptfs-linux" } diff --git a/rustcryptfs/src/args.rs b/rustcryptfs/src/args.rs index b57bba8..44d66e5 100644 --- a/rustcryptfs/src/args.rs +++ b/rustcryptfs/src/args.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use clap::{Parser, Subcommand}; #[derive(Debug, Parser)] @@ -14,6 +16,9 @@ pub(crate) enum Commands { // List file contained in a directory Ls(LsCommand), + + /// Mount an encrypted folder + Mount(MountCommand), } #[derive(Debug, Parser)] @@ -42,4 +47,17 @@ pub(crate) struct LsCommand { /// The password #[clap(short, long)] pub(crate) password : Option -} \ No newline at end of file +} + +#[derive(Debug, Parser)] +pub(crate) struct MountCommand { + /// The directory + pub(crate) path: PathBuf, + + /// The mount point + pub(crate) mountpoint: PathBuf, + + /// The password + #[clap(short, long)] + pub(crate) password: Option, +} diff --git a/rustcryptfs/src/main.rs b/rustcryptfs/src/main.rs index a8e9b1a..49400bb 100644 --- a/rustcryptfs/src/main.rs +++ b/rustcryptfs/src/main.rs @@ -6,7 +6,7 @@ use std::{ use clap::Parser; -use args::{DecryptCommand, LsCommand}; +use args::{DecryptCommand, LsCommand, MountCommand}; use rustcryptfs_lib::GocryptFs; mod args; @@ -19,6 +19,7 @@ fn main() -> anyhow::Result<()> { match &args.command { args::Commands::Decrypt(c) => decrypt_file(c), args::Commands::Ls(c) => ls(c), + args::Commands::Mount(c) => mount(c), } } @@ -102,3 +103,18 @@ fn decrypt_file(c: &DecryptCommand) -> anyhow::Result<()> { Ok(()) } + +#[cfg(target_os = "linux")] +fn mount(mount: &MountCommand) -> anyhow::Result<()> { + use rustcryptfs_linux::EncryptedFs; + + let fs = EncryptedFs::new(&mount.path); + + fs.mount(&mount.mountpoint); + Ok(()) +} + +#[cfg(not(target_os = "linux"))] +fn mount(mount: &MountCommand) -> anyhow::Result<()> { + unimplemented!() +}