3
0
Fork 0
forked from mirrors/nixpkgs

pass: add patch for basic wayland support

This adds an upstream patch to support `wl-clipboard` for `pass -c` and
optionally wraps `wl-clipboard`. The patch is directly checked into
nixpkgs as it had to be modified to properly apply with
`set-correct-name-for-sleep.patch`.
This commit is contained in:
Maximilian Bosch 2019-09-27 12:54:12 +02:00
parent 4e3e1d45c8
commit f72a8b02bd
No known key found for this signature in database
GPG key ID: 091DBF4D1FC46B8E
3 changed files with 127 additions and 3 deletions

View file

@ -0,0 +1,113 @@
From b0b784b1a57c0b06936e6f5d6560712b4b810cd3 Mon Sep 17 00:00:00 2001
From: Brett Cornwall <brett@i--b.com>
Date: Wed, 27 Feb 2019 00:08:33 -0700
Subject: clip: Add support for wl-clipboard
Edited to properly apply with
`set-correct-program-name-for-sleep.patch`.
---
README | 4 +++-
man/pass.1 | 5 +++++
src/password-store.sh | 26 +++++++++++++++++++++-----
3 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/README b/README
index 6b59965..1a46242 100644
--- a/README
+++ b/README
@@ -19,8 +19,10 @@ Depends on:
http://www.gnupg.org/
- git
http://www.git-scm.com/
-- xclip
+- xclip (for X11 environments)
http://sourceforge.net/projects/xclip/
+- wl-clipboard (for wlroots Wayland-based environments)
+ https://github.com/bugaevc/wl-clipboard
- tree >= 1.7.0
http://mama.indstate.edu/users/ice/tree/
- GNU getopt
diff --git a/man/pass.1 b/man/pass.1
index 01a3fbe..a555dcb 100644
--- a/man/pass.1
+++ b/man/pass.1
@@ -99,6 +99,8 @@ Decrypt and print a password named \fIpass-name\fP. If \fI--clip\fP or \fI-c\fP
is specified, do not print the password but instead copy the first (or otherwise specified)
line to the clipboard using
.BR xclip (1)
+or
+.BR wl-clipboard(1)
and then restore the clipboard after 45 (or \fIPASSWORD_STORE_CLIP_TIME\fP) seconds. If \fI--qrcode\fP
or \fI-q\fP is specified, do not print the password but instead display a QR code using
.BR qrencode (1)
@@ -132,6 +134,8 @@ in generating passwords can be changed with the \fIPASSWORD_STORE_CHARACTER_SET\
If \fI--clip\fP or \fI-c\fP is specified, do not print the password but instead copy
it to the clipboard using
.BR xclip (1)
+or
+.BR wl-clipboard(1)
and then restore the clipboard after 45 (or \fIPASSWORD_STORE_CLIP_TIME\fP) seconds. If \fI--qrcode\fP
or \fI-q\fP is specified, do not print the password but instead display a QR code using
.BR qrencode (1)
@@ -466,6 +470,7 @@ The location of the text editor used by \fBedit\fP.
.BR tr (1),
.BR git (1),
.BR xclip (1),
+.BR wl-clipboard (1),
.BR qrencode (1).
.SH AUTHOR
diff --git a/src/password-store.sh b/src/password-store.sh
index d89d455..284eabf 100755
--- a/src/password-store.sh
+++ b/src/password-store.sh
@@ -152,16 +152,32 @@ check_sneaky_paths() {
#
clip() {
+ if [[ -n $WAYLAND_DISPLAY ]]; then
+ local copy_cmd=( wl-copy )
+ local paste_cmd=( wl-paste -n )
+ if [[ $X_SELECTION == primary ]]; then
+ copy_cmd+=( --primary )
+ paste_cmd+=( --primary )
+ fi
+ local display_name="$WAYLAND_DISPLAY"
+ elif [[ -n $DISPLAY ]]; then
+ local copy_cmd=( xclip -selection "$X_SELECTION" )
+ local paste_cmd=( xclip -o -selection "$X_SELECTION" )
+ local display_name="$DISPLAY"
+ else
+ die "Error: No X11 or Wayland display detected"
+ fi
+ local sleep_argv0="password store sleep on display $display_name"
+
# This base64 business is because bash cannot store binary data in a shell
# variable. Specifically, it cannot store nulls nor (non-trivally) store
# trailing new lines.
- local sleep_argv0="password store sleep on display $DISPLAY"
pkill -P $(pgrep -f "^$sleep_argv0") 2>/dev/null && sleep 0.5
- local before="$(xclip -o -selection "$X_SELECTION" 2>/dev/null | $BASE64)"
- echo -n "$1" | xclip -selection "$X_SELECTION" || die "Error: Could not copy data to the clipboard"
+ local before="$("${paste_cmd[@]}" 2>/dev/null | $BASE64)"
+ echo -n "$1" | "${copy_cmd[@]}" || die "Error: Could not copy data to the clipboard"
(
( exec -a "$sleep_argv0" bash <(echo trap 'kill %1' TERM\; sleep "$CLIP_TIME & wait") )
- local now="$(xclip -o -selection "$X_SELECTION" | $BASE64)"
+ local now="$("${paste_cmd[@]}" | $BASE64)"
[[ $now != $(echo -n "$1" | $BASE64) ]] && before="$now"
# It might be nice to programatically check to see if klipper exists,
@@ -173,7 +189,7 @@ clip() {
# so we axe it here:
qdbus org.kde.klipper /klipper org.kde.klipper.klipper.clearClipboardHistory &>/dev/null
- echo "$before" | $BASE64 -d | xclip -selection "$X_SELECTION"
+ echo "$before" | $BASE64 -d | "${copy_cmd[@]}"
) >/dev/null 2>&1 & disown
echo "Copied $2 to clipboard. Will clear in $CLIP_TIME seconds."
}
--
cgit v1.2.1-28-gf32c

View file

@ -4,6 +4,7 @@
, xclip ? null, xdotool ? null, dmenu ? null
, x11Support ? !stdenv.isDarwin
, waylandSupport ? false, wl-clipboard ? null
# For backwards-compatibility
, tombPluginSupport ? false
@ -15,6 +16,8 @@ assert x11Support -> xclip != null
&& xdotool != null
&& dmenu != null;
assert waylandSupport -> wl-clipboard != null;
let
passExtensions = import ./extensions { inherit pkgs; };
@ -37,8 +40,11 @@ let
sha256 = "1x53k5dn3cdmvy8m4fqdld4hji5n676ksl0ql4armkmsds26av1b";
};
patches = [ ./set-correct-program-name-for-sleep.patch
] ++ stdenv.lib.optional stdenv.isDarwin ./no-darwin-getopt.patch;
patches = [ ./set-correct-program-name-for-sleep.patch ]
++ stdenv.lib.optional stdenv.isDarwin ./no-darwin-getopt.patch
# TODO (@Ma27) this patch adds support for wl-clipboard and can be removed during the next
# version bump.
++ stdenv.lib.optional waylandSupport ./clip-wayland-support.patch;
nativeBuildInputs = [ makeWrapper ];
@ -67,7 +73,8 @@ let
qrencode
procps
] ++ optional stdenv.isDarwin openssl
++ ifEnable x11Support [ dmenu xclip xdotool ]);
++ ifEnable x11Support [ dmenu xclip xdotool ]
++ optional waylandSupport wl-clipboard);
postFixup = ''
# Link extensions env

View file

@ -891,6 +891,10 @@ in
pass = callPackage ../tools/security/pass { };
pass-wayland = callPackage ../tools/security/pass {
waylandSupport = true;
};
passExtensions = recurseIntoAttrs pass.extensions;
asc-key-to-qr-code-gif = callPackage ../tools/security/asc-key-to-qr-code-gif { };