blob: 3c12a90b1e9da5fb5407e500a22ced42acc3774d [file] [log] [blame]
/*
* Copyright 2025 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#define G_LOG_DOMAIN "FuBackend"
#include "config.h"
#include <fwupdplugin.h>
#include "fu-uefi-backend.h"
#include "fu-uefi-device-private.h"
struct _FuUefiBackend {
FuBackend parent_instance;
};
G_DEFINE_TYPE(FuUefiBackend, fu_uefi_backend, FU_TYPE_BACKEND)
static gboolean
fu_uefi_backend_coldplug(FuBackend *backend, FuProgress *progress, GError **error)
{
FuContext *ctx = fu_backend_get_context(backend);
FuEfivars *efivars = fu_context_get_efivars(ctx);
struct {
const gchar *guid;
const gchar *name;
} guid_names[] = {
{FU_EFIVARS_GUID_EFI_GLOBAL, "PK"},
{FU_EFIVARS_GUID_EFI_GLOBAL, "KEK"},
{FU_EFIVARS_GUID_SECURITY_DATABASE, "db"},
{FU_EFIVARS_GUID_SECURITY_DATABASE, "dbx"},
};
/* each important EFI key */
fu_progress_set_id(progress, G_STRLOC);
fu_progress_set_steps(progress, G_N_ELEMENTS(guid_names));
for (guint i = 0; i < G_N_ELEMENTS(guid_names); i++) {
g_autoptr(FuUefiDevice) uefi_device = NULL;
if (!fu_efivars_exists(efivars, guid_names[i].guid, guid_names[i].name)) {
fu_progress_step_done(progress);
continue;
}
uefi_device = fu_uefi_device_new(guid_names[i].guid, guid_names[i].name);
fu_backend_device_added(backend, FU_DEVICE(uefi_device));
fu_progress_step_done(progress);
}
/* success */
return TRUE;
}
static FuDevice *
fu_uefi_backend_create_device(FuBackend *backend, const gchar *backend_id, GError **error)
{
g_auto(GStrv) split = g_strsplit(backend_id, "-", 2);
g_autoptr(FuUefiDevice) uefi_device = NULL;
uefi_device =
g_object_new(FU_TYPE_UEFI_DEVICE, "backend", backend, "backend-id", backend_id, NULL);
fu_uefi_device_set_guid(uefi_device, split[0]);
fu_uefi_device_set_name(uefi_device, split[1]);
return FU_DEVICE(g_steal_pointer(&uefi_device));
}
static void
fu_uefi_backend_init(FuUefiBackend *self)
{
}
static void
fu_uefi_backend_class_init(FuUefiBackendClass *klass)
{
FuBackendClass *backend_class = FU_BACKEND_CLASS(klass);
backend_class->coldplug = fu_uefi_backend_coldplug;
backend_class->create_device = fu_uefi_backend_create_device;
}
FuBackend *
fu_uefi_backend_new(FuContext *ctx)
{
return FU_BACKEND(g_object_new(FU_TYPE_UEFI_BACKEND,
"name",
"uefi",
"context",
ctx,
"device-gtype",
FU_TYPE_UEFI_DEVICE,
NULL));
}