#!/bin/bash # This script automates the workaround for connecting Flatpak Firefox with Flatpak KeePassXC. # It performs the following steps: # 1. Detects the correct user home directory (handles /home vs /var/home on immutable distros). # 2. Checks if your Flatpak version meets the minimum requirement (1.12 or newer). # 3. Applies necessary Flatpak overrides to Firefox to allow communication with KeePassXC. # 4. Dynamically locates the KeePassXC application and its runtime within your Flatpak installations. # 5. Creates a wrapper script that launches the KeePassXC proxy within the Flatpak environment. # 6. Creates the native messaging host JSON manifest, pointing to the wrapper script. # # Prerequisites: # - KeePassXC installed as a Flatpak (e.g., from Flathub). # - Firefox installed as a Flatpak (e.g., from Flathub). # - Flatpak version 1.12 or newer (a warning will be issued if older). set -e # Exit immediately if a command exits with a non-zero status. echo "Starting KeePassXC Flatpak browser integration setup..." echo "--------------------------------------------------------------------------------" # --- Configuration Variables --- KEEPASSXC_APP_REF="org.keepassxc.KeePassXC/x86_64/stable" FIREFOX_APP_REF="org.mozilla.firefox" # --- 1. Detect User Home Directory --- # This is crucial for immutable distros like Fedora Silverblue where /home is often /var/home. USER_HOME_DIR="" if [ -d "/var/home/$USER" ] && [ "$(readlink -f ~)" = "/var/home/$USER" ]; then USER_HOME_DIR="/var/home/$USER" else USER_HOME_DIR="$HOME" fi echo "Detected user home directory: $USER_HOME_DIR" # --- 2. Check Flatpak Version --- FLATPAK_VERSION=$(flatpak --version 2>/dev/null | awk '{print $2}') REQUIRED_VERSION="1.12" if [ -z "$FLATPAK_VERSION" ]; then echo "Error: Flatpak command not found. Please ensure Flatpak is installed and in your PATH." exit 1 fi # Compare versions numerically if printf '%s\n' "$REQUIRED_VERSION" "$FLATPAK_VERSION" | sort -V | head -n1 | grep -q "$REQUIRED_VERSION"; then echo "Flatpak version $FLATPAK_VERSION is sufficient (>= $REQUIRED_VERSION)." else echo "WARNING: Your Flatpak version ($FLATPAK_VERSION) is older than the recommended $REQUIRED_VERSION." echo "The workaround might not function correctly on older versions." read -p "Do you want to continue anyway? (y/N): " choice [[ "$choice" != [yY] ]] && exit 1 fi echo "--------------------------------------------------------------------------------" # --- 3. Apply Flatpak Overrides for Firefox --- echo "Applying Flatpak overrides for $FIREFOX_APP_REF..." echo "This grants Firefox read access to KeePassXC's Flatpak data and creates a socket directory." flatpak override --user \ --filesystem=xdg-run/app/org.keepassxc.KeePassXC:create \ "$FIREFOX_APP_REF" || { echo "Error: Failed to apply Flatpak overrides. Please check if Firefox Flatpak is installed." echo "Also ensure you have permissions to run 'flatpak override --user'." exit 1 } echo "Flatpak overrides applied successfully." echo "--------------------------------------------------------------------------------" # --- 4. Dynamically Locate KeePassXC App and Runtime Paths --- echo "Locating KeePassXC Flatpak application and runtime..." KEEPASSXC_FLATPAK_APP_INST="" for inst_path in "$USER_HOME_DIR/.local/share/flatpak" "/var/lib/flatpak"; do if [ -d "$inst_path/app/$KEEPASSXC_APP_REF" ]; then KEEPASSXC_FLATPAK_APP_INST="$inst_path" echo "Found KeePassXC app at: $KEEPASSXC_FLATPAK_APP_INST" break fi done if [ -z "$KEEPASSXC_FLATPAK_APP_INST" ]; then echo "Error: KeePassXC Flatpak application not found at expected locations." echo "Please ensure 'org.keepassxc.KeePassXC' is installed as a Flatpak." exit 1 fi KEEPASSXC_APP_PATH="$KEEPASSXC_FLATPAK_APP_INST/app/$KEEPASSXC_APP_REF/current" # Extract the runtime reference from KeePassXC's metadata KEEPASSXC_APP_METADATA_FILE="$KEEPASSXC_APP_PATH/metadata" if [ ! -f "$KEEPASSXC_APP_METADATA_FILE" ]; then echo "Error: KeePassXC metadata file not found at $KEEPASSXC_APP_METADATA_FILE." echo "This indicates a corrupted or incomplete Flatpak installation." exit 1 fi RUNTIME_REF=$(awk -F'=' '$1=="runtime" { print $2 }' < "$KEEPASSXC_APP_METADATA_FILE") if [ -z "$RUNTIME_REF" ]; then echo "Error: Could not determine KeePassXC runtime reference from metadata." echo "The 'runtime=' line might be missing or malformed in $KEEPASSXC_APP_METADATA_FILE." exit 1 fi echo "KeePassXC runtime reference: $RUNTIME_REF" KEEPASSXC_FLATPAK_RUNTIME_INST="" for inst_path in "$USER_HOME_DIR/.local/share/flatpak" "/var/lib/flatpak"; do if [ -d "$inst_path/runtime/$RUNTIME_REF" ]; then KEEPASSXC_FLATPAK_RUNTIME_INST="$inst_path" echo "Found KeePassXC runtime at: $KEEPASSXC_FLATPAK_RUNTIME_INST" break fi done if [ -z "$KEEPASSXC_FLATPAK_RUNTIME_INST" ]; then echo "Error: KeePassXC Flatpak runtime '$RUNTIME_REF' not found at expected locations." echo "This might indicate a missing runtime or an issue with your Flatpak installation." exit 1 fi KEEPASSXC_RUNTIME_PATH="$KEEPASSXC_FLATPAK_RUNTIME_INST/runtime/$RUNTIME_REF/current" echo "KeePassXC Flatpak paths located successfully." echo "--------------------------------------------------------------------------------" # --- 5. Create Wrapper Script --- WRAPPER_DIR="$USER_HOME_DIR/.var/app/$FIREFOX_APP_REF/data/bin" WRAPPER_SCRIPT_NAME="keepassxc-proxy-wrapper.sh" WRAPPER_SCRIPT_PATH="$WRAPPER_DIR/$WRAPPER_SCRIPT_NAME" echo "Creating wrapper script at $WRAPPER_SCRIPT_PATH..." mkdir -p "$WRAPPER_DIR" || { echo "Error: Failed to create wrapper directory $WRAPPER_DIR." exit 1 } # Find flatpak-spawn absolute path FLATPAK_SPAWN_PATH=$(command -v flatpak-spawn) if [ -z "$FLATPAK_SPAWN_PATH" ]; then echo "Error: flatpak-spawn command not found. Ensure Flatpak is properly installed." exit 1 fi # Content of the wrapper script cat > "$WRAPPER_SCRIPT_PATH" < "$JSON_MANIFEST_PATH" <