From 489bfddfb37970fceda29359ed8cdab79bb3c770 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 7 Jul 2017 16:02:19 +0100 Subject: [PATCH 1/6] common: Add and use constants for flatpak-metadata(5) groups and keys This makes it easier to avoid typos, and also makes it easier to see what groups and keys are in use. In the header file, they are clustered according to the group in which the keys are used. Signed-off-by: Simon McVittie --- app/flatpak-builtins-build-finish.c | 61 ++++++++++++++++++----------- app/flatpak-builtins-build.c | 37 +++++++++++------ builder/builder-manifest.c | 19 ++++++--- common/flatpak-dir.c | 44 +++++++++++---------- common/flatpak-run.c | 45 ++++++++++++++------- common/flatpak-run.h | 53 +++++++++++++++++++++++-- common/flatpak-utils.c | 54 +++++++++++++++++-------- document-portal/xdp-main.c | 12 ++++-- 8 files changed, 226 insertions(+), 99 deletions(-) diff --git a/app/flatpak-builtins-build-finish.c b/app/flatpak-builtins-build-finish.c index 8cc7be1c..eb5fb5d9 100644 --- a/app/flatpak-builtins-build-finish.c +++ b/app/flatpak-builtins-build-finish.c @@ -258,9 +258,9 @@ update_metadata (GFile *base, FlatpakContext *arg_context, gboolean is_runtime, goto out; if (is_runtime) - group = "Runtime"; + group = FLATPAK_METADATA_GROUP_RUNTIME; else - group = "Application"; + group = FLATPAK_METADATA_GROUP_APPLICATION; path = g_file_get_path (metadata); keyfile = g_key_file_new (); @@ -269,8 +269,13 @@ update_metadata (GFile *base, FlatpakContext *arg_context, gboolean is_runtime, if (opt_sdk != NULL || opt_runtime != NULL) { - g_autofree char *old_runtime = g_key_file_get_string (keyfile, group, "runtime", NULL); - g_autofree char *old_sdk = g_key_file_get_string (keyfile, group, "sdk", NULL); + g_autofree char *old_runtime = g_key_file_get_string (keyfile, + group, + FLATPAK_METADATA_KEY_RUNTIME, NULL); + g_autofree char *old_sdk = g_key_file_get_string (keyfile, + group, + FLATPAK_METADATA_KEY_SDK, + NULL); const char *old_sdk_arch = NULL; const char *old_runtime_arch = NULL; const char *old_sdk_branch = NULL; @@ -316,7 +321,7 @@ update_metadata (GFile *base, FlatpakContext *arg_context, gboolean is_runtime, return FALSE; ref = flatpak_build_untyped_ref (id, branch, arch); - g_key_file_set_string (keyfile, group, "sdk", ref); + g_key_file_set_string (keyfile, group, FLATPAK_METADATA_KEY_SDK, ref); } if (opt_runtime) @@ -333,24 +338,24 @@ update_metadata (GFile *base, FlatpakContext *arg_context, gboolean is_runtime, return FALSE; ref = flatpak_build_untyped_ref (id, branch, arch); - g_key_file_set_string (keyfile, group, "runtime", ref); + g_key_file_set_string (keyfile, group, FLATPAK_METADATA_KEY_RUNTIME, ref); } } if (!is_runtime) { - if (g_key_file_has_key (keyfile, group, "command", NULL)) + if (g_key_file_has_key (keyfile, group, FLATPAK_METADATA_KEY_COMMAND, NULL)) { g_debug ("Command key is present"); if (opt_command) - g_key_file_set_string (keyfile, group, "command", opt_command); + g_key_file_set_string (keyfile, group, FLATPAK_METADATA_KEY_COMMAND, opt_command); } else if (opt_command) { g_debug ("Using explicitly provided command %s", opt_command); - g_key_file_set_string (keyfile, group, "command", opt_command); + g_key_file_set_string (keyfile, group, FLATPAK_METADATA_KEY_COMMAND, opt_command); } else { @@ -386,7 +391,7 @@ update_metadata (GFile *base, FlatpakContext *arg_context, gboolean is_runtime, if (command) { g_print ("Using %s as command\n", command); - g_key_file_set_string (keyfile, group, "command", command); + g_key_file_set_string (keyfile, group, FLATPAK_METADATA_KEY_COMMAND, command); } else { @@ -427,19 +432,26 @@ update_metadata (GFile *base, FlatpakContext *arg_context, gboolean is_runtime, goto out; } - uri_key = g_strconcat ("uri", suffix, NULL); - name_key = g_strconcat ("name", suffix, NULL); - checksum_key = g_strconcat ("checksum", suffix, NULL); - size_key = g_strconcat ("size", suffix, NULL); - installed_size_key = g_strconcat ("installed-size", suffix, NULL); + uri_key = g_strconcat (FLATPAK_METADATA_KEY_EXTRA_DATA_URI, suffix, NULL); + name_key = g_strconcat (FLATPAK_METADATA_KEY_EXTRA_DATA_NAME, suffix, NULL); + checksum_key = g_strconcat (FLATPAK_METADATA_KEY_EXTRA_DATA_CHECKSUM, + suffix, NULL); + size_key = g_strconcat (FLATPAK_METADATA_KEY_EXTRA_DATA_SIZE, suffix, NULL); + installed_size_key = g_strconcat (FLATPAK_METADATA_KEY_EXTRA_DATA_INSTALLED_SIZE, + suffix, NULL); if (strlen (elements[0]) > 0) - g_key_file_set_string (keyfile, "Extra Data", name_key, elements[0]); - g_key_file_set_string (keyfile, "Extra Data", checksum_key, elements[1]); - g_key_file_set_string (keyfile, "Extra Data", size_key, elements[2]); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_EXTRA_DATA, + name_key, elements[0]); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_EXTRA_DATA, + checksum_key, elements[1]); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_EXTRA_DATA, + size_key, elements[2]); if (strlen (elements[3]) > 0) - g_key_file_set_string (keyfile, "Extra Data", installed_size_key, elements[3]); - g_key_file_set_string (keyfile, "Extra Data", uri_key, elements[4]); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_EXTRA_DATA, + installed_size_key, elements[3]); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_EXTRA_DATA, + uri_key, elements[4]); } for (i = 0; opt_metadata != NULL && opt_metadata[i] != NULL; i++) @@ -467,7 +479,8 @@ update_metadata (GFile *base, FlatpakContext *arg_context, gboolean is_runtime, goto out; } - groupname = g_strdup_printf ("Extension %s", elements[0]); + groupname = g_strconcat (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION, + elements[0], NULL); g_key_file_set_string (keyfile, groupname, elements[1], elements[2] ? elements[2] : "true"); } @@ -531,10 +544,12 @@ flatpak_builtin_build_finish (int argc, char **argv, GCancellable *cancellable, if (!g_key_file_load_from_data (metakey, metadata_contents, metadata_size, 0, error)) return FALSE; - id = g_key_file_get_string (metakey, "Application", "name", NULL); + id = g_key_file_get_string (metakey, FLATPAK_METADATA_GROUP_APPLICATION, + FLATPAK_METADATA_KEY_NAME, NULL); if (id == NULL) { - id = g_key_file_get_string (metakey, "Runtime", "name", NULL); + id = g_key_file_get_string (metakey, FLATPAK_METADATA_GROUP_RUNTIME, + FLATPAK_METADATA_KEY_NAME, NULL); if (id == NULL) return flatpak_fail (error, _("No name specified in the metadata")); is_runtime = TRUE; diff --git a/app/flatpak-builtins-build.c b/app/flatpak-builtins-build.c index ff82f489..e1939271 100644 --- a/app/flatpak-builtins-build.c +++ b/app/flatpak-builtins-build.c @@ -97,6 +97,7 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError g_auto(GStrv) runtime_ref_parts = NULL; FlatpakRunFlags run_flags; const char *group = NULL; + const char *runtime_key = NULL; const char *dest = NULL; gboolean is_app = FALSE; gboolean is_extension = FALSE; @@ -146,19 +147,21 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError if (!g_key_file_load_from_data (metakey, metadata_contents, metadata_size, 0, error)) return FALSE; - if (g_key_file_has_group (metakey, "Application")) + if (g_key_file_has_group (metakey, FLATPAK_METADATA_GROUP_APPLICATION)) { - group = "Application"; + group = FLATPAK_METADATA_GROUP_APPLICATION; is_app = TRUE; } - else if (g_key_file_has_group (metakey, "Runtime")) + else if (g_key_file_has_group (metakey, FLATPAK_METADATA_GROUP_RUNTIME)) { - group = "Runtime"; + group = FLATPAK_METADATA_GROUP_RUNTIME; } else return flatpak_fail (error, _("metadata invalid, not application or runtime")); - extensionof_ref = g_key_file_get_string (metakey, "ExtensionOf", "ref", NULL); + extensionof_ref = g_key_file_get_string (metakey, + FLATPAK_METADATA_GROUP_EXTENSION_OF, + FLATPAK_METADATA_KEY_REF, NULL); if (extensionof_ref != NULL) { is_extension = TRUE; @@ -167,11 +170,16 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError } - id = g_key_file_get_string (metakey, group, "name", error); + id = g_key_file_get_string (metakey, group, FLATPAK_METADATA_KEY_NAME, error); if (id == NULL) return FALSE; - runtime = g_key_file_get_string (metakey, group, opt_runtime ? "runtime" : "sdk", error); + if (opt_runtime) + runtime_key = FLATPAK_METADATA_KEY_RUNTIME; + else + runtime_key = FLATPAK_METADATA_KEY_SDK; + + runtime = g_key_file_get_string (metakey, group, runtime_key, error); if (runtime == NULL) return FALSE; @@ -222,7 +230,7 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError x_metakey = flatpak_deploy_get_metadata (extensionof_deploy); - x_group = g_strdup_printf ("Extension %s", id); + x_group = g_strconcat (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION, id, NULL); if (!g_key_file_has_group (x_metakey, x_group)) { /* Failed, look for subdirectories=true parent */ @@ -232,8 +240,11 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError { char *parent_id = g_strndup (id, last_dot - id); g_free (x_group); - x_group = g_strdup_printf ("Extension %s", parent_id); - if (g_key_file_get_boolean (x_metakey, x_group, "subdirectories", NULL)) + x_group = g_strconcat (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION, + parent_id, NULL); + if (g_key_file_get_boolean (x_metakey, x_group, + FLATPAK_METADATA_KEY_SUBDIRECTORIES, + NULL)) x_subdir = last_dot + 1; } @@ -241,12 +252,14 @@ flatpak_builtin_build (int argc, char **argv, GCancellable *cancellable, GError return flatpak_fail (error, _("No extension point matching %s in %s"), id, extensionof_ref); } - x_dir = g_key_file_get_string (x_metakey, x_group, "directory", error); + x_dir = g_key_file_get_string (x_metakey, x_group, + FLATPAK_METADATA_KEY_DIRECTORY, error); if (x_dir == NULL) return FALSE; x_subdir_suffix = g_key_file_get_string (x_metakey, x_group, - "subdirectory-suffix", NULL); + FLATPAK_METADATA_KEY_SUBDIRECTORY_SUFFIX, + NULL); if (is_app_extension) { diff --git a/builder/builder-manifest.c b/builder/builder-manifest.c index f2521db1..dfcfb079 100644 --- a/builder/builder-manifest.c +++ b/builder/builder-manifest.c @@ -2221,7 +2221,9 @@ builder_manifest_finish (BuilderManifest *self, for (i = 0; self->inherit_extensions[i] != NULL; i++) { - g_autofree char *group = g_strdup_printf ("Extension %s", self->inherit_extensions[i]); + g_autofree char *group = g_strconcat (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION, + self->inherit_extensions[i], + NULL); g_auto(GStrv) keys = NULL; int j; @@ -2240,9 +2242,13 @@ builder_manifest_finish (BuilderManifest *self, g_key_file_set_value (keyfile, group, keys[j], value); } - if (!g_key_file_has_key (keyfile, group, "version", NULL) && - !g_key_file_has_key (keyfile, group, "versions", NULL)) - g_key_file_set_value (keyfile, group, "version", parent_version); + if (!g_key_file_has_key (keyfile, group, + FLATPAK_METADATA_KEY_VERSION, NULL) && + !g_key_file_has_key (keyfile, group, + FLATPAK_METADATA_KEY_VERSIONS, NULL)) + g_key_file_set_value (keyfile, group, + FLATPAK_METADATA_KEY_VERSION, + parent_version); } if (!g_key_file_save_to_file (keyfile, @@ -2565,7 +2571,7 @@ builder_manifest_create_platform (BuilderManifest *self, g_autoptr(GFile) dest_metadata = g_file_get_child (app_dir, "metadata.platform"); g_autoptr(GKeyFile) keyfile = g_key_file_new (); g_auto(GStrv) groups = NULL; - g_autofree char *sdk_group_prefix = g_strdup_printf ("Extension %s.", self->id); + g_autofree char *sdk_group_prefix = g_strconcat (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION, self->id, NULL); int j; if (!g_key_file_load_from_file (keyfile, @@ -2577,7 +2583,8 @@ builder_manifest_create_platform (BuilderManifest *self, return FALSE; } - g_key_file_set_string (keyfile, "Runtime", "name", self->id_platform); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_RUNTIME, + FLATPAK_METADATA_KEY_NAME, self->id_platform); groups = g_key_file_get_groups (keyfile, NULL); for (j = 0; groups[j] != NULL; j++) diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c index 45c938d1..746837a7 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -4307,7 +4307,7 @@ apply_extra_data (FlatpakDir *self, g_autoptr(GArray) fd_array = NULL; g_auto(GStrv) envp = NULL; int exit_status; - const char *group = "Application"; + const char *group = FLATPAK_METADATA_GROUP_APPLICATION; g_autoptr(GError) local_error = NULL; apply_extra_file = g_file_resolve_relative_path (checkoutdir, "files/bin/apply_extra"); @@ -4323,11 +4323,13 @@ apply_extra_data (FlatpakDir *self, if (!g_key_file_load_from_data (metakey, metadata_contents, metadata_size, 0, error)) return FALSE; - id = g_key_file_get_string (metakey, group, "name", &local_error); + id = g_key_file_get_string (metakey, group, FLATPAK_METADATA_KEY_NAME, + &local_error); if (id == NULL) { - group = "Runtime"; - id = g_key_file_get_string (metakey, group, "name", NULL); + group = FLATPAK_METADATA_GROUP_RUNTIME; + id = g_key_file_get_string (metakey, group, FLATPAK_METADATA_KEY_NAME, + NULL); if (id == NULL) { g_propagate_error (error, g_steal_pointer (&local_error)); @@ -4336,7 +4338,8 @@ apply_extra_data (FlatpakDir *self, g_clear_error (&local_error); } - runtime = g_key_file_get_string (metakey, group, "runtime", error); + runtime = g_key_file_get_string (metakey, group, + FLATPAK_METADATA_KEY_RUNTIME, error); if (runtime == NULL) return FALSE; @@ -4346,7 +4349,8 @@ apply_extra_data (FlatpakDir *self, if (runtime_ref_parts == NULL) return FALSE; - if (!g_key_file_get_boolean (metakey, "Extra Data", "NoRuntime", NULL)) + if (!g_key_file_get_boolean (metakey, FLATPAK_METADATA_GROUP_EXTRA_DATA, + FLATPAK_METADATA_KEY_NO_RUNTIME, NULL)) { runtime_deploy = flatpak_find_deploy_for_ref (runtime_ref, cancellable, error); if (runtime_deploy == NULL) @@ -8649,19 +8653,19 @@ flatpak_dir_find_remote_related (FlatpakDir *self, { char *extension; - if (g_str_has_prefix (groups[i], "Extension ") && - *(extension = (groups[i] + strlen ("Extension "))) != 0) + if (g_str_has_prefix (groups[i], FLATPAK_METADATA_GROUP_PREFIX_EXTENSION) && + *(extension = (groups[i] + strlen (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION))) != 0) { g_autofree char *version = g_key_file_get_string (metakey, groups[i], - "version", NULL); + FLATPAK_METADATA_KEY_VERSION, NULL); gboolean subdirectories = g_key_file_get_boolean (metakey, groups[i], - "subdirectories", NULL); + FLATPAK_METADATA_KEY_SUBDIRECTORIES, NULL); gboolean no_autodownload = g_key_file_get_boolean (metakey, groups[i], - "no-autodownload", NULL); + FLATPAK_METADATA_KEY_NO_AUTODOWNLOAD, NULL); g_autofree char *download_if = g_key_file_get_string (metakey, groups[i], - "download-if", NULL); + FLATPAK_METADATA_KEY_DOWNLOAD_IF, NULL); gboolean autodelete = g_key_file_get_boolean (metakey, groups[i], - "autodelete", NULL); + FLATPAK_METADATA_KEY_AUTODELETE, NULL); const char *branch; g_autofree char *extension_ref = NULL; g_autofree char *checksum = NULL; @@ -8781,19 +8785,19 @@ flatpak_dir_find_local_related (FlatpakDir *self, { char *extension; - if (g_str_has_prefix (groups[i], "Extension ") && - *(extension = (groups[i] + strlen ("Extension "))) != 0) + if (g_str_has_prefix (groups[i], FLATPAK_METADATA_GROUP_PREFIX_EXTENSION) && + *(extension = (groups[i] + strlen (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION))) != 0) { g_autofree char *version = g_key_file_get_string (metakey, groups[i], - "version", NULL); + FLATPAK_METADATA_KEY_VERSION, NULL); gboolean subdirectories = g_key_file_get_boolean (metakey, groups[i], - "subdirectories", NULL); + FLATPAK_METADATA_KEY_SUBDIRECTORIES, NULL); gboolean no_autodownload = g_key_file_get_boolean (metakey, groups[i], - "no-autodownload", NULL); + FLATPAK_METADATA_KEY_NO_AUTODOWNLOAD, NULL); g_autofree char *download_if = g_key_file_get_string (metakey, groups[i], - "download-if", NULL); + FLATPAK_METADATA_KEY_DOWNLOAD_IF, NULL); gboolean autodelete = g_key_file_get_boolean (metakey, groups[i], - "autodelete", NULL); + FLATPAK_METADATA_KEY_AUTODELETE, NULL); const char *branch; g_autofree char *extension_ref = NULL; g_autofree char *prefixed_extension_ref = NULL; diff --git a/common/flatpak-run.c b/common/flatpak-run.c index 70cb5b7f..7627b8d4 100644 --- a/common/flatpak-run.c +++ b/common/flatpak-run.c @@ -3489,30 +3489,37 @@ flatpak_run_add_app_info_args (GPtrArray *argv_array, keyfile = g_key_file_new (); if (app_files) - group = "Application"; + group = FLATPAK_METADATA_GROUP_APPLICATION; else - group = "Runtime"; + group = FLATPAK_METADATA_GROUP_RUNTIME; - g_key_file_set_string (keyfile, group, "name", app_id); - g_key_file_set_string (keyfile, group, "runtime", runtime_ref); + g_key_file_set_string (keyfile, group, FLATPAK_METADATA_KEY_NAME, app_id); + g_key_file_set_string (keyfile, group, FLATPAK_METADATA_KEY_RUNTIME, + runtime_ref); if (app_files) { g_autofree char *app_path = g_file_get_path (app_files); - g_key_file_set_string (keyfile, "Instance", "app-path", app_path); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_APP_PATH, app_path); } runtime_path = g_file_get_path (runtime_files); - g_key_file_set_string (keyfile, "Instance", "runtime-path", runtime_path); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_RUNTIME_PATH, runtime_path); if (app_branch != NULL) - g_key_file_set_string (keyfile, "Instance", "branch", app_branch); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_BRANCH, app_branch); - g_key_file_set_string (keyfile, "Instance", "flatpak-version", PACKAGE_VERSION); + g_key_file_set_string (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_FLATPAK_VERSION, PACKAGE_VERSION); if ((final_app_context->sockets & FLATPAK_CONTEXT_SOCKET_SESSION_BUS) == 0) - g_key_file_set_boolean (keyfile, "Instance", "session-bus-proxy", TRUE); + g_key_file_set_boolean (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_SESSION_BUS_PROXY, TRUE); if ((final_app_context->sockets & FLATPAK_CONTEXT_SOCKET_SYSTEM_BUS) == 0) - g_key_file_set_boolean (keyfile, "Instance", "system-bus-proxy", TRUE); + g_key_file_set_boolean (keyfile, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_SYSTEM_BUS_PROXY, TRUE); flatpak_context_save_metadata (final_app_context, TRUE, keyfile); @@ -4614,10 +4621,17 @@ flatpak_run_app (const char *app_ref, } else { + const gchar *key; + + if ((flags & FLATPAK_RUN_FLAG_DEVEL) != 0) + key = FLATPAK_METADATA_KEY_SDK; + else + key = FLATPAK_METADATA_KEY_RUNTIME, + metakey = flatpak_deploy_get_metadata (app_deploy); - default_runtime = g_key_file_get_string (metakey, "Application", - (flags & FLATPAK_RUN_FLAG_DEVEL) != 0 ? "sdk" : "runtime", - &my_error); + default_runtime = g_key_file_get_string (metakey, + FLATPAK_METADATA_GROUP_APPLICATION, + key, &my_error); if (my_error) { g_propagate_error (error, g_steal_pointer (&my_error)); @@ -4747,7 +4761,10 @@ flatpak_run_app (const char *app_ref, } else if (metakey) { - default_command = g_key_file_get_string (metakey, "Application", "command", &my_error); + default_command = g_key_file_get_string (metakey, + FLATPAK_METADATA_GROUP_APPLICATION, + FLATPAK_METADATA_KEY_COMMAND, + &my_error); if (my_error) { g_propagate_error (error, g_steal_pointer (&my_error)); diff --git a/common/flatpak-run.h b/common/flatpak-run.h index c196c883..8aecc5e4 100644 --- a/common/flatpak-run.h +++ b/common/flatpak-run.h @@ -29,11 +29,18 @@ gboolean flatpak_run_in_transient_unit (const char *app_id, GError **error); +/* See flatpak-metadata(5) */ + +#define FLATPAK_METADATA_GROUP_APPLICATION "Application" +#define FLATPAK_METADATA_GROUP_RUNTIME "Runtime" +#define FLATPAK_METADATA_KEY_COMMAND "command" +#define FLATPAK_METADATA_KEY_NAME "name" +#define FLATPAK_METADATA_KEY_REQUIRED_FLATPAK "required-flatpak" +#define FLATPAK_METADATA_KEY_RUNTIME "runtime" +#define FLATPAK_METADATA_KEY_SDK "sdk" +#define FLATPAK_METADATA_KEY_TAGS "tags" + #define FLATPAK_METADATA_GROUP_CONTEXT "Context" -#define FLATPAK_METADATA_GROUP_SESSION_BUS_POLICY "Session Bus Policy" -#define FLATPAK_METADATA_GROUP_SYSTEM_BUS_POLICY "System Bus Policy" -#define FLATPAK_METADATA_GROUP_PREFIX_POLICY "Policy " -#define FLATPAK_METADATA_GROUP_ENVIRONMENT "Environment" #define FLATPAK_METADATA_KEY_SHARED "shared" #define FLATPAK_METADATA_KEY_SOCKETS "sockets" #define FLATPAK_METADATA_KEY_FILESYSTEMS "filesystems" @@ -41,6 +48,44 @@ gboolean flatpak_run_in_transient_unit (const char *app_id, #define FLATPAK_METADATA_KEY_DEVICES "devices" #define FLATPAK_METADATA_KEY_FEATURES "features" +#define FLATPAK_METADATA_GROUP_INSTANCE "Instance" +#define FLATPAK_METADATA_KEY_APP_PATH "app-path" +#define FLATPAK_METADATA_KEY_BRANCH "branch" +#define FLATPAK_METADATA_KEY_FLATPAK_VERSION "flatpak-version" +#define FLATPAK_METADATA_KEY_RUNTIME_PATH "runtime-path" +#define FLATPAK_METADATA_KEY_SESSION_BUS_PROXY "session-bus-proxy" +#define FLATPAK_METADATA_KEY_SYSTEM_BUS_PROXY "system-bus-proxy" + +#define FLATPAK_METADATA_GROUP_SESSION_BUS_POLICY "Session Bus Policy" +#define FLATPAK_METADATA_GROUP_SYSTEM_BUS_POLICY "System Bus Policy" +#define FLATPAK_METADATA_GROUP_PREFIX_POLICY "Policy " +#define FLATPAK_METADATA_GROUP_ENVIRONMENT "Environment" + +#define FLATPAK_METADATA_GROUP_PREFIX_EXTENSION "Extension " +#define FLATPAK_METADATA_KEY_ADD_LD_PATH "add-ld-path" +#define FLATPAK_METADATA_KEY_AUTODELETE "autodelete" +#define FLATPAK_METADATA_KEY_DIRECTORY "directory" +#define FLATPAK_METADATA_KEY_DOWNLOAD_IF "download-if" +#define FLATPAK_METADATA_KEY_ENABLE_IF "enable-if" +#define FLATPAK_METADATA_KEY_MERGE_DIRS "merge-dirs" +#define FLATPAK_METADATA_KEY_NO_AUTODOWNLOAD "no-autodownload" +#define FLATPAK_METADATA_KEY_SUBDIRECTORIES "subdirectories" +#define FLATPAK_METADATA_KEY_SUBDIRECTORY_SUFFIX "subdirectory-suffix" +#define FLATPAK_METADATA_KEY_VERSION "version" +#define FLATPAK_METADATA_KEY_VERSIONS "versions" + +#define FLATPAK_METADATA_GROUP_EXTRA_DATA "Extra Data" +#define FLATPAK_METADATA_KEY_EXTRA_DATA_CHECKSUM "checksum" +#define FLATPAK_METADATA_KEY_EXTRA_DATA_INSTALLED_SIZE "installed-size" +#define FLATPAK_METADATA_KEY_EXTRA_DATA_NAME "name" +#define FLATPAK_METADATA_KEY_EXTRA_DATA_SIZE "size" +#define FLATPAK_METADATA_KEY_EXTRA_DATA_URI "uri" +#define FLATPAK_METADATA_KEY_NO_RUNTIME "NoRuntime" + +#define FLATPAK_METADATA_GROUP_EXTENSION_OF "ExtensionOf" +#define FLATPAK_METADATA_KEY_PRIORITY "priority" +#define FLATPAK_METADATA_KEY_REF "ref" + extern const char *flatpak_context_sockets[]; extern const char *flatpak_context_devices[]; extern const char *flatpak_context_features[]; diff --git a/common/flatpak-utils.c b/common/flatpak-utils.c index 7253880f..282d4fd7 100644 --- a/common/flatpak-utils.c +++ b/common/flatpak-utils.c @@ -1676,7 +1676,8 @@ parse_app_id_from_fileinfo (int pid) if (errno == ENOENT) { /* No file => on the host */ - g_key_file_set_string (metadata, "Application", "name", ""); + g_key_file_set_string (metadata, FLATPAK_METADATA_GROUP_APPLICATION, + FLATPAK_METADATA_KEY_NAME, ""); return g_steal_pointer (&metadata); } @@ -3351,13 +3352,15 @@ flatpak_appstream_xml_migrate (FlatpakXml *source, return FALSE; if (g_str_has_prefix (ref, "app/")) - group = "Application"; + group = FLATPAK_METADATA_GROUP_APPLICATION; else - group = "Runtime"; + group = FLATPAK_METADATA_GROUP_RUNTIME; - tags = g_key_file_get_string_list (metadata, group, "tags", NULL, NULL); - runtime = g_key_file_get_string (metadata, group, "runtime", NULL); - sdk = g_key_file_get_string (metadata, group, "sdk", NULL); + tags = g_key_file_get_string_list (metadata, group, FLATPAK_METADATA_KEY_TAGS, + NULL, NULL); + runtime = g_key_file_get_string (metadata, group, + FLATPAK_METADATA_KEY_RUNTIME, NULL); + sdk = g_key_file_get_string (metadata, group, FLATPAK_METADATA_KEY_SDK, NULL); source_components = source->first_child; dest_components = dest->first_child; @@ -3831,7 +3834,10 @@ flatpak_extension_new (const char *id, g_autofree char *metadata_path = g_build_filename (ext->files_path, "../metadata", NULL); if (g_key_file_load_from_file (keyfile, metadata_path, G_KEY_FILE_NONE, NULL)) - ext->priority = g_key_file_get_integer (keyfile, "ExtensionOf", "priority", NULL); + ext->priority = g_key_file_get_integer (keyfile, + FLATPAK_METADATA_GROUP_EXTENSION_OF, + FLATPAK_METADATA_KEY_PRIORITY, + NULL); } return ext; @@ -3879,11 +3885,21 @@ add_extension (GKeyFile *metakey, GList *res) { FlatpakExtension *ext; - g_autofree char *directory = g_key_file_get_string (metakey, group, "directory", NULL); - g_autofree char *add_ld_path = g_key_file_get_string (metakey, group, "add-ld-path", NULL); - g_auto(GStrv) merge_dirs = g_key_file_get_string_list (metakey, group, "merge-dirs", NULL, NULL); - g_autofree char *enable_if = g_key_file_get_string (metakey, group, "enable-if", NULL); - g_autofree char *subdir_suffix = g_key_file_get_string (metakey, group, "subdirectory-suffix", NULL); + g_autofree char *directory = g_key_file_get_string (metakey, group, + FLATPAK_METADATA_KEY_DIRECTORY, + NULL); + g_autofree char *add_ld_path = g_key_file_get_string (metakey, group, + FLATPAK_METADATA_KEY_ADD_LD_PATH, + NULL); + g_auto(GStrv) merge_dirs = g_key_file_get_string_list (metakey, group, + FLATPAK_METADATA_KEY_MERGE_DIRS, + NULL, NULL); + g_autofree char *enable_if = g_key_file_get_string (metakey, group, + FLATPAK_METADATA_KEY_ENABLE_IF, + NULL); + g_autofree char *subdir_suffix = g_key_file_get_string (metakey, group, + FLATPAK_METADATA_KEY_SUBDIRECTORY_SUFFIX, + NULL); g_autofree char *ref = NULL; gboolean is_unmaintained = FALSE; g_autoptr(GFile) files = NULL; @@ -3910,7 +3926,7 @@ add_extension (GKeyFile *metakey, } } else if (g_key_file_get_boolean (metakey, group, - "subdirectories", NULL)) + FLATPAK_METADATA_KEY_SUBDIRECTORIES, NULL)) { g_autofree char *prefix = g_strconcat (extension, ".", NULL); g_auto(GStrv) refs = NULL; @@ -3973,11 +3989,15 @@ flatpak_list_extensions (GKeyFile *metakey, { char *extension; - if (g_str_has_prefix (groups[i], "Extension ") && - *(extension = (groups[i] + strlen ("Extension "))) != 0) + if (g_str_has_prefix (groups[i], FLATPAK_METADATA_GROUP_PREFIX_EXTENSION) && + *(extension = (groups[i] + strlen (FLATPAK_METADATA_GROUP_PREFIX_EXTENSION))) != 0) { - g_autofree char *version = g_key_file_get_string (metakey, groups[i], "version", NULL); - g_auto(GStrv) versions = g_key_file_get_string_list (metakey, groups[i], "versions", NULL, NULL); + g_autofree char *version = g_key_file_get_string (metakey, groups[i], + FLATPAK_METADATA_KEY_VERSION, + NULL); + g_auto(GStrv) versions = g_key_file_get_string_list (metakey, groups[i], + FLATPAK_METADATA_KEY_VERSIONS, + NULL, NULL); const char *default_branches[] = { default_branch, NULL}; const char **branches; diff --git a/document-portal/xdp-main.c b/document-portal/xdp-main.c index c4267746..bafab085 100644 --- a/document-portal/xdp-main.c +++ b/document-portal/xdp-main.c @@ -422,8 +422,12 @@ validate_fd (int fd, /* For apps we translate /app and /usr to the installed locations. Also, we need to rewrite to drop the /newroot prefix added by bubblewrap for other files to work. */ - app_path = g_key_file_get_string (app_info, "Instance", "app-path", NULL); - runtime_path = g_key_file_get_string (app_info, "Instance", "runtime-path", NULL); + app_path = g_key_file_get_string (app_info, FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_APP_PATH, NULL); + runtime_path = g_key_file_get_string (app_info, + FLATPAK_METADATA_GROUP_INSTANCE, + FLATPAK_METADATA_KEY_RUNTIME_PATH, + NULL); if (app_path != NULL || runtime_path != NULL) { if (app_path != NULL && @@ -824,7 +828,9 @@ got_app_id_cb (GObject *source_object, app_info = flatpak_invocation_lookup_app_info_finish (invocation, res, &error); if (app_info != NULL) - app_id = g_key_file_get_string (app_info, "Application", "name", &error); + app_id = g_key_file_get_string (app_info, + FLATPAK_METADATA_GROUP_APPLICATION, + FLATPAK_METADATA_KEY_NAME, &error); if (app_id == NULL) g_dbus_method_invocation_return_gerror (invocation, error); From 6839fee009f9a9ab26f30beb67af2d37a009d2fe Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 7 Jul 2017 16:02:32 +0100 Subject: [PATCH 2/6] common: Clarify what flatpak_context_load_metadata, save_metadata do Signed-off-by: Simon McVittie --- common/flatpak-run.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/common/flatpak-run.c b/common/flatpak-run.c index 7627b8d4..e3cdadd6 100644 --- a/common/flatpak-run.c +++ b/common/flatpak-run.c @@ -1233,7 +1233,15 @@ parse_negated (const char *option, gboolean *negated) return option; } -/* This is a merge, not a replace */ +/* + * Merge the FLATPAK_METADATA_GROUP_CONTEXT, + * FLATPAK_METADATA_GROUP_SESSION_BUS_POLICY, + * FLATPAK_METADATA_GROUP_SYSTEM_BUS_POLICY and + * FLATPAK_METADATA_GROUP_ENVIRONMENT groups, and all groups starting + * with FLATPAK_METADATA_GROUP_PREFIX_POLICY, from metakey into context. + * + * This is a merge, not a replace! + */ gboolean flatpak_context_load_metadata (FlatpakContext *context, GKeyFile *metakey, @@ -1444,6 +1452,13 @@ flatpak_context_load_metadata (FlatpakContext *context, return TRUE; } +/* + * Save the FLATPAK_METADATA_GROUP_CONTEXT, + * FLATPAK_METADATA_GROUP_SESSION_BUS_POLICY, + * FLATPAK_METADATA_GROUP_SYSTEM_BUS_POLICY and + * FLATPAK_METADATA_GROUP_ENVIRONMENT groups, and all groups starting + * with FLATPAK_METADATA_GROUP_PREFIX_POLICY, into metakey + */ void flatpak_context_save_metadata (FlatpakContext *context, gboolean flatten, From b552d8995b3e932a48d1f04f743e7e0c049d9cea Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 7 Jul 2017 16:02:54 +0100 Subject: [PATCH 3/6] flatpak-metadata(5): Document /.flatpak-info Signed-off-by: Simon McVittie --- doc/flatpak-metadata.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/flatpak-metadata.xml b/doc/flatpak-metadata.xml index 180880a6..2a1a1f11 100644 --- a/doc/flatpak-metadata.xml +++ b/doc/flatpak-metadata.xml @@ -48,7 +48,10 @@ A metadata file describing the effective configuration is available - inside the running sandbox at /run/user/$UID/flatpak-info. + inside the running sandbox at /.flatpak-info. + For compatibility with older Flatpak versions, + /run/user/$UID/flatpak-info is a symbolic + link to the same file. From 6856ca18bc7fb219d04b1f5f62a499e1e214343c Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 7 Jul 2017 16:03:24 +0100 Subject: [PATCH 4/6] flatpak-metadata(5): Document missing keys Signed-off-by: Simon McVittie --- doc/flatpak-metadata.xml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/doc/flatpak-metadata.xml b/doc/flatpak-metadata.xml index 2a1a1f11..49ed9251 100644 --- a/doc/flatpak-metadata.xml +++ b/doc/flatpak-metadata.xml @@ -90,6 +90,21 @@ (string) The command to run. Only relevant for applications. + + (string) + + The required version of Flatpak to run this application + or runtime. + + + + (string list) + + Tags to include in AppStream XML. + + + @@ -158,6 +173,17 @@ the per-application location. + + (list) + + List of features available or unavailable to the + application, currently from the following list: + devel, multiarch. + A feature can be prefixed with ! to indicate the absence + of that feature, for example !devel if development and + debugging are not allowed. + + From b5023ffe87081998a4477ec69e2364361a7b628e Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 7 Jul 2017 16:03:40 +0100 Subject: [PATCH 5/6] flatpak-metadata(5): Document the Instance group Signed-off-by: Simon McVittie --- doc/flatpak-metadata.xml | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/doc/flatpak-metadata.xml b/doc/flatpak-metadata.xml index 49ed9251..1be44633 100644 --- a/doc/flatpak-metadata.xml +++ b/doc/flatpak-metadata.xml @@ -186,6 +186,66 @@ + + [Instance] + + This group only appears in /.flatpak-info + for a running app, and not in the metadata files written by + application authors. It is filled in by Flatpak itself. + + + + (string) + + The absolute path on the host system of the app's + app files, as mounted at /app + inside the container + + + + (string) + + The branch of the app, for example + stable + + + + (string) + + The version number of the Flatpak version that ran + this app + + + + (string) + + The absolute path on the host system of the app's + runtime files, as mounted at /usr + inside the container + + + + (boolean) + + True if this app cannot access the D-Bus session bus + directly (either it goes via a proxy, or it cannot + access the session bus at all) + + + + + (boolean) + + True if this app cannot access the D-Bus system bus + directly (either it goes via a proxy, or it cannot + access the system bus at all) + + + + + [Session Bus Policy] From 33caac29d2911e88c3e974ed05ce58a992808376 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Fri, 7 Jul 2017 16:04:03 +0100 Subject: [PATCH 6/6] flatpak-metadata(5): Add very brief documentation for Policy groups Signed-off-by: Simon McVittie --- doc/flatpak-metadata.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/flatpak-metadata.xml b/doc/flatpak-metadata.xml index 1be44633..131a1a1b 100644 --- a/doc/flatpak-metadata.xml +++ b/doc/flatpak-metadata.xml @@ -496,6 +496,16 @@ + + [Policy SUBSYSTEM] + + Subsystems can define their own policies to be placed in a group + whose name has this form. Their values are treated as lists, + in which items can have their meaning negated by prepending ! + to the value. They are not otherwise parsed by Flatpak. + + +