Merge pull request #907 from smcv/metadata

Document all metadata groups and keys
This commit is contained in:
Matthias Clasen
2017-07-07 17:50:15 -04:00
committed by GitHub
9 changed files with 342 additions and 101 deletions

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -2220,7 +2220,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;
@@ -2239,9 +2241,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,
@@ -2564,7 +2570,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,
@@ -2576,7 +2582,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++)

View File

@@ -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;

View File

@@ -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,
@@ -3489,30 +3504,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 +4636,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 +4776,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));

View File

@@ -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[];

View File

@@ -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;

View File

@@ -48,7 +48,10 @@
<para>
A metadata file describing the effective configuration is available
inside the running sandbox at <filename>/run/user/$UID/flatpak-info</filename>.
inside the running sandbox at <filename>/.flatpak-info</filename>.
For compatibility with older Flatpak versions,
<filename>/run/user/$UID/flatpak-info</filename> is a symbolic
link to the same file.
</para>
</refsect1>
@@ -87,6 +90,21 @@
<term><option>command</option> (string)</term>
<listitem><para>The command to run. Only relevant for applications.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>required-flatpak</option> (string)</term>
<listitem><para>
The required version of Flatpak to run this application
or runtime.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>tags</option> (string list)</term>
<listitem><para>
Tags to include in AppStream XML.
<!-- TODO: what are these tags for? What should they
be? -->
</para></listitem>
</varlistentry>
</variablelist>
</refsect2>
<refsect2>
@@ -155,6 +173,77 @@
the per-application location.
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>features</option> (list)</term>
<listitem><para>
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.
</para></listitem>
</varlistentry>
</variablelist>
</refsect2>
<refsect2>
<title>[Instance]</title>
<para>
This group only appears in <filename>/.flatpak-info</filename>
for a running app, and not in the metadata files written by
application authors. It is filled in by Flatpak itself.
</para>
<variablelist>
<varlistentry>
<term><option>app-path</option> (string)</term>
<listitem><para>
The absolute path on the host system of the app's
app files, as mounted at <filename>/app</filename>
inside the container
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>branch</option> (string)</term>
<listitem><para>
The branch of the app, for example
<literal>stable</literal>
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>flatpak-version</option> (string)</term>
<listitem><para>
The version number of the Flatpak version that ran
this app
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>runtime-path</option> (string)</term>
<listitem><para>
The absolute path on the host system of the app's
runtime files, as mounted at <filename>/usr</filename>
inside the container
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>session-bus-proxy</option> (boolean)</term>
<listitem><para>
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)
<!-- TODO: Those semantics are weird, are they
intended? -->
</para></listitem>
</varlistentry>
<varlistentry>
<term><option>system-bus-proxy</option> (boolean)</term>
<listitem><para>
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)
<!-- TODO: Those semantics are weird, are they
intended? -->
</para></listitem>
</varlistentry>
</variablelist>
</refsect2>
<refsect2>
@@ -407,6 +496,16 @@
</varlistentry>
</variablelist>
</refsect2>
<refsect2>
<title>[Policy SUBSYSTEM]</title>
<para>
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.
<!-- TODO: More information would be nice -->
</para>
</refsect2>
</refsect1>
<refsect1>

View File

@@ -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);