Keepassxc puts in the $out/share/keepassxc/wordlists
folder a list of files containing words usable to generate new passphrase (for instance you can put one file per language).
I tried to add my own list of files by creating a new package that would populate this same folder:
{ pkgs, config, ...}:
let
# I made that dict by selecting non derivative (only infinitive, singular, as far as I could)
# french words that are "frequent" in the sense that they appear enough times (not that much)
# in a list of files I downloaded
keepassxc_french_dict = pkgs.stdenv.mkDerivation {
name = "keepassxc_french_dict";
src = ./french_frequent_no_derivations_11508_words.txt;
unpackPhase = ''
cp $src french_frequent_no_derivations_11508_words.txt
'';
buildPhase = "";
installPhase = ''
mkdir -p $out/share/keepassxc/wordlists/
cp french_frequent_no_derivations_11508_words.txt $out/share/keepassxc/wordlists/
'';
};
in
{
environment.systemPackages = with pkgs; [
keepassxc
keepassxc_french_dict
];
}
and indeed it does work:
$ ls /run/current-system/sw/share/keepassxc/wordlists
eff_large.wordlist french_frequent_no_derivations_11508_words.wordlist
Unfortunately this new file is not recognized by KeepassXC. My guess is that KeepassXC picks the file in /nix/store
instead of /run/...
:
/run/current-system/sw/share/keepassxc/wordlists$ ls -al
total 34
dr-xr-xr-x 2 root root 4 janv. 1 1970 .
dr-xr-xr-x 3 root root 6 janv. 1 1970 ..
lrwxrwxrwx 1 root root 104 janv. 1 1970 eff_large.wordlist -> /nix/store/2i6wqwgs2agy2d5lyl0d0fbgadsp396y-keepassxc-2.7.1/share/keepassxc/wordlists/eff_large.wordlist
lrwxrwxrwx 1 root root 143 janv. 1 1970 french_frequent_no_derivations_11508_words.wordlist -> /nix/store/py0njcgci2kf5qq8xl2fzs35ba43rldd-keepassxc_french_dict/share/keepassxc/wordlists/french_frequent_no_derivations_11508_words.wordlist
But I’m not sure who is doing something wrong:
- is it KeepassXC that should find the share folder in a different way (how? Is there an environment variable for this? I found
XDG_DATA_DIR
that seems to contain such things, but I’m not sure if it’s the appropriate way to do that… Also if a program is not installed globally on the system, wouldn’t it be a problem to use/run
as it won’t be populated with the locally installed program? Or should keepass first find files in the/nix/store
(configured via CMAKE) and then in/run
(using e.g. theXDG_DATA_DIR
variable)?) - is it NixOs that should provide a different path for the share folder via CMAKE (then I guess it would create quite a lot of issues, not only the one of the first solution but also
/run
is certainly not writable) - is it me that should install my dictionaries differently? How should I proceed? Should I override the derivation (and lose the binary cache features?)?
Note that I created an issue here https://github.com/keepassxreboot/keepassxc/issues/8289