summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-03-31 09:50:25 +0200
committerFlorian Bruhin <me@the-compiler.org>2021-03-31 13:57:51 +0200
commit8d18255563968496c8d893a301405d33dcdc02d5 (patch)
tree8691d45f1e26691fb0ece933dab55c79efb1680c
parent45d34846c8d43939f07f2c74cab761224a39bf20 (diff)
downloadqutebrowser-8d18255563968496c8d893a301405d33dcdc02d5.tar.gz
qutebrowser-8d18255563968496c8d893a301405d33dcdc02d5.zip
flatpak: Try getting ID from /.flatpak_info
(cherry picked from commit 8b49d87526dd34380df6e98800ecc82367b48be1)
-rw-r--r--qutebrowser/utils/standarddir.py3
-rw-r--r--qutebrowser/utils/version.py27
-rw-r--r--tests/unit/config/test_qtargs_locale_workaround.py2
-rw-r--r--tests/unit/misc/test_ipc.py8
-rw-r--r--tests/unit/utils/test_standarddir.py10
-rw-r--r--tests/unit/utils/test_utils.py9
-rw-r--r--tests/unit/utils/test_version.py34
7 files changed, 57 insertions, 36 deletions
diff --git a/qutebrowser/utils/standarddir.py b/qutebrowser/utils/standarddir.py
index a7a2969ff..1b981f227 100644
--- a/qutebrowser/utils/standarddir.py
+++ b/qutebrowser/utils/standarddir.py
@@ -236,7 +236,8 @@ def _init_runtime(args: Optional[argparse.Namespace]) -> None:
if version.is_flatpak():
*parts, app_name = os.path.split(path)
assert app_name == APPNAME, app_name
- flatpak_id = os.environ.get('FLATPAK_ID', 'org.qutebrowser.qutebrowser')
+ flatpak_id = version.flatpak_id()
+ assert flatpak_id is not None
path = os.path.join(*parts, 'app', flatpak_id)
_create(path)
diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py
index b9ca21f6d..d623c802b 100644
--- a/qutebrowser/utils/version.py
+++ b/qutebrowser/utils/version.py
@@ -27,6 +27,8 @@ import platform
import subprocess
import importlib
import collections
+import pathlib
+import configparser
import enum
import datetime
import getpass
@@ -195,10 +197,27 @@ def is_flatpak() -> bool:
If packaged via Flatpak, the environment is has restricted access to the host
system.
"""
- current_distro = distribution()
- if current_distro is None:
- return False
- return current_distro.parsed == Distribution.kde_flatpak
+ return flatpak_id() is not None
+
+
+_FLATPAK_INFO_PATH = '/.flatpak-info'
+
+
+def flatpak_id() -> Optional[str]:
+ """Get the ID of the currently running Flatpak (or None if outside of Flatpak)."""
+ if 'FLATPAK_ID' in os.environ:
+ return os.environ['FLATPAK_ID']
+
+ # 'FLATPAK_ID' was only added in Flatpak 1.2.0:
+ # https://lists.freedesktop.org/archives/flatpak/2019-January/001464.html
+ # but e.g. Ubuntu 18.04 ships 1.0.9.
+ info_file = pathlib.Path(_FLATPAK_INFO_PATH)
+ if not info_file.exists():
+ return None
+
+ parser = configparser.ConfigParser()
+ parser.read(info_file)
+ return parser['Application']['name']
def _git_str() -> Optional[str]:
diff --git a/tests/unit/config/test_qtargs_locale_workaround.py b/tests/unit/config/test_qtargs_locale_workaround.py
index 6a8f2b8e1..f4e002424 100644
--- a/tests/unit/config/test_qtargs_locale_workaround.py
+++ b/tests/unit/config/test_qtargs_locale_workaround.py
@@ -448,7 +448,7 @@ def test_disabled(qtwe_version, config_stub):
@pytest.mark.fake_os('linux')
-def test_no_locales_available(qtwe_version, monkeypatch, caplog):
+def test_no_locales_available(qtwe_version, monkeypatch, caplog, request):
path = pathlib.Path('/doesnotexist/qtwebengine_locales')
assert not path.exists()
monkeypatch.setattr(qtargs, '_webengine_locales_path', lambda: path)
diff --git a/tests/unit/misc/test_ipc.py b/tests/unit/misc/test_ipc.py
index e93578853..51d7c6343 100644
--- a/tests/unit/misc/test_ipc.py
+++ b/tests/unit/misc/test_ipc.py
@@ -236,8 +236,14 @@ class TestSocketName:
(None, 'ipc-{}'.format(md5('testusername'))),
('/x', 'ipc-{}'.format(md5('testusername-/x'))),
])
+ @pytest.mark.parametrize('has_flatpak_id', [True, False])
@pytest.mark.skipif(not version.is_flatpak(), reason="Needs Flatpak")
- def test_flatpak(self, basedir, fake_runtime_dir, expected):
+ def test_flatpak(self, monkeypatch, fake_runtime_dir,
+ basedir, expected, has_flatpak_id):
+ if not has_flatpak_id:
+ # Simulate an older Flatpak version
+ monkeypatch.delenv('FLATPAK_ID', raising=False)
+
socketname = ipc._get_socketname(basedir)
expected_path = str(
fake_runtime_dir / 'app' / 'org.qutebrowser.qutebrowser' / expected)
diff --git a/tests/unit/utils/test_standarddir.py b/tests/unit/utils/test_standarddir.py
index 733832c6b..a16cb3c04 100644
--- a/tests/unit/utils/test_standarddir.py
+++ b/tests/unit/utils/test_standarddir.py
@@ -209,9 +209,7 @@ class TestStandardDir:
@pytest.mark.linux
@pytest.mark.parametrize('args_basedir', [True, False])
- @pytest.mark.parametrize('has_flatpak_id', [True, False])
- def test_flatpak_runtimedir(self, monkeypatch, tmp_path,
- args_basedir, has_flatpak_id):
+ def test_flatpak_runtimedir(self, monkeypatch, tmp_path, args_basedir):
runtime_path = tmp_path / 'runtime'
runtime_path.mkdir()
runtime_path.chmod(0o0700)
@@ -220,11 +218,7 @@ class TestStandardDir:
monkeypatch.setattr(version, 'is_flatpak', lambda: True)
monkeypatch.setenv('XDG_RUNTIME_DIR', str(runtime_path))
-
- if has_flatpak_id:
- monkeypatch.setenv('FLATPAK_ID', app_id)
- else:
- monkeypatch.delenv('FLATPAK_ID', raising=False)
+ monkeypatch.setenv('FLATPAK_ID', app_id)
if args_basedir:
init_args = types.SimpleNamespace(basedir=str(tmp_path))
diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py
index c9c124a0a..c72add6c8 100644
--- a/tests/unit/utils/test_utils.py
+++ b/tests/unit/utils/test_utils.py
@@ -770,15 +770,8 @@ class TestOpenFile:
@pytest.fixture
def sandbox_patch(self, monkeypatch):
- info = version.DistributionInfo(
- id='org.kde.Platform',
- parsed=version.Distribution.kde_flatpak,
- version=VersionNumber.parse('5.12'),
- pretty='Unknown')
-
if not version.is_flatpak():
- monkeypatch.setattr(version, 'distribution', lambda: info)
-
+ monkeypatch.setenv('FLATPAK_ID', 'org.qutebrowser.qutebrowser')
assert version.is_flatpak()
def test_cmdline_sandboxed(self, sandbox_patch,
diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py
index 7ad223e4b..dcca7e790 100644
--- a/tests/unit/utils/test_version.py
+++ b/tests/unit/utils/test_version.py
@@ -304,19 +304,27 @@ def test_distribution(tmpdir, monkeypatch, os_release, expected):
assert version.distribution() == expected
-@pytest.mark.parametrize('distribution, expected', [
- (None, False),
- (version.DistributionInfo(
- id='org.kde.Platform', parsed=version.Distribution.kde_flatpak,
- version=utils.VersionNumber(5, 12),
- pretty='Unknown'), True),
- (version.DistributionInfo(
- id='arch', parsed=version.Distribution.arch, version=None,
- pretty='Arch Linux'), False)
-])
-def test_is_flatpak(monkeypatch, distribution, expected):
- monkeypatch.setattr(version, "distribution", lambda: distribution)
- assert version.is_flatpak() == expected
+@pytest.mark.parametrize('has_env', [True, False])
+@pytest.mark.parametrize('has_file', [True, False])
+def test_is_flatpak(monkeypatch, tmp_path, has_env, has_file):
+ if has_env:
+ monkeypatch.setenv('FLATPAK_ID', 'org.qutebrowser.qutebrowser')
+ else:
+ monkeypatch.delenv('FLATPAK_ID', raising=False)
+
+ fake_info_path = tmp_path / '.flatpak_info'
+ if has_file:
+ lines = [
+ "[Application]",
+ "name=org.qutebrowser.qutebrowser",
+ "runtime=runtime/org.kde.Platform/x86_64/5.15",
+ ]
+ fake_info_path.write_text('\n'.join(lines))
+ else:
+ assert not fake_info_path.exists()
+ monkeypatch.setattr(version, '_FLATPAK_INFO_PATH', str(fake_info_path))
+
+ assert version.is_flatpak() == (has_env or has_file)
class GitStrSubprocessFake: