aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2018-12-25 23:02:18 +0100
committerDaniel Mueller <deso@posteo.net>2018-12-27 10:44:24 -0800
commit21e7c36a0ae14f2200e806fcf66cbe0836cc2ec0 (patch)
treeebdcc5cc0590e07f2a5cfd304f2cd7debd9fed98
parentb2bbb614963dc2517e17587bd7db00feea8f26f9 (diff)
downloadnitrocli-21e7c36a0ae14f2200e806fcf66cbe0836cc2ec0.tar.gz
nitrocli-21e7c36a0ae14f2200e806fcf66cbe0836cc2ec0.tar.bz2
Add status output for Nitrokey Pro
Currently, the status command fails for a Nitrokey Pro. This patch changes the command to also print basic status information for Pro devices. For the sake of consistency, the common status is always queried using the common `Device` functions, even if the Storage status includes the same information.
-rw-r--r--nitrocli/CHANGELOG.md1
-rw-r--r--nitrocli/doc/nitrocli.19
-rw-r--r--nitrocli/src/args.rs2
-rw-r--r--nitrocli/src/commands.rs61
4 files changed, 37 insertions, 36 deletions
diff --git a/nitrocli/CHANGELOG.md b/nitrocli/CHANGELOG.md
index 3ade4e3..65510df 100644
--- a/nitrocli/CHANGELOG.md
+++ b/nitrocli/CHANGELOG.md
@@ -7,6 +7,7 @@ Unreleased
indirect dependencies
- Removed the `hid`, `hidapi-sys` and `pkg-config` dependencies
- Added the `otp` command for working with one-time passwords
+- Made `status` command work with Nitrokey Pro devices
- Enabled CI pipeline comprising code style conformance checks, linting,
and building of the project
- Added badges indicating pipeline status, current `crates.io` published
diff --git a/nitrocli/doc/nitrocli.1 b/nitrocli/doc/nitrocli.1
index db6dde1..98f6b28 100644
--- a/nitrocli/doc/nitrocli.1
+++ b/nitrocli/doc/nitrocli.1
@@ -1,4 +1,4 @@
-.TH NITROCLI 1 2018-12-14
+.TH NITROCLI 1 2018-12-26
.SH NAME
nitrocli \- access Nitrokey devices
.SH SYNOPSIS
@@ -19,9 +19,10 @@ The user PIN that is required to open the volume is queried using
Close the encrypted volume on the Nitrokey Storage.
.TP
.B status
-Print the status of the connected Nitrokey Storage, including the SD card
-serial number, the firmware version, the encryption status, the PIN retry count
-and the status of the volumes.
+Print the status of the connected Nitrokey device, including the stick serial
+number, SD card serial number, the firmware version and the PIN retry count.
+For the Nitrokey Storage, it also includes the encryption status and the status
+of the volumes.
.TP
.B clear
Clear the passphrase cached by the \fBopen\fR command.
diff --git a/nitrocli/src/args.rs b/nitrocli/src/args.rs
index ab80f3d..b48acfa 100644
--- a/nitrocli/src/args.rs
+++ b/nitrocli/src/args.rs
@@ -211,7 +211,7 @@ fn parse(parser: &argparse::ArgumentParser<'_>, args: Vec<String>) -> Result<()>
/// Inquire the status of the nitrokey.
fn status(args: Vec<String>) -> Result<()> {
let mut parser = argparse::ArgumentParser::new();
- parser.set_description("Print the status of the connected Nitrokey Storage");
+ parser.set_description("Print the status of the connected Nitrokey device");
parse(&parser, args)?;
commands::status()
diff --git a/nitrocli/src/commands.rs b/nitrocli/src/commands.rs
index c4d4598..528fa99 100644
--- a/nitrocli/src/commands.rs
+++ b/nitrocli/src/commands.rs
@@ -40,8 +40,11 @@ fn get_device() -> Result<nitrokey::DeviceWrapper> {
/// Connect to a Nitrokey Storage device and return it.
fn get_storage_device() -> Result<nitrokey::Storage> {
- nitrokey::Storage::connect()
- .or_else(|_| Err(Error::Error("Nitrokey device not found".to_string())))
+ nitrokey::Storage::connect().or_else(|_| {
+ Err(Error::Error(
+ "Nitrokey Storage device not found".to_string(),
+ ))
+ })
}
/// Authenticate the given device using the given PIN type and operation.
@@ -171,41 +174,30 @@ where
.map_err(|(_data, err)| err)
}
-/// Pretty print the status that is common to all Nitrokey devices.
-fn print_status(
- model: &'static str,
- smartcard_id: &str,
- firmware_major: i32,
- firmware_minor: i32,
- user_retries: u8,
- admin_retries: u8,
-) {
+/// Query and pretty print the status that is common to all Nitrokey devices.
+fn print_status(model: &'static str, device: &nitrokey::DeviceWrapper) -> Result<()> {
+ let serial_number = device
+ .get_serial_number()
+ .map_err(|err| get_error("Could not query the serial number", &err))?;
println!(
r#"Status:
model: {model}
- smart card ID: {id}
+ serial number: 0x{id}
firmware version: {fwv0}.{fwv1}
user retry count: {urc}
admin retry count: {arc}"#,
model = model,
- id = smartcard_id,
- fwv0 = firmware_major,
- fwv1 = firmware_minor,
- urc = user_retries,
- arc = admin_retries,
+ id = serial_number,
+ fwv0 = device.get_major_firmware_version(),
+ fwv1 = device.get_minor_firmware_version(),
+ urc = device.get_user_retry_count(),
+ arc = device.get_admin_retry_count(),
);
+ Ok(())
}
-/// Pretty print the response of a status command for the Nitrokey Storage.
+/// Pretty print the status of a Nitrokey Storage.
fn print_storage_status(status: &nitrokey::StorageStatus) {
- print_status(
- "Storage",
- &format!("{:#x}", status.serial_number_smart_card),
- status.firmware_version_major as i32,
- status.firmware_version_minor as i32,
- status.user_retry_count,
- status.admin_retry_count,
- );
println!(
r#"
SD card ID: {id:#x}
@@ -234,11 +226,18 @@ fn print_storage_status(status: &nitrokey::StorageStatus) {
/// Inquire the status of the nitrokey.
pub fn status() -> Result<()> {
- let status = get_storage_device()?
- .get_status()
- .map_err(|err| get_error("Getting Storage status failed", &err))?;
-
- print_storage_status(&status);
+ let device = get_device()?;
+ let model = match device {
+ nitrokey::DeviceWrapper::Pro(_) => "Pro",
+ nitrokey::DeviceWrapper::Storage(_) => "Storage",
+ };
+ print_status(model, &device)?;
+ if let nitrokey::DeviceWrapper::Storage(storage) = device {
+ let status = storage
+ .get_status()
+ .map_err(|err| get_error("Getting Storage status failed", &err))?;
+ print_storage_status(&status);
+ }
Ok(())
}