From a00e3f75349dc5f48abf441fd4e5c369c2e2055a Mon Sep 17 00:00:00 2001 From: Daniel Mueller Date: Mon, 27 May 2019 09:20:00 -0700 Subject: Make storage hidden subcommand a top-level command This patch marks the next step in the process of restructuring the storage command. Specifically, it promotes the storage hidden subcommand to a top-level command, hidden. --- nitrocli/src/args.rs | 34 +++++++++++++-------------------- nitrocli/src/commands.rs | 11 +++-------- nitrocli/src/tests/hidden.rs | 44 +++++++++++++++++++++++++++++++++++++++++++ nitrocli/src/tests/mod.rs | 1 + nitrocli/src/tests/storage.rs | 24 ----------------------- 5 files changed, 61 insertions(+), 53 deletions(-) create mode 100644 nitrocli/src/tests/hidden.rs (limited to 'nitrocli/src') diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs index 0b0429a..c37e5d2 100644 --- a/nitrocli/src/args.rs +++ b/nitrocli/src/args.rs @@ -121,6 +121,7 @@ impl From for nitrokey::Model { #[allow(unused_doc_comments)] Enum! {Command, [ Config => ("config", config), + Hidden => ("hidden", hidden), Lock => ("lock", lock), Otp => ("otp", otp), Pin => ("pin", pin), @@ -248,7 +249,6 @@ fn reset(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { Enum! {StorageCommand, [ Close => ("close", storage_close), - Hidden => ("hidden", storage_hidden), Open => ("open", storage_open), ]} @@ -295,13 +295,13 @@ fn storage_close(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { } Enum! {HiddenCommand, [ - Close => ("close", storage_hidden_close), - Create => ("create", storage_hidden_create), - Open => ("open", storage_hidden_open), + Close => ("close", hidden_close), + Create => ("create", hidden_create), + Open => ("open", hidden_open), ]} -/// Execute a storage hidden subcommand. -fn storage_hidden(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { +/// Execute a hidden subcommand. +fn hidden(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut subcommand = HiddenCommand::Open; let help = cmd_help!(subcommand); let mut subargs = vec![]; @@ -320,19 +320,11 @@ fn storage_hidden(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { parser.stop_on_first_argument(true); parse(ctx, parser, args)?; - subargs.insert( - 0, - format!( - "nitrocli {} {} {}", - Command::Storage, - StorageCommand::Hidden, - subcommand - ), - ); + subargs.insert(0, format!("nitrocli {} {}", Command::Hidden, subcommand)); subcommand.execute(ctx, subargs) } -fn storage_hidden_create(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { +fn hidden_create(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut slot: u8 = 0; let mut start: u8 = 0; let mut end: u8 = 0; @@ -357,23 +349,23 @@ fn storage_hidden_create(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> ); parse(ctx, parser, args)?; - commands::storage_hidden_create(ctx, slot, start, end) + commands::hidden_create(ctx, slot, start, end) } -fn storage_hidden_open(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { +fn hidden_open(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Opens a hidden volume on a Nitrokey Storage"); parse(ctx, parser, args)?; - commands::storage_hidden_open(ctx) + commands::hidden_open(ctx) } -fn storage_hidden_close(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { +fn hidden_close(ctx: &mut ExecCtx<'_>, args: Vec) -> Result<()> { let mut parser = argparse::ArgumentParser::new(); parser.set_description("Closes the hidden volume on a Nitrokey Storage"); parse(ctx, parser, args)?; - commands::storage_hidden_close(ctx) + commands::hidden_close(ctx) } /// Execute a config subcommand. diff --git a/nitrocli/src/commands.rs b/nitrocli/src/commands.rs index d1ded11..6374611 100644 --- a/nitrocli/src/commands.rs +++ b/nitrocli/src/commands.rs @@ -389,12 +389,7 @@ pub fn storage_close(ctx: &mut args::ExecCtx<'_>) -> Result<()> { } /// Create a hidden volume. -pub fn storage_hidden_create( - ctx: &mut args::ExecCtx<'_>, - slot: u8, - start: u8, - end: u8, -) -> Result<()> { +pub fn hidden_create(ctx: &mut args::ExecCtx<'_>, slot: u8, start: u8, end: u8) -> Result<()> { let device = get_storage_device(ctx)?; let pwd_entry = pinentry::PwdEntry::from(&device)?; let pwd = if let Some(pwd) = &ctx.password { @@ -412,7 +407,7 @@ pub fn storage_hidden_create( } /// Open a hidden volume. -pub fn storage_hidden_open(ctx: &mut args::ExecCtx<'_>) -> Result<()> { +pub fn hidden_open(ctx: &mut args::ExecCtx<'_>) -> Result<()> { let device = get_storage_device(ctx)?; let pwd_entry = pinentry::PwdEntry::from(&device)?; let pwd = if let Some(pwd) = &ctx.password { @@ -434,7 +429,7 @@ pub fn storage_hidden_open(ctx: &mut args::ExecCtx<'_>) -> Result<()> { } /// Close a previously opened hidden volume. -pub fn storage_hidden_close(ctx: &mut args::ExecCtx<'_>) -> Result<()> { +pub fn hidden_close(ctx: &mut args::ExecCtx<'_>) -> Result<()> { unsafe { sync() }; get_storage_device(ctx)? diff --git a/nitrocli/src/tests/hidden.rs b/nitrocli/src/tests/hidden.rs new file mode 100644 index 0000000..483a801 --- /dev/null +++ b/nitrocli/src/tests/hidden.rs @@ -0,0 +1,44 @@ +// hidden.rs + +// ************************************************************************* +// * Copyright (C) 2019 Daniel Mueller (deso@posteo.net) * +// * * +// * This program is free software: you can redistribute it and/or modify * +// * it under the terms of the GNU General Public License as published by * +// * the Free Software Foundation, either version 3 of the License, or * +// * (at your option) any later version. * +// * * +// * This program is distributed in the hope that it will be useful, * +// * but WITHOUT ANY WARRANTY; without even the implied warranty of * +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +// * GNU General Public License for more details. * +// * * +// * You should have received a copy of the GNU General Public License * +// * along with this program. If not, see . * +// ************************************************************************* + +use super::*; + +#[test_device] +fn hidden_create_open_close(device: nitrokey::Storage) -> crate::Result<()> { + let mut ncli = Nitrocli::with_dev(device); + let out = ncli.handle(&["hidden", "create", "0", "50", "100"])?; + assert!(out.is_empty()); + + let out = ncli.handle(&["hidden", "open"])?; + assert!(out.is_empty()); + + let device = nitrokey::Storage::connect()?; + assert!(!device.get_status()?.encrypted_volume.active); + assert!(device.get_status()?.hidden_volume.active); + drop(device); + + let out = ncli.handle(&["hidden", "close"])?; + assert!(out.is_empty()); + + let device = nitrokey::Storage::connect()?; + assert!(!device.get_status()?.encrypted_volume.active); + assert!(!device.get_status()?.hidden_volume.active); + + Ok(()) +} diff --git a/nitrocli/src/tests/mod.rs b/nitrocli/src/tests/mod.rs index b1e1618..2d6f93c 100644 --- a/nitrocli/src/tests/mod.rs +++ b/nitrocli/src/tests/mod.rs @@ -37,6 +37,7 @@ const NITROKEY_DEFAULT_USER_PIN: &str = "123456"; fn dummy() {} mod config; +mod hidden; mod lock; mod otp; mod pin; diff --git a/nitrocli/src/tests/storage.rs b/nitrocli/src/tests/storage.rs index 5b45bdc..a1c6ecf 100644 --- a/nitrocli/src/tests/storage.rs +++ b/nitrocli/src/tests/storage.rs @@ -88,27 +88,3 @@ fn encrypted_open_close(device: nitrokey::Storage) -> crate::Result<()> { Ok(()) } - -#[test_device] -fn hidden_create_open_close(device: nitrokey::Storage) -> crate::Result<()> { - let mut ncli = Nitrocli::with_dev(device); - let out = ncli.handle(&["storage", "hidden", "create", "0", "50", "100"])?; - assert!(out.is_empty()); - - let out = ncli.handle(&["storage", "hidden", "open"])?; - assert!(out.is_empty()); - - let device = nitrokey::Storage::connect()?; - assert!(!device.get_status()?.encrypted_volume.active); - assert!(device.get_status()?.hidden_volume.active); - drop(device); - - let out = ncli.handle(&["storage", "hidden", "close"])?; - assert!(out.is_empty()); - - let device = nitrokey::Storage::connect()?; - assert!(!device.get_status()?.encrypted_volume.active); - assert!(!device.get_status()?.hidden_volume.active); - - Ok(()) -} -- cgit v1.2.1