lib/remote: Store name of remote providing keyring for dynamic remotes

When pulling from a dynamic (peer to peer) remote, the remote’s name is
set to a unique, generated string which doesn’t exist in repo/config. If
doing a non-mirror pull, however, we don’t want to use this name in the
refspecs for newly created or updated refs — we want to use the name of
the remote which provided the keyring for the pull (this will be a
remote from repo/config whose collection ID matches that being used for
the peer to peer pull).

Store both names in OstreeRemote. The name to use for refspecs is stored
as refspec_name, and is typically NULL unless it differs from name.

Signed-off-by: Philip Withnall <withnall@endlessm.com>

Closes: #1202
Approved by: cgwalters
This commit is contained in:
Philip Withnall 2017-09-21 16:04:11 +01:00 committed by Atomic Bot
parent 22c1fdfbd3
commit 69e332a0c0
4 changed files with 21 additions and 5 deletions

View File

@ -35,17 +35,24 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/* @refspec_name is set if this is a dynamic remote. Its the name of the static
* remote which this one inherits from, and is what should be used in refspecs
* for pulls from this remote. If its %NULL, @name should be used instead. */
struct OstreeRemote { struct OstreeRemote {
volatile int ref_count; volatile int ref_count;
char *name; /* (not nullable) */ char *name; /* (not nullable) */
char *refspec_name; /* (nullable) */
char *group; /* group name in options (not nullable) */ char *group; /* group name in options (not nullable) */
char *keyring; /* keyring name (NAME.trustedkeys.gpg) (not nullable) */ char *keyring; /* keyring name ($refspec_name.trustedkeys.gpg) (not nullable) */
GFile *file; /* NULL if remote defined in repo/config */ GFile *file; /* NULL if remote defined in repo/config */
GKeyFile *options; GKeyFile *options;
}; };
G_GNUC_INTERNAL G_GNUC_INTERNAL
OstreeRemote *ostree_remote_new (const gchar *name); OstreeRemote *ostree_remote_new (const gchar *name);
G_GNUC_INTERNAL
OstreeRemote *ostree_remote_new_dynamic (const gchar *name,
const gchar *refspec_name);
G_GNUC_INTERNAL G_GNUC_INTERNAL
OstreeRemote *ostree_remote_new_from_keyfile (GKeyFile *keyfile, OstreeRemote *ostree_remote_new_from_keyfile (GKeyFile *keyfile,

View File

@ -53,16 +53,25 @@
OstreeRemote * OstreeRemote *
ostree_remote_new (const gchar *name) ostree_remote_new (const gchar *name)
{
return ostree_remote_new_dynamic (name, NULL);
}
OstreeRemote *
ostree_remote_new_dynamic (const gchar *name,
const gchar *refspec_name)
{ {
OstreeRemote *remote; OstreeRemote *remote;
g_return_val_if_fail (name != NULL && *name != '\0', NULL); g_return_val_if_fail (name != NULL && *name != '\0', NULL);
g_return_val_if_fail (refspec_name == NULL || *refspec_name != '\0', NULL);
remote = g_slice_new0 (OstreeRemote); remote = g_slice_new0 (OstreeRemote);
remote->ref_count = 1; remote->ref_count = 1;
remote->name = g_strdup (name); remote->name = g_strdup (name);
remote->group = g_strdup_printf ("remote \"%s\"", name); remote->refspec_name = g_strdup (refspec_name);
remote->keyring = g_strdup_printf ("%s.trustedkeys.gpg", name); remote->group = g_strdup_printf ("remote \"%s\"", (refspec_name != NULL) ? refspec_name : name);
remote->keyring = g_strdup_printf ("%s.trustedkeys.gpg", (refspec_name != NULL) ? refspec_name : name);
remote->options = g_key_file_new (); remote->options = g_key_file_new ();
return remote; return remote;

View File

@ -821,7 +821,7 @@ ostree_avahi_service_build_repo_finder_result (OstreeAvahiService
/* Build an #OstreeRemote. Use the escaped URI, since remote->name /* Build an #OstreeRemote. Use the escaped URI, since remote->name
* is used in file paths, so needs to not contain special characters. */ * is used in file paths, so needs to not contain special characters. */
g_autofree gchar *name = uri_and_keyring_to_name (repo); g_autofree gchar *name = uri_and_keyring_to_name (repo);
remote = ostree_remote_new (name); remote = ostree_remote_new_dynamic (name, repo->keyring_remote->name);
g_clear_pointer (&remote->keyring, g_free); g_clear_pointer (&remote->keyring, g_free);
remote->keyring = g_strdup (repo->keyring_remote->keyring); remote->keyring = g_strdup (repo->keyring_remote->keyring);

View File

@ -513,7 +513,7 @@ ostree_repo_finder_mount_resolve_async (OstreeRepoFinder *finde
/* Build an #OstreeRemote. Use the escaped URI, since remote->name /* Build an #OstreeRemote. Use the escaped URI, since remote->name
* is used in file paths, so needs to not contain special characters. */ * is used in file paths, so needs to not contain special characters. */
g_autofree gchar *name = uri_and_keyring_to_name (repo); g_autofree gchar *name = uri_and_keyring_to_name (repo);
remote = ostree_remote_new (name); remote = ostree_remote_new_dynamic (name, repo->keyring_remote->name);
g_clear_pointer (&remote->keyring, g_free); g_clear_pointer (&remote->keyring, g_free);
remote->keyring = g_strdup (repo->keyring_remote->keyring); remote->keyring = g_strdup (repo->keyring_remote->keyring);