mirror of
https://github.com/flatpak/flatpak.git
synced 2026-01-26 14:13:26 +00:00
flatpak-dir: Add content rating support to deploy data
This will be used in upcoming commits to enforce parental controls on app installations. We extend version 2 of the deploy data format because it has not appeared in a release yet. Signed-off-by: Philip Withnall <withnall@endlessm.com> https://github.com/flatpak/flatpak/pull/2797
This commit is contained in:
parent
4113ffa007
commit
8bd8bdcbcc
@ -32,7 +32,7 @@
|
||||
* The version field was added in flatpak 1.2, anything before is 0.
|
||||
*
|
||||
* Version 1 added appdata-name/summary/version/license
|
||||
* Version 2 added extension-of
|
||||
* Version 2 added extension-of/appdata-content-rating
|
||||
*/
|
||||
#define FLATPAK_DEPLOY_VERSION_CURRENT 2
|
||||
#define FLATPAK_DEPLOY_VERSION_ANY 0
|
||||
@ -357,6 +357,8 @@ gboolean flatpak_remove_override_keyfile (const char *app_id,
|
||||
int flatpak_deploy_data_get_version (GVariant *deploy_data);
|
||||
const char * flatpak_deploy_data_get_origin (GVariant *deploy_data);
|
||||
const char * flatpak_deploy_data_get_commit (GVariant *deploy_data);
|
||||
const char * flatpak_deploy_data_get_appdata_content_rating_type (GVariant *deploy_data);
|
||||
GHashTable * flatpak_deploy_data_get_appdata_content_rating (GVariant *deploy_data);
|
||||
const char ** flatpak_deploy_data_get_subpaths (GVariant *deploy_data);
|
||||
guint64 flatpak_deploy_data_get_installed_size (GVariant *deploy_data);
|
||||
const char * flatpak_deploy_data_get_alt_id (GVariant *deploy_data);
|
||||
|
||||
@ -2398,6 +2398,36 @@ flatpak_deploy_data_get_appdata_license (GVariant *deploy_data)
|
||||
return flatpak_deploy_data_get_string (deploy_data, "appdata-license");
|
||||
}
|
||||
|
||||
const char *
|
||||
flatpak_deploy_data_get_appdata_content_rating_type (GVariant *deploy_data)
|
||||
{
|
||||
g_autoptr(GVariant) metadata = g_variant_get_child_value (deploy_data, 4);
|
||||
const char *value = NULL;
|
||||
|
||||
g_variant_lookup (metadata, "appdata-content-rating", "(&s*)", &value, NULL);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
GHashTable * /* (transfer container) (nullable) */
|
||||
flatpak_deploy_data_get_appdata_content_rating (GVariant *deploy_data)
|
||||
{
|
||||
g_autoptr(GVariant) metadata = g_variant_get_child_value (deploy_data, 4);
|
||||
const char *id = NULL, *val = NULL;
|
||||
g_autoptr(GHashTable) content_rating = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
|
||||
g_autoptr(GVariantIter) iter = NULL;
|
||||
|
||||
if (!g_variant_lookup (metadata, "appdata-content-rating", "(*a{ss})", NULL, &iter))
|
||||
return NULL;
|
||||
|
||||
while (g_variant_iter_loop (iter, "{&s&s}", &id, &val))
|
||||
g_hash_table_insert (content_rating,
|
||||
(gpointer) g_intern_string (id),
|
||||
(gpointer) g_intern_string (val));
|
||||
|
||||
return g_steal_pointer (&content_rating);
|
||||
}
|
||||
|
||||
/*<private>
|
||||
* flatpak_deploy_data_get_subpaths:
|
||||
*
|
||||
@ -2473,6 +2503,32 @@ add_locale_metadata_string (GVariantBuilder *metadata_builder,
|
||||
}
|
||||
}
|
||||
|
||||
/* Convert @content_rating_type and @content_rating to a floating #GVariant of
|
||||
* type `(sa{ss})`. */
|
||||
static GVariant *
|
||||
appdata_content_rating_to_variant (const char *content_rating_type,
|
||||
GHashTable *content_rating)
|
||||
{
|
||||
g_auto(GVariantBuilder) builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("(sa{ss})"));
|
||||
GHashTableIter iter;
|
||||
gpointer key, value;
|
||||
|
||||
g_variant_builder_add (&builder, "s", content_rating_type);
|
||||
g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{ss}"));
|
||||
|
||||
g_hash_table_iter_init (&iter, content_rating);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||
{
|
||||
const char *id = key, *val = value;
|
||||
g_variant_builder_add (&builder, "{ss}", id, val);
|
||||
}
|
||||
|
||||
g_variant_builder_close (&builder);
|
||||
|
||||
return g_variant_builder_end (&builder);
|
||||
}
|
||||
|
||||
static void
|
||||
add_appdata_to_deploy_data (GVariantBuilder *metadata_builder,
|
||||
GFile *deploy_dir,
|
||||
@ -2483,12 +2539,15 @@ add_appdata_to_deploy_data (GVariantBuilder *metadata_builder,
|
||||
g_autoptr(GHashTable) comments = NULL;
|
||||
g_autofree char *version = NULL;
|
||||
g_autofree char *license = NULL;
|
||||
g_autofree char *content_rating_type = NULL;
|
||||
g_autoptr(GHashTable) content_rating = NULL;
|
||||
|
||||
appdata_xml = read_appdata_xml_from_deploy_dir (deploy_dir, id);
|
||||
if (appdata_xml == NULL)
|
||||
return;
|
||||
|
||||
if (flatpak_parse_appdata (appdata_xml, id, &names, &comments, &version, &license, NULL, NULL))
|
||||
if (flatpak_parse_appdata (appdata_xml, id, &names, &comments, &version, &license,
|
||||
&content_rating_type, &content_rating))
|
||||
{
|
||||
add_locale_metadata_string (metadata_builder, "appdata-name", names);
|
||||
add_locale_metadata_string (metadata_builder, "appdata-summary", comments);
|
||||
@ -2498,6 +2557,9 @@ add_appdata_to_deploy_data (GVariantBuilder *metadata_builder,
|
||||
if (license)
|
||||
g_variant_builder_add (metadata_builder, "{s@v}", "appdata-license",
|
||||
g_variant_new_variant (g_variant_new_string (license)));
|
||||
if (content_rating_type != NULL && content_rating != NULL)
|
||||
g_variant_builder_add (metadata_builder, "{s@v}", "appdata-content-rating",
|
||||
g_variant_new_variant (appdata_content_rating_to_variant (content_rating_type, content_rating)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -773,7 +773,8 @@ get_ref (FlatpakDir *dir,
|
||||
flatpak_deploy_data_get_appdata_summary (deploy_data),
|
||||
flatpak_deploy_data_get_appdata_version (deploy_data),
|
||||
flatpak_deploy_data_get_appdata_license (deploy_data),
|
||||
NULL, NULL);
|
||||
flatpak_deploy_data_get_appdata_content_rating_type (deploy_data),
|
||||
flatpak_deploy_data_get_appdata_content_rating (deploy_data));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user