about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2019-09-27 12:54:12 +0200
committerMaximilian Bosch <maximilian@mbosch.me>2019-09-27 13:00:01 +0200
commitf72a8b02bdada70722dcfaf806a55d2b6a7405a5 (patch)
tree797821dab2ec7b27c2340af3e2a573229b01802f
parent4e3e1d45c8bce00ffb4f39b5a9a2a3c940d8bf2e (diff)
downloadnixlib-f72a8b02bdada70722dcfaf806a55d2b6a7405a5.tar
nixlib-f72a8b02bdada70722dcfaf806a55d2b6a7405a5.tar.gz
nixlib-f72a8b02bdada70722dcfaf806a55d2b6a7405a5.tar.bz2
nixlib-f72a8b02bdada70722dcfaf806a55d2b6a7405a5.tar.lz
nixlib-f72a8b02bdada70722dcfaf806a55d2b6a7405a5.tar.xz
nixlib-f72a8b02bdada70722dcfaf806a55d2b6a7405a5.tar.zst
nixlib-f72a8b02bdada70722dcfaf806a55d2b6a7405a5.zip
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`.
-rw-r--r--pkgs/tools/security/pass/clip-wayland-support.patch113
-rw-r--r--pkgs/tools/security/pass/default.nix13
-rw-r--r--pkgs/top-level/all-packages.nix4
3 files changed, 127 insertions, 3 deletions
diff --git a/pkgs/tools/security/pass/clip-wayland-support.patch b/pkgs/tools/security/pass/clip-wayland-support.patch
new file mode 100644
index 000000000000..7b8d2eb010d2
--- /dev/null
+++ b/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
+
diff --git a/pkgs/tools/security/pass/default.nix b/pkgs/tools/security/pass/default.nix
index aeb838c05765..5d0e94bc803e 100644
--- a/pkgs/tools/security/pass/default.nix
+++ b/pkgs/tools/security/pass/default.nix
@@ -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
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index f32a817376a1..ee3498db651b 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -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 { };