aboutsummaryrefslogtreecommitdiff
path: root/src/device/pro.rs
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2020-01-02 21:06:39 +0100
committerRobin Krahl <robin.krahl@ireas.org>2020-01-02 21:06:39 +0100
commit528e56a0ff759ea81b61eea368cf53b5540dc89a (patch)
treedb2675df8984dfbdbdd3aa54ac1b27fa8561c4aa /src/device/pro.rs
parent0911616ce880538dfa1a2a2977d72bdf7c229967 (diff)
parente81057037e9b4f370b64c0a030a725bc6bdfb870 (diff)
downloadnitrokey-rs-528e56a0ff759ea81b61eea368cf53b5540dc89a.tar.gz
nitrokey-rs-528e56a0ff759ea81b61eea368cf53b5540dc89a.tar.bz2
Merge branch 'release-0.4.0'
Diffstat (limited to 'src/device/pro.rs')
-rw-r--r--src/device/pro.rs79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/device/pro.rs b/src/device/pro.rs
new file mode 100644
index 0000000..a65345e
--- /dev/null
+++ b/src/device/pro.rs
@@ -0,0 +1,79 @@
+// Copyright (C) 2018-2019 Robin Krahl <robin.krahl@ireas.org>
+// SPDX-License-Identifier: MIT
+
+use nitrokey_sys;
+
+use crate::device::{Device, Model};
+use crate::otp::GenerateOtp;
+
+/// A Nitrokey Pro device without user or admin authentication.
+///
+/// Use the [`connect`][] method to obtain an instance wrapper or the [`connect_pro`] method to
+/// directly obtain an instance. If you want to execute a command that requires user or admin
+/// authentication, use [`authenticate_admin`][] or [`authenticate_user`][].
+///
+/// # Examples
+///
+/// Authentication with error handling:
+///
+/// ```no_run
+/// use nitrokey::{Authenticate, User, Pro};
+/// # use nitrokey::Error;
+///
+/// fn perform_user_task<'a>(device: &User<'a, Pro<'a>>) {}
+/// fn perform_other_task(device: &Pro) {}
+///
+/// # fn try_main() -> Result<(), Error> {
+/// let mut manager = nitrokey::take()?;
+/// let device = manager.connect_pro()?;
+/// let device = match device.authenticate_user("123456") {
+/// Ok(user) => {
+/// perform_user_task(&user);
+/// user.device()
+/// },
+/// Err((device, err)) => {
+/// eprintln!("Could not authenticate as user: {}", err);
+/// device
+/// },
+/// };
+/// perform_other_task(&device);
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [`authenticate_admin`]: trait.Authenticate.html#method.authenticate_admin
+/// [`authenticate_user`]: trait.Authenticate.html#method.authenticate_user
+/// [`connect`]: struct.Manager.html#method.connect
+/// [`connect_pro`]: struct.Manager.html#method.connect_pro
+#[derive(Debug)]
+pub struct Pro<'a> {
+ manager: Option<&'a mut crate::Manager>,
+}
+
+impl<'a> Pro<'a> {
+ pub(crate) fn new(manager: &'a mut crate::Manager) -> Pro<'a> {
+ Pro {
+ manager: Some(manager),
+ }
+ }
+}
+
+impl<'a> Drop for Pro<'a> {
+ fn drop(&mut self) {
+ unsafe {
+ nitrokey_sys::NK_logout();
+ }
+ }
+}
+
+impl<'a> Device<'a> for Pro<'a> {
+ fn into_manager(mut self) -> &'a mut crate::Manager {
+ self.manager.take().unwrap()
+ }
+
+ fn get_model(&self) -> Model {
+ Model::Pro
+ }
+}
+
+impl<'a> GenerateOtp for Pro<'a> {}