Merge branch 'giuseppe/staticdeltas' of https://github.com/giuseppe/ostree

This commit is contained in:
Colin Walters committed 2014-12-19 16:31:31 -05:00
commit 1bcc7a8e3a
14 files changed
+1937 -473

No files matched your search

+152 -59
View File
@@ -2818,9 +2818,8 @@ ostree_repo_append_gpg_signature (OstreeRepo *self,
{
gboolean ret = FALSE;
gs_unref_variant GVariant *metadata = NULL;
gs_unref_variant GVariant *new_metadata = NULL;
gs_unref_variant_builder GVariantBuilder *builder = NULL;
gs_unref_variant_builder GVariantBuilder *signature_builder = NULL;
gs_unref_variant GVariant *signaturedata = NULL;
if (!ostree_repo_read_commit_detached_metadata (self,
commit_checksum,
@@ -2833,27 +2832,11 @@ ostree_repo_append_gpg_signature (OstreeRepo *self,
goto out;
}
if (metadata)
{
builder = ot_util_variant_builder_from_variant (metadata, G_VARIANT_TYPE ("a{sv}"));
signaturedata = g_variant_lookup_value (metadata, "ostree.gpgsigs", G_VARIANT_TYPE ("aay"));
if (signaturedata)
signature_builder = ot_util_variant_builder_from_variant (signaturedata, G_VARIANT_TYPE ("aay"));
}
if (!builder)
builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
if (!signature_builder)
signature_builder = g_variant_builder_new (G_VARIANT_TYPE ("aay"));
g_variant_builder_add (signature_builder, "@ay", ot_gvariant_new_ay_bytes (signature_bytes));
g_variant_builder_add (builder, "{sv}", "ostree.gpgsigs", g_variant_builder_end (signature_builder));
metadata = g_variant_builder_end (builder);
new_metadata = _ostree_detached_metadata_append_gpg_sig (metadata, signature_bytes);
if (!ostree_repo_write_commit_detached_metadata (self,
commit_checksum,
metadata,
new_metadata,
cancellable,
error))
{
@@ -2867,34 +2850,21 @@ ostree_repo_append_gpg_signature (OstreeRepo *self,
return ret;
}
/**
* ostree_repo_sign_commit:
* @self: Self
* @commit_checksum: SHA256 of given commit to sign
* @key_id: Use this GPG key id
* @homedir: (allow-none): GPG home directory, or %NULL
* @cancellable: A #GCancellable
* @error: a #GError
*
* Add a GPG signature to a commit.
*/
gboolean
ostree_repo_sign_commit (OstreeRepo *self,
const gchar *commit_checksum,
const gchar *key_id,
const gchar *homedir,
GCancellable *cancellable,
GError **error)
static gboolean
sign_data (OstreeRepo *self,
GBytes *input_data,
const gchar *key_id,
const gchar *homedir,
GBytes **out_signature,
GCancellable *cancellable,
GError **error)
{
#ifdef HAVE_GPGME
gboolean ret = FALSE;
gs_unref_object GFile *commit_path = NULL;
gs_free gchar *commit_filename = NULL;
gs_unref_object GFile *tmp_signature_file = NULL;
gs_unref_object GOutputStream *tmp_signature_output = NULL;
gs_unref_variant GVariant *commit_variant = NULL;
gs_unref_bytes GBytes *signature_bytes = NULL;
gpgme_ctx_t context = NULL;
gs_unref_bytes GBytes *ret_signature = NULL;
gpgme_engine_info_t info;
gpgme_error_t err;
gpgme_key_t key = NULL;
@@ -2903,10 +2873,6 @@ ostree_repo_sign_commit (OstreeRepo *self,
int signature_fd = -1;
GMappedFile *signature_file = NULL;
if (!ostree_repo_load_variant (self, OSTREE_OBJECT_TYPE_COMMIT,
commit_checksum, &commit_variant, error))
goto out;
if (!gs_file_open_in_tmpdir (self->tmp_dir, 0644,
&tmp_signature_file, &tmp_signature_output,
cancellable, error))
@@ -2961,13 +2927,16 @@ ostree_repo_sign_commit (OstreeRepo *self,
goto out;
}
if ((err = gpgme_data_new_from_mem (&commit_buffer, g_variant_get_data (commit_variant),
g_variant_get_size (commit_variant), FALSE)) != GPG_ERR_NO_ERROR)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Failed to create buffer from commit file");
goto out;
}
{
gsize len;
const char *buf = g_bytes_get_data (input_data, &len);
if ((err = gpgme_data_new_from_mem (&commit_buffer, buf, len, FALSE)) != GPG_ERR_NO_ERROR)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Failed to create buffer from commit file");
goto out;
}
}
signature_fd = g_file_descriptor_based_get_fd ((GFileDescriptorBased*)tmp_signature_output);
if (signature_fd < 0)
@@ -2998,13 +2967,10 @@ ostree_repo_sign_commit (OstreeRepo *self,
signature_file = gs_file_map_noatime (tmp_signature_file, cancellable, error);
if (!signature_file)
goto out;
signature_bytes = g_mapped_file_get_bytes (signature_file);
ret_signature = g_mapped_file_get_bytes (signature_file);
if (!ostree_repo_append_gpg_signature (self, commit_checksum, signature_bytes,
cancellable, error))
goto out;
ret = TRUE;
gs_transfer_out_value (out_signature, &ret_signature);
out:
if (commit_buffer)
gpgme_data_release (commit_buffer);
@@ -3024,7 +2990,134 @@ out:
#endif
}
static gboolean
/**
* ostree_repo_sign_commit:
* @self: Self
* @commit_checksum: SHA256 of given commit to sign
* @key_id: Use this GPG key id
* @homedir: (allow-none): GPG home directory, or %NULL
* @cancellable: A #GCancellable
* @error: a #GError
*
* Add a GPG signature to a commit.
*/
gboolean
ostree_repo_sign_commit (OstreeRepo *self,
const gchar *commit_checksum,
const gchar *key_id,
const gchar *homedir,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
gs_unref_bytes GBytes *commit_data = NULL;
gs_unref_bytes GBytes *signature_data = NULL;
gs_unref_variant GVariant *commit_variant = NULL;
if (!ostree_repo_load_variant (self, OSTREE_OBJECT_TYPE_COMMIT,
commit_checksum, &commit_variant, error))
goto out;
/* This has the same lifecycle as the variant, so we can just
* use static.
*/
signature_data = g_bytes_new_static (g_variant_get_data (commit_variant),
g_variant_get_size (commit_variant));
if (!sign_data (self, signature_data, key_id, homedir,
&signature_data,
cancellable, error))
goto out;
if (!ostree_repo_append_gpg_signature (self, commit_checksum, signature_data,
cancellable, error))
goto out;
ret = TRUE;
out:
return ret;
}
/**
* ostree_repo_sign_delta:
* @self: Self
* @from_commit: SHA256 of starting commit to sign
* @to_commit: SHA256 of target commit to sign
* @key_id: Use this GPG key id
* @homedir: (allow-none): GPG home directory, or %NULL
* @cancellable: A #GCancellable
* @error: a #GError
*
* Add a GPG signature to a static delta.
*/
gboolean
ostree_repo_sign_delta (OstreeRepo *self,
const gchar *from_commit,
const gchar *to_commit,
const gchar *key_id,
const gchar *homedir,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
gs_unref_bytes GBytes *delta_data = NULL;
gs_unref_bytes GBytes *signature_data = NULL;
gs_unref_variant GVariant *commit_variant = NULL;
gs_free char *delta_path = NULL;
gs_unref_object GFile *delta_file = NULL;
gs_unref_object char *detached_metadata_relpath = NULL;
gs_unref_object GFile *detached_metadata_path = NULL;
gs_unref_variant GVariant *existing_detached_metadata = NULL;
gs_unref_variant GVariant *normalized = NULL;
gs_unref_variant GVariant *new_metadata = NULL;
GError *temp_error = NULL;
detached_metadata_relpath =
_ostree_get_relative_static_delta_detachedmeta_path (from_commit, to_commit);
detached_metadata_path = g_file_resolve_relative_path (self->repodir, detached_metadata_relpath);
delta_path = _ostree_get_relative_static_delta_path (from_commit, to_commit);
delta_file = g_file_resolve_relative_path (self->repodir, delta_path);
delta_data = gs_file_map_readonly (delta_file, cancellable, error);
if (!delta_data)
goto out;
if (!ot_util_variant_map (detached_metadata_path, G_VARIANT_TYPE ("a{sv}"),
TRUE, &existing_detached_metadata, &temp_error))
{
if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
{
g_clear_error (&temp_error);
}
else
{
g_propagate_error (error, temp_error);
goto out;
}
}
if (!sign_data (self, delta_data, key_id, homedir,
&signature_data,
cancellable, error))
goto out;
new_metadata = _ostree_detached_metadata_append_gpg_sig (existing_detached_metadata, signature_data);
normalized = g_variant_get_normal_form (new_metadata);
if (!g_file_replace_contents (detached_metadata_path,
g_variant_get_data (normalized),
g_variant_get_size (normalized),
NULL, FALSE, 0, NULL,
cancellable, error))
goto out;
ret = TRUE;
out:
return ret;
}
gboolean
_ostree_repo_gpg_verify_file_with_metadata (OstreeRepo *self,
GFile *path,
GVariant *metadata,