From 96356aa1927b68ff6f887cd93c6dd67a18fc3063 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 17 Oct 2016 21:39:38 +0200 Subject: [PATCH] pull: Add per-remote cookie jar Optionally read cookie jars for a remote to be used when downloading data. This can be used for private repositories which require specific cookies to be present, e.g. repositories hosted on Amazon cloudfront using signed cookies. Closes: #531 Approved by: cgwalters --- src/libostree/ostree-fetcher.c | 27 +++++++++++++++++++++++++++ src/libostree/ostree-fetcher.h | 3 +++ src/libostree/ostree-repo-pull.c | 13 +++++++++++++ 3 files changed, 43 insertions(+) diff --git a/src/libostree/ostree-fetcher.c b/src/libostree/ostree-fetcher.c index 21526813..a4d46016 100644 --- a/src/libostree/ostree-fetcher.c +++ b/src/libostree/ostree-fetcher.c @@ -326,6 +326,16 @@ session_thread_set_proxy_cb (ThreadClosure *thread_closure, } } +static void +session_thread_set_cookie_jar_cb (ThreadClosure *thread_closure, + gpointer data) +{ + SoupCookieJar *jar = data; + + soup_session_add_feature (thread_closure->session, + SOUP_SESSION_FEATURE (jar)); +} + #ifdef HAVE_LIBSOUP_CLIENT_CERTS static void session_thread_set_tls_interaction_cb (ThreadClosure *thread_closure, @@ -746,6 +756,23 @@ _ostree_fetcher_set_proxy (OstreeFetcher *self, } } +void +_ostree_fetcher_set_cookie_jar (OstreeFetcher *self, + const char *jar_path) +{ + SoupCookieJar *jar; + + g_return_if_fail (OSTREE_IS_FETCHER (self)); + g_return_if_fail (jar_path != NULL); + + jar = soup_cookie_jar_text_new (jar_path, TRUE); + + session_thread_idle_add (self->thread_closure, + session_thread_set_cookie_jar_cb, + jar, /* takes ownership */ + (GDestroyNotify) g_object_unref); +} + void _ostree_fetcher_set_client_cert (OstreeFetcher *self, GTlsCertificate *cert) diff --git a/src/libostree/ostree-fetcher.h b/src/libostree/ostree-fetcher.h index 8cceca51..ae20edaa 100644 --- a/src/libostree/ostree-fetcher.h +++ b/src/libostree/ostree-fetcher.h @@ -59,6 +59,9 @@ OstreeFetcher *_ostree_fetcher_new (int tmpdir_dfd, int _ostree_fetcher_get_dfd (OstreeFetcher *fetcher); +void _ostree_fetcher_set_cookie_jar (OstreeFetcher *self, + const char *jar_path); + void _ostree_fetcher_set_proxy (OstreeFetcher *fetcher, const char *proxy); diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 1f57b133..8facf8cb 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -1964,6 +1964,19 @@ _ostree_repo_remote_new_fetcher (OstreeRepo *self, _ostree_fetcher_set_proxy (fetcher, http_proxy); } + { + g_autofree char *jar_path = NULL; + g_autofree char *cookie_file = g_strdup_printf ("%s.cookies.txt", + remote_name); + + jar_path = g_build_filename (g_file_get_path (self->repodir), cookie_file, + NULL); + + if (g_file_test(jar_path, G_FILE_TEST_IS_REGULAR)) + _ostree_fetcher_set_cookie_jar (fetcher, jar_path); + + } + success = TRUE; out: