2023-01-14 02:14:43 -08:00
{{- if ne .host.distro.family "windows" -}}
#!/usr/bin/env bash
{{ includeTemplate "universal/profile" }}
{{ includeTemplate "universal/logg" }}
2023-01-29 21:21:11 -08:00
# Firefox plugins: {{ list (.firefoxAddOns | toString | replace "[" "" | replace "]" "") | uniq | join " " }}
2023-01-14 02:14:43 -08:00
### Add Firefox enterprise profile
2023-01-29 23:27:31 -08:00
# TODO - figure out how to do this for other installations like Flatpak and macOS and Librewolf
2023-01-14 02:14:43 -08:00
for FIREFOX_DIR in '/usr/lib/firefox' '/usr/lib/firefox-esr' '/Applications/Firefox.app/Contents/Resources'; do
2023-01-29 23:27:31 -08:00
if [ -d " $ FIREFOX_DIR " ] && [ -d " ${ XDG_DATA_DIR : - $ HOME / . local / share } /firefox" ] && command -v rsync > /dev/null; then
sudo rsync -artvu " ${ XDG_DATA_DIR : - $ HOME / . local / share } /firefox/" " $ FIREFOX_DIR "
2023-01-14 02:14:43 -08:00
fi
done
2023-01-25 00:46:31 -08:00
### 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
2023-01-29 23:27:31 -08:00
logg info "Processing Firefox profile location $ SETTINGS_DIR "
unset FIREFOX_EXE
2023-01-25 00:46:31 -08:00
if [ " $ SETTINGS_DIR " == " $ HOME /.var/app/org.mozilla.firefox" ]; then
2023-01-29 21:31:10 -08:00
if ! command -v org.mozilla.firefox > /dev/null; then
continue
2023-01-29 23:27:31 -08:00
else
FIREFOX_EXE="$(which org.mozilla.firefox)"
2023-01-29 21:31:10 -08:00
fi
2023-01-25 00:46:31 -08:00
elif [ " $ SETTINGS_DIR " == " $ HOME /.var/app/io.gitlab.librewolf-community/.librewolf" ]; then
2023-01-29 21:31:10 -08:00
if ! command -v io.gitlab.librewolf-community > /dev/null; then
continue
2023-01-29 23:27:31 -08:00
else
FIREFOX_EXE="$(which io.gitlab.librewolf-community)"
2023-01-29 21:31:10 -08:00
fi
2023-01-25 00:46:31 -08:00
elif [ " $ SETTINGS_DIR " == " $ HOME /Library/Application Support/Firefox/Profiles" ]; then
FIREFOX_EXE="/Applications/Firefox.app/Contents/MacOS/firefox"
2023-01-29 21:31:10 -08:00
if [ ! -f " $ FIREFOX_EXE " ]; then
continue
fi
2023-01-29 21:09:12 -08:00
elif [ " $ SETTINGS_DIR " == " $ HOME /Library/Application Support/LibreWolf/Profiles" ]; then
2023-01-25 00:46:31 -08:00
FIREFOX_EXE="/Applications/LibreWolf.app/Contents/MacOS/librewolf"
2023-01-29 21:31:10 -08:00
if [ ! -f " $ FIREFOX_EXE " ]; then
continue
fi
2023-01-25 00:46:31 -08:00
elif [ " $ SETTINGS_DIR " == " $ HOME /snap/firefox/common/.mozilla/firefox" ]; then
2023-01-29 23:27:31 -08:00
FIREFOX_EXE="/snap/bin/firefox"
if [ ! -f " $ FIREFOX_EXE " ]; then
2023-01-29 21:31:10 -08:00
continue
fi
elif [ " $ SETTINGS_DIR " == " $ HOME /.mozilla/firefox" ]; then
2023-01-25 00:46:31 -08:00
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
2023-01-14 02:14:43 -08:00
fi
2023-01-25 00:46:31 -08:00
### Initiatize Firefox default profiles
if command -v " $ FIREFOX_EXE " > /dev/null; then
2023-01-29 23:27:31 -08:00
logg info "Firefox executable set to $ FIREFOX_EXE "
2023-01-25 00:46:31 -08:00
if [ ! -d " $ SETTINGS_DIR " ]; then
logg info 'Running Firefox headlessly to generate default profiles'
2023-01-29 23:27:31 -08:00
timeout 8 " $ FIREFOX_EXE " --headless
2023-01-25 00:46:31 -08:00
logg info 'Finished running Firefox headlessly'
fi
2023-01-29 23:27:31 -08:00
DEFAULT_RELEASE_PROFILE="$(find " $ SETTINGS_DIR " -mindepth 1 -maxdepth 1 -name "*.default-*")"
2023-01-25 00:46:31 -08:00
DEFAULT_PROFILE="$(find " $ SETTINGS_DIR " -mindepth 1 -maxdepth 1 -name "*.default")"
2023-01-29 23:27:31 -08:00
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_DIR : - $ HOME / . local / share } /firefox/profiles.ini" to profile directory"
2023-01-25 00:46:31 -08:00
if [ -d /Applications ] && [ -d /System ]; then
# macOS
2023-01-29 23:27:31 -08:00
cp -f " ${ XDG_DATA_DIR : - $ HOME / . local / share } /firefox/profiles.ini" " $ SETTINGS_DIR /../profiles.ini"
2023-01-25 00:46:31 -08:00
else
# Linux
2023-01-29 23:27:31 -08:00
cp -f " ${ XDG_DATA_DIR : - $ HOME / . local / share } /firefox/profiles.ini" " $ SETTINGS_DIR /profiles.ini"
2023-01-25 00:46:31 -08:00
fi
### Install Firefox addons (using list declared in .chezmoidata.yaml)
2023-01-30 00:19:32 -08:00
for FIREFOX_PLUGIN in {{ list (.firefoxAddOns | toString | replace "[" "" | replace "]" "") | uniq | join " " }}; do
2023-01-25 00:46:31 -08:00
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 / ^ < scri . * application \/ json " >// ' | 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"
2023-01-29 23:27:31 -08:00
PLUGIN_FOLDER="$(echo " $ PLUGIN_FILENAME " | sed 's/.xpi$//')"
if [ ! -d " $ SETTINGS_DIR /profile.primary/extensions/ $ PLUGIN_FOLDER " ]; then
2023-01-25 01:03:54 -08:00
logg info 'Downloading plugin file for '" $ PLUGIN_FILENAME "' ('" $ FIREFOX_PLUGIN "')'
2023-01-29 23:27:31 -08:00
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 "'`'
2023-01-25 00:46:31 -08:00
fi
else
logg warn 'A null Firefox add-on filename was detected for `'" $ FIREFOX_PLUGIN "'`'
2023-01-14 02:14:43 -08:00
fi
else
2023-01-25 00:46:31 -08:00
logg warn 'A null Firefox add-on ID was detected for `'" $ FIREFOX_PLUGIN "'`'
2023-01-14 02:14:43 -08:00
fi
2023-01-25 00:46:31 -08:00
done
fi
done
2023-01-14 02:14:43 -08:00
{{ end -}}