Commit Graph

1908 Commits

Author SHA1 Message Date
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
Léo Stefanesco
66dfb63075 Fix segfault when reporting error during install
flatpak_dir_install was returning FALSE but leaving error to NULL, which
would crash when printing the error.

Fixes #3646
2020-06-05 17:02:45 +02:00
Ryan Gonzalez
1735d88f01 Clean up duplicated instance collection code
It was completely identical in flatpak-run.c and flatpak-instance.c.
2020-06-05 16:36:13 +02:00
alaviss
ea1830e108 common/flatpak-run: respect user's XDG base directories (#3626)
This makes flatpak respects XDG_DATA_HOME and XDG_CACHE_HOME for binding
user's fonts and icons into the sandbox.
2020-06-05 16:31:39 +02:00
Alexander Larsson
b042abc71c oci: Handle io.github.containers.DeltaUrl in index
If the magical io.github.containers.DeltaUrl label is set in the
index, then try to download this to use as the delta manifest for the
image. This allows servers to store deltas outside the registry
itself. The label is propagated to the xa.delta-url metadata in the
generated "fake summary" for the remote, and read back on pull.

Note that the delta manifest layers descriptor will need to have a
"urls" key where it references the blobs if the blobs are also not
stored on the registry.

If the specified manifest doesn't exist or doesn't apply to the target
image we fall back to resolving via the _deltaindex tag.
2020-06-05 09:35:30 +02:00
Alexander Larsson
fd197300b9 oci: Fix potential crash
Call flatpak_remote_state_ensure_summary() before dereferencing
RemoteState->summary to return an error instead of crashing if
downloading the summary failed.
2020-06-05 09:35:30 +02:00
Alexander Larsson
47daa077c2 OCI: Support (and use) alternative urls specified in OCI descriptors 2020-06-05 09:35:30 +02:00
Alexander Larsson
aaa36bab45 oci: Support deltas when using system-helper
When mirroring to a local OCI dir we apply deltas and generate
uncompressed layer blobs instead of regular blobs. Then we pick this
up on the system-helper side.
2020-06-05 09:35:30 +02:00
Alexander Larsson
f2cb157294 oci: Use the correct progress layer size when using deltas 2020-06-05 09:35:30 +02:00
Alexander Larsson
37dcccea61 oci: Add flatpak_oci_registry_apply_delta_to_blob()
This is a version of flatpak_oci_registry_apply_delta() that generates
a new blob in a local repo, rather than a temporary file. This is used
when mirroring using a delta into a child oci registry for system-helper
use.
2020-06-05 09:35:30 +02:00
Alexander Larsson
5d8fd2d1be oci: Set token on child oci registry and pass to system-helper
When we create a system child registry we also set the current token on
it. This is not used directly in the client, however its saved in a
file called .token and re-read in the system-helper, allowing it to
also do the remote registry operations it needs to verify the child
registry.
2020-06-05 09:35:30 +02:00
Alexander Larsson
d4962628aa oci: Add flatpak_oci_registry_is_local() 2020-06-05 09:35:30 +02:00
Alexander Larsson
8c454f99f2 oci: Add debug spew when using deltas 2020-06-05 09:35:30 +02:00
Alexander Larsson
4539d186a5 oci: Make libzstd optional (and disable OCI deltas if not there) 2020-06-05 09:35:30 +02:00
Alexander Larsson
7be653a14d oci: Find and apply available deltas when pulling 2020-06-05 09:35:30 +02:00
Alexander Larsson
0fce4c6d7f oci: Pass FlatpakPullFlags to pull_from_oci()
We want to handle FLATPAK_PULL_FLAGS_NO_STATIC_DELTAS
2020-06-05 09:35:30 +02:00
Alexander Larsson
abf5b2db44 oci: Add basic functions to find and apply OCI deltas
This is based on the OCI delta work at:
  https://github.com/containers/image/pull/902
2020-06-05 09:35:30 +02:00
Alexander Larsson
3d8ca04565 oci: Add helpers to parse OCI delta index and manifest 2020-06-05 09:35:30 +02:00
Alexander Larsson
eaeb52b6a3 flatpak_oci_registry_load_blob: Allow tags (and digests) arg
We typically only load by digest id, resolving tags in other ways.
However, we need to load the _deltaindex tag by tagname, so support
this when possible.
2020-06-05 09:35:30 +02:00
Alexander Larsson
29da4ca430 oci: Store the last layer diff-id in the commit metadata (xa.diff-id)
We an use the commit content as original data for deltas going from
this diff-id, so this will be useful later.
2020-06-05 09:35:30 +02:00
Alexander Larsson
90f5fdb44d oci: Add flatpak_oci_image_get_n_layers() helper 2020-06-05 09:35:30 +02:00
Alexander Larsson
e0a25e7650 http: Also accept image indexes when FLATPAK_HTTP_FLAGS_ACCEPT_OCI 2020-06-05 09:35:30 +02:00
Alexander Larsson
01919d251e oci: Use content type from server if not in contents 2020-06-05 09:35:30 +02:00
Alexander Larsson
7820057336 Add content_type output to flatpak_load_uri()
We want this to get the oci mimetypes
2020-06-05 09:35:30 +02:00
Alexander Larsson
bfa71e208a Add FlatpakZstdDecompressor converter (and libzstd dep)
We will need this to decompress oci deltas.
2020-06-05 09:35:30 +02:00
Alexander Larsson
8e0e5a5749 oci: Always checksum entire layer when pulling
It turns out that libarchive doesn't always read the entire file until
the end if it can figure out that the tarfile ended. Normally this is
not hit, because the decompressor reads all the input, but for
uncompressed tarfiles (like those from applied deltas) this is
important.
2020-06-05 09:35:30 +02:00