/** * flatpak_remote_get_gpg_verify: * @self: a #FlatpakRemote * * Returns whether GPG verification is enabled for the remote. * * Returns: whether GPG verification is enabled */ gboolean flatpak_remote_get_gpg_verify (FlatpakRemote *self) { FlatpakRemotePrivate *priv = flatpak_remote_get_instance_private (self); gboolean res; if (priv->local_gpg_verify_set) return priv->local_gpg_verify; if (priv->dir) { OstreeRepo *repo = flatpak_dir_get_repo (priv->dir); if (ostree_repo_remote_get_gpg_verify (repo, priv->name, &res, NULL)) return res; } return FALSE; }
/** * flatpak_remote_get_url: * @self: a #FlatpakRemote * * Returns the repository URL of this remote. * * Returns: (transfer full): the URL */ char * flatpak_remote_get_url (FlatpakRemote *self) { FlatpakRemotePrivate *priv = flatpak_remote_get_instance_private (self); char *url; if (priv->local_url_set) return g_strdup (priv->local_url); if (priv->dir) { OstreeRepo *repo = flatpak_dir_get_repo (priv->dir); if (ostree_repo_remote_get_url (repo, priv->name, &url, NULL)) return url; } return NULL; }
gboolean flatpak_remote_commit (FlatpakRemote *self, FlatpakDir *dir, GCancellable *cancellable, GError **error) { FlatpakRemotePrivate *priv = flatpak_remote_get_instance_private (self); g_autofree char *url = NULL; g_autoptr(GKeyFile) config = NULL; g_autofree char *group = g_strdup_printf ("remote \"%s\"", priv->name); url = flatpak_remote_get_url (self); if (url == NULL || *url == 0) return flatpak_fail (error, "No url specified"); config = ostree_repo_copy_config (flatpak_dir_get_repo (dir)); if (priv->local_url_set) g_key_file_set_string (config, group, "url", priv->local_url); if (priv->local_title_set) g_key_file_set_string (config, group, "xa.title", priv->local_title); if (priv->local_gpg_verify_set) { g_key_file_set_boolean (config, group, "gpg-verify", priv->local_gpg_verify); g_key_file_set_boolean (config, group, "gpg-verify-summary", priv->local_gpg_verify); } if (priv->local_noenumerate_set) g_key_file_set_boolean (config, group, "xa.noenumerate", priv->local_noenumerate); if (priv->local_disabled_set) g_key_file_set_boolean (config, group, "xa.disable", priv->local_disabled); if (priv->local_prio_set) { g_autofree char *prio_as_string = g_strdup_printf ("%d", priv->local_prio); g_key_file_set_string (config, group, "xa.prio", prio_as_string); } return flatpak_dir_modify_remote (dir, priv->name, config, priv->local_gpg_key, cancellable, error); }
static gboolean handle_deploy (FlatpakSystemHelper *object, GDBusMethodInvocation *invocation, const gchar *arg_repo_path, guint32 arg_flags, const gchar *arg_ref, const gchar *arg_origin, const gchar *const *arg_subpaths) { g_autoptr(FlatpakDir) system = dir_get_system (); g_autoptr(GFile) path = g_file_new_for_path (arg_repo_path); g_autoptr(GError) error = NULL; g_autoptr(GFile) deploy_dir = NULL; gboolean is_update; gboolean no_deploy; gboolean local_pull; g_autoptr(GMainContext) main_context = NULL; g_autofree char *url = NULL; g_debug ("Deploy %s %u %s %s", arg_repo_path, arg_flags, arg_ref, arg_origin); if ((arg_flags & ~FLATPAK_HELPER_DEPLOY_FLAGS_ALL) != 0) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Unsupported flags enabled: 0x%x", (arg_flags & ~FLATPAK_HELPER_DEPLOY_FLAGS_ALL)); return TRUE; } if (!g_file_query_exists (path, NULL)) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Path does not exist"); return TRUE; } is_update = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE) != 0; no_deploy = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_NO_DEPLOY) != 0; local_pull = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_LOCAL_PULL) != 0; deploy_dir = flatpak_dir_get_if_deployed (system, arg_ref, NULL, NULL); if (deploy_dir) { g_autofree char *real_origin = NULL; if (!is_update) { /* Can't install already installed app */ g_dbus_method_invocation_return_error (invocation, FLATPAK_ERROR, FLATPAK_ERROR_ALREADY_INSTALLED, "%s is already installed", arg_ref); return TRUE; } real_origin = flatpak_dir_get_origin (system, arg_ref, NULL, NULL); if (g_strcmp0 (real_origin, arg_origin) != 0) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Wrong origin %s for update", arg_origin); return TRUE; } } else if (!deploy_dir && is_update) { /* Can't update not installed app */ g_dbus_method_invocation_return_error (invocation, FLATPAK_ERROR, FLATPAK_ERROR_ALREADY_INSTALLED, "%s is not installed", arg_ref); return TRUE; } if (!flatpak_dir_ensure_repo (system, NULL, &error)) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Can't open system repo %s", error->message); return TRUE; } if (strlen (arg_repo_path) > 0) { /* Work around ostree-pull spinning the default main context for the sync calls */ main_context = g_main_context_new (); g_main_context_push_thread_default (main_context); if (!flatpak_dir_pull_untrusted_local (system, arg_repo_path, arg_origin, arg_ref, (const char **) arg_subpaths, NULL, NULL, &error)) { g_main_context_pop_thread_default (main_context); g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Error pulling from repo: %s", error->message); return TRUE; } g_main_context_pop_thread_default (main_context); } else if (local_pull) { if (!ostree_repo_remote_get_url (flatpak_dir_get_repo (system), arg_origin, &url, &error)) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Error getting remote url: %s", error->message); return TRUE; } if (!g_str_has_prefix (url, "file:")) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Local pull url doesn't start with file://"); return TRUE; } /* Work around ostree-pull spinning the default main context for the sync calls */ main_context = g_main_context_new (); g_main_context_push_thread_default (main_context); if (!flatpak_dir_pull (system, arg_origin, arg_ref, (const char **)arg_subpaths, NULL, OSTREE_REPO_PULL_FLAGS_UNTRUSTED, FALSE, NULL, NULL, &error)) { g_main_context_pop_thread_default (main_context); g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Error pulling from repo: %s", error->message); return TRUE; } g_main_context_pop_thread_default (main_context); } if (!no_deploy) { if (is_update) { if (!flatpak_dir_deploy_update (system, arg_ref, NULL, (const char **)arg_subpaths, NULL, &error)) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Error deploying: %s", error->message); return TRUE; } } else { if (!flatpak_dir_deploy_install (system, arg_ref, arg_origin, (const char **) arg_subpaths, NULL, &error)) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "Error deploying: %s", error->message); return TRUE; } } } flatpak_system_helper_complete_deploy (object, invocation); return TRUE; }
static GKeyFile * get_config_from_opts (FlatpakDir *dir, const char *remote_name, gboolean *changed) { OstreeRepo *repo; GKeyFile *config; g_autofree char *group = g_strdup_printf ("remote \"%s\"", remote_name); repo = flatpak_dir_get_repo (dir); if (repo == NULL) config = g_key_file_new (); else config = ostree_repo_copy_config (repo); if (opt_no_gpg_verify) { g_key_file_set_boolean (config, group, "gpg-verify", FALSE); g_key_file_set_boolean (config, group, "gpg-verify-summary", FALSE); *changed = TRUE; } if (opt_do_gpg_verify) { g_key_file_set_boolean (config, group, "gpg-verify", TRUE); g_key_file_set_boolean (config, group, "gpg-verify-summary", TRUE); *changed = TRUE; } if (opt_url) { if (g_str_has_prefix (opt_url, "metalink=")) g_key_file_set_string (config, group, "metalink", opt_url + strlen ("metalink=")); else g_key_file_set_string (config, group, "url", opt_url); *changed = TRUE; } if (opt_collection_id) { g_key_file_set_string (config, group, "collection-id", opt_collection_id); g_key_file_set_boolean (config, group, "gpg-verify-summary", FALSE); *changed = TRUE; } if (opt_title) { g_key_file_set_string (config, group, "xa.title", opt_title); g_key_file_set_boolean (config, group, "xa.title-is-set", TRUE); *changed = TRUE; } if (opt_comment) { g_key_file_set_string (config, group, "xa.comment", opt_comment); g_key_file_set_boolean (config, group, "xa.comment-is-set", TRUE); *changed = TRUE; } if (opt_description) { g_key_file_set_string (config, group, "xa.description", opt_description); g_key_file_set_boolean (config, group, "xa.description-is-set", TRUE); *changed = TRUE; } if (opt_homepage) { g_key_file_set_string (config, group, "xa.homepage", opt_homepage); g_key_file_set_boolean (config, group, "xa.homepage-is-set", TRUE); *changed = TRUE; } if (opt_icon) { g_key_file_set_string (config, group, "xa.icon", opt_icon); g_key_file_set_boolean (config, group, "xa.icon-is-set", TRUE); *changed = TRUE; } if (opt_default_branch) { g_key_file_set_string (config, group, "xa.default-branch", opt_default_branch); g_key_file_set_boolean (config, group, "xa.default-branch-is-set", TRUE); *changed = TRUE; } if (opt_no_enumerate) { g_key_file_set_boolean (config, group, "xa.noenumerate", TRUE); *changed = TRUE; } if (opt_do_enumerate) { g_key_file_set_boolean (config, group, "xa.noenumerate", FALSE); *changed = TRUE; } if (opt_no_deps) { g_key_file_set_boolean (config, group, "xa.nodeps", TRUE); *changed = TRUE; } if (opt_do_deps) { g_key_file_set_boolean (config, group, "xa.nodeps", FALSE); *changed = TRUE; } if (opt_disable) { g_key_file_set_boolean (config, group, "xa.disable", TRUE); *changed = TRUE; } if (opt_prio != -1) { g_autofree char *prio_as_string = g_strdup_printf ("%d", opt_prio); g_key_file_set_string (config, group, "xa.prio", prio_as_string); *changed = TRUE; } if (comment) { g_key_file_set_string (config, group, "xa.comment", comment); g_key_file_set_boolean (config, group, "xa.comment-is-set", TRUE); *changed = TRUE; } if (description) { g_key_file_set_string (config, group, "xa.description", description); g_key_file_set_boolean (config, group, "xa.description-is-set", TRUE); *changed = TRUE; } if (icon) { g_key_file_set_string (config, group, "xa.icon", icon); g_key_file_set_boolean (config, group, "xa.icon-is-set", TRUE); *changed = TRUE; } if (homepage) { g_key_file_set_string (config, group, "xa.homepage", homepage); g_key_file_set_boolean (config, group, "xa.homepage-is-set", TRUE); *changed = TRUE; } return config; }