[gnome-settings-daemon] main: Add settings key to whitelist plugins



commit 1dc03f24a322ca2ee5fe7ac67564d8b59d25a2ad
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Nov 13 11:45:12 2012 +0100

    main: Add settings key to whitelist plugins
    
    Rather than having gdm load all the new plugins by default,
    especially when gnome-settings-daemon gets updated and gdm doesn't,
    keep a list of whitelisted plugins. Only those can be enabled, others
    will be unknown and ignored.
    
    By default, all plugins are whitelisted.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=662220

 ...gnome.settings-daemon.plugins.gschema.xml.in.in |    9 ++++++++
 gnome-settings-daemon/gnome-settings-manager.c     |   21 ++++++++++++++++++++
 2 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/data/org.gnome.settings-daemon.plugins.gschema.xml.in.in b/data/org.gnome.settings-daemon.plugins.gschema.xml.in.in
index e9c34cc..958863b 100644
--- a/data/org.gnome.settings-daemon.plugins.gschema.xml.in.in
+++ b/data/org.gnome.settings-daemon.plugins.gschema.xml.in.in
@@ -1,5 +1,14 @@
 <schemalist>
   <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.plugins" path="/org/gnome/settings-daemon/plugins/">
+    <key name="whitelisted-plugins" type="as">
+      <default>['all']</default>
+      <_summary>List of plugins that are allowed to be loaded</_summary>
+      <_description>
+        A list of strings representing the plugins that are allowed to be loaded (default: 'all').
+        The plugins still need to be marked as active to get loaded.
+        This is only evaluated on startup.
+      </_description>
+    </key>
     <child name="a11y-keyboard" schema="org.gnome.settings-daemon.plugins.a11y-keyboard"/>
     <child name="a11y-settings" schema="org.gnome.settings-daemon.plugins.a11y-settings"/>
     <child name="background" schema="org.gnome.settings-daemon.plugins.background"/>
diff --git a/gnome-settings-daemon/gnome-settings-manager.c b/gnome-settings-daemon/gnome-settings-manager.c
index 60645be..be67c22 100644
--- a/gnome-settings-daemon/gnome-settings-manager.c
+++ b/gnome-settings-daemon/gnome-settings-manager.c
@@ -65,6 +65,7 @@ struct GnomeSettingsManagerPrivate
         GDBusNodeInfo              *introspection_data;
         GDBusConnection            *connection;
         GSettings                  *settings;
+        char                      **whitelist;
         GnomePnpIds                *pnp_ids;
         GSList                     *plugins;
 };
@@ -200,6 +201,17 @@ is_schema (const char *schema)
         return contained (g_settings_list_schemas (), schema);
 }
 
+static gboolean
+is_whitelisted (char       **whitelist,
+                const char  *plugin_name)
+{
+        if (whitelist == NULL ||
+            whitelist[0] == NULL ||
+            g_strcmp0 (whitelist[0], "all") == 0)
+                return TRUE;
+
+        return contained ((const char * const *) whitelist, plugin_name);
+}
 
 static void
 _load_file (GnomeSettingsManager *manager,
@@ -224,6 +236,13 @@ _load_file (GnomeSettingsManager *manager,
                 goto out;
         }
 
+        if (!is_whitelisted (manager->priv->whitelist,
+                             gnome_settings_plugin_info_get_location (info))) {
+                g_debug ("Plugin %s ignored as it's not whitelisted",
+                         gnome_settings_plugin_info_get_location (info));
+                goto out;
+        }
+
         key_name = g_strdup_printf ("%s.plugins.%s",
                                     DEFAULT_SETTINGS_PREFIX,
                                     gnome_settings_plugin_info_get_location (info));
@@ -386,6 +405,7 @@ gnome_settings_manager_start (GnomeSettingsManager *manager,
 
         gnome_settings_profile_start ("initializing plugins");
         manager->priv->settings = g_settings_new (DEFAULT_SETTINGS_PREFIX ".plugins");
+        manager->priv->whitelist = g_settings_get_strv (manager->priv->settings, "whitelisted-plugins");
 
         _load_all (manager);
         gnome_settings_profile_end ("initializing plugins");
@@ -409,6 +429,7 @@ gnome_settings_manager_stop (GnomeSettingsManager *manager)
                 manager->priv->owner_id = 0;
         }
 
+        g_clear_pointer (&manager->priv->whitelist, g_strfreev);
         g_clear_object (&manager->priv->settings);
         g_clear_object (&manager->priv->pnp_ids);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]