diff options
-rw-r--r-- | src/device.rs | 64 | ||||
-rw-r--r-- | src/tests/pro.rs | 5 |
2 files changed, 30 insertions, 39 deletions
diff --git a/src/device.rs b/src/device.rs index 25e4596..8f7dc00 100644 --- a/src/device.rs +++ b/src/device.rs @@ -2,6 +2,7 @@ use config::{Config, RawConfig}; use libc; use nitrokey_sys; use std::ffi::CString; +use std::ops::Deref; use std::os::raw::c_int; use misc::Authenticate; use otp::{ConfigureOtp, GenerateOtp, OtpMode, OtpSlotData, RawOtpSlotData}; @@ -403,43 +404,34 @@ fn connect_model(model: Model) -> bool { unsafe { nitrokey_sys::NK_login_enum(model) == 1 } } -impl<T: AsRef<GenerateOtp>> GenerateOtp for T { +impl DeviceWrapper { + fn device(&self) -> &Device { + match *self { + DeviceWrapper::Storage(_) => panic!("..."), + DeviceWrapper::Pro(ref pro) => pro, + } + } +} + +impl GenerateOtp for DeviceWrapper { fn get_hotp_slot_name(&self, slot: u8) -> Result<String, CommandError> { - self.as_ref().get_hotp_slot_name(slot) + self.device().get_hotp_slot_name(slot) } fn get_totp_slot_name(&self, slot: u8) -> Result<String, CommandError> { - self.as_ref().get_totp_slot_name(slot) + self.device().get_totp_slot_name(slot) } fn get_hotp_code(&self, slot: u8) -> Result<String, CommandError> { - self.as_ref().get_hotp_code(slot) + self.device().get_hotp_code(slot) } fn get_totp_code(&self, slot: u8) -> Result<String, CommandError> { - self.as_ref().get_totp_code(slot) + self.device().get_totp_code(slot) } } -impl<T: AsRef<Device> + GenerateOtp> Device for T {} - -impl AsRef<GenerateOtp> for DeviceWrapper { - fn as_ref(&self) -> &(GenerateOtp + 'static) { - match *self { - DeviceWrapper::Storage(_) => panic!("..."), - DeviceWrapper::Pro(ref pro) => pro, - } - } -} - -impl AsRef<Device> for DeviceWrapper { - fn as_ref(&self) -> &(Device + 'static) { - match *self { - DeviceWrapper::Storage(_) => panic!("..."), - DeviceWrapper::Pro(ref pro) => pro, - } - } -} +impl Device for DeviceWrapper {} impl Authenticate for DeviceWrapper { fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, CommandError)> { @@ -534,12 +526,6 @@ impl Device for Pro {} impl GenerateOtp for Pro {} -impl<T: Device + 'static> AsRef<Device> for User<T> { - fn as_ref(&self) -> &(Device + 'static) { - &self.device - } -} - impl<T: Device> User<T> { /// Forgets the user authentication and returns an unauthenticated device. This method /// consumes the authenticated device. It does not perform any actual commands on the @@ -549,6 +535,14 @@ impl<T: Device> User<T> { } } +impl<T: Device> Deref for User<T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.device + } +} + impl<T: Device> GenerateOtp for User<T> { fn get_hotp_code(&self, slot: u8) -> Result<String, CommandError> { unsafe { @@ -580,14 +574,10 @@ impl<T: Device> AuthenticatedDevice<T> for User<T> { } } -impl<T: Device + 'static> AsRef<GenerateOtp> for Admin<T> { - fn as_ref(&self) -> &(GenerateOtp + 'static) { - &self.device - } -} +impl<T: Device> Deref for Admin<T> { + type Target = T; -impl<T: Device + 'static> AsRef<Device> for Admin<T> { - fn as_ref(&self) -> &(Device + 'static) { + fn deref(&self) -> &Self::Target { &self.device } } diff --git a/src/tests/pro.rs b/src/tests/pro.rs index e52c287..5415ff9 100644 --- a/src/tests/pro.rs +++ b/src/tests/pro.rs @@ -1,4 +1,5 @@ use std::ffi::CStr; +use std::ops::Deref; use {Admin, Authenticate, CommandError, CommandStatus, Config, ConfigureOtp, Device, GenerateOtp, OtpMode, OtpSlotData, Pro}; @@ -101,7 +102,7 @@ fn hotp() { assert_eq!(CommandStatus::Success, admin.write_config(config)); configure_hotp(&admin); - check_hotp_codes(&admin); + check_hotp_codes(admin.deref()); configure_hotp(&admin); check_hotp_codes(&admin.device()); @@ -203,7 +204,7 @@ fn totp() { assert_eq!(CommandStatus::Success, admin.write_config(config)); configure_totp(&admin); - check_totp_codes(&admin); + check_totp_codes(admin.deref()); configure_totp(&admin); check_totp_codes(&admin.device()); |