Blame SOURCES/flatpak-1.6.2-oci-fixes2.patch

978dd1
From 1b9a64e943e2233e009e01a08191b4c17580b3f6 Mon Sep 17 00:00:00 2001
978dd1
From: Alexander Larsson <alexl@redhat.com>
978dd1
Date: Mon, 4 May 2020 13:00:35 +0200
978dd1
Subject: [PATCH 1/7] oci authenticator: Accept the right docker manifest when
978dd1
 authenticating
978dd1
978dd1
Without this I got for the fedora registry:
978dd1
978dd1
```
978dd1
getting token for https://registry.fedoraproject.org/v2/f32/flatpak-runtime/manifests/sha256:bd83b4f6974094848efac22b933419c1dbe11b553def148a82f821faf595de8a
978dd1
F: Anonymous authentication failed: Unexpected response status 404 from repo
978dd1
```
978dd1
978dd1
(cherry picked from commit 1ee132e70e5d0cb5fa0e022c2271f76bcfd03054)
978dd1
---
978dd1
 common/flatpak-oci-registry.c | 3 +++
978dd1
 1 file changed, 3 insertions(+)
978dd1
978dd1
diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c
978dd1
index 2505771ee..ae363bc1a 100644
978dd1
--- a/common/flatpak-oci-registry.c
978dd1
+++ b/common/flatpak-oci-registry.c
978dd1
@@ -1015,6 +1015,9 @@ flatpak_oci_registry_get_token (FlatpakOciRegistry *self,
978dd1
 
978dd1
   msg = soup_message_new_from_uri ("HEAD", uri);
978dd1
 
978dd1
+  soup_message_headers_replace (msg->request_headers, "Accept",
978dd1
+                                FLATPAK_OCI_MEDIA_TYPE_IMAGE_MANIFEST ", " FLATPAK_DOCKER_MEDIA_TYPE_IMAGE_MANIFEST2);
978dd1
+
978dd1
   stream = soup_session_send (self->soup_session, msg, NULL, error);
978dd1
   if (stream == NULL)
978dd1
     return NULL;
978dd1
978dd1
From 0d4deebbd5855ceef1cdb5bac3d5c6fb630dc29e Mon Sep 17 00:00:00 2001
978dd1
From: Alexander Larsson <alexl@redhat.com>
978dd1
Date: Mon, 4 May 2020 12:35:16 +0200
978dd1
Subject: [PATCH 2/7] By default, always try to auth to OCI remotes
978dd1
978dd1
This makes for instance docker hub work.
978dd1
978dd1
(cherry picked from commit fdfcae7a91e3af207c4acec918276511f112cafe)
978dd1
---
978dd1
 common/flatpak-auth.c | 4 ++++
978dd1
 common/flatpak-dir.c  | 5 +++++
978dd1
 2 files changed, 9 insertions(+)
978dd1
978dd1
diff --git a/common/flatpak-auth.c b/common/flatpak-auth.c
978dd1
index 9d0f689fc..9e45da41e 100644
978dd1
--- a/common/flatpak-auth.c
978dd1
+++ b/common/flatpak-auth.c
978dd1
@@ -49,6 +49,10 @@ flatpak_auth_new_for_remote (FlatpakDir *dir,
978dd1
       if (!ostree_repo_get_remote_option (repo, remote, FLATPAK_REMOTE_CONFIG_AUTHENTICATOR_NAME, NULL, &name, error))
978dd1
         return NULL;
978dd1
     }
978dd1
+
978dd1
+  if (name == NULL && flatpak_dir_get_remote_oci (dir, remote))
978dd1
+    name = g_strdup ("org.flatpak.Authenticator.Oci");
978dd1
+
978dd1
   if (name == NULL || *name == 0 /* or if no repo */)
978dd1
     {
978dd1
       flatpak_fail (error, _("No authenticator configured for remote `%s`"), remote);
978dd1
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
978dd1
index 2c8e12eaf..19de4fd38 100644
978dd1
--- a/common/flatpak-dir.c
978dd1
+++ b/common/flatpak-dir.c
978dd1
@@ -11233,6 +11233,11 @@ _flatpak_dir_get_remote_state (FlatpakDir   *self,
978dd1
         }
978dd1
     }
978dd1
 
978dd1
+  if (flatpak_dir_get_remote_oci (self, remote_or_uri))
978dd1
+    {
978dd1
+      state->default_token_type = 1;
978dd1
+    }
978dd1
+
978dd1
   if (state->collection_id == NULL)
978dd1
     {
978dd1
       if (state->summary != NULL) /* In the optional case we might not have a summary */
978dd1
978dd1
From 77e4db40f40a92f4f7e0ddb21ae367e9a0af9cb4 Mon Sep 17 00:00:00 2001
978dd1
From: Alexander Larsson <alexl@redhat.com>
978dd1
Date: Fri, 8 May 2020 15:09:02 +0200
978dd1
Subject: [PATCH 3/7] oci: Add flatpak_oci_registry_is_local()
978dd1
978dd1
(cherry picked from commit d4962628aa8db6132e98660fe52aa5a9ac5d3637)
978dd1
---
978dd1
 common/flatpak-oci-registry-private.h | 1 +
978dd1
 common/flatpak-oci-registry.c         | 6 ++++++
978dd1
 2 files changed, 7 insertions(+)
978dd1
978dd1
diff --git a/common/flatpak-oci-registry-private.h b/common/flatpak-oci-registry-private.h
978dd1
index 1804e43b6..6745c5f65 100644
978dd1
--- a/common/flatpak-oci-registry-private.h
978dd1
+++ b/common/flatpak-oci-registry-private.h
978dd1
@@ -62,6 +62,7 @@ FlatpakOciRegistry  *  flatpak_oci_registry_new (const char           *uri,
978dd1
                                                  GError              **error);
978dd1
 void                   flatpak_oci_registry_set_token (FlatpakOciRegistry *self,
978dd1
                                                        const char *token);
978dd1
+gboolean               flatpak_oci_registry_is_local (FlatpakOciRegistry *self);
978dd1
 const char          *  flatpak_oci_registry_get_uri (FlatpakOciRegistry *self);
978dd1
 FlatpakOciIndex     *  flatpak_oci_registry_load_index (FlatpakOciRegistry *self,
978dd1
                                                         GCancellable       *cancellable,
978dd1
diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c
978dd1
index ae363bc1a..fdeee56bd 100644
978dd1
--- a/common/flatpak-oci-registry.c
978dd1
+++ b/common/flatpak-oci-registry.c
978dd1
@@ -205,6 +205,12 @@ flatpak_oci_registry_init (FlatpakOciRegistry *self)
978dd1
   self->tmp_dfd = -1;
978dd1
 }
978dd1
 
978dd1
+gboolean
978dd1
+flatpak_oci_registry_is_local (FlatpakOciRegistry *self)
978dd1
+{
978dd1
+  return self->dfd != -1;
978dd1
+}
978dd1
+
978dd1
 const char *
978dd1
 flatpak_oci_registry_get_uri (FlatpakOciRegistry *self)
978dd1
 {
978dd1
978dd1
From 3deeea1ad50b469f7daaca7e2e0d7ba9c5efc26e Mon Sep 17 00:00:00 2001
978dd1
From: Alexander Larsson <alexl@redhat.com>
978dd1
Date: Fri, 8 May 2020 15:10:38 +0200
978dd1
Subject: [PATCH 4/7] oci: Set token on child oci registry and pass to
978dd1
 system-helper
978dd1
978dd1
When we create a system child registry we also set the current token on
978dd1
it. This is not used directly in the client, however its saved in a
978dd1
file called .token and re-read in the system-helper, allowing it to
978dd1
also do the remote registry operations it needs to verify the child
978dd1
registry.
978dd1
978dd1
(cherry picked from commit 5d8fd2d1be914a26e128ab97be6f00e9c34bfa9d)
978dd1
---
978dd1
 common/flatpak-dir.c          |  8 ++++++--
978dd1
 common/flatpak-oci-registry.c | 15 +++++++++++++++
978dd1
 2 files changed, 21 insertions(+), 2 deletions(-)
978dd1
978dd1
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
978dd1
index 19de4fd38..25f874ecf 100644
978dd1
--- a/common/flatpak-dir.c
978dd1
+++ b/common/flatpak-dir.c
978dd1
@@ -92,6 +92,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (AutoPolkitSubject, g_object_unref)
978dd1
 
978dd1
 static FlatpakOciRegistry *flatpak_dir_create_system_child_oci_registry (FlatpakDir   *self,
978dd1
                                                                          GLnxLockFile *file_lock,
978dd1
+                                                                         const char   *token,
978dd1
                                                                          GError      **error);
978dd1
 
978dd1
 static OstreeRepo * flatpak_dir_create_child_repo (FlatpakDir   *self,
978dd1
@@ -8602,6 +8603,7 @@ flatpak_dir_deploy_update (FlatpakDir   *self,
978dd1
 static FlatpakOciRegistry *
978dd1
 flatpak_dir_create_system_child_oci_registry (FlatpakDir   *self,
978dd1
                                               GLnxLockFile *file_lock,
978dd1
+                                              const char   *token,
978dd1
                                               GError      **error)
978dd1
 {
978dd1
   g_autoptr(GFile) cache_dir = NULL;
978dd1
@@ -8636,6 +8638,8 @@ flatpak_dir_create_system_child_oci_registry (FlatpakDir   *self,
978dd1
   if (new_registry == NULL)
978dd1
     return NULL;
978dd1
 
978dd1
+  flatpak_oci_registry_set_token (new_registry, token);
978dd1
+
978dd1
   return g_steal_pointer (&new_registry);
978dd1
 }
978dd1
 
978dd1
@@ -8952,7 +8956,7 @@ flatpak_dir_install (FlatpakDir          *self,
978dd1
           g_autoptr(FlatpakOciRegistry) registry = NULL;
978dd1
           g_autoptr(GFile) registry_file = NULL;
978dd1
 
978dd1
-          registry = flatpak_dir_create_system_child_oci_registry (self, &child_repo_lock, error);
978dd1
+          registry = flatpak_dir_create_system_child_oci_registry (self, &child_repo_lock, token, error);
978dd1
           if (registry == NULL)
978dd1
             return FALSE;
978dd1
 
978dd1
@@ -9662,7 +9666,7 @@ flatpak_dir_update (FlatpakDir                           *self,
978dd1
           g_autoptr(FlatpakOciRegistry) registry = NULL;
978dd1
           g_autoptr(GFile) registry_file = NULL;
978dd1
 
978dd1
-          registry = flatpak_dir_create_system_child_oci_registry (self, &child_repo_lock, error);
978dd1
+          registry = flatpak_dir_create_system_child_oci_registry (self, &child_repo_lock, token, error);
978dd1
           if (registry == NULL)
978dd1
             return FALSE;
978dd1
 
978dd1
diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c
978dd1
index fdeee56bd..c3ddb8c2b 100644
978dd1
--- a/common/flatpak-oci-registry.c
978dd1
+++ b/common/flatpak-oci-registry.c
978dd1
@@ -223,8 +223,15 @@ flatpak_oci_registry_set_token (FlatpakOciRegistry *self,
978dd1
 {
978dd1
   g_free (self->token);
978dd1
   self->token = g_strdup (token);
978dd1
+
978dd1
+  if (self->token)
978dd1
+    (void)glnx_file_replace_contents_at (self->dfd, ".token",
978dd1
+                                         (guchar *)self->token,
978dd1
+                                         strlen (self->token),
978dd1
+                                         0, NULL, NULL);
978dd1
 }
978dd1
 
978dd1
+
978dd1
 FlatpakOciRegistry *
978dd1
 flatpak_oci_registry_new (const char   *uri,
978dd1
                           gboolean      for_write,
978dd1
@@ -415,6 +422,7 @@ flatpak_oci_registry_ensure_local (FlatpakOciRegistry *self,
978dd1
   int dfd;
978dd1
   g_autoptr(GError) local_error = NULL;
978dd1
   g_autoptr(GBytes) oci_layout_bytes = NULL;
978dd1
+  g_autoptr(GBytes) token_bytes = NULL;
978dd1
   gboolean not_json;
978dd1
 
978dd1
   if (self->dfd != -1)
978dd1
@@ -476,6 +484,13 @@ flatpak_oci_registry_ensure_local (FlatpakOciRegistry *self,
978dd1
   else if (!verify_oci_version (oci_layout_bytes, &not_json, cancellable, error))
978dd1
     return FALSE;
978dd1
 
978dd1
+  if (self->dfd != -1)
978dd1
+    {
978dd1
+      token_bytes = local_load_file (self->dfd, ".token", cancellable, NULL);
978dd1
+      if (token_bytes != NULL)
978dd1
+        self->token = g_strndup (g_bytes_get_data (token_bytes, NULL), g_bytes_get_size (token_bytes));
978dd1
+    }
978dd1
+
978dd1
   if (self->dfd == -1 && local_dfd != -1)
978dd1
     self->dfd = glnx_steal_fd (&local_dfd);
978dd1
 
978dd1
978dd1
From 36f87863baa848c8709b75958c85857f45e97e0a Mon Sep 17 00:00:00 2001
978dd1
From: Alexander Larsson <alexl@redhat.com>
978dd1
Date: Thu, 11 Jun 2020 15:43:16 +0200
978dd1
Subject: [PATCH 5/7] OCI: Also look for the docker media type when looking
978dd1
 manifests
978dd1
978dd1
We handle both types, so look for both.
978dd1
978dd1
(cherry picked from commit 0fdec95fe068cd497b1c5a5b60d21103c711d2a4)
978dd1
---
978dd1
 common/flatpak-json-oci.c | 3 ++-
978dd1
 1 file changed, 2 insertions(+), 1 deletion(-)
978dd1
978dd1
diff --git a/common/flatpak-json-oci.c b/common/flatpak-json-oci.c
978dd1
index 6d60279d0..f5b3f0a0c 100644
978dd1
--- a/common/flatpak-json-oci.c
978dd1
+++ b/common/flatpak-json-oci.c
978dd1
@@ -469,7 +469,8 @@ const char *
978dd1
 flatpak_oci_manifest_descriptor_get_ref (FlatpakOciManifestDescriptor *m)
978dd1
 {
978dd1
   if (m->parent.mediatype == NULL ||
978dd1
-      strcmp (m->parent.mediatype, FLATPAK_OCI_MEDIA_TYPE_IMAGE_MANIFEST) != 0)
978dd1
+      (strcmp (m->parent.mediatype, FLATPAK_OCI_MEDIA_TYPE_IMAGE_MANIFEST) != 0 &&
978dd1
+       strcmp (m->parent.mediatype, FLATPAK_DOCKER_MEDIA_TYPE_IMAGE_MANIFEST2) != 0))
978dd1
     return NULL;
978dd1
 
978dd1
   if (m->parent.annotations == NULL)
978dd1
978dd1
From 0da4a6c82c16d4560d4931d567e2685efd8dff0d Mon Sep 17 00:00:00 2001
978dd1
From: Alexander Larsson <alexl@redhat.com>
978dd1
Date: Mon, 4 May 2020 15:51:48 +0200
978dd1
Subject: [PATCH 6/7] tests: Make OCI authenticator available
978dd1
978dd1
(cherry picked from commit 4d79110cb682b79819913aa6ce033cb7a7787c86)
978dd1
---
978dd1
 tests/Makefile.am.inc | 7 ++++++-
978dd1
 1 file changed, 6 insertions(+), 1 deletion(-)
978dd1
978dd1
diff --git a/tests/Makefile.am.inc b/tests/Makefile.am.inc
978dd1
index 7c2e8271f..15f521485 100644
978dd1
--- a/tests/Makefile.am.inc
978dd1
+++ b/tests/Makefile.am.inc
978dd1
@@ -105,11 +105,15 @@ tests/services/org.flatpak.Authenticator.test.service: tests/org.flatpak.Authent
978dd1
 	mkdir -p tests/services
978dd1
 	$(AM_V_GEN) $(SED) -e "s|\@libexecdir\@|$(abs_top_builddir)/tests|" $< > $@
978dd1
 
978dd1
+tests/services/org.flatpak.Authenticator.Oci.service: oci-authenticator/org.flatpak.Authenticator.Oci.service.in
978dd1
+	mkdir -p tests/services
978dd1
+	$(AM_V_GEN) $(SED) -e "s|\@libexecdir\@|$(abs_top_builddir)|" $< > $@
978dd1
+
978dd1
 tests/share/xdg-desktop-portal/portals/test.portal: tests/test.portal.in
978dd1
 	mkdir -p tests/share/xdg-desktop-portal/portals
978dd1
 	$(AM_V_GEN) install -m644 $< $@
978dd1
 
978dd1
-tests/libtest.sh: tests/services/org.freedesktop.Flatpak.service tests/services/org.freedesktop.Flatpak.SystemHelper.service tests/services/org.freedesktop.portal.Flatpak.service tests/share/xdg-desktop-portal/portals/test.portal tests/services/org.freedesktop.impl.portal.desktop.test.service tests/services/org.flatpak.Authenticator.test.service
978dd1
+tests/libtest.sh: tests/services/org.freedesktop.Flatpak.service tests/services/org.freedesktop.Flatpak.SystemHelper.service tests/services/org.freedesktop.portal.Flatpak.service tests/share/xdg-desktop-portal/portals/test.portal tests/services/org.freedesktop.impl.portal.desktop.test.service tests/services/org.flatpak.Authenticator.test.service tests/services/org.flatpak.Authenticator.Oci.service
978dd1
 
978dd1
 install-test-data-hook:
978dd1
 if ENABLE_INSTALLED_TESTS
978dd1
@@ -223,6 +227,7 @@ DISTCLEANFILES += \
978dd1
 	tests/services/org.freedesktop.portal.Flatpak.service \
978dd1
 	tests/services/org.freedesktop.impl.portal.desktop.test.service \
978dd1
 	tests/services/org.flatpak.Authenticator.test.service \
978dd1
+	tests/services/org.flatpak.Authenticator.Oci.service \
978dd1
 	tests/share/xdg-desktop-portal/portals/test.portal \
978dd1
 	tests/package_version.txt \
978dd1
 	$(NULL)
978dd1
978dd1
From 8fb4369439e57cc25c706610c5ce1ee776220278 Mon Sep 17 00:00:00 2001
978dd1
From: Alexander Larsson <alexl@redhat.com>
978dd1
Date: Mon, 4 May 2020 15:51:59 +0200
978dd1
Subject: [PATCH 7/7] Tests: Support HEAD requests in oci-registry-server
978dd1
978dd1
This just does a GET, which is not quite right, but will work.
978dd1
This is needed for the authenticator.
978dd1
978dd1
(cherry picked from commit 530475b9abff81d990424ca46ec57458e1bb9604)
978dd1
---
978dd1
 tests/oci-registry-server.py | 3 +++
978dd1
 1 file changed, 3 insertions(+)
978dd1
978dd1
diff --git a/tests/oci-registry-server.py b/tests/oci-registry-server.py
978dd1
index 23c2db916..33c3b646b 100755
978dd1
--- a/tests/oci-registry-server.py
978dd1
+++ b/tests/oci-registry-server.py
978dd1
@@ -135,6 +135,9 @@ def do_GET(self):
978dd1
             else:
978dd1
                 self.wfile.write(response_string.encode('utf-8'))
978dd1
 
978dd1
+    def do_HEAD(self):
978dd1
+        return self.do_GET()
978dd1
+
978dd1
     def do_POST(self):
978dd1
         if self.check_route('/testing/@repo_name/@tag'):
978dd1
             repo_name = self.matches['repo_name']