summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorPhaedrus Leeds <mwleeds@protonmail.com>2022-04-08 17:18:34 -0700
committerSimon McVittie <smcv@debian.org>2022-04-21 20:53:46 +0100
commit23926b7090cc307ecb68423ed13dd37ed78737b5 (patch)
treec95cd60b83bbb57246a767edbf92b087a2d660d8 /app
parent9e6b28daf59e6c3c0b8f8af886140d9d556b4c2e (diff)
downloadflatpak-23926b7090cc307ecb68423ed13dd37ed78737b5.tar.gz
app: Disable fuzzy ref matching when id has a slash
Fixes https://github.com/flatpak/flatpak/issues/4829
Diffstat (limited to 'app')
-rw-r--r--app/flatpak-builtins-install.c41
-rw-r--r--app/flatpak-builtins-uninstall.c27
2 files changed, 52 insertions, 16 deletions
diff --git a/app/flatpak-builtins-install.c b/app/flatpak-builtins-install.c
index 17414f5f..5c1355da 100644
--- a/app/flatpak-builtins-install.c
+++ b/app/flatpak-builtins-install.c
@@ -376,11 +376,17 @@ flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GErro
FlatpakDir *this_dir = g_ptr_array_index (dirs, i);
g_auto(GStrv) remotes = NULL;
guint j = 0;
+ FindMatchingRefsFlags matching_refs_flags;
remotes = flatpak_dir_list_remotes (this_dir, cancellable, error);
if (remotes == NULL)
return FALSE;
+ if (strchr (argv[1], '/') != NULL)
+ matching_refs_flags = FIND_MATCHING_REFS_FLAGS_NONE;
+ else
+ matching_refs_flags = FIND_MATCHING_REFS_FLAGS_FUZZY;
+
for (j = 0; remotes[j] != NULL; j++)
{
const char *this_remote = remotes[j];
@@ -404,7 +410,7 @@ flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GErro
if (opt_no_pull)
refs = flatpak_dir_find_local_refs (this_dir, this_remote, id, branch, this_default_branch, arch,
flatpak_get_default_arch (),
- matched_kinds, FIND_MATCHING_REFS_FLAGS_FUZZY,
+ matched_kinds, matching_refs_flags,
cancellable, &local_error);
else
{
@@ -416,7 +422,7 @@ flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GErro
refs = flatpak_dir_find_remote_refs (this_dir, state, id, branch, this_default_branch, arch,
flatpak_get_default_arch (),
- matched_kinds, FIND_MATCHING_REFS_FLAGS_FUZZY,
+ matched_kinds, matching_refs_flags,
cancellable, &local_error);
if (refs == NULL)
{
@@ -436,7 +442,7 @@ flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GErro
}
if (remote_dir_pairs->len == 0)
- return flatpak_fail (error, _("No remote refs found similar to ā€˜%sā€™"), argv[1]);
+ return flatpak_fail (error, _("No remote refs found for ā€˜%sā€™"), argv[1]);
if (!flatpak_resolve_matching_remotes (remote_dir_pairs, argv[1], &chosen_pair, error))
return FALSE;
@@ -495,18 +501,33 @@ flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GErro
g_autofree char *ref = NULL;
g_autoptr(GPtrArray) refs = NULL;
g_autoptr(GError) local_error = NULL;
+ FindMatchingRefsFlags matching_refs_flags;
- flatpak_split_partial_ref_arg_novalidate (pref, kinds, opt_arch, target_branch,
- &matched_kinds, &id, &arch, &branch);
+ if (strchr (pref, '/') != NULL)
+ matching_refs_flags = FIND_MATCHING_REFS_FLAGS_NONE;
+ else
+ matching_refs_flags = FIND_MATCHING_REFS_FLAGS_FUZZY;
+
+ if (matching_refs_flags & FIND_MATCHING_REFS_FLAGS_FUZZY)
+ {
+ flatpak_split_partial_ref_arg_novalidate (pref, kinds, opt_arch, target_branch,
+ &matched_kinds, &id, &arch, &branch);
- /* We used _novalidate so that the id can be partial, but we can still validate the branch */
- if (branch != NULL && !flatpak_is_valid_branch (branch, -1, &local_error))
- return flatpak_fail_error (error, FLATPAK_ERROR_INVALID_REF, _("Invalid branch %s: %s"), branch, local_error->message);
+ /* We used _novalidate so that the id can be partial, but we can still validate the branch */
+ if (branch != NULL && !flatpak_is_valid_branch (branch, -1, &local_error))
+ return flatpak_fail_error (error, FLATPAK_ERROR_INVALID_REF,
+ _("Invalid branch %s: %s"), branch, local_error->message);
+ }
+ else if (!flatpak_split_partial_ref_arg (pref, kinds, opt_arch, target_branch,
+ &matched_kinds, &id, &arch, &branch, error))
+ {
+ return FALSE;
+ }
if (opt_no_pull)
refs = flatpak_dir_find_local_refs (dir, remote, id, branch, default_branch, arch,
flatpak_get_default_arch (),
- matched_kinds, FIND_MATCHING_REFS_FLAGS_FUZZY,
+ matched_kinds, matching_refs_flags,
cancellable, error);
else
{
@@ -519,7 +540,7 @@ flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GErro
refs = flatpak_dir_find_remote_refs (dir, state, id, branch, default_branch, arch,
flatpak_get_default_arch (),
- matched_kinds, FIND_MATCHING_REFS_FLAGS_FUZZY,
+ matched_kinds, matching_refs_flags,
cancellable, error);
if (refs == NULL)
return FALSE;
diff --git a/app/flatpak-builtins-uninstall.c b/app/flatpak-builtins-uninstall.c
index 79a8bdea..3e177bc2 100644
--- a/app/flatpak-builtins-uninstall.c
+++ b/app/flatpak-builtins-uninstall.c
@@ -282,15 +282,30 @@ flatpak_builtin_uninstall (int argc, char **argv, GCancellable *cancellable, GEr
UninstallDir *udir = NULL;
gboolean found_exact_name_match = FALSE;
g_autoptr(GPtrArray) chosen_pairs = NULL;
+ FindMatchingRefsFlags matching_refs_flags;
pref = prefs[j];
- flatpak_split_partial_ref_arg_novalidate (pref, kinds, opt_arch, default_branch,
- &matched_kinds, &match_id, &match_arch, &match_branch);
+ if (strchr (pref, '/') != NULL)
+ matching_refs_flags = FIND_MATCHING_REFS_FLAGS_NONE;
+ else
+ matching_refs_flags = FIND_MATCHING_REFS_FLAGS_FUZZY;
- /* We used _novalidate so that the id can be partial, but we can still validate the branch */
- if (match_branch != NULL && !flatpak_is_valid_branch (match_branch, -1, &local_error))
- return flatpak_fail_error (error, FLATPAK_ERROR_INVALID_REF, _("Invalid branch %s: %s"), match_branch, local_error->message);
+ if (matching_refs_flags & FIND_MATCHING_REFS_FLAGS_FUZZY)
+ {
+ flatpak_split_partial_ref_arg_novalidate (pref, kinds, opt_arch, default_branch,
+ &matched_kinds, &match_id, &match_arch, &match_branch);
+
+ /* We used _novalidate so that the id can be partial, but we can still validate the branch */
+ if (match_branch != NULL && !flatpak_is_valid_branch (match_branch, -1, &local_error))
+ return flatpak_fail_error (error, FLATPAK_ERROR_INVALID_REF,
+ _("Invalid branch %s: %s"), match_branch, local_error->message);
+ }
+ else if (!flatpak_split_partial_ref_arg (pref, kinds, opt_arch, default_branch,
+ &matched_kinds, &match_id, &match_arch, &match_branch, error))
+ {
+ return FALSE;
+ }
ref_dir_pairs = g_ptr_array_new_with_free_func ((GDestroyNotify) ref_dir_pair_free);
for (k = 0; k < dirs->len; k++)
@@ -299,7 +314,7 @@ flatpak_builtin_uninstall (int argc, char **argv, GCancellable *cancellable, GEr
g_autoptr(GPtrArray) refs = NULL;
refs = flatpak_dir_find_installed_refs (dir, match_id, match_branch, match_arch, kinds,
- FIND_MATCHING_REFS_FLAGS_FUZZY, error);
+ matching_refs_flags, error);
if (refs == NULL)
return FALSE;
else if (refs->len == 0)