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