aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml101
-rw-r--r--ChangeLog28
-rw-r--r--Makefile37
-rw-r--r--development.md12
-rwxr-xr-xkeyringer12
-rwxr-xr-xlib/keyringer/actions/check5
-rwxr-xr-xlib/keyringer/actions/sclip9
l---------lib/keyringer/actions/search1
l---------lib/keyringer/actions/ssearch1
-rwxr-xr-xlib/keyringer/actions/xclip9
-rw-r--r--lib/keyringer/completions/bash/keyringer5
-rw-r--r--lib/keyringer/completions/zsh/_keyringer4
-rwxr-xr-xlib/keyringer/functions4
-rw-r--r--share/man/keyringer.162
-rw-r--r--share/man/keyringer.1.md34
15 files changed, 283 insertions, 41 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..0fe0fed
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,101 @@
+---
+variables:
+ KEYRINGER_NON_INTERACTIVE: "1"
+
+debian:
+ image: debian:testing
+ script:
+ # Configure pbuilder
+ #
+ # This should be done before pbuilder is installed.
+ # Pbuilder is a dependency of git-buildpackage.
+ #
+ # With doing this, pbuilder may fail to detect MIRRORSITE during package installation,
+ # giving errors like
+ #
+ # Configuring pbuilder
+ # --------------------
+ # Default mirror not found
+ # Mirror information detection failed and the user provided no mirror
+ # information.
+ # Please enter valid mirror information.
+ # Please enter the default mirror you want to be used by pbuilder.
+ # If you leave this field blank, there will be one attempt to autodetect this
+ # information. If this attempt fails, you will be prompted again to insert some
+ # valid mirror information.
+ # Here is a valid mirror example: http://deb.debian.org/debian
+ # Default mirror site:
+ # Use of uninitialized value $_[1] in join or string at
+ # /usr/share/perl5/Debconf/DbDriver/Stack.pm line 112.
+ #
+ # As of 2025-01-04, it seems this bug was still not reported upstream.
+ - echo 'DISTRIBUTION=sid' > /etc/pbuilderrc
+ - echo 'MIRRORSITE=http://http.debian.net/debian/' >> /etc/pbuilderrc
+
+ # Install dependencies
+ - apt-get update
+ - apt-get install -y git
+ - apt-get install -y git-buildpackage lintian piuparts
+
+ # Build the package
+ - git fetch --all
+ - git branch debian --track origin/debian || true
+ - git checkout debian
+ - git branch --set-upstream-to=origin/debian debian
+ - git pull
+ - gbp buildpackage --git-ignore-new --git-upstream-signatures=no --git-no-sign-tags -us -uc
+
+ # Run lintian
+ # Usually gbp-buildpackage already calls lintian, but we run it again just to make sure
+ - lintian --allow-root -v --pedantic ../keyringer_*.deb
+
+ # Run piuparts
+ #- piuparts ../keyringer*.deb
+
+ # Save artifacts
+ - mkdir -p dist
+ - mv ../keyringer_*.* dist
+ artifacts:
+ paths:
+ - dist
+
+test:
+ image: debian:testing
+ script:
+ # Install keyringer from the distro packaging system
+ # This ensures the needed dependencies are installed
+ - apt-get update
+ - apt-get install -y keyringer
+
+ # Import debian/upstream/signing-key.asc
+ - git fetch --all
+ - git branch debian --track origin/debian || true
+ - git checkout debian
+ - git branch --set-upstream-to=origin/debian debian
+ - git pull
+ - gpg --import < debian/upstream/signing-key.asc
+
+ # Create a test keyring in the develop branch
+ - git branch develop --track origin/develop || true
+ - git checkout develop
+ - git branch --set-upstream-to=origin/develop develop
+ - git pull
+ - mkdir -p ~/temp/tests
+ - git config --global user.name 'Test'
+ - git config --global user.email 'test@example.org'
+ - ./keyringer test init ~/temp/tests/keyringer
+
+ # Build the recipients configuration
+ # Explanation on the "paste" syntax is available at https://stackoverflow.com/a/9605450
+ - gpg --with-colons --list-keys | grep "^uid" | head -1 | awk -F ':' '{ x = $10; gsub(/.*</, "", x); gsub(/>/, "", x); print x; }' > ~/temp/tests/recipients
+ - gpg --with-colons --list-public-keys --with-fingerprint | grep "^fpr" | head -1 | awk -F ':' '{ print $10 }' >> ~/temp/tests/recipients
+ - paste -d " " - - < ~/temp/tests/recipients > ~/temp/tests/keyringer/config/recipients/default
+ - rm ~/temp/tests/recipients
+ - ./keyringer test recipients ls
+
+ # Test the keyring in the develop branch
+ # This will also test the expiration of the upstream signing key
+ - ./keyringer test check
+
+ # Tear down the keyring in the develop branch
+ - ./keyringer test teardown -y
diff --git a/ChangeLog b/ChangeLog
index 2fd20ac..9075564 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,33 @@
-2022-08-19 - unreleased - Silvio Rhatto <rhatto@riseup.net>
+2025-10-25 - unreleased - Silvio Rhatto <rhatto@riseup.net>
+
+ Makefile: uninstall targets (thanks Spenser Truex <truex@equwal.com>).
+
+ New "search" and "ssearch" actions.
+
+2025-01-04 - 0.6.0 - Silvio Rhatto <rhatto@riseup.net>
+
+ Fix: check action now exits with non-zero status if there are expiring keys
+ in the keyring.
+
+ Fix: removed shebang from the bash completion file (#9).
+
+ Feat: GitLab CI support (#10).
+
+ Feat: init: allow for non-interactive keyring creation, useful for
+ tests (#10). This is controlled by the KEYRINGER_NON_INTERACTIVE
+ environment variable: when set to "1", keyringer won't do any
+ interactive procedure related to the keyring initialization.
+
+2022-08-19 - 0.5.9 - Silvio Rhatto <rhatto@riseup.net>
+
+ Fix: edit: check whether decryption suceeded
+
+ Fix: xclip: avoid 'Error: target STRING not available'
Moved docs to the README, favouring the GitLab repository over the site
+ New upstream repository: https://0xacab.org/rhatto/keyringer
+
2022-08-19 - 0.5.8 - Silvio Rhatto <rhatto@riseup.net>
Fix re-encryption when the secret hass NULL bytes
diff --git a/Makefile b/Makefile
index 7311363..157a6f9 100644
--- a/Makefile
+++ b/Makefile
@@ -21,6 +21,8 @@ MANDIR ?=$(PREFIX)/share/man
ARCHIVE ?= tarballs
INSTALL = /usr/bin/install
+.PHONY: clean install_lib install_bin install_doc install_man install_completion install build_man tarball release debian web web_deploy uninstall
+
clean:
find . -name *~ | xargs rm -f # clean local backups
@@ -31,23 +33,56 @@ install_lib:
$(INSTALL) -D -m 0755 -d share/keyringer/editors $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/editors
$(INSTALL) -D -m 0644 share/keyringer/editors/* $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/editors
+uninstall_lib:
+ rm -f $(DESTDIR)/$(PREFIX)/lib/$(PACKAGE)/functions
+ rm -f $(DESTDIR)/$(PREFIX)/lib/$(PACKAGE)/actions/*
+ rmdir $(DESTDIR)/$(PREFIX)/lib/$(PACKAGE)/actions 2> /dev/null || true
+ rmdir $(DESTDIR)/$(PREFIX)/lib/$(PACKAGE) 2> /dev/null || true
+ rm -f $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/editors/*
+ rmdir $(DESTDIR)/$(PREFIX)/share/$(PACKAGE)/editors 2> /dev/null || true
+ rmdir $(DESTDIR)/$(PREFIX)/share/$(PACKAGE) 2> /dev/null || true
+ rmdir -p $(DESTDIR)/$(PREFIX)/lib 2>/dev/null || true
+
install_bin:
$(INSTALL) -D -m 0755 keyringer $(DESTDIR)/$(PREFIX)/bin/keyringer
+uninstall_bin:
+ rm -f $(DESTDIR)/$(PREFIX)/bin/keyringer
+ rmdir -p $(DESTDIR)/$(PREFIX)/bin 2>/dev/null || true
+
install_doc:
$(INSTALL) -D -m 0644 index.md $(DESTDIR)/$(PREFIX)/share/doc/$(PACKAGE)/README.md
$(INSTALL) -D -m 0644 LICENSE $(DESTDIR)/$(PREFIX)/share/doc/$(PACKAGE)/LICENSE
+uninstall_doc:
+ rm -f $(DESTDIR)/$(PREFIX)/share/doc/$(PACKAGE)/LICENSE
+ rm -f $(DESTDIR)/$(PREFIX)/share/doc/$(PACKAGE)/README.md
+ rmdir $(DESTDIR)/$(PREFIX)/share/doc/$(PACKAGE) 2>/dev/null || true
+ rmdir $(DESTDIR)/$(PREFIX)/share/doc 2>/dev/null || true
+
install_man:
$(INSTALL) -D -m 0644 share/man/keyringer.1 $(DESTDIR)/$(MANDIR)/man1/keyringer.1
+uninstall_man:
+ rm -f $(DESTDIR)/$(PREFIX)/share/man/man1/keyringer.1
+ rmdir -p $(DESTDIR)/$(PREFIX)/share/man/man1 2> /dev/null || true
+
install_completion:
$(INSTALL) -D -m 0644 lib/keyringer/completions/bash/keyringer $(DESTDIR)/$(PREFIX)/share/bash-completion/completions/keyringer
$(INSTALL) -D -m 0644 lib/keyringer/completions/zsh/_keyringer $(DESTDIR)/$(PREFIX)/share/zsh/site-functions/_keyringer
+uninstall_completion:
+ rm -f $(DESTDIR)/$(PREFIX)/share/zsh/site-functions/_keyringer
+ rm -f $(DESTDIR)/$(PREFIX)/share/bash-completion/completions/keyringer
+ rmdir -p $(DESTDIR)/$(PREFIX)/share/zsh/site-functions 2> /dev/null || true
+ rmdir -p $(DESTDIR)/$(PREFIX)/share/bash-completion/completions 2> /dev/null || true
+
install: clean
@make install_lib install_bin install_doc install_man install_completion
+uninstall: uninstall_completion uninstall_man uninstall_doc uninstall_bin uninstall_lib
+ rmdir -p $(DESTDIR)/$(PREFIX)/share 2>/dev/null || true
+
build_man:
# Pipe output to sed to avoid http://lintian.debian.org/tags/hyphen-used-as-minus-sign.html
# Fixed in http://johnmacfarlane.net/pandoc/releases.html#pandoc-1.10-2013-01-19
@@ -82,7 +117,7 @@ debian:
# Fine tune debian/changelog prepared by git-dch
dch -e
git commit -a -m "Updating debian/changelog"
- gbp buildpackage --git-tag-only --git-sign-tags
+ gbp buildpackage --git-tag-only --git-sign-tags --git-ignore-new
web:
@ikiwiki --setup ikiwiki.yaml
diff --git a/development.md b/development.md
index d439742..da74b5a 100644
--- a/development.md
+++ b/development.md
@@ -41,9 +41,14 @@ Push everything:
git push --tags
+If there are repository mirrors, ensure to push changes there as well. Example:
+
+ git push all
+ git push all --tags
+
Build the package from the debian Git branch:
- gbp buildpackage
+ gbp buildpackage --git-ignore-new
Run lintian (or [add it to your pbuilder hooks](http://askubuntu.com/questions/140697/how-do-i-run-lintian-from-pbuilder-dist)):
@@ -60,7 +65,10 @@ Cleanup symlink:
Notes:
-* `gbp import-orig` takes care of running `pristine-tar commit`, of merging of the tag and orig tarball into the upstream branch, and then it merges the result into the debian branch. With the above configuration, it also runs git-dch to do the bulk of the work in `debian/changelog`.
+* `gbp import-orig` takes care of running `pristine-tar commit`, of merging of
+ the tag and orig tarball into the upstream branch, and then it merges the
+ result into the debian branch. With the above configuration, it also runs
+ git-dch to do the bulk of the work in `debian/changelog`.
* To build a development package, checkout the debian branch, merge master, run `git-dch --auto --snapshot` and build.
Packaging workflow
diff --git a/keyringer b/keyringer
index 878d5d1..512a001 100755
--- a/keyringer
+++ b/keyringer
@@ -112,10 +112,12 @@ function keyringer_init {
fi
# Edit default recipients
- echo "Now you have to edit the default recipient configuration to be able to encrypt secrets."
- echo "Press any key to proceed editing..."
- read key
- keyringer_exec recipients "$BASEDIR" edit default
+ if [ "$KEYRINGER_NON_INTERACTIVE" != "1" ]; then
+ echo "Now you have to edit the default recipient configuration to be able to encrypt secrets."
+ echo "Press any key to proceed editing..."
+ read key
+ keyringer_exec recipients "$BASEDIR" edit default
+ fi
# Stage and commit
keyringer_exec git "$BASEDIR" add .
@@ -140,7 +142,7 @@ function keyringer_dispatch {
# Config
NAME="keyringer"
-KEYRINGER_VERSION="0.5.8"
+KEYRINGER_VERSION="0.6.0"
CONFIG_VERSION="0.1"
CONFIG_BASE="$HOME/.$NAME"
CONFIG="$CONFIG_BASE/config"
diff --git a/lib/keyringer/actions/check b/lib/keyringer/actions/check
index 8722381..58adaf5 100755
--- a/lib/keyringer/actions/check
+++ b/lib/keyringer/actions/check
@@ -27,3 +27,8 @@ source "$LIB" maintenance $* || exit 1
# This should be done here:
# TODO: Check canaries' timestamps, warning by mail if configured by user preferences.
+
+# Since this is the check action, it should exit whenever there's a warning
+if [ "$KEYRINGER_HAS_EXPIRING_KEYS" == "1" ]; then
+ exit 1
+fi
diff --git a/lib/keyringer/actions/sclip b/lib/keyringer/actions/sclip
index de9c3b5..e513e8d 100755
--- a/lib/keyringer/actions/sclip
+++ b/lib/keyringer/actions/sclip
@@ -7,9 +7,16 @@
LIB="`dirname $0`/../functions"
source "$LIB" read $* || exit 1
+# Determine action
+if [ "$(basename "$0")" == "ssearch" ]; then
+ action="search"
+else
+ action="xclip"
+fi
+
# Clip password
shift
-keyringer $KEYRING xclip $*
+keyringer $KEYRING $action $*
# Se window switch combo
if [ -z "$XDOTOOL_NEXT_WINDOW" ]; then
diff --git a/lib/keyringer/actions/search b/lib/keyringer/actions/search
new file mode 120000
index 0000000..8b8c16c
--- /dev/null
+++ b/lib/keyringer/actions/search
@@ -0,0 +1 @@
+xclip \ No newline at end of file
diff --git a/lib/keyringer/actions/ssearch b/lib/keyringer/actions/ssearch
new file mode 120000
index 0000000..10534ec
--- /dev/null
+++ b/lib/keyringer/actions/ssearch
@@ -0,0 +1 @@
+sclip \ No newline at end of file
diff --git a/lib/keyringer/actions/xclip b/lib/keyringer/actions/xclip
index ff82cc1..a189545 100755
--- a/lib/keyringer/actions/xclip
+++ b/lib/keyringer/actions/xclip
@@ -57,8 +57,15 @@ if ! which xclip &> /dev/null; then
exit 1
fi
+# Find our search mode
+if [ "$(basename "$0")" == "search" ] && [ -z "$2" ]; then
+ read -p "Enter option (Ctrl-C to abort): " query
+else
+ query="$2"
+fi
+
# Get file
-keyringer_get_file "$2"
+keyringer_get_file "$query"
# Decrypt
pass="$($GPG --use-agent -d "$KEYDIR/$FILE" | head -n 1)"
diff --git a/lib/keyringer/completions/bash/keyringer b/lib/keyringer/completions/bash/keyringer
index 10b852e..3e70e4c 100644
--- a/lib/keyringer/completions/bash/keyringer
+++ b/lib/keyringer/completions/bash/keyringer
@@ -1,10 +1,9 @@
-#!bash
#
# Keyringer bash completion
#
if [[ -n ${ZSH_VERSION-} ]]; then
- autoload -U +X bashcompinit && bashcompinit
+ autoload -U +X bashcompinit && bashcompinit
fi
# Completion for git subcommand
@@ -93,7 +92,7 @@ _keyringer() {
recipients)
opts="ls edit"
;;
- ls|tree|mkdir|encrypt|encrypt-batch|pwgen|decrypt|edit|append|append-batch|del|rm|recrypt|open|clip|xclip|sclip|find|mv|cp)
+ ls|tree|mkdir|encrypt|encrypt-batch|pwgen|decrypt|edit|append|append-batch|del|rm|recrypt|open|clip|xclip|sclip|search|ssearch|find|mv|cp)
cur="`echo ${cur} | sed -e "s|^/*||"`" # avoid leading slash
opts="$(bash -c "set -f && export KEYRINGER_CHECK_RECIPIENTS=false && export KEYRINGER_CHECK_VERSION=false && keyringer $instance ls -p -d ${cur}*" 2> /dev/null)"
;;
diff --git a/lib/keyringer/completions/zsh/_keyringer b/lib/keyringer/completions/zsh/_keyringer
index 7562352..0ac6c7f 100644
--- a/lib/keyringer/completions/zsh/_keyringer
+++ b/lib/keyringer/completions/zsh/_keyringer
@@ -49,7 +49,7 @@ _keyringer() {
recipients)
compadd "$@" ls edit
;;
- ls|tree|mkdir|encrypt|encrypt-batch|pwgen|decrypt|edit|append|append-batch|del|rm|recrypt|open|clip|xclip|sclip|find|mv|cp)
+ ls|tree|mkdir|encrypt|encrypt-batch|pwgen|decrypt|edit|append|append-batch|del|rm|recrypt|open|clip|xclip|sclip|search|ssearch|find|mv|cp)
words[4]="`echo $words[4] | sed -e "s|^/*||"`" # avoid leading slash
compadd "$@" $(KEYRINGER_CHECK_RECIPIENTS=false KEYRINGER_CHECK_VERSION=false keyringer $words[2] ls -p -d $words[4]'*' 2> /dev/null)
;;
@@ -96,7 +96,7 @@ _keyringer() {
true
fi
;;
- esac
+ esac
}
_keyringer "$@"
diff --git a/lib/keyringer/functions b/lib/keyringer/functions
index 308d0ea..d9b97e3 100755
--- a/lib/keyringer/functions
+++ b/lib/keyringer/functions
@@ -467,7 +467,7 @@ function keyringer_get_file {
done
echo ""
- read -p "Enter option (Ctrl-C to abort): " option
+ read -p "Enter number, secret name or pattern (Ctrl-C to abort): " option
if [[ "$option" =~ ^[0-9]+$ ]] && [ ! -z "${candidates[$option]}" ]; then
FILE="$(keyringer_filename "$RELATIVE_PATH/${candidates[$option]}")"
@@ -766,6 +766,8 @@ function keyringer_check_expiration {
if [[ "$ahead" -gt "$expiry" ]] && [ "$BASENAME" == "check" ]; then
echo "Warning: subkey from $recipient will expire soon, on `date --date="@$expiry"`"
+
+ KEYRINGER_HAS_EXPIRING_KEYS="1"
fi
fi
done
diff --git a/share/man/keyringer.1 b/share/man/keyringer.1
index 9e60ae0..6435ac9 100644
--- a/share/man/keyringer.1
+++ b/share/man/keyringer.1
@@ -1,5 +1,19 @@
-.\" Automatically generated by Pandoc 2.9.2.1
+.\" Automatically generated by Pandoc 2.17.1.1
.\"
+.\" Define V font for inline verbatim, using C font in formats
+.\" that render this, and otherwise B font.
+.ie "\f[CB]x\f[]"x" \{\
+. ftr V B
+. ftr VI BI
+. ftr VB B
+. ftr VBI BI
+.\}
+.el \{\
+. ftr V CR
+. ftr VI CI
+. ftr VB CB
+. ftr VBI CBI
+.\}
.TH "KEYRINGER" "1" "Oct 25, 2013" "Keyringer User Manual" ""
.hy
.SH NAME
@@ -48,7 +62,7 @@ After initialization, \f[I]path\f[R] will contain a folder structure for
storing secrets and metadata (user aka recipients, groups of recipients,
etc).
.PP
-Also, an entry will be added to \f[C]$HOME/.keyringer/config\f[R]
+Also, an entry will be added to \f[V]$HOME/.keyringer/config\f[R]
allowing keyringer to find the keyring by its alias.
.RE
.TP
@@ -104,9 +118,9 @@ Run maintenance checks in a keyring.
.PP
All secret manipulation actions operate upon a \f[I]secret\f[R] which is
the pathname of an encrypted file relative to the keyring with optional
-\f[C].asc\f[R] extension.
+\f[V].asc\f[R] extension.
.PP
-If the \f[C].asc\f[R] extension is omitted, keyringer will add it at the
+If the \f[V].asc\f[R] extension is omitted, keyringer will add it at the
end of the pathname.
.PP
No spaces are allowed in the secret name.
@@ -206,24 +220,44 @@ secrets.
recrypt <\f[I]secret\f[R]>
Re-encrypts a secret by decrypting it and encrypting it again.
Useful when users are added into the recipient configuration.
+.RS
+.PP
If no \f[I]secret\f[R] is given, all secrets in the repository are
re-encrypted.
+.RE
.TP
-clip <\f[I]secret\f[R]>
+clip [\f[I]query\f[R]]
Copy the first line of a secret to the clipboard, following
password-store convention.
+.RS
+.PP
+If the query does not exactly match an existing secret, a interactive
+prompt menu is shown, helping selecting the secret.
+.RE
.TP
-xclip <\f[I]secret\f[R]>
-Alias to clip action.
+xclip [\f[I]query\f[R]]
+Alias to the clip action.
.TP
-sclip <\f[I]secret\f[R]>
-Same as clip action, but sleeps five seconds, overwrite clipboard and
+sclip [\f[I]query\f[R]]
+Invokes the clip action, sleeps five seconds, overwrite clipboard and
exit.
+.RS
+.PP
If xdotool is available, it also switches to the next window using the
alt+Tab shortcut.
This action is useful to be invoked by a custom key combo in a window
manager so it becomes easy to provide keyringer managed passphrases to
other applications such as a web browser.
+.RE
+.TP
+search [\f[I]query\f[R]]
+Similar to the clip action, but without showing the initial selection
+menu: instead, it just shows a prompt if the query does not exactly
+match an existing single.
+.TP
+ssearch [\f[I]query\f[R]]
+Like the the sclip action, but invokes the search instead of the clip
+action.
.SH CONFIGURATION ACTIONS
.TP
commands
@@ -247,7 +281,7 @@ List, edit or add \f[I]user\f[R] preferences for a given repository.
.RS
.PP
User preferences are settings which are saved in the user\[cq]s
-keyringer folder (\f[C]$HOME/.keyringer/\f[R]), and not shared with the
+keyringer folder (\f[V]$HOME/.keyringer/\f[R]), and not shared with the
other users.
.PP
Preferences are written using the \f[I]KEY=VALUE\f[R] syntax.
@@ -276,9 +310,9 @@ For instance, if a user encrypts a secret to a file in the keyring
repository\[cq]s \f[I]accounting\f[R] folder, a
\f[I]recipients-file\f[R] under \f[I]accounting\f[R] will be used.
Encrypting a secret into \f[I]accounting/bank-accounts\f[R] will result
-in a file \f[C]$KEYRING_FOLDER/keys/accounting/bank-accounts.asc\f[R]
+in a file \f[V]$KEYRING_FOLDER/keys/accounting/bank-accounts.asc\f[R]
encrypted using the public keys listed in the config
-file\f[C]$KEYRING_FOLDER/config/recipients/accounting\f[R].
+file\f[V]$KEYRING_FOLDER/config/recipients/accounting\f[R].
.PP
Each line in a recipients file has entries in the format
`john\[at]doe.com XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', where
@@ -297,11 +331,11 @@ List all existing recipients files.
Create or edit a recipients file.
.RS
.PP
-Editing happens using the editor specified by the \f[C]$EDITOR\f[R]
+Editing happens using the editor specified by the \f[V]$EDITOR\f[R]
environment variable.
.PP
The required parameter \f[I]recipients-file\f[R] is interpreted relative
-to the \f[C]$KEYRING_FOLDER/config/recipients/\f[R] folder.
+to the \f[V]$KEYRING_FOLDER/config/recipients/\f[R] folder.
.RE
.RE
.SH FILES
diff --git a/share/man/keyringer.1.md b/share/man/keyringer.1.md
index 8acd747..082999b 100644
--- a/share/man/keyringer.1.md
+++ b/share/man/keyringer.1.md
@@ -178,20 +178,34 @@ pwgen <*secret*> [*size*]
recrypt <*secret*>
: Re-encrypts a secret by decrypting it and encrypting it again. Useful when users are added
- into the recipient configuration. If no *secret* is given, all secrets in the repository
- are re-encrypted.
+ into the recipient configuration.
-clip <*secret*>
+ If no *secret* is given, all secrets in the repository are re-encrypted.
+
+clip [*query*]
: Copy the first line of a secret to the clipboard, following password-store convention.
-xclip <*secret*>
-: Alias to clip action.
+ If the query does not exactly match an existing secret, a interactive
+ prompt menu is shown, helping selecting the secret.
+
+xclip [*query*]
+: Alias to the clip action.
+
+sclip [*query*]
+: Invokes the clip action, sleeps five seconds, overwrite clipboard and exit.
+
+ If xdotool is available, it also switches to the next window using the
+ alt+Tab shortcut. This action is useful to be invoked by a custom key combo
+ in a window manager so it becomes easy to provide keyringer managed
+ passphrases to other applications such as a web browser.
+
+search [*query*]
+: Similar to the clip action, but without showing the initial selection menu:
+ instead, it just shows a prompt if the query does not exactly match an
+ existing single.
-sclip <*secret*>
-: Same as clip action, but sleeps five seconds, overwrite clipboard and exit. If xdotool
- is available, it also switches to the next window using the alt+Tab shortcut. This action
- is useful to be invoked by a custom key combo in a window manager so it becomes easy to
- provide keyringer managed passphrases to other applications such as a web browser.
+ssearch [*query*]
+: Like the the sclip action, but invokes the search instead of the clip action.
# CONFIGURATION ACTIONS