@ -200,7 +200,7 @@ std::string get_weight_string(const cryptonote::transaction &tx, size_t blob_siz
return get_weight_string ( get_transaction_weight ( tx , blob_size ) ) ;
}
std : : unique_ptr < tools : : wallet2 > make_basic ( const boost : : program_options : : variables_map & vm , bool rpc , const options & opts , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
std : : unique_ptr < tools : : wallet2 > make_basic ( const boost : : program_options : : variables_map & vm , bool unattended , const options & opts , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
{
const bool testnet = command_line : : get_arg ( vm , opts . testnet ) ;
const bool stagenet = command_line : : get_arg ( vm , opts . stagenet ) ;
@ -262,7 +262,7 @@ std::unique_ptr<tools::wallet2> make_basic(const boost::program_options::variabl
}
std : : unique_ptr < tools : : wallet2 > wallet ( new tools : : wallet2 ( nettype , kdf_rounds ) ) ;
wallet - > init ( rpc , std : : move ( daemon_address ) , std : : move ( login ) , 0 , false , * trusted_daemon ) ;
wallet - > init ( unattended , std : : move ( daemon_address ) , std : : move ( login ) , 0 , false , * trusted_daemon ) ;
boost : : filesystem : : path ringdb_path = command_line : : get_arg ( vm , opts . shared_ringdb_dir ) ;
wallet - > set_ring_database ( ringdb_path . string ( ) ) ;
return wallet ;
@ -297,7 +297,7 @@ boost::optional<tools::password_container> get_password(const boost::program_opt
return password_prompter ( verify ? tr ( " Enter a new password for the wallet " ) : tr ( " Wallet password " ) , verify ) ;
}
std : : unique_ptr < tools : : wallet2 > generate_from_json ( const std : : string & json_file , const boost : : program_options : : variables_map & vm , bool rpc , const options & opts , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
std : : unique_ptr < tools : : wallet2 > generate_from_json ( const std : : string & json_file , const boost : : program_options : : variables_map & vm , bool unattended , const options & opts , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
{
const bool testnet = command_line : : get_arg ( vm , opts . testnet ) ;
const bool stagenet = command_line : : get_arg ( vm , opts . stagenet ) ;
@ -435,7 +435,7 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
THROW_WALLET_EXCEPTION_IF ( deprecated_wallet , tools : : error : : wallet_internal_error ,
tools : : wallet2 : : tr ( " Cannot generate deprecated wallets from JSON " ) ) ;
wallet . reset ( make_basic ( vm , rpc , opts , password_prompter ) . release ( ) ) ;
wallet . reset ( make_basic ( vm , unattended , opts , password_prompter ) . release ( ) ) ;
wallet - > set_refresh_from_block_height ( field_scan_from_height ) ;
wallet - > explicit_refresh_from_block_height ( field_scan_from_height_found ) ;
@ -721,8 +721,11 @@ wallet_keys_unlocker::wallet_keys_unlocker(wallet2 &w, const boost::optional<too
w ( w ) ,
locked ( password ! = boost : : none )
{
if ( ! locked | | w . is_rpc ( ) )
if ( ! locked | | w . is_unattended ( ) | | w . ask_password ( ) ! = tools : : wallet2 : : AskPasswordToDecrypt )
{
locked = false ;
return ;
}
const epee : : wipeable_string pass = password - > password ( ) ;
w . generate_chacha_key_from_password ( pass , key ) ;
w . decrypt_keys ( key ) ;
@ -764,7 +767,7 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds):
m_explicit_refresh_from_block_height ( true ) ,
m_confirm_missing_payment_id ( true ) ,
m_confirm_non_default_ring_size ( true ) ,
m_ask_password ( true ) ,
m_ask_password ( AskPasswordToDecrypt ) ,
m_min_output_count ( 0 ) ,
m_min_output_value ( 0 ) ,
m_merge_destinations ( false ) ,
@ -793,7 +796,7 @@ wallet2::wallet2(network_type nettype, uint64_t kdf_rounds):
m_ringdb ( ) ,
m_last_block_reward ( 0 ) ,
m_encrypt_keys_after_refresh ( boost : : none ) ,
m_ rpc ( false )
m_ unattended ( false )
{
}
@ -828,14 +831,14 @@ void wallet2::init_options(boost::program_options::options_description& desc_par
command_line : : add_arg ( desc_params , opts . kdf_rounds ) ;
}
std : : unique_ptr < wallet2 > wallet2 : : make_from_json ( const boost : : program_options : : variables_map & vm , bool rpc , const std : : string & json_file , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
std : : unique_ptr < wallet2 > wallet2 : : make_from_json ( const boost : : program_options : : variables_map & vm , bool unattended , const std : : string & json_file , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
{
const options opts { } ;
return generate_from_json ( json_file , vm , rpc , opts , password_prompter ) ;
return generate_from_json ( json_file , vm , unattended , opts , password_prompter ) ;
}
std : : pair < std : : unique_ptr < wallet2 > , password_container > wallet2 : : make_from_file (
const boost : : program_options : : variables_map & vm , bool rpc , const std : : string & wallet_file , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
const boost : : program_options : : variables_map & vm , bool unattended , const std : : string & wallet_file , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
{
const options opts { } ;
auto pwd = get_password ( vm , opts , password_prompter , false ) ;
@ -843,7 +846,7 @@ std::pair<std::unique_ptr<wallet2>, password_container> wallet2::make_from_file(
{
return { nullptr , password_container { } } ;
}
auto wallet = make_basic ( vm , rpc , opts , password_prompter ) ;
auto wallet = make_basic ( vm , unattended , opts , password_prompter ) ;
if ( wallet )
{
wallet - > load ( wallet_file , pwd - > password ( ) ) ;
@ -851,7 +854,7 @@ std::pair<std::unique_ptr<wallet2>, password_container> wallet2::make_from_file(
return { std : : move ( wallet ) , std : : move ( * pwd ) } ;
}
std : : pair < std : : unique_ptr < wallet2 > , password_container > wallet2 : : make_new ( const boost : : program_options : : variables_map & vm , bool rpc , const std : : function < boost : : optional < password_container > ( const char * , bool ) > & password_prompter )
std : : pair < std : : unique_ptr < wallet2 > , password_container > wallet2 : : make_new ( const boost : : program_options : : variables_map & vm , bool unattended , const std : : function < boost : : optional < password_container > ( const char * , bool ) > & password_prompter )
{
const options opts { } ;
auto pwd = get_password ( vm , opts , password_prompter , true ) ;
@ -859,19 +862,19 @@ std::pair<std::unique_ptr<wallet2>, password_container> wallet2::make_new(const
{
return { nullptr , password_container { } } ;
}
return { make_basic ( vm , rpc , opts , password_prompter ) , std : : move ( * pwd ) } ;
return { make_basic ( vm , unattended , opts , password_prompter ) , std : : move ( * pwd ) } ;
}
std : : unique_ptr < wallet2 > wallet2 : : make_dummy ( const boost : : program_options : : variables_map & vm , bool rpc , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
std : : unique_ptr < wallet2 > wallet2 : : make_dummy ( const boost : : program_options : : variables_map & vm , bool unattended , const std : : function < boost : : optional < tools : : password_container > ( const char * , bool ) > & password_prompter )
{
const options opts { } ;
return make_basic ( vm , rpc , opts , password_prompter ) ;
return make_basic ( vm , unattended , opts , password_prompter ) ;
}
//----------------------------------------------------------------------------------------------------
bool wallet2 : : init ( bool rpc , std : : string daemon_address , boost : : optional < epee : : net_utils : : http : : login > daemon_login , uint64_t upper_transaction_weight_limit , bool ssl , bool trusted_daemon )
bool wallet2 : : init ( bool unattended , std : : string daemon_address , boost : : optional < epee : : net_utils : : http : : login > daemon_login , uint64_t upper_transaction_weight_limit , bool ssl , bool trusted_daemon )
{
m_ rpc = rpc ;
m_ unattended = unattended ;
m_checkpoints . init_default_checkpoints ( m_nettype ) ;
if ( m_http_client . is_connected ( ) )
m_http_client . disconnect ( ) ;
@ -1210,7 +1213,7 @@ void wallet2::scan_output(const cryptonote::transaction &tx, const crypto::publi
THROW_WALLET_EXCEPTION_IF ( i > = tx . vout . size ( ) , error : : wallet_internal_error , " Invalid vout index " ) ;
// if keys are encrypted, ask for password
if ( m_ask_password && ! m_rpc & & ! m_watch_only & & ! m_multisig_rescan_k )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only & & ! m_multisig_rescan_k )
{
static critical_section password_lock ;
CRITICAL_REGION_LOCAL ( password_lock ) ;
@ -2847,7 +2850,7 @@ bool wallet2::store_keys(const std::string& keys_file_name, const epee::wipeable
crypto : : chacha_key key ;
crypto : : generate_chacha_key ( password . data ( ) , password . size ( ) , key , m_kdf_rounds ) ;
if ( m_ask_password && ! m_rpc & & ! m_watch_only )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only )
{
account . encrypt_viewkey ( key ) ;
account . decrypt_keys ( key ) ;
@ -2926,7 +2929,7 @@ bool wallet2::store_keys(const std::string& keys_file_name, const epee::wipeable
value2 . SetInt ( m_confirm_non_default_ring_size ? 1 : 0 ) ;
json . AddMember ( " confirm_non_default_ring_size " , value2 , json . GetAllocator ( ) ) ;
value2 . SetInt ( m_ask_password ? 1 : 0 ) ;
value2 . SetInt ( m_ask_password ) ;
json . AddMember ( " ask_password " , value2 , json . GetAllocator ( ) ) ;
value2 . SetUint ( m_min_output_count ) ;
@ -3007,7 +3010,7 @@ void wallet2::setup_keys(const epee::wipeable_string &password)
crypto : : generate_chacha_key ( password . data ( ) , password . size ( ) , key , m_kdf_rounds ) ;
// re-encrypt, but keep viewkey unencrypted
if ( m_ask_password && ! m_rpc & & ! m_watch_only )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only )
{
m_account . encrypt_keys ( key ) ;
m_account . decrypt_viewkey ( key ) ;
@ -3023,7 +3026,7 @@ void wallet2::setup_keys(const epee::wipeable_string &password)
//----------------------------------------------------------------------------------------------------
void wallet2 : : change_password ( const std : : string & filename , const epee : : wipeable_string & original_password , const epee : : wipeable_string & new_password )
{
if ( m_ask_password && ! m_rpc & & ! m_watch_only )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only )
decrypt_keys ( original_password ) ;
setup_keys ( new_password ) ;
rewrite ( filename , new_password ) ;
@ -3071,7 +3074,7 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
m_refresh_type = RefreshType : : RefreshDefault ;
m_confirm_missing_payment_id = true ;
m_confirm_non_default_ring_size = true ;
m_ask_password = true ;
m_ask_password = AskPasswordToDecrypt ;
m_min_output_count = 0 ;
m_min_output_value = 0 ;
m_merge_destinations = false ;
@ -3180,7 +3183,7 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
m_confirm_missing_payment_id = field_confirm_missing_payment_id ;
GET_FIELD_FROM_JSON_RETURN_ON_ERROR ( json , confirm_non_default_ring_size , int , Int , false , true ) ;
m_confirm_non_default_ring_size = field_confirm_non_default_ring_size ;
GET_FIELD_FROM_JSON_RETURN_ON_ERROR ( json , ask_password , int , Int , false , true ) ;
GET_FIELD_FROM_JSON_RETURN_ON_ERROR ( json , ask_password , AskPasswordType , Int , false , AskPasswordToDecrypt ) ;
m_ask_password = field_ask_password ;
GET_FIELD_FROM_JSON_RETURN_ON_ERROR ( json , default_decimal_point , int , Int , false , CRYPTONOTE_DISPLAY_DECIMAL_POINT ) ;
cryptonote : : set_default_decimal_point ( field_default_decimal_point ) ;
@ -3244,7 +3247,7 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
else
{
// rewrite with encrypted keys, ignore errors
if ( m_ask_password && ! m_rpc & & ! m_watch_only )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only )
encrypt_keys ( key ) ;
bool saved_ret = store_keys ( keys_file_name , password , m_watch_only ) ;
if ( ! saved_ret )
@ -3252,7 +3255,7 @@ bool wallet2::load_keys(const std::string& keys_file_name, const epee::wipeable_
// just moan a bit, but not fatal
MERROR ( " Error saving keys file with encrypted keys, not fatal " ) ;
}
if ( m_ask_password && ! m_rpc & & ! m_watch_only )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only )
decrypt_keys ( key ) ;
m_keys_file_locker . reset ( ) ;
}
@ -3750,7 +3753,7 @@ std::string wallet2::make_multisig(const epee::wipeable_string &password,
// decrypt keys
epee : : misc_utils : : auto_scope_leave_caller keys_reencryptor ;
if ( m_ask_password && ! m_rpc & & ! m_watch_only )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only )
{
crypto : : chacha_key chacha_key ;
crypto : : generate_chacha_key ( password . data ( ) , password . size ( ) , chacha_key , m_kdf_rounds ) ;
@ -3907,7 +3910,7 @@ bool wallet2::finalize_multisig(const epee::wipeable_string &password, std::unor
// keys are decrypted
epee : : misc_utils : : auto_scope_leave_caller keys_reencryptor ;
if ( m_ask_password && ! m_rpc & & ! m_watch_only )
if ( m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only )
{
crypto : : chacha_key chacha_key ;
crypto : : generate_chacha_key ( password . data ( ) , password . size ( ) , chacha_key , m_kdf_rounds ) ;
@ -4277,7 +4280,7 @@ void wallet2::load(const std::string& wallet_, const epee::wipeable_string& pass
LOG_PRINT_L0 ( " Loaded wallet keys file, with public address: " < < m_account . get_public_address_str ( m_nettype ) ) ;
lock_keys_file ( ) ;
wallet_keys_unlocker unlocker ( * this , m_ask_password && ! m_rpc & & ! m_watch_only , password ) ;
wallet_keys_unlocker unlocker ( * this , m_ask_password == AskPasswordToDecrypt & & ! m_unattended & & ! m_watch_only , password ) ;
//keys loaded ok!
//try to load wallet file. but even if we failed, it is not big problem