Blame SOURCES/flatpak-empty-var-lib-flatpak.patch

191837
From 6c50142ee524fc8c82e565b09f1e9223a41fb599 Mon Sep 17 00:00:00 2001
191837
From: Simon McVittie <smcv@collabora.com>
191837
Date: Tue, 8 Feb 2022 14:04:50 +0000
191837
Subject: [PATCH 1/7] dir: Pass cancellable through to remote EnsureRepo call
191837
191837
Signed-off-by: Simon McVittie <smcv@collabora.com>
191837
(cherry picked from commit 15c1d4f8cb8bf8266b454a9789fe589c645a5480)
191837
---
191837
 common/flatpak-dir.c | 4 ++--
191837
 1 file changed, 2 insertions(+), 2 deletions(-)
191837
191837
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
191837
index 965e1ca5376b..bc348b51a7e6 100644
191837
--- a/common/flatpak-dir.c
191837
+++ b/common/flatpak-dir.c
191837
@@ -3943,7 +3943,7 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
           if (!flatpak_dir_system_helper_call_ensure_repo (self,
191837
                                                            FLATPAK_HELPER_ENSURE_REPO_FLAGS_NONE,
191837
                                                            installation ? installation : "",
191837
-                                                           NULL, &local_error))
191837
+                                                           cancellable, &local_error))
191837
             {
191837
               if (allow_empty)
191837
                 return TRUE;
191837
@@ -4087,7 +4087,7 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
           if (!flatpak_dir_system_helper_call_ensure_repo (self,
191837
                                                            FLATPAK_HELPER_ENSURE_REPO_FLAGS_NONE,
191837
                                                            installation ? installation : "",
191837
-                                                           NULL, &my_error))
191837
+                                                           cancellable, &my_error))
191837
             {
191837
               if (allow_empty)
191837
                 return TRUE;
191837
-- 
191837
2.34.1
191837
191837
191837
From 03f16b300e662afd324d3afab04a95186bf31e07 Mon Sep 17 00:00:00 2001
191837
From: Simon McVittie <smcv@collabora.com>
191837
Date: Tue, 8 Feb 2022 14:09:05 +0000
191837
Subject: [PATCH 2/7] dir: Factor out common code to call EnsureRepo on system
191837
 helper
191837
191837
Signed-off-by: Simon McVittie <smcv@collabora.com>
191837
(cherry picked from commit 951b111d2627c6f62bfb5e20d86974beadcf2587)
191837
---
191837
 common/flatpak-dir.c | 54 +++++++++++++++++++++++---------------------
191837
 1 file changed, 28 insertions(+), 26 deletions(-)
191837
191837
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
191837
index bc348b51a7e6..8f7b7f011048 100644
191837
--- a/common/flatpak-dir.c
191837
+++ b/common/flatpak-dir.c
191837
@@ -3918,6 +3918,30 @@ apply_new_flatpakrepo (const char *remote_name,
191837
   return TRUE;
191837
 }
191837
 
191837
+static gboolean
191837
+system_helper_maybe_ensure_repo (FlatpakDir *self,
191837
+                                 gboolean allow_empty,
191837
+                                 GCancellable *cancellable,
191837
+                                 GError **error)
191837
+{
191837
+  g_autoptr(GError) local_error = NULL;
191837
+  const char *installation = flatpak_dir_get_id (self);
191837
+
191837
+  if (!flatpak_dir_system_helper_call_ensure_repo (self,
191837
+                                                   FLATPAK_HELPER_ENSURE_REPO_FLAGS_NONE,
191837
+                                                   installation ? installation : "",
191837
+                                                   cancellable, &local_error))
191837
+    {
191837
+      if (allow_empty)
191837
+        return TRUE;
191837
+
191837
+      g_propagate_error (error, g_steal_pointer (&local_error));
191837
+      return FALSE;
191837
+    }
191837
+
191837
+  return TRUE;
191837
+}
191837
+
191837
 static gboolean
191837
 _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
                           gboolean      allow_empty,
191837
@@ -3937,20 +3961,8 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
     {
191837
       if (flatpak_dir_use_system_helper (self, NULL))
191837
         {
191837
-          g_autoptr(GError) local_error = NULL;
191837
-          const char *installation = flatpak_dir_get_id (self);
191837
-
191837
-          if (!flatpak_dir_system_helper_call_ensure_repo (self,
191837
-                                                           FLATPAK_HELPER_ENSURE_REPO_FLAGS_NONE,
191837
-                                                           installation ? installation : "",
191837
-                                                           cancellable, &local_error))
191837
-            {
191837
-              if (allow_empty)
191837
-                return TRUE;
191837
-
191837
-              g_propagate_error (error, g_steal_pointer (&local_error));
191837
-              return FALSE;
191837
-            }
191837
+          if (!system_helper_maybe_ensure_repo (self, allow_empty, cancellable, error))
191837
+            return FALSE;
191837
         }
191837
       else
191837
         {
191837
@@ -4083,18 +4095,8 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
     {
191837
       if (flatpak_dir_use_system_helper (self, NULL))
191837
         {
191837
-          const char *installation = flatpak_dir_get_id (self);
191837
-          if (!flatpak_dir_system_helper_call_ensure_repo (self,
191837
-                                                           FLATPAK_HELPER_ENSURE_REPO_FLAGS_NONE,
191837
-                                                           installation ? installation : "",
191837
-                                                           cancellable, &my_error))
191837
-            {
191837
-              if (allow_empty)
191837
-                return TRUE;
191837
-
191837
-              g_propagate_error (error, g_steal_pointer (&my_error));
191837
-              return FALSE;
191837
-            }
191837
+          if (!system_helper_maybe_ensure_repo (self, allow_empty, cancellable, error))
191837
+            return FALSE;
191837
 
191837
           if (!ostree_repo_reload_config (repo, cancellable, error))
191837
             return FALSE;
191837
-- 
191837
2.34.1
191837
191837
191837
From 46d2abd78561c9a1686896292a19280d09deaf77 Mon Sep 17 00:00:00 2001
191837
From: Simon McVittie <smcv@collabora.com>
191837
Date: Tue, 8 Feb 2022 14:12:01 +0000
191837
Subject: [PATCH 3/7] dir: Factor out function to open the libostree repository
191837
191837
I'm about to add another caller for this.
191837
191837
Signed-off-by: Simon McVittie <smcv@collabora.com>
191837
(cherry picked from commit 8537b3412ad70479b16ad2c880c73ba37daf80d0)
191837
---
191837
 common/flatpak-dir.c | 27 +++++++++++++++++++--------
191837
 1 file changed, 19 insertions(+), 8 deletions(-)
191837
191837
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
191837
index 8f7b7f011048..f44241c40290 100644
191837
--- a/common/flatpak-dir.c
191837
+++ b/common/flatpak-dir.c
191837
@@ -3942,6 +3942,23 @@ system_helper_maybe_ensure_repo (FlatpakDir *self,
191837
   return TRUE;
191837
 }
191837
 
191837
+static gboolean
191837
+ensure_repo_opened (OstreeRepo *repo,
191837
+                    GCancellable *cancellable,
191837
+                    GError **error)
191837
+{
191837
+  if (!ostree_repo_open (repo, cancellable, error))
191837
+    {
191837
+      g_autofree char *repopath = NULL;
191837
+
191837
+      repopath = g_file_get_path (ostree_repo_get_path (repo));
191837
+      g_prefix_error (error, _("While opening repository %s: "), repopath);
191837
+      return FALSE;
191837
+    }
191837
+
191837
+  return TRUE;
191837
+}
191837
+
191837
 static gboolean
191837
 _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
                           gboolean      allow_empty,
191837
@@ -4008,14 +4025,8 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
     }
191837
   else
191837
     {
191837
-      if (!ostree_repo_open (repo, cancellable, error))
191837
-        {
191837
-          g_autofree char *repopath = NULL;
191837
-
191837
-          repopath = g_file_get_path (repodir);
191837
-          g_prefix_error (error, _("While opening repository %s: "), repopath);
191837
-          return FALSE;
191837
-        }
191837
+      if (!ensure_repo_opened (repo, cancellable, error))
191837
+        return FALSE;
191837
     }
191837
 
191837
   /* In the system-helper case we're directly using the global repo, and we can't write any
191837
-- 
191837
2.34.1
191837
191837
191837
From 4c831cad673e3271aafcb03da717515aec197636 Mon Sep 17 00:00:00 2001
191837
From: Simon McVittie <smcv@collabora.com>
191837
Date: Tue, 8 Feb 2022 16:39:06 +0000
191837
Subject: [PATCH 4/7] dir: Use system helper to create system repo if necessary
191837
191837
Previously, if /var/lib/flatpak didn't exist then we would use the
191837
system helper to create and populate it, but if it existed and was empty,
191837
we could only populate it if we had privileges. This led to errors from
191837
libostree:
191837
191837
    Creating repo: mkdirat: Permission denied
191837
191837
The EnsureRepo method call is allowed by default for active local users,
191837
so do this even if allow_empty is true: this will incorporate
191837
/etc/flatpak/remotes.d into the repository, whether it is newly-created
191837
or not. This makes a `flatpak search` work immediately, without having
191837
to fetch metadata explicitly.
191837
191837
Signed-off-by: Simon McVittie <smcv@collabora.com>
191837
(cherry picked from commit 2489b915efae3a78ca7040c39161f8c304e4c7a5)
191837
---
191837
 common/flatpak-dir.c | 35 +++++++++++++++++++++++------------
191837
 1 file changed, 23 insertions(+), 12 deletions(-)
191837
191837
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
191837
index f44241c40290..aef3a75392dc 100644
191837
--- a/common/flatpak-dir.c
191837
+++ b/common/flatpak-dir.c
191837
@@ -4005,22 +4005,33 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
          that still user bare-user */
191837
       OstreeRepoMode mode = OSTREE_REPO_MODE_BARE_USER_ONLY;
191837
 
191837
-      if (!ostree_repo_create (repo, mode, cancellable, &my_error))
191837
+      if (flatpak_dir_use_system_helper (self, NULL))
191837
         {
191837
-          flatpak_rm_rf (repodir, cancellable, NULL);
191837
-
191837
-          if (allow_empty)
191837
-            return TRUE;
191837
+          if (!system_helper_maybe_ensure_repo (self, allow_empty, cancellable, error))
191837
+            return FALSE;
191837
 
191837
-          g_propagate_error (error, g_steal_pointer (&my_error));
191837
-          return FALSE;
191837
+          if (!ensure_repo_opened (repo, cancellable, error))
191837
+            return FALSE;
191837
         }
191837
-
191837
-      /* Create .changed file early to avoid polling non-existing file in monitor */
191837
-      if (!flatpak_dir_mark_changed (self, &my_error))
191837
+      else
191837
         {
191837
-          g_warning ("Error marking directory as changed: %s", my_error->message);
191837
-          g_clear_error (&my_error);
191837
+          if (!ostree_repo_create (repo, mode, cancellable, &my_error))
191837
+            {
191837
+              flatpak_rm_rf (repodir, cancellable, NULL);
191837
+
191837
+              if (allow_empty)
191837
+                return TRUE;
191837
+
191837
+              g_propagate_error (error, g_steal_pointer (&my_error));
191837
+              return FALSE;
191837
+            }
191837
+
191837
+          /* Create .changed file early to avoid polling non-existing file in monitor */
191837
+          if (!flatpak_dir_mark_changed (self, &my_error))
191837
+            {
191837
+              g_warning ("Error marking directory as changed: %s", my_error->message);
191837
+              g_clear_error (&my_error);
191837
+            }
191837
         }
191837
     }
191837
   else
191837
-- 
191837
2.34.1
191837
191837
191837
From 30b7778dc412143a8f06052298f63bdeb7bd5186 Mon Sep 17 00:00:00 2001
191837
From: Simon McVittie <smcv@collabora.com>
191837
Date: Tue, 8 Feb 2022 16:11:31 +0000
191837
Subject: [PATCH 5/7] dir: Avoid polkit prompts for EnsureRepo in most CLI
191837
 commands
191837
191837
If we are running a CLI command in the background, then EnsureRepo
191837
might require authorization. Silently skip it if allow_empty was true,
191837
as it is for commands that iterate through all repositories.
191837
191837
Signed-off-by: Simon McVittie <smcv@collabora.com>
191837
(cherry picked from commit 48f40d45045071c0e073061b72a1c32fb0562c3f)
191837
---
191837
 common/flatpak-dir.c | 14 ++++++++++----
191837
 1 file changed, 10 insertions(+), 4 deletions(-)
191837
191837
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
191837
index aef3a75392dc..597f8906b1ce 100644
191837
--- a/common/flatpak-dir.c
191837
+++ b/common/flatpak-dir.c
191837
@@ -3920,6 +3920,7 @@ apply_new_flatpakrepo (const char *remote_name,
191837
 
191837
 static gboolean
191837
 system_helper_maybe_ensure_repo (FlatpakDir *self,
191837
+                                 FlatpakHelperEnsureRepoFlags flags,
191837
                                  gboolean allow_empty,
191837
                                  GCancellable *cancellable,
191837
                                  GError **error)
191837
@@ -3928,7 +3929,7 @@ system_helper_maybe_ensure_repo (FlatpakDir *self,
191837
   const char *installation = flatpak_dir_get_id (self);
191837
 
191837
   if (!flatpak_dir_system_helper_call_ensure_repo (self,
191837
-                                                   FLATPAK_HELPER_ENSURE_REPO_FLAGS_NONE,
191837
+                                                   flags,
191837
                                                    installation ? installation : "",
191837
                                                    cancellable, &local_error))
191837
     {
191837
@@ -3970,15 +3971,20 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
   g_autoptr(GError) my_error = NULL;
191837
   g_autoptr(GFile) cache_dir = NULL;
191837
   g_autoptr(GHashTable) flatpakrepos = NULL;
191837
+  FlatpakHelperEnsureRepoFlags ensure_flags = FLATPAK_HELPER_ENSURE_REPO_FLAGS_NONE;
191837
 
191837
   if (self->repo != NULL)
191837
     return TRUE;
191837
 
191837
+  /* Don't trigger polkit prompts if we are just doing this opportunistically */
191837
+  if (allow_empty)
191837
+    ensure_flags |= FLATPAK_HELPER_ENSURE_REPO_FLAGS_NO_INTERACTION;
191837
+
191837
   if (!g_file_query_exists (self->basedir, cancellable))
191837
     {
191837
       if (flatpak_dir_use_system_helper (self, NULL))
191837
         {
191837
-          if (!system_helper_maybe_ensure_repo (self, allow_empty, cancellable, error))
191837
+          if (!system_helper_maybe_ensure_repo (self, ensure_flags, allow_empty, cancellable, error))
191837
             return FALSE;
191837
         }
191837
       else
191837
@@ -4007,7 +4013,7 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
 
191837
       if (flatpak_dir_use_system_helper (self, NULL))
191837
         {
191837
-          if (!system_helper_maybe_ensure_repo (self, allow_empty, cancellable, error))
191837
+          if (!system_helper_maybe_ensure_repo (self, ensure_flags, allow_empty, cancellable, error))
191837
             return FALSE;
191837
 
191837
           if (!ensure_repo_opened (repo, cancellable, error))
191837
@@ -4117,7 +4123,7 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
     {
191837
       if (flatpak_dir_use_system_helper (self, NULL))
191837
         {
191837
-          if (!system_helper_maybe_ensure_repo (self, allow_empty, cancellable, error))
191837
+          if (!system_helper_maybe_ensure_repo (self, ensure_flags, allow_empty, cancellable, error))
191837
             return FALSE;
191837
 
191837
           if (!ostree_repo_reload_config (repo, cancellable, error))
191837
-- 
191837
2.34.1
191837
191837
191837
From f2747123d890f836cc7f1c5c88edd67b8095f72b Mon Sep 17 00:00:00 2001
191837
From: Simon McVittie <smcv@collabora.com>
191837
Date: Tue, 8 Feb 2022 16:40:49 +0000
191837
Subject: [PATCH 6/7] dir: Include repo path in error message if unable to
191837
 create it
191837
191837
libostree makes heavy use of fd-based I/O, which has the disadvantage
191837
that it is rarely obvious what path an error message is referring to.
191837
191837
Signed-off-by: Simon McVittie <smcv@collabora.com>
191837
(cherry picked from commit d106384446ae57c78a76f4a0a0360797df62c31f)
191837
---
191837
 common/flatpak-dir.c | 14 +++++++++++++-
191837
 1 file changed, 13 insertions(+), 1 deletion(-)
191837
191837
diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c
191837
index 597f8906b1ce..f6a43aafa612 100644
191837
--- a/common/flatpak-dir.c
191837
+++ b/common/flatpak-dir.c
191837
@@ -4023,12 +4023,24 @@ _flatpak_dir_ensure_repo (FlatpakDir   *self,
191837
         {
191837
           if (!ostree_repo_create (repo, mode, cancellable, &my_error))
191837
             {
191837
+              const char *repo_path = flatpak_file_get_path_cached (repodir);
191837
+
191837
               flatpak_rm_rf (repodir, cancellable, NULL);
191837
 
191837
               if (allow_empty)
191837
                 return TRUE;
191837
 
191837
-              g_propagate_error (error, g_steal_pointer (&my_error));
191837
+              /* As of 2022, the error message from libostree is not the most helpful:
191837
+               * Creating repo: mkdirat: Permission denied
191837
+               * If the repository path is in the error message, assume this
191837
+               * has been fixed. If not, add it. */
191837
+              if (strstr (my_error->message, repo_path) != NULL)
191837
+                g_propagate_error (error, g_steal_pointer (&my_error));
191837
+              else
191837
+                g_set_error (error, my_error->domain, my_error->code,
191837
+                             "Unable to create repository at %s (%s)",
191837
+                             repo_path, my_error->message);
191837
+
191837
               return FALSE;
191837
             }
191837
 
191837
-- 
191837
2.34.1
191837
191837
191837
From 4772e9935f5a2b2178efa3005027b19e997ec8e5 Mon Sep 17 00:00:00 2001
191837
From: Simon McVittie <smcv@collabora.com>
191837
Date: Tue, 8 Feb 2022 14:47:24 +0000
191837
Subject: [PATCH 7/7] app: Make ALL_DIRS and STANDARD_DIRS imply OPTIONAL_REPO
191837
191837
It is already the case that when we are using ALL_DIRS, we always
191837
combine it with OPTIONAL_REPO, meaning no need to populate empty
191837
installations. ALL_DIRS is used for commands that iterate through all
191837
known installations to enumerate apps/runtimes, such as `flatpak run`
191837
and `flatpak list`; for these commands, it's reasonable to say that
191837
if the installation does not have a libostree repository, then that's
191837
equivalent to it having a libostree repository with no apps and no
191837
runtimes. Make this happen automatically if forgotten.
191837
191837
For STANDARD_DIRS, we were inconsistent about this: `flatpak remote-list`
191837
had OPTIONAL_REPO, but the other commands did not.
191837
STANDARD_DIRS is used for `flatpak create-usb`, and for all the commands
191837
that manipulate remotes.
191837
191837
For the commands that manipulate remotes, it seems reasonable to say
191837
that if an installation has no libostree repository and we are unable
191837
to create one, then that's equivalent to an installation with a
191837
libostree repository but no remotes.
191837
191837
Similarly, for create-usb, an installation where we are unable to create
191837
a libostree repository seems like it should be equivalent to an
191837
installation whose libostree repository does not contain any of the
191837
refs we are interested in.
191837
191837
Resolves: https://github.com/flatpak/flatpak/issues/4111
191837
Signed-off-by: Simon McVittie <smcv@collabora.com>
191837
(cherry picked from commit 3f144d1e02fa060680eba18a9dd81969682a3170)
191837
---
191837
 app/flatpak-builtins.h | 6 ++++--
191837
 app/flatpak-main.c     | 4 +++-
191837
 2 files changed, 7 insertions(+), 3 deletions(-)
191837
191837
diff --git a/app/flatpak-builtins.h b/app/flatpak-builtins.h
191837
index ec1ac4a4abdb..d925c8cd389e 100644
191837
--- a/app/flatpak-builtins.h
191837
+++ b/app/flatpak-builtins.h
191837
@@ -39,10 +39,12 @@ G_BEGIN_DECLS
191837
  * @FLATPAK_BUILTIN_FLAG_ONE_DIR: Allow a single --user/--system/--installation option
191837
  *    and return a single dir. If no option is specified, default to --system
191837
  * @FLATPAK_BUILTIN_FLAG_STANDARD_DIRS: Allow repeated use of --user/--system/--installation
191837
- *    and return multiple dirs. If no option is specified return system(default)+user
191837
+ *    and return multiple dirs. If no option is specified return system(default)+user.
191837
+ *    Implies %FLATPAK_BUILTIN_FLAG_OPTIONAL_REPO.
191837
  * @FLATPAK_BUILTIN_FLAG_ALL_DIRS: Allow repeated use of --user/--system/--installation
191837
  *    and return multiple dirs. If no option is specified, return all installations,
191837
- *    starting with system(default)+user
191837
+ *    starting with system(default)+user.
191837
+ *    Implies %FLATPAK_BUILTIN_FLAG_OPTIONAL_REPO.
191837
  *
191837
  * Flags affecting the behavior of flatpak_option_context_parse().
191837
  *
191837
diff --git a/app/flatpak-main.c b/app/flatpak-main.c
191837
index e79df52eff25..4b4d65673645 100644
191837
--- a/app/flatpak-main.c
191837
+++ b/app/flatpak-main.c
191837
@@ -460,7 +460,9 @@ flatpak_option_context_parse (GOptionContext     *context,
191837
         {
191837
           FlatpakDir *dir = g_ptr_array_index (dirs, i);
191837
 
191837
-          if (flags & FLATPAK_BUILTIN_FLAG_OPTIONAL_REPO)
191837
+          if (flags & (FLATPAK_BUILTIN_FLAG_OPTIONAL_REPO |
191837
+                       FLATPAK_BUILTIN_FLAG_ALL_DIRS |
191837
+                       FLATPAK_BUILTIN_FLAG_STANDARD_DIRS))
191837
             {
191837
               if (!flatpak_dir_maybe_ensure_repo (dir, cancellable, error))
191837
                 return FALSE;
191837
-- 
191837
2.34.1
191837