From 1c8c134972b64aa31ceddc2b5054ff664e396910 Mon Sep 17 00:00:00 2001 From: Luis Hebendanz Date: Tue, 15 Dec 2020 22:02:34 +0100 Subject: [PATCH] firefox: wrapper updating an addon perserves addon settings --- doc/builders/packages/firefox.section.md | 4 +-- .../networking/browsers/firefox/wrapper.nix | 35 +++++++++++-------- .../fetchfirefoxaddon/default.nix | 9 +++-- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/doc/builders/packages/firefox.section.md b/doc/builders/packages/firefox.section.md index 28fa3f0dbd7c..acf31e188c3e 100644 --- a/doc/builders/packages/firefox.section.md +++ b/doc/builders/packages/firefox.section.md @@ -9,7 +9,7 @@ The `wrapFirefox` function allows to pass policies, preferences and extension th myFirefox = wrapFirefox firefox-unwrapped { nixExtensions = [ (fetchFirefoxAddon { - name = "ublock"; + name = "ublock"; # Has to be unique! url = "https://addons.mozilla.org/firefox/downloads/file/3679754/ublock_origin-1.31.0-an+fx.xpi"; sha256 = "1h768ljlh3pi23l27qp961v1hd0nbj2vasgy11bmcrlqp40zgvnr"; }) @@ -42,7 +42,7 @@ The `wrapFirefox` function allows to pass policies, preferences and extension th If `nixExtensions != null` then all manually installed addons will be uninstalled from your browser profile. To view available enterprise policies visit [enterprise policies](https://github.com/mozilla/policy-templates#enterprisepoliciesenabled) or type into the Firefox url bar: `about:policies#documentation`. -Nix installed addons do not have a valid signature, which is why signature verification is disabled. This does not compromise security because downloaded addons are checksumed and manual addons can't be installed. +Nix installed addons do not have a valid signature, which is why signature verification is disabled. This does not compromise security because downloaded addons are checksumed and manual addons can't be installed. Also make sure that the `name` field of fetchFirefoxAddon is unique. If you remove an addon from the nixExtensions array, rebuild and start Firefox the removed addon will be completly removed with all of its settings. ## Troubleshooting {#sec-firefox-troubleshooting} If addons do not appear installed although they have been defined in your nix configuration file reset the local addon state of your Firefox profile by clicking `help -> restart with addons disabled -> restart -> refresh firefox`. This can happen if you switch from manual addon mode to nix addon mode and then back to manual mode and then again to nix addon mode. diff --git a/pkgs/applications/networking/browsers/firefox/wrapper.nix b/pkgs/applications/networking/browsers/firefox/wrapper.nix index a9888c3c47be..88fb6af4b016 100644 --- a/pkgs/applications/networking/browsers/firefox/wrapper.nix +++ b/pkgs/applications/networking/browsers/firefox/wrapper.nix @@ -1,5 +1,5 @@ { stdenv, lib, makeDesktopItem, makeWrapper, lndir, config -, replace, fetchurl, zip, unzip, jq, xdg_utils +, replace, fetchurl, zip, unzip, jq, xdg_utils, writeText ## various stuff that can be plugged in , flashplayer, hal-flash @@ -97,12 +97,17 @@ let # EXTRA PREF CHANGES # # # ######################### - policiesJson = builtins.toFile "policies.json" - (builtins.toJSON enterprisePolicies); + policiesJson = writeText "policies.json" (builtins.toJSON enterprisePolicies); usesNixExtensions = nixExtensions != null; - extensions = builtins.map (a: + nameArray = builtins.map(a: a.name) (if usesNixExtensions then nixExtensions else []); + + # Check that every extension has a unqiue .name attribute + # and an extid attribute + extensions = if nameArray != (lib.unique nameArray) then + throw "Firefox addon name needs to be unique" + else builtins.map (a: if ! (builtins.hasAttr "extid" a) then throw "nixExtensions has an invalid entry. Missing extid attribute. Please use fetchfirefoxaddon" else @@ -128,12 +133,19 @@ let }; } ) {} extensions; - } + } // + { + Extensions = { + Install = lib.foldr (e: ret: + ret ++ [ "${e.outPath}/${e.extid}.xpi" ] + ) [] extensions; + }; + } // extraPolicies; }; - mozillaCfg = builtins.toFile "mozilla.cfg" '' -// First line must be a comment + mozillaCfg = writeText "mozilla.cfg" '' + // First line must be a comment // Disables addon signature checking // to be able to install addons that do not have an extid @@ -320,18 +332,13 @@ let # preparing for autoconfig mkdir -p "$out/lib/${firefoxLibName}/defaults/pref" - cat > "$out/lib/${firefoxLibName}/defaults/pref/autoconfig.js" < "$out/lib/${firefoxLibName}/defaults/pref/autoconfig.js" + echo 'pref("general.config.obscure_value", 0);' >> "$out/lib/${firefoxLibName}/defaults/pref/autoconfig.js" cat > "$out/lib/${firefoxLibName}/mozilla.cfg" < ${mozillaCfg} mkdir -p $out/lib/${firefoxLibName}/distribution/extensions - for i in ${toString extensions}; do - ln -s -t $out/lib/${firefoxLibName}/distribution/extensions $i/* - done ############################# # # # END EXTRA PREF CHANGES # diff --git a/pkgs/build-support/fetchfirefoxaddon/default.nix b/pkgs/build-support/fetchfirefoxaddon/default.nix index 4b7c68484d2e..9efe9197d687 100644 --- a/pkgs/build-support/fetchfirefoxaddon/default.nix +++ b/pkgs/build-support/fetchfirefoxaddon/default.nix @@ -1,16 +1,20 @@ {stdenv, lib, coreutils, unzip, jq, zip, fetchurl,writeScript, ...}: -{ name + +{ + name , url , md5 ? "" , sha1 ? "" , sha256 ? "" , sha512 ? "" +, fixedExtid ? null , hash ? "" }: + stdenv.mkDerivation rec { inherit name; - extid = "${src.outputHash}@${name}"; + extid = if fixedExtid == null then "nixos@${name}" else fixedExtid; passthru = { exitd=extid; }; @@ -35,4 +39,3 @@ stdenv.mkDerivation rec { }; nativeBuildInputs = [ coreutils unzip zip jq ]; } -