, expire ? "-"
, passPath
, subKeys ? {}
+ , postRun ? ""
, ...
}@primary:
''
info "generateKey uid=\"${uid}\""
if ! ${gpg-with-home}/bin/gpg-with-home --list-secret-keys -- "=${uid}" >/dev/null 2>/dev/null
then
- ${pkgs.pass}/bin/pass "${passPath}" |
+ ${if passPath != "" then "${pkgs.pass}/bin/pass '${passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--batch --pinentry-mode loopback --passphrase-fd 0 \
--quick-generate-key "${uid}" "${algo}" "${unwords usage}" "${expire}"
''
+ unlines (map (generateSubKey primary) subKeys)
+ generateBackupKey "$fpr" primary
+ + postRun
;
generateSubKey =
primary:
info " generateSubKey usage=[${unwords usage}]"
if ! printf '%s\n' "$caps" | ${pkgs.gnugrep}/bin/grep -Fqx "${lettersKeyUsage usage}"
then
- ${pkgs.pass}/bin/pass "${primary.passPath}" |
+ ${if primary.passPath != "" then "${pkgs.pass}/bin/pass '${primary.passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--batch --pinentry-mode loopback --passphrase-fd 0 \
--quick-add-key "$fpr" "${algo}" "${unwords usage}" "${expire}"
fi
'' + (if backupRecipients == [""] then
''
- if ! test -s "${gnupg.gnupgHome}/backup/${uid}/${fpr}.revoke.asc"
+ if ! test -s "${gnupg.gnupgHome}/backup/${uid}/${fpr}.revoke.asc" &&
+ ${gpg-with-home}/bin/gpg-with-home --list-secret-keys "${fpr}" | grep -q "sec "
then
- ${pkgs.pass}/bin/pass "${passPath}" |
+ ${if passPath != "" then "${pkgs.pass}/bin/pass '${passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--pinentry-mode loopback --passphrase-fd 0 \
--armor --yes --output "${gnupg.gnupgHome}/backup/${uid}/${fpr}.revoke.asc" \
fi
if ! test -s "${gnupg.gnupgHome}/backup/${uid}/${fpr}.privkey.sec"
then
- ${pkgs.pass}/bin/pass "${passPath}" |
+ ${if passPath != "" then "${pkgs.pass}/bin/pass '${passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--batch --pinentry-mode loopback --passphrase-fd 0 \
--armor --yes --output "${gnupg.gnupgHome}/backup/${uid}/${fpr}.privkey.sec" \
fi
if ! test -s "${gnupg.gnupgHome}/backup/${uid}/${fpr}.subkeys.sec"
then
- ${pkgs.pass}/bin/pass "${passPath}" |
+ ${if passPath != "" then "${pkgs.pass}/bin/pass '${passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--batch --pinentry-mode loopback --passphrase-fd 0 \
--armor --yes --output "${gnupg.gnupgHome}/backup/${uid}/${fpr}.subkeys.sec" \
'' else ''
if ! test -s "${gnupg.gnupgHome}/backup/${uid}/${fpr}.revoke.asc.gpg"
then
- ${pkgs.pass}/bin/pass "${passPath}" |
+ ${if passPath != "" then "${pkgs.pass}/bin/pass '${passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--pinentry-mode loopback --passphrase-fd 0 \
--armor --gen-revoke "${fpr}" |
fi
if ! test -s "${gnupg.gnupgHome}/backup/${uid}/${fpr}.privkey.sec.gpg"
then
- ${pkgs.pass}/bin/pass "${passPath}" |
+ ${if passPath != "" then "${pkgs.pass}/bin/pass '${passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--batch --pinentry-mode loopback --passphrase-fd 0 \
--armor --export-options export-backup \
fi
if ! test -s "${gnupg.gnupgHome}/backup/${uid}/${fpr}.subkeys.sec.gpg"
then
- ${pkgs.pass}/bin/pass "${passPath}" |
+ ${if passPath != "" then "${pkgs.pass}/bin/pass '${passPath}'" else "cat /dev/null"} |
${gpg-with-home}/bin/gpg-with-home \
--batch --pinentry-mode loopback --passphrase-fd 0 \
--armor --export-options export-backup \
backupRecipients = ["@john@doe.pro"];
};
};
- type = types.attrsOf (types.submodule ({uid, ...}: {
- #config.uid = lib.mkDefault uid;
+ type = types.attrsOf (types.submodule ({name, ...}: {
options = {
uid = lib.mkOption {
type = types.str;
example = "John Doe <john.doe@example.coop>";
- default = uid;
+ default = name;
description = ''
User ID.
'';
};
expire = lib.mkOption {
type = types.str;
- default = "1y";
+ default = "0";
example = "1y";
description = ''
Expiration timeout.
};
expire = lib.mkOption {
type = types.str;
- default = "1y";
+ default = "0";
example = "1y";
description = ''
Expiration timeout.
Backup keys used to encrypt the a backup copy of the secret keys.
'';
};
+ postRun = lib.mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Shell code to run after the key has been generated or tested to exist.
+ '';
+ };
};
}));
};