libeos-parental-controls: Add epc_app_filter_is_appinfo_allowed() API
This is a wrapper around the existing blacklist checking APIs which binds them to specific keys in a #GAppInfo. Signed-off-by: Philip Withnall <withnall@endlessm.com> https://phabricator.endlessm.com/T24017
This commit is contained in:
parent
08e8f994c3
commit
affecd74b8
|
@ -25,6 +25,7 @@
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <glib-object.h>
|
#include <glib-object.h>
|
||||||
#include <glib/gi18n-lib.h>
|
#include <glib/gi18n-lib.h>
|
||||||
|
#include <gio/gdesktopappinfo.h>
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <libeos-parental-controls/app-filter.h>
|
#include <libeos-parental-controls/app-filter.h>
|
||||||
|
|
||||||
|
@ -248,6 +249,75 @@ epc_app_filter_is_flatpak_app_allowed (EpcAppFilter *filter,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* epc_app_filter_is_appinfo_allowed:
|
||||||
|
* @filter: an #EpcAppFilter
|
||||||
|
* @app_info: (transfer none): application information
|
||||||
|
*
|
||||||
|
* Check whether the app with the given @app_info is allowed to be run
|
||||||
|
* according to this app filter. This matches on multiple keys potentially
|
||||||
|
* present in the #GAppInfo, including the path of the executable.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if the user this @filter corresponds to is allowed to run the
|
||||||
|
* app represented by @app_info according to the @filter policy; %FALSE
|
||||||
|
* otherwise
|
||||||
|
* Since: 0.1.0
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
epc_app_filter_is_appinfo_allowed (EpcAppFilter *filter,
|
||||||
|
GAppInfo *app_info)
|
||||||
|
{
|
||||||
|
g_autofree gchar *abs_path = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (filter != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (filter->ref_count >= 1, FALSE);
|
||||||
|
g_return_val_if_fail (G_IS_APP_INFO (app_info), FALSE);
|
||||||
|
|
||||||
|
abs_path = g_find_program_in_path (g_app_info_get_executable (app_info));
|
||||||
|
|
||||||
|
if (abs_path != NULL &&
|
||||||
|
!epc_app_filter_is_path_allowed (filter, abs_path))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (G_IS_DESKTOP_APP_INFO (app_info))
|
||||||
|
{
|
||||||
|
g_autofree gchar *flatpak_app = NULL;
|
||||||
|
g_autofree gchar *old_flatpak_apps_str = NULL;
|
||||||
|
|
||||||
|
/* This gives `org.gnome.Builder`. */
|
||||||
|
flatpak_app = g_desktop_app_info_get_string (G_DESKTOP_APP_INFO (app_info), "X-Flatpak");
|
||||||
|
if (flatpak_app != NULL)
|
||||||
|
flatpak_app = g_strstrip (flatpak_app);
|
||||||
|
|
||||||
|
if (flatpak_app != NULL &&
|
||||||
|
!epc_app_filter_is_flatpak_app_allowed (filter, flatpak_app))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* FIXME: This could do with the g_desktop_app_info_get_string_list() API
|
||||||
|
* from GLib 2.60. Gives `gimp.desktop;org.gimp.Gimp.desktop;`. */
|
||||||
|
old_flatpak_apps_str = g_desktop_app_info_get_string (G_DESKTOP_APP_INFO (app_info), "X-Flatpak-RenamedFrom");
|
||||||
|
if (old_flatpak_apps_str != NULL)
|
||||||
|
{
|
||||||
|
g_auto(GStrv) old_flatpak_apps = g_strsplit (old_flatpak_apps_str, ";", -1);
|
||||||
|
|
||||||
|
for (gsize i = 0; old_flatpak_apps[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
gchar *old_flatpak_app = g_strstrip (old_flatpak_app);
|
||||||
|
|
||||||
|
if (g_str_has_suffix (old_flatpak_app, ".desktop"))
|
||||||
|
old_flatpak_app[strlen (old_flatpak_app) - strlen (".desktop")] = '\0';
|
||||||
|
old_flatpak_app = g_strstrip (old_flatpak_app);
|
||||||
|
|
||||||
|
if (*old_flatpak_app != '\0' &&
|
||||||
|
!epc_app_filter_is_flatpak_app_allowed (filter, old_flatpak_app))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
strcmp_cb (gconstpointer a,
|
strcmp_cb (gconstpointer a,
|
||||||
gconstpointer b)
|
gconstpointer b)
|
||||||
|
|
|
@ -104,6 +104,8 @@ gboolean epc_app_filter_is_flatpak_ref_allowed (EpcAppFilter *filter,
|
||||||
const gchar *app_ref);
|
const gchar *app_ref);
|
||||||
gboolean epc_app_filter_is_flatpak_app_allowed (EpcAppFilter *filter,
|
gboolean epc_app_filter_is_flatpak_app_allowed (EpcAppFilter *filter,
|
||||||
const gchar *app_id);
|
const gchar *app_id);
|
||||||
|
gboolean epc_app_filter_is_appinfo_allowed (EpcAppFilter *filter,
|
||||||
|
GAppInfo *app_info);
|
||||||
|
|
||||||
const gchar **epc_app_filter_get_oars_sections (EpcAppFilter *filter);
|
const gchar **epc_app_filter_get_oars_sections (EpcAppFilter *filter);
|
||||||
EpcAppFilterOarsValue epc_app_filter_get_oars_value (EpcAppFilter *filter,
|
EpcAppFilterOarsValue epc_app_filter_get_oars_value (EpcAppFilter *filter,
|
||||||
|
|
|
@ -12,13 +12,16 @@ libeos_parental_controls_public_deps = [
|
||||||
dependency('glib-2.0', version: '>= 2.54.2'),
|
dependency('glib-2.0', version: '>= 2.54.2'),
|
||||||
dependency('gobject-2.0', version: '>= 2.54'),
|
dependency('gobject-2.0', version: '>= 2.54'),
|
||||||
]
|
]
|
||||||
|
libeos_parental_controls_private_deps = [
|
||||||
|
dependency('gio-unix-2.0', version: '>= 2.36'),
|
||||||
|
]
|
||||||
|
|
||||||
# FIXME: Would be good to use subdir here: https://github.com/mesonbuild/meson/issues/2969
|
# FIXME: Would be good to use subdir here: https://github.com/mesonbuild/meson/issues/2969
|
||||||
libeos_parental_controls_include_subdir = join_paths(libeos_parental_controls_api_name, 'libeos-parental-controls')
|
libeos_parental_controls_include_subdir = join_paths(libeos_parental_controls_api_name, 'libeos-parental-controls')
|
||||||
|
|
||||||
libeos_parental_controls = library(libeos_parental_controls_api_name,
|
libeos_parental_controls = library(libeos_parental_controls_api_name,
|
||||||
libeos_parental_controls_sources + libeos_parental_controls_headers,
|
libeos_parental_controls_sources + libeos_parental_controls_headers,
|
||||||
dependencies: libeos_parental_controls_public_deps,
|
dependencies: libeos_parental_controls_public_deps + libeos_parental_controls_private_deps,
|
||||||
include_directories: root_inc,
|
include_directories: root_inc,
|
||||||
install: true,
|
install: true,
|
||||||
version: meson.project_version(),
|
version: meson.project_version(),
|
||||||
|
@ -42,6 +45,7 @@ pkgconfig.generate(
|
||||||
filebase: libeos_parental_controls_api_name,
|
filebase: libeos_parental_controls_api_name,
|
||||||
description: 'Library providing access to parental control settings.',
|
description: 'Library providing access to parental control settings.',
|
||||||
requires: libeos_parental_controls_public_deps,
|
requires: libeos_parental_controls_public_deps,
|
||||||
|
requires_private: libeos_parental_controls_private_deps,
|
||||||
)
|
)
|
||||||
|
|
||||||
gnome.generate_gir(libeos_parental_controls,
|
gnome.generate_gir(libeos_parental_controls,
|
||||||
|
|
Loading…
Reference in New Issue