From: Jeff King <peff@peff.net>
To: Erik Faye-Lund <kusmabite@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 0/6] echo usernames as they are typed
Date: Sun, 27 Nov 2011 22:53:21 -0500 [thread overview]
Message-ID: <20111128035321.GA15640@sigill.intra.peff.net> (raw)
In-Reply-To: <CABPQNSb09kxjvdvz2P-WqU2VtMspaaA8ujTNLJ4+MuCrV=2zsw@mail.gmail.com>
On Sun, Nov 27, 2011 at 10:17:26AM +0100, Erik Faye-Lund wrote:
> > And here's something I've been meaning to do on top: actually echo
> > characters at the username prompt. We can't do this portably, but we can
> > at least stub out a compatibility layer and let each system do something
> > sensible.
>
> Interesting, I've been working on something pretty similar: getting
> rid of getpass usage all together:
>
> https://github.com/kusma/git/tree/work/askpass
>
> My reason to write a getpass replacement was to avoid capping input to
> PASS_MAX, which can be as low as 8 characters (and AFAIK is just that
> on Solaris)...
Yeah, if there are really bad getpass implementations, we would want to
work around them. If we are going to do so, it might make sense to
combine the effort with my getpass_echo wrapper, as they are really the
same function, modulo tweaking the echo settings.
It would also be nice to make getpass a little more predictable. If
/dev/tty can't be opened, glibc's getpass will fall back to writing the
prompt to stderr and reading the password from stdin. But we definitely
don't want to do that in git-remote-curl, where stdin is already talking
a special protocol with the parent fetch process.
So I think it might be best to just write our own getpass. However,
your implementation looks wrong to me:
> diff --git a/password.c b/password.c
> new file mode 100644
> index 0000000..727ed84
> --- /dev/null
> +++ b/password.c
> @@ -0,0 +1,94 @@
> +#include "cache.h"
> +#include "git-compat-util.h"
> +#include "strbuf.h"
> +#include "run-command.h"
> +
> +#ifndef WIN32
> +
> +static void ask_password(struct strbuf *sb, const char *prompt)
> +{
> + struct termios attr;
> + tcflag_t c_lflag;
> +
> + if (tcgetattr(1, &attr) < 0)
> + die("tcgetattr failed!");
> + c_lflag = attr.c_lflag;
This is getting the terminal attributes for stdout. But in many
cases, stdout will not be connected to the terminal (in particular,
remote-curl, as I mentioned above, will have its stdio connected to the
parent fetch process). Stderr is a better guess, as you do here:
> + fputs(prompt, stderr);
but even that is not foolproof. With getpass(), this should work:
git clone ... 2>errors
with the prompt going to the terminal. But it doesn't with your patch.
You really want to open "/dev/tty" on most Unix systems (which is what
getpass() does). I have no idea what would be appropriate on Windows.
> + for (;;) {
> + int c = getchar();
> + if (c == EOF || c == '\n')
> + break;
> + strbuf_addch(sb, c);
> + }
And this is even worse. You're reading from stdin, which will get
whatever cruft is in the pipe coming from the parent process (or may
even cause a hang, as the parent is probably blocking waiting to read
from the child helper).
-Peff
next prev parent reply other threads:[~2011-11-28 3:53 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-24 10:58 [PATCH 0/13] credential helpers, take two Jeff King
2011-11-24 10:58 ` [PATCH 01/13] test-lib: add test_config_global variant Jeff King
2011-11-24 10:59 ` [PATCH 02/13] t5550: fix typo Jeff King
2011-11-24 11:01 ` [PATCH 03/13] introduce credentials API Jeff King
2011-11-28 21:46 ` Junio C Hamano
2011-11-29 5:04 ` Jeff King
2011-11-29 17:34 ` Junio C Hamano
2011-11-29 21:14 ` Jeff King
2011-11-24 11:01 ` [PATCH 04/13] credential: add function for parsing url components Jeff King
2011-11-24 11:01 ` [PATCH 05/13] http: use credential API to get passwords Jeff King
2011-11-24 11:02 ` [PATCH 06/13] credential: apply helper config Jeff King
2011-11-24 11:02 ` [PATCH 07/13] credential: add credential.*.username Jeff King
2011-11-24 11:03 ` [PATCH 08/13] credential: make relevance of http path configurable Jeff King
2011-11-24 11:05 ` [PATCH 09/13] docs: end-user documentation for the credential subsystem Jeff King
2011-11-24 11:07 ` [PATCH 10/13] credentials: add "cache" helper Jeff King
2011-11-24 14:36 ` Eric Sunshine
2011-11-29 0:42 ` Junio C Hamano
2011-11-29 5:04 ` Jeff King
2011-11-24 11:07 ` [PATCH 11/13] strbuf: add strbuf_add*_urlencode Jeff King
2011-11-29 18:19 ` Junio C Hamano
2011-11-29 21:19 ` Jeff King
2011-11-29 23:26 ` René Scharfe
2011-11-30 3:20 ` Jeff King
2011-11-30 5:40 ` Junio C Hamano
2011-11-30 5:41 ` René Scharfe
2011-11-24 11:07 ` [PATCH 12/13] credentials: add "store" helper Jeff King
2011-11-24 14:29 ` Eric Sunshine
2011-11-24 20:09 ` Jeff King
2011-11-29 18:19 ` Junio C Hamano
2011-11-29 21:38 ` Jeff King
2011-11-24 11:09 ` [PATCH 13/13] t: add test harness for external credential helpers Jeff King
2011-11-24 11:45 ` [PATCH 0/13] credential helpers, take two Erik Faye-Lund
2011-11-24 11:53 ` Jeff King
2011-11-24 12:08 ` Erik Faye-Lund
2011-11-27 8:27 ` [PATCH 0/6] echo usernames as they are typed Jeff King
2011-11-27 8:28 ` [PATCH 1/6] move git_getpass to its own source file Jeff King
2011-11-27 8:29 ` [PATCH 2/6] refactor git_getpass into generic prompt function Jeff King
2011-11-27 8:30 ` [PATCH 3/6] stub out getpass_echo function Jeff King
2011-11-27 8:30 ` [PATCH 4/6] prompt: add PROMPT_ECHO flag Jeff King
2011-11-27 8:31 ` [PATCH 5/6] credential: use git_prompt instead of git_getpass Jeff King
2011-11-27 8:31 ` [PATCH 6/6] compat/getpass: add a /dev/tty implementation Jeff King
2011-11-27 8:56 ` [PATCH 0/6] echo usernames as they are typed Junio C Hamano
2011-11-27 9:17 ` Erik Faye-Lund
2011-11-28 3:53 ` Jeff King [this message]
2011-11-28 9:36 ` Erik Faye-Lund
2011-11-28 11:31 ` Jeff King
2011-11-28 11:49 ` Frans Klaver
2011-11-28 12:59 ` Erik Faye-Lund
2011-11-28 18:59 ` Jeff King
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=20111128035321.GA15640@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=kusmabite@gmail.com \
/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.
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).