Merge pull request #1877 from dbnicholson/specific-gpg-errors
More specific GPG errors
This commit is contained in:
19 files changed
+444
-43
No files matched your search
@@ -548,14 +548,10 @@ append_expire_info (GString *output_buffer,
|
||||
gint64 exp_timestamp,
|
||||
gboolean expired)
|
||||
{
|
||||
g_autoptr(GDateTime) date_time_utc = NULL;
|
||||
g_autoptr(GDateTime) date_time_local = NULL;
|
||||
g_autofree char *formatted_date_time = NULL;
|
||||
|
||||
if (line_prefix != NULL)
|
||||
g_string_append (output_buffer, line_prefix);
|
||||
|
||||
date_time_utc = g_date_time_new_from_unix_utc (exp_timestamp);
|
||||
g_autoptr(GDateTime) date_time_utc = g_date_time_new_from_unix_utc (exp_timestamp);
|
||||
if (date_time_utc == NULL)
|
||||
{
|
||||
g_string_append_printf (output_buffer,
|
||||
@@ -565,8 +561,8 @@ append_expire_info (GString *output_buffer,
|
||||
return;
|
||||
}
|
||||
|
||||
date_time_local = g_date_time_to_local (date_time_utc);
|
||||
formatted_date_time = g_date_time_format (date_time_local, "%c");
|
||||
g_autoptr(GDateTime) date_time_local = g_date_time_to_local (date_time_utc);
|
||||
g_autofree char *formatted_date_time = g_date_time_format (date_time_local, "%c");
|
||||
|
||||
if (expired)
|
||||
{
|
||||
@@ -773,8 +769,58 @@ ostree_gpg_verify_result_require_valid_signature (OstreeGpgVerifyResult *result,
|
||||
|
||||
if (ostree_gpg_verify_result_count_valid (result) == 0)
|
||||
{
|
||||
g_set_error (error, OSTREE_GPG_ERROR, OSTREE_GPG_ERROR_MISSING_KEY,
|
||||
"GPG signatures found, but none are in trusted keyring");
|
||||
/*
|
||||
* Join the description of each failed signature for the error message.
|
||||
* Only one error code can be returned, so if there was more than one
|
||||
* signature, use the error of the last one under the assumption that
|
||||
* it's the most recent and hopefully most likely to be made with a
|
||||
* valid key.
|
||||
*/
|
||||
gint code = OSTREE_GPG_ERROR_NO_SIGNATURE;
|
||||
g_autoptr(GString) buffer = g_string_sized_new (256);
|
||||
guint nsigs = ostree_gpg_verify_result_count_all (result);
|
||||
|
||||
if (nsigs == 0)
|
||||
/* In case an empty result was passed in */
|
||||
g_string_append (buffer, "No GPG signatures found");
|
||||
else
|
||||
{
|
||||
for (int i = nsigs - 1; i >= 0; i--)
|
||||
{
|
||||
g_autoptr(GVariant) info = ostree_gpg_verify_result_get_all (result, i);
|
||||
ostree_gpg_verify_result_describe_variant (info, buffer, "",
|
||||
OSTREE_GPG_SIGNATURE_FORMAT_DEFAULT);
|
||||
|
||||
if (i == nsigs - 1)
|
||||
{
|
||||
gboolean key_missing, key_revoked, key_expired, sig_expired;
|
||||
g_variant_get_child (info, OSTREE_GPG_SIGNATURE_ATTR_KEY_MISSING,
|
||||
"b", &key_missing);
|
||||
g_variant_get_child (info, OSTREE_GPG_SIGNATURE_ATTR_KEY_REVOKED,
|
||||
"b", &key_revoked);
|
||||
g_variant_get_child (info, OSTREE_GPG_SIGNATURE_ATTR_KEY_EXPIRED,
|
||||
"b", &key_expired);
|
||||
g_variant_get_child (info, OSTREE_GPG_SIGNATURE_ATTR_SIG_EXPIRED,
|
||||
"b", &sig_expired);
|
||||
|
||||
if (key_missing)
|
||||
code = OSTREE_GPG_ERROR_MISSING_KEY;
|
||||
else if (key_revoked)
|
||||
code = OSTREE_GPG_ERROR_REVOKED_KEY;
|
||||
else if (key_expired)
|
||||
code = OSTREE_GPG_ERROR_EXPIRED_KEY;
|
||||
else if (sig_expired)
|
||||
code = OSTREE_GPG_ERROR_EXPIRED_SIGNATURE;
|
||||
else
|
||||
/* Assume any other issue is a bad signature */
|
||||
code = OSTREE_GPG_ERROR_INVALID_SIGNATURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Strip any trailing newlines */
|
||||
g_strchomp (buffer->str);
|
||||
g_set_error_literal (error, OSTREE_GPG_ERROR, code, buffer->str);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -159,6 +159,11 @@ gboolean ostree_gpg_verify_result_require_valid_signature (OstreeGpgVerifyResult
|
||||
* @OSTREE_GPG_ERROR_NO_SIGNATURE: A signature was expected, but not found.
|
||||
* @OSTREE_GPG_ERROR_INVALID_SIGNATURE: A signature was malformed.
|
||||
* @OSTREE_GPG_ERROR_MISSING_KEY: A signature was found, but was created with a key not in the configured keyrings.
|
||||
* @OSTREE_GPG_ERROR_EXPIRED_SIGNATURE: A signature was expired. Since: 2019.7.
|
||||
* @OSTREE_GPG_ERROR_EXPIRED_KEY: A signature was found, but the key used to
|
||||
* sign it has expired. Since: 2019.7.
|
||||
* @OSTREE_GPG_ERROR_REVOKED_KEY: A signature was found, but the key used to
|
||||
* sign it has been revoked. Since: 2019.7.
|
||||
*
|
||||
* Errors returned by signature creation and verification operations in OSTree.
|
||||
* These may be returned by any API which creates or verifies signatures.
|
||||
@@ -169,6 +174,9 @@ typedef enum {
|
||||
OSTREE_GPG_ERROR_NO_SIGNATURE = 0,
|
||||
OSTREE_GPG_ERROR_INVALID_SIGNATURE,
|
||||
OSTREE_GPG_ERROR_MISSING_KEY,
|
||||
OSTREE_GPG_ERROR_EXPIRED_SIGNATURE,
|
||||
OSTREE_GPG_ERROR_EXPIRED_KEY,
|
||||
OSTREE_GPG_ERROR_REVOKED_KEY,
|
||||
} OstreeGpgError;
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user