aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2019-01-27 18:42:14 +0000
committerRobin Krahl <robin.krahl@ireas.org>2019-07-08 21:40:17 +0000
commitfe2f39826ade5a156945dabb8c8ab725378a15c1 (patch)
treecd2c9d662dd93813524c5227c2c44e52cadde20e /src/lib.rs
parent379bc798477a1de7ffda923c5d10ca63aebae25f (diff)
downloadnitrokey-rs-fe2f39826ade5a156945dabb8c8ab725378a15c1.tar.gz
nitrokey-rs-fe2f39826ade5a156945dabb8c8ab725378a15c1.tar.bz2
Store mutable reference to Manager in Device
In the last patches, we ensured that devices can only be obtained using the Manager struct. But we did not ensure that there is only one device at a time. This patch adds a mutable reference to the Manager instance to the Device implementations. The borrow checker makes sure that there is only one mutable reference at a time. In this patch, we have to remove the old connect, Pro::connect and Storage::connect functions as they do no longer compile. (They discard the MutexGuard which invalidates the reference to the Manager.) Therefore the tests do no longer compile.
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs23
1 files changed, 10 insertions, 13 deletions
diff --git a/src/lib.rs b/src/lib.rs
index dc3432a..8b0aae5 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -110,8 +110,8 @@ pub use crate::auth::{Admin, Authenticate, User};
pub use crate::config::Config;
#[allow(deprecated)]
pub use crate::device::{
- connect, Device, DeviceWrapper, Model, Pro, SdCardData, Storage, StorageProductionInfo,
- StorageStatus, VolumeMode, VolumeStatus,
+ Device, DeviceWrapper, Model, Pro, SdCardData, Storage, StorageProductionInfo, StorageStatus,
+ VolumeMode, VolumeStatus,
};
pub use crate::error::{CommandError, CommunicationError, Error, LibraryError};
pub use crate::otp::{ConfigureOtp, GenerateOtp, OtpMode, OtpSlotData};
@@ -204,12 +204,9 @@ impl Manager {
/// ```
///
/// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
- pub fn connect(&mut self) -> Result<DeviceWrapper, Error> {
+ pub fn connect(&mut self) -> Result<DeviceWrapper<'_>, Error> {
if unsafe { nitrokey_sys::NK_login_auto() } == 1 {
- match device::get_connected_device() {
- Some(wrapper) => Ok(wrapper),
- None => Err(CommunicationError::NotConnected.into()),
- }
+ device::get_connected_device(self)
} else {
Err(CommunicationError::NotConnected.into())
}
@@ -239,9 +236,9 @@ impl Manager {
/// ```
///
/// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
- pub fn connect_model(&mut self, model: Model) -> Result<DeviceWrapper, Error> {
+ pub fn connect_model(&mut self, model: Model) -> Result<DeviceWrapper<'_>, Error> {
if device::connect_enum(model) {
- Ok(device::create_device_wrapper(model))
+ Ok(device::create_device_wrapper(self, model))
} else {
Err(CommunicationError::NotConnected.into())
}
@@ -270,9 +267,9 @@ impl Manager {
/// ```
///
/// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
- pub fn connect_pro(&mut self) -> Result<Pro, Error> {
+ pub fn connect_pro(&mut self) -> Result<Pro<'_>, Error> {
if device::connect_enum(device::Model::Pro) {
- Ok(device::Pro::new())
+ Ok(device::Pro::new(self))
} else {
Err(CommunicationError::NotConnected.into())
}
@@ -301,9 +298,9 @@ impl Manager {
/// ```
///
/// [`NotConnected`]: enum.CommunicationError.html#variant.NotConnected
- pub fn connect_storage(&mut self) -> Result<Storage, Error> {
+ pub fn connect_storage(&mut self) -> Result<Storage<'_>, Error> {
if device::connect_enum(Model::Storage) {
- Ok(Storage::new())
+ Ok(Storage::new(self))
} else {
Err(CommunicationError::NotConnected.into())
}