30 #include <boost/filesystem.hpp> 51 static h256 const UnknownPassword;
53 static auto const DontKnowThrow = [](){
throw PasswordUnknown();
return std::string(); };
82 void setKeysFile(boost::filesystem::path
const& _keysFile) { m_keysFile = _keysFile; }
83 boost::filesystem::path
const&
keysFile()
const {
return m_keysFile; }
86 void create(std::string
const& _pass);
87 bool load(std::string
const& _pass);
88 void save(std::string
const& _pass)
const { write(_pass, m_keysFile); }
90 void notePassword(std::string
const& _pass) { m_cachedPasswords[hashPassword(_pass)] = _pass; }
91 void noteHint(std::string
const& _pass, std::string
const& _hint) {
if (!_hint.empty()) m_passwordHint[hashPassword(_pass)] = _hint; }
92 bool haveHint(std::string
const& _pass)
const {
auto h = hashPassword(_pass);
return m_cachedPasswords.count(h) && !m_cachedPasswords.at(h).empty(); }
109 h128 import(
Secret const& _s, std::string
const& _accountName, std::string
const& _pass, std::string
const& _passwordHint);
110 h128 import(
Secret const& _s, std::string
const& _accountName) {
return import(_s, _accountName, defaultPassword(), std::string()); }
113 void importExisting(
h128 const& _uuid, std::string
const& _accountName, std::string
const& _pass, std::string
const& _passwordHint);
114 void importExisting(
h128 const& _uuid, std::string
const& _accountName,
Address const& _addr,
h256 const& _passHash =
h256(), std::string
const& _passwordHint = std::string());
118 Secret secret(
Address const& _address, std::function<std::string()>
const& _pass = DontKnowThrow,
bool _usePasswordCache =
true)
const;
121 Secret secret(
h128 const& _uuid, std::function<std::string()>
const& _pass = DontKnowThrow,
bool _usePasswordCache =
true)
const;
123 bool recode(
Address const& _address, std::string
const& _newPass, std::string
const& _hint, std::function<std::string()>
const& _pass = DontKnowThrow,
KDF _kdf =
KDF::Scrypt);
128 static boost::filesystem::path
defaultPath() {
return getDataDir(
"ethereum") / boost::filesystem::path(
"keys.info"); }
131 static KeyPair presaleSecret(std::string
const& _json, std::function<std::string(
bool)>
const& _password);
136 std::string getPassword(
h128 const& _uuid, std::function<std::string()>
const& _pass = DontKnowThrow)
const;
137 std::string getPassword(
h256 const& _passHash, std::function<std::string()>
const& _pass = DontKnowThrow)
const;
138 std::string defaultPassword(std::function<std::string()>
const& _pass = DontKnowThrow)
const {
return getPassword(m_master, _pass); }
139 h256 hashPassword(std::string
const& _pass)
const;
142 void cachePassword(std::string
const& _password)
const;
146 bool write()
const {
return write(m_keysFile); }
147 bool write(boost::filesystem::path
const& _keysFile)
const;
148 void write(std::string
const& _pass, boost::filesystem::path
const& _keysFile)
const;
149 void write(SecureFixedHash<16>
const& _key, boost::filesystem::path
const& _keysFile)
const;
154 std::unordered_map<h128, Address> m_uuidLookup;
156 std::unordered_map<Address, h128> m_addrLookup;
158 std::unordered_map<Address, KeyInfo> m_keyInfo;
160 std::unordered_map<h256, std::string> m_passwordHint;
163 mutable std::unordered_map<h256, std::string> m_cachedPasswords;
170 std::string m_defaultPasswordDeprecated;
172 mutable boost::filesystem::path m_keysFile;
173 mutable SecureFixedHash<16> m_keysFileKey;
174 mutable h256 m_master;
void save(std::string const &_pass) const
boost::filesystem::path getDataDir(std::string _prefix="ethereum")
h128 uuid(Address const &_a) const
static KeyPair presaleSecret(std::string const &_json, std::function< std::string(bool)> const &_password)
Extracts the secret key from the presale wallet.
bool hasAccount(Address const &_address) const
void notePassword(std::string const &_pass)
void noteHint(std::string const &_pass, std::string const &_hint)
std::string const & passwordHint(Address const &_address) const
AddressHash accountsHash() const
static KeyPair newKeyPair(NewKeyType _type)
Addresses accounts() const
std::string accountName
Name of the key, or JSON key info if begins with '{'.
std::string const & accountName(Address const &_address) const
Base class for all exceptions.
bool recode(Address const &_address, std::string const &_newPass, std::string const &_hint, std::function< std::string()> const &_pass=DontKnowThrow, KDF _kdf=KDF::Scrypt)
High-level manager of password-encrypted keys for Ethereum. Usage:
std::string passwordHint
Hint of the password. Alternative place for storage than the hash-based lookup.
void create(std::string const &_pass)
void kill(h128 const &_id)
h160s Addresses
A vector of Ethereum addresses.
static boost::filesystem::path defaultPath()
Address address(h128 const &_uuid) const
KeyManager(boost::filesystem::path const &_keysFile=defaultPath(), boost::filesystem::path const &_secretsPath=SecretStore::defaultPath())
h256 passHash
Hash of the password or h256() / UnknownPassword if unknown.
void importExisting(h128 const &_uuid, std::string const &_accountName, std::string const &_pass, std::string const &_passwordHint)
bool haveHint(std::string const &_pass) const
bool load(std::string const &_pass)
Secret secret(Address const &_address, std::function< std::string()> const &_pass=DontKnowThrow, bool _usePasswordCache=true) const
static boost::filesystem::path defaultPath()
KeyInfo(h256 const &_passHash, std::string const &_accountName, std::string const &_passwordHint=std::string())
void setKeysFile(boost::filesystem::path const &_keysFile)
boost::filesystem::path const & keysFile() const
std::unordered_set< h160 > AddressHash
A hash set of Ethereum addresses.