lib/sign: enable verification for pulling
Signed-off-by: Denis Pynkin <denis.pynkin@collabora.com>
This commit is contained in:
parent
e133cb7b74
commit
c09df18454
|
|
@ -54,6 +54,8 @@
|
||||||
#include <systemd/sd-journal.h>
|
#include <systemd/sd-journal.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "ostree-sign.h"
|
||||||
|
|
||||||
#define OSTREE_MESSAGE_FETCH_COMPLETE_ID SD_ID128_MAKE(75,ba,3d,eb,0a,f0,41,a9,a4,62,72,ff,85,d9,e7,3e)
|
#define OSTREE_MESSAGE_FETCH_COMPLETE_ID SD_ID128_MAKE(75,ba,3d,eb,0a,f0,41,a9,a4,62,72,ff,85,d9,e7,3e)
|
||||||
|
|
||||||
#define OSTREE_REPO_PULL_CONTENT_PRIORITY (OSTREE_FETCHER_DEFAULT_PRIORITY)
|
#define OSTREE_REPO_PULL_CONTENT_PRIORITY (OSTREE_FETCHER_DEFAULT_PRIORITY)
|
||||||
|
|
@ -105,6 +107,7 @@ typedef struct {
|
||||||
|
|
||||||
gboolean gpg_verify;
|
gboolean gpg_verify;
|
||||||
gboolean gpg_verify_summary;
|
gboolean gpg_verify_summary;
|
||||||
|
gboolean sign_verify;
|
||||||
gboolean require_static_deltas;
|
gboolean require_static_deltas;
|
||||||
gboolean disable_static_deltas;
|
gboolean disable_static_deltas;
|
||||||
gboolean has_tombstone_commits;
|
gboolean has_tombstone_commits;
|
||||||
|
|
@ -1500,6 +1503,38 @@ ostree_verify_unwritten_commit (OtPullData *pull_data,
|
||||||
}
|
}
|
||||||
#endif /* OSTREE_DISABLE_GPGME */
|
#endif /* OSTREE_DISABLE_GPGME */
|
||||||
|
|
||||||
|
if (pull_data->sign_verify)
|
||||||
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
g_autoptr(GBytes) signed_data = g_variant_get_data_as_bytes (commit);
|
||||||
|
/* list all signature types in detached metadata and check if signed by any? */
|
||||||
|
GStrv names = ostree_sign_list_names();
|
||||||
|
for (guint i=0; i < g_strv_length (names); i++)
|
||||||
|
{
|
||||||
|
g_autoptr (OstreeSign) sign = ostree_sign_get_by_name (names[i], error);
|
||||||
|
g_autoptr(GVariant) signatures = NULL;
|
||||||
|
g_autofree gchar *signature_key = ostree_sign_metadata_key (sign);
|
||||||
|
g_autofree GVariantType *signature_format = (GVariantType *) ostree_sign_metadata_format (sign);
|
||||||
|
|
||||||
|
signatures = g_variant_lookup_value (detached_metadata,
|
||||||
|
signature_key,
|
||||||
|
signature_format);
|
||||||
|
|
||||||
|
/* Set return to true if any sign fit */
|
||||||
|
if (!signatures)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (ostree_sign_metadata_verify (sign,
|
||||||
|
signed_data,
|
||||||
|
signatures,
|
||||||
|
error
|
||||||
|
))
|
||||||
|
ret = TRUE;
|
||||||
|
}
|
||||||
|
g_strfreev(names);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1829,6 +1864,28 @@ scan_commit_object (OtPullData *pull_data,
|
||||||
}
|
}
|
||||||
#endif /* OSTREE_DISABLE_GPGME */
|
#endif /* OSTREE_DISABLE_GPGME */
|
||||||
|
|
||||||
|
if (pull_data->sign_verify &&
|
||||||
|
!g_hash_table_contains (pull_data->verified_commits, checksum))
|
||||||
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
|
/* list all signature types in detached metadata and check if signed by any? */
|
||||||
|
GStrv names = ostree_sign_list_names();
|
||||||
|
for (guint i=0; i < g_strv_length (names); i++)
|
||||||
|
{
|
||||||
|
g_autoptr (OstreeSign) sign = ostree_sign_get_by_name (names[i], error);
|
||||||
|
|
||||||
|
if (ostree_sign_commit_verify (sign,
|
||||||
|
pull_data->repo,
|
||||||
|
checksum,
|
||||||
|
cancellable,
|
||||||
|
error))
|
||||||
|
ret = TRUE;
|
||||||
|
}
|
||||||
|
g_strfreev(names);
|
||||||
|
if (ret == FALSE)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* If we found a legacy transaction flag, assume we have to scan.
|
/* If we found a legacy transaction flag, assume we have to scan.
|
||||||
* We always do a scan of dirtree objects; see
|
* We always do a scan of dirtree objects; see
|
||||||
* https://github.com/ostreedev/ostree/issues/543
|
* https://github.com/ostreedev/ostree/issues/543
|
||||||
|
|
@ -3576,6 +3633,7 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
g_autoptr(GSource) update_timeout = NULL;
|
g_autoptr(GSource) update_timeout = NULL;
|
||||||
gboolean opt_gpg_verify_set = FALSE;
|
gboolean opt_gpg_verify_set = FALSE;
|
||||||
gboolean opt_gpg_verify_summary_set = FALSE;
|
gboolean opt_gpg_verify_summary_set = FALSE;
|
||||||
|
gboolean opt_sign_verify_set = FALSE;
|
||||||
gboolean opt_collection_refs_set = FALSE;
|
gboolean opt_collection_refs_set = FALSE;
|
||||||
gboolean opt_n_network_retries_set = FALSE;
|
gboolean opt_n_network_retries_set = FALSE;
|
||||||
gboolean opt_ref_keyring_map_set = FALSE;
|
gboolean opt_ref_keyring_map_set = FALSE;
|
||||||
|
|
@ -3610,6 +3668,8 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
g_variant_lookup (options, "gpg-verify", "b", &pull_data->gpg_verify);
|
g_variant_lookup (options, "gpg-verify", "b", &pull_data->gpg_verify);
|
||||||
opt_gpg_verify_summary_set =
|
opt_gpg_verify_summary_set =
|
||||||
g_variant_lookup (options, "gpg-verify-summary", "b", &pull_data->gpg_verify_summary);
|
g_variant_lookup (options, "gpg-verify-summary", "b", &pull_data->gpg_verify_summary);
|
||||||
|
opt_sign_verify_set =
|
||||||
|
g_variant_lookup (options, "sign-verify", "b", &pull_data->sign_verify);
|
||||||
(void) g_variant_lookup (options, "depth", "i", &pull_data->maxdepth);
|
(void) g_variant_lookup (options, "depth", "i", &pull_data->maxdepth);
|
||||||
(void) g_variant_lookup (options, "disable-static-deltas", "b", &pull_data->disable_static_deltas);
|
(void) g_variant_lookup (options, "disable-static-deltas", "b", &pull_data->disable_static_deltas);
|
||||||
(void) g_variant_lookup (options, "require-static-deltas", "b", &pull_data->require_static_deltas);
|
(void) g_variant_lookup (options, "require-static-deltas", "b", &pull_data->require_static_deltas);
|
||||||
|
|
@ -3759,7 +3819,10 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
/* For compatibility with pull-local, don't gpg verify local
|
/* For compatibility with pull-local, don't gpg verify local
|
||||||
* pulls by default.
|
* pulls by default.
|
||||||
*/
|
*/
|
||||||
if ((pull_data->gpg_verify || pull_data->gpg_verify_summary) &&
|
if ((pull_data->gpg_verify ||
|
||||||
|
pull_data->gpg_verify_summary ||
|
||||||
|
pull_data->sign_verify
|
||||||
|
) &&
|
||||||
pull_data->remote_name == NULL)
|
pull_data->remote_name == NULL)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
|
@ -3788,6 +3851,10 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
goto out;
|
goto out;
|
||||||
#endif /* OSTREE_DISABLE_GPGME */
|
#endif /* OSTREE_DISABLE_GPGME */
|
||||||
|
|
||||||
|
/* TODO: read option for remote. */
|
||||||
|
if (!opt_sign_verify_set)
|
||||||
|
opt_sign_verify_set = TRUE;
|
||||||
|
|
||||||
/* NOTE: If changing this, see the matching implementation in
|
/* NOTE: If changing this, see the matching implementation in
|
||||||
* ostree-sysroot-upgrader.c
|
* ostree-sysroot-upgrader.c
|
||||||
*/
|
*/
|
||||||
|
|
@ -4647,23 +4714,28 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
g_string_append_printf (msg, "libostree pull from '%s' for %u refs complete",
|
g_string_append_printf (msg, "libostree pull from '%s' for %u refs complete",
|
||||||
pull_data->remote_name, g_hash_table_size (requested_refs_to_fetch));
|
pull_data->remote_name, g_hash_table_size (requested_refs_to_fetch));
|
||||||
|
|
||||||
const char *verify_state;
|
const char *gpg_verify_state;
|
||||||
#ifndef OSTREE_DISABLE_GPGME
|
#ifndef OSTREE_DISABLE_GPGME
|
||||||
if (pull_data->gpg_verify_summary)
|
if (pull_data->gpg_verify_summary)
|
||||||
{
|
{
|
||||||
if (pull_data->gpg_verify)
|
if (pull_data->gpg_verify)
|
||||||
verify_state = "summary+commit";
|
gpg_verify_state = "summary+commit";
|
||||||
else
|
else
|
||||||
verify_state = "summary-only";
|
gpg_verify_state = "summary-only";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
verify_state = (pull_data->gpg_verify ? "commit" : "disabled");
|
gpg_verify_state = (pull_data->gpg_verify ? "commit" : "disabled");
|
||||||
g_string_append_printf (msg, "\nsecurity: GPG: %s ", verify_state);
|
|
||||||
|
g_string_append_printf (msg, "\nsecurity: GPG: %s ", gpg_verify_state);
|
||||||
#else
|
#else
|
||||||
verify_state = "disabled";
|
gpg_verify_state = "disabled";
|
||||||
g_string_append_printf (msg, "\nsecurity: %s ", verify_state);
|
g_string_append_printf (msg, "\nsecurity: %s ", gpg_verify_state);
|
||||||
#endif /* OSTREE_DISABLE_GPGME */
|
#endif /* OSTREE_DISABLE_GPGME */
|
||||||
|
|
||||||
|
const char *sign_verify_state;
|
||||||
|
sign_verify_state = (pull_data->sign_verify ? "commit" : "disabled");
|
||||||
|
g_string_append_printf (msg, "\nsecurity: SIGN: %s ", sign_verify_state);
|
||||||
|
|
||||||
OstreeFetcherURI *first_uri = pull_data->meta_mirrorlist->pdata[0];
|
OstreeFetcherURI *first_uri = pull_data->meta_mirrorlist->pdata[0];
|
||||||
g_autofree char *first_scheme = _ostree_fetcher_uri_get_scheme (first_uri);
|
g_autofree char *first_scheme = _ostree_fetcher_uri_get_scheme (first_uri);
|
||||||
if (g_str_has_prefix (first_scheme, "http"))
|
if (g_str_has_prefix (first_scheme, "http"))
|
||||||
|
|
@ -4698,7 +4770,8 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
ot_journal_send ("MESSAGE=%s", msg->str,
|
ot_journal_send ("MESSAGE=%s", msg->str,
|
||||||
"MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(OSTREE_MESSAGE_FETCH_COMPLETE_ID),
|
"MESSAGE_ID=" SD_ID128_FORMAT_STR, SD_ID128_FORMAT_VAL(OSTREE_MESSAGE_FETCH_COMPLETE_ID),
|
||||||
"OSTREE_REMOTE=%s", pull_data->remote_name,
|
"OSTREE_REMOTE=%s", pull_data->remote_name,
|
||||||
"OSTREE_GPG=%s", verify_state,
|
"OSTREE_SIGN=%s", sign_verify_state,
|
||||||
|
"OSTREE_GPG=%s", gpg_verify_state,
|
||||||
"OSTREE_SECONDS=%u", n_seconds,
|
"OSTREE_SECONDS=%u", n_seconds,
|
||||||
"OSTREE_XFER_SIZE=%s", formatted_xferred,
|
"OSTREE_XFER_SIZE=%s", formatted_xferred,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
@ -6023,6 +6096,7 @@ ostree_repo_pull_from_remotes_async (OstreeRepo *self,
|
||||||
g_variant_dict_insert (&local_options_dict, "gpg-verify", "b", FALSE);
|
g_variant_dict_insert (&local_options_dict, "gpg-verify", "b", FALSE);
|
||||||
#endif /* OSTREE_DISABLE_GPGME */
|
#endif /* OSTREE_DISABLE_GPGME */
|
||||||
g_variant_dict_insert (&local_options_dict, "gpg-verify-summary", "b", FALSE);
|
g_variant_dict_insert (&local_options_dict, "gpg-verify-summary", "b", FALSE);
|
||||||
|
g_variant_dict_insert (&local_options_dict, "sign-verify", "b", FALSE);
|
||||||
g_variant_dict_insert (&local_options_dict, "inherit-transaction", "b", TRUE);
|
g_variant_dict_insert (&local_options_dict, "inherit-transaction", "b", TRUE);
|
||||||
if (result->remote->refspec_name != NULL)
|
if (result->remote->refspec_name != NULL)
|
||||||
g_variant_dict_insert (&local_options_dict, "override-remote-name", "s", result->remote->refspec_name);
|
g_variant_dict_insert (&local_options_dict, "override-remote-name", "s", result->remote->refspec_name);
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,6 @@ static void
|
||||||
ostree_sign_dummy_class_init (OstreeSignDummyClass *self)
|
ostree_sign_dummy_class_init (OstreeSignDummyClass *self)
|
||||||
{
|
{
|
||||||
g_debug ("%s enter", __FUNCTION__);
|
g_debug ("%s enter", __FUNCTION__);
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS(self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,6 @@ static void
|
||||||
ostree_sign_ed25519_class_init (OstreeSignEd25519Class *self)
|
ostree_sign_ed25519_class_init (OstreeSignEd25519Class *self)
|
||||||
{
|
{
|
||||||
g_debug ("%s enter", __FUNCTION__);
|
g_debug ("%s enter", __FUNCTION__);
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS(self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue