backend/flatpak_overrides: add new functions for file access overrides

This commit is contained in:
tfuxu 2022-12-19 18:31:45 +01:00
parent 354010ae22
commit c9d101da0b
No known key found for this signature in database
GPG key ID: 79CFC3B9B31C098A

View file

@ -20,6 +20,8 @@ import os
from gi.repository import GLib, Gio, Adw
from gradience.backend.constants import app_id
from gradience.backend.logger import Logger
logging = Logger()
@ -32,10 +34,10 @@ class InvalidGTKVersion(Exception):
pass
""" Internal helper functions (shouldn't be used outside this file) """
""" Internal helper functions (shouldn't be used outside this module) """
def get_system_flatpak_path():
def __get_system_flatpak_path():
systemPath = GLib.getenv("FLATPAK_SYSTEM_DIR")
logging.debug(f"systemPath: {systemPath}")
@ -47,7 +49,7 @@ def get_system_flatpak_path():
return GLib.build_filenamev([systemDataDir, "flatpak"])
def get_user_flatpak_path():
def __get_user_flatpak_path():
userPath = GLib.getenv("FLATPAK_USER_DIR")
logging.debug(f"userPath: {userPath}")
@ -60,7 +62,7 @@ def get_user_flatpak_path():
return GLib.build_filenamev([userDataDir, "flatpak"])
def user_save_keyfile(settings, user_keyfile, filename, gtk_ver, toast_overlay=None):
def __user_save_keyfile(user_keyfile, filename, settings=None, gtk_ver=None, toast_overlay=None):
try:
user_keyfile.save_to_file(filename)
except GLib.GError as e:
@ -68,19 +70,21 @@ def user_save_keyfile(settings, user_keyfile, filename, gtk_ver, toast_overlay=N
toast_overlay.add_toast(Adw.Toast(title=_("Failed to save override")))
logging.error(f"Failed to save keyfile structure to override. Exc: {e}")
else:
if gtk_ver == "gtk4":
if gtk_ver == "gtk4" and settings:
settings.set_boolean("user-flatpak-theming-gtk4", True)
logging.debug(
f"user-flatpak-theming-gtk4: {settings.get_boolean('user-flatpak-theming-gtk4')}"
)
elif gtk_ver == "gtk3":
elif gtk_ver == "gtk3" and settings:
settings.set_boolean("user-flatpak-theming-gtk3", True)
logging.debug(
f"user-flatpak-theming-gtk3: {settings.get_boolean('user-flatpak-theming-gtk3')}"
)
elif not gtk_ver and not settings:
logging.debug("DEV WARNING: 'gtk_ver' and 'settings' parameters aren't set for '__user_save_keyfile' function. Unless you aren't using '{create,remove}_*_override' functions, this is a bug.")
def global_save_keyfile(settings, global_keyfile, filename, gtk_ver, toast_overlay=None):
def __global_save_keyfile(global_keyfile, filename, settings=None, gtk_ver=None, toast_overlay=None):
try:
global_keyfile.save_to_file(filename)
except GLib.GError as e:
@ -88,23 +92,166 @@ def global_save_keyfile(settings, global_keyfile, filename, gtk_ver, toast_overl
toast_overlay.add_toast(Adw.Toast(title=_("Failed to save override")))
logging.error(f"Failed to save keyfile structure to override. Exc: {e}")
else:
if gtk_ver == "gtk4":
if gtk_ver == "gtk4" and settings:
settings.set_boolean("global-flatpak-theming-gtk4", True)
logging.debug(
f"global-flatpak-theming-gtk4: {settings.get_boolean('global-flatpak-theming-gtk4')}"
)
elif gtk_ver == "gtk3":
elif gtk_ver == "gtk3" and settings:
settings.set_boolean("global-flatpak-theming-gtk3", True)
logging.debug(
f"global-flatpak-theming-gtk3: {settings.get_boolean('global-flatpak-theming-gtk3')}"
)
elif not gtk_ver and not settings:
logging.debug("DEV WARNING: 'gtk_ver' and 'settings' parameters aren't set for '__global_save_keyfile' function. Unless you aren't using '{create,remove}_*_override' functions, this is a bug.")
""" Main functions """
def list_file_access():
override_dir = GLib.build_filenamev([__get_user_flatpak_path(), "overrides"])
logging.debug(f"override_dir: {override_dir}")
filename = GLib.build_filenamev([override_dir, app_id])
user_keyfile = GLib.KeyFile.new()
try:
user_keyfile.load_from_file(filename, GLib.KeyFileFlags.NONE)
except GLib.GError as e:
if e.code == 4:
logging.debug("Gradience overrides file doesn't exist")
return False
else:
logging.error(f"Unhandled GLib.FileError error code. Exc: {e}")
raise
else:
try:
filesys_list = user_keyfile.get_string_list(
"Context", "filesystems")
except GLib.GError:
logging.debug("No values in 'filesystems' override")
return False
else:
return filesys_list
# TODO: Frontend: Show information to user to relaunch Gradience, as this function modifies \
# Gradience's overrides.
def allow_file_access(directory, toast_overlay=None):
override_dir = GLib.build_filenamev([__get_user_flatpak_path(), "overrides"])
logging.debug(f"override_dir: {override_dir}")
without_access_spec = (
not ":ro" in directory
and not ":rw" in directory
and not ":create" in directory
)
if without_access_spec:
directory += ":ro"
filename = GLib.build_filenamev([override_dir, app_id])
user_keyfile = GLib.KeyFile.new()
try:
user_keyfile.load_from_file(filename, GLib.KeyFileFlags.NONE)
except GLib.GError as e:
if e.code == 4:
logging.debug("File doesn't exist. Attempting to create one")
if not os.path.exists(override_dir):
try:
dirs = Gio.File.new_for_path(override_dir)
dirs.make_directory_with_parents(None)
except GLib.GError as e:
logging.error(f"Unable to create directories. Exc: {e}")
raise
else:
logging.debug("Directories created.")
file = Gio.File.new_for_path(filename)
file.create(Gio.FileCreateFlags.NONE, None)
user_keyfile.load_from_file(filename, GLib.KeyFileFlags.NONE)
user_keyfile.set_string("Context", "filesystems", directory)
__user_save_keyfile(user_keyfile, filename,
toast_overlay=toast_overlay)
else:
if toast_overlay:
toast_overlay.add_toast(
Adw.Toast(title=_("Unexpected file error occurred"))
)
logging.error(f"Unhandled GLib.FileError error code. Exc: {e}")
else:
try:
filesys_list = user_keyfile.get_string_list(
"Context", "filesystems")
except GLib.GError:
user_keyfile.set_string("Context", "filesystems", directory)
__user_save_keyfile(user_keyfile, filename,
toast_overlay=toast_overlay)
else:
if directory not in filesys_list:
user_keyfile.set_string_list(
"Context", "filesystems", filesys_list + [directory]
)
__user_save_keyfile(user_keyfile, filename,
toast_overlay=toast_overlay)
else:
logging.info("Path is already allowed")
# TODO: Frontend: Show information to user to relaunch Gradience, as this function modifies \
# Gradience's overrides.
def disallow_file_access(directory, toast_overlay=None):
override_dir = GLib.build_filenamev([__get_user_flatpak_path(), "overrides"])
logging.debug(f"override_dir: {override_dir}")
filename = GLib.build_filenamev([override_dir, app_id])
user_keyfile = GLib.KeyFile.new()
try:
user_keyfile.load_from_file(filename, GLib.KeyFileFlags.NONE)
except GLib.GError as e:
if e.code == 4:
logging.debug("File doesn't exist")
return
else:
if toast_overlay:
toast_overlay.add_toast(
Adw.Toast(title=_("Unexpected file error occurred"))
)
logging.error(f"Unhandled GLib.FileError error code. Exc: {e}")
raise
else:
try:
filesys_list = user_keyfile.get_string_list(
"Context", "filesystems")
except GLib.GError:
logging.debug("Group/key not found")
return
else:
if directory in filesys_list:
logging.debug(f"before: {filesys_list}")
filesys_list.remove(directory)
logging.debug(f"after: {filesys_list}")
user_keyfile.set_string_list(
"Context", "filesystems", filesys_list)
__user_save_keyfile(user_keyfile, filename,
toast_overlay=toast_overlay)
logging.debug("Path removed")
else:
logging.debug("Path doesn't exist in overrides")
return
def create_gtk_user_override(settings, gtk_ver, toast_overlay=None):
override_dir = GLib.build_filenamev([get_user_flatpak_path(), "overrides"])
override_dir = GLib.build_filenamev([__get_user_flatpak_path(), "overrides"])
logging.debug(f"override_dir: {override_dir}")
filename = GLib.build_filenamev([override_dir, "global"])
@ -149,8 +296,8 @@ def create_gtk_user_override(settings, gtk_ver, toast_overlay=None):
user_keyfile.load_from_file(filename, GLib.KeyFileFlags.NONE)
user_keyfile.set_string("Context", "filesystems", gtk_path)
user_save_keyfile(settings, user_keyfile,
filename, gtk_ver, toast_overlay)
__user_save_keyfile(user_keyfile, filename,
settings, gtk_ver, toast_overlay)
else:
if toast_overlay:
toast_overlay.add_toast(
@ -163,15 +310,15 @@ def create_gtk_user_override(settings, gtk_ver, toast_overlay=None):
"Context", "filesystems")
except GLib.GError:
user_keyfile.set_string("Context", "filesystems", gtk_path)
user_save_keyfile(settings, user_keyfile,
filename, gtk_ver, toast_overlay)
__user_save_keyfile(user_keyfile, filename,
settings, gtk_ver, toast_overlay)
else:
if gtk_path not in filesys_list:
user_keyfile.set_string_list(
"Context", "filesystems", filesys_list + [gtk_path]
)
user_save_keyfile(settings, user_keyfile,
filename, gtk_ver, toast_overlay)
__user_save_keyfile(user_keyfile, filename,
settings, gtk_ver, toast_overlay)
else:
if is_gtk4:
settings.set_boolean("user-flatpak-theming-gtk4", True)
@ -181,7 +328,7 @@ def create_gtk_user_override(settings, gtk_ver, toast_overlay=None):
def remove_gtk_user_override(settings, gtk_ver, toast_overlay=None):
override_dir = GLib.build_filenamev([get_user_flatpak_path(), "overrides"])
override_dir = GLib.build_filenamev([__get_user_flatpak_path(), "overrides"])
logging.debug(f"override_dir: {override_dir}")
filename = GLib.build_filenamev([override_dir, "global"])
@ -232,8 +379,8 @@ def remove_gtk_user_override(settings, gtk_ver, toast_overlay=None):
user_keyfile.set_string_list(
"Context", "filesystems", filesys_list)
user_save_keyfile(settings, user_keyfile,
filename, gtk_ver, toast_overlay)
__user_save_keyfile(user_keyfile, filename,
settings, gtk_ver, toast_overlay)
logging.debug("remove override: Value removed.")
else:
set_theming()
@ -246,7 +393,7 @@ def remove_gtk_user_override(settings, gtk_ver, toast_overlay=None):
def create_gtk_global_override(settings, gtk_ver, toast_overlay=None):
override_dir = GLib.build_filenamev(
[get_system_flatpak_path(), "overrides"])
[__get_system_flatpak_path(), "overrides"])
logging.debug(f"override_dir: {override_dir}")
filename = GLib.build_filenamev([override_dir, "global"])
@ -291,8 +438,8 @@ def create_gtk_global_override(settings, gtk_ver, toast_overlay=None):
global_keyfile.load_from_file(filename, GLib.KeyFileFlags.NONE)
global_keyfile.set_string("Context", "filesystems", gtk_path)
global_save_keyfile(settings, global_keyfile,
filename, gtk_ver, toast_overlay)
__global_save_keyfile(global_keyfile, filename,
settings, gtk_ver, toast_overlay)
else:
if toast_overlay:
toast_overlay.add_toast(
@ -305,15 +452,15 @@ def create_gtk_global_override(settings, gtk_ver, toast_overlay=None):
"Context", "filesystems")
except GLib.GError:
global_keyfile.set_string("Context", "filesystems", gtk_path)
global_save_keyfile(settings, global_keyfile,
filename, gtk_ver, toast_overlay)
__global_save_keyfile(global_keyfile, filename,
settings, gtk_ver, toast_overlay)
else:
if gtk_path not in filesys_list:
global_keyfile.set_string_list(
"Context", "filesystems", filesys_list + [gtk_path]
)
global_save_keyfile(settings, global_keyfile,
filename, gtk_ver, toast_overlay)
__global_save_keyfile(global_keyfile, filename,
settings, gtk_ver, toast_overlay)
else:
if is_gtk4:
settings.set_boolean("global-flatpak-theming-gtk4", True)
@ -324,7 +471,7 @@ def create_gtk_global_override(settings, gtk_ver, toast_overlay=None):
def remove_gtk_global_override(settings, gtk_ver, toast_overlay=None):
override_dir = GLib.build_filenamev(
[get_system_flatpak_path(), "overrides"])
[__get_system_flatpak_path(), "overrides"])
logging.debug(f"override_dir: {override_dir}")
filename = GLib.build_filenamev([override_dir, "global"])
@ -375,8 +522,8 @@ def remove_gtk_global_override(settings, gtk_ver, toast_overlay=None):
global_keyfile.set_string_list(
"Context", "filesystems", filesys_list)
global_save_keyfile(settings, global_keyfile,
filename, gtk_ver, toast_overlay)
__global_save_keyfile(global_keyfile, filename,
settings, gtk_ver, toast_overlay)
logging.debug("remove override: Value removed.")
else:
set_theming()