diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 2b3a9a5d..205453ac 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -150,6 +150,9 @@
/modules/programs/powerline-go.nix @DamienCassou
+/modules/programs/rbw.nix @ambroisie
+/tests/modules/programs/rbw @ambroisie
+
/modules/programs/rofi.nix @thiagokokada
/tests/modules/programs/rofi @thiagokokada
diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index f5ac9c9e..9e77c7d9 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -2047,6 +2047,13 @@ in
configuration file.
'';
}
+
+ {
+ time = "2021-05-10T20:41:44+00:00";
+ message = ''
+ A new module is available: 'programs.rbw'.
+ '';
+ }
];
};
}
diff --git a/modules/modules.nix b/modules/modules.nix
index c0dd457c..b04005e9 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -120,6 +120,7 @@ let
(loadModule ./programs/pidgin.nix { })
(loadModule ./programs/powerline-go.nix { })
(loadModule ./programs/qutebrowser.nix { })
+ (loadModule ./programs/rbw.nix { })
(loadModule ./programs/readline.nix { })
(loadModule ./programs/rofi.nix { })
(loadModule ./programs/rofi-pass.nix { })
diff --git a/modules/programs/rbw.nix b/modules/programs/rbw.nix
new file mode 100644
index 00000000..ecf515e5
--- /dev/null
+++ b/modules/programs/rbw.nix
@@ -0,0 +1,116 @@
+{ config, lib, pkgs, ... }:
+let
+ cfg = config.programs.rbw;
+
+ jsonFormat = pkgs.formats.json { };
+
+ inherit (pkgs.stdenv.hostPlatform) isDarwin;
+
+ settingsModule = with lib;
+ types.submodule {
+ freeformType = jsonFormat.type;
+ options = {
+ email = mkOption {
+ type = types.str;
+ example = "name@example.com";
+ description = "The email address for your bitwarden account.";
+ };
+
+ base_url = mkOption {
+ type = with types; nullOr str;
+ default = null;
+ example = "bitwarden.example.com";
+ description =
+ "The base-url for a self-hosted bitwarden installation.";
+ };
+
+ identity_url = mkOption {
+ type = with types; nullOr str;
+ default = null;
+ example = "identity.example.com";
+ description = "The identity url for your bitwarden installation.";
+ };
+
+ lock_timeout = mkOption {
+ type = types.ints.unsigned;
+ default = 3600;
+ example = 300;
+ description = ''
+ The amount of time that your login information should be cached.
+ '';
+ };
+
+ pinentry = mkOption {
+ type = with types; either package (enum pkgs.pinentry.flavors);
+ example = "gnome3";
+ default = "gtk2";
+ description = ''
+ Which pinentry interface to use. Beware that
+ pinentry-gnome3 may not work on non-Gnome
+ systems. You can fix it by adding the following to your
+ system configuration:
+
+ services.dbus.packages = [ pkgs.gcr ];
+
+ For this reason, the default is gtk2 for
+ now.
+ '';
+ # we want the program in the config
+ apply = val:
+ if builtins.isString val then
+ "${pkgs.pinentry.${val}}/bin/pinentry"
+ else
+ "${val}/bin/pinentry";
+ };
+ };
+ };
+in {
+ meta.maintainers = with lib.hm.maintainers; [ ambroisie ];
+
+ options.programs.rbw = with lib; {
+ enable = mkEnableOption "rwb, a CLI Bitwarden client";
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.rbw;
+ defaultText = literalExample "pkgs.rbw";
+ description = ''
+ Package providing the rbw tool and its
+ rbw-agent daemon.
+ '';
+ };
+
+ settings = mkOption {
+ type = types.nullOr settingsModule;
+ default = null;
+ example = literalExample ''
+ {
+ email = "name@example.com";
+ lock_timeout = 300;
+ pinentry = "gnome3";
+ }
+ '';
+ description = ''
+ rbw configuration, if not defined the configuration will not be
+ managed by Home Manager.
+ '';
+ };
+ };
+
+ config = lib.mkIf cfg.enable (lib.mkMerge [
+ {
+ home.packages = [ cfg.package ];
+ }
+
+ # Only manage configuration if not empty
+ (lib.mkIf (cfg.settings != null && !isDarwin) {
+ xdg.configFile."rbw/config.json".source =
+ jsonFormat.generate "rbw-config.json" cfg.settings;
+ })
+
+ (lib.mkIf (cfg.settings != null && isDarwin) {
+ home.file."Library/Application Support/rbw/config.json".source =
+ jsonFormat.generate "rbw-config.json" cfg.settings;
+ })
+ ]);
+}
diff --git a/tests/default.nix b/tests/default.nix
index ba39aac0..5fb71a21 100644
--- a/tests/default.nix
+++ b/tests/default.nix
@@ -102,6 +102,7 @@ import nmt {
./modules/programs/i3status-rust
./modules/programs/ncmpcpp-linux
./modules/programs/neovim # Broken package dependency on Darwin.
+ ./modules/programs/rbw
./modules/programs/rofi
./modules/programs/rofi-pass
./modules/programs/waybar
diff --git a/tests/modules/programs/rbw/default.nix b/tests/modules/programs/rbw/default.nix
new file mode 100644
index 00000000..99f36f31
--- /dev/null
+++ b/tests/modules/programs/rbw/default.nix
@@ -0,0 +1,5 @@
+{
+ rbw-empty-settings = ./empty-settings.nix;
+ rbw-simple-settings = ./simple-settings.nix;
+ rbw-settings = ./settings.nix;
+}
diff --git a/tests/modules/programs/rbw/empty-settings.nix b/tests/modules/programs/rbw/empty-settings.nix
new file mode 100644
index 00000000..3e4c821d
--- /dev/null
+++ b/tests/modules/programs/rbw/empty-settings.nix
@@ -0,0 +1,19 @@
+{ pkgs, ... }:
+let
+ inherit (pkgs.stdenv.hostPlatform) isDarwin;
+
+ path = if isDarwin then
+ "Library/Application Support/rbw/config.json"
+ else
+ ".config/rbw/config.json";
+in {
+ config = {
+ programs.rbw.enable = true;
+
+ nixpkgs.overlays = [ (import ./overlay.nix) ];
+
+ nmt.script = ''
+ assertPathNotExists home-files/${path}
+ '';
+ };
+}
diff --git a/tests/modules/programs/rbw/overlay.nix b/tests/modules/programs/rbw/overlay.nix
new file mode 100644
index 00000000..f10b1955
--- /dev/null
+++ b/tests/modules/programs/rbw/overlay.nix
@@ -0,0 +1,12 @@
+self: super: {
+ rbw = self.writeScriptBin "dummy-rbw" "";
+ pinentry = {
+ gnome3 = self.writeScriptBin "pinentry-gnome3" "" // {
+ outPath = "@pinentry-gnome3@";
+ };
+ gtk2 = self.writeScriptBin "pinentry-gtk2" "" // {
+ outPath = "@pinentry-gtk2@";
+ };
+ flavors = [ "gnome3" "gtk2" ];
+ };
+}
diff --git a/tests/modules/programs/rbw/settings.nix b/tests/modules/programs/rbw/settings.nix
new file mode 100644
index 00000000..de08ec83
--- /dev/null
+++ b/tests/modules/programs/rbw/settings.nix
@@ -0,0 +1,39 @@
+{ pkgs, ... }:
+let
+ inherit (pkgs.stdenv.hostPlatform) isDarwin;
+
+ path = if isDarwin then
+ "Library/Application Support/rbw/config.json"
+ else
+ ".config/rbw/config.json";
+
+ expected = pkgs.writeText "rbw-expected.json" ''
+ {
+ "base_url": "bitwarden.example.com",
+ "email": "name@example.com",
+ "identity_url": "identity.example.com",
+ "lock_timeout": 300,
+ "pinentry": "@pinentry-gnome3@/bin/pinentry"
+ }
+ '';
+in {
+ config = {
+ programs.rbw = {
+ enable = true;
+ settings = {
+ email = "name@example.com";
+ base_url = "bitwarden.example.com";
+ identity_url = "identity.example.com";
+ lock_timeout = 300;
+ pinentry = "gnome3";
+ };
+ };
+
+ nixpkgs.overlays = [ (import ./overlay.nix) ];
+
+ nmt.script = ''
+ assertFileExists home-files/${path}
+ assertFileContent home-files/${path} '${expected}'
+ '';
+ };
+}
diff --git a/tests/modules/programs/rbw/simple-settings.nix b/tests/modules/programs/rbw/simple-settings.nix
new file mode 100644
index 00000000..4e05b69f
--- /dev/null
+++ b/tests/modules/programs/rbw/simple-settings.nix
@@ -0,0 +1,33 @@
+{ pkgs, ... }:
+let
+ inherit (pkgs.stdenv.hostPlatform) isDarwin;
+
+ path = if isDarwin then
+ "Library/Application Support/rbw/config.json"
+ else
+ ".config/rbw/config.json";
+
+ expected = pkgs.writeText "rbw-expected.json" ''
+ {
+ "base_url": null,
+ "email": "name@example.com",
+ "identity_url": null,
+ "lock_timeout": 3600,
+ "pinentry": "@pinentry-gtk2@/bin/pinentry"
+ }
+ '';
+in {
+ config = {
+ programs.rbw = {
+ enable = true;
+ settings = { email = "name@example.com"; };
+ };
+
+ nixpkgs.overlays = [ (import ./overlay.nix) ];
+
+ nmt.script = ''
+ assertFileExists home-files/${path}
+ assertFileContent home-files/${path} '${expected}'
+ '';
+ };
+}