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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
{ lib
, applyPatches
, buildNpmPackage
, dbus
, electron_24
, fetchFromGitHub
, glib
, gnome
, gtk3
, jq
, libsecret
, makeDesktopItem
, makeWrapper
, moreutils
, nodejs_18
, pkg-config
, python3
, rustPlatform
, wrapGAppsHook
}:
let
description = "A secure and free password manager for all of your devices";
icon = "bitwarden";
buildNpmPackage' = buildNpmPackage.override { nodejs = nodejs_18; };
electron = electron_24;
version = "2023.8.3";
src = applyPatches {
src = fetchFromGitHub {
owner = "bitwarden";
repo = "clients";
rev = "desktop-v${version}";
hash = "sha256-ZsAc9tC087Em/VzgaVm5fU+JnI4gIsSAphxicdJWztU=";
};
patches = [ ];
};
desktop-native = rustPlatform.buildRustPackage {
pname = "bitwarden-desktop-native";
inherit src version;
sourceRoot = "${src.name}/apps/desktop/desktop_native";
cargoHash = "sha256-iBZvdBfuZtcoSgyU4B58ARIBplqUuT5bRev9qnk9LpE=";
nativeBuildInputs = [
pkg-config
wrapGAppsHook
];
buildInputs = [
glib
gtk3
libsecret
];
nativeCheckInputs = [
dbus
(gnome.gnome-keyring.override { useWrappedDaemon = false; })
];
checkFlags = [
"--skip=password::password::tests::test"
];
checkPhase = ''
runHook preCheck
export HOME=$(mktemp -d)
export -f cargoCheckHook runHook _eval _callImplicitHook
dbus-run-session \
--config-file=${dbus}/share/dbus-1/session.conf \
-- bash -e -c cargoCheckHook
runHook postCheck
'';
};
desktopItem = makeDesktopItem {
name = "bitwarden";
exec = "bitwarden %U";
inherit icon;
comment = description;
desktopName = "Bitwarden";
categories = [ "Utility" ];
};
in
buildNpmPackage' {
pname = "bitwarden";
inherit src version;
makeCacheWritable = true;
npmBuildFlags = [
"--workspace apps/desktop"
];
npmDepsHash = "sha256-ARq6iYOkL9CMyAX37g8+Wf+UQsH7hU1jCq/52I1qS9A=";
ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
nativeBuildInputs = [
jq
makeWrapper
moreutils
python3
];
preBuild = ''
if [[ $(jq --raw-output '.devDependencies.electron' < package.json | grep -E --only-matching '^[0-9]+') != ${lib.escapeShellArg (lib.versions.major electron.version)} ]]; then
echo 'ERROR: electron version mismatch'
exit 1
fi
jq 'del(.scripts.postinstall)' apps/desktop/package.json | sponge apps/desktop/package.json
jq '.scripts.build = ""' apps/desktop/desktop_native/package.json | sponge apps/desktop/desktop_native/package.json
cp ${desktop-native}/lib/libdesktop_native.so apps/desktop/desktop_native/desktop_native.linux-x64-musl.node
'';
postBuild = ''
pushd apps/desktop
npm exec electron-builder -- \
--dir \
-c.electronDist=${electron}/libexec/electron \
-c.electronVersion=${electron.version}
popd
'';
installPhase = ''
mkdir $out
pushd apps/desktop/dist/linux-unpacked
mkdir -p $out/opt/Bitwarden
cp -r locales resources{,.pak} $out/opt/Bitwarden
popd
makeWrapper '${electron}/bin/electron' "$out/bin/bitwarden" \
--add-flags $out/opt/Bitwarden/resources/app.asar \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" \
--set-default ELECTRON_IS_DEV 0 \
--inherit-argv0
mkdir -p $out/share/applications
cp ${desktopItem}/share/applications/* $out/share/applications
pushd apps/desktop/resources/icons
for icon in *.png; do
dir=$out/share/icons/hicolor/"''${icon%.png}"/apps
mkdir -p "$dir"
cp "$icon" "$dir"/${icon}.png
done
popd
'';
meta = with lib; {
inherit description;
homepage = "https://bitwarden.com";
license = lib.licenses.gpl3;
maintainers = with maintainers; [ amarshall kiwi ];
platforms = [ "x86_64-linux" ];
};
}
|