diff --git a/tailscalectl/TailscaleWidget.qml b/tailscalectl/TailscaleWidget.qml index 705070e..cb3fc82 100644 --- a/tailscalectl/TailscaleWidget.qml +++ b/tailscalectl/TailscaleWidget.qml @@ -62,7 +62,7 @@ PluginComponent { Process { id: detectClipboard - command: ["sh", "-c", "which dms >/dev/null 2>&1 && echo 'dms cl copy' || which wl-copy >/dev/null 2>&1 && echo 'wl-copy' || which clipmanctl >/dev/null 2>&1 && echo 'clipmanctl copy' || echo none"] + command: ["sh", "-c", "which dms >/dev/null 2>&1 && echo 'dms cl copy' || which wl-copy >/dev/null 2>&1 && echo 'wl-copy' || which clipmanctl >/dev/null 2>&1 && echo 'clipmanctl copy' || which xclip >/dev/null 2>&1 && echo 'xclip -selection clipboard' || which xsel >/dev/null 2>&1 && echo 'xsel --clipboard --input' || echo none"] stdout: StdioCollector { onStreamFinished: { diff --git a/tailscalectl/lib.js b/tailscalectl/lib.js index 6260d5b..dff4060 100644 --- a/tailscalectl/lib.js +++ b/tailscalectl/lib.js @@ -26,7 +26,7 @@ function findActiveExitNode(peerMap) { return "" } -var safeClipboardCmds = ["dms cl copy", "wl-copy", "clipmanctl copy", "none"] +var safeClipboardCmds = ["dms cl copy", "wl-copy", "clipmanctl copy", "xclip -selection clipboard", "xsel --clipboard --input", "none"] function validateClipboardCmd(cmd) { return typeof cmd === "string" && safeClipboardCmds.includes(cmd) diff --git a/test/lib.test.js b/test/lib.test.js index c43d596..e433e96 100644 --- a/test/lib.test.js +++ b/test/lib.test.js @@ -81,6 +81,8 @@ test("validateClipboardCmd accepts whitelisted values", () => { assert.strictEqual(validateClipboardCmd("dms cl copy"), true) assert.strictEqual(validateClipboardCmd("wl-copy"), true) assert.strictEqual(validateClipboardCmd("clipmanctl copy"), true) + assert.strictEqual(validateClipboardCmd("xclip -selection clipboard"), true) + assert.strictEqual(validateClipboardCmd("xsel --clipboard --input"), true) assert.strictEqual(validateClipboardCmd("none"), true) }) @@ -140,7 +142,7 @@ test("parseClipboardDetection falls back to empty output", () => { }) test("parseClipboardDetection falls back to none for unexpected strings", () => { - assert.strictEqual(parseClipboardDetection("xclip -selection clipboard"), "none") + assert.strictEqual(parseClipboardDetection("pbpaste"), "none") assert.strictEqual(parseClipboardDetection("custom-tool"), "none") })