Renaming wallet_remove to wallet_destroy.

Changing wallet_merge to wallet_move.
This commit is contained in:
clemahieu 2014-12-28 18:20:26 -06:00
commit c2a8857a71
5 changed files with 127 additions and 15 deletions

View file

@ -692,6 +692,12 @@ void rai::wallet_store::insert (rai::private_key const & prv)
assert (status.ok ());
}
void rai::wallet_store::erase (rai::public_key const & pub)
{
auto status (handle->Delete (leveldb::WriteOptions (), leveldb::Slice (pub.chars.data (), pub.chars.size ())));
assert (status.ok ());
}
bool rai::wallet_store::fetch (rai::public_key const & pub, rai::private_key & prv)
{
auto result (false);
@ -745,19 +751,20 @@ void rai::wallet_store::serialize_json (std::string & string_a)
string_a = ostream.str ();
}
bool rai::wallet_store::merge (rai::wallet_store & other_a)
bool rai::wallet_store::move (rai::wallet_store & other_a, std::vector <rai::public_key> const & keys)
{
assert (valid_password ());
assert (other_a.valid_password ());
auto result (false);
for (auto i (other_a.begin ()), n (other_a.end ()); i != n; ++i)
for (auto i (keys.begin ()), n (keys.end ()); i != n; ++i)
{
rai::private_key prv;
auto error (other_a.fetch (i->first, prv));
auto error (other_a.fetch (*i, prv));
result = result | error;
if (!result)
{
insert (prv);
other_a.erase (*i);
}
}
return result;
@ -880,7 +887,12 @@ bool rai::wallet::import (std::string const & json_a, std::string const & passwo
result = !store_l.valid_password ();
if (!result)
{
result = store.merge (store_l);
std::vector <rai::public_key> accounts;
for (auto i (store_l.begin ()), n (store_l.end ()); i != n; ++i)
{
accounts.push_back (i->first);
}
result = store.move (store_l, accounts);
}
}
return result;
@ -951,7 +963,7 @@ std::shared_ptr <rai::wallet> rai::wallets::create (rai::uint256_union const & i
return result;
}
void rai::wallets::remove (rai::uint256_union const & id_a)
void rai::wallets::destroy (rai::uint256_union const & id_a)
{
auto existing (items.find (id_a));
assert (existing != items.end ());
@ -2453,7 +2465,7 @@ void rai::rpc::operator () (boost::network::http::server <rai::rpc>::request con
response.content = "Bad account number";
}
}
else if (action == "wallet_remove")
else if (action == "wallet_destroy")
{
std::string wallet_text (request_l.get <std::string> ("wallet"));
rai::uint256_union wallet;
@ -2463,7 +2475,7 @@ void rai::rpc::operator () (boost::network::http::server <rai::rpc>::request con
auto existing (client.wallets.items.find (wallet));
if (existing != client.wallets.items.end ())
{
client.wallets.remove (wallet);
client.wallets.destroy (wallet);
boost::property_tree::ptree response_l;
set_response (response, response_l);
}
@ -2476,7 +2488,64 @@ void rai::rpc::operator () (boost::network::http::server <rai::rpc>::request con
else
{
response = boost::network::http::server<rai::rpc>::response::stock_reply (boost::network::http::server<rai::rpc>::response::bad_request);
response.content = "Bad account number";
response.content = "Bad wallet number";
}
}
else if (action == "account_move")
{
std::string wallet_text (request_l.get <std::string> ("wallet"));
std::string source_text (request_l.get <std::string> ("source"));
auto accounts_text (request_l.get_child ("accounts"));
rai::uint256_union wallet;
auto error (wallet.decode_hex (wallet_text));
if (!error)
{
auto existing (client.wallets.items.find (wallet));
if (existing != client.wallets.items.end ())
{
auto wallet (existing->second);
rai::uint256_union source;
auto error (source.decode_hex (source_text));
if (!error)
{
auto existing (client.wallets.items.find (source));
if (existing != client.wallets.items.end ())
{
auto source (existing->second);
std::vector <rai::public_key> accounts;
for (auto i (accounts_text.begin ()), n (accounts_text.end ()); i != n; ++i)
{
rai::public_key account;
account.decode_hex (i->second.get <std::string> (""));
accounts.push_back (account);
}
auto error (wallet->store.move (source->store, accounts));
boost::property_tree::ptree response_l;
response_l.put ("moved", error ? "false" : "true");
set_response (response, response_l);
}
else
{
response = boost::network::http::server<rai::rpc>::response::stock_reply (boost::network::http::server<rai::rpc>::response::bad_request);
response.content = "Source not found";
}
}
else
{
response = boost::network::http::server<rai::rpc>::response::stock_reply (boost::network::http::server<rai::rpc>::response::bad_request);
response.content = "Bad source number";
}
}
else
{
response = boost::network::http::server<rai::rpc>::response::stock_reply (boost::network::http::server<rai::rpc>::response::bad_request);
response.content = "Wallet not found";
}
}
else
{
response = boost::network::http::server<rai::rpc>::response::stock_reply (boost::network::http::server<rai::rpc>::response::bad_request);
response.content = "Bad wallet number";
}
}
else

View file

@ -291,6 +291,7 @@ public:
rai::account representative ();
void representative_set (rai::account const &);
void insert (rai::private_key const &);
void erase (rai::public_key const &);
bool fetch (rai::public_key const &, rai::private_key &);
bool exists (rai::public_key const &);
key_iterator find (rai::uint256_union const &);
@ -299,7 +300,7 @@ public:
rai::uint256_union derive_key (std::string const &);
rai::uint128_t balance (rai::ledger &);
void serialize_json (std::string &);
bool merge (rai::wallet_store &);
bool move (rai::wallet_store &, std::vector <rai::public_key> const &);
rai::fan password;
static rai::uint256_union const version_1;
static rai::uint256_union const version_current;
@ -332,7 +333,7 @@ public:
wallets (rai::client &, boost::filesystem::path const &);
std::shared_ptr <rai::wallet> open (rai::uint256_union const &);
std::shared_ptr <rai::wallet> create (rai::uint256_union const &);
void remove (rai::uint256_union const &);
void destroy (rai::uint256_union const &);
std::unordered_map <rai::uint256_union, std::shared_ptr <rai::wallet>> items;
boost::filesystem::path const path;
rai::client & client;

View file

@ -637,7 +637,7 @@ TEST (rpc, wallet_export)
ASSERT_TRUE (store.exists (rai::test_genesis_key.pub));
}
TEST (rpc, wallet_remove)
TEST (rpc, wallet_destroy)
{
rai::system system (24000, 1);
auto wallet_id (system.clients [0]->wallets.items.begin ()->first);
@ -648,7 +648,7 @@ TEST (rpc, wallet_remove)
boost::network::http::server <rai::rpc>::response response;
request.method = "POST";
boost::property_tree::ptree request_tree;
request_tree.put ("action", "wallet_remove");
request_tree.put ("action", "wallet_destroy");
request_tree.put ("wallet", wallet_id.to_string ());
std::stringstream ostream;
boost::property_tree::write_json (ostream, request_tree);
@ -659,4 +659,42 @@ TEST (rpc, wallet_remove)
std::stringstream istream (response.content);
boost::property_tree::read_json (istream, response_tree);
ASSERT_EQ (system.clients [0]->wallets.items.end (), system.clients [0]->wallets.items.find (wallet_id));
}
TEST (rpc, account_move)
{
rai::system system (24000, 1);
auto wallet_id (system.clients [0]->wallets.items.begin ()->first);
auto pool (boost::make_shared <boost::network::utils::thread_pool> ());
rai::rpc rpc (system.service, pool, boost::asio::ip::address_v6::loopback (), 25000, *system.clients [0], true);
auto destination (system.wallet (0));
destination->store.insert (rai::test_genesis_key.prv);
rai::keypair source_id;
rai::keypair key;
auto source (system.clients [0]->wallets.create (source_id.prv));
source->store.insert (key.prv);
boost::network::http::server <rai::rpc>::request request;
boost::network::http::server <rai::rpc>::response response;
request.method = "POST";
boost::property_tree::ptree request_tree;
request_tree.put ("action", "account_move");
request_tree.put ("wallet", wallet_id.to_string ());
request_tree.put ("source", source_id.prv.to_string ());
boost::property_tree::ptree keys;
boost::property_tree::ptree entry;
entry.put ("", key.pub.to_string ());
keys.push_back (std::make_pair ("", entry));
request_tree.add_child ("accounts", keys);
std::stringstream ostream;
boost::property_tree::write_json (ostream, request_tree);
request.body = ostream.str ();
rpc (request, response);
ASSERT_EQ (boost::network::http::server <rai::rpc>::response::ok, response.status);
boost::property_tree::ptree response_tree;
std::stringstream istream (response.content);
boost::property_tree::read_json (istream, response_tree);
ASSERT_EQ ("true", response_tree.get <std::string> ("moved"));
ASSERT_NE (destination->store.end (), destination->store.find (key.pub));
ASSERT_NE (destination->store.end (), destination->store.find (rai::test_genesis_key.pub));
ASSERT_EQ (source->store.end (), source->store.begin ());
}

View file

@ -396,7 +396,7 @@ TEST (wallet, serialize_json_password)
ASSERT_EQ (key.prv, prv);
}
TEST (wallet_store, merge)
TEST (wallet_store, move)
{
auto error (false);
rai::wallet_store wallet1 (error, boost::filesystem::unique_path ());
@ -408,6 +408,10 @@ TEST (wallet_store, merge)
rai::keypair key2;
wallet2.insert (key2.prv);
ASSERT_FALSE (wallet1.exists (key2.pub));
ASSERT_FALSE (wallet1.merge (wallet2));
ASSERT_TRUE (wallet2.exists (key2.pub));
std::vector <rai::public_key> keys;
keys.push_back (key2.pub);
ASSERT_FALSE (wallet1.move (wallet2, keys));
ASSERT_TRUE (wallet1.exists (key2.pub));
ASSERT_FALSE (wallet2.exists (key2.pub));
}

View file

@ -41,7 +41,7 @@ TEST (wallets, remove)
ASSERT_EQ (0, wallets.items.size ());
auto wallet (wallets.create (one));
ASSERT_EQ (1, wallets.items.size ());
wallets.remove (one);
wallets.destroy (one);
ASSERT_EQ (0, wallets.items.size ());
}
{