aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2018-05-28 20:32:10 +0000
committerRobin Krahl <robin.krahl@ireas.org>2018-05-28 22:33:57 +0200
commit8f7eb1679fa988ad97b0e6dbe0ef5d1edef18351 (patch)
treedc1735d256383e194189fc586d10ebe5750eaee6
parent15706f8708af4175a5376026cdd7c6f821945a5d (diff)
downloadnitrokey-rs-8f7eb1679fa988ad97b0e6dbe0ef5d1edef18351.tar.gz
nitrokey-rs-8f7eb1679fa988ad97b0e6dbe0ef5d1edef18351.tar.bz2
Restructure trait implementations for wrappers
For DeviceWrapper, the traits GenerateOtp and Device are now directly implemented instead of complicated template implementations. For User and Admin, the wrapper implementations are replaced with an implementation of the Deref trait for easier access.
-rw-r--r--src/device.rs64
-rw-r--r--src/tests/pro.rs5
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());