From b38c209605c1f89c3762e538615f3ec70b73193b Mon Sep 17 00:00:00 2001 From: Beanow <497556+Beanow@users.noreply.github.com> Date: Mon, 27 Jun 2022 20:06:22 +0200 Subject: [PATCH 1/6] fix(sys): load exclusively using dynamic linking This should let `dlopen` (through `ld.so`) handle what paths to search in for the respective libraries. Additionally this fixes a mistake with the library filenames. Now using the `SONAME` instead of a symlinked name that happened to work when dev packages are installed. --- sys/src/lib.rs | 74 +++++++++----------------------------------------- 1 file changed, 13 insertions(+), 61 deletions(-) diff --git a/sys/src/lib.rs b/sys/src/lib.rs index 768852c..5fe3c1b 100644 --- a/sys/src/lib.rs +++ b/sys/src/lib.rs @@ -8,73 +8,25 @@ use gtk_sys::{ }; use libloading::*; use once_cell::sync::Lazy; -use std::{os::raw::*, path::PathBuf, process::Command}; +use std::os::raw::*; pub static LIB: Lazy = Lazy::new(|| { - #[cfg(target_os = "linux")] - { - if let Some(appimage_path) = std::env::var_os("APPDIR") { - // validate that we're actually running on an AppImage - // an AppImage is mounted to `/$TEMPDIR/.mount_${appPrefix}${hash}` - // see https://github.com/AppImage/AppImageKit/blob/1681fd84dbe09c7d9b22e13cdb16ea601aa0ec47/src/runtime.c#L501 - // note that it is safe to use `std::env::current_exe` here since we just loaded an AppImage. - let is_temp = std::env::current_exe() - .map(|p| { - p.display() - .to_string() - .starts_with(&format!("{}/.mount_", std::env::temp_dir().display())) - }) - .unwrap_or(true); - - if !is_temp { - panic!("`APPDIR` environment variable found but this application was not detected as an AppImage; this might be a security issue."); - } - - let appimage_path = PathBuf::from(appimage_path); - let ayatana_target_path = appimage_path.join("usr/lib/libayatana-appindicator3.so"); - let gtk_target_path = appimage_path.join("usr/lib/libappindicator3.so"); - - if ayatana_target_path.exists() { - return unsafe { Library::new(ayatana_target_path).unwrap() }; - } else if gtk_target_path.exists() { - return unsafe { Library::new(gtk_target_path).unwrap() }; - } - } + let libayatana = unsafe { Library::new("libayatana-appindicator3.so.1") }; + if let Ok(lib) = libayatana { + return lib; } - // PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 pkg-config --libs-only-L ayatana-appindicator3-0.1 - let path = get_appindicator_library_path(); - unsafe { Library::new(path).unwrap() } -}); -/// Gets the path to the target appindicator library file (`.so` extension). -pub fn get_appindicator_library_path() -> PathBuf { - match get_library_path("ayatana-appindicator3-0.1") { - Some(p) => format!("{}/libayatana-appindicator3.so", p).into(), - None => match get_library_path("appindicator3-0.1") { - Some(p) => format!("{}/libappindicator3.so", p).into(), - None => panic!("Can't detect any appindicator library"), - }, + let libappindicator = unsafe { Library::new("libappindicator3.so.1") }; + if let Ok(lib) = libappindicator { + return lib; } -} -/// Gets the folder in which a library is located using `pkg-config`. -pub fn get_library_path(name: &str) -> Option { - let mut cmd = Command::new("pkg-config"); - cmd.env("PKG_CONFIG_ALLOW_SYSTEM_LIBS", "1"); - cmd.arg("--libs-only-L"); - cmd.arg(name); - if let Ok(output) = cmd.output() { - if !output.stdout.is_empty() { - // output would be "-L/path/to/library\n" - let word = output.stdout[2..].to_vec(); - return Some(String::from_utf8_lossy(&word).trim().to_string()); - } else { - return None; - } - } else { - return None; - } -} + panic!( + "Failed to load libayatana-appindicator3.so.1 or libappindicator3.so.1\n{}\n{}", + libayatana.unwrap_err(), + libappindicator.unwrap_err() + ); +}); pub type guint32 = c_uint; pub type gint64 = c_long; From bb8d2806b028c5b19c89f126624c85746fca9d7d Mon Sep 17 00:00:00 2001 From: Beanow <497556+Beanow@users.noreply.github.com> Date: Mon, 27 Jun 2022 20:19:58 +0200 Subject: [PATCH 2/6] Add changes --- .changes/fix-dynamic-linking.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .changes/fix-dynamic-linking.md diff --git a/.changes/fix-dynamic-linking.md b/.changes/fix-dynamic-linking.md new file mode 100644 index 0000000..b146a21 --- /dev/null +++ b/.changes/fix-dynamic-linking.md @@ -0,0 +1,12 @@ + +--- +"libappindicator": major +"libappindicator-sys": major +--- + +Load exclusively using dynamic linking + +This change lets `dlopen` (through `ld.so`) handle what paths to search in for the respective libraries. +Additionally this fixes a mistake with the library filenames. Now using the `SONAME` instead of a symlinked name that happened to work when dev packages are installed. + +**Breaking:** Support for `$APPDIR` based appImage detection is removed. From aae5895ae389fc2c8a9542a1b630f36e22bcc582 Mon Sep 17 00:00:00 2001 From: Beanow <497556+Beanow@users.noreply.github.com> Date: Tue, 28 Jun 2022 11:55:03 +0200 Subject: [PATCH 3/6] Add a backcompat feature flag Versions v0.7.1 and v0.7.2 relied exclusively on the .so files without .1 suffix. This is 'bad' because by convention that signals we don't care about ABI compatibility. However in weird cases (*ahum* Tauri bundled appimages) this .so file is the only one available. Using this feature flag allows them some time to fix this problem and bundle with the correct filename. --- .changes/fix-dynamic-linking.md | 5 +++-- Cargo.toml | 4 ++++ sys/Cargo.toml | 4 ++++ sys/src/lib.rs | 28 +++++++++++++++++++++++++++- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/.changes/fix-dynamic-linking.md b/.changes/fix-dynamic-linking.md index b146a21..018201d 100644 --- a/.changes/fix-dynamic-linking.md +++ b/.changes/fix-dynamic-linking.md @@ -1,7 +1,7 @@ --- -"libappindicator": major -"libappindicator-sys": major +"libappindicator": minor +"libappindicator-sys": minor --- Load exclusively using dynamic linking @@ -10,3 +10,4 @@ This change lets `dlopen` (through `ld.so`) handle what paths to search in for t Additionally this fixes a mistake with the library filenames. Now using the `SONAME` instead of a symlinked name that happened to work when dev packages are installed. **Breaking:** Support for `$APPDIR` based appImage detection is removed. +Though it _should_ still work, because appimages provide an `LD_LIBRARY_PATH` that would be equivalent to what our previous detection method was doing in rust. diff --git a/Cargo.toml b/Cargo.toml index 8906d00..af78c84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,7 @@ glib = "0.15" gtk = "0.15" gtk-sys = "0.15" libappindicator-sys = { version = "0.7", path = "sys/" } + +[features] +default = [ "backcompat" ] +backcompat = [ "libappindicator-sys/backcompat" ] diff --git a/sys/Cargo.toml b/sys/Cargo.toml index 08f31aa..24f492a 100644 --- a/sys/Cargo.toml +++ b/sys/Cargo.toml @@ -11,3 +11,7 @@ categories = [ "external-ffi-bindings" ] gtk-sys = "0.15" libloading = "0.7" once_cell = "1.12" + +[features] +default = [ "backcompat" ] +backcompat = [ ] diff --git a/sys/src/lib.rs b/sys/src/lib.rs index 5fe3c1b..8a3e337 100644 --- a/sys/src/lib.rs +++ b/sys/src/lib.rs @@ -21,8 +21,34 @@ pub static LIB: Lazy = Lazy::new(|| { return lib; } + // Versions v0.7.1 and v0.7.2 relied exclusively on the .so files without .1 suffix. + // This is 'bad' because by convention that signals we don't care about ABI compatibility. + // However in weird cases (*ahum* Tauri bundled appimages) this .so file is the only one + // available. Using this feature flag allows them some time to fix this problem and bundle + // with the correct filename. + #[cfg(feature = "backcompat")] + { + let libayatana_compat = unsafe { Library::new("libayatana-appindicator3.so") }; + if let Ok(lib) = libayatana_compat { + return lib; + } + + let libappindicator_compat = unsafe { Library::new("libappindicator3.so") }; + if let Ok(lib) = libappindicator_compat { + return lib; + } + + panic!( + "Failed to load ayatana-appindicator3 or appindicator3 dynamic library\n{}\n{}\n{}\n{}", + libayatana.unwrap_err(), + libappindicator.unwrap_err(), + libayatana_compat.unwrap_err(), + libappindicator_compat.unwrap_err(), + ); + } + panic!( - "Failed to load libayatana-appindicator3.so.1 or libappindicator3.so.1\n{}\n{}", + "Failed to load ayatana-appindicator3 or appindicator3 dynamic library\n{}\n{}", libayatana.unwrap_err(), libappindicator.unwrap_err() ); From e73f4534f30f666cbbd377186537cbcfda6a2a2c Mon Sep 17 00:00:00 2001 From: Beanow <497556+Beanow@users.noreply.github.com> Date: Mon, 27 Jun 2022 20:43:32 +0200 Subject: [PATCH 4/6] Add ENV arguments to example --- examples/hello.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/examples/hello.rs b/examples/hello.rs index fea8827..75de4bd 100644 --- a/examples/hello.rs +++ b/examples/hello.rs @@ -1,5 +1,7 @@ -use std::env; -use std::path::Path; +use std::{ + env, + path::{Path, PathBuf}, +}; use gtk::prelude::*; use libappindicator::{AppIndicator, AppIndicatorStatus}; @@ -8,9 +10,19 @@ fn main() { gtk::init().unwrap(); let mut indicator = AppIndicator::new("libappindicator test application", ""); indicator.set_status(AppIndicatorStatus::Active); - let icon_path = Path::new(env!("CARGO_MANIFEST_DIR")).join("examples"); + + let icon_path = match env::var("TRAY_ICON_DIR") { + Ok(dir) => PathBuf::from(dir), + _ => Path::new(env!("CARGO_MANIFEST_DIR")).join("examples"), + }; + + let icon_name = match env::var("TRAY_ICON_NAME") { + Ok(name) => name, + _ => "rust-logo".to_string(), + }; + indicator.set_icon_theme_path(icon_path.to_str().unwrap()); - indicator.set_icon_full("rust-logo", "icon"); + indicator.set_icon_full(&icon_name, "icon"); let mut m = gtk::Menu::new(); let mi = gtk::CheckMenuItem::with_label("Hello Rust!"); mi.connect_activate(|_| { From 1844428794facc8aff4075f220c7f04b514d27fd Mon Sep 17 00:00:00 2001 From: Beanow <497556+Beanow@users.noreply.github.com> Date: Mon, 27 Jun 2022 20:43:54 +0200 Subject: [PATCH 5/6] Make icon square 256x256 --- examples/rust-logo.png | Bin 34971 -> 20750 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/rust-logo.png b/examples/rust-logo.png index d1e9f801b913bf87ee6add0c3e0255eccf460e29..14041eb384268c0d46466ac5ca760f887117ed83 100644 GIT binary patch literal 20750 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%0A7UZ=23(DF`=#8rf$O77& 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 literal 34971 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 From c2e5ef513c9f03d2d27705b406db42a6b9287026 Mon Sep 17 00:00:00 2001 From: Beanow <497556+Beanow@users.noreply.github.com> Date: Mon, 27 Jun 2022 20:44:18 +0200 Subject: [PATCH 6/6] Add Docker test utility --- .dockerignore | 3 +++ .tests/Dockerfile | 49 +++++++++++++++++++++++++++++++++++++++ .tests/docker-compose.yml | 39 +++++++++++++++++++++++++++++++ .tests/hello-examples.sh | 14 +++++++++++ 4 files changed, 105 insertions(+) create mode 100644 .dockerignore create mode 100644 .tests/Dockerfile create mode 100644 .tests/docker-compose.yml create mode 100755 .tests/hello-examples.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e50d125 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +target +Cargo.lock +.tests diff --git a/.tests/Dockerfile b/.tests/Dockerfile new file mode 100644 index 0000000..836ce3f --- /dev/null +++ b/.tests/Dockerfile @@ -0,0 +1,49 @@ +FROM ubuntu:18.04 as build + +# Dependencies +RUN apt-get update && \ + apt-get install --no-install-recommends -y \ + build-essential ca-certificates curl libappindicator3-dev + +# Drop privileges or Rust will have trouble installing +RUN useradd -m --uid 1000 --user-group rust +USER rust +WORKDIR /home/rust/src + +# Install toolchain +ENV RUST_TOOLCHAIN=nightly +ENV RUST_BACKTRACE=1 +ENV CARGO_INCREMENTAL=0 +ENV CARGO_PROFILE_DEV_DEBUG=0 + +RUN curl https://sh.rustup.rs -sSf | \ + sh -s -- --default-toolchain $RUST_TOOLCHAIN -y +ENV PATH=/home/rust/.cargo/bin:$PATH +RUN rustup component add rust-src --toolchain $RUST_TOOLCHAIN + +# Build our app. +COPY --chown=rust:rust . /home/rust/src +ARG build_cmd="cargo build --release --example=hello" +RUN sh -c "${build_cmd}" + + +FROM ubuntu:18.04 + +RUN apt-get update && \ + apt-get install -y libcanberra-gtk3-module binutils + +RUN mkdir -p /app + +ARG with_lib="" +RUN apt-get install -y ${with_lib} + +ENV TRAY_ICON_DIR /app/icons +COPY examples/rust-logo.png /app/icons/rust-logo.png +COPY --from=build /home/rust/src/target/release/examples/hello /app/bin/hello + +# RUN ls -la /usr/lib/x86_64-linux-gnu/ | grep indicator;\ +# ldconfig --print-cache | grep indic;\ +# objdump -p /usr/lib/x86_64-linux-gnu/*indicator* | grep SONAME;\ +# true + +CMD ["/app/bin/hello"] diff --git a/.tests/docker-compose.yml b/.tests/docker-compose.yml new file mode 100644 index 0000000..a4b3f8f --- /dev/null +++ b/.tests/docker-compose.yml @@ -0,0 +1,39 @@ +version: "3.8" +services: + + no-library: + environment: &env + RUST_BACKTRACE: 1 + DISPLAY: ${DISPLAY} + volumes: &vol + - /tmp/.X11-unix:/tmp/.X11-unix + build: &base-build + context: .. + dockerfile: .tests/Dockerfile + args: + build_cmd: cargo build --release --example=hello + with_lib: + + libayatana: + environment: *env + volumes: *vol + build: + <<: *base-build + args: + with_lib: libayatana-appindicator3-1 + + libappindicator: + environment: *env + volumes: *vol + build: + <<: *base-build + args: + with_lib: libappindicator3-1 + + both-libs: + environment: *env + volumes: *vol + build: + <<: *base-build + args: + with_lib: libayatana-appindicator3-1 libappindicator3-1 diff --git a/.tests/hello-examples.sh b/.tests/hello-examples.sh new file mode 100755 index 0000000..4163607 --- /dev/null +++ b/.tests/hello-examples.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +readonly workdir=$(dirname $(dirname $(realpath $0))) +cd ${workdir} + +echo "DISPLAY=${DISPLAY:-""}" +if [ ! -d /tmp/.X11-unix ]; then + echo "Directory /tmp/.X11-unix does not exist." +fi + +xhost + # Note this disable access control on Xorg, letting containers connect. +docker-compose -f .tests/docker-compose.yml up --build || true +xhost - # This reenables access control