about summary refs log tree commit diff
path: root/nixos/modules/programs/firefox.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules/programs/firefox.nix')
-rw-r--r--nixos/modules/programs/firefox.nix345
1 files changed, 196 insertions, 149 deletions
diff --git a/nixos/modules/programs/firefox.nix b/nixos/modules/programs/firefox.nix
index 7521708fa94f..ed874cad74e4 100644
--- a/nixos/modules/programs/firefox.nix
+++ b/nixos/modules/programs/firefox.nix
@@ -1,4 +1,9 @@
-{ pkgs, config, lib, ... }:
+{
+  pkgs,
+  config,
+  lib,
+  ...
+}:
 
 let
   cfg = config.programs.firefox;
@@ -78,7 +83,7 @@ in
 
     wrapperConfig = lib.mkOption {
       type = lib.types.attrs;
-      default = {};
+      default = { };
       description = "Arguments to pass to Firefox wrapper";
     };
 
@@ -99,7 +104,13 @@ in
     };
 
     preferences = lib.mkOption {
-      type = with lib.types; attrsOf (oneOf [ bool int str ]);
+      type =
+        with lib.types;
+        attrsOf (oneOf [
+          bool
+          int
+          str
+        ]);
       default = { };
       description = ''
         Preferences to set from `about:config`.
@@ -112,7 +123,12 @@ in
     };
 
     preferencesStatus = lib.mkOption {
-      type = lib.types.enum [ "default" "locked" "user" "clear" ];
+      type = lib.types.enum [
+        "default"
+        "locked"
+        "user"
+        "clear"
+      ];
       default = "locked";
       description = ''
         The status of `firefox.preferences`.
@@ -127,111 +143,113 @@ in
 
     languagePacks = lib.mkOption {
       # Available languages can be found in https://releases.mozilla.org/pub/firefox/releases/${cfg.package.version}/linux-x86_64/xpi/
-      type = lib.types.listOf (lib.types.enum ([
-        "ach"
-        "af"
-        "an"
-        "ar"
-        "ast"
-        "az"
-        "be"
-        "bg"
-        "bn"
-        "br"
-        "bs"
-        "ca-valencia"
-        "ca"
-        "cak"
-        "cs"
-        "cy"
-        "da"
-        "de"
-        "dsb"
-        "el"
-        "en-CA"
-        "en-GB"
-        "en-US"
-        "eo"
-        "es-AR"
-        "es-CL"
-        "es-ES"
-        "es-MX"
-        "et"
-        "eu"
-        "fa"
-        "ff"
-        "fi"
-        "fr"
-        "fur"
-        "fy-NL"
-        "ga-IE"
-        "gd"
-        "gl"
-        "gn"
-        "gu-IN"
-        "he"
-        "hi-IN"
-        "hr"
-        "hsb"
-        "hu"
-        "hy-AM"
-        "ia"
-        "id"
-        "is"
-        "it"
-        "ja"
-        "ka"
-        "kab"
-        "kk"
-        "km"
-        "kn"
-        "ko"
-        "lij"
-        "lt"
-        "lv"
-        "mk"
-        "mr"
-        "ms"
-        "my"
-        "nb-NO"
-        "ne-NP"
-        "nl"
-        "nn-NO"
-        "oc"
-        "pa-IN"
-        "pl"
-        "pt-BR"
-        "pt-PT"
-        "rm"
-        "ro"
-        "ru"
-        "sat"
-        "sc"
-        "sco"
-        "si"
-        "sk"
-        "skr"
-        "sl"
-        "son"
-        "sq"
-        "sr"
-        "sv-SE"
-        "szl"
-        "ta"
-        "te"
-        "tg"
-        "th"
-        "tl"
-        "tr"
-        "trs"
-        "uk"
-        "ur"
-        "uz"
-        "vi"
-        "xh"
-        "zh-CN"
-        "zh-TW"
-      ]));
+      type = lib.types.listOf (
+        lib.types.enum ([
+          "ach"
+          "af"
+          "an"
+          "ar"
+          "ast"
+          "az"
+          "be"
+          "bg"
+          "bn"
+          "br"
+          "bs"
+          "ca-valencia"
+          "ca"
+          "cak"
+          "cs"
+          "cy"
+          "da"
+          "de"
+          "dsb"
+          "el"
+          "en-CA"
+          "en-GB"
+          "en-US"
+          "eo"
+          "es-AR"
+          "es-CL"
+          "es-ES"
+          "es-MX"
+          "et"
+          "eu"
+          "fa"
+          "ff"
+          "fi"
+          "fr"
+          "fur"
+          "fy-NL"
+          "ga-IE"
+          "gd"
+          "gl"
+          "gn"
+          "gu-IN"
+          "he"
+          "hi-IN"
+          "hr"
+          "hsb"
+          "hu"
+          "hy-AM"
+          "ia"
+          "id"
+          "is"
+          "it"
+          "ja"
+          "ka"
+          "kab"
+          "kk"
+          "km"
+          "kn"
+          "ko"
+          "lij"
+          "lt"
+          "lv"
+          "mk"
+          "mr"
+          "ms"
+          "my"
+          "nb-NO"
+          "ne-NP"
+          "nl"
+          "nn-NO"
+          "oc"
+          "pa-IN"
+          "pl"
+          "pt-BR"
+          "pt-PT"
+          "rm"
+          "ro"
+          "ru"
+          "sat"
+          "sc"
+          "sco"
+          "si"
+          "sk"
+          "skr"
+          "sl"
+          "son"
+          "sq"
+          "sr"
+          "sv-SE"
+          "szl"
+          "ta"
+          "te"
+          "tg"
+          "th"
+          "tl"
+          "tr"
+          "trs"
+          "uk"
+          "ur"
+          "uz"
+          "vi"
+          "xh"
+          "zh-CN"
+          "zh-TW"
+        ])
+      );
       default = [ ];
       description = ''
         The language packs to install.
@@ -249,10 +267,23 @@ in
       '';
     };
 
+    autoConfigFiles = lib.mkOption {
+      type = with lib.types; listOf path;
+      default = [ ];
+      description = ''
+        AutoConfig files can be used to set and lock preferences that are not covered
+        by the policies.json for Mac and Linux. This method can be used to automatically
+        change user preferences or prevent the end user from modifiying specific
+        preferences by locking them. More info can be found in https://support.mozilla.org/en-US/kb/customizing-firefox-using-autoconfig.
+
+        Files are concated and autoConfig is appended.
+      '';
+    };
+
     nativeMessagingHosts = ({
       packages = lib.mkOption {
         type = lib.types.listOf lib.types.package;
-        default = [];
+        default = [ ];
         description = ''
           Additional packages containing native messaging hosts that should be made available to Firefox extensions.
         '';
@@ -260,48 +291,64 @@ in
     }) // (builtins.mapAttrs (k: v: lib.mkEnableOption "${v.name} support") nmhOptions);
   };
 
-  config = let
-    forEachEnabledNmh = fn: lib.flatten (lib.mapAttrsToList (k: v: lib.optional cfg.nativeMessagingHosts.${k} (fn k v)) nmhOptions);
-  in lib.mkIf cfg.enable {
-    warnings = forEachEnabledNmh (k: v:
-      "The `programs.firefox.nativeMessagingHosts.${k}` option is deprecated, " +
-      "please add `${v.package.pname}` to `programs.firefox.nativeMessagingHosts.packages` instead."
-    );
-    programs.firefox.nativeMessagingHosts.packages = forEachEnabledNmh (_: v: v.package);
+  config =
+    let
+      forEachEnabledNmh =
+        fn:
+        lib.flatten (
+          lib.mapAttrsToList (k: v: lib.optional cfg.nativeMessagingHosts.${k} (fn k v)) nmhOptions
+        );
+    in
+    lib.mkIf cfg.enable {
+      warnings = forEachEnabledNmh (
+        k: v:
+        "The `programs.firefox.nativeMessagingHosts.${k}` option is deprecated, "
+        + "please add `${v.package.pname}` to `programs.firefox.nativeMessagingHosts.packages` instead."
+      );
+      programs.firefox.nativeMessagingHosts.packages = forEachEnabledNmh (_: v: v.package);
 
-    environment.systemPackages = [
-      (cfg.package.override (old: {
-        extraPrefsFiles = old.extraPrefsFiles or [] ++ [(pkgs.writeText "firefox-autoconfig.js" cfg.autoConfig)];
-        nativeMessagingHosts = old.nativeMessagingHosts or [] ++ cfg.nativeMessagingHosts.packages;
-        cfg = (old.cfg or {}) // cfg.wrapperConfig;
-      }))
-    ];
+      environment.systemPackages = [
+        (cfg.package.override (old: {
+          extraPrefsFiles =
+            old.extraPrefsFiles or [ ]
+            ++ cfg.autoConfigFiles
+            ++ [ (pkgs.writeText "firefox-autoconfig.js" cfg.autoConfig) ];
+          nativeMessagingHosts = old.nativeMessagingHosts or [ ] ++ cfg.nativeMessagingHosts.packages;
+          cfg = (old.cfg or { }) // cfg.wrapperConfig;
+        }))
+      ];
 
-    environment.etc =
-      let
-        policiesJSON = policyFormat.generate "firefox-policies.json" { inherit (cfg) policies; };
-      in
-      lib.mkIf (cfg.policies != { }) {
-        "firefox/policies/policies.json".source = "${policiesJSON}";
-      };
+      environment.etc =
+        let
+          policiesJSON = policyFormat.generate "firefox-policies.json" { inherit (cfg) policies; };
+        in
+        lib.mkIf (cfg.policies != { }) {
+          "firefox/policies/policies.json".source = "${policiesJSON}";
+        };
 
-    # Preferences are converted into a policy
-    programs.firefox.policies = {
-      DisableAppUpdate = true;
-      Preferences = (builtins.mapAttrs
-        (_: value: { Value = value; Status = cfg.preferencesStatus; })
-        cfg.preferences);
-      ExtensionSettings = builtins.listToAttrs (builtins.map
-        (lang: lib.attrsets.nameValuePair
-          "langpack-${lang}@firefox.mozilla.org"
-          {
-            installation_mode = "normal_installed";
-            install_url = "https://releases.mozilla.org/pub/firefox/releases/${cfg.package.version}/linux-x86_64/xpi/${lang}.xpi";
-          }
-        )
-        cfg.languagePacks);
+      # Preferences are converted into a policy
+      programs.firefox.policies = {
+        DisableAppUpdate = true;
+        Preferences = (
+          builtins.mapAttrs (_: value: {
+            Value = value;
+            Status = cfg.preferencesStatus;
+          }) cfg.preferences
+        );
+        ExtensionSettings = builtins.listToAttrs (
+          builtins.map (
+            lang:
+            lib.attrsets.nameValuePair "langpack-${lang}@firefox.mozilla.org" {
+              installation_mode = "normal_installed";
+              install_url = "https://releases.mozilla.org/pub/firefox/releases/${cfg.package.version}/linux-x86_64/xpi/${lang}.xpi";
+            }
+          ) cfg.languagePacks
+        );
+      };
     };
-  };
 
-  meta.maintainers = with lib.maintainers; [ danth ];
+  meta.maintainers = with lib.maintainers; [
+    danth
+    linsui
+  ];
 }