Add Firefox and uBlock Origin sections

This commit is contained in:
2Shirt 2021-09-18 16:11:09 -06:00
parent 578925cb70
commit 14ff5a9437
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
3 changed files with 145 additions and 4 deletions

View file

@ -23,6 +23,9 @@ PRESETS = {
'Enable Windows Updates',
'Windows Explorer',
),
'Install Software': (
'Firefox', # Needed to handle profile upgrade nonsense
),
'System Summary': (
'Operating System',
'Windows Activation',
@ -111,10 +114,11 @@ BASE_MENUS = {
'Install Software': (
MenuEntry('Visual C++ Runtimes', 'auto_install_vcredists'),
#MenuEntry('ESET NOD32 Antivirus', no_op),
MenuEntry('Firefox', 'auto_install_firefox'),
MenuEntry('LibreOffice', 'auto_install_libreoffice'),
MenuEntry('Open Shell', 'auto_install_open_shell'),
MenuEntry('uBlock Origin', no_op),
MenuEntry('Software Bundle', no_op), # include FF x32 -> x64 convertion?
MenuEntry('uBlock Origin', 'auto_install_ublock_origin'),
MenuEntry('Software Bundle', no_op),
),
'Configure System': (
MenuEntry('Chrome Notifications', no_op),

View file

@ -32,7 +32,8 @@ SOURCES = {
'FastCopy': 'https://ftp.vector.co.jp/73/10/2323/FastCopy392_installer.exe',
'Fluent-Metro': 'https://github.com/bonzibudd/Fluent-Metro/releases/download/v1.5.2/Fluent-Metro_1.5.2.zip',
'FurMark': 'https://geeks3d.com/dl/get/569',
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/3740966/ublock_origin-1.34.0-an+fx.xpi',
'Firefox32': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=en-US',
'Firefox64': 'https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=en-US',
'HitmanPro': 'https://dl.surfright.nl/HitmanPro.exe',
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
'HWiNFO': 'https://files1.majorgeeks.com/c8a055180587599139f8f454712dcc618cd1740e/systeminfo/hwi_702.zip',

View file

@ -1,7 +1,9 @@
"""WizardKit: Setup - Windows"""
# vim: sts=2 sw=2 ts=2
import configparser
import logging
import json
import os
import platform
import re
@ -13,11 +15,13 @@ from subprocess import CalledProcessError, DEVNULL
from wk.cfg.main import KIT_NAME_FULL, KIT_NAME_SHORT
from wk.exe import (
get_procs,
kill_procs,
run_program,
popen_program,
wait_for_procs,
)
from wk.io import (
case_insensitive_path,
delete_folder,
get_path_obj,
non_clobber_path,
@ -96,6 +100,13 @@ PROGRAMFILES_64 = os.environ.get(
'PROGRAMFILES', r'C:\Program Files',
),
)
REG_CHROME_UBLOCK_ORIGIN = {
'HKLM': {
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': (
('update_url', 'https://clients2.google.com/service/update2/crx', 'SZ', '32'),
)
},
}
REG_OPEN_SHELL_SETTINGS = {
'HKCU': {
r'Software\OpenShell\StartMenu': (
@ -382,6 +393,11 @@ def auto_config_open_shell():
TRY_PRINT.run('Open Shell...', reg_write_settings, REG_OPEN_SHELL_SETTINGS)
def auto_install_firefox():
"""Install Firefox."""
TRY_PRINT.run('Firefox...', install_firefox)
def auto_install_libreoffice():
"""Install LibreOffice.
@ -396,6 +412,13 @@ def auto_install_open_shell():
TRY_PRINT.run('Open Shell...', install_open_shell)
def auto_install_ublock_origin():
"""Update the registry to auto-add uBlock Origin to Chrome."""
TRY_PRINT.run(
'uBlock Origin...', reg_write_settings, REG_CHROME_UBLOCK_ORIGIN,
)
def auto_install_vcredists():
"""Install latest supported Visual C++ runtimes."""
TRY_PRINT.run('Visual C++ Runtimes...', install_vcredists)
@ -406,6 +429,77 @@ def auto_install_vcredists():
# Install Functions
def install_firefox():
"""Install Firefox.
As far as I can tell if you use the EXE installers then it will use
the same installation directory as the installed version. As such a
32-bit installation could be upgraded to a 64-bit one and still use
%PROGRAMFILES(X86)% However, if a 64-bit MSI installer is used then
it ignores the 32-bit directory and just installs a new copy to
%PROGRAMFILES% resulting in two copies of Firefox to be in place.
To address this issue this function will uninstall all copies of
Firefox under 64-bit Windows if it's detected in %PROGRAMFILES(X86)%
before installing the latest 64-bit version.
Firefox 67 changed how profiles are named to avoid reusing the same
profile between different channels of Firefox (std, beta, ESR, etc).
However the logic used when upgrading from versions before 67 to
current isn't ideal. It can, but doesn't always?, create a new
profile and set it as default; even if there's an existing profile
being used. To address this profiles.ini is read to compare with the
post-install/upgrade state. If the default is changed to a new
profile then it is reverted so the original existing profile instead.
"""
current_default_profile = None
firefox_exe = f'{os.environ["PROGRAMFILES"]}/Mozilla Firefox/firefox.exe'
profiles_ini = case_insensitive_path(
f'{os.environ["APPDATA"]}/Mozilla/Firefox/profiles.ini',
)
program_path_32bit_exists = False
try:
case_insensitive_path(
f'{PROGRAMFILES_32}/Mozilla Firefox/firefox.exe',
)
except FileNotFoundError:
# Ignore
pass
else:
program_path_32bit_exists = True
revert_default = False
# Save current default profile
if profiles_ini.exists():
current_default_profile = get_firefox_default_profile(profiles_ini)
# Uninstall Firefox if needed
if ARCH == '64' and program_path_32bit_exists:
uninstall_firefox()
# Install Firefox
run_tool('Firefox', 'Firefox', '/S', download=True)
# Open Firefox to force profiles.ini update
popen_program(firefox_exe)
sleep(5)
kill_procs('firefox.exe', force=True)
# Check if default profile changed
if current_default_profile:
new_default = get_firefox_default_profile(profiles_ini)
revert_default = new_default and new_default != current_default_profile
# Revert default profile if needed
if revert_default:
out = []
for line in profiles_ini.read_text().splitlines():
if 'Default=Profile' in line:
out.append(f'Default={current_default_profile}')
else:
out.append(line)
profiles_ini.write_text('\n'.join(out))
def install_libreoffice(
register_mso_types=True, use_mso_formats=False, vcredist=True):
"""Install LibreOffice."""
@ -480,8 +574,50 @@ def install_vcredists():
run_program([installer, *cmd_args])
def uninstall_firefox():
"""Uninstall all copies of Firefox."""
json_file = format_log_path(log_name='Installed Programs', timestamp=True)
json_file = json_file.with_name(f'{json_file.stem}.json')
uninstall_data = None
# Get uninstall_data from UninstallView
extract_tool('UninstallView')
cmd = [get_tool_path('UninstallView', 'UninstallView'), '/sjson', json_file]
run_program(cmd)
with open(json_file, 'rb') as _f:
uninstall_data = json.load(_f)
# Uninstall Firefox if found
for item in uninstall_data:
if item['Display Name'].lower().startswith('mozilla firefox'):
uninstaller = item['Uninstall String'].replace('"', '')
run_program([uninstaller, '/S'])
# Misc Functions
## TODO?
def get_firefox_default_profile(profiles_ini):
"""Get Firefox default profile, returns pathlib.Path or None."""
default_profile = None
parser = None
# Bail early
if not profiles_ini.exists():
return None
# Parse INI
parser = configparser.ConfigParser()
parser.read(profiles_ini)
for section in parser.sections():
if section.lower().startswith('install'):
default_profile = parser[section].get('default')
break
value = parser[section].get('default')
if value and value == '1':
default_profile = parser[section].get('path')
# Done
return default_profile
# Tool Functions
## TODO?