Compare commits

...

86 Commits

Author SHA1 Message Date
3b90e6e592 end of v64 2019-01-17 05:11:29 +00:00
45bd5ccc02 PB Mode: ref added 2019-01-16 02:07:06 +00:00
7bf5790f2b RFP: FF66 changes to UA HTTP Headers 2019-01-11 05:14:59 +00:00
075d6fe6e4 2615: s/cut keys: bug fix in 66+ 2019-01-11 05:09:14 +00:00
4604cf0d4e references to other prefs s/be explicit 2018-12-21 11:02:40 +00:00
b845f8fe3a Update README.md
OK, I give up. I would've removed those commits by force-pushing, but the branch is protected. #NotMyFault
2018-12-20 19:53:48 +00:00
96063027ba Update README.md
second attempt at fixing the weird title...
2018-12-20 19:44:27 +00:00
186fb1c9be Update README.md
fix for the weird page title ![][b]
https://ghacksuserjs.github.io/ghacks-user.js/
2018-12-20 19:42:28 +00:00
ac4e764c37 http2, altsvc, ssl session ids vs FPI vs TB #571 2018-12-18 15:54:57 +00:00
5b0952f60a network.auth.subresource-http-auth-allow 2018-12-17 13:00:27 +00:00
5bd5f6b28e 0912: HTTP Auth sub-resources #585 (#602) 2018-12-18 01:41:37 +13:00
55c2cacbce 0335: toolkit.telemetry.coverage.opt-out (#600) 2018-12-17 22:43:45 +13:00
4badc42879 0105b: kill snippets endpoint #528
it's too hard to follow AS changes, and work out if disabling showing items (basic toggling of show/hide sections etc) actually stops downloading a localized local copy etc. For items we actually want to block, let the endpoint slaughter begin.
2018-12-17 09:36:26 +00:00
6946a01232 Update troubleshooter.js 2018-12-17 08:19:14 +00:00
da80e39064 0105s: description s/be self explanatory #578
when filtered and 0105a is not shown, AS doesn't mean anything
2018-12-16 17:37:42 +00:00
c1d6d81528 add PERF tags to wasm, asm.js, closes #599 2018-12-16 14:10:32 +00:00
d5ece0f6f4 1700s: revamp Containers header #585 (#596) 2018-12-14 07:05:43 +00:00
f6ea20a8b0 0335: Telemetry Coverage endpoint
let's just coverage-our-ass on this one

While I don't mind telemetry (development needs meaningful feedback to better the product), and I trust the data is not PII, and/or anonymized into buckets etc (you can check this you know), and I understand this one needs to be outside the Telemetry pref in order to gather the one-time ping ... and I trust Mozilla's motives ... I'm starting to get a little annoyed at the non-stop incessant increasing telemetry bullshittery and ass-fuckery around sending data home, and the lengths some Mozilla devs will go to, to hide this info (hidden prefs, access denied tickets to hide discussion of what should be public, and even **not even adhering to their own documentation**).

I will also be killing as many Activity Stream endpoints as well - as long as they are in line with our js - pocket, snippets, onboarding etc. And I will add those from personal as inactive for end-users - eg cfr
2018-12-13 17:28:16 +00:00
645492e82f grammar, case, etc, closes #594
thanks @Just-me-ghacks
2018-12-14 04:49:50 +13:00
15c68dc344 disable System Add-on updates (#595)
remember the new Coverage Telemetry shit? with a **hidden** opt-out pref? guess what, they are already collecting for 3 months ...

https://bugzilla.mozilla.org/show_bug.cgi?id=1487578 - **3 months ago**: "I see data coming in that looks reasonable"

guess what else ...

"It has also replaced the previous version that was there (from bug 1480194)" and oh, surprise surprise, 1480194 is ACCESS DENIED!

they're not just using private tickets to hide security critical information from potential hackers and blackhats, no they also use it to hide shady AF things. Things that they fully know are shady as fuck and that they absolutely know a lot of people would not like. There's simply no other reason why they'd do that

but wait, that's not all. If you think an opt-out pref that 99% of people wouldn't know about even if it showed up in about:config BUT ALSO HAPPENS TO BE HIDDEN is kind of questionable, well ... the system addon that they use for this shit apparently looked or still looks for `toolkit.telemetry.coverage.opt-out` [1] instead of `toolkit.coverage.opt-out` as their documentation [2] claims

[1] https://github.com/mozilla/one-off-system-add-ons/pull/131/files#diff-6e0cbf76986d04383ccb32a29ef27a7aR25
[2] https://hg.mozilla.org/mozilla-central/file/tip/toolkit/components/telemetry/docs/data/coverage-ping.rst#l32

It's time to opt out of all that shit for good. Disable system addon updates and kill it at the root

> In FF61 and lower, you will not get any System Add-on updates except when you update Firefox

on its own that's not true. You will get SA updates unless you disable app update checks + auto install. Let's just remove that as well.
2018-12-14 03:21:57 +13:00
04b797f1aa 0209: remove trailing space
@Just-me-ghacks 💋
2018-12-13 11:14:44 +00:00
e60abd6c44 64-beta 2018-12-12 17:17:33 +00:00
d55b8176ad dyslexia and/or dementia 2018-12-12 16:52:12 +00:00
31adbba774 5000s: disable CFR 2018-12-12 16:34:27 +00:00
3c247a2c5b Update ghacks-clear-[removed].js 2018-12-12 13:22:58 +00:00
879f0abf28 2201: more garbage 2018-12-12 13:21:24 +00:00
d97d0ec0f5 media.peerconnection*
covered by user_pref("media.peerconnection.enabled", false);
2018-12-12 13:09:03 +00:00
3916e38681 taking out the garbage (#590) 2018-12-13 02:02:38 +13:00
51ac69874b 0105* remove // has setting 2018-12-12 11:58:48 +00:00
2d956d04f3 move 1260 to 122x (#591)
* move 1260 to 122x

"disable or limit SHA-1 certificates" is about certs, not ciphers.
Because CERTS is 1st in the title I moved it to the 1st item there because it's arguably also the most important of the lot (and renumbered the rest)
We can also drop HSTS from the subgroup title because there's nothing HSTS left atm.
2018-12-13 00:52:49 +13:00
9d6bfb650c disable Telemetry Coverage (#589) 2018-12-13 00:29:29 +13:00
ccdd4decf0 Pocket: 0510->0370
Pocket is no longer a System Add-on in FF64+
2018-12-12 08:25:25 +00:00
f0fbfd3086 network.auth.subresource-img-cross-origin-http-auth-allow #585 2018-12-11 17:44:19 +00:00
88b747ef36 0911: remove it, #585
it is default false in FF59+
2018-12-11 17:42:19 +00:00
c6ebe36165 1022: resume from crash=>inactive, closes #575 2018-12-11 17:28:21 +00:00
7684e83aba 0102 add SR info #575 2018-12-11 17:18:26 +00:00
4f37975566 browser.sessionstore.max_windows_undo #575 2018-12-11 16:49:38 +00:00
26b874bed7 1020: remove max_windows #575 2018-12-11 16:43:11 +00:00
61be5ae563 all Deprecations + new ADB extension prefs (#587) 2018-12-12 05:07:28 +13:00
ef1e61ebcd start 64-alpha 2018-12-11 16:05:07 +00:00
205c48d9d3 final 63 release 2018-12-11 15:49:31 +00:00
0e1b0a4b6e move 0370 to 0105b (#586) 2018-12-12 04:40:29 +13:00
778dc89bb6 2002 WebRTC tests #580
FYI, the https://www.privacytools.io/webrtc.html test in our wiki is 404, so I gave it a strikethru and added this one. This is also handy for 2001, but do we need to double up on it? We're only disabling WebRTC because of IP leaks, so I don't see the point in testing if WebRTC is disabled.
2018-12-11 00:40:03 +00:00
23733097a9 2302 FF version 2018-12-11 00:13:07 +00:00
71a2d393f3 minor wording changes (#583) 2018-12-11 11:23:00 +13:00
74ebacc0dd obey rules for [setting] tag location #578
all setting tags must be between `/* ... ***/`
2018-12-10 19:52:48 +00:00
45e3b3a0e0 2682: put correct version back
0a67cdec8b (comments)
2018-12-10 19:35:41 +00:00
8172f730d3 Update README.md 2018-12-10 19:26:17 +00:00
5c85e61bb4 4000: remove old FPI notes (#581) 2018-12-10 18:36:07 +00:00
0a67cdec8b #578 cleanups (#576)
- cleanup of tags placement, order consistency, and to use square brackets (allows usage elsewhere to not get tagged, eg 1402)
- other bits and bobs
2018-12-11 07:18:26 +13:00
b85668c2cd make description & info & notes concurrent #574 2018-12-08 04:10:13 +13:00
786839ffc1 2701: fix split multi-[notes] 2018-12-06 08:16:01 +00:00
8313f2e01a 1020: fix description
Session Restore cannot be disabled in Normal mode, it is also used internally. FYI: PB Mode does not use Session Restore. The description is still not 100%, as it refers to what is restored, not what is kept in the recovery.jsonlz4 (at least for tabs)
2018-12-06 05:41:25 +00:00
0a87c99a0e 1203: ssl session ids are 24hrs 2018-12-05 20:58:07 +00:00
91fed43fc7 0703 atl-svc, better ref, #571 2018-12-05 20:36:20 +00:00
74f029566e enforce DOMHighResTimeStamp API #491
flipped true in FF54: https://bugzilla.mozilla.org/show_bug.cgi?id=1026804 but unsure when the pref itself was introduced. note: other timing prefs were always in 2400's see 4602: [2411] disable resource/navigation timing / 4603: [2412] disable timing attacks
2018-12-04 10:34:02 +00:00
571be93ae0 proper case convention after tags
Can't believe I did this. Out of 32 `[setup*` and  9 `[warning]` tags (excluding the readme), I let one capital letter get past me, the bastard!
2018-12-04 10:26:44 +00:00
11b16c9c6d move PB mode into STARTUP section #567 2018-12-04 08:51:19 +00:00
c4ec4dbc77 move 0000 to personal #567
it has zero to do with privacy etc, and in fact most users will only ever encounter it once (and check the box) when they first go to about:config, so it's not even useful as an override or a new profile IMO. This removes one of three numbers that don't have a section
2018-12-04 08:34:36 +00:00
67998eb4af section naming convention consistency 2018-12-04 08:27:52 +00:00
834857b564 tag sections #567 2018-12-04 20:03:19 +13:00
25923f1acd add index #567 2018-12-04 06:03:11 +00:00
85eaba2571 TAG! You're it! #545 2018-12-04 18:36:03 +13:00
51237f6889 updater.sh: add -e option for ESR users (#565) 2018-12-01 14:47:58 +00:00
74e753d0c5 fix profile check (#564) 2018-12-01 14:18:38 +00:00
db56940422 typos 2018-11-29 14:10:08 +00:00
400d764a93 Update updater.sh (#558)
* just some polishing
2018-11-27 16:57:51 +00:00
f3e2bfa76d browser.crashReports.unsubmittedCheck.autoSubmit 2018-11-26 15:33:36 +00:00
d4907faa8e updater.sh v2.1 (#554)
when argument `-l` is used, parse profiles.ini instead of just listing folders in the default profiles dir.
This allows to select profiles located outside of the default profiles directory and makes selection easier because it also shows the profile name (and selection is by number instead of having to copy-paste a path)
2018-11-26 14:44:52 +00:00
62351bfbf5 updater.sh v2.0 (#543)
* lots of new arguments

`usage: ./updater.sh [-h] [-p PROFILE] [-u] [-d] [-s] [-n] [-b] [-c] [-v] [-r] [-o OVERRIDE]`

Args can be written separately or together. Examples:

```txt
./updater.sh -sdc
./updater.sh -sd -o relaxed.js
./updater.sh -s -d
```

Deprecated arguments still work (for now!)
2018-11-25 17:16:05 +00:00
b182946ae4 Tor-related warnings (#551)
Also reworded some stuff.
2018-11-24 05:19:24 +00:00
2ae3a3e4e1 1700s: enable containers, #438
AFAIK there's no technical reasons for containers to be disabled in FF63+
2018-11-21 23:53:00 +00:00
0ff610c056 there is no spoon 2018-11-20 18:14:23 +00:00
661a314e28 RFP: pointerEvent.pointerid 2018-11-20 17:36:04 +00:00
106f46d053 updater.sh restructuring/re-write (#541)
* Uses `perl` as a last resort if `curl` and `wget`  are not available (fixes #537)
* Aborts and notifies user if none of the above are installed 
* Better use of functions
* When version numbers are checked, the contents are immediately saved to a temp dir.  This allows us to skip using wget/curl/perl a second time
* Improved messages for users
* Added various font colors for ease of use and aesthetics
2018-11-19 17:34:14 +00:00
643cba63cf Activity Stream is no longer a System Add-on 2018-11-19 03:00:40 +00:00
b5c5d8e9d1 removed browser.eme.ui.enabled 2018-11-19 00:37:42 +00:00
36b90cd5e6 1830: remove hiding the DRM UI
out of interest, it no longer requires a restart
2018-11-19 00:34:56 +00:00
299a03663f 0351: move *autoSubmit to deprecated
https://github.com/ghacksuserjs/ghacks-user.js/issues/302#issuecomment-359245047
2018-11-19 00:12:07 +00:00
13550d18a1 update [SETTING] info (#538) 2018-11-19 12:56:12 +13:00
c12eb0fdc6 0201b+2305 Permissions API info 2018-11-18 12:56:51 +00:00
acbf881b1f saving the world bytes at a time 2018-11-15 15:47:21 +00:00
7351e561c4 1243: mixed OBJECT_SUBREQUESTS 2018-11-15 07:06:34 +00:00
4e42bad6a1 0201: default geo=> inactive, #533 2018-11-14 17:12:03 +00:00
b85e748b53 2204: FS API=>inactive, #533 2018-11-13 18:56:51 +00:00
0cc4007eda 1202: tls.min => inactive #533
TLS 1.0 and 1.1 are still secure. Sure, later versions are more secure, but 98% of the web is already upgraded - less than 2% of sites use < v1.2. So it's not very likely you would come across a site that requires it, but if you did, what's the point in breaking it. Mozilla and Chrome already have plans to deprecate TLS 1.0 & 1.1, and force that last 2% of sites.

TLS settings can be FP'ed without JS. By sticking with the defaults, I do not see any security issues, but an increase in potential anti-FPing. TBH, the chances of either (i.e being FP'ed with TLS as a entropy point, or being compromised due to TLS<1.2) are slim to non anyway.

Any arguments, please see @earthlng
2018-11-13 16:19:23 +00:00
6 changed files with 981 additions and 608 deletions

View File

@ -6,6 +6,10 @@ The `ghacks user.js` is a **template** which aims to provide as much privacy and
Everyone, experts included, should at least read the [implementation](https://github.com/ghacksuserjs/ghacks-user.js/wiki/1.3-Implementation) wiki page, as it contains important information regarding a few `ghacks user.js` settings.
Note that we do *not* recommend connecting over Tor on Firefox. Use the [Tor Browser](https://www.torproject.org/projects/torbrowser.html.en) if your [threat model](https://www.torproject.org/about/torusers.html.en) calls for it, or for accessing hidden services.
Also be aware that this `user.js` is made specifically for Firefox. Using it as-is in other Gecko-based browsers can be counterproductive, especially in the Tor Browser.
Sitemap: [Releases](https://github.com/ghacksuserjs/ghacks-user.js/releases), [changelogs](https://github.com/ghacksuserjs/ghacks-user.js/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3Achangelog), [Wiki](https://github.com/ghacksuserjs/ghacks-user.js/wiki), [stickies](https://github.com/ghacksuserjs/ghacks-user.js/issues?q=is%3Aissue+is%3Aopen+label%3A%22sticky+topic%22). [diffs](https://github.com/ghacksuserjs/ghacks-user.js/issues?q=is%3Aissue+label%3Adiffs)
### ![][b] acknowledgments
@ -13,11 +17,11 @@ Literally thousands of sources, references and suggestions. That said...
* Martin Brinkmann at [ghacks](https://www.ghacks.net/) <sup>1</sup>
* The ghacks community and commentators
* [12bytes](http://12bytes.org/tech/firefox/firefoxgecko-configuration-guide-for-privacy-and-performance-buffs)
* The 12bytes article now uses this user.js and supplements it with an additonal JS hosted at [GitLab](https://gitlab.com/labwrat/Firefox-user.js/tree/master)
* [12bytes](https://12bytes.org/articles/tech/firefox/firefoxgecko-configuration-guide-for-privacy-and-performance-buffs)
* The 12bytes article now uses this user.js and supplements it with an additional JS hosted at [GitLab](https://gitlab.com/labwrat/Firefox-user.js/tree/master)
<sup>1</sup> The ghacks user.js was an independent project by [Thorin-Oakenpants](https://github.com/Thorin-Oakenpants) started in early 2015 and was [first published](https://www.ghacks.net/2015/08/18/a-comprehensive-list-of-firefox-privacy-and-security-settings/) at ghacks in August 2015. With Martin Brinkmann's blessing, it will keep the ghacks name.
### ![][b] [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[b]: https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/wikipiki/bullet01.png
[b]: /wikipiki/bullet01.png

View File

@ -36,7 +36,8 @@
'camera.control.face_detection.enabled',
'dom.disable_window_status_change',
'dom.idle-observers-api.enabled',
/* 58 : nothing */
/* 58 */
'browser.crashReports.unsubmittedCheck.autoSubmit',
/* 57 */
'social.whitelist',
'social.toast-notifications.enabled',

View File

@ -1,7 +1,7 @@
/***
This will reset the preferences that have been removed completely from the ghacks user.js.
Last updated: 30-Sept-2018
Last updated: 12-Dec-2018
For instructions see:
https://github.com/ghacksuserjs/ghacks-user.js/wiki/3.1-Resetting-Inactive-Prefs-[Scripts]
@ -106,6 +106,17 @@
'extensions.webextensions.keepStorageOnUninstall',
'extensions.webextensions.keepUuidOnUninstall',
'privacy.trackingprotection.ui.enabled',
/* 64-beta */
'browser.eme.ui.enabled',
'browser.sessionstore.max_windows_undo',
'network.auth.subresource-img-cross-origin-http-auth-allow',
'media.peerconnection.ice.tcp',
'media.peerconnection.identity.enabled',
'media.peerconnection.identity.timeout',
'media.peerconnection.turn.disable',
'media.peerconnection.use_document_iceservers',
'media.peerconnection.video.enabled',
'media.navigator.video.enabled',
/* reset parrot: check your open about:config after running the script */
'_user.js.parrot'
]

View File

@ -1,5 +1,5 @@
/*** ghacks-user.js troubleshooter.js v1.5 ***/
/*** ghacks-user.js troubleshooter.js v1.5.2 ***/
(function() {
@ -82,7 +82,6 @@
'dom.push.enabled',
'dom.push.serverURL',
'dom.serviceWorkers.enabled',
'dom.workers.enabled',
'dom.webnotifications.enabled',
'dom.webnotifications.serviceworker.enabled',
@ -116,6 +115,7 @@
/* Audio + Video */
'dom.webaudio.enabled',
'media.autoplay.enabled',
'media.autoplay.default', // FF63+
/* Forms */
'browser.formfill.enable',
@ -125,7 +125,6 @@
/* HTTPS */
'security.cert_pinning.enforcement_level',
'security.family_safety.mode',
'security.mixed_content.use_hsts',
'security.OCSP.require',
'security.pki.sha1_enforcement_level',
'security.ssl.require_safe_negotiation',
@ -152,7 +151,7 @@
'dom.popup_maximum',
'layout.css.visited_links_enabled',
'mathml.disabled',
'network.auth.subresource-img-cross-origin-http-auth-allow',
'network.auth.subresource-http-auth-allow',
'network.http.redirection-limit',
'network.protocol-handler.external.ms-windows-store',
'privacy.trackingprotection.enabled',

View File

@ -1,129 +1,424 @@
#!/usr/bin/env bash
### ghacks-user.js updater for Mac/Linux
## author: @overdodactyl, @ema-pe
## version: 1.4
## ghacks-user.js updater for macOS and Linux
## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in check_for_update() )
## version: 2.4
## Author: Pat Johnson (@overdodactyl)
## Additional contributors: @earthlng, @ema-pe, @claustromaniac
ghacksjs="https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/user.js"
updater="https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/updater.sh"
update_pref=${1:--ask}
## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in update_updater() )
currdir=$(pwd)
readonly CURRDIR=$(pwd)
DOWNLOAD_TO_STDOUT="curl -s"
DOWNLOAD_TO_FILE="curl -O"
sfp=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null)
if [ -z "$sfp" ]; then sfp=${BASH_SOURCE[0]}; fi
readonly SCRIPT_DIR=$(dirname "${sfp}")
# Use wget if curl is not available.
if [[ -z $(command -v "curl") ]]; then
DOWNLOAD_TO_STDOUT="wget --quiet --output-document=-"
DOWNLOAD_TO_FILE="wget"
#########################
# Base variables #
#########################
# Colors used for printing
RED='\033[0;31m'
BLUE='\033[0;34m'
BBLUE='\033[1;34m'
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Argument defaults
UPDATE='check'
CONFIRM='yes'
OVERRIDE='user-overrides.js'
BACKUP='multiple'
COMPARE=false
SKIPOVERRIDE=false
VIEW=false
PROFILE_PATH=false
ESR=false
# Download method priority: curl -> wget
DOWNLOAD_METHOD=''
if [[ $(command -v 'curl') ]]; then
DOWNLOAD_METHOD='curl'
elif [[ $(command -v 'wget') ]]; then
DOWNLOAD_METHOD='wget'
else
echo -e "${RED}This script requires curl or wget.\nProcess aborted${NC}"
exit 0
fi
## get the full path of this script (readlink for Linux, greadlink for Mac with coreutils installed)
sfp=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null)
## fallback for Macs without coreutils
if [ -z "$sfp" ]; then sfp=${BASH_SOURCE[0]}; fi
show_banner () {
echo -e "${BBLUE}\n"
echo ' ############################################################################'
echo ' #### ####'
echo ' #### ghacks user.js ####'
echo ' #### Hardening the Privacy and Security Settings of Firefox ####'
echo ' #### Maintained by @Thorin-Oakenpants and @earthlng ####'
echo ' #### Updater for macOS and Linux by @overdodactyl ####'
echo ' #### ####'
echo ' ############################################################################'
echo -e "${NC}\n"
echo -e "Documentation for this script is available here: ${CYAN}https://github.com/ghacksuserjs/ghacks-user.js/wiki/3.3-Updater-Scripts${NC}\n"
}
## change directory to the Firefox profile directory
cd "$(dirname "${sfp}")"
#########################
# Arguments #
#########################
## Used to check if a new version of updater.sh is available
update_available="no"
check_for_update () {
online_version="$($DOWNLOAD_TO_STDOUT ${updater} | sed -n '5 s/.*[[:blank:]]\([[:digit:]]*\.[[:digit:]]*\)/\1/p')"
path_to_script="$(dirname "${sfp}")/updater.sh"
current_version="$(sed -n '5 s/.*[[:blank:]]\([[:digit:]]*\.[[:digit:]]*\)/\1/p' "$path_to_script")"
if [[ "$current_version" < "$online_version" ]]; then
update_available="yes"
usage() {
echo -e "${BLUE}\nUsage: $0 [-h] [-p PROFILE] [-u] [-d] [-s] [-n] [-b] [-c] [-v] [-r] [-e] [-o OVERRIDE]\n${NC}" 1>&2 # Echo usage string to standard error
echo 'Optional Arguments:'
echo -e "\t-h,\t\t Show this help message and exit."
echo -e "\t-p PROFILE,\t Path to your Firefox profile (if different than the dir of this script)"
echo -e "\t\t\t IMPORTANT: if the path include spaces, wrap the entire argument in quotes."
echo -e "\t-l, \t\t Choose your Firefox profile from a list"
echo -e "\t-u,\t\t Update updater.sh and execute silently. Do not seek confirmation."
echo -e "\t-d,\t\t Do not look for updates to updater.sh."
echo -e "\t-s,\t\t Silently update user.js. Do not seek confirmation."
echo -e "\t-b,\t\t Only keep one backup of each file."
echo -e "\t-c,\t\t Create a diff file comparing old and new user.js within userjs_diffs. "
echo -e "\t-o OVERRIDE,\t Filename or path to overrides file (if different than user-overrides.js)."
echo -e "\t\t\t If used with -p, paths should be relative to PROFILE or absolute paths"
echo -e "\t\t\t If given a directory, all files inside will be appended recursively."
echo -e "\t\t\t You can pass multiple files or directories by passing a comma separated list."
echo -e "\t\t\t\t Note: If a directory is given, only files inside ending in the extension .js are appended"
echo -e "\t\t\t\t IMPORTANT: do not add spaces between files/paths. Ex: -o file1.js,file2.js,dir1"
echo -e "\t\t\t\t IMPORTANT: if any files/paths include spaces, wrap the entire argument in quotes."
echo -e "\t\t\t\t\t Ex: -o \"override folder\" "
echo -e "\t-n,\t\t Do not append any overrides, even if user-overrides.js exists."
echo -e "\t-v,\t\t Open the resulting user.js file."
echo -e "\t-r,\t\t Only download user.js to a temporary file and open it."
echo -e "\t-e,\t\t Activate ESR related preferences."
echo -e
echo 'Deprecated Arguments (they still work for now):'
echo -e "\t-donotupdate,\t Use instead -d"
echo -e "\t-update,\t Use instead -u"
echo -e
exit 1
}
legacy_argument () {
echo -e "${ORANGE}\nWarning: command line arguments have changed."
echo -e "$1 has been deprecated and may not work in the future.\n"
echo -e "Please view the new options using the -h argument.${NC}"
}
#########################
# File Handling #
#########################
# Download files
download_file () {
declare -r url=$1
declare -r tf=$(mktemp)
local dlcmd=''
if [ $DOWNLOAD_METHOD = 'curl' ]; then
dlcmd="curl -o $tf"
else
dlcmd="wget -O $tf"
fi
$dlcmd "${url}" &>/dev/null && echo "$tf" || echo '' # return the temp-filename (or empty string on error)
}
open_file () { #expects one argument: file_path
if [ "$(uname)" == 'Darwin' ]; then
open "$1"
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
xdg-open "$1"
else
echo -e "${RED}Error: Sorry, opening files is not supported for your OS.${NC}"
fi
}
## Used to backup the current script, and download and execute the latest version of updater.sh
update_script () {
echo -e "This script will be backed up and the latest version of updater.sh will be executed.\n"
mv updater.sh "updater.sh.backup.$(date +"%Y-%m-%d_%H%M")"
$DOWNLOAD_TO_FILE ${updater} && echo -e "\nThe latest updater script has been downloaded\n"
readIniFile () { # expects one argument: absolute path of profiles.ini
declare -r inifile="$1"
declare -r tfile=$(mktemp)
# make new file executable
chmod +x updater.sh
if [ $(grep '^\[Profile' "$inifile" | wc -l) == "1" ]; then ### only 1 profile found
grep '^\[Profile' -A 4 "$inifile" | grep -v '^\[Profile' > $tfile
else
grep -E -v '^\[General\]|^StartWithLastProfile=|^IsRelative=' "$inifile"
echo ''
read -p 'Select the profile number ( 0 for Profile0, 1 for Profile1, etc ) : ' -r
echo -e "\n"
if [[ $REPLY =~ ^(0|[1-9][0-9]*)$ ]]; then
grep '^\[Profile'${REPLY} -A 4 "$inifile" | grep -v '^\[Profile'${REPLY} > $tfile
if [[ "$?" != "0" ]]; then
echo "Profile${REPLY} does not exist!" && exit 1
fi
else
echo "Invalid selection!" && exit 1
fi
fi
# execute new updater script
./updater.sh -donotupdate
declare -r profpath=$(grep '^Path=' $tfile)
declare -r pathisrel=$(grep '^IsRelative=' $tfile)
# exit script
rm "$tfile"
# update global variable
if [[ ${pathisrel#*=} == "1" ]]; then
PROFILE_PATH="$(dirname "$inifile")/${profpath#*=}"
else
PROFILE_PATH="${profpath#*=}"
fi
}
getProfilePath () {
declare -r f1=~/Library/Application\ Support/Firefox/profiles.ini
declare -r f2=~/.mozilla/firefox/profiles.ini
if [ "$PROFILE_PATH" = false ]; then
PROFILE_PATH="$SCRIPT_DIR"
elif [ "$PROFILE_PATH" = 'list' ]; then
local ini=''
if [[ -f "$f1" ]]; then
ini="$f1"
elif [[ -f "$f2" ]]; then
ini="$f2"
else
echo -e "${RED}Error: Sorry, -l is not supported for your OS${NC}"
exit 1
fi
readIniFile "$ini" # updates PROFILE_PATH or exits on error
#else
# PROFILE_PATH already set by user with -p
fi
}
#########################
# Update updater.sh #
#########################
# Returns the version number of a updater.sh file
get_updater_version () {
echo $(sed -n '5 s/.*[[:blank:]]\([[:digit:]]*\.[[:digit:]]*\)/\1/p' "$1")
}
# Update updater.sh
# Default: Check for update, if available, ask user if they want to execute it
# Args:
# -donotupdate: New version will not be looked for and update will not occur
# -update: Check for update, if available, execute without asking
update_updater () {
if [ $UPDATE = 'no' ]; then
return 0 # User signified not to check for updates
fi
declare -r tmpfile=$(download_file 'https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/updater.sh')
if [[ $(get_updater_version "${SCRIPT_DIR}/updater.sh") < $(get_updater_version "${tmpfile}") ]]; then
if [ $UPDATE = 'check' ]; then
echo -e "There is a newer version of updater.sh available. ${RED}Update and execute Y/N?${NC}"
read -p "" -n 1 -r
echo -e "\n\n"
if [[ $REPLY =~ ^[Nn]$ ]]; then
return 0 # Update available, but user chooses not to update
fi
fi
else
return 0 # No update available
fi
mv "${tmpfile}" "${SCRIPT_DIR}/updater.sh"
chmod u+x "${SCRIPT_DIR}/updater.sh"
"${SCRIPT_DIR}/updater.sh" "$@ -d"
exit 1
}
main () {
## create backup folder if it doesn't exist
mkdir -p userjs_backups;
#########################
# Update user.js #
#########################
echo -e "\nThis script should be run from your Firefox profile directory.\n"
echo -e "Updating the user.js for Firefox profile:\n$(pwd)\n"
if [ -e user.js ]; then
echo "Your current user.js file for this profile will be backed up and the latest ghacks version from github will take its place."
echo -e "\nIf currently using the ghacks user.js, please compare versions:"
echo " Available online: $($DOWNLOAD_TO_STDOUT ${ghacksjs} | sed -n '4p')"
echo " Currently using: $(sed -n '4p' user.js)"
# Returns version number of a user.js file
get_userjs_version () {
if [ -e $1 ]; then
echo "$(sed -n '4p' "$1")"
else
echo "A user.js file does not exist in this profile. If you continue, the latest ghacks version from github will be downloaded."
echo "Not detected."
fi
echo -e "\nIf a user-overrides.js file exists in this profile, it will be appended to the user.js.\n"
read -p "Continue Y/N? " -n 1 -r
echo -e "\n\n"
if [[ $REPLY =~ ^[Yy]$ ]]; then
if [ -e user.js ]; then
# backup current user.js
bakfile="userjs_backups/user.js.backup.$(date +"%Y-%m-%d_%H%M")"
mv user.js "${bakfile}" && echo "Your previous user.js file was backed up: ${bakfile}"
fi
# download latest ghacks user.js
echo "downloading latest ghacks user.js file"
$DOWNLOAD_TO_FILE ${ghacksjs} && echo "ghacks user.js has been downloaded"
if [ -e user-overrides.js ]; then
echo "user-overrides.js file found"
cat user-overrides.js >> user.js && echo "user-overrides.js has been appended to user.js"
fi
else
echo "Process aborted"
fi
## change directory back to the original working directory
cd "${currdir}"
}
update_pref="$(echo $update_pref | tr '[A-Z]' '[a-z]')"
if [ $update_pref = "-donotupdate" ]; then
main
else
check_for_update
if [ $update_available = "no" ]; then
main
add_override () {
input=$1
if [ -f "$input" ]; then
echo "" >> user.js
cat "$input" >> user.js
echo -e "Status: ${GREEN}Override file appended:${NC} ${input}"
elif [ -d "$input" ]; then
FSAVEIFS=$IFS
IFS=$'\n\b' # Set IFS
FILES="${input}"/*.js
for f in $FILES
do
add_override "$f"
done
IFS=$SAVEIFS # restore $IFS
else
## there is an update available
if [ $update_pref = "-update" ]; then
## update without asking
update_script
else
read -p "There is a newer version of updater.sh available. Download and execute? Y/N? " -n 1 -r
echo -e "\n\n"
if [[ $REPLY =~ ^[Yy]$ ]]; then
update_script
else
main
fi
echo -e "${ORANGE}Warning: Could not find override file:${NC} ${input}"
fi
}
remove_comments () { # expects 2 arguments: from-file and to-file
sed -e 's/^[[:space:]]*\/\/.*$//' -e '/^\/\*/,/\*\//d' -e '/^[[:space:]]*$/d' -e 's/);[[:space:]]*\/\/.*/);/' "$1" > "$2"
}
# Applies latest version of user.js and any custom overrides
update_userjs () {
declare -r newfile=$(download_file 'https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/user.js')
echo 'Please observe the following information:'
echo -e "\tFirefox profile: ${ORANGE}$(pwd)${NC}"
echo -e "\tAvailable online: ${ORANGE}$(get_userjs_version $newfile)${NC}"
echo -e "\tCurrently using: ${ORANGE}$(get_userjs_version user.js)\n${NC}\n"
if [ $CONFIRM = 'yes' ]; then
echo -e "This script will update to the latest user.js file and append any custom configurations from user-overrides.js. ${RED}Continue Y/N? ${NC}"
read -p "" -n 1 -r
echo -e "\n"
if [[ $REPLY =~ ^[Nn]$ ]]; then
echo -e "${RED}Process aborted${NC}"
rm $newfile
return 1
fi
fi
# Copy a version of user.js to diffs folder for later comparison
if [ "$COMPARE" = true ]; then
mkdir -p userjs_diffs
cp user.js userjs_diffs/past_user.js &>/dev/null
fi
# backup user.js
mkdir -p userjs_backups
local bakname="userjs_backups/user.js.backup.$(date +"%Y-%m-%d_%H%M")"
if [ $BACKUP = 'single' ]; then
bakname='userjs_backups/user.js.backup'
fi
cp user.js "$bakname" &>/dev/null
mv "${newfile}" user.js
echo -e "Status: ${GREEN}user.js has been backed up and replaced with the latest version!${NC}"
if [ "$ESR" = true ]; then
sed -e 's/\/\* \(ESR[0-9]\{2,\}\.x still uses all.*\)/\/\/ \1/' user.js > user.js.tmp && mv user.js.tmp user.js
echo -e "Status: ${GREEN}ESR related preferences have been activated!${NC}"
fi
# apply overrides
if [ "$SKIPOVERRIDE" = false ]; then
while IFS=',' read -ra FILE; do
add_override "$FILE"
done <<< "$OVERRIDE"
fi
# create diff
if [ "$COMPARE" = true ]; then
pastuserjs='userjs_diffs/past_user.js'
past_nocomments='userjs_diffs/past_userjs.txt'
current_nocomments='userjs_diffs/current_userjs.txt'
remove_comments $pastuserjs $past_nocomments
remove_comments user.js $current_nocomments
diffname="userjs_diffs/diff_$(date +"%Y-%m-%d_%H%M").txt"
diff=$(diff -w -B -U 0 $past_nocomments $current_nocomments)
if [ ! -z "$diff" ]; then
echo "$diff" > "$diffname"
echo -e "Status: ${GREEN}A diff file was created:${NC} ${PWD}/${diffname}"
else
echo -e "Warning: ${ORANGE}Your new user.js file appears to be identical. No diff file was created.${NC}"
fi
rm $past_nocomments $current_nocomments $pastuserjs &>/dev/null
fi
if [ "$VIEW" = true ]; then open_file "${PWD}/user.js"; fi
}
#########################
# Execute #
#########################
if [ $# != 0 ]; then
readonly legacy_lc=$(echo $1 | tr '[A-Z]' '[a-z]')
# Display usage if first argument is -help or --help
if [ $1 = '--help' ] || [ $1 = '-help' ]; then
usage
elif [ $legacy_lc = '-donotupdate' ]; then
UPDATE='no'
legacy_argument $1
elif [ $legacy_lc = '-update' ]; then
UPDATE='yes'
legacy_argument $1
else
while getopts ":hp:ludsno:bcvre" opt; do
case $opt in
h)
usage
;;
p)
PROFILE_PATH=${OPTARG}
;;
l)
PROFILE_PATH='list'
;;
u)
UPDATE='yes'
;;
d)
UPDATE='no'
;;
s)
CONFIRM='no'
;;
n)
SKIPOVERRIDE=true
;;
o)
OVERRIDE=${OPTARG}
;;
b)
BACKUP='single'
;;
c)
COMPARE=true
;;
v)
VIEW=true
;;
e)
ESR=true
;;
r)
tfile=$(download_file 'https://raw.githubusercontent.com/ghacksuserjs/ghacks-user.js/master/user.js')
mv $tfile "${tfile}.js"
echo -e "${ORANGE}Warning: user.js was saved to temporary file ${tfile}.js${NC}"
open_file "${tfile}.js"
exit 1
;;
\?)
echo -e "${RED}\n Error! Invalid option: -$OPTARG${NC}" >&2
usage
;;
:)
echo -e "${RED}Error! Option -$OPTARG requires an argument.${NC}" >&2
exit 1
;;
esac
done
fi
fi
show_banner
update_updater
getProfilePath # updates PROFILE_PATH or exits on error
cd "$PROFILE_PATH" && update_userjs
cd "$CURRDIR"

1065
user.js

File diff suppressed because it is too large Load Diff