diff options
author | Ingrid Budau <twigle_ingrid@yahoo.com> | 2021-11-09 09:29:05 +0100 |
---|---|---|
committer | Ingrid Budau <twigle_ingrid@yahoo.com> | 2021-11-09 09:29:05 +0100 |
commit | 5b2926fe1f325074954614801175f06981927be9 (patch) | |
tree | 1bdad4286b1b881d508b7e236a26a391b90a7565 /qutebrowser | |
parent | d379bebafd31b08326df62102dec295b1eb66474 (diff) | |
parent | 1f641c8c450d21441d36194bd606b64d362a6f75 (diff) | |
download | qutebrowser-5b2926fe1f325074954614801175f06981927be9.tar.gz qutebrowser-5b2926fe1f325074954614801175f06981927be9.zip |
Merge github.com:twigleingrid/qutebrowser into settings-frontend-new-css
Diffstat (limited to 'qutebrowser')
-rw-r--r-- | qutebrowser/__init__.py | 2 | ||||
-rw-r--r-- | qutebrowser/browser/webengine/notification.py | 4 | ||||
-rw-r--r-- | qutebrowser/config/configdata.yml | 15 | ||||
-rw-r--r-- | qutebrowser/extensions/loader.py | 36 | ||||
-rw-r--r-- | qutebrowser/misc/earlyinit.py | 14 | ||||
-rw-r--r-- | qutebrowser/misc/guiprocess.py | 6 | ||||
-rw-r--r-- | qutebrowser/qutebrowser.py | 25 | ||||
-rw-r--r-- | qutebrowser/utils/resources.py | 2 | ||||
-rw-r--r-- | qutebrowser/utils/utils.py | 7 | ||||
-rw-r--r-- | qutebrowser/utils/version.py | 2 |
10 files changed, 62 insertions, 51 deletions
diff --git a/qutebrowser/__init__.py b/qutebrowser/__init__.py index 29a8e4836..c05215792 100644 --- a/qutebrowser/__init__.py +++ b/qutebrowser/__init__.py @@ -26,7 +26,7 @@ __copyright__ = "Copyright 2014-2021 Florian Bruhin (The Compiler)" __license__ = "GPL" __maintainer__ = __author__ __email__ = "mail@qutebrowser.org" -__version__ = "2.3.1" +__version__ = "2.4.0" __version_info__ = tuple(int(part) for part in __version__.split('.')) __description__ = "A keyboard-driven, vim-like browser based on PyQt5." diff --git a/qutebrowser/browser/webengine/notification.py b/qutebrowser/browser/webengine/notification.py index e40b3e736..f8e1a59b1 100644 --- a/qutebrowser/browser/webengine/notification.py +++ b/qutebrowser/browser/webengine/notification.py @@ -715,6 +715,10 @@ class DBusNotificationAdapter(AbstractNotificationAdapter): # https://github.com/KDE/plasma-workspace/blob/v5.21.4/libnotificationmanager/server_p.cpp#L227-L237 # Created too many similar notifications in quick succession "org.freedesktop.Notifications.Error.ExcessNotificationGeneration", + + # From https://crashes.qutebrowser.org/view/b8c9838a - probably when + # notification daemon crashes? + "org.freedesktop.DBus.Error.Spawn.ChildSignaled", } def __init__(self, parent: QObject = None) -> None: diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index a525e2426..e034fe8f5 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -679,14 +679,14 @@ content.headers.user_agent: # Vim-protip: Place your cursor below this comment and run # :r!python scripts/dev/ua_fetch.py - - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, - like Gecko) Chrome/90.0.4430.93 Safari/537.36" - - Chrome 90 Win10 + like Gecko) Chrome/92.0.4515.131 Safari/537.36" + - Chrome 92 Win10 - - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 - (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" - - Chrome 90 macOS + (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" + - Chrome 92 macOS - - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like - Gecko) Chrome/90.0.4430.93 Safari/537.36" - - Chrome 90 Linux + Gecko) Chrome/92.0.4515.131 Safari/537.36" + - Chrome 92 Linux supports_pattern: true desc: | User agent to send. @@ -1060,7 +1060,8 @@ content.proxy: `http://...` URL. Note that with QtWebEngine, it will take a couple of seconds until the - change is applied, if this value is changed at runtime. + change is applied, if this value is changed at runtime. Authentication for + SOCKS proxies isn't supported due to Chromium limitations. content.proxy_dns_requests: default: true diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 7ae45023b..c7b619b3e 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -21,12 +21,11 @@ import pkgutil import types -import sys import pathlib import importlib import argparse import dataclasses -from typing import Callable, Iterator, List, Optional, Set, Tuple +from typing import Callable, Iterator, List, Optional, Tuple from PyQt5.QtCore import pyqtSlot @@ -95,18 +94,6 @@ def load_components(*, skip_hooks: bool = False) -> None: def walk_components() -> Iterator[ExtensionInfo]: """Yield ExtensionInfo objects for all modules.""" - if hasattr(sys, 'frozen'): - yield from _walk_pyinstaller() - else: - yield from _walk_normal() - - -def _on_walk_error(name: str) -> None: - raise ImportError("Failed to import {}".format(name)) - - -def _walk_normal() -> Iterator[ExtensionInfo]: - """Walk extensions when not using PyInstaller.""" for _finder, name, ispkg in pkgutil.walk_packages( # Only packages have a __path__ attribute, # but we're sure this is one. @@ -123,23 +110,6 @@ def _walk_normal() -> Iterator[ExtensionInfo]: yield ExtensionInfo(name=name) -def _walk_pyinstaller() -> Iterator[ExtensionInfo]: - """Walk extensions when using PyInstaller. - - See https://github.com/pyinstaller/pyinstaller/issues/1905 - - Inspired by: - https://github.com/webcomics/dosage/blob/master/dosagelib/loader.py - """ - toc: Set[str] = set() - for importer in pkgutil.iter_importers('qutebrowser'): - if hasattr(importer, 'toc'): - toc |= importer.toc # type: ignore[union-attr] - for name in toc: - if name.startswith(components.__name__ + '.'): - yield ExtensionInfo(name=name) - - def _get_init_context() -> InitContext: """Get an InitContext object.""" return InitContext(data_dir=pathlib.Path(standarddir.data()), @@ -190,3 +160,7 @@ def _on_config_changed(changed_name: str) -> None: def init() -> None: config.instance.changed.connect(_on_config_changed) + + +def _on_walk_error(name: str) -> None: + raise ImportError("Failed to import {}".format(name)) diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py index c4ff0bb85..f27b7acfe 100644 --- a/qutebrowser/misc/earlyinit.py +++ b/qutebrowser/misc/earlyinit.py @@ -111,17 +111,23 @@ def init_faulthandler(fileobj=sys.__stderr__): Args: fobj: An opened file object to write the traceback to. """ - if fileobj is None: + try: + faulthandler.enable(fileobj) + except (RuntimeError, AttributeError): # When run with pythonw.exe, sys.__stderr__ can be None: # https://docs.python.org/3/library/sys.html#sys.__stderr__ - # If we'd enable faulthandler in that case, we just get a weird - # exception, so we don't enable faulthandler if we have no stdout. + # + # With PyInstaller, it can be a NullWriter raising AttributeError on + # fileno: https://github.com/pyinstaller/pyinstaller/issues/4481 # # Later when we have our data dir available we re-enable faulthandler # to write to a file so we can display a crash to the user at the next # start. + # + # Note that we don't have any logging initialized yet at this point, so + # this is a silent error. return - faulthandler.enable(fileobj) + if (hasattr(faulthandler, 'register') and hasattr(signal, 'SIGUSR1') and sys.stderr is not None): # If available, we also want a traceback on SIGUSR1. diff --git a/qutebrowser/misc/guiprocess.py b/qutebrowser/misc/guiprocess.py index e5ccd1b8b..c93fad09b 100644 --- a/qutebrowser/misc/guiprocess.py +++ b/qutebrowser/misc/guiprocess.py @@ -27,7 +27,7 @@ from typing import Mapping, Sequence, Dict, Optional from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QObject, QProcess, QProcessEnvironment, QByteArray, QUrl, Qt) -from qutebrowser.utils import message, log, utils, usertypes +from qutebrowser.utils import message, log, utils, usertypes, version from qutebrowser.api import cmdutils, apitypes from qutebrowser.completion.models import miscmodels @@ -273,7 +273,9 @@ class GUIProcess(QObject): known_errors = ['No such file or directory', 'Permission denied'] if (': ' in error_string and # pragma: no branch error_string.split(': ', maxsplit=1)[1] in known_errors): - msg += f'\n(Hint: Make sure {self.cmd!r} exists and is executable)' + msg += f'\nHint: Make sure {self.cmd!r} exists and is executable' + if version.is_flatpak(): + msg += ' inside the Flatpak container' message.error(msg) diff --git a/qutebrowser/qutebrowser.py b/qutebrowser/qutebrowser.py index d0819f832..c576c4a06 100644 --- a/qutebrowser/qutebrowser.py +++ b/qutebrowser/qutebrowser.py @@ -87,6 +87,11 @@ def get_argparser(): help="Set the base name of the desktop entry for this " "application. Used to set the app_id under Wayland. See " "https://doc.qt.io/qt-5/qguiapplication.html#desktopFileName-prop") + parser.add_argument('--untrusted-args', + action='store_true', + help="Mark all following arguments as untrusted, which " + "enforces that they are URLs/search terms (and not flags or " + "commands)") parser.add_argument('--json-args', help=argparse.SUPPRESS) parser.add_argument('--temp-basedir-restarted', @@ -207,7 +212,27 @@ def _unpack_json_args(args): return argparse.Namespace(**new_args) +def _validate_untrusted_args(argv): + # NOTE: Do not use f-strings here, as this should run with older Python + # versions (so that a proper error can be displayed) + try: + untrusted_idx = argv.index('--untrusted-args') + except ValueError: + return + + rest = argv[untrusted_idx + 1:] + if len(rest) > 1: + sys.exit( + "Found multiple arguments ({}) after --untrusted-args, " + "aborting.".format(' '.join(rest))) + + for arg in rest: + if arg.startswith(('-', ':')): + sys.exit("Found {} after --untrusted-args, aborting.".format(arg)) + + def main(): + _validate_untrusted_args(sys.argv) parser = get_argparser() argv = sys.argv[1:] args = parser.parse_args(argv) diff --git a/qutebrowser/utils/resources.py b/qutebrowser/utils/resources.py index ff5ec9d9a..f561d6747 100644 --- a/qutebrowser/utils/resources.py +++ b/qutebrowser/utils/resources.py @@ -82,7 +82,7 @@ def _glob( else: # zipfile.Path or importlib_resources compat object # Unfortunately, we can't tell mypy about resource_path being of type # Union[pathlib.Path, zipfile.Path] because we set "python_version = 3.6" in - # .mypy.ini, but the zipfiel stubs (correctly) only declare zipfile.Path with + # .mypy.ini, but the zipfile stubs (correctly) only declare zipfile.Path with # Python 3.8... assert glob_path.is_dir(), glob_path # type: ignore[unreachable] for subpath in glob_path.iterdir(): diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py index a56769255..f42515c5c 100644 --- a/qutebrowser/utils/utils.py +++ b/qutebrowser/utils/utils.py @@ -669,11 +669,12 @@ def yaml_load(f: Union[str, IO[str]]) -> Any: r"of from 'collections\.abc' is deprecated.*"): try: data = yaml.load(f, Loader=YamlLoader) - except ValueError as e: - if str(e).startswith('could not convert string to float'): + except ValueError as e: # pragma: no cover + pyyaml_error = 'could not convert string to float' + if str(e).startswith(pyyaml_error): # WORKAROUND for https://github.com/yaml/pyyaml/issues/168 raise yaml.YAMLError(e) - raise # pragma: no cover + raise end = datetime.datetime.now() diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 8cd244fca..3beb6fb83 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -773,8 +773,6 @@ def _backend() -> str: if objects.backend == usertypes.Backend.QtWebKit: return 'new QtWebKit (WebKit {})'.format(qWebKitVersion()) elif objects.backend == usertypes.Backend.QtWebEngine: - webengine = usertypes.Backend.QtWebEngine - assert objects.backend == webengine, objects.backend return str(qtwebengine_versions( avoid_init='avoid-chromium-init' in objects.debug_flags)) raise utils.Unreachable(objects.backend) |