Browse Source

Merge #1164: Ensure coinjoin state is reset if wallet switches.

d493343 Ensure coinjoin state is reset if wallet switches. (Adam Gibson)
master
Adam Gibson 4 years ago
parent
commit
455d2f6f7b
No known key found for this signature in database
GPG Key ID: 141001A1AF77F20B
  1. 41
      jmclient/jmclient/wallet_rpc.py

41
jmclient/jmclient/wallet_rpc.py

@ -217,19 +217,40 @@ class JMWalletDaemon(Service):
return (listener_rpc, listener_ws)
def stopService(self):
""" Encapsulates shut down actions.
""" Top-level service (JMWalletDaemon itself) shutdown.
"""
self.stopSubServices()
super().stopService()
def stopSubServices(self):
""" This:
- shuts down the wallet service, and deletes its name.
- removes the currently valid auth token.
- shuts down any other running sub-services, such as yieldgenerator.
- shuts down (aborts) any taker-side coinjoining happening.
"""
# Currently valid authorization tokens must be removed
# from the daemon:
self.cookie = None
if self.wss_factory:
self.wss_factory.valid_token = None
self.wallet_name = None
# if the wallet-daemon is shut down, all services
# it encapsulates must also be shut down.
for name, service in self.services.items():
if service:
service.stopService()
super().stopService()
# these Services cannot be guaranteed to be
# re-startable (the WalletService for example,
# is explicitly not). So we remove these references
# after stopping.
for n in self.services:
self.services[n] = None
# taker is not currently encapsulated with a Service;
# if it is running, shut down:
if self.coinjoin_state == CJ_TAKER_RUNNING:
self.taker.aborted = True
self.taker_finished(False)
def err(self, request, message):
""" Return errors in a standard format.
@ -370,7 +391,7 @@ class JMWalletDaemon(Service):
# are any.
# This will stop all supporting services and wipe
# state (so wallet, maker service and cookie/token):
self.stopService()
self.stopSubServices()
self.services["wallet"] = WalletService(wallet)
# restart callback needed, otherwise wallet creation will
@ -656,11 +677,12 @@ class JMWalletDaemon(Service):
# lock multiple times:
already_locked = True
else:
self.services["wallet"].stopService()
self.cookie = None
self.wss_factory.valid_token = None
self.services["wallet"] = None
self.wallet_name = None
# notice that here a wallet locking event shuts down
# everything.
# TODO: changing this so a maker can run in the background
# while locked, will require auto-detection of coinjoin
# state on future unlock.
self.stopSubServices()
already_locked = False
return make_jmwalletd_response(request, walletname=walletname,
already_locked=already_locked)
@ -926,6 +948,9 @@ class JMWalletDaemon(Service):
raise InvalidRequestFormat()
if not self.coinjoin_state == CJ_TAKER_RUNNING:
raise ServiceNotStarted()
# prevent the next step, responding to AMP messages
# from jmdaemon backend, from continuing:
self.taker.aborted = True
self.taker_finished(False)
return make_jmwalletd_response(request, status=202)

Loading…
Cancel
Save