URI: 
       tfix #5618 - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit d5d9f5b46cf9cea6e4770d22396c28e82ebb3b2b
   DIR parent 83fcdbd561ee3a72a78eabe16cb9aee57fdf67b3
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sun,  8 Sep 2019 12:06:21 +0200
       
       fix #5618
       
       Diffstat:
         M electrum/daemon.py                  |      14 ++++++++------
       
       1 file changed, 8 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/electrum/daemon.py b/electrum/daemon.py
       t@@ -271,6 +271,7 @@ class Daemon(Logger):
            @profiler
            def __init__(self, config: SimpleConfig, fd=None, *, listen_jsonrpc=True):
                Logger.__init__(self)
       +        self.auth_lock = asyncio.Lock()
                self.running = False
                self.running_lock = threading.Lock()
                self.config = config
       t@@ -302,7 +303,7 @@ class Daemon(Logger):
                if self.network:
                    self.network.start(jobs)
        
       -    def authenticate(self, headers):
       +    async def authenticate(self, headers):
                if self.rpc_password == '':
                    # RPC authentication is disabled
                    return
       t@@ -317,14 +318,15 @@ class Daemon(Logger):
                username, _, password = credentials.partition(':')
                if not (constant_time_compare(username, self.rpc_user)
                        and constant_time_compare(password, self.rpc_password)):
       -            time.sleep(0.050)
       +            await asyncio.sleep(0.050)
                    raise AuthenticationError('Invalid Credentials')
        
            async def handle(self, request):
       -        try:
       -            self.authenticate(request.headers)
       -        except AuthenticationError:
       -            return web.Response(text='Forbidden', status=403)
       +        async with self.auth_lock:
       +            try:
       +                await self.authenticate(request.headers)
       +            except AuthenticationError:
       +                return web.Response(text='Forbidden', status=403)
                request = await request.text()
                response = await jsonrpcserver.async_dispatch(request, methods=self.methods)
                if isinstance(response, jsonrpcserver.response.ExceptionResponse):