Browse Source

qt: do not show UntrustedServerReturnedError when sweeping

We should not show the untrusted text in the GUI...
With this change, we still log the text, but otherwise it should avoid
unintentionally showing it anywhere, as the original exception is
masked away.

related: https://github.com/spesmilo/electrum/issues/8599#issuecomment-1706775508

Example traceback (and the exc is then shown in main_window.on_error):
```
 10.77 | D | n/network | got error from server for Network.listunspent_for_scripthash: <UntrustedServerReturnedError [DO NOT TRUST THIS MESSAGE] original_exception: "RPCError(0, 'heyheyhey')">
 10.78 | E | gui.qt.main_window.[test_segwit_2] | on_error
Traceback (most recent call last):
  File "...\electrum\electrum\network.py", line 898, in wrapper
    return await func(self, *args, **kwargs)
  File "...\electrum\electrum\network.py", line 1149, in listunspent_for_scripthash
    return await self.interface.listunspent_for_scripthash(sh)
  File "...\electrum\electrum\interface.py", line 1027, in listunspent_for_scripthash
    raise aiorpcx.jsonrpc.RPCError(0, "heyheyhey")
aiorpcx.jsonrpc.RPCError: (0, 'heyheyhey')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "...\electrum\electrum\gui\qt\util.py", line 925, in run
    result = task.task()
  File "...\electrum\electrum\gui\qt\main_window.py", line 2505, in <lambda>
    task = lambda: self.network.run_from_another_thread(
  File "...\electrum\electrum\network.py", line 383, in run_from_another_thread
    return fut.result(timeout)
  File "...\Python310\lib\concurrent\futures\_base.py", line 458, in result
    return self.__get_result()
  File "...\Python310\lib\concurrent\futures\_base.py", line 403, in __get_result
    raise self._exception
  File "...\electrum\electrum\wallet.py", line 151, in sweep_preparations
    async with OldTaskGroup() as group:
  File "...\aiorpcX\aiorpcx\curio.py", line 304, in __aexit__
    await self.join()
  File "...\electrum\electrum\util.py", line 1316, in join
    task.result()
  File "...\electrum\electrum\wallet.py", line 142, in find_utxos_for_privkey
    await _append_utxos_to_inputs(
  File "...\electrum\electrum\wallet.py", line 129, in _append_utxos_to_inputs
    u = await network.listunspent_for_scripthash(scripthash)
  File "...\electrum\electrum\network.py", line 872, in make_reliable_wrapper
    async with OldTaskGroup(wait=any) as group:
  File "...\aiorpcX\aiorpcx\curio.py", line 304, in __aexit__
    await self.join()
  File "...\electrum\electrum\util.py", line 1327, in join
    self.completed.result()
  File "...\electrum\electrum\network.py", line 903, in wrapper
    raise wrapped_exc from e
electrum.network.UntrustedServerReturnedError: The server returned an error.
```
master
SomberNight 2 years ago
parent
commit
f28a2824d5
No known key found for this signature in database
GPG Key ID: B33B5F232C6271E9
  1. 15
      electrum/network.py

15
electrum/network.py

@ -238,13 +238,20 @@ class UntrustedServerReturnedError(NetworkException):
def get_message_for_gui(self) -> str:
return str(self)
def get_untrusted_message(self) -> str:
e = self.original_exception
return (f"<UntrustedServerReturnedError "
f"[DO NOT TRUST THIS MESSAGE] original_exception: {error_text_str_to_safe_str(repr(e))}>")
def __str__(self):
# We should not show the untrusted text from self.original_exception,
# to avoid accidentally showing it in the GUI.
return _("The server returned an error.")
def __repr__(self):
e = self.original_exception
return (f"<UntrustedServerReturnedError "
f"[DO NOT TRUST THIS MESSAGE] original_exception: {error_text_str_to_safe_str(repr(e))}>")
# We should not show the untrusted text from self.original_exception,
# to avoid accidentally showing it in the GUI.
return f"<UntrustedServerReturnedError {str(self)!r}>"
_INSTANCE = None
@ -899,7 +906,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
except aiorpcx.jsonrpc.CodeMessageError as e:
wrapped_exc = UntrustedServerReturnedError(original_exception=e)
# log (sanitized) untrusted error text now, to ease debugging
self.logger.debug(f"got error from server for {func.__qualname__}: {wrapped_exc!r}")
self.logger.debug(f"got error from server for {func.__qualname__}: {wrapped_exc.get_untrusted_message()!r}")
raise wrapped_exc from e
return wrapper

Loading…
Cancel
Save