diff options
author | Phaedrus Leeds <mwleeds@protonmail.com> | 2022-04-08 17:18:34 -0700 |
---|---|---|
committer | Simon McVittie <smcv@debian.org> | 2022-04-21 20:53:46 +0100 |
commit | 23926b7090cc307ecb68423ed13dd37ed78737b5 (patch) | |
tree | c95cd60b83bbb57246a767edbf92b087a2d660d8 /app | |
parent | 9e6b28daf59e6c3c0b8f8af886140d9d556b4c2e (diff) | |
download | flatpak-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.c | 41 | ||||
-rw-r--r-- | app/flatpak-builtins-uninstall.c | 27 |
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) |