summaryrefslogtreecommitdiff
path: root/modules/shared/firefox-addons.nix
blob: 8ec9e77c5009886b025a56504f613861c19046e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
{
  config,
  lib,
  pkgs,
  ...
}:

let
  cfg = config.programs.firefox;

  policyFormat = pkgs.formats.json { };

  installURLFromId = id: "https://addons.mozilla.org/firefox/downloads/latest/${id}/latest.xpi";

  extensionSettingsSubmodule = lib.types.submodule (
    { config, ... }:
    {
      options = {
        id = lib.mkOption {
          type = lib.types.str;
          description = "Addon ID from addons.mozilla.org";
          example = "[email protected]";
        };

        settings = lib.mkOption {
          type = lib.types.submodule {
            freeformType = policyFormat.type;

            options = {
              installation_mode = lib.mkOption {
                type = lib.types.enum [
                  "allowed"
                  "blocked"
                  "force_installed"
                  "normal_installed"
                ];
                default = "force_installed";
                description = ''
                  Installation mode for the addon.
                  See <link xlink:href="https://mozilla.github.io/policy-templates/#extensionsettings"/>.
                '';
              };

              install_url = lib.mkOption {
                type = lib.types.str;
                default = installURLFromId config.id;
                defaultText = lib.literalExpression ''
                  "https://addons.mozilla.org/firefox/downloads/latest/''${id}/latest.xpi"
                '';
                example = "https://addons.mozilla.org/firefox/downloads/file/4412673/ublock_origin-1.62.0.xpi";
              };
            };
          };
          default = { };
          description = ''
            Configuration for the `ExtensionSettings` policy
            described at
            <link xlink:href="https://mozilla.github.io/policy-templates/#extensionsettings"/>.
          '';
        };
      };
    }
  );
in

{
  options.programs.firefox = {
    addons = lib.mkOption {
      type = lib.types.listOf extensionSettingsSubmodule;
      default = { };
      description = ''
        List of addon IDs from addons.mozilla.org or configuration
        for the `ExtensionSettings` policy described at
        <link xlink:href="https://mozilla.github.io/policy-templates/#extensionsettings"/>.
      '';
      example = lib.literalExpression ''
        [
          # uBlock Origin
          {
            id = "[email protected]";
            settings = {
              installation_mode = "normal_installed";
            };
          }

          # Bitwarden
          { id = "{446900e4-71c2-419f-a6a7-df9c091e268b}"; }
        ]
      '';
    };
  };

  config = {
    programs.firefox.policies = {
      ExtensionSettings = lib.foldl' (lib.flip (
        addon: lib.recursiveUpdate { ${addon.id} = addon.settings; }
      )) { } cfg.addons;
    };
  };
}