aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2019-01-27 18:21:08 +0000
committerRobin Krahl <robin.krahl@ireas.org>2019-07-08 21:33:13 +0000
commit379bc798477a1de7ffda923c5d10ca63aebae25f (patch)
tree1cd4dcbc9ddcbf23b9f546d097f3d5ef2f454992
parentbd7c7a5fdf0ae66a1ff2f00beb5ed4c2e6994ca1 (diff)
downloadnitrokey-rs-379bc798477a1de7ffda923c5d10ca63aebae25f.tar.gz
nitrokey-rs-379bc798477a1de7ffda923c5d10ca63aebae25f.tar.bz2
Move {Pro, Storage}::connect into Manager
As part of the connection refactoring, this patch moves the connect methods of the Pro and Storage structs into the Manager struct. To maintain compatibility with nitrokey-test, the old methods are not removed but marked as deprecated.
-rw-r--r--CHANGELOG.md2
-rw-r--r--src/device.rs25
-rw-r--r--src/lib.rs62
-rw-r--r--tests/device.rs4
4 files changed, 75 insertions, 18 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ffc52e6..41b529a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -44,7 +44,7 @@ SPDX-License-Identifier: MIT
- Refactor connection management:
- Add `ConcurrentAccessError` and `PoisonError` `Error` variants.
- Add the `Manager` struct that manages connections to Nitrokey devices.
- - Deprecate the `connect` function.
+ - Deprecate `connect`, `Pro::connect` and `Storage::connect`.
- Remove the `connect_model` function.
# v0.3.4 (2019-01-20)
diff --git a/src/device.rs b/src/device.rs
index f28558d..758691d 100644
--- a/src/device.rs
+++ b/src/device.rs
@@ -9,7 +9,7 @@ use nitrokey_sys;
use crate::auth::Authenticate;
use crate::config::{Config, RawConfig};
-use crate::error::{CommunicationError, Error};
+use crate::error::Error;
use crate::otp::GenerateOtp;
use crate::pws::GetPasswordSafe;
use crate::util::{
@@ -755,16 +755,12 @@ impl Pro {
/// ```
///
/// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
+ #[deprecated(since = "0.4.0", note = "use `nitrokey::Manager::connect_pro` instead")]
pub fn connect() -> Result<Pro, Error> {
- // TODO: maybe Option instead of Result?
- if connect_enum(Model::Pro) {
- Ok(Pro::new())
- } else {
- Err(CommunicationError::NotConnected.into())
- }
+ crate::take()?.connect_pro().map_err(Into::into)
}
- fn new() -> Pro {
+ pub(crate) fn new() -> Pro {
Pro {
marker: marker::PhantomData,
}
@@ -808,16 +804,15 @@ impl Storage {
/// ```
///
/// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
+ #[deprecated(
+ since = "0.4.0",
+ note = "use `nitrokey::Manager::connect_storage` instead"
+ )]
pub fn connect() -> Result<Storage, Error> {
- // TODO: maybe Option instead of Result?
- if connect_enum(Model::Storage) {
- Ok(Storage::new())
- } else {
- Err(CommunicationError::NotConnected.into())
- }
+ crate::take()?.connect_storage().map_err(Into::into)
}
- fn new() -> Storage {
+ pub(crate) fn new() -> Storage {
Storage {
marker: marker::PhantomData,
}
diff --git a/src/lib.rs b/src/lib.rs
index 784dc6f..dc3432a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -246,6 +246,68 @@ impl Manager {
Err(CommunicationError::NotConnected.into())
}
}
+
+ /// Connects to a Nitrokey Pro.
+ ///
+ /// # Errors
+ ///
+ /// - [`NotConnected`][] if no Nitrokey device of the given model is connected
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use nitrokey::Pro;
+ ///
+ /// fn use_pro(device: Pro) {}
+ ///
+ /// # fn main() -> Result<(), nitrokey::Error> {
+ /// match nitrokey::take()?.connect_pro() {
+ /// Ok(device) => use_pro(device),
+ /// Err(err) => println!("Could not connect to the Nitrokey Pro: {}", err),
+ /// }
+ /// # Ok(())
+ /// # }
+ /// ```
+ ///
+ /// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
+ pub fn connect_pro(&mut self) -> Result<Pro, Error> {
+ if device::connect_enum(device::Model::Pro) {
+ Ok(device::Pro::new())
+ } else {
+ Err(CommunicationError::NotConnected.into())
+ }
+ }
+
+ /// Connects to a Nitrokey Storage.
+ ///
+ /// # Errors
+ ///
+ /// - [`NotConnected`][] if no Nitrokey device of the given model is connected
+ ///
+ /// # Example
+ ///
+ /// ```
+ /// use nitrokey::Storage;
+ ///
+ /// fn use_storage(device: Storage) {}
+ ///
+ /// # fn main() -> Result<(), nitrokey::Error> {
+ /// match nitrokey::take()?.connect_storage() {
+ /// Ok(device) => use_storage(device),
+ /// Err(err) => println!("Could not connect to the Nitrokey Storage: {}", err),
+ /// }
+ /// # Ok(())
+ /// # }
+ /// ```
+ ///
+ /// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
+ pub fn connect_storage(&mut self) -> Result<Storage, Error> {
+ if device::connect_enum(Model::Storage) {
+ Ok(Storage::new())
+ } else {
+ Err(CommunicationError::NotConnected.into())
+ }
+ }
}
/// Take an instance of the connection manager, blocking until an instance is available.
diff --git a/tests/device.rs b/tests/device.rs
index 527d6f2..b377f2e 100644
--- a/tests/device.rs
+++ b/tests/device.rs
@@ -60,7 +60,7 @@ fn connect_pro(device: Pro) {
assert_any_ok!(nitrokey::connect());
assert_any_ok!(nitrokey::take().unwrap().connect_model(nitrokey::Model::Pro));
- assert_any_ok!(nitrokey::Pro::connect());
+ assert_any_ok!(nitrokey::take().unwrap().connect_pro());
}
#[test_device]
@@ -70,7 +70,7 @@ fn connect_storage(device: Storage) {
assert_any_ok!(nitrokey::connect());
assert_any_ok!(nitrokey::take().unwrap().connect_model(nitrokey::Model::Storage));
- assert_any_ok!(nitrokey::Storage::connect());
+ assert_any_ok!(nitrokey::take().unwrap().connect_storage());
}
fn assert_empty_serial_number() {