From dbadfa0810c0be346b98c02cc802c33fa43bee11 Mon Sep 17 00:00:00 2001 From: Adam Pike Date: Sat, 26 Mar 2022 15:11:04 +0100 Subject: [PATCH] refactor(1password): support CLI 2 and soft-deprecate CLI 1 (#10787) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change still supports CLI 1, but shows a deprecation warning on the first run of `opswd`. Support for CLI 1 shall be removed in the near future. Closes #10787 Co-authored-by: Marc Cornellà --- plugins/1password/README.md | 11 ++++++--- plugins/1password/_opswd | 12 ++++++++- plugins/1password/opswd | 49 ++++++++++++++++++++++++++++++++++--- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/plugins/1password/README.md b/plugins/1password/README.md index f6790ca8a..f6854da53 100644 --- a/plugins/1password/README.md +++ b/plugins/1password/README.md @@ -25,11 +25,14 @@ which service you want to get. For example, `opswd github.com` will put your GitHub password into your clipboard, and if a TOTP is available, it will be copied to the clipboard after 10 seconds. -> NOTE: you need to be logged in for `opswd` to work. See: +> NOTE: you need to be signed in for `opswd` to work. If you are using biometric unlock, +> 1Password CLI will automatically prompt you to sign in. See: > -> - [Sign in or out](https://support.1password.com/command-line/#sign-in-or-out) -> - [Session management](https://support.1password.com/command-line/#appendix-session-management) +> - [Get started with 1Password CLI 2: Sign in](https://developer.1password.com/docs/cli/get-started#sign-in) +> - [Sign in to your 1Password account manually](https://developer.1password.com/docs/cli/sign-in-manually) ## Requirements -- [1Password's command line utility](https://1password.com/downloads/command-line/). +- [1Password CLI 2](https://developer.1password.com/docs/cli/get-started#install) + + > NOTE: if you're using 1Password CLI 1, [see how to upgrade to CLI 2](https://developer.1password.com/docs/cli/upgrade). diff --git a/plugins/1password/_opswd b/plugins/1password/_opswd index b92bf8fc8..dbc094f87 100644 --- a/plugins/1password/_opswd +++ b/plugins/1password/_opswd @@ -2,8 +2,18 @@ function _opswd() { local -a services - services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}") + services=("${(@f)$(op item list --categories Login --cache 2>/dev/null | awk 'NR != 1 { print $2 }')}") [[ -z "$services" ]] || compadd -a -- services } +# TODO: 2022-03-26: Remove support for op CLI 1 +autoload -Uz is-at-least +is-at-least 2.0.0 $(op --version) || { + function _opswd() { + local -a services + services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}") + [[ -z "$services" ]] || compadd -a -- services + } +} + _opswd "$@" diff --git a/plugins/1password/opswd b/plugins/1password/opswd index 6849d42b3..57672807e 100644 --- a/plugins/1password/opswd +++ b/plugins/1password/opswd @@ -12,11 +12,11 @@ function opswd() { local service=$1 # If not logged in, print error and return - op list users > /dev/null || return + op user list > /dev/null || return local password # Copy the password to the clipboard - if ! password=$(op get item "$service" --fields password 2>/dev/null); then + if ! password=$(op item get "$service" --fields password 2>/dev/null); then echo "error: could not obtain password for $service" return 1 fi @@ -24,9 +24,9 @@ function opswd() { echo -n "$password" | clipcopy echo "✔ password for $service copied to clipboard" - # If there's a one time password, copy it to the clipboard after 5 seconds + # If there's a one time password, copy it to the clipboard after 10 seconds local totp - if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then + if totp=$(op item get --otp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then sleep 10 && echo -n "$totp" | clipcopy echo "✔ TOTP for $service copied to clipboard" fi @@ -34,4 +34,45 @@ function opswd() { (sleep 20 && clipcopy /dev/null) &! } +# TODO: 2022-03-26: Remove support for op CLI 1 +autoload -Uz is-at-least +is-at-least 2.0.0 $(op --version) || { + print -ru2 ${(%):-"%F{yellow}opswd: usage with op version $(op --version) is deprecated. Upgrade to CLI 2 and reload zsh. +For instructions, see https://developer.1password.com/docs/cli/upgrade.%f"} + + # opswd puts the password of the named service into the clipboard. If there's a + # one time password, it will be copied into the clipboard after 10 seconds. The + # clipboard is cleared after another 20 seconds. + function opswd() { + if [[ $# -lt 1 ]]; then + echo "Usage: opswd " + return 1 + fi + + local service=$1 + + # If not logged in, print error and return + op list users > /dev/null || return + + local password + # Copy the password to the clipboard + if ! password=$(op get item "$service" --fields password 2>/dev/null); then + echo "error: could not obtain password for $service" + return 1 + fi + + echo -n "$password" | clipcopy + echo "✔ password for $service copied to clipboard" + + # If there's a one time password, copy it to the clipboard after 5 seconds + local totp + if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then + sleep 10 && echo -n "$totp" | clipcopy + echo "✔ TOTP for $service copied to clipboard" + fi + + (sleep 20 && clipcopy /dev/null) &! + } +} + opswd "$@"