diff options
author | rfairley <rfairley@redhat.com> | 2018-11-06 15:25:15 -0500 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-11-21 17:03:10 +0000 |
commit | 05e8c7ef6a86e17a0ac421b9c80a2e57f56b4b3d (patch) | |
tree | e6a2ba006e5a6ce1e76182ec4373ee6478a48f83 /src/libotutil/ot-keyfile-utils.c | |
parent | 244d9a7ec1a08c0c7adf495a8b341798009556e1 (diff) | |
download | ostree-05e8c7ef6a86e17a0ac421b9c80a2e57f56b4b3d.tar.gz |
lib/repo: Search a list of paths in gpgkeypath for gpg keys
This allows specifying gpgpath as list of
paths that can point to a file or a directory. If a directory path
is given, paths to all regular files in the directory are added
to the remote as gpg ascii keys. If the path is not a directory,
the file is directly added (whether regular file, empty - errors
will be reported later when verifying gpg keys e.g. when pulling).
Adding the gpgkeypath property looks like:
ostree --repo=repo remote add --set=gpgpath="/path/key1.asc,/path/keys.d" R1 https://example.com/some/remote/ostree/repo
Closes #773
Closes: #1773
Approved by: cgwalters
Diffstat (limited to 'src/libotutil/ot-keyfile-utils.c')
-rw-r--r-- | src/libotutil/ot-keyfile-utils.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/libotutil/ot-keyfile-utils.c b/src/libotutil/ot-keyfile-utils.c index 3b29377f..a0ab75cc 100644 --- a/src/libotutil/ot-keyfile-utils.c +++ b/src/libotutil/ot-keyfile-utils.c @@ -101,6 +101,107 @@ ot_keyfile_get_value_with_default (GKeyFile *keyfile, return ret; } +/* Read the value of key as a string. If the value string contains + * one of the separators and none of the others, read the + * string as a NULL-terminated array out_value. If the value string contains + * none of the separators, read the string as a single entry into a + * NULL-terminated array out_value. If the value string contains multiple of + * the separators, an error is given. + * Returns TRUE on success, FALSE on error. */ +gboolean +ot_keyfile_get_string_as_list (GKeyFile *keyfile, + const char *section, + const char *key, + const char *separators, + char ***out_value, + GError **error) +{ + guint sep_count = 0; + gchar sep = '\0'; + g_autofree char *value_str = NULL; + g_autofree char **value_list = NULL; + + g_return_val_if_fail (keyfile != NULL, FALSE); + g_return_val_if_fail (section != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + g_return_val_if_fail (separators != NULL, FALSE); + + if (!ot_keyfile_get_value_with_default (keyfile, section, key, NULL, + &value_str, error)) + return FALSE; + + if (value_str) + { + for (size_t i = 0; i < strlen (separators) && sep_count <= 1; i++) + { + if (strchr (value_str, separators[i])) + { + sep_count++; + sep = separators[i]; + } + } + + if (sep_count == 0) + { + value_list = g_new (gchar *, 2); + value_list[0] = g_steal_pointer (&value_str); + value_list[1] = NULL; + } + else if (sep_count == 1) + { + if (!ot_keyfile_get_string_list_with_default (keyfile, section, key, + sep, NULL, &value_list, error)) + return FALSE; + } + else + { + return glnx_throw (error, "key value list contains more than one separator"); + } + } + + ot_transfer_out_value (out_value, &value_list); + return TRUE; +} + +gboolean +ot_keyfile_get_string_list_with_default (GKeyFile *keyfile, + const char *section, + const char *key, + char separator, + char **default_value, + char ***out_value, + GError **error) +{ + g_autoptr(GError) temp_error = NULL; + + g_return_val_if_fail (keyfile != NULL, FALSE); + g_return_val_if_fail (section != NULL, FALSE); + g_return_val_if_fail (key != NULL, FALSE); + + g_key_file_set_list_separator (keyfile, separator); + + g_autofree char **ret_value = g_key_file_get_string_list (keyfile, section, + key, NULL, &temp_error); + + if (temp_error) + { + if (g_error_matches (temp_error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_KEY_NOT_FOUND)) + { + g_clear_error (&temp_error); + ret_value = default_value; + } + else + { + g_propagate_error (error, g_steal_pointer (&temp_error)); + return FALSE; + } + } + + ot_transfer_out_value (out_value, &ret_value); + return TRUE; +} + gboolean ot_keyfile_copy_group (GKeyFile *source_keyfile, GKeyFile *target_keyfile, |