diff options
| author | Robin Krahl <robin.krahl@ireas.org> | 2019-01-17 01:53:08 +0000 | 
|---|---|---|
| committer | Robin Krahl <robin.krahl@ireas.org> | 2019-01-20 20:57:07 +0000 | 
| commit | d0f63513bb935d3d931c86a1ab7b68d6ed44bf27 (patch) | |
| tree | 2f5918913ff041f84481d368c898cd2620470295 | |
| parent | 5da2735cfb8ccfaea1ebdee850ddd9fbd0bfb003 (diff) | |
| download | nitrokey-rs-d0f63513bb935d3d931c86a1ab7b68d6ed44bf27.tar.gz nitrokey-rs-d0f63513bb935d3d931c86a1ab7b68d6ed44bf27.tar.bz2 | |
Move util::CommandError to the new error module
This prepares the refactoring of util::CommandError into multiple enums.
| -rw-r--r-- | src/auth.rs | 5 | ||||
| -rw-r--r-- | src/config.rs | 2 | ||||
| -rw-r--r-- | src/device.rs | 5 | ||||
| -rw-r--r-- | src/error.rs | 114 | ||||
| -rw-r--r-- | src/lib.rs | 4 | ||||
| -rw-r--r-- | src/otp.rs | 3 | ||||
| -rw-r--r-- | src/pws.rs | 5 | ||||
| -rw-r--r-- | src/util.rs | 113 | 
8 files changed, 127 insertions, 124 deletions
| diff --git a/src/auth.rs b/src/auth.rs index 2d61d4b..e805e54 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -6,10 +6,9 @@ use nitrokey_sys;  use crate::config::{Config, RawConfig};  use crate::device::{Device, DeviceWrapper, Pro, Storage}; +use crate::error::CommandError;  use crate::otp::{ConfigureOtp, GenerateOtp, OtpMode, OtpSlotData, RawOtpSlotData}; -use crate::util::{ -    generate_password, get_command_result, get_cstring, result_from_string, CommandError, -}; +use crate::util::{generate_password, get_command_result, get_cstring, result_from_string};  static TEMPORARY_PASSWORD_LENGTH: usize = 25; diff --git a/src/config.rs b/src/config.rs index 2ce6f77..277dc5e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -use crate::util::CommandError; +use crate::error::CommandError;  /// The configuration for a Nitrokey.  #[derive(Clone, Copy, Debug, PartialEq)] diff --git a/src/device.rs b/src/device.rs index d794e1b..603a986 100644 --- a/src/device.rs +++ b/src/device.rs @@ -5,11 +5,10 @@ use nitrokey_sys;  use crate::auth::Authenticate;  use crate::config::{Config, RawConfig}; +use crate::error::CommandError;  use crate::otp::GenerateOtp;  use crate::pws::GetPasswordSafe; -use crate::util::{ -    get_command_result, get_cstring, get_last_error, result_from_string, CommandError, -}; +use crate::util::{get_command_result, get_cstring, get_last_error, result_from_string};  /// Available Nitrokey models.  #[derive(Clone, Copy, Debug, PartialEq)] diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..6aeeef8 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,114 @@ +use std::borrow; +use std::fmt; +use std::os::raw; + +/// Error types returned by Nitrokey device or by the library. +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum CommandError { +    /// A packet with a wrong checksum has been sent or received. +    WrongCrc, +    /// A command tried to access an OTP slot that does not exist. +    WrongSlot, +    /// A command tried to generate an OTP on a slot that is not configured. +    SlotNotProgrammed, +    /// The provided password is wrong. +    WrongPassword, +    /// You are not authorized for this command or provided a wrong temporary +    /// password. +    NotAuthorized, +    /// An error occurred when getting or setting the time. +    Timestamp, +    /// You did not provide a name for the OTP slot. +    NoName, +    /// This command is not supported by this device. +    NotSupported, +    /// This command is unknown. +    UnknownCommand, +    /// AES decryption failed. +    AesDecryptionFailed, +    /// An unknown error occurred. +    Unknown(i64), +    /// An unspecified error occurred. +    Undefined, +    /// You passed a string containing a null byte. +    InvalidString, +    /// A supplied string exceeded a length limit. +    StringTooLong, +    /// You passed an invalid slot. +    InvalidSlot, +    /// The supplied string was not in hexadecimal format. +    InvalidHexString, +    /// The target buffer was smaller than the source. +    TargetBufferTooSmall, +    /// An error occurred during random number generation. +    RngError, +} + +impl CommandError { +    fn as_str(&self) -> borrow::Cow<'static, str> { +        match *self { +            CommandError::WrongCrc => { +                "A packet with a wrong checksum has been sent or received".into() +            } +            CommandError::WrongSlot => "The given OTP slot does not exist".into(), +            CommandError::SlotNotProgrammed => "The given OTP slot is not programmed".into(), +            CommandError::WrongPassword => "The given password is wrong".into(), +            CommandError::NotAuthorized => { +                "You are not authorized for this command or provided a wrong temporary \ +                 password" +                    .into() +            } +            CommandError::Timestamp => "An error occurred when getting or setting the time".into(), +            CommandError::NoName => "You did not provide a name for the OTP slot".into(), +            CommandError::NotSupported => "This command is not supported by this device".into(), +            CommandError::UnknownCommand => "This command is unknown".into(), +            CommandError::AesDecryptionFailed => "AES decryption failed".into(), +            CommandError::Unknown(x) => { +                borrow::Cow::from(format!("An unknown error occurred ({})", x)) +            } +            CommandError::Undefined => "An unspecified error occurred".into(), +            CommandError::InvalidString => "You passed a string containing a null byte".into(), +            CommandError::StringTooLong => "The supplied string is too long".into(), +            CommandError::InvalidSlot => "The given slot is invalid".into(), +            CommandError::InvalidHexString => { +                "The supplied string is not in hexadecimal format".into() +            } +            CommandError::TargetBufferTooSmall => "The target buffer is too small".into(), +            CommandError::RngError => "An error occurred during random number generation".into(), +        } +    } +} + +impl fmt::Display for CommandError { +    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { +        write!(f, "{}", self.as_str()) +    } +} + +impl From<raw::c_int> for CommandError { +    fn from(value: raw::c_int) -> Self { +        match value { +            1 => CommandError::WrongCrc, +            2 => CommandError::WrongSlot, +            3 => CommandError::SlotNotProgrammed, +            4 => CommandError::WrongPassword, +            5 => CommandError::NotAuthorized, +            6 => CommandError::Timestamp, +            7 => CommandError::NoName, +            8 => CommandError::NotSupported, +            9 => CommandError::UnknownCommand, +            10 => CommandError::AesDecryptionFailed, +            200 => CommandError::StringTooLong, +            201 => CommandError::InvalidSlot, +            202 => CommandError::InvalidHexString, +            203 => CommandError::TargetBufferTooSmall, +            x => CommandError::Unknown(x.into()), +        } +    } +} + +impl From<rand_core::Error> for CommandError { +    fn from(_error: rand_core::Error) -> Self { +        CommandError::RngError +    } +} @@ -89,6 +89,7 @@  mod auth;  mod config;  mod device; +mod error;  mod otp;  mod pws;  mod util; @@ -103,9 +104,10 @@ pub use crate::device::{      connect, connect_model, Device, DeviceWrapper, Model, Pro, SdCardData, Storage,      StorageProductionInfo, StorageStatus, VolumeMode, VolumeStatus,  }; +pub use crate::error::CommandError;  pub use crate::otp::{ConfigureOtp, GenerateOtp, OtpMode, OtpSlotData};  pub use crate::pws::{GetPasswordSafe, PasswordSafe, SLOT_COUNT}; -pub use crate::util::{CommandError, LogLevel}; +pub use crate::util::LogLevel;  /// The default admin PIN for all Nitrokey devices.  pub const DEFAULT_ADMIN_PIN: &'static str = "12345678"; @@ -2,7 +2,8 @@ use std::ffi::CString;  use nitrokey_sys; -use crate::util::{get_command_result, get_cstring, result_from_string, CommandError}; +use crate::error::CommandError; +use crate::util::{get_command_result, get_cstring, result_from_string};  /// Modes for one-time password generation.  #[derive(Clone, Copy, Debug, PartialEq)] @@ -2,9 +2,8 @@ use libc;  use nitrokey_sys;  use crate::device::{Device, DeviceWrapper, Pro, Storage}; -use crate::util::{ -    get_command_result, get_cstring, get_last_error, result_from_string, CommandError, -}; +use crate::error::CommandError; +use crate::util::{get_command_result, get_cstring, get_last_error, result_from_string};  /// The number of slots in a [`PasswordSafe`][].  /// diff --git a/src/util.rs b/src/util.rs index 567c478..88a381c 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,53 +1,11 @@ -use std::borrow;  use std::ffi::{CStr, CString}; -use std::fmt;  use std::os::raw::{c_char, c_int};  use libc::{c_void, free};  use rand_core::RngCore;  use rand_os::OsRng; -/// Error types returned by Nitrokey device or by the library. -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum CommandError { -    /// A packet with a wrong checksum has been sent or received. -    WrongCrc, -    /// A command tried to access an OTP slot that does not exist. -    WrongSlot, -    /// A command tried to generate an OTP on a slot that is not configured. -    SlotNotProgrammed, -    /// The provided password is wrong. -    WrongPassword, -    /// You are not authorized for this command or provided a wrong temporary -    /// password. -    NotAuthorized, -    /// An error occurred when getting or setting the time. -    Timestamp, -    /// You did not provide a name for the OTP slot. -    NoName, -    /// This command is not supported by this device. -    NotSupported, -    /// This command is unknown. -    UnknownCommand, -    /// AES decryption failed. -    AesDecryptionFailed, -    /// An unknown error occurred. -    Unknown(i64), -    /// An unspecified error occurred. -    Undefined, -    /// You passed a string containing a null byte. -    InvalidString, -    /// A supplied string exceeded a length limit. -    StringTooLong, -    /// You passed an invalid slot. -    InvalidSlot, -    /// The supplied string was not in hexadecimal format. -    InvalidHexString, -    /// The target buffer was smaller than the source. -    TargetBufferTooSmall, -    /// An error occurred during random number generation. -    RngError, -} +use crate::error::CommandError;  /// Log level for libnitrokey.  /// @@ -123,75 +81,6 @@ pub fn get_cstring<T: Into<Vec<u8>>>(s: T) -> Result<CString, CommandError> {      CString::new(s).or(Err(CommandError::InvalidString))  } -impl CommandError { -    fn as_str(&self) -> borrow::Cow<'static, str> { -        match *self { -            CommandError::WrongCrc => { -                "A packet with a wrong checksum has been sent or received".into() -            } -            CommandError::WrongSlot => "The given OTP slot does not exist".into(), -            CommandError::SlotNotProgrammed => "The given OTP slot is not programmed".into(), -            CommandError::WrongPassword => "The given password is wrong".into(), -            CommandError::NotAuthorized => { -                "You are not authorized for this command or provided a wrong temporary \ -                 password" -                    .into() -            } -            CommandError::Timestamp => "An error occurred when getting or setting the time".into(), -            CommandError::NoName => "You did not provide a name for the OTP slot".into(), -            CommandError::NotSupported => "This command is not supported by this device".into(), -            CommandError::UnknownCommand => "This command is unknown".into(), -            CommandError::AesDecryptionFailed => "AES decryption failed".into(), -            CommandError::Unknown(x) => { -                borrow::Cow::from(format!("An unknown error occurred ({})", x)) -            } -            CommandError::Undefined => "An unspecified error occurred".into(), -            CommandError::InvalidString => "You passed a string containing a null byte".into(), -            CommandError::StringTooLong => "The supplied string is too long".into(), -            CommandError::InvalidSlot => "The given slot is invalid".into(), -            CommandError::InvalidHexString => { -                "The supplied string is not in hexadecimal format".into() -            } -            CommandError::TargetBufferTooSmall => "The target buffer is too small".into(), -            CommandError::RngError => "An error occurred during random number generation".into(), -        } -    } -} - -impl fmt::Display for CommandError { -    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { -        write!(f, "{}", self.as_str()) -    } -} - -impl From<c_int> for CommandError { -    fn from(value: c_int) -> Self { -        match value { -            1 => CommandError::WrongCrc, -            2 => CommandError::WrongSlot, -            3 => CommandError::SlotNotProgrammed, -            4 => CommandError::WrongPassword, -            5 => CommandError::NotAuthorized, -            6 => CommandError::Timestamp, -            7 => CommandError::NoName, -            8 => CommandError::NotSupported, -            9 => CommandError::UnknownCommand, -            10 => CommandError::AesDecryptionFailed, -            200 => CommandError::StringTooLong, -            201 => CommandError::InvalidSlot, -            202 => CommandError::InvalidHexString, -            203 => CommandError::TargetBufferTooSmall, -            x => CommandError::Unknown(x.into()), -        } -    } -} - -impl From<rand_core::Error> for CommandError { -    fn from(_error: rand_core::Error) -> Self { -        CommandError::RngError -    } -} -  impl Into<i32> for LogLevel {      fn into(self) -> i32 {          match self { | 
