fa2784
From 6edc7e0cfc672fe4c2331ac8131ea1aa82881b63 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Wed, 19 Dec 2018 19:58:16 -0500
fa2784
Subject: [PATCH 1/9] settings: Make the keyfile backend parameterless
fa2784
fa2784
Make it possible to instantiate a keyfile settings backend
fa2784
without specifying parameters, by turning the arguments to
fa2784
the new() function into construct-only properties. If no
fa2784
filename is specified, default to
fa2784
$XDG_CONFIG_HOME/glib-2.0/settings/keyfile
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c  | 252 ++++++++++++++++++++++++++-------
fa2784
 gio/gsettingsbackendinternal.h |   2 +
fa2784
 2 files changed, 199 insertions(+), 55 deletions(-)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index a37978e83..e8e9f44a5 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -21,6 +21,9 @@
fa2784
 
fa2784
 #include "config.h"
fa2784
 
fa2784
+#include <glib.h>
fa2784
+#include <glibintl.h>
fa2784
+
fa2784
 #include <stdio.h>
fa2784
 #include <string.h>
fa2784
 
fa2784
@@ -28,7 +31,8 @@
fa2784
 #include "gfileinfo.h"
fa2784
 #include "gfilemonitor.h"
fa2784
 #include "gsimplepermission.h"
fa2784
-#include "gsettingsbackend.h"
fa2784
+#include "gsettingsbackendinternal.h"
fa2784
+#include "giomodule.h"
fa2784
 
fa2784
 
fa2784
 #define G_TYPE_KEYFILE_SETTINGS_BACKEND      (g_keyfile_settings_backend_get_type ())
fa2784
@@ -41,6 +45,12 @@
fa2784
 
fa2784
 typedef GSettingsBackendClass GKeyfileSettingsBackendClass;
fa2784
 
fa2784
+enum {
fa2784
+  PROP_FILENAME = 1,
fa2784
+  PROP_ROOT_PATH,
fa2784
+  PROP_ROOT_GROUP
fa2784
+};
fa2784
+
fa2784
 typedef struct
fa2784
 {
fa2784
   GSettingsBackend   parent_instance;
fa2784
@@ -61,7 +71,6 @@ typedef struct
fa2784
   GFileMonitor      *dir_monitor;
fa2784
 } GKeyfileSettingsBackend;
fa2784
 
fa2784
-static GType g_keyfile_settings_backend_get_type (void);
fa2784
 G_DEFINE_TYPE (GKeyfileSettingsBackend,
fa2784
                g_keyfile_settings_backend,
fa2784
                G_TYPE_SETTINGS_BACKEND)
fa2784
@@ -287,7 +296,8 @@ g_keyfile_settings_backend_check_one (gpointer key,
fa2784
 {
fa2784
   WriteManyData *data = user_data;
fa2784
 
fa2784
-  return data->failed = !path_is_valid (data->kfsb, key);
fa2784
+  return data->failed = g_hash_table_contains (data->kfsb->system_locks, key) ||
fa2784
+                        !path_is_valid (data->kfsb, key);
fa2784
 }
fa2784
 
fa2784
 static gboolean
fa2784
@@ -522,25 +532,6 @@ g_keyfile_settings_backend_init (GKeyfileSettingsBackend *kfsb)
fa2784
 {
fa2784
 }
fa2784
 
fa2784
-static void
fa2784
-g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class)
fa2784
-{
fa2784
-  GObjectClass *object_class = G_OBJECT_CLASS (class);
fa2784
-
fa2784
-  object_class->finalize = g_keyfile_settings_backend_finalize;
fa2784
-
fa2784
-  class->read = g_keyfile_settings_backend_read;
fa2784
-  class->write = g_keyfile_settings_backend_write;
fa2784
-  class->write_tree = g_keyfile_settings_backend_write_tree;
fa2784
-  class->reset = g_keyfile_settings_backend_reset;
fa2784
-  class->get_writable = g_keyfile_settings_backend_get_writable;
fa2784
-  class->get_permission = g_keyfile_settings_backend_get_permission;
fa2784
-  /* No need to implement subscribed/unsubscribe: the only point would be to
fa2784
-   * stop monitoring the file when there's no GSettings anymore, which is no
fa2784
-   * big win.
fa2784
-   */
fa2784
-}
fa2784
-
fa2784
 static void
fa2784
 file_changed (GFileMonitor      *monitor,
fa2784
               GFile             *file,
fa2784
@@ -567,6 +558,185 @@ dir_changed (GFileMonitor       *monitor,
fa2784
   g_keyfile_settings_backend_keyfile_writable (kfsb);
fa2784
 }
fa2784
 
fa2784
+static void
fa2784
+g_keyfile_settings_backend_constructed (GObject *object)
fa2784
+{
fa2784
+  GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (object);
fa2784
+
fa2784
+  if (kfsb->file == NULL)
fa2784
+    {
fa2784
+      char *filename = g_build_filename (g_get_user_config_dir (),
fa2784
+                                         "glib-2.0", "settings", "keyfile",
fa2784
+                                         NULL);
fa2784
+      kfsb->file = g_file_new_for_path (filename);
fa2784
+      g_free (filename);
fa2784
+    }
fa2784
+
fa2784
+  if (kfsb->prefix == NULL)
fa2784
+    {
fa2784
+      kfsb->prefix = g_strdup ("/");
fa2784
+      kfsb->prefix_len = 1;
fa2784
+    }
fa2784
+  
fa2784
+  kfsb->keyfile = g_key_file_new ();
fa2784
+  kfsb->permission = g_simple_permission_new (TRUE);
fa2784
+
fa2784
+  kfsb->dir = g_file_get_parent (kfsb->file);
fa2784
+  g_file_make_directory_with_parents (kfsb->dir, NULL, NULL);
fa2784
+
fa2784
+  kfsb->file_monitor = g_file_monitor (kfsb->file, G_FILE_MONITOR_NONE, NULL, NULL);
fa2784
+  kfsb->dir_monitor = g_file_monitor (kfsb->dir, G_FILE_MONITOR_NONE, NULL, NULL);
fa2784
+
fa2784
+  compute_checksum (kfsb->digest, NULL, 0);
fa2784
+
fa2784
+  g_signal_connect (kfsb->file_monitor, "changed",
fa2784
+                    G_CALLBACK (file_changed), kfsb);
fa2784
+  g_signal_connect (kfsb->dir_monitor, "changed",
fa2784
+                    G_CALLBACK (dir_changed), kfsb);
fa2784
+
fa2784
+  g_keyfile_settings_backend_keyfile_writable (kfsb);
fa2784
+  g_keyfile_settings_backend_keyfile_reload (kfsb);
fa2784
+}
fa2784
+
fa2784
+static void
fa2784
+g_keyfile_settings_backend_set_property (GObject      *object,
fa2784
+                                         guint         prop_id,
fa2784
+                                         const GValue *value,
fa2784
+                                         GParamSpec   *pspec)
fa2784
+{
fa2784
+  GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (object);
fa2784
+
fa2784
+  switch (prop_id)
fa2784
+    {
fa2784
+    case PROP_FILENAME:
fa2784
+      /* Construct only. */
fa2784
+      g_assert (kfsb->file == NULL);
fa2784
+      kfsb->file = g_file_new_for_path (g_value_get_string (value));
fa2784
+      break;
fa2784
+
fa2784
+    case PROP_ROOT_PATH:
fa2784
+      /* Construct only. */
fa2784
+      g_assert (kfsb->prefix == NULL);
fa2784
+      kfsb->prefix = g_value_dup_string (value);
fa2784
+      if (kfsb->prefix)
fa2784
+        kfsb->prefix_len = strlen (kfsb->prefix);
fa2784
+      break;
fa2784
+
fa2784
+    case PROP_ROOT_GROUP:
fa2784
+      /* Construct only. */
fa2784
+      g_assert (kfsb->root_group == NULL);
fa2784
+      kfsb->root_group = g_value_dup_string (value);
fa2784
+      if (kfsb->root_group)
fa2784
+        kfsb->root_group_len = strlen (kfsb->root_group);
fa2784
+      break;
fa2784
+
fa2784
+    default:
fa2784
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
fa2784
+      break;
fa2784
+    }
fa2784
+}
fa2784
+
fa2784
+static void
fa2784
+g_keyfile_settings_backend_get_property (GObject    *object,
fa2784
+                                         guint       prop_id,
fa2784
+                                         GValue     *value,
fa2784
+                                         GParamSpec *pspec)
fa2784
+{
fa2784
+  GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (object);
fa2784
+
fa2784
+  switch (prop_id)
fa2784
+    {
fa2784
+    case PROP_FILENAME:
fa2784
+      g_value_set_string (value, g_file_peek_path (kfsb->file));
fa2784
+      break;
fa2784
+
fa2784
+    case PROP_ROOT_PATH:
fa2784
+      g_value_set_string (value, kfsb->prefix);
fa2784
+      break;
fa2784
+
fa2784
+    case PROP_ROOT_GROUP:
fa2784
+      g_value_set_string (value, kfsb->root_group);
fa2784
+      break;
fa2784
+
fa2784
+    default:
fa2784
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
fa2784
+      break;
fa2784
+    }
fa2784
+}
fa2784
+
fa2784
+static void
fa2784
+g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class)
fa2784
+{
fa2784
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
fa2784
+
fa2784
+  object_class->finalize = g_keyfile_settings_backend_finalize;
fa2784
+  object_class->constructed = g_keyfile_settings_backend_constructed;
fa2784
+  object_class->get_property = g_keyfile_settings_backend_get_property;
fa2784
+  object_class->set_property = g_keyfile_settings_backend_set_property;
fa2784
+
fa2784
+  class->read = g_keyfile_settings_backend_read;
fa2784
+  class->write = g_keyfile_settings_backend_write;
fa2784
+  class->write_tree = g_keyfile_settings_backend_write_tree;
fa2784
+  class->reset = g_keyfile_settings_backend_reset;
fa2784
+  class->get_writable = g_keyfile_settings_backend_get_writable;
fa2784
+  class->get_permission = g_keyfile_settings_backend_get_permission;
fa2784
+  /* No need to implement subscribed/unsubscribe: the only point would be to
fa2784
+   * stop monitoring the file when there's no GSettings anymore, which is no
fa2784
+   * big win.
fa2784
+   */
fa2784
+
fa2784
+  /**
fa2784
+   * GKeyfileSettingsBackend:filename:
fa2784
+   *
fa2784
+   * The location where the settings are stored on disk.
fa2784
+   *
fa2784
+   * Defaults to `$XDG_CONFIG_HOME/glib-2.0/settings/keyfile`.
fa2784
+   */
fa2784
+  g_object_class_install_property (object_class,
fa2784
+                                   PROP_FILENAME,
fa2784
+                                   g_param_spec_string ("filename",
fa2784
+                                                        P_("Filename"),
fa2784
+                                                        P_("The filename"),
fa2784
+                                                        NULL,
fa2784
+                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
fa2784
+                                                        G_PARAM_STATIC_STRINGS));
fa2784
+
fa2784
+  /**
fa2784
+   * GKeyfileSettingsBackend:root-path:
fa2784
+   *
fa2784
+   * All settings read to or written from the backend must fall under the
fa2784
+   * path given in @root_path (which must start and end with a slash and
fa2784
+   * not contain two consecutive slashes).  @root_path may be "/".
fa2784
+   * 
fa2784
+   * Defaults to "/".
fa2784
+   */
fa2784
+  g_object_class_install_property (object_class,
fa2784
+                                   PROP_ROOT_PATH,
fa2784
+                                   g_param_spec_string ("root-path",
fa2784
+                                                        P_("Root path"),
fa2784
+                                                        P_("The root path"),
fa2784
+                                                        NULL,
fa2784
+                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
fa2784
+                                                        G_PARAM_STATIC_STRINGS));
fa2784
+
fa2784
+  /**
fa2784
+   * GKeyfileSettingsBackend:root-group:
fa2784
+   *
fa2784
+   * If @root_group is non-%NULL then it specifies the name of the keyfile
fa2784
+   * group used for keys that are written directly below the root path.
fa2784
+   *
fa2784
+   * Defaults to NULL.
fa2784
+   */
fa2784
+  g_object_class_install_property (object_class,
fa2784
+                                   PROP_ROOT_GROUP,
fa2784
+                                   g_param_spec_string ("root-group",
fa2784
+                                                        P_("Root group"),
fa2784
+                                                        P_("The root group"),
fa2784
+                                                        NULL,
fa2784
+                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
fa2784
+                                                        G_PARAM_STATIC_STRINGS));
fa2784
+}
fa2784
+
fa2784
 /**
fa2784
  * g_keyfile_settings_backend_new:
fa2784
  * @filename: the filename of the keyfile
fa2784
@@ -626,43 +796,15 @@ g_keyfile_settings_backend_new (const gchar *filename,
fa2784
                                 const gchar *root_path,
fa2784
                                 const gchar *root_group)
fa2784
 {
fa2784
-  GKeyfileSettingsBackend *kfsb;
fa2784
-
fa2784
   g_return_val_if_fail (filename != NULL, NULL);
fa2784
   g_return_val_if_fail (root_path != NULL, NULL);
fa2784
   g_return_val_if_fail (g_str_has_prefix (root_path, "/"), NULL);
fa2784
   g_return_val_if_fail (g_str_has_suffix (root_path, "/"), NULL);
fa2784
   g_return_val_if_fail (strstr (root_path, "//") == NULL, NULL);
fa2784
 
fa2784
-  kfsb = g_object_new (G_TYPE_KEYFILE_SETTINGS_BACKEND, NULL);
fa2784
-  kfsb->keyfile = g_key_file_new ();
fa2784
-  kfsb->permission = g_simple_permission_new (TRUE);
fa2784
-
fa2784
-  kfsb->file = g_file_new_for_path (filename);
fa2784
-  kfsb->dir = g_file_get_parent (kfsb->file);
fa2784
-  g_file_make_directory_with_parents (kfsb->dir, NULL, NULL);
fa2784
-
fa2784
-  kfsb->file_monitor = g_file_monitor (kfsb->file, 0, NULL, NULL);
fa2784
-  kfsb->dir_monitor = g_file_monitor (kfsb->dir, 0, NULL, NULL);
fa2784
-
fa2784
-  kfsb->prefix_len = strlen (root_path);
fa2784
-  kfsb->prefix = g_strdup (root_path);
fa2784
-
fa2784
-  if (root_group)
fa2784
-    {
fa2784
-      kfsb->root_group_len = strlen (root_group);
fa2784
-      kfsb->root_group = g_strdup (root_group);
fa2784
-    }
fa2784
-
fa2784
-  compute_checksum (kfsb->digest, NULL, 0);
fa2784
-
fa2784
-  g_signal_connect (kfsb->file_monitor, "changed",
fa2784
-                    G_CALLBACK (file_changed), kfsb);
fa2784
-  g_signal_connect (kfsb->dir_monitor, "changed",
fa2784
-                    G_CALLBACK (dir_changed), kfsb);
fa2784
-
fa2784
-  g_keyfile_settings_backend_keyfile_writable (kfsb);
fa2784
-  g_keyfile_settings_backend_keyfile_reload (kfsb);
fa2784
-
fa2784
-  return G_SETTINGS_BACKEND (kfsb);
fa2784
+  return G_SETTINGS_BACKEND (g_object_new (G_TYPE_KEYFILE_SETTINGS_BACKEND,
fa2784
+                                           "filename", filename,
fa2784
+                                           "root-path", root_path,
fa2784
+                                           "root-group", root_group,
fa2784
+                                           NULL));
fa2784
 }
fa2784
diff --git a/gio/gsettingsbackendinternal.h b/gio/gsettingsbackendinternal.h
fa2784
index 2a76a80bc..9e1d51dba 100644
fa2784
--- a/gio/gsettingsbackendinternal.h
fa2784
+++ b/gio/gsettingsbackendinternal.h
fa2784
@@ -87,6 +87,8 @@ GType                   g_null_settings_backend_get_type                (void);
fa2784
 
fa2784
 GType                   g_memory_settings_backend_get_type              (void);
fa2784
 
fa2784
+GType                   g_keyfile_settings_backend_get_type             (void);
fa2784
+
fa2784
 #ifdef HAVE_COCOA
fa2784
 GType                   g_nextstep_settings_backend_get_type            (void);
fa2784
 #endif
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From cd448d51f610f1e6a701ac8a1146d3b2048427a0 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Wed, 19 Dec 2018 20:03:29 -0500
fa2784
Subject: [PATCH 2/9] settings: Register the keyfile backend as extension
fa2784
fa2784
This was not done previously because the backend
fa2784
could not be instantiated without parameters.
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c | 11 +++++++----
fa2784
 1 file changed, 7 insertions(+), 4 deletions(-)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index e8e9f44a5..0e9789cde 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -32,7 +32,7 @@
fa2784
 #include "gfilemonitor.h"
fa2784
 #include "gsimplepermission.h"
fa2784
 #include "gsettingsbackendinternal.h"
fa2784
-#include "giomodule.h"
fa2784
+#include "giomodule-priv.h"
fa2784
 
fa2784
 
fa2784
 #define G_TYPE_KEYFILE_SETTINGS_BACKEND      (g_keyfile_settings_backend_get_type ())
fa2784
@@ -71,9 +71,12 @@ typedef struct
fa2784
   GFileMonitor      *dir_monitor;
fa2784
 } GKeyfileSettingsBackend;
fa2784
 
fa2784
-G_DEFINE_TYPE (GKeyfileSettingsBackend,
fa2784
-               g_keyfile_settings_backend,
fa2784
-               G_TYPE_SETTINGS_BACKEND)
fa2784
+G_DEFINE_TYPE_WITH_CODE (GKeyfileSettingsBackend,
fa2784
+                         g_keyfile_settings_backend,
fa2784
+                         G_TYPE_SETTINGS_BACKEND,
fa2784
+                         _g_io_modules_ensure_extension_points_registered ();
fa2784
+                         g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME,
fa2784
+                                                         g_define_type_id, "keyfile", 10))
fa2784
 
fa2784
 static void
fa2784
 compute_checksum (guint8        *digest,
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From 8cbdb7dd496f6c2361eb46ca4c0848d7210fe27a Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Mon, 5 Nov 2018 16:07:55 -0500
fa2784
Subject: [PATCH 3/9] settings: Add support for defaults to keyfile backend
fa2784
fa2784
Stacked databases and locks are dconf features that allow
fa2784
management software like Fleet Commander to set system-wide
fa2784
defaults and overrides centrally for applications.
fa2784
fa2784
This patch adds minimal support for the same to the keyfile
fa2784
backend. We look for a keyfile named 'defaults' and a
fa2784
lock-list named 'locks'.
fa2784
fa2784
Suitable files can be produced from a dconf database with
fa2784
dconf dump and dconf list-locks, respectively.
fa2784
fa2784
The default location for these files is /etc/glib-2.0/settings/.
fa2784
For test purposes, this can be overwritten with the
fa2784
GSETTINGS_DEFAULTS_DIR environment variable.
fa2784
fa2784
Writes always go to the per-user keyfile.
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c | 138 ++++++++++++++++++++++++++++++++--
fa2784
 1 file changed, 132 insertions(+), 6 deletions(-)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index 0e9789cde..0a4e81511 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -29,6 +29,7 @@
fa2784
 
fa2784
 #include "gfile.h"
fa2784
 #include "gfileinfo.h"
fa2784
+#include "gfileenumerator.h"
fa2784
 #include "gfilemonitor.h"
fa2784
 #include "gsimplepermission.h"
fa2784
 #include "gsettingsbackendinternal.h"
fa2784
@@ -45,11 +46,12 @@
fa2784
 
fa2784
 typedef GSettingsBackendClass GKeyfileSettingsBackendClass;
fa2784
 
fa2784
-enum {
fa2784
+typedef enum {
fa2784
   PROP_FILENAME = 1,
fa2784
   PROP_ROOT_PATH,
fa2784
-  PROP_ROOT_GROUP
fa2784
-};
fa2784
+  PROP_ROOT_GROUP,
fa2784
+  PROP_DEFAULTS_DIR
fa2784
+} GKeyfileSettingsBackendProperty;
fa2784
 
fa2784
 typedef struct
fa2784
 {
fa2784
@@ -58,6 +60,9 @@ typedef struct
fa2784
   GKeyFile          *keyfile;
fa2784
   GPermission       *permission;
fa2784
   gboolean           writable;
fa2784
+  char              *defaults_dir;
fa2784
+  GKeyFile          *system_keyfile;
fa2784
+  GHashTable        *system_locks; /* Used as a set, owning the strings it contains */
fa2784
 
fa2784
   gchar             *prefix;
fa2784
   gint               prefix_len;
fa2784
@@ -196,10 +201,19 @@ get_from_keyfile (GKeyfileSettingsBackend *kfsb,
fa2784
   if (convert_path (kfsb, key, &group, &name))
fa2784
     {
fa2784
       gchar *str;
fa2784
+      gchar *sysstr;
fa2784
 
fa2784
       g_assert (*name);
fa2784
 
fa2784
+      sysstr = g_key_file_get_value (kfsb->system_keyfile, group, name, NULL);
fa2784
       str = g_key_file_get_value (kfsb->keyfile, group, name, NULL);
fa2784
+      if (sysstr &&
fa2784
+          (g_hash_table_contains (kfsb->system_locks, key) ||
fa2784
+           str == NULL))
fa2784
+        {
fa2784
+          g_free (str);
fa2784
+          str = g_steal_pointer (&sysstr);
fa2784
+        }
fa2784
 
fa2784
       if (str)
fa2784
         {
fa2784
@@ -207,6 +221,8 @@ get_from_keyfile (GKeyfileSettingsBackend *kfsb,
fa2784
           g_free (str);
fa2784
         }
fa2784
 
fa2784
+      g_free (sysstr);
fa2784
+
fa2784
       g_free (group);
fa2784
       g_free (name);
fa2784
     }
fa2784
@@ -221,6 +237,9 @@ set_to_keyfile (GKeyfileSettingsBackend *kfsb,
fa2784
 {
fa2784
   gchar *group, *name;
fa2784
 
fa2784
+  if (g_hash_table_contains (kfsb->system_locks, key))
fa2784
+    return FALSE;
fa2784
+
fa2784
   if (convert_path (kfsb, key, &group, &name))
fa2784
     {
fa2784
       if (value)
fa2784
@@ -368,7 +387,9 @@ g_keyfile_settings_backend_get_writable (GSettingsBackend *backend,
fa2784
 {
fa2784
   GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (backend);
fa2784
 
fa2784
-  return kfsb->writable && path_is_valid (kfsb, name);
fa2784
+  return kfsb->writable &&
fa2784
+         !g_hash_table_contains (kfsb->system_locks, name) &&
fa2784
+         path_is_valid (kfsb, name);
fa2784
 }
fa2784
 
fa2784
 static GPermission *
fa2784
@@ -514,6 +535,9 @@ g_keyfile_settings_backend_finalize (GObject *object)
fa2784
 
fa2784
   g_key_file_free (kfsb->keyfile);
fa2784
   g_object_unref (kfsb->permission);
fa2784
+  g_key_file_unref (kfsb->system_keyfile);
fa2784
+  g_hash_table_unref (kfsb->system_locks);
fa2784
+  g_free (kfsb->defaults_dir);
fa2784
 
fa2784
   g_file_monitor_cancel (kfsb->file_monitor);
fa2784
   g_object_unref (kfsb->file_monitor);
fa2784
@@ -561,6 +585,75 @@ dir_changed (GFileMonitor       *monitor,
fa2784
   g_keyfile_settings_backend_keyfile_writable (kfsb);
fa2784
 }
fa2784
 
fa2784
+static void
fa2784
+load_system_settings (GKeyfileSettingsBackend *kfsb)
fa2784
+{
fa2784
+  GError *error = NULL;
fa2784
+  const char *dir = "/etc/glib-2.0/settings";
fa2784
+  char *path;
fa2784
+  char *contents;
fa2784
+
fa2784
+  kfsb->system_keyfile = g_key_file_new ();
fa2784
+  kfsb->system_locks = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
fa2784
+
fa2784
+  if (kfsb->defaults_dir)
fa2784
+    dir = kfsb->defaults_dir;
fa2784
+
fa2784
+  path = g_build_filename (dir, "defaults", NULL);
fa2784
+
fa2784
+  /* The defaults are in the same keyfile format that we use for the settings.
fa2784
+   * It can be produced from a dconf database using: dconf dump
fa2784
+   */
fa2784
+  if (!g_key_file_load_from_file (kfsb->system_keyfile, path, G_KEY_FILE_NONE, &error))
fa2784
+    {
fa2784
+      if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
fa2784
+        g_warning ("Failed to read %s: %s", path, error->message);
fa2784
+      g_clear_error (&error);
fa2784
+    }
fa2784
+  else
fa2784
+    g_debug ("Loading default settings from %s", path);
fa2784
+
fa2784
+  g_free (path);
fa2784
+
fa2784
+  path = g_build_filename (dir, "locks", NULL);
fa2784
+
fa2784
+  /* The locks file is a text file containing a list paths to lock, one per line.
fa2784
+   * It can be produced from a dconf database using: dconf list-locks
fa2784
+   */
fa2784
+  if (!g_file_get_contents (path, &contents, NULL, &error))
fa2784
+    {
fa2784
+      if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
fa2784
+        g_warning ("Failed to read %s: %s", path, error->message);
fa2784
+      g_clear_error (&error);
fa2784
+    }
fa2784
+  else
fa2784
+    {
fa2784
+      char **lines;
fa2784
+      gsize i;
fa2784
+
fa2784
+      g_debug ("Loading locks from %s", path);
fa2784
+
fa2784
+      lines = g_strsplit (contents, "\n", 0);
fa2784
+      for (i = 0; lines[i]; i++)
fa2784
+        {
fa2784
+          char *line = lines[i];
fa2784
+          if (line[0] == '#' || line[0] == '\0')
fa2784
+            {
fa2784
+              g_free (line);
fa2784
+              continue;
fa2784
+            }
fa2784
+
fa2784
+          g_debug ("Locking key %s", line);
fa2784
+          g_hash_table_add (kfsb->system_locks, g_steal_pointer (&line));
fa2784
+        }
fa2784
+
fa2784
+      g_free (lines);
fa2784
+    }
fa2784
+  g_free (contents);
fa2784
+
fa2784
+  g_free (path);
fa2784
+}
fa2784
+
fa2784
 static void
fa2784
 g_keyfile_settings_backend_constructed (GObject *object)
fa2784
 {
fa2784
@@ -599,6 +692,8 @@ g_keyfile_settings_backend_constructed (GObject *object)
fa2784
 
fa2784
   g_keyfile_settings_backend_keyfile_writable (kfsb);
fa2784
   g_keyfile_settings_backend_keyfile_reload (kfsb);
fa2784
+
fa2784
+  load_system_settings (kfsb);
fa2784
 }
fa2784
 
fa2784
 static void
fa2784
@@ -609,7 +704,7 @@ g_keyfile_settings_backend_set_property (GObject      *object,
fa2784
 {
fa2784
   GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (object);
fa2784
 
fa2784
-  switch (prop_id)
fa2784
+  switch ((GKeyfileSettingsBackendProperty)prop_id)
fa2784
     {
fa2784
     case PROP_FILENAME:
fa2784
       /* Construct only. */
fa2784
@@ -633,6 +728,12 @@ g_keyfile_settings_backend_set_property (GObject      *object,
fa2784
         kfsb->root_group_len = strlen (kfsb->root_group);
fa2784
       break;
fa2784
 
fa2784
+    case PROP_DEFAULTS_DIR:
fa2784
+      /* Construct only. */
fa2784
+      g_assert (kfsb->defaults_dir == NULL);
fa2784
+      kfsb->defaults_dir = g_value_dup_string (value);
fa2784
+      break;
fa2784
+
fa2784
     default:
fa2784
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
fa2784
       break;
fa2784
@@ -647,7 +748,7 @@ g_keyfile_settings_backend_get_property (GObject    *object,
fa2784
 {
fa2784
   GKeyfileSettingsBackend *kfsb = G_KEYFILE_SETTINGS_BACKEND (object);
fa2784
 
fa2784
-  switch (prop_id)
fa2784
+  switch ((GKeyfileSettingsBackendProperty)prop_id)
fa2784
     {
fa2784
     case PROP_FILENAME:
fa2784
       g_value_set_string (value, g_file_peek_path (kfsb->file));
fa2784
@@ -661,6 +762,10 @@ g_keyfile_settings_backend_get_property (GObject    *object,
fa2784
       g_value_set_string (value, kfsb->root_group);
fa2784
       break;
fa2784
 
fa2784
+    case PROP_DEFAULTS_DIR:
fa2784
+      g_value_set_string (value, kfsb->defaults_dir);
fa2784
+      break;
fa2784
+
fa2784
     default:
fa2784
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
fa2784
       break;
fa2784
@@ -738,6 +843,22 @@ g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class)
fa2784
                                                         NULL,
fa2784
                                                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
fa2784
                                                         G_PARAM_STATIC_STRINGS));
fa2784
+
fa2784
+  /**
fa2784
+   * GKeyfileSettingsBackend:default-dir:
fa2784
+   *
fa2784
+   * The directory where the system defaults and locks are located.
fa2784
+   *
fa2784
+   * Defaults to `/etc/glib-2.0/settings`.
fa2784
+   */
fa2784
+  g_object_class_install_property (object_class,
fa2784
+                                   PROP_DEFAULTS_DIR,
fa2784
+                                   g_param_spec_string ("defaults-dir",
fa2784
+                                                        P_("Default dir"),
fa2784
+                                                        P_("Defaults dir"),
fa2784
+                                                        NULL,
fa2784
+                                                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
fa2784
+                                                        G_PARAM_STATIC_STRINGS));
fa2784
 }
fa2784
 
fa2784
 /**
fa2784
@@ -792,6 +913,11 @@ g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class)
fa2784
  * characters in your path names or '=' in your key names you may be in
fa2784
  * trouble.
fa2784
  *
fa2784
+ * The backend reads default values from a keyfile called `defaults` in
fa2784
+ * the directory specified by the #GKeyfileSettingsBackend:defaults-dir property,
fa2784
+ * and a list of locked keys from a text file with the name `locks` in
fa2784
+ * the same location.
fa2784
+ *
fa2784
  * Returns: (transfer full): a keyfile-backed #GSettingsBackend
fa2784
  **/
fa2784
 GSettingsBackend *
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From 93dceb39fe2de23aeffe40ff02c824393c749270 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Fri, 2 Nov 2018 23:00:49 -0400
fa2784
Subject: [PATCH 4/9] settings: Prefer the keyfile backend when sandboxed
fa2784
fa2784
When we are in a sandboxed situation, bump the priority
fa2784
of the keyfile settings backend above the dconf one,
fa2784
so we use a keyfile inside the sandbox instead of requiring
fa2784
holes in the sandbox for dconf.
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c | 9 ++++++++-
fa2784
 1 file changed, 8 insertions(+), 1 deletion(-)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index 0a4e81511..398cb053a 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -34,6 +34,7 @@
fa2784
 #include "gsimplepermission.h"
fa2784
 #include "gsettingsbackendinternal.h"
fa2784
 #include "giomodule-priv.h"
fa2784
+#include "gportalsupport.h"
fa2784
 
fa2784
 
fa2784
 #define G_TYPE_KEYFILE_SETTINGS_BACKEND      (g_keyfile_settings_backend_get_type ())
fa2784
@@ -76,12 +77,18 @@ typedef struct
fa2784
   GFileMonitor      *dir_monitor;
fa2784
 } GKeyfileSettingsBackend;
fa2784
 
fa2784
+#ifdef G_OS_WIN32
fa2784
+#define EXTENSION_PRIORITY 10
fa2784
+#else
fa2784
+#define EXTENSION_PRIORITY (glib_should_use_portal () ? 110 : 10)
fa2784
+#endif
fa2784
+
fa2784
 G_DEFINE_TYPE_WITH_CODE (GKeyfileSettingsBackend,
fa2784
                          g_keyfile_settings_backend,
fa2784
                          G_TYPE_SETTINGS_BACKEND,
fa2784
                          _g_io_modules_ensure_extension_points_registered ();
fa2784
                          g_io_extension_point_implement (G_SETTINGS_BACKEND_EXTENSION_POINT_NAME,
fa2784
-                                                         g_define_type_id, "keyfile", 10))
fa2784
+                                                         g_define_type_id, "keyfile", EXTENSION_PRIORITY))
fa2784
 
fa2784
 static void
fa2784
 compute_checksum (guint8        *digest,
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From 5d0d49750564aa7fd9e7d0d58c08a08847570921 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Mon, 21 Jan 2019 22:55:45 -0500
fa2784
Subject: [PATCH 5/9] keyfile settings: Accept unquoted strings
fa2784
fa2784
It is hard for users to remember that strings have to be explicitly
fa2784
quoted in the keyfile. Be lenient and accept strings that lack those
fa2784
quotes.
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c | 19 +++++++++++++++++++
fa2784
 gio/tests/gsettings.c         | 17 +++++++++++++++++
fa2784
 2 files changed, 36 insertions(+)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index 398cb053a..d5796b706 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -225,6 +225,25 @@ get_from_keyfile (GKeyfileSettingsBackend *kfsb,
fa2784
       if (str)
fa2784
         {
fa2784
           return_value = g_variant_parse (type, str, NULL, NULL, NULL);
fa2784
+          if (return_value == NULL &&
fa2784
+              g_variant_type_equal (type, G_VARIANT_TYPE_STRING) &&
fa2784
+              str[0] != '\"')
fa2784
+            {
fa2784
+              GString *s = g_string_sized_new (strlen (str) + 2);
fa2784
+              char *p = str;
fa2784
+
fa2784
+              g_string_append_c (s, '\"');
fa2784
+              while (*p)
fa2784
+                {
fa2784
+                  if (*p == '\"')
fa2784
+                    g_string_append_c (s, '\\');
fa2784
+                  g_string_append_c (s, *p);
fa2784
+                  p++;
fa2784
+                }
fa2784
+              g_string_append_c (s, '\"');
fa2784
+              return_value = g_variant_parse (type, s->str, NULL, NULL, NULL);
fa2784
+              g_string_free (s, TRUE);
fa2784
+            }
fa2784
           g_free (str);
fa2784
         }
fa2784
 
fa2784
diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c
fa2784
index 2be4122fe..6eb49f124 100644
fa2784
--- a/gio/tests/gsettings.c
fa2784
+++ b/gio/tests/gsettings.c
fa2784
@@ -1716,6 +1716,23 @@ test_keyfile (void)
fa2784
   g_assert_cmpstr (str, ==, "howdy");
fa2784
   g_free (str);
fa2784
 
fa2784
+  /* Now check setting a string without quotes */
fa2784
+  called = FALSE;
fa2784
+  g_signal_connect (settings, "changed::greeting", G_CALLBACK (key_changed_cb), &called);
fa2784
+
fa2784
+  g_key_file_set_string (keyfile, "tests", "greeting", "he\"l🤗uń");
fa2784
+  g_free (data);
fa2784
+  data = g_key_file_to_data (keyfile, &len, NULL);
fa2784
+  g_file_set_contents ("keyfile/gsettings.store", data, len, &error);
fa2784
+  g_assert_no_error (error);
fa2784
+  while (!called)
fa2784
+    g_main_context_iteration (NULL, FALSE);
fa2784
+  g_signal_handlers_disconnect_by_func (settings, key_changed_cb, &called);
fa2784
+
fa2784
+  str = g_settings_get_string (settings, "greeting");
fa2784
+  g_assert_cmpstr (str, ==, "he\"l🤗uń");
fa2784
+  g_free (str);
fa2784
+
fa2784
   g_settings_set (settings, "farewell", "s", "cheerio");
fa2784
   
fa2784
   called = FALSE;
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From 3765e73f9a2dbbc6863bcffdee85ffb18530c89b Mon Sep 17 00:00:00 2001
fa2784
From: Philip Withnall <withnall@endlessm.com>
fa2784
Date: Wed, 23 Jan 2019 15:14:58 +0000
fa2784
Subject: [PATCH 6/9] gkeyfilesettingsbackend: Add a code comment to clarify
fa2784
 things
fa2784
fa2784
Signed-off-by: Philip Withnall <withnall@endlessm.com>
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c | 4 ++++
fa2784
 1 file changed, 4 insertions(+)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index d5796b706..5ea632305 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -225,6 +225,10 @@ get_from_keyfile (GKeyfileSettingsBackend *kfsb,
fa2784
       if (str)
fa2784
         {
fa2784
           return_value = g_variant_parse (type, str, NULL, NULL, NULL);
fa2784
+
fa2784
+          /* As a special case, support values of type %G_VARIANT_TYPE_STRING
fa2784
+           * not being quoted, since users keep forgetting to do it and then
fa2784
+           * getting confused. */
fa2784
           if (return_value == NULL &&
fa2784
               g_variant_type_equal (type, G_VARIANT_TYPE_STRING) &&
fa2784
               str[0] != '\"')
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From 1df628861afe027e8dce5e27f4249059bad6bc60 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Wed, 10 Jul 2019 11:14:03 -0400
fa2784
Subject: [PATCH 7/9] key file: Handle filename being NULL
fa2784
fa2784
This happens when we are default-constructed
fa2784
without explicit arguments.
fa2784
fa2784
Closes: https://gitlab.gnome.org/GNOME/glib/issues/1825
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c | 3 ++-
fa2784
 1 file changed, 2 insertions(+), 1 deletion(-)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index 5ea632305..a874af287 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -739,7 +739,8 @@ g_keyfile_settings_backend_set_property (GObject      *object,
fa2784
     case PROP_FILENAME:
fa2784
       /* Construct only. */
fa2784
       g_assert (kfsb->file == NULL);
fa2784
-      kfsb->file = g_file_new_for_path (g_value_get_string (value));
fa2784
+      if (g_value_get_string (value))
fa2784
+        kfsb->file = g_file_new_for_path (g_value_get_string (value));
fa2784
       break;
fa2784
 
fa2784
     case PROP_ROOT_PATH:
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From 9c5d3a6081e5ff419db96d9651bddbfcdb8b1bc6 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Fri, 12 Jul 2019 11:30:30 -0400
fa2784
Subject: [PATCH] portal: Add a getter for dconf access
fa2784
fa2784
Add method to find whether the sandbox provides
fa2784
access to dconf. This will be used to tweak
fa2784
the priorities for the keyfile settings backend.
fa2784
---
fa2784
 gio/gportalsupport.c | 18 ++++++++++++++++++
fa2784
 gio/gportalsupport.h |  1 +
fa2784
 2 files changed, 19 insertions(+)
fa2784
fa2784
diff --git a/gio/gportalsupport.c b/gio/gportalsupport.c
fa2784
index 2f1e82517..b0a94b360 100644
fa2784
--- a/gio/gportalsupport.c
fa2784
+++ b/gio/gportalsupport.c
fa2784
@@ -23,6 +23,7 @@
fa2784
 static gboolean flatpak_info_read;
fa2784
 static gboolean use_portal;
fa2784
 static gboolean network_available;
fa2784
+static gboolean dconf_access;
fa2784
 
fa2784
 static void
fa2784
 read_flatpak_info (void)
fa2784
@@ -40,11 +41,13 @@ read_flatpak_info (void)
fa2784
 
fa2784
       use_portal = TRUE;
fa2784
       network_available = FALSE;
fa2784
+      dconf_access = FALSE;
fa2784
 
fa2784
       keyfile = g_key_file_new ();
fa2784
       if (g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, NULL))
fa2784
         {
fa2784
           char **shared = NULL;
fa2784
+          char *dconf_policy = NULL;
fa2784
 
fa2784
           shared = g_key_file_get_string_list (keyfile, "Context", "shared", NULL, NULL);
fa2784
           if (shared)
fa2784
@@ -52,6 +55,14 @@ read_flatpak_info (void)
fa2784
               network_available = g_strv_contains ((const char * const *)shared, "network");
fa2784
               g_strfreev (shared);
fa2784
             }
fa2784
+
fa2784
+          dconf_policy = g_key_file_get_string (keyfile, "Session Bus Policy", "ca.desrt.dconf", NULL);
fa2784
+          if (dconf_policy)
fa2784
+            {
fa2784
+              if (strcmp (dconf_policy, "talk") == 0)
fa2784
+                dconf_access = TRUE;
fa2784
+              g_free (dconf_policy);
fa2784
+            }
fa2784
         }
fa2784
 
fa2784
       g_key_file_unref (keyfile);
fa2784
@@ -64,6 +75,7 @@ read_flatpak_info (void)
fa2784
       if (var && var[0] == '1')
fa2784
         use_portal = TRUE;
fa2784
       network_available = TRUE;
fa2784
+      dconf_access = TRUE;
fa2784
     }
fa2784
 }
fa2784
 
fa2784
@@ -81,3 +93,9 @@ glib_network_available_in_sandbox (void)
fa2784
   return network_available;
fa2784
 }
fa2784
 
fa2784
+gboolean
fa2784
+glib_has_dconf_access_in_sandbox (void)
fa2784
+{
fa2784
+  read_flatpak_info ();
fa2784
+  return dconf_access;
fa2784
+}
fa2784
diff --git a/gio/gportalsupport.h b/gio/gportalsupport.h
fa2784
index a331f45d3..746f1fd6b 100644
fa2784
--- a/gio/gportalsupport.h
fa2784
+++ b/gio/gportalsupport.h
fa2784
@@ -24,6 +24,7 @@ G_BEGIN_DECLS
fa2784
 
fa2784
 gboolean glib_should_use_portal (void);
fa2784
 gboolean glib_network_available_in_sandbox (void);
fa2784
+gboolean glib_has_dconf_access_in_sandbox (void);
fa2784
 
fa2784
 G_END_DECLS
fa2784
 
fa2784
-- 
fa2784
GitLab
fa2784
fa2784
fa2784
From e6461f208931e27b52d82f7d3b5a7ce4fc26c9d7 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Fri, 12 Jul 2019 11:31:37 -0400
fa2784
Subject: [PATCH 8/9] settings: Tweak priorities for keyfile backend
fa2784
fa2784
We want to use the keyfile backend in sandboxes,
fa2784
but we want to avoid people losing their existing
fa2784
settings that are stored in dconf. Flatpak does
fa2784
a migration from dconf to keyfile, but only if
fa2784
the app explictly requests it.
fa2784
fa2784
From an app perspective, there are two steps to
fa2784
the dconf->keyfile migration:
fa2784
1. Request that flatpak do the migration, by adding
fa2784
   the migrate-path key to the metadata
fa2784
2. Stop adding the 'dconf hole' to the sandbox
fa2784
fa2784
To keep us from switching to the keyfile backend
fa2784
prematurely, look at whether the app has stopped
fa2784
requesting a 'dconf hole' in the sandbox.
fa2784
---
fa2784
 gio/gkeyfilesettingsbackend.c | 2 +-
fa2784
 1 file changed, 1 insertion(+), 1 deletion(-)
fa2784
fa2784
diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c
fa2784
index a874af287..f5358818e 100644
fa2784
--- a/gio/gkeyfilesettingsbackend.c
fa2784
+++ b/gio/gkeyfilesettingsbackend.c
fa2784
@@ -80,7 +80,7 @@ typedef struct
fa2784
 #ifdef G_OS_WIN32
fa2784
 #define EXTENSION_PRIORITY 10
fa2784
 #else
fa2784
-#define EXTENSION_PRIORITY (glib_should_use_portal () ? 110 : 10)
fa2784
+#define EXTENSION_PRIORITY (glib_should_use_portal () && !glib_has_dconf_access_in_sandbox () ? 110 : 10)
fa2784
 #endif
fa2784
 
fa2784
 G_DEFINE_TYPE_WITH_CODE (GKeyfileSettingsBackend,
fa2784
-- 
fa2784
2.28.0
fa2784
fa2784
fa2784
From 5f8d787815dc220fa2e288e03cd0cb9497727753 Mon Sep 17 00:00:00 2001
fa2784
From: Matthias Clasen <mclasen@redhat.com>
fa2784
Date: Mon, 8 Jul 2019 10:31:51 -0400
fa2784
Subject: [PATCH] Ensure that the keyfile settings backend exists
fa2784
fa2784
We need to bring the type into existence.
fa2784
fa2784
Closes: https://gitlab.gnome.org/GNOME/glib/issues/1822
fa2784
---
fa2784
 gio/giomodule.c | 1 +
fa2784
 1 file changed, 1 insertion(+)
fa2784
fa2784
diff --git a/gio/giomodule.c b/gio/giomodule.c
fa2784
index 9bb28985a..1007abdbf 100644
fa2784
--- a/gio/giomodule.c
fa2784
+++ b/gio/giomodule.c
fa2784
@@ -1211,6 +1211,7 @@ _g_io_modules_ensure_loaded (void)
fa2784
       /* Initialize types from built-in "modules" */
fa2784
       g_type_ensure (g_null_settings_backend_get_type ());
fa2784
       g_type_ensure (g_memory_settings_backend_get_type ());
fa2784
+      g_type_ensure (g_keyfile_settings_backend_get_type ());
fa2784
 #if defined(HAVE_INOTIFY_INIT1)
fa2784
       g_type_ensure (g_inotify_file_monitor_get_type ());
fa2784
 #endif
fa2784
-- 
fa2784
GitLab