diff options
author | Daiki Ueno <dueno@src.gnome.org> | 2019-06-20 06:55:56 +0200 |
---|---|---|
committer | Daiki Ueno <ueno@gnu.org> | 2019-07-18 13:54:12 +0000 |
commit | a5db34dcd5991796eb5c370ada5b70b386df9d80 (patch) | |
tree | 4305ed256fb257a30cc47528fd170509e577e2a3 | |
parent | 2ae6ec89f43f076d622658275bd24c57996c18c5 (diff) | |
download | libsecret-a5db34dcd5991796eb5c370ada5b70b386df9d80.tar.gz |
secret-value: Add secret_value_unref_to_password
This adds the secret_value_unref_to_password function that
unreferences and returns the stored secret in non-pageable memory.
This is supposed to be used with secret_password_lookup_binary*
functions.
-rw-r--r-- | docs/reference/libsecret/libsecret-sections.txt | 1 | ||||
-rw-r--r-- | libsecret/secret-value.c | 40 | ||||
-rw-r--r-- | libsecret/secret-value.h | 3 |
3 files changed, 38 insertions, 6 deletions
diff --git a/docs/reference/libsecret/libsecret-sections.txt b/docs/reference/libsecret/libsecret-sections.txt index d8f9509..f811b9d 100644 --- a/docs/reference/libsecret/libsecret-sections.txt +++ b/docs/reference/libsecret/libsecret-sections.txt @@ -333,6 +333,7 @@ secret_value_get_text secret_value_get_content_type secret_value_ref secret_value_unref +secret_value_unref_to_password <SUBSECTION Standard> SECRET_TYPE_VALUE secret_value_get_type diff --git a/libsecret/secret-value.c b/libsecret/secret-value.c index ca891cb..63464cd 100644 --- a/libsecret/secret-value.c +++ b/libsecret/secret-value.c @@ -256,39 +256,67 @@ is_password_value (SecretValue *value) return FALSE; } +/** + * secret_value_unref_to_password: + * @value: the value + * @length: the length of the secret + * + * Unreference a #SecretValue and steal the secret data in + * #SecretValue as nonpageable memory. + * + * Returns: (transfer full): a new password string stored in nonpageable memory + * which must be freed with secret_password_free() when done + * + * Since: 0.19.0 + */ gchar * -_secret_value_unref_to_password (SecretValue *value) +secret_value_unref_to_password (SecretValue *value, + gsize *length) { SecretValue *val = value; gchar *result; g_return_val_if_fail (value != NULL, NULL); - if (!is_password_value (value)) { - secret_value_unref (value); - return NULL; - } - if (g_atomic_int_dec_and_test (&val->refs)) { if (val->destroy == egg_secure_free) { result = val->secret; + if (length) + *length = val->length; } else { result = egg_secure_strndup (val->secret, val->length); if (val->destroy) (val->destroy) (val->secret); + if (length) + *length = val->length; } g_free (val->content_type); g_slice_free (SecretValue, val); } else { result = egg_secure_strndup (val->secret, val->length); + if (length) + *length = val->length; } return result; } gchar * +_secret_value_unref_to_password (SecretValue *value) +{ + g_return_val_if_fail (value != NULL, NULL); + + if (!is_password_value (value)) { + secret_value_unref (value); + return NULL; + } + + return secret_value_unref_to_password (value, NULL); +} + +gchar * _secret_value_unref_to_string (SecretValue *value) { SecretValue *val = value; diff --git a/libsecret/secret-value.h b/libsecret/secret-value.h index 43b0e09..7699c08 100644 --- a/libsecret/secret-value.h +++ b/libsecret/secret-value.h @@ -51,6 +51,9 @@ SecretValue * secret_value_ref (SecretValue *value); void secret_value_unref (gpointer value); +gchar * secret_value_unref_to_password (SecretValue *value, + gsize *length); + G_DEFINE_AUTOPTR_CLEANUP_FUNC (SecretValue, secret_value_unref) G_END_DECLS |