Skip to content

Instantly share code, notes, and snippets.

@Luzifer
Last active November 23, 2019 19:17
Show Gist options
  • Save Luzifer/0cc2d744c98b6ae11aa55f9f95a152d0 to your computer and use it in GitHub Desktop.
Save Luzifer/0cc2d744c98b6ae11aa55f9f95a152d0 to your computer and use it in GitHub Desktop.
Generate an user.js configuration for Firefox to have it less talkative

Luzifer / firefox-config

This repo contains an approach to create a reproducible configuration (as far as possible) for Firefox on my Linux system.

Usage

  • Put mkuserjs.sh into your ~/.mozilla/firefox/<profile id> folder
  • Create your own user_js_customize.sh file next to it
  • Execute the mkuserjs.sh file: bash mkuserjs.sh
  • Review the diff and decide whether to write or to discard the change
  • Restart your Firefox to apply the config
#!/bin/bash
set -euo pipefail
master_sha=$(curl -sSfL 'https://api.github.com/repos/ghacksuserjs/ghacks-user.js/branches/master' | jq -r '.commit.sha')
base_config="https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/${master_sha}/user.js"
profile="$(dirname $(realpath $0))"
target_file="${profile}/user.js"
function add_setting() {
remove_setting "$1"
settings+=("user_pref('$1', $2);")
}
function cleanup() {
rm -f "${target_file}.tmp"
}
remove_comments() {
sed \
-e 's/^[[:space:]]*\/\/.*$//' \
-e '/^\/\*.*\*\/$/d' \
-e '/^\/\*/,/\*\//d' \
-e '/^[[:space:]]*$/d' \
-e 's/);[[:space:]]*\/\/.*/);/'
}
function remove_setting() {
for i in "${!settings[@]}"; do
if [[ ${settings[i]} =~ ^user_pref\([\'\"]$1[\'\"].*\)\;$ ]]; then
unset 'settings[i]'
fi
done
}
# Cleanup tempfile even on abort
trap cleanup EXIT
IFS=$'\n'
# Download latest template file
settings=(
# Header banner
"/*** DEFAULTS AT ${master_sha} ***/"
""
# Content of defaults
$(curl -sSfL "${base_config}" | remove_comments | grep "^\s*user_pref" | sed 's/);.*$/);/')
# Banner to serve as divider between ghacks user.js defaults and overwritten settings
""
"/*** END OF DEFAULTS ***/"
""
)
[[ -e ${profile}/user_js_customize.sh ]] && source "${profile}/user_js_customize.sh"
truncate -s 0 "${target_file}.tmp"
# Write temporary file for comparison
for line in "${settings[@]}"; do
echo "$line" >>"${target_file}.tmp"
done
# Create empty user.js in case it does not yet exist for diffing
[[ -f ${target_file} ]] || touch "${target_file}"
diff --color=always -wu "${target_file}" "${target_file}.tmp" && {
echo "No changes detected, exiting now..."
exit 0
} || true
echo -en "\nOkay to write? Enter to continue, Ctrl+C to abort..."
read
mv "${target_file}.tmp" "${target_file}"
###
# Overrides for downloaded ghacks user.js
###
remove_setting "_user.js.parrot"
# 0102: set START page (0=blank, 1=home, 2=last visited page, 3=resume previous session)
add_setting "browser.startup.page" "3"
# 0212: enforce fallback text encoding to match en-US
add_setting "intl.charset.fallback.override" "'utf-8'"
# 0515: disable Screenshots
add_setting "extensions.screenshots.upload-disabled" "true"
# 0701: disable IPv6
add_setting "network.dns.disableIPv6" "false"
# 0708: disable FTP [FF60+]
add_setting "network.ftp.enabled" "false"
# 0901: disable saving passwords
add_setting "signon.rememberSignons" "false"
# 1023: set the minimum interval between session save operations
remove_setting "browser.sessionstore.interval"
# 1401: disable websites choosing fonts (0=block, 1=allow)
add_setting "browser.display.use_document_fonts" "1"
# 1825: disable widevine CDM (Content Decryption Module)
add_setting "media.gmp-widevinecdm.visible" "true"
add_setting "media.gmp-widevinecdm.enabled" "true"
# 1830: disable all DRM content (EME: Encryption Media Extension)
add_setting "media.eme.enabled" "true"
# 2001: disable WebRTC (Web Real-Time Communication)
add_setting "media.peerconnection.enabled" "true"
# 2510: disable Web Audio API [FF51+]
add_setting "dom.webaudio.enabled" "true"
# 2010: disable WebGL (Web Graphics Library)
remove_setting "webgl.disabled"
remove_setting "webgl.enable-webgl2"
# 2012: limit WebGL
remove_setting "webgl.min_capability_mode"
remove_setting "webgl.disable-extensions"
remove_setting "webgl.disable-fail-if-major-performance-caveat"
# 2022: disable screensharing
remove_setting "media.getusermedia.screensharing.enabled"
remove_setting "media.getusermedia.browser.enabled"
remove_setting "media.getusermedia.audiocapture.enabled"
# 2302: disable service workers [FF32, FF44-compat]
add_setting "dom.serviceWorkers.enabled" "true"
# 2401: disable website control over browser right-click context menu
add_setting "dom.event.contextmenu.enabled" "true"
# 2402: disable website access to clipboard events/content
add_setting "dom.event.clipboardevents.enabled" "true"
# 2403: disable middlemouse paste leaking clipboard content on Linux after autoscroll
add_setting "middlemouse.paste" "true"
# 2404: disable clipboard commands (cut/copy) from "non-privileged" content [FF41+]
add_setting "dom.allow_cut_copy" "true"
# 2422: disable WebAssembly [FF52+] [SETUP-PERF]
add_setting "javascript.options.wasm" "true"
# 2505: disable media device enumeration [FF29+]
remove_setting "media.navigator.enabled"
# 2607: disable various developer tools in browser context
remove_setting "devtools.chrome.enabled"
# 2608: disable WebIDE to prevent remote debugging and ADB extension download
remove_setting "devtools.debugger.remote-enabled"
remove_setting "devtools.webide.enabled"
remove_setting "devtools.webide.autoinstallADBExtension"
# 2650: discourage downloading to desktop
add_setting "browser.download.folderList" "1"
# 2654: disable "open with" in download dialog [FF50+] [SETUP-HARDEN]
add_setting "browser.download.forbid_open_with" "true"
# 2701: disable 3rd-party cookies and site-data [SETUP-WEB]
add_setting "network.cookie.cookieBehavior" "4"
# 2803: set what items to clear on shutdown (if 2802 is true) [SETUP-CHROME]
add_setting "privacy.clearOnShutdown.cookies" "false"
add_setting "privacy.clearOnShutdown.history" "false"
add_setting "privacy.clearOnShutdown.offlineApps" "false"
add_setting "privacy.clearOnShutdown.sessions" "false"
# 2804: reset default items to clear with Ctrl-Shift-Del (to match 2803) [SETUP-CHROME]
add_setting "privacy.cpd.cookies" "false"
add_setting "privacy.cpd.history" "false"
add_setting "privacy.cpd.offlineApps" "false"
add_setting "privacy.cpd.sessions" "false"
# 4001: enable First Party Isolation [FF51+]
remove_setting "privacy.firstparty.isolate"
# 4504: enable RFP letterboxing [FF67+]
remove_setting "privacy.resistFingerprinting.letterboxing"
# 4605: [2515] disable site specific zoom
add_setting "browser.zoom.siteSpecific" "false"
# 4607: [2503] disable giving away network info [FF31+]
add_setting "dom.netinfo.enabled" "false"
# 4608: [2021] disable the SpeechSynthesis (Text-to-Speech) part of the Web Speech API
add_setting "media.webspeech.synth.enabled" "false"
# 4612: [2511] disable MediaDevices change detection [FF51+]
add_setting "media.ondevicechange.enabled" "false"
# 4613: [2011] disable WebGL debug info being available to websites
add_setting "webgl.enable-debug-renderer-info" "false"
###
# Custom preferences
###
# 5000: Disable WELCOME & WHAT's NEW NOTICES
add_setting "browser.startup.homepage_override.mstone" "'ignore'"
# 5000: open bookmarks in a new tab
add_setting "browser.tabs.loadBookmarksInTabs" "true"
# 5000: disable "What's New"
add_setting "browser.messaging-system.whatsNewPanel.enabled" "false"
# 5000: Disable bundled Pocket extension
add_setting "extensions.pocket.enabled" "false"
# 5000: Disable recomment extensions
add_setting "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" "false"
# 5000: Disable recomment features
add_setting "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" "false"
# Ensure browser is not closed accidentally
add_setting "browser.sessionstore.warnOnQuit" "true"
# Allow switching tabs using scroll wheel
add_setting "toolkit.tabbox.switchByScrolling" "true"
# Scroll down to get down on the page
add_setting "mousewheel.default.delta_multiplier_y" "-100"
# Lower required width for tabs, more space for tab-messis
add_setting "browser.tabs.tabMinWidth" "10"
# Let Ctrl+Tab switch through tabs in order they are displayed
add_setting "browser.ctrlTab.recentlyUsedOrder" "false"
# Show downloads button all the time
add_setting "browser.download.autohideButton" "false"
# Apply configuration to devtools
add_setting "devtools.netmonitor.features.webSockets" "true"
add_setting "devtools.theme" "'dark'"
add_setting "devtools.toolbox.host" "'window'"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment