Add unlock command to CLI (stores wallet password in memory)
This commit is contained in:
@@ -146,6 +146,12 @@ def command(s):
|
|||||||
if wallet is None:
|
if wallet is None:
|
||||||
raise Exception('wallet not loaded')
|
raise Exception('wallet not loaded')
|
||||||
kwargs['wallet'] = wallet
|
kwargs['wallet'] = wallet
|
||||||
|
if cmd.requires_password and password is None:
|
||||||
|
password = wallet.get_unlocked_password()
|
||||||
|
if password:
|
||||||
|
kwargs['password'] = password
|
||||||
|
else:
|
||||||
|
raise Exception('Password required. Unlock the wallet, or add a --password option to your command')
|
||||||
wallet = kwargs.get('wallet') # type: Optional[Abstract_Wallet]
|
wallet = kwargs.get('wallet') # type: Optional[Abstract_Wallet]
|
||||||
if cmd.requires_wallet and not wallet:
|
if cmd.requires_wallet and not wallet:
|
||||||
raise Exception('wallet not loaded')
|
raise Exception('wallet not loaded')
|
||||||
@@ -621,6 +627,12 @@ class Commands:
|
|||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@command('w')
|
||||||
|
async def unlock(self, password=None, wallet: Abstract_Wallet = None):
|
||||||
|
"""Unlock the wallet. The wallet password will be stored in memory"""
|
||||||
|
wallet.unlock(password)
|
||||||
|
return "wallet unlocked" if password else "wallet locked"
|
||||||
|
|
||||||
@command('w')
|
@command('w')
|
||||||
async def getmpk(self, wallet: Abstract_Wallet = None):
|
async def getmpk(self, wallet: Abstract_Wallet = None):
|
||||||
"""Get master public key. Return your wallet\'s master public key"""
|
"""Get master public key. Return your wallet\'s master public key"""
|
||||||
|
|||||||
@@ -318,6 +318,7 @@ class Abstract_Wallet(ABC, Logger, EventListener):
|
|||||||
# load addresses needs to be called before constructor for sanity checks
|
# load addresses needs to be called before constructor for sanity checks
|
||||||
db.load_addresses(self.wallet_type)
|
db.load_addresses(self.wallet_type)
|
||||||
self.keystore = None # type: Optional[KeyStore] # will be set by load_keystore
|
self.keystore = None # type: Optional[KeyStore] # will be set by load_keystore
|
||||||
|
self._password_in_memory = None # see self.unlock
|
||||||
Logger.__init__(self)
|
Logger.__init__(self)
|
||||||
|
|
||||||
self.network = None
|
self.network = None
|
||||||
@@ -2786,6 +2787,7 @@ class Abstract_Wallet(ABC, Logger, EventListener):
|
|||||||
encrypt_keystore = self.can_have_keystore_encryption()
|
encrypt_keystore = self.can_have_keystore_encryption()
|
||||||
self.db.set_keystore_encryption(bool(new_pw) and encrypt_keystore)
|
self.db.set_keystore_encryption(bool(new_pw) and encrypt_keystore)
|
||||||
self.save_db()
|
self.save_db()
|
||||||
|
self.unlock(None)
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def _update_password_for_keystore(self, old_pw: Optional[str], new_pw: Optional[str]) -> None:
|
def _update_password_for_keystore(self, old_pw: Optional[str], new_pw: Optional[str]) -> None:
|
||||||
@@ -3035,6 +3037,16 @@ class Abstract_Wallet(ABC, Logger, EventListener):
|
|||||||
"""Returns the number of new addresses we generated."""
|
"""Returns the number of new addresses we generated."""
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
def unlock(self, password):
|
||||||
|
self.logger.info(f'unlocking wallet')
|
||||||
|
if password:
|
||||||
|
self.check_password(password)
|
||||||
|
self._password_in_memory = password
|
||||||
|
|
||||||
|
def get_unlocked_password(self):
|
||||||
|
return self._password_in_memory
|
||||||
|
|
||||||
|
|
||||||
class Simple_Wallet(Abstract_Wallet):
|
class Simple_Wallet(Abstract_Wallet):
|
||||||
# wallet with a single keystore
|
# wallet with a single keystore
|
||||||
|
|
||||||
|
|||||||
@@ -155,7 +155,8 @@ def init_cmdline(config_options, wallet_path, *, rpcserver: bool, config: 'Simpl
|
|||||||
# commands needing password
|
# commands needing password
|
||||||
if ((cmd.requires_wallet and storage.is_encrypted() and not rpcserver)
|
if ((cmd.requires_wallet and storage.is_encrypted() and not rpcserver)
|
||||||
or (cmdname == 'load_wallet' and storage.is_encrypted())
|
or (cmdname == 'load_wallet' and storage.is_encrypted())
|
||||||
or cmd.requires_password):
|
or (cmdname in ['password', 'unlock'])
|
||||||
|
or (cmd.requires_password and not rpcserver)):
|
||||||
if storage.is_encrypted_with_hw_device():
|
if storage.is_encrypted_with_hw_device():
|
||||||
# this case is handled later in the control flow
|
# this case is handled later in the control flow
|
||||||
password = None
|
password = None
|
||||||
|
|||||||
Reference in New Issue
Block a user