From f28a2824d576d32973de8374dab014183e985724 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Tue, 5 Sep 2023 15:47:33 +0000 Subject: [PATCH] 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: 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 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. ``` --- electrum/network.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/electrum/network.py b/electrum/network.py index 0ea79d3c8..e59e17aca 100644 --- a/electrum/network.py +++ b/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"") + 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"") + # We should not show the untrusted text from self.original_exception, + # to avoid accidentally showing it in the GUI. + return f"" _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