niksos/modules/gui/firefox.nix

492 lines
27 KiB
Nix

{
config,
inputs,
lib,
pkgs,
...
}: let
cfg = config.myOptions.programs.firefox;
inherit (config.myOptions.other.system) username;
inherit (lib) mkEnableOption mkIf mkOption;
inherit (lib.types) attrsOf listOf str submodule;
inherit (lib.attrsets) mapAttrs mapAttrsToList;
buildFirefoxXpiAddon = lib.makeOverridable ({
stdenv ? pkgs.stdenv,
fetchurl ? pkgs.fetchurl,
pname,
version,
addonId,
url,
sha256,
...
}:
stdenv.mkDerivation {
name = "${pname}-${version}";
src = fetchurl {inherit url sha256;};
preferLocalBuild = true;
allowSubstitutes = true;
buildCommand = ''
dst="$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9397384}"
mkdir -p "$dst"
install -v -m644 "$src" "$dst/${addonId}.xpi"
'';
});
extra-addons = {
yomichan = buildFirefoxXpiAddon {
pname = "yomichan";
version = "20.5.22.1";
addonId = "{a9226ee9-7998-47bd-b72e-a1b56df7f77b}";
url = "https://addons.mozilla.org/firefox/downloads/file/3585060/yomichan-20.5.22.1.xpi";
sha256 = "sha256-/icvPD/nCJYS31owfYMD25QzFjsxAqapy/UAehhxsy8=";
};
};
searxng-name = "NotASearx";
searxng = {
urls = [{ template = "https://search.notashelf.dev/search?q={searchTerms}"; }];
iconUpdateURL = "https://search.notashelf.dev/favicon.ico";
updateInterval = 24 * 60 * 60 * 1000;
definedAliases = [ "@sx" ];
};
logo = pkgs.fetchurl {
url = "https://raw.githubusercontent.com/schizofox/assets/main/logo/logo.png";
sha256 = "1wjzivdmppbzrwdxhza5dzzljl3z59vfgggxim9xjb2rzr0wqyyf";
};
in {
options.myOptions.programs.firefox = {
enable = mkEnableOption "firefox";
defaultSearchEngine = mkOption {
description = "name of the default search engine";
type = str;
};
searchEngines = mkOption {
default = [{
url = "https://startpage.com";
name = "Startpage";
aliases = [ "@sp" ];
}];
description = "search engines";
type = attrsOf (submodule {
options = {
url = mkOption {
description = "url for the search engine, params placeholder and all";
type = str;
};
faviconPath = mkOption {
default = "";
description = "path to favicon";
type = str;
};
faviconUrl = mkOption {
default = "";
description = "url to favicon";
type = str;
};
aliases = mkOption {
description = "aliases for the search engine";
type = listOf str;
};
};
});
};
};
config = mkIf cfg.enable {
nixpkgs.overlays = [ inputs.nur.overlay ];
environment.sessionVariables = {
MOZ_ENABLE_WAYLAND = "1";
MOZ_DRM_DEVICE = "/dev/dri/card0";
};
services.psd = {
enable = true;
resyncTimer = "30m";
};
home-manager.users.${username} = {
xdg.desktopEntries = {
firefox-schizo = {
name = "Schizofox";
genericName = "Web Browser";
exec = "firefox-devedition --name firefox-schizo -P schizo %U";
icon = "${logo}";
terminal = false;
categories = [ "Network" "WebBrowser" ];
mimeType = [ "text/html" "text/xml" "application/xhtml+xml" "application/vnd.mozilla.xul+xml" "x-scheme-handler/http" "x-scheme-handler/https" ];
type = "Application";
startupNotify = true;
settings = {
StartupWMClass = "firefox-schizo";
};
};
firefox-unschizo = {
name = "Sanefox";
genericName = "Web Browser";
exec = "firefox-devedition --name firefox-sane -P unschizo %U";
icon = "${logo}";
terminal = false;
categories = [ "Network" "WebBrowser" ];
mimeType = [ "text/html" "text/xml" "application/xhtml+xml" "application/vnd.mozilla.xul+xml" "x-scheme-handler/http" "x-scheme-handler/https" ];
type = "Application";
startupNotify = true;
settings = {
StartupWMClass = "firefox-sane";
};
};
};
programs.firefox = {
enable = true;
package = pkgs.firefox-devedition;
profiles = {
"schizo" = {
id = 0;
isDefault = true;
search = {
default = cfg.defaultSearchEngine;
force = true;
engines = (mapAttrs (name: value: {
${name} = {
urls = [{ template = value.url; }];
icon = mkIf (value.faviconPath != "") value.faviconPath;
iconUpdateURL = mkIf (value.faviconUrl != "") value.faviconUrl;
updateInterval = mkIf (value.faviconUrl != "") (24 * 60 * 60 * 1000);
definedAliases = value.aliases;
};
}) cfg.searchEngines)
// {
# GTFO
"Google".metaData.hidden = true;
"Bing".metaData.hidden = true;
"DuckDuckGo".metaData.hidden = true;
"Amazon.com".metaData.hidden = true;
};
order = mapAttrsToList (name: _value: name) cfg.searchEngines;
};
extensions = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin
tridactyl
violentmonkey
darkreader
keepassxc-browser
redirector
auto-tab-discard
extra-addons.yomichan
];
settings = {
"browser.aboutConfig.showWarning" = false;
"browser.startup.page" = 0;
"browser.startup.homepage" = "about:home";
"browser.newtabpage.enabled" = true;
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"browser.newtabpage.activity-stream.default.sites" = "";
"geo.provider.network.url" = "";
"geo.provider.network.logging.enabled" = false;
"geo.provider.ms-windows-location" = false;
"geo.provider.use_corelocation" = false;
"geo.provider.use_gpsd" = false;
"geo.provider.use_geoclue" = false;
"intl.accept_langauges" = "en-US";
"javascript.use_us_english_locale" = true;
"extensions.getAddons.showPane" = false;
"extensions.htmlaboutaddons.recommendations.enabled" = false;
"browser.discovery.enabled" = false;
# this shit doesn't work thanks to firefox's
# fucking retarded ass decisions
# but I'm gonna keep it anyway
"extensions.unifiedExtensions.enabled" = false;
"datareporting.policy.dataSubmissionEnabled" = false;
"datareporting.healthreport.uploadEnabled" = false;
"toolkit.telemetry.unified" = false;
"toolkit.telemetry.enabled" = false;
"toolkit.telemetry.server" = "data:,";
"toolkit.telemetry.archive.enabled" = false;
"toolkit.telemetry.newProfilePing.enabled" = false;
"toolkit.telemetry.shutdownPingSender.enabled" = false;
"toolkit.telemetry.updatePing.enabled" = false;
"toolkit.telemetry.bhrPing.enabled" = false;
"toolkit.telemetry.firstShutdownPing.enabled" = false;
"toolkit.telemetry.coverage.opt-out" = true;
"toolkit.coverage.endpoint.base" = "";
"browser.ping-centre.telemetry" = false;
"browser.newtabpage.activity-stream.feeds.telemetry" = false;
"browser.newtabpage.activity-stream.telemetry" = false;
"app.shield.optoutstudies.enabled" = false;
"app.normandy.enabled" = false;
"app.normandy.api_url" = "";
"breakpad.reportURL" = "";
"browser.tabs.crashReporting.sendReport" = false;
"browser.crashReports.unsubmittedCheck.enabled" = false;
"browser.crashReports.unsubmittedCheck.autoSubmit2" = false;
"captivedetect.canonicalURL" = "";
"network.captive-portal-service.enabled" = false;
"network.connectivity-service.enabled" = false;
"browser.safebrowsing.malware.enabled" = false;
"browser.safebrowsing.phishing.enabled" = false;
"browser.safebrowsing.downloads.enabled" = false;
"browser.safebrowsing.downloads.remote.enabled" = false;
"browser.safebrowsing.downloads.remote.url" = "";
"browser.safebrowsing.downloads.remote.block_potentially_unwanted" = false;
"browser.safebrowsing.downloads.remote.block_uncommon" = false;
"browser.safebrowsing.allowOverride" = false;
"network.prefetch-next" = false;
"network.dns.disablePrefetch" = true;
"network.dns.disablePrefetchFromHTTPS" = true;
"network.predictor.enabled" = false;
"network.predictor.enable-prefetch" = false;
"network.http.speculative.parallel-limit" = 0;
"browser.places.speculativeConnect.enabled" = false;
"browser.send_pings" = false;
"network.dns.disableIPv6" = true;
"network.proxy.socks_remote_dns" = true;
"network.file.disable_unc_paths" = true;
"network.gio.supported-protocols" = "";
"network.proxy.failover_direct" = false;
"network.proxy.allow_bypass" = false;
# "network.trr.mode" = 5; TODO read about this
"browser.fixup.alternate.enabled" = false;
# TODO do I want this
"browser.search.suggest.enabled" = true;
"browser.urlbar.suggest.searches" = true;
"browser.urlbar.speculativeConnect.enabled" = false;
"browser.urlbar.dnsResolveSingleWordsAfterSearch" = 0;
"browser.urlbar.suggest.quicksuggest.nonsponsored" = false;
"browser.urlbar.suggest.quicksuggest.sponsored" = false;
"browser.formfill.enable" = false;
"layout.css.visited_links_enabled" = false;
"signon.autofillForms" = false;
"signon.formlessCapture.enabled" = false;
# TODO find some info about this
"network.auth.subresource-http-auth-allow" = 0;
"network.http.windows-sso.enabled" = false;
# TODO read about these until...
"browser.cache.disk.enable" = true;
"browser.privatebrowsing.forceMediaMemoryCache" = true;
"media.memory_cache_max_size" = 65536;
"browser.sessionstore.privacy_level" = 2;
# here
"toolkit.winRegisterApplicationRestart" = false;
# TODO favicons might be cool though
"browser.shell.shortcutFavicons" = false;
"security.ssl.require_safe_negotiation" = true;
"security.tls.enable_0rtt_data" = true;
# TODO read and think about it
"security.OCSP.enabled" = 1;
"security.OCSP.require" = true;
"security.family_safety.mode" = 0;
"security.cert_pinning.enforcement_level" = 2;
# TODO read about the next 2
"security.remote_settings.crlite_filters.enabled" = true;
"security.pki.crlite_mode" = 2;
# TODO if images break it's probably this
"security.mixed_content.block_display_content" = true;
"dom.security.https_only_mode" = true;
"dom.security.https_only_mode_pbm" = true;
"dom.security.https_only_mode.upgrade_local" = true;
"dom.security.https_only_mode_send_http_background_request" = false;
"security.ssl.treat_unsafe_negotiation_as_broken" = true;
"browser.xul.error_pages.expert_bad_cert" = true;
"network.http.referer.XOriginPolicy" = 2;
"network.http.referer.XOriginTrimmingPolicy" = 2;
"privacy.userContext.enabled" = true;
"privacy.userContext.ui.enabled" = true;
"privacy.userContext.newTabContainerOnLeftClick.enabled" = true;
# TODO read about these 2
"media.peerconnection.ice.proxy_only_if_behind_proxy" = true;
"media.peerconnection.ice.default_address_only" = true;
"media.peerconnection.ice.no_host" = true;
# TODO remove this if some codecs or shit don't work
"media.gmp-provider.enabled" = false;
# I think this is for netflix and shit
"media.gmp-widevinecdm.enabled" = false;
# disables DRM in general
"media.eme.enabled" = false;
# and the ui for it just in case
"browser.eme.ui.enabled" = false;
"dom.disable_window_move_resize" = true;
"accessibility.force_disabled" = 1;
"browser.helperApps.deleteTempFileOnExit" = true;
# TODO what the fuck is uitour
"browser.uitour.enabled" = false;
"browser.uitour.url" = "";
"devtools.debugger.remote-enabled" = false;
"middlemouse.contentLoadURL" = false;
"permissions.default.shortcuts" = 2;
"permissions.manager.defaultsUrl" = "";
# TODO what is this
"webchannel.allowObject.urlWhitelist" = "";
"network.IDN_show_punycode" = true;
"pdfjs.disabled" = false;
"pdfjs.enableScripting" = false;
"network.protocol-handler.external.ms-windows-store" = false;
"permissions.delegation.enabled" = false;
"browser.download.useDownloadDir" = true;
"browser.download.alwaysOpenPanel" = false;
"browser.download.manager.addToRecentDocs" = true;
"browser.download.always_ask_before_handling_new_types" = true;
# if extensions break go here
"extensions.enabledScopes" = 5;
"extensions.autoDisableScopes" = 15;
# TODO rethink this
"extensions.postDownloadThirdPartyPrompt" = true;
"extensions.webextensions.restrictedDomains" = "";
"browser.contentblocking.category" = "strict";
"privacy.antitracking.enableWebcompat" = false;
"privacy.partition.serviceWorkers" = true;
"privacy.partition.always_partition_third_party_non_cookie_storage" = true;
"privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage" = false;
"privacy.sanitize.sanitizeOnShutdown" = true;
"privacy.clearOnShutdown.cache" = true;
"privacy.clearOnShutdown.downloads" = true;
"privacy.clearOnShutdown.formdata" = true;
"privacy.clearOnShutdown.history" = true;
"privacy.clearOnShutdown.sessions" = true;
"privacy.clearOnShutdown.siteSettings" = true;
# if true I can't recover from crashes according to arkenfox
"privacy.clearOnShutdown.openWindows" = false;
"privacy.clearOnShutdown.cookies" = true;
"privacy.clearOnShutdown.offlineApps" = true;
"privacy.clearsitedata.cache.enabled" = true;
"privacy.cpd.cache" = true;
"privacy.cpd.formdata" = true;
"privacy.cpd.history" = true;
"privacy.cpd.sessions" = true;
"privacy.cpd.offlineApps" = true;
"privacy.cpd.cookies" = true;
"privacy.cpd.downloads" = true;
"privacy.cpd.openWindows" = false;
"privacy.cpd.passwords" = true;
"privacy.cpd.siteSettings" = true;
"privacy.sanitize.timeSpan" = 0;
"privacy.resistFingerprint" = false;
# we won't be installing extensions through mozilla's website I don't think
"privacy.resistFingerprinting.block_mozAddonManager" = true;
"privacy.resistFingerprinting.letterboxing" = true;
"layout.css.font-visibility.resistFingerprinting" = 1;
"browser.display.use_system_colors" = false;
"widget.non-native-theme.enabled" = true;
"browser.link.open_newwindow" = 3;
"browser.link.open_newwindow.restriction" = 0;
"webgl.disabled" = false;
"signon.rememberSignons" = false;
"permissions.memory_only" = true;
"security.nocertdb" = true;
"browser.chrome.site_icons" = true;
"browser.session.max_tabs_undo" = 0;
"browser.sessionstore.resume_from_crash" = true;
"browser.urlbar.autoFill" = false;
"places.history.enabled" = false;
"extensions.formautofill.addresses.enabled" = false;
"extensions.formautofill.creditCards.enabled" = false;
"extensions.formautofill.heuristics.enabled" = false;
"dom.popup_allowed_events" = "click dblclick mousedown pointerdown";
"javascript.options.ion" = false;
"javascript.options.baselinejit" = false;
"javascript.options.jit_trustedprincipals" = true;
"javascript.options.wasm" = false;
"extensions.blocklist.enabled" = true;
"network.http.referer.spoofSource" = false;
"security.dialog_enable_delay" = 1000;
"privacy.firstparty.isolate" = false;
"extensions.webcompat.enable_shims" = true;
"security.tls.version.enable-deprecated" = false;
"extensions.webcompat-reporter.enabled" = false;
"gfx.webrender.all" = true;
"media.ffmpeg.vaapi.enabled" = true;
"identity.sync.tokenserver.uri" = "https://ffsync.jacekpoz.pl/1.0/sync/1.5";
};
};
"unschizo" = {
id = 1;
isDefault = false;
search = {
default = "${searxng-name}";
force = true;
engines = {
"${searxng-name}" = searxng;
# GTFO
"Google".metaData.hidden = true;
"Bing".metaData.hidden = true;
"DuckDuckGo".metaData.hidden = true;
"Amazon.com".metaData.hidden = true;
};
};
extensions = with pkgs.nur.repos.rycee.firefox-addons; [
ublock-origin
dearrow
tridactyl
violentmonkey
darkreader
keepassxc-browser
auto-tab-discard
extra-addons.yomichan
];
settings = {
"browser.aboutConfig.showWarning" = false;
"browser.startup.page" = 0;
"browser.startup.homepage" = "about:home";
"browser.newtabpage.enabled" = true;
"browser.newtabpage.activity-stream.showSponsored" = false;
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
"browser.newtabpage.activity-stream.default.sites" = "";
"extensions.getAddons.showPane" = false;
"extensions.htmlaboutaddons.recommendations.enabled" = false;
"browser.discovery.enabled" = false;
"extensions.unifiedExtensions.enabled" = false;
"datareporting.policy.dataSubmissionEnabled" = false;
"datareporting.healthreport.uploadEnabled" = false;
"toolkit.telemetry.unified" = false;
"toolkit.telemetry.enabled" = false;
"toolkit.telemetry.server" = "data:,";
"toolkit.telemetry.archive.enabled" = false;
"toolkit.telemetry.newProfilePing.enabled" = false;
"toolkit.telemetry.shutdownPingSender.enabled" = false;
"toolkit.telemetry.updatePing.enabled" = false;
"toolkit.telemetry.bhrPing.enabled" = false;
"toolkit.telemetry.firstShutdownPing.enabled" = false;
"toolkit.telemetry.coverage.opt-out" = true;
"toolkit.coverage.endpoint.base" = "";
"browser.ping-centre.telemetry" = false;
"browser.newtabpage.activity-stream.feeds.telemetry" = false;
"browser.newtabpage.activity-stream.telemetry" = false;
"app.shield.optoutstudies.enabled" = false;
"app.normandy.enabled" = false;
"app.normandy.api_url" = "";
"breakpad.reportURL" = "";
"browser.tabs.crashReporting.sendReport" = false;
"browser.crashReports.unsubmittedCheck.enabled" = false;
"browser.crashReports.unsubmittedCheck.autoSubmit2" = false;
"captivedetect.canonicalURL" = "";
"network.captive-portal-service.enabled" = false;
"network.connectivity-service.enabled" = false;
"browser.safebrowsing.malware.enabled" = false;
"browser.safebrowsing.phishing.enabled" = false;
"browser.safebrowsing.downloads.enabled" = false;
"browser.safebrowsing.downloads.remote.enabled" = false;
"browser.safebrowsing.downloads.remote.url" = "";
"browser.safebrowsing.downloads.remote.block_potentially_unwanted" = false;
"browser.safebrowsing.downloads.remote.block_uncommon" = false;
"browser.safebrowsing.allowOverride" = false;
"privacy.resistFingerprinting.block_mozAddonManager" = true;
"signon.rememberSignons" = false;
"gfx.webrender.all" = true;
"media.ffmpeg.vaapi.enabled" = true;
"identity.sync.tokenserver.uri" = "https://ffsync.jacekpoz.pl/1.0/sync/1.5";
};
};
};
};
};
};
}