Vestibule/scripts/install-native-host.sh

69 lines
2.4 KiB
Bash
Executable File

#!/bin/sh
# Registers usher as a Firefox/LibreWolf native messaging host for the
# current user on Linux. Installs to ~/.local/bin and registers the
# manifest in ~/.librewolf/native-messaging-hosts and
# ~/.mozilla/native-messaging-hosts. No sudo required.
#
# POSIX sh — no bashisms. Runs on any minimal Linux base.
# After running, restart LibreWolf and load the extension from
# about:debugging to verify usher connects (check the Browser Console:
# Ctrl+Shift+J).
set -eu
HOST_NAME="com.vestibule.usher"
EXT_ID="vestibule@vestibule.kiosk"
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
PROJECT_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd)
HELPER_BIN="${PROJECT_ROOT}/helper/target/release/usher"
if [ ! -x "${HELPER_BIN}" ]; then
echo "error: usher binary not found at ${HELPER_BIN}" >&2
echo " build it first: (cd ${PROJECT_ROOT}/helper && cargo build --release)" >&2
exit 1
fi
# Install binary to ~/.local/bin (no sudo required)
TARGET_BIN="${HOME}/.local/bin/usher"
BIN_DIR=$(dirname "${TARGET_BIN}")
mkdir -p "${BIN_DIR}"
install -m 0755 "${HELPER_BIN}" "${TARGET_BIN}"
echo "installed binary: ${TARGET_BIN}"
# Substitute the absolute install path into the manifest template.
# Paths travel as argv, never interpolated into source (SEI CERT
# IDS03-ENUM; a path containing a quote must not alter the program).
MANIFEST_TEMPLATE="${PROJECT_ROOT}/config/com.vestibule.usher.linux.json"
GENERATED_MANIFEST=$(mktemp)
trap 'rm -f "${GENERATED_MANIFEST}"' EXIT INT TERM
python3 - "${MANIFEST_TEMPLATE}" "${GENERATED_MANIFEST}" "${TARGET_BIN}" <<'PYEOF'
import json
import sys
template, generated, target_bin = sys.argv[1:4]
with open(template) as f:
manifest = json.load(f)
manifest["path"] = target_bin
with open(generated, "w") as f:
json.dump(manifest, f, indent=2)
PYEOF
# Install manifest into both LibreWolf and Mozilla native-messaging-hosts
# directories. LibreWolf reads from ~/.librewolf, vanilla Firefox from
# ~/.mozilla. Covering both is harmless and future-proof.
for DIR in \
"${HOME}/.librewolf/native-messaging-hosts" \
"${HOME}/.mozilla/native-messaging-hosts"; do
mkdir -p "${DIR}"
install -m 0644 "${GENERATED_MANIFEST}" "${DIR}/${HOST_NAME}.json"
echo "installed manifest: ${DIR}/${HOST_NAME}.json"
done
echo
echo "Done. Restart LibreWolf, load the extension from about:debugging,"
echo "and check the Browser Console (Ctrl+Shift+J) for '[vestibule] usher hello'."