diff --git a/src/application/collections/linux.yaml b/src/application/collections/linux.yaml index 8f7503ff..c1c25ab9 100644 --- a/src/application/collections/linux.yaml +++ b/src/application/collections/linux.yaml @@ -3558,82 +3558,98 @@ functions: parameters: - name: prefName - name: jsonValue - # prefs.js file (https://web.archive.org/web/20221029211757/https://kb.mozillazine.org/Prefs.js_file) exists at - # - Default installation: - # ~/.mozilla/firefox//prefs.js - # - Flatpak installation: - # ~/.var/app/org.mozilla.firefox/.mozilla/firefox//prefs.js - # - Snap installation: - # ~/snap/firefox/common/.mozilla/firefox//prefs.js + docs: |- + This script either creates or updates the `user.js` file to set specific Mozilla Firefox preferences. + + The `user.js` file can be found in a Firefox profile folder [1] and its location depends on the type of installation: + + - Default: `~/.mozilla/firefox//user.js` + - Flatpak: `~/.var/app/org.mozilla.firefox/.mozilla/firefox//user.js` + - Snap: `~/snap/firefox/common/.mozilla/firefox//user.js` + + While the `user.js` file is optional [2], if it's present, the Firefox application will prioritize its settings over + those in `prefs.js` upon startup [1][2]. To prevent potential profile corruption, Mozilla advises against editing + `prefs.js` directly [2]. + + [1]: https://web.archive.org/web/20230811005205/https://kb.mozillazine.org/User.js_file "User.js file - MozillaZine Knowledge Base" + [2]: https://web.archive.org/web/20221029211757/https://kb.mozillazine.org/Prefs.js_file "Prefs.js file - MozillaZine Knowledge Base" code: |- pref_name='{{ $prefName }}' pref_value='{{ $jsonValue }}' echo "Setting preference \"$pref_name\" to \"$pref_value\"." - pref_file_paths=( - ~/.mozilla/firefox/*/prefs.js - ~/.var/app/org.mozilla.firefox/.mozilla/firefox/*/prefs.js - ~/snap/firefox/common/.mozilla/firefox/*/prefs.js + declare -a profile_paths=( + ~/.mozilla/firefox/*/ + ~/.var/app/org.mozilla.firefox/.mozilla/firefox/*/ + ~/snap/firefox/common/.mozilla/firefox/*/ ) - declare -i total_files_found=0 - for pref_file in "${pref_file_paths[@]}"; do - if [ -f "$pref_file" ]; then - ((total_files_found++)) - echo "$pref_file:" - pref_start="user_pref(\"$pref_name\"," - pref_line="user_pref(\"$pref_name\", $pref_value);" - if ! grep --quiet "^$pref_start" "${pref_file}"; then - echo $'\t'"Preference is not configured before." - echo -n $'\n'"$pref_line" >> "$pref_file" - echo $'\t'"Successfully configured." - else - if grep --quiet "^$pref_line$" "${pref_file}"; then - echo $'\t'"Skipping. Preference is already configured as expected." - else - sed --in-place "/^$pref_start/d" "$pref_file" - echo $'\t'"Deleted assignment with unexpected value." - echo -n $'\n'"$pref_line" >> "$pref_file" - echo $'\t'"Successfully reconfigured with expected value." - fi - fi + declare -i total_profiles_found=0 + for profile_dir in "${profile_paths[@]}"; do + if [ ! -d "$profile_dir" ]; then + continue + fi + if [[ ! "$(basename "$profile_dir")" =~ ^[a-z0-9]{8}\..+ ]]; then + continue # Not a profile folder + fi + ((total_profiles_found++)) + user_js_file="${profile_dir}user.js" + echo "$user_js_file:" + if [ ! -f "$user_js_file" ]; then + touch "$user_js_file" + echo $'\t''Created new user.js file' + fi + pref_start="user_pref(\"$pref_name\"," + pref_line="user_pref(\"$pref_name\", $pref_value);" + if ! grep --quiet "^$pref_start" "${user_js_file}"; then + echo -n $'\n'"$pref_line" >> "$user_js_file" + echo $'\t'"Successfully added a new preference in $user_js_file." + elif grep --quiet "^$pref_line$" "$user_js_file"; then + echo $'\t'"Skipping, preference is already set as expected in $user_js_file." + else + sed --in-place "/^$pref_start/c\\$pref_line" "$user_js_file" + echo $'\t'"Successfully replaced the existing incorrect preference in $user_js_file." fi done - if [ "$total_files_found" -eq 0 ]; then - echo "No changes, no preference file is found." + if [ "$total_profiles_found" -eq 0 ]; then + echo 'No profile folders are found, no changes are made.' else - echo "Ensured that $total_files_found profiles are compilant." + echo "Preferences verified in $total_profiles_found profiles." fi revertCode: |- pref_name='{{ $prefName }}' pref_value='{{ $jsonValue }}' - echo "Restoring \"$pref_name\" to its default." - pref_file_paths=( - ~/.mozilla/firefox/*/prefs.js - ~/.var/app/org.mozilla.firefox/.mozilla/firefox/*/prefs.js - ~/snap/firefox/common/.mozilla/firefox/*/prefs.js + echo "Reverting preference: \"$pref_name\" to its default." + declare -a profile_paths=( + ~/.mozilla/firefox/*/ + ~/.var/app/org.mozilla.firefox/.mozilla/firefox/*/ + ~/snap/firefox/common/.mozilla/firefox/*/ ) - declare -i total_files_found=0 - for pref_file in "${pref_file_paths[@]}"; do - if [ -f "$pref_file" ]; then - ((total_files_found++)) - echo "$pref_file:" - pref_start="user_pref(\"$pref_name\"," - pref_line="user_pref(\"$pref_name\", $pref_value);" - if ! grep --quiet "^$pref_start" "${pref_file}"; then - echo $'\t'"Skipping. Preference is not configured before." - else - if grep --quiet "^$pref_line$" "${pref_file}"; then - sed --in-place "/^$pref_line/d" "$pref_file" - echo $'\t'"Successfully restored preference value to its default." - else - echo $'\t'"Skipping, the preference has value that is not configured by privacy.sexy." - fi + declare -i total_profiles_found=0 + for profile_dir in "${profile_paths[@]}"; do + user_js_file="${profile_dir}user.js" + if [ ! -f "$user_js_file" ]; then + continue + fi + ((total_profiles_found++)) + echo "$user_js_file:" + pref_start="user_pref(\"$pref_name\"," + pref_line="user_pref(\"$pref_name\", $pref_value);" + if ! grep --quiet "^$pref_start" "${user_js_file}"; then + echo $'\t''Skipping, preference was not configured before.' + elif grep --quiet "^$pref_line$" "${user_js_file}"; then + sed --in-place "/^$pref_line/d" "$user_js_file" + echo $'\t''Successfully reverted preference to default.' + if ! grep --quiet '[^[:space:]]' "$user_js_file"; then + rm "$user_js_file" + echo $'\t''Removed user.js file as it became empty.' fi + else + echo $'\t''Skipping, the preference has value that is not configured by privacy.sexy.' fi done - if [ "$total_files_found" -eq 0 ]; then - echo "No changes, no preference file is found." + if [ "$total_profiles_found" -eq 0 ]; then + echo 'No reversion was necessary.' else - echo "Ensured that $total_files_found profiles are compilant." + echo "Preferences verified in $total_profiles_found profiles." fi - name: RenameFile