zsh-users
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-users <zsh-users@zsh.org>
Subject: Re: Commands with passwords as options
Date: Tue, 01 Feb 2011 20:34:49 -0800	[thread overview]
Message-ID: <110201203449.ZM18939@torch.brasslantern.com> (raw)
In-Reply-To: <AANLkTi=vmDkSaef2r-gaMK=6en=EYyCsWbVppRsPwF5r@mail.gmail.com>

On Feb 1, 10:15pm, Julien Nicoulaud wrote:
}
} Some commands take passwords as option values, which is not very
} secure... I was wondering if there is some way to handle that, for
} example through a custom completer.

I don't know about a custom completer -- it's pretty difficult to
have the completion system go off and do something interactive in
the middle, at least not without the display ending up hopelessly
muddled afterward -- but it should be possible to implement it as
a widget.

send-invisible() {
  emulate -L zsh
  # Shamelessly cribbed from read-from-minibuffer.

  # send-invisible reads a line from the terminal, displaying an
  # asterisk for each character typed.  It stores the line in the
  # global variable INVISIBLE, and when finished reading, inserts
  # the string ${INVISIBLE} into the original command buffer.

  # If one argument is given, it is the prompt.  The default is
  # "Non-echoed text: "

  # If two or three arguments are given, they form the prefix and
  # suffix of the inserted INVISIBLE.  Defaults are '${' and '}'
  # but these can be replaced, for example with '"${' and '}"' to
  # enclose the whole word in double quotes, or '${(z)' and '}' to
  # split the value of $INVISIBLE like the shell parser.

  # Hide the value of INVISIBLE in any output of set and typeset
  typeset -g -H INVISIBLE=

  local pretext="$PREDISPLAY$LBUFFER$RBUFFER$POSTDISPLAY"$'\n'

  # Can't directly make these locals because send-invisible is
  # called as a widget, so these special variables are already
  # local at the current level and wouldn't get restored
  local save_lbuffer=$LBUFFER
  local save_rbuffer=$RBUFFER
  local save_predisplay=$PREDISPLAY
  local save_postdisplay=$POSTDISPLAY
  local -a save_region_highlight
  save_region_highlight=("${region_highlight[@]}")

  {
    local lb rb opn=${2:-'${'} cls=${3:-'}'}
    LBUFFER=
    RBUFFER=
    PREDISPLAY="$pretext${1:-Non-echoed text: }"
    POSTDISPLAY=
    region_highlight=("P${(m)#pretext} ${(m)#PREDISPLAY} bold")

    while zle -R && zle .read-command
    do
      # There are probably more commands that should go into
      # the first clause here to harmlessly beep, because ...
      case $REPLY in
      (send-invisible|run-help|undefined-key|where-is|which-command)
        zle .beep;;
      (push-*|send-break) INVISIBLE=;&
      (accept-*) break;;
      (*)
        LBUFFER=$lb
        RBUFFER=$rb
        zle $REPLY	# ... this could expose something
        lb=$LBUFFER
        rb=$RBUFFER
        INVISIBLE=$BUFFER
	LBUFFER=${(l:$#LBUFFER::*:):-}
	RBUFFER=${(l:$#RBUFFER::*:):-}
        ;;
      esac
    done
  } always {
    LBUFFER=$save_lbuffer
    RBUFFER=$save_rbuffer
    PREDISPLAY=$save_predisplay
    POSTDISPLAY=$save_postdisplay
    region_highlight=("${save_region_highlight[@]}")
    zle -R

    # Now that the highlight has been restored with all the old
    # text and cursor positioning, insert the new text.
    LBUFFER+=${INVISIBLE:+${opn}INVISIBLE${cls}}
  }
}
zle -N send-invisible

} Ideally, I here is how it should behave:
}  - When reaching an option which expected value is a password, prompt for it
} and read it from stdin

If you can figure out how to auto-invoke the above in these circumstances,
go for it.  Possibly something in zle-line-init that examines the word
at the end of $LBUFFER.

}  - Do not display it in the buffer (just replace it with "XXXX" for example)
}  - When accepting the buffer, replace the displayed buffer with the real one
}  - Save the displayed buffer in the history rather than the real one

I think the above covers all of this.


  parent reply	other threads:[~2011-02-02  4:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-01 21:15 Julien Nicoulaud
2011-02-01 21:28 ` Mikael Magnusson
2011-02-01 21:59   ` Julien Nicoulaud
2011-02-01 22:40     ` Benjamin R. Haskell
2011-02-01 22:57       ` Mikael Magnusson
2011-02-02  4:34 ` Bart Schaefer [this message]
2011-02-02 21:27   ` Julien Nicoulaud
2011-02-03  2:49     ` Bart Schaefer
2011-02-14 20:16 ` PJ Weisberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=110201203449.ZM18939@torch.brasslantern.com \
    --to=schaefer@brasslantern.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).