summaryrefslogtreecommitdiff
path: root/src/libotutil/ot-keyfile-utils.c
diff options
context:
space:
mode:
authorrfairley <rfairley@redhat.com>2018-11-06 15:25:15 -0500
committerAtomic Bot <atomic-devel@projectatomic.io>2018-11-21 17:03:10 +0000
commit05e8c7ef6a86e17a0ac421b9c80a2e57f56b4b3d (patch)
treee6a2ba006e5a6ce1e76182ec4373ee6478a48f83 /src/libotutil/ot-keyfile-utils.c
parent244d9a7ec1a08c0c7adf495a8b341798009556e1 (diff)
downloadostree-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.c101
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,