summaryrefslogtreecommitdiff
path: root/libappstream-glib/as-store-cab.c
diff options
context:
space:
mode:
Diffstat (limited to 'libappstream-glib/as-store-cab.c')
-rw-r--r--libappstream-glib/as-store-cab.c389
1 files changed, 13 insertions, 376 deletions
diff --git a/libappstream-glib/as-store-cab.c b/libappstream-glib/as-store-cab.c
index 9fcc317..d6e4da4 100644
--- a/libappstream-glib/as-store-cab.c
+++ b/libappstream-glib/as-store-cab.c
@@ -21,328 +21,11 @@
#include "config.h"
-#include <libgcab.h>
-#include <glib/gstdio.h>
-#include <gio/gunixinputstream.h>
+//#include <glib/gstdio.h>
+//#include <gio/gunixinputstream.h>
#include "as-store-cab.h"
-#include "as-utils.h"
-
-#ifndef HAVE_GCAB_1_0
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(GCabCabinet, g_object_unref)
-#endif
-
-static gboolean
-as_store_cab_cb (GCabFile *file, gpointer user_data)
-{
- GPtrArray *filelist = (GPtrArray *) user_data;
- const gchar *fn;
- gchar *tmp;
-
- /* strip Windows or Linux paths */
- fn = gcab_file_get_name (file);
- tmp = g_strrstr (fn, "\\");
- if (tmp == NULL)
- tmp = g_strrstr (fn, "/");
- if (tmp != NULL) {
- g_debug ("removed path prefix for %s", fn);
- fn = tmp + 1;
- }
- gcab_file_set_extract_name (file, fn);
-
- g_ptr_array_add (filelist, g_strdup (fn));
- return TRUE;
-}
-
-static gboolean
-as_store_cab_verify_checksum_cab (AsRelease *release,
- GBytes *bytes,
- GError **error)
-{
- AsChecksum *csum_tmp;
- g_autofree gchar *actual = NULL;
-
- /* nothing already set, so just add */
- actual = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, bytes);
- csum_tmp = as_release_get_checksum_by_target (release, AS_CHECKSUM_TARGET_CONTAINER);
- if (as_checksum_get_value (csum_tmp) == NULL) {
- as_checksum_set_kind (csum_tmp, G_CHECKSUM_SHA1);
- as_checksum_set_value (csum_tmp, actual);
- return TRUE;
- }
-
- /* check it matches */
- if (g_strcmp0 (actual, as_checksum_get_value (csum_tmp)) != 0) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "container checksum invalid, expected %s, got %s",
- as_checksum_get_value (csum_tmp), actual);
- return FALSE;
- }
-
- /* success */
- return TRUE;
-}
-
-static gboolean
-as_store_cab_verify_checksum_fw (AsChecksum *checksum,
- const gchar *tmp_path,
- GError **error)
-{
- g_autofree gchar *rel_basename = NULL;
- g_autofree gchar *rel_fn = NULL;
- g_autofree gchar *actual = NULL;
-
- /* get the firmware filename */
- rel_basename = g_path_get_basename (as_checksum_get_filename (checksum));
- rel_fn = g_build_filename (tmp_path, rel_basename, NULL);
-
- /* calculate checksum */
- if (g_file_test (rel_fn, G_FILE_TEST_EXISTS)) {
- gsize len;
- g_autofree gchar *data = NULL;
- if (!g_file_get_contents (rel_fn, &data, &len, error))
- return FALSE;
- actual = g_compute_checksum_for_data (G_CHECKSUM_SHA1, (guchar *)data, len);
- }
-
- /* nothing already set, so just add */
- if (as_checksum_get_value (checksum) == NULL) {
- as_checksum_set_kind (checksum, G_CHECKSUM_SHA1);
- as_checksum_set_value (checksum, actual);
- return TRUE;
- }
-
- /* check it matches */
- if (g_strcmp0 (actual, as_checksum_get_value (checksum)) != 0) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "contents checksum invalid, expected %s, got %s",
- as_checksum_get_value (checksum), actual);
- return FALSE;
- }
-
- /* success */
- return TRUE;
-}
-
-static gboolean
-as_store_cab_set_release_blobs (AsRelease *release, const gchar *tmp_path, GError **error)
-{
- AsChecksum *csum_tmp;
- g_autofree gchar *asc_basename = NULL;
- g_autofree gchar *asc_fn = NULL;
- g_autofree gchar *rel_basename = NULL;
- g_autofree gchar *rel_fn = NULL;
- g_autoptr(GError) error_local = NULL;
-
- /* get the firmware filename */
- csum_tmp = as_release_get_checksum_by_target (release, AS_CHECKSUM_TARGET_CONTENT);
- g_assert (csum_tmp != NULL);
- rel_basename = g_path_get_basename (as_checksum_get_filename (csum_tmp));
- rel_fn = g_build_filename (tmp_path, rel_basename, NULL);
-
- /* add this information to the release objects */
- if (g_file_test (rel_fn, G_FILE_TEST_EXISTS)) {
- gchar *data = NULL;
- gsize data_len = 0;
- g_autoptr(GBytes) blob = NULL;
-
- if (!g_file_get_contents (rel_fn, &data, &data_len, &error_local)) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "failed to open %s: %s",
- rel_fn, error_local->message);
- return FALSE;
- }
-
- /* this is the size of the firmware */
- if (as_release_get_size (release, AS_SIZE_KIND_INSTALLED) == 0) {
- as_release_set_size (release,
- AS_SIZE_KIND_INSTALLED,
- data_len);
- }
-
- /* set the data on the release object */
- blob = g_bytes_new_take (data, data_len);
- as_release_set_blob (release, rel_basename, blob);
- }
-
- /* if the signing file exists, set that too */
- asc_basename = g_strdup_printf ("%s.asc", rel_basename);
- asc_fn = g_build_filename (tmp_path, asc_basename, NULL);
- if (g_file_test (asc_fn, G_FILE_TEST_EXISTS)) {
- gchar *data = NULL;
- gsize data_len = 0;
- g_autoptr(GBytes) blob = NULL;
-
- if (!g_file_get_contents (asc_fn, &data, &data_len, &error_local)) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "failed to open %s: %s",
- asc_fn, error_local->message);
- return FALSE;
- }
-
- /* set the data on the release object */
- blob = g_bytes_new_take (data, data_len);
- as_release_set_blob (release, asc_basename, blob);
- }
- return TRUE;
-}
-
-static gboolean
-as_store_cab_from_bytes_with_origin (AsStore *store,
- GBytes *bytes,
- const gchar *basename,
- GCancellable *cancellable,
- GError **error)
-{
- g_autoptr(GCabCabinet) gcab = NULL;
- g_autoptr(GError) error_local = NULL;
- g_autofree gchar *tmp_path = NULL;
- g_autoptr(GFile) tmp_file = NULL;
- g_autoptr(GInputStream) input_stream = NULL;
- g_autoptr(GPtrArray) filelist = NULL;
- guint i;
-
- /* open the file */
- gcab = gcab_cabinet_new ();
- input_stream = g_memory_input_stream_new_from_bytes (bytes);
- if (!gcab_cabinet_load (gcab, input_stream, NULL, &error_local)) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "cannot load .cab file: %s",
- error_local->message);
- return FALSE;
- }
-
- /* decompress to /tmp */
- tmp_path = g_dir_make_tmp ("appstream-glib-XXXXXX", &error_local);
- if (tmp_path == NULL) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "failed to create temp dir: %s",
- error_local->message);
- return FALSE;
- }
-
- /* extract the entire cab file */
- filelist = g_ptr_array_new_with_free_func (g_free);
- tmp_file = g_file_new_for_path (tmp_path);
- if (!gcab_cabinet_extract_simple (gcab, tmp_file,
- as_store_cab_cb,
- filelist, NULL, &error_local)) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "failed to extract .cab file: %s",
- error_local->message);
- return FALSE;
- }
-
- /* loop through each file looking for components */
- for (i = 0; i < filelist->len; i++) {
- AsRelease *rel;
- AsChecksum *csum_tmp;
- const gchar *fn;
- g_autofree gchar *tmp_fn = NULL;
- g_autoptr(AsApp) app = NULL;
-
- /* debug */
- fn = g_ptr_array_index (filelist, i);
- g_debug ("found file %u\t%s", i, fn);
-
- /* if inf or metainfo, add */
- if (as_format_guess_kind (fn) != AS_FORMAT_KIND_METAINFO)
- continue;
-
- tmp_fn = g_build_filename (tmp_path, fn, NULL);
- app = as_app_new ();
- if (!as_app_parse_file (app, tmp_fn,
- AS_APP_PARSE_FLAG_NONE, &error_local)) {
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "%s could not be loaded: %s",
- tmp_fn,
- error_local->message);
- return FALSE;
- }
-
- /* only process the latest release */
- rel = as_app_get_release_default (app);
- if (rel == NULL) {
- g_set_error_literal (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "no releases in metainfo file");
- return FALSE;
- }
-
- /* ensure we always have a container checksum */
- csum_tmp = as_release_get_checksum_by_target (rel, AS_CHECKSUM_TARGET_CONTAINER);
- if (csum_tmp == NULL) {
- g_autoptr(AsChecksum) csum = NULL;
- csum = as_checksum_new ();
- as_checksum_set_target (csum, AS_CHECKSUM_TARGET_CONTAINER);
- if (basename != NULL)
- as_checksum_set_filename (csum, basename);
- as_release_add_checksum (rel, csum);
- }
-
- /* set the container checksum */
- if (!as_store_cab_verify_checksum_cab (rel, bytes, error))
- return FALSE;
-
- /* this is the size of the cab file itself */
- if (as_release_get_size (rel, AS_SIZE_KIND_DOWNLOAD) == 0)
- as_release_set_size (rel, AS_SIZE_KIND_DOWNLOAD,
- g_bytes_get_size (bytes));
-
- /* ensure we always have a content checksum */
- csum_tmp = as_release_get_checksum_by_target (rel, AS_CHECKSUM_TARGET_CONTENT);
- if (csum_tmp == NULL) {
- g_autoptr(AsChecksum) csum = NULL;
- csum = as_checksum_new ();
- as_checksum_set_target (csum, AS_CHECKSUM_TARGET_CONTENT);
- /* if this isn't true, a firmware needs to set in
- * the metainfo.xml file something like:
- * <checksum target="content" filename="FLASH.ROM"/> */
- as_checksum_set_filename (csum, "firmware.bin");
- as_release_add_checksum (rel, csum);
- csum_tmp = csum;
- }
- if (!as_store_cab_verify_checksum_fw (csum_tmp, tmp_path, error))
- return FALSE;
-
- /* set blobs */
- if (!as_store_cab_set_release_blobs (rel, tmp_path, error))
- return FALSE;
-
- /* add any component to the store */
- as_store_add_app (store, app);
- }
-
- /* delete temp files */
- for (i = 0; i < filelist->len; i++) {
- const gchar *fn;
- g_autofree gchar *tmp_fn = NULL;
- fn = g_ptr_array_index (filelist, i);
- tmp_fn = g_build_filename (tmp_path, fn, NULL);
- g_unlink (tmp_fn);
- }
- g_rmdir (tmp_path);
-
- /* success */
- return TRUE;
-}
+//#include "as-utils.h"
gboolean
as_store_cab_from_bytes (AsStore *store,
@@ -350,8 +33,11 @@ as_store_cab_from_bytes (AsStore *store,
GCancellable *cancellable,
GError **error)
{
- return as_store_cab_from_bytes_with_origin (store, bytes, NULL,
- cancellable, error);
+ g_set_error (error,
+ AS_STORE_ERROR,
+ AS_STORE_ERROR_FAILED,
+ "Loading firmware is no longer suported, see fwupd");
+ return FALSE;
}
gboolean
@@ -360,58 +46,9 @@ as_store_cab_from_file (AsStore *store,
GCancellable *cancellable,
GError **error)
{
- guint64 size;
- g_autoptr(GBytes) bytes = NULL;
- g_autoptr(GError) error_local = NULL;
- g_autoptr(GFileInfo) info = NULL;
- g_autoptr(GInputStream) input_stream = NULL;
- g_autofree gchar *filename = NULL;
- g_autofree gchar *origin = NULL;
-
- /* set origin */
- origin = g_file_get_basename (file);
- as_store_set_origin (store, origin);
-
- /* open file */
- input_stream = G_INPUT_STREAM (g_file_read (file, cancellable, &error_local));
- if (input_stream == NULL) {
- filename = g_file_get_path (file);
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "Failed to open %s: %s",
- filename, error_local->message);
- return FALSE;
- }
-
- /* get size */
- info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE,
- G_FILE_QUERY_INFO_NONE, cancellable, &error_local);
- if (info == NULL) {
- filename = g_file_get_path (file);
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "Failed to get info from %s: %s",
- filename, error_local->message);
- return FALSE;
- }
-
- /* slurp it all */
- size = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_STANDARD_SIZE);
- bytes = g_input_stream_read_bytes (input_stream, (gsize) size,
- cancellable, &error_local);
- if (bytes == NULL) {
- filename = g_file_get_path (file);
- g_set_error (error,
- AS_STORE_ERROR,
- AS_STORE_ERROR_FAILED,
- "Failed to read %s: %s",
- filename, error_local->message);
- return FALSE;
- }
-
- /* parse */
- return as_store_cab_from_bytes_with_origin (store, bytes, origin,
- cancellable, error);
+ g_set_error (error,
+ AS_STORE_ERROR,
+ AS_STORE_ERROR_FAILED,
+ "Loading firmware is no longer suported, see fwupd");
+ return FALSE;
}