diff --git a/src/fu-main.c b/src/fu-main.c index da2dfe05d..491347593 100644 --- a/src/fu-main.c +++ b/src/fu-main.c @@ -918,10 +918,16 @@ fu_main_daemon_method_call (GDBusConnection *connection, const gchar *sender, /* return 's' */ if (g_strcmp0 (method_name, "Verify") == 0) { + AsApp *app; +#if AS_CHECK_VERSION(0,5,0) + AsChecksum *csum; +#endif + AsRelease *release; FuDeviceItem *item = NULL; - const gchar *id = NULL; - _cleanup_error_free_ GError *error = NULL; const gchar *hash = NULL; + const gchar *id = NULL; + const gchar *version = NULL; + _cleanup_error_free_ GError *error = NULL; /* check the id exists */ g_variant_get (parameters, "(&s)", &id); @@ -931,18 +937,72 @@ fu_main_daemon_method_call (GDBusConnection *connection, const gchar *sender, g_dbus_method_invocation_return_error (invocation, FWUPD_ERROR, FWUPD_ERROR_NOT_FOUND, - "no such device %s", + "No such device %s", id); return; } + + /* set the device firmware hash */ if (!fu_provider_verify (item->provider, item->device, FU_PROVIDER_VERIFY_FLAG_NONE, &error)) { g_dbus_method_invocation_return_gerror (invocation, error); return; } + + /* find component in metadata */ + app = as_store_get_app_by_id (priv->store, fu_device_get_guid (item->device)); + if (app == NULL) { + g_dbus_method_invocation_return_error (invocation, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "No metadata"); + return; + } + + /* find version in metadata */ + version = fu_device_get_metadata (item->device, FU_DEVICE_KEY_VERSION); + release = as_app_get_release (app, version); + if (release == NULL) { + g_dbus_method_invocation_return_error (invocation, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "No version %s", + version); + return; + } + + /* find checksum */ +#if AS_CHECK_VERSION(0,5,0) + csum = as_release_get_checksum_by_target (release, AS_CHECKSUM_TARGET_CONTENT); + if (csum == NULL) { + g_dbus_method_invocation_return_error (invocation, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "No content checksum for %s", + version); + return; + } hash = fu_device_get_metadata (item->device, FU_DEVICE_KEY_FIRMWARE_HASH); - g_dbus_method_invocation_return_value (invocation, - g_variant_new ("(s)", hash)); + if (g_strcmp0 (as_checksum_get_value (csum), hash) != 0) { + g_dbus_method_invocation_return_error (invocation, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "For v%s expected %s, got %s", + version, + as_checksum_get_value (csum), + hash); + return; + } +#else + g_dbus_method_invocation_return_error (invocation, + FWUPD_ERROR, + FWUPD_ERROR_NOT_SUPPORTED, + "No information with %s", + hash); + return; +#endif + + g_dbus_method_invocation_return_value (invocation, NULL); return; } diff --git a/src/fu-util.c b/src/fu-util.c index 88f910a9f..fb67450eb 100644 --- a/src/fu-util.c +++ b/src/fu-util.c @@ -1239,75 +1239,29 @@ fu_util_verify_internal (FuUtilPrivate *priv, const gchar *id, GError **error) static gboolean fu_util_verify_all (FuUtilPrivate *priv, GError **error) { - AsApp *app; FuDevice *dev; guint i; - _cleanup_object_unref_ AsStore *store = NULL; _cleanup_ptrarray_unref_ GPtrArray *devices = NULL; - _cleanup_ptrarray_unref_ GPtrArray *devices_tmp = NULL; /* get devices from daemon */ - devices_tmp = fu_util_get_devices_internal (priv, error); - if (devices_tmp == NULL) - return FALSE; - - /* get results */ - for (i = 0; i < devices_tmp->len; i++) { - _cleanup_error_free_ GError *error_local = NULL; - dev = g_ptr_array_index (devices_tmp, i); - if (!fu_util_verify_internal (priv, fu_device_get_id (dev), &error_local)) { - g_print ("Failed to verify %s: %s\n", - fu_device_get_id (dev), - error_local->message); - } - } - - /* only load firmware from the system */ - store = as_store_new (); - as_store_add_filter (store, AS_ID_KIND_FIRMWARE); - if (!as_store_load (store, AS_STORE_LOAD_FLAG_APP_INFO_SYSTEM, NULL, error)) - return FALSE; - - /* print */ devices = fu_util_get_devices_internal (priv, error); if (devices == NULL) return FALSE; + + /* get results */ for (i = 0; i < devices->len; i++) { - const gchar *hash = NULL; - const gchar *ver = NULL; - _cleanup_free_ gchar *status = NULL; - + _cleanup_error_free_ GError *error_local = NULL; dev = g_ptr_array_index (devices, i); - hash = fu_device_get_metadata (dev, FU_DEVICE_KEY_FIRMWARE_HASH); - if (hash == NULL) + if (!fu_util_verify_internal (priv, fu_device_get_id (dev), &error_local)) { + g_print ("%s\tFAILED: %s\n", + fu_device_get_guid (dev), + error_local->message); continue; - app = as_store_get_app_by_id (store, fu_device_get_guid (dev)); - if (app == NULL) { - status = g_strdup ("No metadata"); - } else { - AsRelease *rel; - ver = fu_device_get_metadata (dev, FU_DEVICE_KEY_VERSION); - rel = as_app_get_release (app, ver); - if (rel == NULL) { - status = g_strdup_printf ("No version %s", ver); - } else { -#if AS_CHECK_VERSION(0,5,0) - AsChecksum *csum; - csum = as_release_get_checksum_by_target (rel, AS_CHECKSUM_TARGET_CONTENT); - if (g_strcmp0 (as_checksum_get_value (csum), hash) != 0) { - status = g_strdup_printf ("Failed: for v%s expected %s", - ver, as_checksum_get_value (csum)); - } else { - status = g_strdup ("OK"); - } -#else - status = g_strdup ("No data"); -#endif - } } - g_print ("%s\t%s\t%s\n", fu_device_get_guid (dev), hash, status); + g_print ("%s\t%s\n", + fu_device_get_guid (dev), + _("OK")); } - return TRUE; } diff --git a/src/org.freedesktop.fwupd.xml b/src/org.freedesktop.fwupd.xml index 46a66f1e7..34b493b5c 100644 --- a/src/org.freedesktop.fwupd.xml +++ b/src/org.freedesktop.fwupd.xml @@ -158,15 +158,6 @@ - - - - - The cryptographic hash of the firmware. - - - -