diff options
-rw-r--r-- | NK_C_API.cc | 8 | ||||
-rw-r--r-- | NK_C_API.h | 9 | ||||
-rw-r--r-- | NitrokeyManager.cc | 20 | ||||
-rw-r--r-- | include/NitrokeyManager.h | 3 |
4 files changed, 37 insertions, 3 deletions
diff --git a/NK_C_API.cc b/NK_C_API.cc index d93283d..4773036 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -73,7 +73,7 @@ extern int NK_login(const char *device_model) { auto m = NitrokeyManager::instance(); try { NK_last_command_status = 0; - m->connect(device_model); + return m->connect(device_model); } catch (CommandFailedException & commandFailedException){ NK_last_command_status = commandFailedException.last_command_status; @@ -432,6 +432,12 @@ extern int NK_is_AES_supported(const char *user_password) { }); } +extern int NK_login_auto() { + auto m = NitrokeyManager::instance(); + return get_with_result([&](){ + return (uint8_t) m->connect(); + }); +} } @@ -17,11 +17,17 @@ extern void NK_set_debug(bool state); /** * Connect to device of given model. Currently library can be connected only to one device at once. * @param device_model char 'S': Nitrokey Storage, 'P': Nitrokey Pro - * @return command processing error code + * @return 1 if connected, 0 if wrong model or cannot connect */ extern int NK_login(const char *device_model); /** + * Connect to first available device, starting checking from Pro 1st to Storage 2nd. + * @return 1 if connected, 0 if wrong model or cannot connect + */ +extern int NK_login_auto(); + +/** * Disconnect from the device. * @return command processing error code */ @@ -311,6 +317,7 @@ extern int NK_erase_password_safe_slot(uint8_t slot_number); * @return 0 for no and 1 for yes */ extern int NK_is_AES_supported(const char *user_password); + } diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index ed9c7b4..79efc49 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -1,5 +1,6 @@ #include <cassert> #include <cstring> +#include <iostream> #include "include/NitrokeyManager.h" namespace nitrokey{ @@ -35,7 +36,24 @@ namespace nitrokey{ NitrokeyManager::NitrokeyManager(): device(nullptr) { set_debug(true); } - NitrokeyManager::~NitrokeyManager() {delete _instance; delete device;} + NitrokeyManager::~NitrokeyManager() { + delete device; + } + + bool NitrokeyManager::connect() { + device = nullptr; + vector<Device*> devices = { new Stick10(), new Stick20() }; + for( auto d : devices ){ + if (device != nullptr){ + delete d; + } + if (device == nullptr && d->connect()){ + device = d; + } + } + return device != nullptr; + } + bool NitrokeyManager::connect(const char *device_model) { switch (device_model[0]){ diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index 7bc2673..be367fd 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -35,6 +35,7 @@ namespace nitrokey { bool erase_totp_slot(uint8_t slot_number, const char *temporary_password); bool erase_hotp_slot(uint8_t slot_number, const char *temporary_password); bool connect(const char *device_model); + bool connect(); bool disconnect(); void set_debug(bool state); string get_status(); @@ -97,6 +98,8 @@ namespace nitrokey { template <typename ProCommand, PasswordKind StoKind> void change_PIN_general(char *current_PIN, char *new_PIN); + + }; } |