diff --git a/libfwupd/fwupd-client.c b/libfwupd/fwupd-client.c
index 5b6455481..2ef0a041e 100644
--- a/libfwupd/fwupd-client.c
+++ b/libfwupd/fwupd-client.c
@@ -41,6 +41,7 @@ typedef struct {
guint percentage;
gchar *daemon_version;
gchar *host_product;
+ gchar *host_machine_id;
GDBusConnection *conn;
GDBusProxy *proxy;
} FwupdClientPrivate;
@@ -61,6 +62,7 @@ enum {
PROP_DAEMON_VERSION,
PROP_TAINTED,
PROP_HOST_PRODUCT,
+ PROP_HOST_MACHINE_ID,
PROP_LAST
};
@@ -113,6 +115,15 @@ fwupd_client_set_host_product (FwupdClient *client, const gchar *host_product)
g_object_notify (G_OBJECT (client), "host-product");
}
+static void
+fwupd_client_set_host_machine_id (FwupdClient *client, const gchar *host_machine_id)
+{
+ FwupdClientPrivate *priv = GET_PRIVATE (client);
+ g_free (priv->host_machine_id);
+ priv->host_machine_id = g_strdup (host_machine_id);
+ g_object_notify (G_OBJECT (client), "host-machine-id");
+}
+
static void
fwupd_client_set_daemon_version (FwupdClient *client, const gchar *daemon_version)
{
@@ -172,6 +183,12 @@ fwupd_client_properties_changed_cb (GDBusProxy *proxy,
if (val != NULL)
fwupd_client_set_host_product (client, g_variant_get_string (val, NULL));
}
+ if (g_variant_dict_contains (dict, "HostMachineId")) {
+ g_autoptr(GVariant) val = NULL;
+ val = g_dbus_proxy_get_cached_property (proxy, "HostMachineId");
+ if (val != NULL)
+ fwupd_client_set_host_machine_id (client, g_variant_get_string (val, NULL));
+ }
}
static void
@@ -269,6 +286,9 @@ fwupd_client_connect (FwupdClient *client, GCancellable *cancellable, GError **e
val = g_dbus_proxy_get_cached_property (priv->proxy, "HostProduct");
if (val != NULL)
fwupd_client_set_host_product (client, g_variant_get_string (val, NULL));
+ val = g_dbus_proxy_get_cached_property (priv->proxy, "HostMachineId");
+ if (val != NULL)
+ fwupd_client_set_host_machine_id (client, g_variant_get_string (val, NULL));
return TRUE;
}
@@ -1189,6 +1209,24 @@ fwupd_client_get_host_product (FwupdClient *client)
return priv->host_product;
}
+/**
+ * fwupd_client_get_host_machine_id:
+ * @client: A #FwupdClient
+ *
+ * Gets the string that represents the host machine ID
+ *
+ * Returns: a string, or %NULL for unknown.
+ *
+ * Since: 1.3.2
+ **/
+const gchar *
+fwupd_client_get_host_machine_id (FwupdClient *client)
+{
+ FwupdClientPrivate *priv = GET_PRIVATE (client);
+ g_return_val_if_fail (FWUPD_IS_CLIENT (client), FALSE);
+ return priv->host_machine_id;
+}
+
/**
* fwupd_client_get_status:
* @client: A #FwupdClient
@@ -1714,6 +1752,9 @@ fwupd_client_get_property (GObject *object, guint prop_id,
case PROP_HOST_PRODUCT:
g_value_set_string (value, priv->host_product);
break;
+ case PROP_HOST_MACHINE_ID:
+ g_value_set_string (value, priv->host_machine_id);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1890,6 +1931,16 @@ fwupd_client_class_init (FwupdClientClass *klass)
NULL, G_PARAM_READABLE | G_PARAM_STATIC_NAME);
g_object_class_install_property (object_class, PROP_HOST_PRODUCT, pspec);
+ /**
+ * FwupdClient:host-machine-id:
+ *
+ * The host machine-id string
+ *
+ * Since: 1.3.2
+ */
+ pspec = g_param_spec_string ("host-machine-id", NULL, NULL,
+ NULL, G_PARAM_READABLE | G_PARAM_STATIC_NAME);
+ g_object_class_install_property (object_class, PROP_HOST_MACHINE_ID, pspec);
}
static void
@@ -1905,6 +1956,7 @@ fwupd_client_finalize (GObject *object)
g_free (priv->daemon_version);
g_free (priv->host_product);
+ g_free (priv->host_machine_id);
if (priv->conn != NULL)
g_object_unref (priv->conn);
if (priv->proxy != NULL)
diff --git a/libfwupd/fwupd-client.h b/libfwupd/fwupd-client.h
index b6fa21a6d..129488d69 100644
--- a/libfwupd/fwupd-client.h
+++ b/libfwupd/fwupd-client.h
@@ -128,6 +128,7 @@ gboolean fwupd_client_get_tainted (FwupdClient *client);
guint fwupd_client_get_percentage (FwupdClient *client);
const gchar *fwupd_client_get_daemon_version (FwupdClient *client);
const gchar *fwupd_client_get_host_product (FwupdClient *client);
+const gchar *fwupd_client_get_host_machine_id (FwupdClient *client);
GPtrArray *fwupd_client_get_remotes (FwupdClient *client,
GCancellable *cancellable,
diff --git a/libfwupd/fwupd.map b/libfwupd/fwupd.map
index 2d7a402f9..ef7e954a8 100644
--- a/libfwupd/fwupd.map
+++ b/libfwupd/fwupd.map
@@ -382,6 +382,7 @@ LIBFWUPD_1.3.1 {
LIBFWUPD_1.3.2 {
global:
+ fwupd_client_get_host_machine_id;
fwupd_release_add_issue;
fwupd_release_get_issues;
local: *;
diff --git a/src/fu-engine.c b/src/fu-engine.c
index a1b94dcfa..191acc855 100644
--- a/src/fu-engine.c
+++ b/src/fu-engine.c
@@ -77,6 +77,7 @@ struct _FuEngine
GHashTable *runtime_versions;
GHashTable *compile_versions;
GHashTable *approved_firmware;
+ gchar *host_machine_id;
gboolean loaded;
};
@@ -4160,6 +4161,13 @@ fu_engine_get_host_product (FuEngine *self)
return fu_hwids_get_value (self->hwids, FU_HWIDS_KEY_PRODUCT_NAME);
}
+const gchar *
+fu_engine_get_host_machine_id (FuEngine *self)
+{
+ g_return_val_if_fail (FU_IS_ENGINE (self), NULL);
+ return self->host_machine_id;
+}
+
gboolean
fu_engine_load_plugins (FuEngine *self, GError **error)
{
@@ -4573,6 +4581,11 @@ fu_engine_load (FuEngine *self, FuEngineLoadFlags flags, GError **error)
if (self->loaded)
return TRUE;
+ /* cache machine ID so we can use it from a sandboxed app */
+ self->host_machine_id = fwupd_build_machine_id ("fwupd", error);
+ if (self->host_machine_id == NULL)
+ return FALSE;
+
/* read config file */
if (flags & FU_ENGINE_LOAD_FLAG_READONLY_FS)
config_flags |= FU_CONFIG_LOAD_FLAG_READONLY_FS;
@@ -4820,6 +4833,7 @@ fu_engine_finalize (GObject *obj)
if (self->coldplug_id != 0)
g_source_remove (self->coldplug_id);
+ g_free (self->host_machine_id);
g_object_unref (self->idle);
g_object_unref (self->config);
g_object_unref (self->smbios);
diff --git a/src/fu-engine.h b/src/fu-engine.h
index 3fd535f48..2dfa23d57 100644
--- a/src/fu-engine.h
+++ b/src/fu-engine.h
@@ -49,6 +49,7 @@ gboolean fu_engine_load_plugins (FuEngine *self,
GError **error);
gboolean fu_engine_get_tainted (FuEngine *self);
const gchar *fu_engine_get_host_product (FuEngine *self);
+const gchar *fu_engine_get_host_machine_id (FuEngine *self);
FwupdStatus fu_engine_get_status (FuEngine *self);
XbSilo *fu_engine_get_silo_from_blob (FuEngine *self,
GBytes *blob_cab,
diff --git a/src/fu-main.c b/src/fu-main.c
index fa1e02b3b..8feedc3bd 100644
--- a/src/fu-main.c
+++ b/src/fu-main.c
@@ -1366,6 +1366,9 @@ fu_main_daemon_get_property (GDBusConnection *connection_, const gchar *sender,
if (g_strcmp0 (property_name, "HostProduct") == 0)
return g_variant_new_string (fu_engine_get_host_product (priv->engine));
+ if (g_strcmp0 (property_name, "HostMachineId") == 0)
+ return g_variant_new_string (fu_engine_get_host_machine_id (priv->engine));
+
/* return an error */
g_set_error (error,
G_DBUS_ERROR,
diff --git a/src/org.freedesktop.fwupd.xml b/src/org.freedesktop.fwupd.xml
index a61025153..4db832aab 100644
--- a/src/org.freedesktop.fwupd.xml
+++ b/src/org.freedesktop.fwupd.xml
@@ -33,6 +33,17 @@
+
+
+
+
+
+ The machine ID for the host.
+
+
+
+
+