1933 Commits

Author SHA1 Message Date
Ryan Gonzalez
e5fb1f85b1 transaction: Don't crash on invalid ref names
It is very much possible for an invalid ref name to occur, either due to
lack of validation on Flatpak creation like #3887, or just any
manually-written ref name due to skipping Flatpak tooling or malicious
intent. Regardless, this shouldn't crash, so check the names before
creating the transaction ops.

Fixes #3887.
2020-11-17 13:19:50 +01:00
Philip Withnall
cde0c57bc5 flatpak-transaction: Don’t update metadata when uninstalling
When uninstalling a single app (an example of a transaction which is
entirely local-only), there’s no need to update the repository metadata
beforehand — but the code was doing that.

This avoids an unnecessary download of the `summary.sig` file (or other
repository metadata, depending on what’s out of date) when uninstalling.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
2020-11-17 13:19:50 +01:00
Philip Withnall
7a1c268405 dir: Fix caching of summary files
Cache hits didn’t result in the cache entry’s timeout being extended,
and timeouts didn’t result in the entry being removed from the cache to
free up resources (even though it would never be returned as a cache hit
again).

Signed-off-by: Philip Withnall <withnall@endlessm.com>
(cherry picked from commit 63b4f3a5c1)
2020-11-17 13:19:50 +01:00
Philip Withnall
1ab69d7032 dir: Fix potential overflow when comparing cache timeouts
Also use a constant to clarify the code a little, although it’s
functionally equivalent.

Signed-off-by: Philip Withnall <withnall@endlessm.com>
(cherry picked from commit 9bec865995)
2020-11-17 13:19:50 +01:00
Phaedrus Leeds
1b0060d357 transaction: Fix ordering of runtime uninstallation
In case a transaction is uninstalling both an app and its runtime,
properly ensure the app is uninstalled first.

(cherry picked from commit c6647c2b14)
2020-11-17 13:19:50 +01:00
Alexander Larsson
97c8ca0a71 Remove should-retry debug spew
Every http operation (even when successfull) was spewing info about
whether to retry it which made it hard to read the logs.

(cherry picked from commit 3ebcd200ca)
2020-11-17 13:19:50 +01:00
Philip Withnall
740e4482c2 http: Return HOST_UNREACHABLE on error 500
Sometimes a server might return a HTTP error 500 (this seems to happen
sometimes with Microsoft’s VSCode server, for example). Map this to
`G_IO_ERROR_HOST_UNREACHABLE` for now, which is a bit more specific than
returning `G_IO_ERROR_FAILED`, but without the hassle of introducing a
new public error domain which could give more detail.

In particular, this should allow gnome-software to show an error message
to the user for such failed downloads, rather than hiding the error and
logging the following:
```
not handling error failed for action download: While downloading http://packages.microsoft.com/repos/vscode/pool/main/c/code/code_1.45.1-1589445302_amd64.deb: Server returned status 500: Internal Server Error
```

Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
(cherry picked from commit 6c79a57114)
2020-11-17 13:19:50 +01:00
Alexander Larsson
333e0518c9 transaction: Fix error handling in authentication failures
We were not correctly returning in case of error, which caused
a cascading "owerwrite gerror" problem.

(cherry picked from commit 33d1d7b1a5)
2020-11-17 13:19:50 +01:00
Alexander Larsson
f4bdcfbbbc Fix extra-data progress reporting
We were never calling the progress callback for extra-data downloaded
bytes.

(cherry picked from commit 7b5a0a5c86)
2020-11-17 13:19:50 +01:00
Alexander Larsson
4e47dba3b3 OCI: Fix progress reporting
Somewhere during the progress reporting cleanup we lost the progress
for OCI pulls, this puts it back.

(cherry picked from commit 7622aab962)
2020-11-17 13:19:50 +01:00
Alexander Larsson
be00050211 Don't loop authentincating if updating to the current version
In case we need to authenticate for updates (in my test case i was
doing an OCI downgrade) we might need to download a commit object (or
in the OCI case a manifest json), so it did a request_required_tokens(),
but that noticed during the flatpak_transaction_normalize_ops() call
that the partial resolve to a particular commit actually was the
same as the local installed commit and marked op->skip = TRUE.

However, when we got back to resolving the op again we didn't actually
look at the skip, so it kept looping wanting (but never doing) auth.

The fix is to just directly resolve ops marked as skipped.

(cherry picked from commit d8086141fb)
2020-11-17 13:19:50 +01:00
Owen W. Taylor
cb7e9cf042 OCI: extract appstream data for runtimes
Runtimes also have appstream data - with description, license information,
and so forth, so we should extract the appstream data from the index
for refs that start with runtime/ as well.

(cherry picked from commit 25ff00994f)
2020-11-17 13:19:50 +01:00
Phaedrus Leeds
636d92ab94 Avoid critical error in remote-info command
Without this patch, the remote-info command will sometimes emit a
critical error "g_utf8_strlen: assertion 'p != NULL || max == 0' failed"
and print (null) for the "Commit:" field, since the commit doesn't get
initialized properly.

(cherry picked from commit 238317d99b)
2020-11-10 15:06:32 +01:00
Phaedrus Leeds
26daeea582 Properly validate configured collection IDs
This commit is a follow-up for the commit "dir: Validate locally
configured collection IDs". Whereas in that commit we validate the
collection ID in flatpak_remote_state_fetch_commit_object(), here we do
it in _flatpak_dir_get_remote_state(), since fetch_commit_object() is
not called on the code path normally taken for a transaction (only if
try_resolve_op_from_metadata() fails and in other niche scenarios).

This should ensure that if someone erroneously sets a collection ID on a
remote, the error will be caught quickly. It also helps the eos-updater
unit tests pass.

(cherry picked from commit 332f75494b)
2020-08-21 13:14:16 +02:00
Alexander Larsson
5c63fba452 run: Fix double free in the cups config file parser
We were returning a g_autofree:d string and it was then also freed
by the parent.

(cherry picked from commit 8c23c90c1e)
2020-08-21 13:14:16 +02:00
Ryan Gonzalez
d1d53eb7b1 run: Avoid hanging if xdg-dbus-proxy startup fails
(cherry picked from commit c95cb1973d)
2020-08-21 13:14:16 +02:00
Alexander Larsson
d608366827 dir: Cache responses from localed and account service
These are system dbus calls that could potentially be somewhat slow
and its unlikely that the local config changes during runtime of the
session (because the desktop really needs a restart to pick up a new
locale). Also, if there are any issues with these (such as #3755) each
call will be the 25sec dbus timeout, which is not great.

Fixes https://github.com/flatpak/flatpak/issues/3792
2020-08-21 13:14:16 +02:00
Simon McVittie
d33c322c35 exports: Try harder to export usrmerge symlinks as symlinks
In applications with --filesystem=host or --filesystem=host-os, the
library directories in /run/host/usr and /run/host/lib* can be used
like a sysroot to inspect the host's library stack, regardless of
whether the host system has undergone the "/usr merge" or not. This is
particularly relevant for Steam's pressure-vessel container tool,
which imports graphics drivers from the host system, or for potential
future work on using host graphics drivers via libcapsule in Flatpak
apps.

The original implementation of this feature assumed that the /usr merge
always creates symbolic links /foo -> /usr/foo or /foo -> usr/foo, for
some value of foo. However, Arch Linux uses a variation of multilib
in which /usr/lib contains 64-bit libraries, and has a non-matching
symbolic link /lib64 -> usr/lib (instead of a chain of symlinks
/lib64 -> usr/lib64 -> lib). Similarly, Arch uses /sbin -> usr/bin
and /usr/sbin -> bin, instead of a chain of symlinks
/sbin -> usr/sbin -> bin.

This led to Flatpak ignoring the symlink and treating it like a directory,
so the host /usr/lib would be bind-mounted on both /run/host/usr/lib and
/run/host/lib64. This is *mostly* equivalent, but whether a directory
is a symlink or a real directory sometimes matters, for example when
evaluating relative symlinks that contain ".."  components; so try harder
to preserve symlinks as symlinks.

Fixes: 08d65c54 "exports: If --filesystem=host, provide /run/host/lib etc."
Signed-off-by: Simon McVittie <smcv@collabora.com>
(cherry picked from commit 12e3dc051f)
2020-08-21 13:14:16 +02:00
Julian Andres Klode
f4c3ea5e97 Fix argument order of clone() for s390x in seccomp filter
clone() is a mad syscall with about 4 different argument orders. While
most of them agree that argument 0 is flags, s390 and s390x have the
flags argument second - A0 is the child stack pointer there.

[smcv: Add an explanatory comment; also test __CRIS__ for completeness]

Bug-Debian: https://bugs.debian.org/964541
Bug-Ubuntu: https://launchpad.net/bugs/1886814
Signed-off-by: Simon McVittie <smcv@collabora.com>
(cherry picked from commit 8ba141c38f)
2020-08-21 13:14:16 +02:00
Matthew Leeds
0f45ac336d dir: Validate locally configured collection IDs
Currently if the user configures a collection ID on a remote which is
incorrect, either because it doesn't match the one configured server
side or because the server doesn't have one configured at all, Flatpak
will not notice the issue and happily still pull from the remote. This
is new since 1.7.1; before that such a problem would be caught because
the server wouldn't provide the ostree-metadata ref for the configured
collection ID.

This commit catches such errors by checking commit metadata, as we
already do for the ref binding metadata. Otherwise such a mismatch would
prevent successful offline distribution of the apps/runtimes provided by
the remote.

The impetus for this is to keep an eos-updater unit test passing with
Flatpak 1.8.x:
"/updater/install-flatpaks-pull-to-repo-error-if-collection-id-invalid"

(cherry picked from commit 1bf5f2ed9e)
2020-08-21 13:14:16 +02:00
Ryan Gonzalez
1af91dee36 run: Don't use userns2 if same as userns
When --device=all is *not* passed to Flatpak, --dev is passed to bwrap,
which causes it to use an intermediate user namespace to mount devpts
because it can only be mounted as UID 0. Therefore, when expose-pids
is used, Flatpak will pass both --userns *and* --userns2 to handle
the presence of the intermediate namespace.

However, when --device=all *is* passed, there is no intermediate
namespace. Thus, setns(userns2) will fail with EINVAL. In order to
handle this, --userns2 is no longer passed if the namespace is
identical to that passed via --userns.

Fixes #3722.

(cherry picked from commit 9833b90019)
2020-07-03 10:18:08 +02:00
Alexander Larsson
259cb6e42f transaction: Don't fail if install returns ALREADY_INSTALLED
We already verify that the ref is not installed on add_ref(), so we
did check for "user error". If the transaction either raced with some
other process, or the install from the install-authentitcator signal
that should not be treated as an error.
2020-06-30 16:32:38 +02:00
Alexander Larsson
6c5c4bff29 transaction: No need to authenticate when an op just is a redeploy 2020-06-30 16:32:38 +02:00
Alexander Larsson
6168fb2e79 transaction: Avoid authentication for no-op updates
Ensure we normalize ops before requesting authentication so we
can trust the op->skip value to be set for no-op updates (which
don't need authentication).
2020-06-30 16:32:38 +02:00
Alexander Larsson
8e631f120b transaction: Break out some code for reuse
This moves the operation normalization code to the
flatpak_transaction_normalize_ops() helper function.
2020-06-30 16:32:38 +02:00
Matthew Leeds
2558b086d7 dir: Fix wrong extension refspecs
Currently Flatpak only supports extensions which come from the same
remote as the thing being extended; for discussion on this see
https://github.com/flatpak/flatpak/issues/861

However in general it isn't clear from the metadata what remote provides
an extension. For example com.endlessm.apps.Platform//5 defines the
extension org.freedesktop.Platform.VAAPI.Intel (inherited from
org.freedesktop.Platform) which can be found on flathub not eos-sdk. So
we don't want to add an extension refspec to the transaction if the
current remote is not the one that actually provides it. In
flatpak_dir_find_remote_related_for_metadata() this invariant is
maintained because we check if the ref exists in the remote before
adding it with add_related(). However in
flatpak_dir_find_local_related_for_metadata() we check for existing
deploy data but omit checking that the deploy origin matches the origin
passed in, and in that case can accidentally add an incorrect refspec to
a transaction. So this commit adds the missing origin check.

One way to reproduce this issue is with this command, having both the
Endless platform and the VAAPI extension already installed:
$ flatpak update --no-pull com.endlessm.apps.Platform//5
Looking for updates…
error: Refspec 'eos-sdk:runtime/org.freedesktop.Platform.VAAPI.Intel/x86_64/1.6' not found

This issue also affects GNOME Software which does a no-deploy
transaction followed by a no-pull transaction (this issue occurs in the
latter) and is treated as fatal causing updates not to be applied.
However it only happens in some niche circumstances, because
flatpak_transaction_add_op() will only use the first remote passed to it
if called more than once for the same ref from different remotes. This
is normally fine; refs generally only come from one remote. But it does
mean this issue only occurs if the extension in question was not already
added to the transaction with a correct origin.
2020-06-30 09:07:19 +02:00
Alexander Larsson
dc4e198766 run: Always expose host /usr/share/zoneinfo (if possible)
Instead of relying on the runtime tzdate we now always expose the host
/usr/share/zoneinfo in that location and make /etc/localtime a regular
symlink to it. This means applications that parse the content of the
localtime symlink will work, and additionally it means that we're
guaranteed that the host configure timezone exists (and works with)
the tzdata in the app.

This unfortunately means we no longer make the localtime an indirect
file via the session helper, and thus that localtime configurations
are static over the lifetime of an app sandbox. However, I don't
think there is a workable solution to this.

This fixes https://github.com/flatpak/flatpak/issues/3338
2020-06-23 09:37:30 +02:00
Matthew Leeds
5a646117c9 Don't mention $FLATPAK_RUN_DIR in docs
We only want the run dir to be overridable in unit tests because we
depend on it being /run/flatpak in flatpak-create-sideload-symlinks.sh,
so don't mention it in the flatpak man page.
2020-06-23 09:37:10 +02:00
Matthew Leeds
e84b75629d Allow sideload-repos to link to the root of a USB
Currently we only support links in /var/lib/flatpak/sideload-repos,
/run/flatpak/sideload-repos, etc. to be actual ostree repos, but this
commit makes it so you can also link to the root directory of a USB,
and Flatpak will check the subpaths "ostree/repo", ".ostree/repo", and
".ostree/repos.d" for compatibility with "flatpak create-usb". This will
allow the logic in the following commit to be much simpler, where we're
linking to hot-plugged drives in a script run by systemd.

Note that we still only allow actual repos in the other places where a
sideload path can be specified, such as the --sideload-repo CLI option.
2020-06-23 09:37:10 +02:00
Matthias Clasen
d95d614e89 Warn if RuntimeRepo is missing
This is making the flatpakref file less portable,
so we should warn to give developers a hint that
this is a possible problem.

Closes #2120
2020-06-22 11:05:53 +02:00
Alexander Larsson
f1f2c4844c transaction: Add install-authenticator signal
If a transaction requires to install an authenticator before it can
continue this signal will be emitted, allowing you to create a new
transaction to install the required authenticator.
2020-06-22 10:51:36 +02:00
Alexander Larsson
c63645f038 dir: Change find_remote_auto_install_refs to get_remote_auto_install_authenticator_ref
We only ever returned this one ref anyway, and we want to use it in were
its *only* for the authenticator.
2020-06-22 10:51:36 +02:00
Matthew Leeds
6397200247 Update documentation for sideload-repos
It is no longer a config option; it was changed to be a directory.
2020-06-18 13:51:16 -07:00
Matthew Leeds
2d2a05621a dir: Fix an error path in pull_untrusted_local
GError conventions require we set the error pointer on error code paths.
2020-06-17 09:49:03 +02:00
Matthew Leeds
a167252492 transaction: Add assertions to catch unset GError issues
Per the conventions around using GError, failure code paths must set a
GError if a non-NULL pointer is passed for that parameter. And in case
the error is left unset it leads to an assertion failure (and crash) in
flatpak_installation_list_installed_refs_for_update(); see
https://github.com/endlessm/flatpak/pull/224

So add assertions to the failure code paths in
flatpak_transaction_real_run() to catch such mistakes earlier and make
the resulting crash stack trace more useful, since it points closer to
where the problem is. This could be implemented with the "goto out;"
idiom but I don't think that's a good idea in this case because in the
latter half of the function we have to do some cleanup before returning.
2020-06-17 09:43:05 +02:00
Alexander Larsson
0fdec95fe0 OCI: Also look for the docker media type when looking manifests
We handle both types, so look for both.
2020-06-11 15:57:39 +02:00
Matthew Leeds
e83ff0ca85 transaction: Don't add deps or related for skipped ops
Currently in the FlatpakTransaction implementation we add dependencies
and related refs for each operation in the transaction regardless of if
it's skipped or not. This is an issue in the case of an
end-of-life-rebased ref because in that case if the user agrees a new
install operation is added for the new ref, an uninstall operation is
added for the end-of-lifed ref, and the update operation for the
end-of-lifed one is marked as to be skipped. Then the dependencies of
the end-of-lifed ref get added to the transaction and ultimately after
all the sorting is done you end up with duplicate operations. In the
case of having org.gnome.tetravex installed, "flatpak update" yields a
transaction which uninstalls org.gnome.tetravex.Locale twice and errors
out on the second time (in addition to uninstalling org.gnome.tetravex
and installing org.gnome.Tetravex and org.gnome.Tetravex.Locale).

Fix the issue by skipping operations marked as to be skipped when adding
dependencies and related refs to the transaction.
2020-06-10 08:59:52 +02:00
Matthew Leeds
c047a78f1e transaction: Fix a typo 2020-06-10 08:59:52 +02:00
Alexander Larsson
bfa3b15435 Transaction: Add "previous-error" option to basic auth error
Also, send this for the oci authenticator.
2020-06-09 14:52:00 +02:00
Alexander Larsson
4c9ff0fb7d oci authenticator: Only loop password prompt on 401 error 2020-06-09 14:52:00 +02:00
Alexander Larsson
52293015d9 oci-registry: Translate some missing errors 2020-06-09 14:52:00 +02:00
Alexander Larsson
d9b0d10b0c Transaction: Accept error-code option in error responses
This allows authenticators to pass a FlatpakError instead of
always generating FAILED errors.
2020-06-09 14:52:00 +02:00
Alexander Larsson
df4834371a Add AUTHENTICATION_FAILED and NOT_AUTHORIZED error codes
These allow us to report more details from authenticators
2020-06-09 14:52:00 +02:00
Ryan Gonzalez
c690eb90e4 portal: Add SpawnStarted and notify-start
These can be used to monitor when a spawned child process has fully
started and to get its relative PID.
2020-06-09 13:51:02 +02:00
Ryan Gonzalez
f687f6b2eb run: Add --instance-id-fd 2020-06-09 13:51:02 +02:00
Alexander Larsson
4d1899b1d7 Allow ALSA device access if app has pulseaudio access
Alternative fix to https://github.com/flatpak/flatpak/pull/3389

If an app has PulseAudio access, also allow direct ALSA device access.

The practical permissions of ALSA and PulseAudio access are
essentially the same (in fact, its possibly less damaging to have
direct device access as bugs in pulseaudio could allow sandbox
breakout that wouldn't be possible with deivce access).

We could add a separate option for this, but since they are
essentially the same, and since both are not the end goal (which is
using portals and PipeWire for audio), seems like unnecessary churn in
apps and code.
2020-06-09 10:38:49 +02:00
Alexander Larsson
0978826c2e Add and use per-transaction no-interaction option
This is useful if to avoid changing the no-interaction of the whole
FlatpakInstallation. Also, having this per transaction lets us
clean up the code in FlatpakQuietTransaction a bit.
2020-06-09 10:38:25 +02:00
Matthew Leeds
a994cdb30e tree-wide: Replace usages of whitelist/blacklist
The terms whitelist and blacklist are hurtful to some people, and per
our code of conduct Flatpak is an inclusive community. Replace them with
allowlist and blocklist which are also more clear. This terminology
change is being implemented more broadly in the software industry; see
e.g. https://go-review.googlesource.com/c/go/+/236857/
2020-06-09 09:24:48 +02:00
Alexander Larsson
f7cf263af7 Fix race when generating ld.so.cache
While creating the ld.so.cache file we write to a temporary file
and then rename it to the final reused cache location only when it is
completely finished.

This solves two issues:
 a) New app instances never end up with a cache that is not finished
 b) Two app starting at the same time don't both try to write the
    cache in the same place, failing like in #3029.

This is an alternative fix to https://github.com/flatpak/flatpak/pull/3617
2020-06-08 11:35:14 +02:00
Alexander Larsson
52f33bc3f6 flatpak_switch_symlink_and_remove don't remove old if same as new
If we're switching to a target which happens to be the same as the old
one, don't remove the old one (as it is also the new one).
2020-06-08 11:35:14 +02:00