Marcus Meissner
62115b1e47
- read actions also from /etc/polkit-1/actions (jsc#PED-1405) OBS-URL: https://build.opensuse.org/request/show/1034870 OBS-URL: https://build.opensuse.org/package/show/Base:System/polkit?expand=0&rev=181
228 lines
8.4 KiB
Diff
228 lines
8.4 KiB
Diff
diff --git a/docs/man/polkit.xml b/docs/man/polkit.xml
|
|
index 90715a5..10dd217 100644
|
|
--- a/docs/man/polkit.xml
|
|
+++ b/docs/man/polkit.xml
|
|
@@ -104,6 +104,7 @@ System Context | |
|
|
+------------------+ |
|
|
^ |
|
|
| +--------------------------------------+
|
|
+ | | /etc/polkit-1/actions/*.policy |
|
|
| | /usr/share/polkit-1/actions/*.policy |
|
|
| +--------------------------------------+
|
|
|
|
|
diff --git a/src/polkitbackend/polkitbackendactionpool.c b/src/polkitbackend/polkitbackendactionpool.c
|
|
index 3894fe9..17652e6 100644
|
|
--- a/src/polkitbackend/polkitbackendactionpool.c
|
|
+++ b/src/polkitbackend/polkitbackendactionpool.c
|
|
@@ -91,8 +91,10 @@ typedef struct
|
|
{
|
|
/* directory with .policy files, e.g. /usr/share/polkit-1/actions */
|
|
GFile *directory;
|
|
+ GFile *directory_alt;
|
|
|
|
GFileMonitor *dir_monitor;
|
|
+ GFileMonitor *dir_monitor_alt;
|
|
|
|
/* maps from action_id to a ParsedAction struct */
|
|
GHashTable *parsed_actions;
|
|
@@ -109,6 +111,8 @@ enum
|
|
{
|
|
PROP_0,
|
|
PROP_DIRECTORY,
|
|
+ /* TODO combine into PROP_DIRECTORIES? */
|
|
+ PROP_DIRECTORY_ALT,
|
|
};
|
|
|
|
#define POLKIT_BACKEND_ACTION_POOL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), POLKIT_BACKEND_TYPE_ACTION_POOL, PolkitBackendActionPoolPrivate))
|
|
@@ -153,9 +157,15 @@ polkit_backend_action_pool_finalize (GObject *object)
|
|
if (priv->directory != NULL)
|
|
g_object_unref (priv->directory);
|
|
|
|
+ if (priv->directory_alt != NULL)
|
|
+ g_object_unref (priv->directory_alt);
|
|
+
|
|
if (priv->dir_monitor != NULL)
|
|
g_object_unref (priv->dir_monitor);
|
|
|
|
+ if (priv->dir_monitor_alt != NULL)
|
|
+ g_object_unref (priv->dir_monitor_alt);
|
|
+
|
|
if (priv->parsed_actions != NULL)
|
|
g_hash_table_unref (priv->parsed_actions);
|
|
|
|
@@ -183,6 +193,10 @@ polkit_backend_action_pool_get_property (GObject *object,
|
|
g_value_set_object (value, priv->directory);
|
|
break;
|
|
|
|
+ case PROP_DIRECTORY_ALT:
|
|
+ g_value_set_object (value, priv->directory_alt);
|
|
+ break;
|
|
+
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
@@ -274,6 +288,28 @@ polkit_backend_action_pool_set_property (GObject *object,
|
|
}
|
|
break;
|
|
|
|
+ case PROP_DIRECTORY_ALT:
|
|
+ priv->directory_alt = g_value_dup_object (value);
|
|
+
|
|
+ error = NULL;
|
|
+ priv->dir_monitor_alt = g_file_monitor_directory (priv->directory_alt,
|
|
+ G_FILE_MONITOR_NONE,
|
|
+ NULL,
|
|
+ &error);
|
|
+ if (priv->dir_monitor_alt == NULL)
|
|
+ {
|
|
+ g_warning ("Error monitoring actions alt directory: %s", error->message);
|
|
+ g_error_free (error);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ g_signal_connect (priv->dir_monitor_alt,
|
|
+ "changed",
|
|
+ (GCallback) dir_monitor_changed,
|
|
+ pool);
|
|
+ }
|
|
+ break;
|
|
+
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
@@ -308,6 +344,18 @@ polkit_backend_action_pool_class_init (PolkitBackendActionPoolClass *klass)
|
|
G_PARAM_STATIC_NICK |
|
|
G_PARAM_STATIC_BLURB));
|
|
|
|
+ g_object_class_install_property (gobject_class,
|
|
+ PROP_DIRECTORY_ALT,
|
|
+ g_param_spec_object ("directoryalt",
|
|
+ "DirectoryAlt",
|
|
+ "Alternative directory to load action description files from",
|
|
+ G_TYPE_FILE,
|
|
+ G_PARAM_READWRITE |
|
|
+ G_PARAM_CONSTRUCT_ONLY |
|
|
+ G_PARAM_STATIC_NAME |
|
|
+ G_PARAM_STATIC_NICK |
|
|
+ G_PARAM_STATIC_BLURB));
|
|
+
|
|
/**
|
|
* PolkitBackendActionPool::changed:
|
|
* @action_pool: A #PolkitBackendActionPool.
|
|
@@ -334,12 +382,13 @@ polkit_backend_action_pool_class_init (PolkitBackendActionPoolClass *klass)
|
|
* Returns: A #PolkitBackendActionPool. Free with g_object_unref().
|
|
**/
|
|
PolkitBackendActionPool *
|
|
-polkit_backend_action_pool_new (GFile *directory)
|
|
+polkit_backend_action_pool_new (GFile *directory, GFile *directory_alt)
|
|
{
|
|
PolkitBackendActionPool *pool;
|
|
|
|
pool = POLKIT_BACKEND_ACTION_POOL (g_object_new (POLKIT_BACKEND_TYPE_ACTION_POOL,
|
|
"directory", directory,
|
|
+ "directoryalt", directory_alt,
|
|
NULL));
|
|
|
|
return pool;
|
|
@@ -505,12 +554,14 @@ ensure_all_files (PolkitBackendActionPool *pool)
|
|
{
|
|
PolkitBackendActionPoolPrivate *priv;
|
|
GFileEnumerator *e;
|
|
+ GFileEnumerator *e_alt;
|
|
GFileInfo *file_info;
|
|
GError *error;
|
|
|
|
priv = POLKIT_BACKEND_ACTION_POOL_GET_PRIVATE (pool);
|
|
|
|
e = NULL;
|
|
+ e_alt = NULL;
|
|
|
|
if (priv->has_loaded_all_files)
|
|
goto out;
|
|
@@ -548,12 +599,48 @@ ensure_all_files (PolkitBackendActionPool *pool)
|
|
|
|
} /* for all files */
|
|
|
|
+ /* TODO priority for files in /etc */
|
|
+
|
|
+ e_alt = g_file_enumerate_children (priv->directory_alt,
|
|
+ "standard::name",
|
|
+ G_FILE_QUERY_INFO_NONE,
|
|
+ NULL,
|
|
+ &error);
|
|
+ if (error != NULL)
|
|
+ {
|
|
+ g_warning ("Error enumerating files: %s", error->message);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ while ((file_info = g_file_enumerator_next_file (e_alt, NULL, &error)) != NULL)
|
|
+ {
|
|
+ const gchar *name;
|
|
+
|
|
+ name = g_file_info_get_name (file_info);
|
|
+ /* only consider files with the right suffix */
|
|
+ if (g_str_has_suffix (name, ".policy"))
|
|
+ {
|
|
+ GFile *file;
|
|
+
|
|
+ file = g_file_get_child (priv->directory_alt, name);
|
|
+
|
|
+ ensure_file (pool, file);
|
|
+
|
|
+ g_object_unref (file);
|
|
+ }
|
|
+
|
|
+ g_object_unref (file_info);
|
|
+
|
|
+ } /* for all files */
|
|
+
|
|
priv->has_loaded_all_files = TRUE;
|
|
|
|
out:
|
|
|
|
if (e != NULL)
|
|
g_object_unref (e);
|
|
+ if (e_alt != NULL)
|
|
+ g_object_unref (e_alt);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
diff --git a/src/polkitbackend/polkitbackendactionpool.h b/src/polkitbackend/polkitbackendactionpool.h
|
|
index e992eea..9ccb526 100644
|
|
--- a/src/polkitbackend/polkitbackendactionpool.h
|
|
+++ b/src/polkitbackend/polkitbackendactionpool.h
|
|
@@ -64,7 +64,7 @@ struct _PolkitBackendActionPoolClass
|
|
};
|
|
|
|
GType polkit_backend_action_pool_get_type (void) G_GNUC_CONST;
|
|
-PolkitBackendActionPool *polkit_backend_action_pool_new (GFile *directory);
|
|
+PolkitBackendActionPool *polkit_backend_action_pool_new (GFile *directory, GFile *directory_alt);
|
|
GList *polkit_backend_action_pool_get_all_actions (PolkitBackendActionPool *pool,
|
|
const gchar *locale);
|
|
|
|
diff --git a/src/polkitbackend/polkitbackendinteractiveauthority.c b/src/polkitbackend/polkitbackendinteractiveauthority.c
|
|
index 1cfc88e..a975cac 100644
|
|
--- a/src/polkitbackend/polkitbackendinteractiveauthority.c
|
|
+++ b/src/polkitbackend/polkitbackendinteractiveauthority.c
|
|
@@ -292,6 +292,7 @@ polkit_backend_interactive_authority_init (PolkitBackendInteractiveAuthority *au
|
|
{
|
|
PolkitBackendInteractiveAuthorityPrivate *priv;
|
|
GFile *directory;
|
|
+ GFile *directory_alt;
|
|
GError *error;
|
|
|
|
/* Force registering error domain */
|
|
@@ -300,8 +301,10 @@ polkit_backend_interactive_authority_init (PolkitBackendInteractiveAuthority *au
|
|
priv = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_GET_PRIVATE (authority);
|
|
|
|
directory = g_file_new_for_path (PACKAGE_DATA_DIR "/polkit-1/actions");
|
|
- priv->action_pool = polkit_backend_action_pool_new (directory);
|
|
+ directory_alt = g_file_new_for_path (PACKAGE_SYSCONF_DIR "/polkit-1/actions");
|
|
+ priv->action_pool = polkit_backend_action_pool_new (directory, directory_alt);
|
|
g_object_unref (directory);
|
|
+ g_object_unref (directory_alt);
|
|
g_signal_connect (priv->action_pool,
|
|
"changed",
|
|
(GCallback) action_pool_changed,
|