{{- if ne .host.distro.family "windows" -}} #!/usr/bin/env bash {{ includeTemplate "universal/profile" }} {{ includeTemplate "universal/logg" }} # Firefox plugins: {{ list (.firefoxAddOns | toString | replace "[" "" | replace "]" "") | uniq | join " " }} ### Add Firefox enterprise profile # TODO - figure out how to do this for other installations like Flatpak and macOS and Librewolf for FIREFOX_DIR in '/usr/lib/firefox' '/usr/lib/firefox-esr' '/Applications/Firefox.app/Contents/Resources'; do if [ -d "$FIREFOX_DIR" ] && [ -d "${XDG_DATA_HOME:-$HOME/.local/share}/firefox" ] && command -v rsync > /dev/null; then sudo rsync -artvu "${XDG_DATA_HOME:-$HOME/.local/share}/firefox/" "$FIREFOX_DIR" fi done ### Loop through various Firefox profile locations for SETTINGS_DIR in "$HOME/snap/firefox/common/.mozilla/firefox" "$HOME/.var/app/org.mozilla.firefox/.mozilla/firefox" "$HOME/.var/app/io.gitlab.librewolf-community/.librewolf" "$HOME/Library/Application Support/Firefox/Profiles" "$HOME/Library/Application Support/LibreWolf/Profiles" "$HOME/.mozilla/firefox"; do ### Determine executable to use logg info "Processing Firefox profile location $SETTINGS_DIR" unset FIREFOX_EXE if [ "$SETTINGS_DIR" == "$HOME/.var/app/org.mozilla.firefox" ]; then if ! command -v org.mozilla.firefox > /dev/null; then continue else FIREFOX_EXE="$(which org.mozilla.firefox)" fi elif [ "$SETTINGS_DIR" == "$HOME/.var/app/io.gitlab.librewolf-community/.librewolf" ]; then if ! command -v io.gitlab.librewolf-community > /dev/null; then continue else FIREFOX_EXE="$(which io.gitlab.librewolf-community)" fi elif [ "$SETTINGS_DIR" == "$HOME/Library/Application Support/Firefox/Profiles" ]; then FIREFOX_EXE="/Applications/Firefox.app/Contents/MacOS/firefox" if [ ! -f "$FIREFOX_EXE" ]; then continue fi elif [ "$SETTINGS_DIR" == "$HOME/Library/Application Support/LibreWolf/Profiles" ]; then FIREFOX_EXE="/Applications/LibreWolf.app/Contents/MacOS/librewolf" if [ ! -f "$FIREFOX_EXE" ]; then continue fi elif [ "$SETTINGS_DIR" == "$HOME/snap/firefox/common/.mozilla/firefox" ]; then FIREFOX_EXE="/snap/bin/firefox" if [ ! -f "$FIREFOX_EXE" ]; then continue fi elif [ "$SETTINGS_DIR" == "$HOME/.mozilla/firefox" ]; then if command -v firefox-esr > /dev/null; then FIREFOX_EXE="$(which firefox-esr)" elif command -v firefox > /dev/null && [ "$(which firefox)" != *'snap'* ] && [ "$(which firefox)" != *'flatpak'* ] && [ ! -d /Applications ] && [ ! -d /System ]; then # Conditional check ensures Snap / Flatpak / macOS Firefox versions do not try to install to the wrong folder FIREFOX_EXE="$(which firefox)" else logg warn 'Unable to register Firefox executable' logg info "Settings directory: $SETTINGS_DIR" continue fi fi ### Initiatize Firefox default profiles if command -v "$FIREFOX_EXE" > /dev/null; then logg info "Firefox executable set to $FIREFOX_EXE" if [ ! -d "$SETTINGS_DIR" ]; then logg info 'Running Firefox headlessly to generate default profiles' timeout 8 "$FIREFOX_EXE" --headless logg info 'Finished running Firefox headlessly' fi DEFAULT_RELEASE_PROFILE="$(find "$SETTINGS_DIR" -mindepth 1 -maxdepth 1 -name "*.default-*")" DEFAULT_PROFILE="$(find "$SETTINGS_DIR" -mindepth 1 -maxdepth 1 -name "*.default" -not -name "profile.default")" if [ -n "$DEFAULT_PROFILE" ] && [ "$DEFAULT_PROFILE" != "$SETTINGS_DIR/profile.default" ]; then logg info "Renaming $DEFAULT_PROFILE to $SETTINGS_DIR/profile.default" rsync -a "$DEFAULT_PROFILE/" "$SETTINGS_DIR/profile.default" fi if [ -n "$DEFAULT_RELEASE_PROFILE" ]; then logg info "Renaming $DEFAULT_RELEASE_PROFILE to $SETTINGS_DIR/profile.primary" rsync -a "$DEFAULT_RELEASE_PROFILE/" "$SETTINGS_DIR/profile.primary" fi if [ ! -d "$SETTINGS_DIR/profile.secondary" ] && [ -d "$SETTINGS_DIR/profile.default" ]; then logg info 'Adding a secondary profile' rsync -a "$SETTINGS_DIR/profile.default/" "$SETTINGS_DIR/profile.secondary" fi logg info "Copying "${XDG_DATA_HOME:-$HOME/.local/share}/firefox/profiles.ini" to profile directory" if [ -d /Applications ] && [ -d /System ]; then # macOS cp -f "${XDG_DATA_HOME:-$HOME/.local/share}/firefox/profiles.ini" "$SETTINGS_DIR/../profiles.ini" else # Linux cp -f "${XDG_DATA_HOME:-$HOME/.local/share}/firefox/profiles.ini" "$SETTINGS_DIR/profiles.ini" fi ### Install Firefox addons (using list declared in .chezmoidata.yaml) for FIREFOX_PLUGIN in {{ list (.firefoxAddOns | toString | replace "[" "" | replace "]" "") | uniq | join " " }}; do logg info 'Ensuring `'"$FIREFOX_PLUGIN"'` is installed' PLUGIN_HTML="$(mktemp)" curl --silent "https://addons.mozilla.org/en-US/firefox/addon/$FIREFOX_PLUGIN/" > "$PLUGIN_HTML" PLUGIN_TMP="$(mktemp)" cat "$PLUGIN_HTML" | htmlq '#redux-store-state' | sed 's/^//' | sed 's/<\/script>$//' > "$PLUGIN_TMP" PLUGIN_ID="$(jq '.addons.bySlug["'"$FIREFOX_PLUGIN"'"]' "$PLUGIN_TMP")" if [ "$PLUGIN_ID" != 'null' ]; then PLUGIN_FILE_ID="$(jq -r '.addons.byID["'"$PLUGIN_ID"'"].guid' "$PLUGIN_TMP")" if [ "$PLUGIN_FILE_ID" != 'null' ]; then PLUGIN_URL="$(cat "$PLUGIN_HTML" | htmlq '.InstallButtonWrapper-download-link' --attribute href)" PLUGIN_FILENAME="${PLUGIN_FILE_ID}.xpi" PLUGIN_FOLDER="$(echo "$PLUGIN_FILENAME" | sed 's/.xpi$//')" if [ ! -d "$SETTINGS_DIR/profile.primary/extensions/$PLUGIN_FOLDER" ]; then logg info 'Downloading plugin file for '"$PLUGIN_FILENAME"' ('"$FIREFOX_PLUGIN"')' if [ ! -d "$SETTINGS_DIR/profile.primary/extensions" ]; then mkdir -p "$SETTINGS_DIR/profile.primary/extensions" fi curl -sSL "$PLUGIN_URL" -o "$SETTINGS_DIR/profile.primary/extensions/$PLUGIN_FILENAME" # Unzipping like this causes Firefox to complain about unsigned plugins # TODO - figure out how to headlessly enable the extensions in such a way that is compatible with Flatpak / Snap # using the /usr/lib/firefox/distribution/policies.json works but this is not compatible with Flatpak / Snap out of the box # it seems since they do not have access to the file system by default. Also, using the policies.json approach forces # all Firefox profiles to use the same extensions. Ideally, we should find a way to enable the extensions scoped # to the user profile. # logg info 'Unzipping '"$PLUGIN_FILENAME"' ('"$FIREFOX_PLUGIN"')' # unzip "$SETTINGS_DIR/profile.primary/extensions/$PLUGIN_FILENAME" -d "$SETTINGS_DIR/profile.primary/extensions/$PLUGIN_FOLDER" logg success 'Installed `'"$FIREFOX_PLUGIN"'`' fi else logg warn 'A null Firefox add-on filename was detected for `'"$FIREFOX_PLUGIN"'`' fi else logg warn 'A null Firefox add-on ID was detected for `'"$FIREFOX_PLUGIN"'`' fi done fi done {{ end -}}