FiloSottile / FiloSottile/passage

Allow multiple identities files

Open
#51 0 comments 5 reactions 0 assignees View on GitHub
Dominant language
Shell
Stars
1.2k
Forks
54
PR merge metrics
No merged PRs in 30d

Description

On one of my machines, I have 2 age keys that I use for my passwords:

- One secure enclave key (for Touch ID), not encrypted with a passphrase
- One standard age key, protected by a passphrase

Some folders in my store have a recipients file with both recipients in them, some only the one for the passphrase-protected age key.

I'd like to be able for passage to use the unencrypted (Touch ID) key when it can, and only prompt me for a passphrase when it needs to use the passphrase-protected key (i.e. when the password is only encrypted for the passphrase-protected key).

Passage only looks in one identities file, and as far as I know, I cannot combine passphrase-protected age keys and non-password-protected keys (such as the secure enclave one) in one `identities` file, so I can't make passage behave this way. It does work with age directly when I pass both identities in the correct order.

## Proposed solution

One possible solution (which I implemented in my local copy): if `identities` is a directory, add all files in that directory in alphabetical order as identities to the age command-line (there may need to be a filter here).

One thing to bear in mind is extensions, which expect one `$IDENTITIES_FILE`; they could still be passed the first one through that variable for backwards compatibility, but in order to support multiple, they would have to support a new variable. I chose to pass an array `$AGE_IDENTITY_ARGS`, which avoids having to construct the `-i` command line by hand; this is also what password-store seems to do with `$GPG_OPTS`. (BTW, it seems there is a reference to `$AGE_IDENTITY_ARGS` in the code already, but I’m not sure this is intentional; I think the command where this is referenced, `git init`, is currently broken).

Another thing to note is that `passage git init` fixes the identity arguments in a config file. This means the identity files will be fixed at init time. I think the only way to make the git diff subcommand work is to not use age directly, but delay the parameter expansion (e.g. by using something like `passage show` that supports full paths as conversion script)

I created a PR to illustrate this solution.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.