forked from LBRYCommunity/lbry-sdk
added a new startup stage for wallet_unlock (#1048)
* added a new startup stage to indicate if the daemon is waiting for wallet_unlock
This commit is contained in:
parent
1c57b08dbe
commit
5677f6d00d
3 changed files with 39 additions and 28 deletions
|
@ -44,6 +44,7 @@ at anytime.
|
||||||
* Add `peer_port` to settings configurable using `settings_set`
|
* Add `peer_port` to settings configurable using `settings_set`
|
||||||
* Added an option to disable max key fee check.
|
* Added an option to disable max key fee check.
|
||||||
* Add `wallet_unlock`, a command available during startup to unlock an encrypted wallet
|
* Add `wallet_unlock`, a command available during startup to unlock an encrypted wallet
|
||||||
|
* Added a new startup stage to indicate if the daemon is waiting for the `wallet_unlock` command.
|
||||||
* Add `--conf` CLI flag to specify an alternate config file
|
* Add `--conf` CLI flag to specify an alternate config file
|
||||||
* Added `blockchain_name` and `lbryum_servers` to the adjustable settings
|
* Added `blockchain_name` and `lbryum_servers` to the adjustable settings
|
||||||
|
|
||||||
|
|
|
@ -1193,6 +1193,9 @@ class LBRYumWallet(Wallet):
|
||||||
self.blocks_behind = 0
|
self.blocks_behind = 0
|
||||||
self.catchup_progress = 0
|
self.catchup_progress = 0
|
||||||
|
|
||||||
|
# fired when the wallet actually unlocks (wallet_unlocked_d can be called multiple times)
|
||||||
|
self.wallet_unlock_success = defer.Deferred()
|
||||||
|
|
||||||
def _is_first_run(self):
|
def _is_first_run(self):
|
||||||
return (not self.printed_retrieving_headers and
|
return (not self.printed_retrieving_headers and
|
||||||
self.network.blockchain.retrieving_headers)
|
self.network.blockchain.retrieving_headers)
|
||||||
|
@ -1203,12 +1206,33 @@ class LBRYumWallet(Wallet):
|
||||||
|
|
||||||
return self._cmd_runner
|
return self._cmd_runner
|
||||||
|
|
||||||
|
def check_locked(self):
|
||||||
|
if not self.wallet.use_encryption:
|
||||||
|
log.info("Wallet is not encrypted")
|
||||||
|
self.wallet_unlock_success.callback(True)
|
||||||
|
elif not self._cmd_runner:
|
||||||
|
raise Exception("Command runner hasn't been initialized yet")
|
||||||
|
elif self._cmd_runner.locked:
|
||||||
|
log.info("Waiting for wallet password")
|
||||||
|
self.wallet_unlocked_d.addCallback(self.unlock)
|
||||||
|
return self.wallet_unlock_success
|
||||||
|
|
||||||
|
def unlock(self, password):
|
||||||
|
if self._cmd_runner and self._cmd_runner.locked:
|
||||||
|
try:
|
||||||
|
self._cmd_runner.unlock_wallet(password)
|
||||||
|
self.wallet_unlock_success.callback(True)
|
||||||
|
log.info("Unlocked the wallet!")
|
||||||
|
except InvalidPassword:
|
||||||
|
log.warning("Incorrect password, try again")
|
||||||
|
self.wallet_unlocked_d = defer.Deferred()
|
||||||
|
self.wallet_unlocked_d.addCallback(self.unlock)
|
||||||
|
return defer.succeed(False)
|
||||||
|
return defer.succeed(True)
|
||||||
|
|
||||||
def _start(self):
|
def _start(self):
|
||||||
network_start_d = defer.Deferred()
|
network_start_d = defer.Deferred()
|
||||||
|
|
||||||
# fired when the wallet actually unlocks (wallet_unlocked_d can be called multiple times)
|
|
||||||
wallet_unlock_success = defer.Deferred()
|
|
||||||
|
|
||||||
def setup_network():
|
def setup_network():
|
||||||
self.network = Network(self.config)
|
self.network = Network(self.config)
|
||||||
log.info("Loading the wallet")
|
log.info("Loading the wallet")
|
||||||
|
@ -1227,30 +1251,6 @@ class LBRYumWallet(Wallet):
|
||||||
else:
|
else:
|
||||||
network_start_d.errback(ValueError("Failed to connect to network."))
|
network_start_d.errback(ValueError("Failed to connect to network."))
|
||||||
|
|
||||||
def unlock(password):
|
|
||||||
if self._cmd_runner and self._cmd_runner.locked:
|
|
||||||
try:
|
|
||||||
self._cmd_runner.unlock_wallet(password)
|
|
||||||
wallet_unlock_success.callback(True)
|
|
||||||
log.info("Unlocked the wallet!")
|
|
||||||
except InvalidPassword:
|
|
||||||
log.warning("Incorrect password, try again")
|
|
||||||
self.wallet_unlocked_d = defer.Deferred()
|
|
||||||
self.wallet_unlocked_d.addCallback(unlock)
|
|
||||||
return defer.succeed(False)
|
|
||||||
return defer.succeed(True)
|
|
||||||
|
|
||||||
def check_locked():
|
|
||||||
if not self.wallet.use_encryption:
|
|
||||||
log.info("Wallet is not encrypted")
|
|
||||||
wallet_unlock_success.callback(True)
|
|
||||||
elif not self._cmd_runner:
|
|
||||||
raise Exception("Command runner hasn't been initialized yet")
|
|
||||||
elif self._cmd_runner.locked:
|
|
||||||
log.info("Waiting for wallet password")
|
|
||||||
self.wallet_unlocked_d.addCallback(unlock)
|
|
||||||
return wallet_unlock_success
|
|
||||||
|
|
||||||
self._start_check = task.LoopingCall(check_started)
|
self._start_check = task.LoopingCall(check_started)
|
||||||
|
|
||||||
d = setup_network()
|
d = setup_network()
|
||||||
|
@ -1263,7 +1263,6 @@ class LBRYumWallet(Wallet):
|
||||||
d.addCallback(lambda _: log.info("Synchronized wallet"))
|
d.addCallback(lambda _: log.info("Synchronized wallet"))
|
||||||
d.addCallback(lambda _: self.get_cmd_runner())
|
d.addCallback(lambda _: self.get_cmd_runner())
|
||||||
d.addCallbacks(lambda _: log.info("Set up lbryum command runner"))
|
d.addCallbacks(lambda _: log.info("Set up lbryum command runner"))
|
||||||
d.addCallbacks(lambda _: check_locked())
|
|
||||||
return d
|
return d
|
||||||
|
|
||||||
def _stop(self):
|
def _stop(self):
|
||||||
|
|
|
@ -60,6 +60,7 @@ LOADING_FILE_MANAGER_CODE = 'loading_file_manager'
|
||||||
LOADING_SERVER_CODE = 'loading_server'
|
LOADING_SERVER_CODE = 'loading_server'
|
||||||
STARTED_CODE = 'started'
|
STARTED_CODE = 'started'
|
||||||
WAITING_FOR_FIRST_RUN_CREDITS = 'waiting_for_credits'
|
WAITING_FOR_FIRST_RUN_CREDITS = 'waiting_for_credits'
|
||||||
|
WAITING_FOR_UNLOCK = 'waiting_for_wallet_unlock'
|
||||||
STARTUP_STAGES = [
|
STARTUP_STAGES = [
|
||||||
(INITIALIZING_CODE, 'Initializing'),
|
(INITIALIZING_CODE, 'Initializing'),
|
||||||
(LOADING_DB_CODE, 'Loading databases'),
|
(LOADING_DB_CODE, 'Loading databases'),
|
||||||
|
@ -68,6 +69,7 @@ STARTUP_STAGES = [
|
||||||
(LOADING_SERVER_CODE, 'Starting lbrynet'),
|
(LOADING_SERVER_CODE, 'Starting lbrynet'),
|
||||||
(STARTED_CODE, 'Started lbrynet'),
|
(STARTED_CODE, 'Started lbrynet'),
|
||||||
(WAITING_FOR_FIRST_RUN_CREDITS, 'Waiting for first run credits'),
|
(WAITING_FOR_FIRST_RUN_CREDITS, 'Waiting for first run credits'),
|
||||||
|
(WAITING_FOR_UNLOCK, 'Waiting for user to unlock the wallet using the wallet_unlock command')
|
||||||
]
|
]
|
||||||
|
|
||||||
# TODO: make this consistent with the stages in Downloader.py
|
# TODO: make this consistent with the stages in Downloader.py
|
||||||
|
@ -248,6 +250,7 @@ class Daemon(AuthJSONRPCServer):
|
||||||
yield threads.deferToThread(self._setup_data_directory)
|
yield threads.deferToThread(self._setup_data_directory)
|
||||||
yield self._check_db_migration()
|
yield self._check_db_migration()
|
||||||
yield self._get_session()
|
yield self._get_session()
|
||||||
|
yield self._check_wallet_locked()
|
||||||
yield self._get_analytics()
|
yield self._get_analytics()
|
||||||
yield add_lbry_file_to_sd_identifier(self.sd_identifier)
|
yield add_lbry_file_to_sd_identifier(self.sd_identifier)
|
||||||
yield self._setup_stream_identifier()
|
yield self._setup_stream_identifier()
|
||||||
|
@ -588,6 +591,14 @@ class Daemon(AuthJSONRPCServer):
|
||||||
d.addCallback(lambda _: self.session.setup())
|
d.addCallback(lambda _: self.session.setup())
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def _check_wallet_locked(self):
|
||||||
|
wallet = self.session.wallet
|
||||||
|
if wallet.wallet.use_encryption:
|
||||||
|
self.startup_status = STARTUP_STAGES[7]
|
||||||
|
|
||||||
|
yield wallet.check_locked()
|
||||||
|
|
||||||
def _setup_stream_identifier(self):
|
def _setup_stream_identifier(self):
|
||||||
file_saver_factory = EncryptedFileSaverFactory(
|
file_saver_factory = EncryptedFileSaverFactory(
|
||||||
self.session.peer_finder,
|
self.session.peer_finder,
|
||||||
|
|
Loading…
Reference in a new issue