Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pass: add patch for basic wayland support #69643

Merged
merged 1 commit into from Sep 28, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
113 changes: 113 additions & 0 deletions pkgs/tools/security/pass/clip-wayland-support.patch
@@ -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

13 changes: 10 additions & 3 deletions pkgs/tools/security/pass/default.nix
Expand Up @@ -4,6 +4,7 @@

, xclip ? null, xdotool ? null, dmenu ? null
, x11Support ? !stdenv.isDarwin
, waylandSupport ? false, wl-clipboard ? null

# For backwards-compatibility
, tombPluginSupport ? false
Expand All @@ -15,6 +16,8 @@ assert x11Support -> xclip != null
&& xdotool != null
&& dmenu != null;

assert waylandSupport -> wl-clipboard != null;

let
passExtensions = import ./extensions { inherit pkgs; };

Expand All @@ -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 ];

Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions pkgs/top-level/all-packages.nix
Expand Up @@ -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 { };
Expand Down