mirror of
https://github.com/HorlogeSkynet/thunderbird-user.js.git
synced 2025-04-16 22:46:03 +02:00
Compare commits
163 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2b839ae6ca | ||
![]() |
7f75658282 | ||
![]() |
eec031aa69 | ||
![]() |
8e9bc01c00 | ||
![]() |
4d986fffc6 | ||
![]() |
8f7158ebe2 | ||
![]() |
b6d6d1564b | ||
![]() |
6183dda54a | ||
![]() |
b814b88b93 | ||
![]() |
5d33d6b50e | ||
![]() |
100b5537e9 | ||
![]() |
55cf3041a7 | ||
![]() |
824edabe63 | ||
![]() |
48529d1963 | ||
![]() |
c6fef1356e | ||
![]() |
ebeb8cf3fb | ||
![]() |
ee7649a8b4 | ||
![]() |
7390a8056c | ||
![]() |
e6c5df30f2 | ||
![]() |
ad0cac10b2 | ||
![]() |
d6b18302e4 | ||
![]() |
ee80afc278 | ||
![]() |
3996c279fd | ||
![]() |
088da14f7e | ||
![]() |
87b0d325e2 | ||
![]() |
5a59c1b7e7 | ||
![]() |
167ddc02be | ||
![]() |
8bd612fd82 | ||
![]() |
fc144d3cb1 | ||
![]() |
ac8a715b06 | ||
![]() |
439e5b5e7d | ||
![]() |
07d26c7881 | ||
![]() |
d2283b8c91 | ||
![]() |
32afc0b38d | ||
![]() |
32663905d0 | ||
![]() |
4f5cde426c | ||
![]() |
cc6cab6525 | ||
![]() |
eba6bc4dea | ||
![]() |
d8d79d6c84 | ||
![]() |
494f684d74 | ||
![]() |
8970a6fda1 | ||
![]() |
08713b3ea9 | ||
![]() |
a3a5c4ad86 | ||
![]() |
6798bda078 | ||
![]() |
c1e6a54f75 | ||
![]() |
0dcc49687f | ||
![]() |
0ccd0c0e99 | ||
![]() |
d778e6d7b6 | ||
![]() |
902231ecf0 | ||
![]() |
ea3c48a7a9 | ||
![]() |
f885b50de5 | ||
![]() |
255ccd84ae | ||
![]() |
0abbda8e39 | ||
![]() |
03c86462d8 | ||
![]() |
838529ffbd | ||
![]() |
5387c41c91 | ||
![]() |
22efe76834 | ||
![]() |
fdcaf8570b | ||
![]() |
5caedc08de | ||
![]() |
5a787eb8ce | ||
![]() |
39aaee7fa3 | ||
![]() |
4dc99eb87f | ||
![]() |
e95dc540c9 | ||
![]() |
6c5d84bc89 | ||
![]() |
db12db282f | ||
![]() |
f8466f15dd | ||
![]() |
68628a397a | ||
![]() |
fb31ebb304 | ||
![]() |
50afdb9a57 | ||
![]() |
5c59028af9 | ||
![]() |
e5fdab03ee | ||
![]() |
f45c0a3d75 | ||
![]() |
c4172ac672 | ||
![]() |
e8f584b901 | ||
![]() |
9b7b22420d | ||
![]() |
8719ad5a37 | ||
![]() |
7ffec7ed57 | ||
![]() |
2d82b7cc0c | ||
![]() |
c41232b1c3 | ||
![]() |
c96eed17c0 | ||
![]() |
616c2b1553 | ||
![]() |
fc22408d19 | ||
![]() |
1196a9ce4f | ||
![]() |
714fd1898f | ||
![]() |
dcf351aa96 | ||
![]() |
de8048fea6 | ||
![]() |
3580cfd3c4 | ||
![]() |
c54c059011 | ||
![]() |
a492b510df | ||
![]() |
f7788b2c8a | ||
![]() |
ac43ee758d | ||
![]() |
74735518be | ||
![]() |
881a339584 | ||
![]() |
efe11df8e4 | ||
![]() |
5a1ff8ddfa | ||
![]() |
57073e7516 | ||
![]() |
68b3e25656 | ||
![]() |
e639a79445 | ||
![]() |
3b2afdd532 | ||
![]() |
5342ec1619 | ||
![]() |
f675a006d5 | ||
![]() |
d3308d2f5f | ||
![]() |
7c8504b6d0 | ||
![]() |
d169ad4ba8 | ||
![]() |
d35ac2f330 | ||
![]() |
3c70f08468 | ||
![]() |
7f3b35ca64 | ||
![]() |
b8ef724bb0 | ||
![]() |
5f8cb09775 | ||
![]() |
0ca3d51157 | ||
![]() |
aa773053bf | ||
![]() |
d751f49340 | ||
![]() |
b600990f30 | ||
![]() |
6d624b759e | ||
![]() |
e7086e6b5f | ||
![]() |
894ae0d78b | ||
![]() |
a6a674ad37 | ||
![]() |
700f90e954 | ||
![]() |
352394a62f | ||
![]() |
fc6ea5582f | ||
![]() |
428fa861b9 | ||
![]() |
148bfac882 | ||
![]() |
13b544b208 | ||
![]() |
667189eedb | ||
![]() |
b4a7a771ec | ||
![]() |
e859c40916 | ||
![]() |
b36710a76e | ||
![]() |
ba65d33451 | ||
![]() |
accbfcc009 | ||
![]() |
5ee06c6d89 | ||
![]() |
8591d9b2c8 | ||
![]() |
ac6137d6f4 | ||
![]() |
7bc7c89ac7 | ||
![]() |
52d0864e41 | ||
![]() |
37066f8c06 | ||
![]() |
787ca411fb | ||
![]() |
68d36833f7 | ||
![]() |
f9413919b5 | ||
![]() |
b58655a422 | ||
![]() |
08b2bf9467 | ||
![]() |
bc1a74afa7 | ||
![]() |
8c2ef50da0 | ||
![]() |
3cd96847ca | ||
![]() |
10b1bb2b7c | ||
![]() |
1692de442c | ||
![]() |
a9b0166323 | ||
![]() |
ce8dfe3329 | ||
![]() |
30848dd7e7 | ||
![]() |
b90bbe45b2 | ||
![]() |
5ede0acaaa | ||
![]() |
eb8cade42e | ||
![]() |
c57ead1b76 | ||
![]() |
3ce96df737 | ||
![]() |
49921ed98c | ||
![]() |
5f9bf7f88d | ||
![]() |
989a0f9447 | ||
![]() |
c549b95263 | ||
![]() |
634914c41f | ||
![]() |
59d8211ff4 | ||
![]() |
3fa04abd7a | ||
![]() |
bc6e3335f9 | ||
![]() |
d51c67fc70 | ||
![]() |
9d9fb07b8e |
36
.eslint.config.mjs
Normal file
36
.eslint.config.mjs
Normal file
@ -0,0 +1,36 @@
|
||||
// Thunderbird User.JS ESLint configuration file
|
||||
|
||||
import js from "@eslint/js";
|
||||
|
||||
export default [
|
||||
js.configs.recommended,
|
||||
{
|
||||
rules: {
|
||||
// Expect only double-quoted strings.
|
||||
quotes: ["error", "double"],
|
||||
|
||||
// Expect a semicolon after each statement.
|
||||
semi: ["error", "always", {"omitLastInOneLineBlock": false}],
|
||||
|
||||
// As project code style, don't allow tabulation nor trailing whitespaces.
|
||||
"no-tabs": "error",
|
||||
"no-trailing-spaces": "error",
|
||||
|
||||
// Don't allow whitespace before semicolons.
|
||||
"semi-spacing": ["error", {"before": false}],
|
||||
|
||||
// Don't allow irregular whitespace characters in our sheet.
|
||||
"no-irregular-whitespace": ["error", {"skipStrings": false, "skipComments": false}],
|
||||
},
|
||||
languageOptions: {
|
||||
// From <https://searchfox.org/mozilla-central/rev/c938c7416c633639a5c8ce4412be586eefb48005/modules/libpref/parser/src/lib.rs#296>
|
||||
globals: {
|
||||
pref: "readonly",
|
||||
user_pref: "readonly",
|
||||
sticky: "readonly",
|
||||
locked: "readonly",
|
||||
sticky_pref: "readonly",
|
||||
},
|
||||
},
|
||||
},
|
||||
];
|
15
.gitattributes
vendored
Normal file
15
.gitattributes
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
* text=auto
|
||||
|
||||
*.js text
|
||||
*.md text
|
||||
*.yml text
|
||||
*.sh text
|
||||
## *.bat text eol=crlf
|
||||
*.bat -text
|
||||
|
||||
*.png binary
|
||||
|
||||
.gitattributes export-ignore
|
||||
*.yml export-ignore
|
||||
/wiki export-ignore
|
||||
/.github export-ignore
|
4
.github/FUNDING.yml
vendored
Normal file
4
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# repo: HorlogeSkynet/thunderbird-user.js
|
||||
# filename: FUNDING.YML
|
||||
|
||||
liberapay: HorlogeSkynet
|
38
.github/ISSUE_TEMPLATE/bug.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/bug.md
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve Thunderbird User.JS
|
||||
title: "[BUG] "
|
||||
labels: 'bug'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
|
||||
**Expected behavior**
|
||||
<!-- A clear and concise description of what you expected to happen. -->
|
||||
|
||||
|
||||
**Screenshots**
|
||||
<!-- If applicable (i.e. graphical glitch), add screenshots to help explain your problem. -->
|
||||
|
||||
|
||||
**Environment**
|
||||
<!-- Please complete the following information: -->
|
||||
- Thunderbird version used (X.Y.Z) :
|
||||
- `thunderbird user.js` template version used (X.Y or commit SHA) :
|
||||
- Operating system and version :
|
||||
- \[IF RELEVANT\] Graphical environment name and version :
|
||||
|
||||
|
||||
**Additional context**
|
||||
<!-- If applicable, add any other context about the problem here. -->
|
||||
|
||||
|
||||
**Checklist**
|
||||
<!--- Put an `X` in all the boxes that apply : -->
|
||||
- [ ] I can confirm the bug is due to `thunderbird user.js` **template** and not an overridden preference nor an add-on ;
|
||||
- [ ] I have searched for `[SETUP-*]` tags and read them up ;
|
||||
- [ ] I have searched the GitHub project (issues and Wiki) for my issue.
|
30
.github/ISSUE_TEMPLATE/change_request.md
vendored
Normal file
30
.github/ISSUE_TEMPLATE/change_request.md
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
name: Change request
|
||||
about: Suggest a change for Thunderbird User.JS
|
||||
title: "[RFC] "
|
||||
labels: 'enhancement'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||
|
||||
|
||||
**List the concerned preferences**
|
||||
<!-- A clear and concise list of the preferences you want to add/remove/change. -->
|
||||
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context (Thunderbird version, OS, etc.) or screenshots about the feature request here. -->
|
||||
|
||||
|
||||
**Checklist**
|
||||
<!--- Put an `X` in all the boxes that apply : -->
|
||||
- [ ] I know `thunderbird user.js` is a **template** and personal preferences should be stored elsewhere ;
|
||||
- [ ] The change I want to propose should globally improve the `usability / ( privacy + security + anti-fingerprinting )` ratio ;
|
||||
- [ ] I agree that subsequent modifications to my change scope may occur in the future.
|
28
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
28
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
<!--- Provide a general summary of your changes in the title above -->
|
||||
|
||||
|
||||
## Description
|
||||
<!--- Describe your changes in detail -->
|
||||
|
||||
|
||||
## Reason and / or context
|
||||
<!--- Why is this change required ? What problem does it solve ? -->
|
||||
<!--- If it fixes an open issue, please link to the issue here -->
|
||||
|
||||
|
||||
## How has this been tested ?
|
||||
<!--- Include details of your testing environment here -->
|
||||
|
||||
|
||||
## Types of changes :
|
||||
<!--- What types of changes does your code introduce ? Put an `X` in all the boxes that apply : -->
|
||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||
- [ ] Typo / style fix (non-breaking change which improves readability)
|
||||
- [ ] New feature (non-breaking change which adds functionality)
|
||||
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
|
||||
|
||||
## Checklist :
|
||||
<!--- Put an `X` in all the boxes that apply : -->
|
||||
- [ ] My changes looks good ;
|
||||
- [ ] I agree that my code may be modified in the future ;
|
||||
- [ ] My code follows the code style of this project (see `.eslint.config.mjs`).
|
17
.github/workflows/linting.yml
vendored
Normal file
17
.github/workflows/linting.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
---
|
||||
name: Linting
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Run ESLint on user.js
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: actions/setup-node@v4
|
||||
|
||||
- run: npm install eslint @eslint/js
|
||||
- run: npx eslint -c .eslint.config.mjs user.js
|
@ -1,8 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 'node'
|
||||
|
||||
before_script:
|
||||
- npm install -g acorn
|
||||
script:
|
||||
- acorn --silent user.js
|
4
LICENSE
4
LICENSE
@ -1,6 +1,8 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2019 ghacksuserjs
|
||||
Copyright (c) 2019-2025 HorlogeSkynet
|
||||
Copyright (c) 2019 dngray
|
||||
Copyright (c) 2019 arkenfox [prev. ghacksuserjs]
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
45
README.md
45
README.md
@ -1,25 +1,42 @@
|
||||
# Thunderbird User.JS
|
||||
|
||||
> An ongoing comprehensive user.js template for configuring and hardening Thunderbird privacy, security and anti-fingerprinting
|
||||
> Thunderbird privacy, security and anti-fingerprinting: a comprehensive user.js template for configuration and hardening
|
||||
|
||||
### :large_blue_diamond: user.js
|
||||
### 🟪 user.js
|
||||
|
||||
An `user.js` is a configuration file that can control hundreds of Thunderbird settings. For a more technical breakdown and explanation, you can read more on the [overview](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/1.1-Overview) wiki page.
|
||||
An `user.js` is a configuration file that can control Thunderbird settings - for a more technical breakdown and explanation, you can read more in the [wiki](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/1.1-Overview).
|
||||
|
||||
### :large_blue_diamond: thunderbird user.js
|
||||
### 🟩 Thunderbird user.js
|
||||
|
||||
The Thunderbird `user.js` is a **template** which aims to provide as much privacy and enhanced security as possible. It differs from the `ghacks user.js` in that the focus is to keep Thunderbird as an **email client** and disable as many web browsing features as possible. We believe web browsing should be done in a web browser, and not an email client.
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
|
||||
- If you're using Thunderbird with Tor we suggest that you install the [TorBirdy](https://addons.thunderbird.net/addon/torbirdy) addon. If you are using Tor, you should also consider using [Tails](https://tails.boum.org/) or [Whonix](https://www.whonix.org/).
|
||||
- If you're a **Gmail** user see [this article about OAuth2](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/3.1-OAuth2-Users).
|
||||
- For information about [extensions](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/4.1-Extensions), see the wiki. **Calendar** users should [see this page](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/4.1.1-Calendar).
|
||||
The `thunderbird user.js` is a **template** which aims to provide as much privacy and enhanced security as possible, and to reduce tracking and fingerprinting as much as possible - while minimizing any loss of functionality and breakage (but it will happen).
|
||||
|
||||
Also be aware that this `user.js` is made specifically for Thunderbird and has only been tested in the latest stable release.
|
||||
Everyone, experts included, should at least read the [wiki](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki), as it contains important information regarding a few `user.js` settings.
|
||||
|
||||
### :large_blue_diamond: acknowledgments
|
||||
It differs from the `arkenfox user.js` in that the focus is to keep Thunderbird as an **e-mail client** and disable as many web browsing features as possible. We believe web browsing should be done in a web browser, and not an email client.
|
||||
|
||||
* [tya99](https://github.com/tya99) most of the ground work and initial port from the Firefox version of [ghacks user.js](https://github.com/ghacksuserjs/ghacks-user.js)
|
||||
* [dngray](https://github.com/dngray) continual maintenance and Wiki
|
||||
* [HorlogeSkynet](https://github.com/HorlogeSkynet) continual maintenance
|
||||
- If you're using Thunderbird (< 68) with Tor we suggest that you install the [TorBirdy](https://addons.thunderbird.net/addon/torbirdy) add-on. If you are using Tor, you should also consider using [Tails](https://tails.boum.org/) or [Whonix](https://www.whonix.org/).
|
||||
- If you're using **Gmail**, please check [this article about OAuth2](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/3.1-OAuth2-Users).
|
||||
- For information about [extensions](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/4.1-Extensions), see the Wiki.
|
||||
- **Calendar** users should [see this page](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki/4.1.1-Calendar).
|
||||
|
||||
### :large_blue_diamond: [](https://opensource.org/licenses/MIT)
|
||||
Also be aware that this `user.js` is made specifically for Thunderbird and is only being tested against releases with extended support (ESR).
|
||||
|
||||
### 🟧 Sitemap
|
||||
|
||||
- [Releases](https://github.com/HorlogeSkynet/thunderbird-user.js/releases)
|
||||
- [Issues](https://github.com/HorlogeSkynet/thunderbird-user.js/issues)
|
||||
- [Wiki](https://github.com/HorlogeSkynet/thunderbird-user.js/wiki)
|
||||
|
||||
### 🟥 Acknowledgments
|
||||
|
||||
* @tya99 most of the ground work and initial port from the Firefox version of [arkenfox user.js](https://github.com/arkenfox/user.js)
|
||||
* [@dngray](https://github.com/dngray) continual maintenance and Wiki
|
||||
* [@HorlogeSkynet](https://github.com/HorlogeSkynet) continual maintenance
|
||||
|
||||
### 🟦 Related Projects
|
||||
|
||||
* [Privacy Handbuch](https://www.privacy-handbuch.de/handbuch_31p.htm)
|
||||
* [Privacy Haters](http://r-36.net/scm/privacy-haters/file/README.md.html)
|
||||
* [12bytes's user-overrides.js](https://codeberg.org/12bytes/thunderbird-user.js-supplement)
|
||||
|
134
prefsCleaner.bat
Normal file
134
prefsCleaner.bat
Normal file
@ -0,0 +1,134 @@
|
||||
@ECHO OFF & SETLOCAL DisableDelayedExpansion
|
||||
TITLE prefs.js cleaner
|
||||
|
||||
REM ## prefs.js cleaner for Windows
|
||||
REM ## /!\ This script is a vendored/adapted version of Arkenfox own prefsCleaner.bat /!\
|
||||
REM ## author: @claustromaniac
|
||||
REM ## version: 2.7
|
||||
|
||||
CD /D "%~dp0"
|
||||
|
||||
IF /I "%~1"=="-unattended" (SET _ua=1)
|
||||
|
||||
:begin
|
||||
ECHO:
|
||||
ECHO:
|
||||
ECHO ########################################
|
||||
ECHO #### prefs.js cleaner for Windows ####
|
||||
ECHO #### by claustromaniac ####
|
||||
ECHO #### v2.7 ####
|
||||
ECHO ########################################
|
||||
ECHO:
|
||||
CALL :message "This script should be run from your Thunderbird profile directory."
|
||||
ECHO It will remove any entries from prefs.js that also exist in user.js.
|
||||
CALL :message "This will allow inactive preferences to be reset to their default values."
|
||||
ECHO This Thunderbird profile shouldn't be in use during the process.
|
||||
CALL :message ""
|
||||
TIMEOUT 1 /nobreak >nul
|
||||
|
||||
IF NOT DEFINED _ua (
|
||||
CHOICE /C SHE /N /M "Start [S] Help [H] Exit [E]"
|
||||
CLS
|
||||
IF ERRORLEVEL 3 (EXIT /B)
|
||||
IF ERRORLEVEL 2 (GOTO :showhelp)
|
||||
)
|
||||
IF NOT EXIST "user.js" (CALL :abort "user.js not found in the current directory." 30)
|
||||
IF NOT EXIST "prefs.js" (CALL :abort "prefs.js not found in the current directory." 30)
|
||||
CALL :strlenCheck
|
||||
CALL :FFcheck
|
||||
|
||||
CALL :message "Backing up prefs.js..."
|
||||
FOR /F "delims=" %%# IN ('powershell get-date -format "{yyyyMMdd_HHmmss}"') DO @SET ldt=%%#
|
||||
COPY /B /V /Y prefs.js "prefs-backup-%ldt%.js"
|
||||
|
||||
CALL :message "Cleaning prefs.js..."
|
||||
CALL :cleanup
|
||||
CALL :message "All done!"
|
||||
TIMEOUT 5 >nul
|
||||
ENDLOCAL
|
||||
EXIT /B
|
||||
|
||||
REM ########## Abort Function ###########
|
||||
:abort
|
||||
CALL :message %1
|
||||
TIMEOUT %~2 >nul
|
||||
EXIT
|
||||
REM ########## Message Function #########
|
||||
:message
|
||||
ECHO:
|
||||
ECHO: %~1
|
||||
ECHO:
|
||||
GOTO :EOF
|
||||
REM ### string length Check Function ####
|
||||
:strlenCheck
|
||||
SET /a cnt=0
|
||||
setlocal ENABLEDELAYEDEXPANSION
|
||||
FOR /F "tokens=1,* delims=:" %%G IN ('FINDSTR /N "^" prefs.js') DO (
|
||||
ECHO:%%H >nul
|
||||
SET /a cnt += 1
|
||||
IF /I "%%G" NEQ "!cnt!" (
|
||||
ECHO:
|
||||
CALL :message "ERROR: line !cnt! in prefs.js is too long."
|
||||
(CALL :abort "Aborting ..." 30)
|
||||
)
|
||||
)
|
||||
endlocal
|
||||
GOTO :EOF
|
||||
REM ####### Thunderbird Check Function ######
|
||||
:FFcheck
|
||||
TASKLIST /FI "IMAGENAME eq thunderbird.exe" 2>NUL | FIND /I /N "thunderbird.exe">NUL
|
||||
IF NOT ERRORLEVEL 1 (
|
||||
CLS
|
||||
CALL :message "Thunderbird is still running."
|
||||
ECHO If you're not currently using this profile you can continue, otherwise
|
||||
CALL :message "close Thunderbird first!"
|
||||
ECHO:
|
||||
PAUSE
|
||||
CLS
|
||||
CALL :message "Resuming..."
|
||||
TIMEOUT 5 /nobreak >nul
|
||||
)
|
||||
GOTO :EOF
|
||||
REM ######### Cleanup Function ##########
|
||||
:cleanup
|
||||
FOR /F tokens^=2^ delims^=^'^" %%G IN ('FINDSTR /R /C:"^[^\"']*user_pref[ ]*\([ ]*[\"'][^\"']*[\"'][ ]*," user.js') DO (
|
||||
IF NOT ""=="%%G" (SET "[%%G]=1")
|
||||
)
|
||||
(
|
||||
FOR /F "tokens=1,* delims=:" %%G IN ('FINDSTR /N "^" prefs.js') DO (
|
||||
IF ""=="%%H" (
|
||||
ECHO:
|
||||
) ELSE (
|
||||
FOR /F tokens^=1^,2^ delims^=^"^' %%I IN ("%%H") DO (
|
||||
IF NOT DEFINED [%%J] (ECHO:%%H)
|
||||
)
|
||||
)
|
||||
)
|
||||
)>tempcleanedprefs
|
||||
MOVE /Y tempcleanedprefs prefs.js
|
||||
GOTO :EOF
|
||||
REM ############### Help ##################
|
||||
:showhelp
|
||||
MODE 80,34
|
||||
CLS
|
||||
CALL :message "This script creates a backup of your prefs.js file before doing anything."
|
||||
ECHO It should be safe, but you can follow these steps if something goes wrong:
|
||||
ECHO:
|
||||
CALL :message " 1. Make sure Thunderbird is closed."
|
||||
ECHO 2. Delete prefs.js in your profile folder.
|
||||
CALL :message " 3. Delete Invalidprefs.js if you have one in the same folder."
|
||||
ECHO 4. Rename or copy your latest backup to prefs.js.
|
||||
CALL :message " 5. Run Thunderbird and see if you notice anything wrong with it."
|
||||
ECHO 6. If you do notice something wrong, especially with your extensions,
|
||||
CALL :message " and/or with the UI, go to about:support, and restart Thunderbird with"
|
||||
ECHO add-ons disabled. Then, restart it again normally, and see if the
|
||||
CALL :message " problems were solved."
|
||||
ECHO:
|
||||
CALL :message "If you are able to identify the cause of your issues, please bring it up"
|
||||
ECHO on thunderbird user.js GitHub repository.
|
||||
ECHO:
|
||||
ECHO:
|
||||
PAUSE
|
||||
CLS
|
||||
GOTO :begin
|
||||
REM #####################################
|
186
prefsCleaner.sh
Executable file
186
prefsCleaner.sh
Executable file
@ -0,0 +1,186 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## prefs.js cleaner for Linux/Mac
|
||||
## /!\ This script is a vendored/adapted version of Arkenfox own prefsCleaner.sh /!\
|
||||
## author: @claustromaniac
|
||||
## version: 2.1
|
||||
|
||||
## special thanks to @overdodactyl and @earthlng for a few snippets that I stol..*cough* borrowed from the updater.sh
|
||||
|
||||
## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in update_prefsCleaner() )
|
||||
|
||||
readonly CURRDIR=$(pwd)
|
||||
|
||||
## get the full path of this script (readlink for Linux, greadlink for Mac with coreutils installed)
|
||||
SCRIPT_FILE=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null)
|
||||
|
||||
## fallback for Macs without coreutils
|
||||
[ -z "$SCRIPT_FILE" ] && SCRIPT_FILE=${BASH_SOURCE[0]}
|
||||
|
||||
|
||||
AUTOUPDATE=true
|
||||
QUICKSTART=false
|
||||
|
||||
## download method priority: curl -> wget
|
||||
DOWNLOAD_METHOD=''
|
||||
if command -v curl >/dev/null; then
|
||||
DOWNLOAD_METHOD='curl --max-redirs 3 -so'
|
||||
elif command -v wget >/dev/null; then
|
||||
DOWNLOAD_METHOD='wget --max-redirect 3 --quiet -O'
|
||||
else
|
||||
AUTOUPDATE=false
|
||||
echo -e "No curl or wget detected.\nAutomatic self-update disabled!"
|
||||
fi
|
||||
|
||||
fQuit() {
|
||||
## change directory back to the original working directory
|
||||
cd "${CURRDIR}"
|
||||
[ "$1" -eq 0 ] && echo -e "\n$2" || echo -e "\n$2" >&2
|
||||
exit $1
|
||||
}
|
||||
|
||||
fUsage() {
|
||||
echo -e "\nUsage: $0 [-ds]"
|
||||
echo -e "
|
||||
Optional Arguments:
|
||||
-s Start immediately
|
||||
-d Don't auto-update prefsCleaner.sh"
|
||||
}
|
||||
|
||||
download_file() { # expects URL as argument ($1)
|
||||
declare -r tf=$(mktemp)
|
||||
|
||||
$DOWNLOAD_METHOD "${tf}" "$1" &>/dev/null && echo "$tf" || echo '' # return the temp-filename or empty string on error
|
||||
}
|
||||
|
||||
fFF_check() {
|
||||
# there are many ways to see if thunderbird is running or not, some more reliable than others
|
||||
# this isn't elegant and might not be future-proof but should at least be compatible with any environment
|
||||
while [ -e lock ]; do
|
||||
echo -e "\nThis Thunderbird profile seems to be in use. Close Thunderbird and try again.\n" >&2
|
||||
read -r -p "Press any key to continue."
|
||||
done
|
||||
}
|
||||
|
||||
## returns the version number of a prefsCleaner.sh file
|
||||
get_prefsCleaner_version() {
|
||||
echo "$(sed -n '5 s/.*[[:blank:]]\([[:digit:]]*\.[[:digit:]]*\)/\1/p' "$1")"
|
||||
}
|
||||
|
||||
## updates the prefsCleaner.sh file based on the latest public version
|
||||
update_prefsCleaner() {
|
||||
declare -r tmpfile="$(download_file 'https://raw.githubusercontent.com/HorlogeSkynet/thunderbird-user.js/master/prefsCleaner.sh')"
|
||||
[ -z "$tmpfile" ] && echo -e "Error! Could not download prefsCleaner.sh" && return 1 # check if download failed
|
||||
|
||||
[[ $(get_prefsCleaner_version "$SCRIPT_FILE") == $(get_prefsCleaner_version "$tmpfile") ]] && return 0
|
||||
|
||||
mv "$tmpfile" "$SCRIPT_FILE"
|
||||
chmod u+x "$SCRIPT_FILE"
|
||||
"$SCRIPT_FILE" "$@" -d
|
||||
exit 0
|
||||
}
|
||||
|
||||
fClean() {
|
||||
# the magic happens here
|
||||
prefs="@@"
|
||||
prefexp="user_pref[ ]*\([ ]*[\"']([^\"']+)[\"'][ ]*,"
|
||||
while read -r line; do
|
||||
if [[ "$line" =~ $prefexp && $prefs != *"@@${BASH_REMATCH[1]}@@"* ]]; then
|
||||
prefs="${prefs}${BASH_REMATCH[1]}@@"
|
||||
fi
|
||||
done <<< "$(grep -E "$prefexp" user.js)"
|
||||
|
||||
while IFS='' read -r line || [[ -n "$line" ]]; do
|
||||
if [[ "$line" =~ ^$prefexp ]]; then
|
||||
if [[ $prefs != *"@@${BASH_REMATCH[1]}@@"* ]]; then
|
||||
echo "$line"
|
||||
fi
|
||||
else
|
||||
echo "$line"
|
||||
fi
|
||||
done < "$1" > prefs.js
|
||||
}
|
||||
|
||||
fStart() {
|
||||
if [ ! -e user.js ]; then
|
||||
fQuit 1 "user.js not found in the current directory."
|
||||
elif [ ! -e prefs.js ]; then
|
||||
fQuit 1 "prefs.js not found in the current directory."
|
||||
fi
|
||||
|
||||
fFF_check
|
||||
mkdir -p prefsjs_backups
|
||||
bakfile="prefsjs_backups/prefs.js.backup.$(date +"%Y-%m-%d_%H%M")"
|
||||
mv prefs.js "${bakfile}" || fQuit 1 "Operation aborted.\nReason: Could not create backup file $bakfile"
|
||||
echo -e "\nprefs.js backed up: $bakfile"
|
||||
echo "Cleaning prefs.js..."
|
||||
fClean "$bakfile"
|
||||
fQuit 0 "All done!"
|
||||
}
|
||||
|
||||
|
||||
while getopts "sd" opt; do
|
||||
case $opt in
|
||||
s)
|
||||
QUICKSTART=true
|
||||
;;
|
||||
d)
|
||||
AUTOUPDATE=false
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
## change directory to the Thunderbird profile directory
|
||||
cd "$(dirname "${SCRIPT_FILE}")"
|
||||
|
||||
# Check if running as root and if any files have the owner as root/wheel.
|
||||
if [ "${EUID:-"$(id -u)"}" -eq 0 ]; then
|
||||
fQuit 1 "You shouldn't run this with elevated privileges (such as with doas/sudo)."
|
||||
elif [ -n "$(find ./ -user 0)" ]; then
|
||||
printf 'It looks like this script was previously run with elevated privileges,
|
||||
you will need to change ownership of the following files to your user:\n'
|
||||
find . -user 0
|
||||
fQuit 1
|
||||
fi
|
||||
|
||||
[ "$AUTOUPDATE" = true ] && update_prefsCleaner "$@"
|
||||
|
||||
echo -e "\n\n"
|
||||
echo " ╔══════════════════════════╗"
|
||||
echo " ║ prefs.js cleaner ║"
|
||||
echo " ║ by claustromaniac ║"
|
||||
echo " ║ v2.1 ║"
|
||||
echo " ╚══════════════════════════╝"
|
||||
echo -e "\nThis script should be run from your Thunderbird profile directory.\n"
|
||||
echo "It will remove any entries from prefs.js that also exist in user.js."
|
||||
echo "This will allow inactive preferences to be reset to their default values."
|
||||
echo -e "\nThis Thunderbird profile shouldn't be in use during the process.\n"
|
||||
|
||||
[ "$QUICKSTART" = true ] && fStart
|
||||
|
||||
echo -e "\nIn order to proceed, select a command below by entering its corresponding number.\n"
|
||||
|
||||
select option in Start Help Exit; do
|
||||
case $option in
|
||||
Start)
|
||||
fStart
|
||||
;;
|
||||
Help)
|
||||
fUsage
|
||||
echo -e "\nThis script creates a backup of your prefs.js file before doing anything."
|
||||
echo -e "It should be safe, but you can follow these steps if something goes wrong:\n"
|
||||
echo "1. Make sure Thunderbird is closed."
|
||||
echo "2. Delete prefs.js in your profile folder."
|
||||
echo "3. Delete Invalidprefs.js if you have one in the same folder."
|
||||
echo "4. Rename or copy your latest backup to prefs.js."
|
||||
echo "5. Run Thunderbird and see if you notice anything wrong with it."
|
||||
echo "6. If you do notice something wrong, especially with your extensions, and/or with the UI, go to about:support, and restart Thunderbird with add-ons disabled. Then, restart it again normally, and see if the problems were solved."
|
||||
echo -e "If you are able to identify the cause of your issues, please bring it up on the thunderbird user.js GitHub repository.\n"
|
||||
;;
|
||||
Exit)
|
||||
fQuit 0
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
fQuit 0
|
323
updater.bat
Normal file
323
updater.bat
Normal file
@ -0,0 +1,323 @@
|
||||
@ECHO OFF & SETLOCAL EnableDelayedExpansion
|
||||
TITLE thunderbird user.js updater
|
||||
|
||||
REM ## thunderbird user.js updater for Windows
|
||||
REM ## /!\ This script is a vendored/adapted version of Arkenfox own updater.bat /!\
|
||||
REM ## author: @claustromaniac
|
||||
REM ## version: 4.19
|
||||
REM ## instructions: https://github.com/arkenfox/user.js/wiki/5.1-Updater-[Options]#-windows
|
||||
|
||||
SET v=4.19
|
||||
|
||||
VERIFY ON
|
||||
CD /D "%~dp0"
|
||||
SET _myname=%~n0
|
||||
SET _myparams=%*
|
||||
|
||||
:parse
|
||||
IF "%~1"=="" (GOTO endparse)
|
||||
IF /I "%~1"=="-unattended" (SET _ua=1)
|
||||
IF /I "%~1"=="-log" (SET _log=1)
|
||||
IF /I "%~1"=="-logp" (SET _log=1 & SET _logp=1)
|
||||
IF /I "%~1"=="-multioverrides" (SET _multi=1)
|
||||
IF /I "%~1"=="-merge" (SET _merge=1)
|
||||
IF /I "%~1"=="-updatebatch" (SET _updateb=1)
|
||||
IF /I "%~1"=="-singlebackup" (SET _singlebackup=1)
|
||||
IF /I "%~1"=="-esr" (SET _esr=1)
|
||||
SHIFT
|
||||
GOTO parse
|
||||
:endparse
|
||||
|
||||
FOR /F %%i IN ('PowerShell -Command "[Enum]::GetNames([Net.SecurityProtocolType]) -contains 'Tls12'"') DO (
|
||||
IF "%%i" == "False" (
|
||||
CALL :message "Your PowerShell version doesn't support TLS1.2 ^!"
|
||||
ECHO: Instructions to update PowerShell are on the arkenfox wiki
|
||||
PAUSE
|
||||
EXIT
|
||||
)
|
||||
)
|
||||
|
||||
IF DEFINED _updateb (
|
||||
REM The normal flow here goes from phase 1 to phase 2 and then phase 3.
|
||||
IF NOT "!_myname:~0,9!"=="[updated]" (
|
||||
IF EXIST "[updated]!_myname!.bat" (
|
||||
REM ## Phase 3 ##: The new script, with the original name, will:
|
||||
REM * Delete the [updated]*.bat and *.bat.old scripts
|
||||
REM * Begin the normal routine
|
||||
FC "[updated]!_myname!.bat" "!_myname!.bat.old" >nul
|
||||
IF NOT "!errorlevel!"=="0" (
|
||||
CALL :message "Script updated to version !v!"
|
||||
TIMEOUT 3 >nul
|
||||
)
|
||||
REN "[updated]!_myname!.bat" "[updated]!_myname!.bat.old"
|
||||
DEL /F "!_myname!.bat.old" "[updated]!_myname!.bat.old"
|
||||
GOTO begin
|
||||
)
|
||||
REM ## Phase 1 ##
|
||||
REM * Download new batch and name it [updated]*.bat
|
||||
REM * Start that script in a new CMD window
|
||||
REM * Exit
|
||||
CALL :message "Updating script..."
|
||||
REM Uncomment the next line and comment out the PowerShell call for testing.
|
||||
REM COPY /B /Y "!_myname!.bat" "[updated]!_myname!.bat" >nul
|
||||
CALL :psdownload https://raw.githubusercontent.com/HorlogeSkynet/thunderbird-user.js/master/updater.bat "[updated]!_myname!.bat"
|
||||
IF EXIST "[updated]!_myname!.bat" (
|
||||
START /min CMD /C "[updated]!_myname!.bat" !_myparams!
|
||||
) ELSE (
|
||||
CALL :message "Failed. Make sure PowerShell is allowed internet access."
|
||||
TIMEOUT 120 >nul
|
||||
)
|
||||
) ELSE (
|
||||
IF "!_myname!"=="[updated]" (
|
||||
CALL :message "The [updated] label is reserved. Rename this script and try again."
|
||||
TIMEOUT 300 >nul
|
||||
) ELSE (
|
||||
REM ## Phase 2 ##: The [updated]*.bat script will:
|
||||
REM * Rename the old script and make a copy of itself with the original name.
|
||||
REM * Run that copy in a new CMD instance
|
||||
REM * Exit
|
||||
IF EXIST "!_myname:~9!.bat" ( REN "!_myname:~9!.bat" "!_myname:~9!.bat.old" )
|
||||
COPY /B /Y "!_myname!.bat" "!_myname:~9!.bat"
|
||||
START CMD /C "!_myname:~9!.bat" !_myparams!
|
||||
)
|
||||
)
|
||||
EXIT /B
|
||||
)
|
||||
|
||||
:begin
|
||||
CLS
|
||||
ECHO:
|
||||
ECHO:
|
||||
ECHO: ########################################
|
||||
ECHO: #### user.js Updater for Windows ####
|
||||
ECHO: #### by claustromaniac ####
|
||||
ECHO: #### v!v! ####
|
||||
ECHO: ########################################
|
||||
ECHO:
|
||||
SET /A "_line=0"
|
||||
IF NOT EXIST user.js (
|
||||
CALL :message "user.js not detected in the current directory."
|
||||
) ELSE (
|
||||
FOR /F "skip=1 tokens=1,* delims=:" %%G IN (user.js) DO (
|
||||
SET /A "_line+=1"
|
||||
IF !_line! GEQ 4 (GOTO exitloop)
|
||||
IF !_line! EQU 1 (SET _name=%%H)
|
||||
IF !_line! EQU 2 (SET _date=%%H)
|
||||
IF !_line! EQU 3 (SET _version=%%H)
|
||||
)
|
||||
:exitloop
|
||||
IF NOT "!_name!"=="" (
|
||||
SET "_tempvar="
|
||||
IF /I NOT "!_name!"=="!_name:thunderbird=!" SET _tempvar=1
|
||||
IF !_tempvar! EQU 1 (
|
||||
CALL :message "!_name! !_version:~2!,!_date!"
|
||||
) ELSE (CALL :message "Current user.js version not recognised.")
|
||||
) ELSE (CALL :message "Current user.js version not recognised.")
|
||||
)
|
||||
ECHO:
|
||||
IF NOT DEFINED _ua (
|
||||
CALL :message "This batch should be run from your Thunderbird profile directory."
|
||||
ECHO: It will download the latest version of thunderbird user.js from github and then
|
||||
CALL :message "append any of your own changes from user-overrides.js to it."
|
||||
CALL :message "Visit the wiki for more detailed information."
|
||||
ECHO:
|
||||
TIMEOUT 1 /nobreak >nul
|
||||
CHOICE /C SHE /N /M "Start [S] Help [H] Exit [E]"
|
||||
CLS
|
||||
IF ERRORLEVEL 3 (EXIT /B)
|
||||
IF ERRORLEVEL 2 (GOTO :showhelp)
|
||||
)
|
||||
IF DEFINED _log (
|
||||
CALL :log >>user.js-update-log.txt 2>&1
|
||||
IF DEFINED _logp (START user.js-update-log.txt)
|
||||
EXIT /B
|
||||
:log
|
||||
SET _log=2
|
||||
ECHO:##################################################################
|
||||
ECHO: %date%, %time%
|
||||
)
|
||||
IF EXIST user.js.new (DEL /F "user.js.new")
|
||||
CALL :message "Retrieving latest user.js file from github repository..."
|
||||
CALL :psdownload https://raw.githubusercontent.com/HorlogeSkynet/thunderbird-user.js/master/user.js "user.js.new"
|
||||
IF EXIST user.js.new (
|
||||
IF DEFINED _esr (
|
||||
CALL :message "Activating ESR section..."
|
||||
CALL :activate user.js.new ".x still uses all the following prefs"
|
||||
)
|
||||
IF DEFINED _multi (
|
||||
FORFILES /P user.js-overrides /M *.js >nul 2>&1
|
||||
IF NOT ERRORLEVEL 1 (
|
||||
IF DEFINED _merge (
|
||||
CALL :message "Merging..."
|
||||
COPY /B /Y user.js-overrides\*.js user-overrides-merged.js
|
||||
CALL :merge user-overrides-merged.js
|
||||
COPY /B /Y user.js.new+user-overrides-merged.js user.js.new
|
||||
CALL :merge user.js.new
|
||||
) ELSE (
|
||||
CALL :message "Appending..."
|
||||
COPY /B /Y user.js.new+"user.js-overrides\*.js" user.js.new
|
||||
)
|
||||
) ELSE (CALL :message "No override files found.")
|
||||
) ELSE (
|
||||
IF EXIST "user-overrides.js" (
|
||||
COPY /B /Y user.js.new+"user-overrides.js" "user.js.new"
|
||||
IF DEFINED _merge (
|
||||
CALL :message "Merging user-overrides.js..."
|
||||
CALL :merge user.js.new
|
||||
) ELSE (
|
||||
CALL :message "user-overrides.js appended."
|
||||
)
|
||||
) ELSE (CALL :message "user-overrides.js not found.")
|
||||
)
|
||||
IF EXIST user.js (
|
||||
FC user.js.new user.js >nul && SET "_changed=false" || SET "_changed=true"
|
||||
)
|
||||
IF "!_changed!"=="true" (
|
||||
CALL :message "Backing up..."
|
||||
IF DEFINED _singlebackup (
|
||||
MOVE /Y user.js user.js.bak >nul
|
||||
) ELSE (
|
||||
FOR /F "delims=" %%# IN ('powershell get-date -format "{yyyyMMdd_HHmmss}"') DO @SET ldt=%%#
|
||||
MOVE /Y user.js "user-backup-!ldt!.js" >nul
|
||||
)
|
||||
REN user.js.new user.js
|
||||
CALL :message "Update complete."
|
||||
) ELSE (
|
||||
IF "!_changed!"=="false" (
|
||||
DEL /F user.js.new >nul
|
||||
CALL :message "Update completed without changes."
|
||||
) ELSE (
|
||||
REN user.js.new user.js
|
||||
CALL :message "Update complete."
|
||||
SET "_changed=true"
|
||||
)
|
||||
)
|
||||
) ELSE (
|
||||
CALL :message "Update failed. Make sure PowerShell is allowed internet access."
|
||||
ECHO: No changes were made.
|
||||
)
|
||||
IF NOT DEFINED _log (
|
||||
IF NOT DEFINED _ua (
|
||||
IF EXIST prefsCleaner.bat (
|
||||
IF "!_changed!"=="true" (
|
||||
CALL :message "Would you like to run the prefsCleaner now?"
|
||||
CHOICE /C YN /N /M "(Y/N) "
|
||||
IF "1"=="!errorlevel!" ( START "" cmd.exe /C "prefsCleaner.bat" )
|
||||
) ELSE (PAUSE)
|
||||
) ELSE (PAUSE)
|
||||
)
|
||||
)
|
||||
EXIT /B
|
||||
|
||||
::::::::::::::: Message :::::::::::::::
|
||||
:message
|
||||
SETLOCAL DisableDelayedExpansion
|
||||
IF NOT "2"=="%_log%" (ECHO:)
|
||||
ECHO: %~1
|
||||
IF NOT "2"=="%_log%" (ECHO:)
|
||||
ENDLOCAL
|
||||
GOTO :EOF
|
||||
|
||||
::::::::::::::: Download :::::::::::::::
|
||||
:psdownload
|
||||
(
|
||||
PowerShell -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; (New-Object Net.WebClient).DownloadFile('%~1', '%~2')"
|
||||
) >nul 2>&1
|
||||
GOTO :EOF
|
||||
|
||||
::::::::::::::: Activate Section :::::::::::::::
|
||||
:activate
|
||||
:: arg1 = file
|
||||
:: arg2 = line substring
|
||||
SETLOCAL DisableDelayedExpansion
|
||||
(
|
||||
FOR /F "tokens=1,* delims=:" %%G IN ('FINDSTR /N "^" "%~1"') DO (
|
||||
SET "_temp=%%H"
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
IF "!_temp:%~2=!"=="!_temp!" (
|
||||
ENDLOCAL & ECHO:%%H
|
||||
) ELSE (
|
||||
ECHO://!_temp:~2!
|
||||
ENDLOCAL
|
||||
)
|
||||
)
|
||||
)>updatertempfile
|
||||
MOVE /Y updatertempfile "%~1" >nul
|
||||
ENDLOCAL
|
||||
GOTO :EOF
|
||||
|
||||
::::::::::::::: Merge :::::::::::::::
|
||||
:merge
|
||||
SETLOCAL DisableDelayedExpansion
|
||||
FOR /F tokens^=2^,^*^ delims^=^'^" %%G IN ('FINDSTR /R /C:"^user_pref[ ]*\([ ]*[\"'].*[\"'][ ]*,.*\)[ ]*;" "%~1"') DO (SET "[%%G]=%%H")
|
||||
FOR /F tokens^=2^,^*^ delims^=^' %%G IN ('FINDSTR /R /C:"^//// --- comment-out --- '[^'][^']*'.*" "%~1"') DO (SET "__unset__%%G=1")
|
||||
(
|
||||
FOR /F "tokens=1,* delims=:" %%I IN ('FINDSTR /N "^" "%~1"') DO (
|
||||
SET "_temp=%%J"
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
IF NOT "!_temp:~0,9!"=="user_pref" (
|
||||
ENDLOCAL & ECHO:%%J
|
||||
) ELSE (
|
||||
IF "!_temp:;=!"=="!_temp!" (
|
||||
ENDLOCAL & ECHO:%%J
|
||||
) ELSE (
|
||||
ENDLOCAL
|
||||
FOR /F tokens^=2^ delims^=^'^" %%K IN ("%%J") DO (
|
||||
IF NOT "_user.js.parrot"=="%%K" (
|
||||
IF DEFINED __unset__%%K (
|
||||
ECHO://%%J
|
||||
) ELSE (
|
||||
IF DEFINED [%%K] (
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
FOR /F "delims=" %%L IN ("![%%K]!") DO (
|
||||
ENDLOCAL & ECHO:user_pref("%%K"%%L
|
||||
SET "[%%K]="
|
||||
)
|
||||
)
|
||||
)
|
||||
) ELSE (ECHO:%%J)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)>updatertempfile
|
||||
MOVE /Y updatertempfile "%~1" >nul
|
||||
ENDLOCAL
|
||||
GOTO :EOF
|
||||
|
||||
::::::::::::::: Help :::::::::::::::
|
||||
:showhelp
|
||||
MODE 80,54
|
||||
CLS
|
||||
CALL :message "Available arguments (case-insensitive):"
|
||||
CALL :message " -esr"
|
||||
ECHO: Activate ESR related preferences
|
||||
CALL :message " -log"
|
||||
ECHO: Write the console output to a logfile (user.js-update-log.txt)
|
||||
CALL :message " -logP"
|
||||
ECHO: Like -log, but also open the logfile after updating.
|
||||
CALL :message " -merge"
|
||||
ECHO: Merge overrides instead of appending them. Single-line comments and
|
||||
ECHO: _user.js.parrot lines are appended normally. Overrides for inactive
|
||||
ECHO: user.js prefs will be appended. When -Merge and -MultiOverrides are used
|
||||
ECHO: together, a user-overrides-merged.js file is also generated in the root
|
||||
ECHO: directory for quick reference. It contains only the merged data from
|
||||
ECHO: override files and can be safely discarded after updating, or used as the
|
||||
ECHO: new user-overrides.js. When there are conflicting records for the same
|
||||
ECHO: pref, the value of the last one declared will be used. Visit the wiki
|
||||
ECHO: for usage examples and more detailed information.
|
||||
CALL :message " -multiOverrides"
|
||||
ECHO: Use any and all .js files in a user.js-overrides sub-folder as overrides
|
||||
ECHO: instead of the default user-overrides.js file. Files are appended in
|
||||
ECHO: alphabetical order.
|
||||
CALL :message " -unattended"
|
||||
ECHO: Run without user input.
|
||||
CALL :message " -singleBackup"
|
||||
ECHO: Use a single backup file and overwrite it on new updates, instead of
|
||||
ECHO: cumulative backups. This was the default behaviour before v4.3.
|
||||
CALL :message " -updateBatch"
|
||||
ECHO: Update the script itself on execution, before the normal routine.
|
||||
CALL :message ""
|
||||
PAUSE
|
||||
MODE 80,25
|
||||
GOTO :begin
|
408
updater.sh
Executable file
408
updater.sh
Executable file
@ -0,0 +1,408 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
## thunderbird user.js updater for macOS and Linux
|
||||
## /!\ This script is a vendored/adapted version of Arkenfox own updater.sh /!\
|
||||
|
||||
## version: 4.0
|
||||
## Author: Pat Johnson (@overdodactyl)
|
||||
## Additional contributors: @earthlng, @ema-pe, @claustromaniac, @infinitewarp
|
||||
|
||||
## DON'T GO HIGHER THAN VERSION x.9 !! ( because of ASCII comparison in update_updater() )
|
||||
|
||||
# Check if running as root
|
||||
if [ "${EUID:-"$(id -u)"}" -eq 0 ]; then
|
||||
printf "You shouldn't run this with elevated privileges (such as with doas/sudo).\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
readonly CURRDIR=$(pwd)
|
||||
|
||||
SCRIPT_FILE=$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null)
|
||||
[ -z "$SCRIPT_FILE" ] && SCRIPT_FILE=${BASH_SOURCE[0]}
|
||||
readonly SCRIPT_DIR=$(dirname "${SCRIPT_FILE}")
|
||||
|
||||
|
||||
#########################
|
||||
# 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 >/dev/null; then
|
||||
DOWNLOAD_METHOD='curl --max-redirs 3 -so'
|
||||
elif command -v wget >/dev/null; then
|
||||
DOWNLOAD_METHOD='wget --max-redirect 3 --quiet -O'
|
||||
else
|
||||
echo -e "${RED}This script requires curl or wget.\nProcess aborted${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
show_banner() {
|
||||
echo -e "${BBLUE}
|
||||
############################################################################
|
||||
#### ####
|
||||
#### thunderbird user.js ####
|
||||
#### Hardening the Privacy and Security Settings of Thunderbird ####
|
||||
#### Maintained by @Thorin-Oakenpants and @earthlng ####
|
||||
#### Updater for macOS and Linux by @overdodactyl ####
|
||||
#### ####
|
||||
############################################################################"
|
||||
echo -e "${NC}\n"
|
||||
echo -e "Documentation for this script is available here: ${CYAN}https://github.com/arkenfox/user.js/wiki/5.1-Updater-[Options]#-maclinux${NC}\n"
|
||||
}
|
||||
|
||||
#########################
|
||||
# Arguments #
|
||||
#########################
|
||||
|
||||
usage() {
|
||||
echo
|
||||
echo -e "${BLUE}Usage: $0 [-bcdehlnrsuv] [-p PROFILE] [-o OVERRIDE]${NC}" 1>&2 # Echo usage string to standard error
|
||||
echo -e "
|
||||
Optional Arguments:
|
||||
-h Show this help message and exit.
|
||||
-p PROFILE Path to your Thunderbird profile (if different than the dir of this script)
|
||||
IMPORTANT: If the path contains spaces, wrap the entire argument in quotes.
|
||||
-l Choose your Thunderbird profile from a list
|
||||
-u Update updater.sh and execute silently. Do not seek confirmation.
|
||||
-d Do not look for updates to updater.sh.
|
||||
-s Silently update user.js. Do not seek confirmation.
|
||||
-b Only keep one backup of each file.
|
||||
-c Create a diff file comparing old and new user.js within userjs_diffs.
|
||||
-o OVERRIDE Filename or path to overrides file (if different than user-overrides.js).
|
||||
If used with -p, paths should be relative to PROFILE or absolute paths
|
||||
If given a directory, all files inside will be appended recursively.
|
||||
You can pass multiple files or directories by passing a comma separated list.
|
||||
Note: If a directory is given, only files inside ending in the extension .js are appended
|
||||
IMPORTANT: Do not add spaces between files/paths. Ex: -o file1.js,file2.js,dir1
|
||||
IMPORTANT: If any file/path contains spaces, wrap the entire argument in quotes.
|
||||
Ex: -o \"override folder\"
|
||||
-n Do not append any overrides, even if user-overrides.js exists.
|
||||
-v Open the resulting user.js file.
|
||||
-r Only download user.js to a temporary file and open it.
|
||||
-e Activate ESR related preferences."
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
#########################
|
||||
# File Handling #
|
||||
#########################
|
||||
|
||||
download_file() { # expects URL as argument ($1)
|
||||
declare -r tf=$(mktemp)
|
||||
|
||||
$DOWNLOAD_METHOD "${tf}" "$1" &>/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 [ "$(uname -s | cut -c -5)" == "Linux" ]; then
|
||||
xdg-open "$1"
|
||||
else
|
||||
echo -e "${RED}Error: Sorry, opening files is not supported for your OS.${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
readIniFile() { # expects one argument: absolute path of profiles.ini
|
||||
declare -r inifile="$1"
|
||||
|
||||
# tempIni will contain: [ProfileX], Name=, IsRelative= and Path= (and Default= if present) of the only (if) or the selected (else) profile
|
||||
if [ "$(grep -c '^\[Profile' "${inifile}")" -eq "1" ]; then ### only 1 profile found
|
||||
tempIni="$(grep '^\[Profile' -A 4 "${inifile}")"
|
||||
else
|
||||
echo -e "Profiles found:\n––––––––––––––––––––––––––––––"
|
||||
## cmd-substitution to strip trailing newlines and in quotes to keep internal ones:
|
||||
echo "$(grep --color=never -E 'Default=[^1]|\[Profile[0-9]*\]|Name=|Path=|^$' "${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
|
||||
tempIni="$(grep "^\[Profile${REPLY}" -A 4 "${inifile}")" || {
|
||||
echo -e "${RED}Profile${REPLY} does not exist!${NC}" && exit 1
|
||||
}
|
||||
else
|
||||
echo -e "${RED}Invalid selection!${NC}" && exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# extracting 0 or 1 from the "IsRelative=" line
|
||||
declare -r pathisrel=$(sed -n 's/^IsRelative=\([01]\)$/\1/p' <<< "${tempIni}")
|
||||
|
||||
# extracting only the path itself, excluding "Path="
|
||||
PROFILE_PATH=$(sed -n 's/^Path=\(.*\)$/\1/p' <<< "${tempIni}")
|
||||
# update global variable if path is relative
|
||||
[[ ${pathisrel} == "1" ]] && PROFILE_PATH="$(dirname "${inifile}")/${PROFILE_PATH}"
|
||||
}
|
||||
|
||||
getProfilePath() {
|
||||
declare -r f1=~/Library/Application\ Support/Thunderbird/profiles.ini
|
||||
declare -r f2=~/.thunderbird/profiles.ini
|
||||
|
||||
if [ "$PROFILE_PATH" = false ]; then
|
||||
PROFILE_PATH="$SCRIPT_DIR"
|
||||
elif [ "$PROFILE_PATH" = 'list' ]; then
|
||||
if [[ -f "$f1" ]]; then
|
||||
readIniFile "$f1" # updates PROFILE_PATH or exits on error
|
||||
elif [[ -f "$f2" ]]; then
|
||||
readIniFile "$f2"
|
||||
else
|
||||
echo -e "${RED}Error: Sorry, -l is not supported for your OS${NC}"
|
||||
exit 1
|
||||
fi
|
||||
#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:
|
||||
# -d: New version will not be looked for and update will not occur
|
||||
# -u: Check for update, if available, execute without asking
|
||||
update_updater() {
|
||||
[ "$UPDATE" = 'no' ] && return 0 # User signified not to check for updates
|
||||
|
||||
declare -r tmpfile="$(download_file 'https://raw.githubusercontent.com/HorlogeSkynet/thunderbird-user.js/master/updater.sh')"
|
||||
[ -z "${tmpfile}" ] && echo -e "${RED}Error! Could not download updater.sh${NC}" && return 1 # check if download failed
|
||||
|
||||
if [[ $(get_updater_version "$SCRIPT_FILE") < $(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"
|
||||
[[ $REPLY =~ ^[Yy]$ ]] || return 0 # Update available, but user chooses not to update
|
||||
fi
|
||||
else
|
||||
return 0 # No update available
|
||||
fi
|
||||
mv "${tmpfile}" "$SCRIPT_FILE"
|
||||
chmod u+x "$SCRIPT_FILE"
|
||||
"$SCRIPT_FILE" "$@" -d
|
||||
exit 0
|
||||
}
|
||||
|
||||
#########################
|
||||
# Update user.js #
|
||||
#########################
|
||||
|
||||
# Returns version number of a user.js file
|
||||
get_userjs_version() {
|
||||
[ -e "$1" ] && echo "$(sed -n '4p' "$1")" || echo "Not detected."
|
||||
}
|
||||
|
||||
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
|
||||
SAVEIFS=$IFS
|
||||
IFS=$'\n\b' # Set IFS
|
||||
FILES="${input}"/*.js
|
||||
for f in $FILES
|
||||
do
|
||||
add_override "$f"
|
||||
done
|
||||
IFS=$SAVEIFS # restore $IFS
|
||||
else
|
||||
echo -e "${ORANGE}Warning: Could not find override file:${NC} ${input}"
|
||||
fi
|
||||
}
|
||||
|
||||
remove_comments() { # expects 2 arguments: from-file and to-file
|
||||
sed -e '/^\/\*.*\*\/[[:space:]]*$/d' -e '/^\/\*/,/\*\//d' -e 's|^[[:space:]]*//.*$||' -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/HorlogeSkynet/thunderbird-user.js/master/user.js')"
|
||||
[ -z "${newfile}" ] && echo -e "${RED}Error! Could not download user.js${NC}" && return 1 # check if download failed
|
||||
|
||||
echo -e "Please observe the following information:
|
||||
Thunderbird profile: ${ORANGE}$(pwd)${NC}
|
||||
Available online: ${ORANGE}$(get_userjs_version "$newfile")${NC}
|
||||
Currently using: ${ORANGE}$(get_userjs_version user.js)${NC}\n\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 =~ ^[Yy]$ ]]; 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")"
|
||||
[ "$BACKUP" = 'single' ] && bakname='userjs_backups/user.js.backup'
|
||||
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 FILES; do
|
||||
for FILE in "${FILES[@]}"; do
|
||||
add_override "$FILE"
|
||||
done
|
||||
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 [ -n "$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}"
|
||||
[ "$BACKUP" = 'multiple' ] && rm "$bakname" &>/dev/null
|
||||
fi
|
||||
rm "$past_nocomments" "$current_nocomments" "$pastuserjs" &>/dev/null
|
||||
fi
|
||||
|
||||
[ "$VIEW" = true ] && open_file "${PWD}/user.js"
|
||||
}
|
||||
|
||||
#########################
|
||||
# Execute #
|
||||
#########################
|
||||
|
||||
if [ $# != 0 ]; then
|
||||
# Display usage if first argument is -help or --help
|
||||
if [ "$1" = '--help' ] || [ "$1" = '-help' ]; then
|
||||
usage
|
||||
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/HorlogeSkynet/thunderbird-user.js/master/user.js')"
|
||||
[ -z "${tfile}" ] && echo -e "${RED}Error! Could not download user.js${NC}" && exit 1 # check if download failed
|
||||
mv "$tfile" "${tfile}.js"
|
||||
echo -e "${ORANGE}Warning: user.js was saved to temporary file ${tfile}.js${NC}"
|
||||
open_file "${tfile}.js"
|
||||
exit 0
|
||||
;;
|
||||
\?)
|
||||
echo -e "${RED}\n Error! Invalid option: -$OPTARG${NC}" >&2
|
||||
usage
|
||||
;;
|
||||
:)
|
||||
echo -e "${RED}Error! Option -$OPTARG requires an argument.${NC}" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
show_banner
|
||||
update_updater "$@"
|
||||
|
||||
getProfilePath # updates PROFILE_PATH or exits on error
|
||||
cd "$PROFILE_PATH" || exit 1
|
||||
|
||||
# Check if any files have the owner as root/wheel.
|
||||
if [ -n "$(find ./ -user 0)" ]; then
|
||||
printf 'It looks like this script was previously run with elevated privileges,
|
||||
you will need to change ownership of the following files to your user:\n'
|
||||
find . -user 0
|
||||
cd "$CURRDIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
update_userjs
|
||||
|
||||
cd "$CURRDIR"
|
Loading…
x
Reference in New Issue
Block a user