grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / programs / firefox.nix
blobed874cad74e419b75d01e5406aacbba58c3f9c39
2   pkgs,
3   config,
4   lib,
5   ...
6 }:
8 let
9   cfg = config.programs.firefox;
11   policyFormat = pkgs.formats.json { };
13   organisationInfo = ''
14     When this option is in use, Firefox will inform you that "your browser
15     is managed by your organisation". That message appears because NixOS
16     installs what you have declared here such that it cannot be overridden
17     through the user interface. It does not mean that someone else has been
18     given control of your browser, unless of course they also control your
19     NixOS configuration.
20   '';
22   # deprecated per-native-messaging-host options
23   nmhOptions = {
24     browserpass = {
25       name = "Browserpass";
26       package = pkgs.browserpass;
27     };
28     bukubrow = {
29       name = "Bukubrow";
30       package = pkgs.bukubrow;
31     };
32     euwebid = {
33       name = "Web eID";
34       package = pkgs.web-eid-app;
35     };
36     ff2mpv = {
37       name = "ff2mpv";
38       package = pkgs.ff2mpv;
39     };
40     fxCast = {
41       name = "fx_cast";
42       package = pkgs.fx-cast-bridge;
43     };
44     gsconnect = {
45       name = "GSConnect";
46       package = pkgs.gnomeExtensions.gsconnect;
47     };
48     jabref = {
49       name = "JabRef";
50       package = pkgs.jabref;
51     };
52     passff = {
53       name = "PassFF";
54       package = pkgs.passff-host;
55     };
56     tridactyl = {
57       name = "Tridactyl";
58       package = pkgs.tridactyl-native;
59     };
60     ugetIntegrator = {
61       name = "Uget Integrator";
62       package = pkgs.uget-integrator;
63     };
64   };
67   options.programs.firefox = {
68     enable = lib.mkEnableOption "the Firefox web browser";
70     package = lib.mkOption {
71       type = lib.types.package;
72       default = pkgs.firefox;
73       description = "Firefox package to use.";
74       defaultText = lib.literalExpression "pkgs.firefox";
75       relatedPackages = [
76         "firefox"
77         "firefox-beta-bin"
78         "firefox-bin"
79         "firefox-devedition-bin"
80         "firefox-esr"
81       ];
82     };
84     wrapperConfig = lib.mkOption {
85       type = lib.types.attrs;
86       default = { };
87       description = "Arguments to pass to Firefox wrapper";
88     };
90     policies = lib.mkOption {
91       type = policyFormat.type;
92       default = { };
93       description = ''
94         Group policies to install.
96         See [Mozilla's documentation](https://mozilla.github.io/policy-templates/)
97         for a list of available options.
99         This can be used to install extensions declaratively! Check out the
100         documentation of the `ExtensionSettings` policy for details.
102         ${organisationInfo}
103       '';
104     };
106     preferences = lib.mkOption {
107       type =
108         with lib.types;
109         attrsOf (oneOf [
110           bool
111           int
112           str
113         ]);
114       default = { };
115       description = ''
116         Preferences to set from `about:config`.
118         Some of these might be able to be configured more ergonomically
119         using policies.
121         ${organisationInfo}
122       '';
123     };
125     preferencesStatus = lib.mkOption {
126       type = lib.types.enum [
127         "default"
128         "locked"
129         "user"
130         "clear"
131       ];
132       default = "locked";
133       description = ''
134         The status of `firefox.preferences`.
136         `status` can assume the following values:
137         - `"default"`: Preferences appear as default.
138         - `"locked"`: Preferences appear as default and can't be changed.
139         - `"user"`: Preferences appear as changed.
140         - `"clear"`: Value has no effect. Resets to factory defaults on each startup.
141       '';
142     };
144     languagePacks = lib.mkOption {
145       # Available languages can be found in https://releases.mozilla.org/pub/firefox/releases/${cfg.package.version}/linux-x86_64/xpi/
146       type = lib.types.listOf (
147         lib.types.enum ([
148           "ach"
149           "af"
150           "an"
151           "ar"
152           "ast"
153           "az"
154           "be"
155           "bg"
156           "bn"
157           "br"
158           "bs"
159           "ca-valencia"
160           "ca"
161           "cak"
162           "cs"
163           "cy"
164           "da"
165           "de"
166           "dsb"
167           "el"
168           "en-CA"
169           "en-GB"
170           "en-US"
171           "eo"
172           "es-AR"
173           "es-CL"
174           "es-ES"
175           "es-MX"
176           "et"
177           "eu"
178           "fa"
179           "ff"
180           "fi"
181           "fr"
182           "fur"
183           "fy-NL"
184           "ga-IE"
185           "gd"
186           "gl"
187           "gn"
188           "gu-IN"
189           "he"
190           "hi-IN"
191           "hr"
192           "hsb"
193           "hu"
194           "hy-AM"
195           "ia"
196           "id"
197           "is"
198           "it"
199           "ja"
200           "ka"
201           "kab"
202           "kk"
203           "km"
204           "kn"
205           "ko"
206           "lij"
207           "lt"
208           "lv"
209           "mk"
210           "mr"
211           "ms"
212           "my"
213           "nb-NO"
214           "ne-NP"
215           "nl"
216           "nn-NO"
217           "oc"
218           "pa-IN"
219           "pl"
220           "pt-BR"
221           "pt-PT"
222           "rm"
223           "ro"
224           "ru"
225           "sat"
226           "sc"
227           "sco"
228           "si"
229           "sk"
230           "skr"
231           "sl"
232           "son"
233           "sq"
234           "sr"
235           "sv-SE"
236           "szl"
237           "ta"
238           "te"
239           "tg"
240           "th"
241           "tl"
242           "tr"
243           "trs"
244           "uk"
245           "ur"
246           "uz"
247           "vi"
248           "xh"
249           "zh-CN"
250           "zh-TW"
251         ])
252       );
253       default = [ ];
254       description = ''
255         The language packs to install.
256       '';
257     };
259     autoConfig = lib.mkOption {
260       type = lib.types.lines;
261       default = "";
262       description = ''
263         AutoConfig files can be used to set and lock preferences that are not covered
264         by the policies.json for Mac and Linux. This method can be used to automatically
265         change user preferences or prevent the end user from modifiying specific
266         preferences by locking them. More info can be found in https://support.mozilla.org/en-US/kb/customizing-firefox-using-autoconfig.
267       '';
268     };
270     autoConfigFiles = lib.mkOption {
271       type = with lib.types; listOf path;
272       default = [ ];
273       description = ''
274         AutoConfig files can be used to set and lock preferences that are not covered
275         by the policies.json for Mac and Linux. This method can be used to automatically
276         change user preferences or prevent the end user from modifiying specific
277         preferences by locking them. More info can be found in https://support.mozilla.org/en-US/kb/customizing-firefox-using-autoconfig.
279         Files are concated and autoConfig is appended.
280       '';
281     };
283     nativeMessagingHosts = ({
284       packages = lib.mkOption {
285         type = lib.types.listOf lib.types.package;
286         default = [ ];
287         description = ''
288           Additional packages containing native messaging hosts that should be made available to Firefox extensions.
289         '';
290       };
291     }) // (builtins.mapAttrs (k: v: lib.mkEnableOption "${v.name} support") nmhOptions);
292   };
294   config =
295     let
296       forEachEnabledNmh =
297         fn:
298         lib.flatten (
299           lib.mapAttrsToList (k: v: lib.optional cfg.nativeMessagingHosts.${k} (fn k v)) nmhOptions
300         );
301     in
302     lib.mkIf cfg.enable {
303       warnings = forEachEnabledNmh (
304         k: v:
305         "The `programs.firefox.nativeMessagingHosts.${k}` option is deprecated, "
306         + "please add `${v.package.pname}` to `programs.firefox.nativeMessagingHosts.packages` instead."
307       );
308       programs.firefox.nativeMessagingHosts.packages = forEachEnabledNmh (_: v: v.package);
310       environment.systemPackages = [
311         (cfg.package.override (old: {
312           extraPrefsFiles =
313             old.extraPrefsFiles or [ ]
314             ++ cfg.autoConfigFiles
315             ++ [ (pkgs.writeText "firefox-autoconfig.js" cfg.autoConfig) ];
316           nativeMessagingHosts = old.nativeMessagingHosts or [ ] ++ cfg.nativeMessagingHosts.packages;
317           cfg = (old.cfg or { }) // cfg.wrapperConfig;
318         }))
319       ];
321       environment.etc =
322         let
323           policiesJSON = policyFormat.generate "firefox-policies.json" { inherit (cfg) policies; };
324         in
325         lib.mkIf (cfg.policies != { }) {
326           "firefox/policies/policies.json".source = "${policiesJSON}";
327         };
329       # Preferences are converted into a policy
330       programs.firefox.policies = {
331         DisableAppUpdate = true;
332         Preferences = (
333           builtins.mapAttrs (_: value: {
334             Value = value;
335             Status = cfg.preferencesStatus;
336           }) cfg.preferences
337         );
338         ExtensionSettings = builtins.listToAttrs (
339           builtins.map (
340             lang:
341             lib.attrsets.nameValuePair "langpack-${lang}@firefox.mozilla.org" {
342               installation_mode = "normal_installed";
343               install_url = "https://releases.mozilla.org/pub/firefox/releases/${cfg.package.version}/linux-x86_64/xpi/${lang}.xpi";
344             }
345           ) cfg.languagePacks
346         );
347       };
348     };
350   meta.maintainers = with lib.maintainers; [
351     danth
352     linsui
353   ];