mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-17 19:04:13 +00:00
Use g_auto() in FuKeyring
This simplifies function cleanup.
This commit is contained in:
parent
c5e8921dfd
commit
fe490ebb80
@ -40,6 +40,8 @@ typedef struct {
|
|||||||
G_DEFINE_TYPE_WITH_PRIVATE (FuKeyring, fu_keyring, G_TYPE_OBJECT)
|
G_DEFINE_TYPE_WITH_PRIVATE (FuKeyring, fu_keyring, G_TYPE_OBJECT)
|
||||||
#define GET_PRIVATE(o) (fu_keyring_get_instance_private (o))
|
#define GET_PRIVATE(o) (fu_keyring_get_instance_private (o))
|
||||||
|
|
||||||
|
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_data_t, gpgme_data_release, NULL)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fu_keyring_setup:
|
* fu_keyring_setup:
|
||||||
**/
|
**/
|
||||||
@ -106,11 +108,10 @@ gboolean
|
|||||||
fu_keyring_add_public_key (FuKeyring *keyring, const gchar *filename, GError **error)
|
fu_keyring_add_public_key (FuKeyring *keyring, const gchar *filename, GError **error)
|
||||||
{
|
{
|
||||||
FuKeyringPrivate *priv = GET_PRIVATE (keyring);
|
FuKeyringPrivate *priv = GET_PRIVATE (keyring);
|
||||||
gboolean ret = TRUE;
|
|
||||||
gpgme_data_t data = NULL;
|
|
||||||
gpgme_error_t rc;
|
gpgme_error_t rc;
|
||||||
gpgme_import_result_t result;
|
gpgme_import_result_t result;
|
||||||
gpgme_import_status_t s;
|
gpgme_import_status_t s;
|
||||||
|
g_auto(gpgme_data_t) data = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (FU_IS_KEYRING (keyring), FALSE);
|
g_return_val_if_fail (FU_IS_KEYRING (keyring), FALSE);
|
||||||
g_return_val_if_fail (filename != NULL, FALSE);
|
g_return_val_if_fail (filename != NULL, FALSE);
|
||||||
@ -119,23 +120,21 @@ fu_keyring_add_public_key (FuKeyring *keyring, const gchar *filename, GError **e
|
|||||||
g_debug ("Adding public key %s", filename);
|
g_debug ("Adding public key %s", filename);
|
||||||
rc = gpgme_data_new_from_file (&data, filename, 1);
|
rc = gpgme_data_new_from_file (&data, filename, 1);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to load %s: %s",
|
"failed to load %s: %s",
|
||||||
filename, gpgme_strerror (rc));
|
filename, gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
rc = gpgme_op_import (priv->ctx, data);
|
rc = gpgme_op_import (priv->ctx, data);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to import %s: %s",
|
"failed to import %s: %s",
|
||||||
filename, gpgme_strerror (rc));
|
filename, gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print what keys were imported */
|
/* print what keys were imported */
|
||||||
@ -146,20 +145,19 @@ fu_keyring_add_public_key (FuKeyring *keyring, const gchar *filename, GError **e
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* make sure keys were really imported */
|
/* make sure keys were really imported */
|
||||||
if (result->imported + result->unchanged == 0) {
|
if (result->imported == result->unchanged) {
|
||||||
ret = FALSE;
|
g_debug("imported: %d, unchanged: %d, not_imported: %d",
|
||||||
g_debug("imported: %d, unchanged: %d, not_imported: %d", result->imported,
|
result->imported,
|
||||||
result->unchanged,
|
result->unchanged,
|
||||||
result->not_imported);
|
result->not_imported);
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"Key import failed %s",
|
"key import failed %s",
|
||||||
filename);
|
filename);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
out:
|
return TRUE;
|
||||||
gpgme_data_release (data);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -258,12 +256,11 @@ fu_keyring_verify_file (FuKeyring *keyring,
|
|||||||
{
|
{
|
||||||
FuKeyringPrivate *priv = GET_PRIVATE (keyring);
|
FuKeyringPrivate *priv = GET_PRIVATE (keyring);
|
||||||
gboolean has_header;
|
gboolean has_header;
|
||||||
gboolean ret = TRUE;
|
|
||||||
gpgme_data_t data = NULL;
|
|
||||||
gpgme_data_t sig = NULL;
|
|
||||||
gpgme_error_t rc;
|
gpgme_error_t rc;
|
||||||
gpgme_signature_t s;
|
gpgme_signature_t s;
|
||||||
gpgme_verify_result_t result;
|
gpgme_verify_result_t result;
|
||||||
|
g_auto(gpgme_data_t) data = NULL;
|
||||||
|
g_auto(gpgme_data_t) sig = NULL;
|
||||||
g_autoptr(GString) sig_v1 = NULL;
|
g_autoptr(GString) sig_v1 = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (FU_IS_KEYRING (keyring), FALSE);
|
g_return_val_if_fail (FU_IS_KEYRING (keyring), FALSE);
|
||||||
@ -280,13 +277,12 @@ fu_keyring_verify_file (FuKeyring *keyring,
|
|||||||
/* load file data */
|
/* load file data */
|
||||||
rc = gpgme_data_new_from_file (&data, filename, 1);
|
rc = gpgme_data_new_from_file (&data, filename, 1);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to load %s: %s",
|
"failed to load %s: %s",
|
||||||
filename, gpgme_strerror (rc));
|
filename, gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* load signature */
|
/* load signature */
|
||||||
@ -300,52 +296,42 @@ fu_keyring_verify_file (FuKeyring *keyring,
|
|||||||
g_string_append (sig_v1, "-----END PGP SIGNATURE-----\n");
|
g_string_append (sig_v1, "-----END PGP SIGNATURE-----\n");
|
||||||
rc = gpgme_data_new_from_mem (&sig, sig_v1->str, sig_v1->len, 0);
|
rc = gpgme_data_new_from_mem (&sig, sig_v1->str, sig_v1->len, 0);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to load signature %s: %s",
|
"failed to load signature %s: %s",
|
||||||
signature, gpgme_strerror (rc));
|
signature, gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* verify */
|
/* verify */
|
||||||
rc = gpgme_op_verify (priv->ctx, sig, data, NULL);
|
rc = gpgme_op_verify (priv->ctx, sig, data, NULL);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to verify %s: %s",
|
"failed to verify %s: %s",
|
||||||
filename, gpgme_strerror (rc));
|
filename, gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* verify the result */
|
/* verify the result */
|
||||||
result = gpgme_op_verify_result (priv->ctx);
|
result = gpgme_op_verify_result (priv->ctx);
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error_literal (error,
|
g_set_error_literal (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"no result record from libgpgme");
|
"no result record from libgpgme");
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* look at each signature */
|
/* look at each signature */
|
||||||
for (s = result->signatures; s != NULL ; s = s->next ) {
|
for (s = result->signatures; s != NULL ; s = s->next ) {
|
||||||
g_debug ("returned signature fingerprint %s", s->fpr);
|
g_debug ("returned signature fingerprint %s", s->fpr);
|
||||||
ret = fu_keyring_check_signature (s, error);
|
if (!fu_keyring_check_signature (s, error))
|
||||||
if (!ret)
|
return FALSE;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
out:
|
return TRUE;
|
||||||
if (data != NULL)
|
|
||||||
gpgme_data_release (data);
|
|
||||||
if (sig != NULL)
|
|
||||||
gpgme_data_release (sig);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -358,12 +344,11 @@ fu_keyring_verify_data (FuKeyring *keyring,
|
|||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
FuKeyringPrivate *priv = GET_PRIVATE (keyring);
|
FuKeyringPrivate *priv = GET_PRIVATE (keyring);
|
||||||
gboolean ret = TRUE;
|
|
||||||
gpgme_data_t data = NULL;
|
|
||||||
gpgme_data_t sig = NULL;
|
|
||||||
gpgme_error_t rc;
|
gpgme_error_t rc;
|
||||||
gpgme_signature_t s;
|
gpgme_signature_t s;
|
||||||
gpgme_verify_result_t result;
|
gpgme_verify_result_t result;
|
||||||
|
g_auto(gpgme_data_t) data = NULL;
|
||||||
|
g_auto(gpgme_data_t) sig = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (FU_IS_KEYRING (keyring), FALSE);
|
g_return_val_if_fail (FU_IS_KEYRING (keyring), FALSE);
|
||||||
g_return_val_if_fail (payload != NULL, FALSE);
|
g_return_val_if_fail (payload != NULL, FALSE);
|
||||||
@ -378,64 +363,54 @@ fu_keyring_verify_data (FuKeyring *keyring,
|
|||||||
g_bytes_get_data (payload, NULL),
|
g_bytes_get_data (payload, NULL),
|
||||||
g_bytes_get_size (payload), 0);
|
g_bytes_get_size (payload), 0);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to load data: %s",
|
"failed to load data: %s",
|
||||||
gpgme_strerror (rc));
|
gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
rc = gpgme_data_new_from_mem (&sig,
|
rc = gpgme_data_new_from_mem (&sig,
|
||||||
g_bytes_get_data (payload_signature, NULL),
|
g_bytes_get_data (payload_signature, NULL),
|
||||||
g_bytes_get_size (payload_signature), 0);
|
g_bytes_get_size (payload_signature), 0);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to load signature: %s",
|
"failed to load signature: %s",
|
||||||
gpgme_strerror (rc));
|
gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* verify */
|
/* verify */
|
||||||
rc = gpgme_op_verify (priv->ctx, sig, data, NULL);
|
rc = gpgme_op_verify (priv->ctx, sig, data, NULL);
|
||||||
if (rc != GPG_ERR_NO_ERROR) {
|
if (rc != GPG_ERR_NO_ERROR) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error (error,
|
g_set_error (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"failed to verify data: %s",
|
"failed to verify data: %s",
|
||||||
gpgme_strerror (rc));
|
gpgme_strerror (rc));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* verify the result */
|
/* verify the result */
|
||||||
result = gpgme_op_verify_result (priv->ctx);
|
result = gpgme_op_verify_result (priv->ctx);
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
ret = FALSE;
|
|
||||||
g_set_error_literal (error,
|
g_set_error_literal (error,
|
||||||
FWUPD_ERROR,
|
FWUPD_ERROR,
|
||||||
FWUPD_ERROR_INTERNAL,
|
FWUPD_ERROR_INTERNAL,
|
||||||
"no result record from libgpgme");
|
"no result record from libgpgme");
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* look at each signature */
|
/* look at each signature */
|
||||||
for (s = result->signatures; s != NULL ; s = s->next ) {
|
for (s = result->signatures; s != NULL ; s = s->next ) {
|
||||||
g_debug ("returned signature fingerprint %s", s->fpr);
|
g_debug ("returned signature fingerprint %s", s->fpr);
|
||||||
ret = fu_keyring_check_signature (s, error);
|
if (!fu_keyring_check_signature (s, error))
|
||||||
if (!ret)
|
return FALSE;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
out:
|
return TRUE;
|
||||||
if (data != NULL)
|
|
||||||
gpgme_data_release (data);
|
|
||||||
if (sig != NULL)
|
|
||||||
gpgme_data_release (sig);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user