static gboolean
commit_checksum_from_extensions_ref (OstreeRepo *repo,
                                     GCancellable *cancellable,
                                     const gchar *remote_name,
                                     const gchar *ref,
                                     const gchar *url_override,
                                     gchar **out_checksum,
                                     EosExtensions **out_extensions,
                                     GError **error)
{
  g_autofree gchar *extensions_url = NULL;
  g_autofree gchar *eos_ref_url = NULL;
  g_autoptr(GBytes) contents = NULL;
  g_autoptr(GBytes) signature = NULL;
  g_autoptr(OstreeGpgVerifyResult) gpg_result = NULL;
  g_autofree gchar *checksum = NULL;
  gconstpointer raw_data;
  gsize raw_len;
  g_autoptr(EosExtensions) extensions = NULL;
  g_autoptr(EosRef) ext_ref = NULL;
  g_autoptr(GKeyFile) ref_keyfile = NULL;
  g_autofree gchar *actual_ref = NULL;

  if (!get_extensions_url (repo, remote_name, url_override, &extensions_url, error))
    return FALSE;

  eos_ref_url = g_build_path ("/", extensions_url, "refs.d", ref, NULL);
  if (!must_download_file_and_signature (eos_ref_url, &contents, &signature, error))
    return FALSE;

  gpg_result = ostree_repo_gpg_verify_data (repo,
                                            remote_name,
                                            contents,
                                            signature,
                                            NULL,
                                            NULL,
                                            cancellable,
                                            error);
  if (!ostree_gpg_verify_result_require_valid_signature (gpg_result, error))
    return FALSE;

  ref_keyfile = g_key_file_new ();
  raw_data = g_bytes_get_data (contents, &raw_len);
  if (!g_key_file_load_from_data (ref_keyfile,
                                  raw_data,
                                  raw_len,
                                  G_KEY_FILE_NONE,
                                  error))
    return FALSE;

  actual_ref = g_key_file_get_string (ref_keyfile,
                                      "mapping",
                                      "ref",
                                      error);
  if (actual_ref == NULL)
    return FALSE;

  if (g_strcmp0 (actual_ref, ref) != 0)
    {
      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
                   "The file under %s contains data about ref %s, instead of %s",
                   eos_ref_url, actual_ref, ref);
      return FALSE;
    }

  checksum = g_key_file_get_string (ref_keyfile,
                                    "mapping",
                                    "commit",
                                    error);
  if (checksum == NULL)
    return FALSE;
  g_strstrip (checksum);

  if (!ostree_validate_structureof_checksum_string (checksum, error))
    return FALSE;

  ext_ref = eos_ref_new_empty ();
  ext_ref->contents = g_steal_pointer (&contents);
  ext_ref->signature = g_steal_pointer (&signature);
  ext_ref->name = g_strdup (ref);

  extensions = eos_extensions_new_empty ();
  g_ptr_array_add (extensions->refs, g_steal_pointer (&ext_ref));

  *out_checksum = g_steal_pointer (&checksum);
  *out_extensions = g_steal_pointer (&extensions);
  return TRUE;
}
Example #2
0
gboolean
ostree_validate_checksum_string (const char *sha256,
                                 GError    **error)
{
  return ostree_validate_structureof_checksum_string (sha256, error);
}