1 #pragma once 2 3 #include <gtkmm.h> 4 5 #include "helper.h" 6 #include "keychain_view.h" 7 #include "lock_screen.h" 8 9 class KeychainContainer : public Gtk::Bin { 10 public: KeychainContainer(std::string path)11 KeychainContainer(std::string path) : Gtk::Bin() { 12 lock_screen = std::unique_ptr<LockScreen>( 13 new LockScreen([this](std::string path, std::string master_password) { 14 unlock_callback(path, master_password); 15 })); 16 if (!path.empty()) { 17 lock_screen->setPath(path); 18 } 19 add(*lock_screen); 20 show_all_children(); 21 } 22 refresh()23 void refresh() { 24 keychain_object->reloadItems(); 25 keychain_view = std::unique_ptr<KeychainView>(new KeychainView(keychain_object)); 26 remove(); 27 add(*keychain_view); 28 show_all_children(); 29 } 30 lock()31 void lock() { 32 remove(); 33 keychain_object.reset(); 34 keychain_view.reset(); 35 add(*lock_screen); 36 show_all_children(); 37 } 38 setUnlockCb(std::function<void (std::string title,std::string password)> fn)39 void setUnlockCb(std::function<void(std::string title, std::string password)> fn) { 40 parent_unlock_cb = fn; 41 } 42 getKeychain()43 std::shared_ptr<Keychain> getKeychain() { 44 return std::shared_ptr<Keychain>(keychain_object); 45 } 46 unlock(std::string master_password)47 void unlock(std::string master_password) { 48 unlock_impl(getPath(), master_password); 49 } 50 getPath()51 std::string getPath() { 52 return lock_screen->getPath(); 53 } 54 55 protected: unlock_impl(std::string path,std::string master_password)56 void unlock_impl(std::string path, std::string master_password) { 57 try { 58 keychain_object = std::make_shared<Keychain>(path, master_password); 59 } catch (std::exception& e) { 60 errorDialog(e.what()); 61 return; 62 } 63 remove(); 64 keychain_view = std::unique_ptr<KeychainView>(new KeychainView(keychain_object)); 65 add(*keychain_view); 66 show_all_children(); 67 } unlock_callback(std::string path,std::string master_password)68 void unlock_callback(std::string path, std::string master_password) { 69 unlock_impl(path, master_password); 70 parent_unlock_cb(path, lock_screen->getPassword()); 71 lock_screen->clearPassword(); 72 } 73 74 std::unique_ptr<LockScreen> lock_screen; 75 std::shared_ptr<Keychain> keychain_object; 76 std::unique_ptr<KeychainView> keychain_view; 77 std::function<void(std::string title, std::string password)> parent_unlock_cb; 78 }; 79