Thread: psql: default base and password reading

psql: default base and password reading

From
Adam Osuchowski
Date:
Hello,

in attachment I enclose patch on psql which fix two things:

1. If no database was given, template1 is assumed.
2. Password is reading from terminal (/dev/tty) rather than from stdin. It
was usable when we want to pipe sql script on psql and have set password at
the same time. It may be turned off, by pass -i option to psql. Then, psql
behave normally, like it is currently.

Sorry about increasing traffic, if it was already discussed, or it is solved
in other way.

--
##  Adam Osuchowski   adwol@polsl.gliwice.pl, adwol@silesia.linux.org.pl
##  Silesian University of Technology, Computer Centre   Gliwice, Poland

Attachment

Re: psql: default base and password reading

From
Tom Lane
Date:
Adam Osuchowski <adwol@polsl.gliwice.pl> writes:
> in attachment I enclose patch on psql which fix two things:
> 1. If no database was given, template1 is assumed.

That is a very large step backwards from the current behavior (default
to dbname = username).  The last thing we want is to encourage people
to use template1 for routine operations.

> 2. Password is reading from terminal (/dev/tty) rather than from
> stdin.

Hmm, that might be a good idea.  Comments anyone?

            regards, tom lane

Re: psql: default base and password reading

From
Bradley McLean
Date:
Actually, I see problems with both of these:

IIRC, template1 is used as the base whenever you create a new database.
Having psql connect to it by default greatly increases the likelyhood
of unintended modification of template1, which then gets propogated to
every other database subsequently created.

Personally, I'd be happier if psql attempted to create a database in
the name of the logged in user rather than ever give access to template1
to someone who didn't ask for it.  However, I think requiring the database
name is a good idea in general.

The password reading patch may be useful, but I suggest that you
reverse the meaning of the option, so that you do not change the
current behavior.  This would be a normal practice for backward
compatibility.

-Brad

* Adam Osuchowski (adwol@polsl.gliwice.pl) [011012 01:59]:
> Hello,
>
> in attachment I enclose patch on psql which fix two things:
>
> 1. If no database was given, template1 is assumed.
> 2. Password is reading from terminal (/dev/tty) rather than from stdin. It
> was usable when we want to pipe sql script on psql and have set password at
> the same time. It may be turned off, by pass -i option to psql. Then, psql
> behave normally, like it is currently.
>
> Sorry about increasing traffic, if it was already discussed, or it is solved
> in other way.
>
> --
> ##  Adam Osuchowski   adwol@polsl.gliwice.pl, adwol@silesia.linux.org.pl
> ##  Silesian University of Technology, Computer Centre   Gliwice, Poland

> diff -ruN psql/common.c psql_patched/common.c
> --- psql/common.c    Sun Apr 15 02:43:37 2001
> +++ psql_patched/common.c    Sun Oct  7 14:58:22 2001
> @@ -176,6 +176,7 @@
>  {
>      int            length;
>      char       *destination;
> +    static FILE *term = NULL;
>
>  #ifdef HAVE_TERMIOS_H
>      struct termios t_orig,
> @@ -190,24 +191,28 @@
>          fputs(prompt, stderr);
>
>      prompt_state = true;
> +    if (!term && pset.stdinPassword == false)
> +        term = fopen("/dev/tty", "r");
> +    if (term == NULL || pset.stdinPassword == true)
> +        term = stdin;
>
>  #ifdef HAVE_TERMIOS_H
>      if (!echo)
>      {
> -        tcgetattr(0, &t);
> +        tcgetattr(fileno(term), &t);
>          t_orig = t;
>          t.c_lflag &= ~ECHO;
> -        tcsetattr(0, TCSADRAIN, &t);
> +        tcsetattr(fileno(term), TCSADRAIN, &t);
>      }
>  #endif
>
> -    if (fgets(destination, maxlen, stdin) == NULL)
> +    if (fgets(destination, maxlen, term) == NULL)
>          destination[0] = '\0';
>
>  #ifdef HAVE_TERMIOS_H
>      if (!echo)
>      {
> -        tcsetattr(0, TCSADRAIN, &t_orig);
> +        tcsetattr(fileno(term), TCSADRAIN, &t_orig);
>          fputs("\n", stderr);
>      }
>  #endif
> @@ -223,7 +228,7 @@
>
>          do
>          {
> -            if (fgets(buf, sizeof(buf), stdin) == NULL)
> +            if (fgets(buf, sizeof(buf), term) == NULL)
>                  break;
>              buflen = strlen(buf);
>          } while (buflen > 0 && buf[buflen - 1] != '\n');
> diff -ruN psql/help.c psql_patched/help.c
> --- psql/help.c    Thu Mar 22 05:00:20 2001
> +++ psql_patched/help.c    Sun Oct  7 14:57:32 2001
> @@ -103,6 +103,7 @@
>      puts(")");
>
>      puts("  -H              HTML table output mode (-P format=html)");
> +    puts("  -i              Read password from stdin rather than terminal");
>      puts("  -l              List available databases, then exit");
>      puts("  -n              Disable readline");
>      puts("  -o <filename>   Send query output to filename (or |pipe)");
> diff -ruN psql/settings.h psql_patched/settings.h
> --- psql/settings.h    Wed Apr 12 19:16:23 2000
> +++ psql_patched/settings.h    Sun Oct  7 14:49:16 2001
> @@ -46,6 +46,7 @@
>
>      char       *progname;        /* in case you renamed psql */
>      char       *inputfile;        /* for error reporting */
> +    bool       stdinPassword;
>      unsigned    lineno;            /* also for error reporting */
>
>      bool        issuper;        /* is the current user a superuser? (used
> diff -ruN psql/startup.c psql_patched/startup.c
> --- psql/startup.c    Fri Mar 23 01:36:38 2001
> +++ psql_patched/startup.c    Sun Oct  7 14:55:43 2001
> @@ -331,6 +331,7 @@
>          {"field-separator", required_argument, NULL, 'F'},
>          {"host", required_argument, NULL, 'h'},
>          {"html", no_argument, NULL, 'H'},
> +        {"stdin", no_argument, NULL, 'i'},
>          {"list", no_argument, NULL, 'l'},
>          {"no-readline", no_argument, NULL, 'n'},
>          {"output", required_argument, NULL, 'o'},
> @@ -364,14 +365,14 @@
>      memset(options, 0, sizeof *options);
>
>  #ifdef HAVE_GETOPT_LONG
> -    while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:Hlno:p:P:qR:sStT:uU:v:VWxX?", long_options, &optindex)) !=
-1)
> +    while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:Hilno:p:P:qR:sStT:uU:v:VWxX?", long_options, &optindex)) !=
-1)
>  #else                            /* not HAVE_GETOPT_LONG */
>
>      /*
>       * Be sure to leave the '-' in here, so we can catch accidental long
>       * options.
>       */
> -    while ((c = getopt(argc, argv, "aAc:d:eEf:F:h:Hlno:p:P:qR:sStT:uU:v:VWxX?-")) != -1)
> +    while ((c = getopt(argc, argv, "aAc:d:eEf:F:h:Hilno:p:P:qR:sStT:uU:v:VWxX?-")) != -1)
>  #endif     /* not HAVE_GETOPT_LONG */
>      {
>          switch (c)
> @@ -414,6 +415,9 @@
>              case 'H':
>                  pset.popt.topt.format = PRINT_HTML;
>                  break;
> +            case 'i':
> +                pset.stdinPassword = true;
> +                break;
>              case 'l':
>                  options->action = ACT_LIST_DB;
>                  break;
> @@ -571,6 +575,8 @@
>      if (used_old_u_option && !QUIET())
>          fprintf(stderr, "%s: Warning: The -u option is deprecated. Use -U.\n", pset.progname);
>
> +    if (!options->dbname)
> +        options->dbname = "template1";
>  }
>
>

>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly


Re: psql: default base and password reading

From
Thomas Lockhart
Date:
Adam Osuchowski wrote:
>
> Hello,
>
> in attachment I enclose patch on psql which fix two things:
>
> 1. If no database was given, template1 is assumed.

Does this change the current behavior of assuming a database name which
is the same as the user's account name? I'm not sure why the new
behavior is better.

> 2. Password is reading from terminal (/dev/tty) rather than from stdin. It
> was usable when we want to pipe sql script on psql and have set password at
> the same time. It may be turned off, by pass -i option to psql. Then, psql
> behave normally, like it is currently.

Interesting. Is this technique portable to other platforms (just asking;
I'm not sure myself)?

                     - Thomas

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> The password reading patch may be useful, but I suggest that you
> reverse the meaning of the option, so that you do not change the
> current behavior.  This would be a normal practice for backward
> compatibility.

I like the /dev/tty fix.  I assumed we always read passwords from
/dev/tty and not stdin.  I know of no other software that even allows
passwords from stdin.  You usually have to use 'expect' for that very
purpose.  I would not even supply an option to read it from stdin.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> > The password reading patch may be useful, but I suggest that you
> > reverse the meaning of the option, so that you do not change the
> > current behavior.  This would be a normal practice for backward
> > compatibility.
>
> I like the /dev/tty fix.  I assumed we always read passwords from
> /dev/tty and not stdin.  I know of no other software that even allows
> passwords from stdin.  You usually have to use 'expect' for that very
> purpose.  I would not even supply an option to read it from stdin.

Attached is an updated version of the patch.  It does not have the
'template1' default because many people prefer our current behavior.

The patch uses /dev/tty if it can open it, and stdin if it can't.  It
does not have a psql flag to force stdin because there is little reason
to read a password from stdin in any reasonable usage.

In fact, I wonder if we should just fail if we need to prompt for a
password and can't open /dev/tty.  The function is simple_prompt() and
if we can't open /dev/tty, maybe we should just assume the user typed
nothing.

Comments?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
diff -ruN psql/common.c psql_patched/common.c
--- psql/common.c    Sun Apr 15 02:43:37 2001
+++ psql_patched/common.c    Sun Oct  7 14:58:22 2001
@@ -176,6 +176,7 @@
 {
     int            length;
     char       *destination;
+    static FILE *term = NULL;

 #ifdef HAVE_TERMIOS_H
     struct termios t_orig,
@@ -190,24 +191,28 @@
         fputs(prompt, stderr);

     prompt_state = true;
+    if (!term)
+        term = fopen("/dev/tty", "r");
+    if (term == NULL)
+        term = stdin;

 #ifdef HAVE_TERMIOS_H
     if (!echo)
     {
-        tcgetattr(0, &t);
+        tcgetattr(fileno(term), &t);
         t_orig = t;
         t.c_lflag &= ~ECHO;
-        tcsetattr(0, TCSADRAIN, &t);
+        tcsetattr(fileno(term), TCSADRAIN, &t);
     }
 #endif

-    if (fgets(destination, maxlen, stdin) == NULL)
+    if (fgets(destination, maxlen, term) == NULL)
         destination[0] = '\0';

 #ifdef HAVE_TERMIOS_H
     if (!echo)
     {
-        tcsetattr(0, TCSADRAIN, &t_orig);
+        tcsetattr(fileno(term), TCSADRAIN, &t_orig);
         fputs("\n", stderr);
     }
 #endif
@@ -223,7 +228,7 @@

         do
         {
-            if (fgets(buf, sizeof(buf), stdin) == NULL)
+            if (fgets(buf, sizeof(buf), term) == NULL)
                 break;
             buflen = strlen(buf);
         } while (buflen > 0 && buf[buflen - 1] != '\n');

Re: psql: default base and password reading

From
Tom Lane
Date:
>> In fact, I wonder if we should just fail if we need to prompt for a
>> password and can't open /dev/tty.  The function is simple_prompt() and
>> if we can't open /dev/tty, maybe we should just assume the user typed
>> nothing.

> Would be okay with me ...

On second thought --- are we creating any portability problems if we
assume /dev/tty exists?  In particular, what about the Windows port
of psql?  Will it still work?

            regards, tom lane

Re: psql: default base and password reading

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> The patch uses /dev/tty if it can open it, and stdin if it can't.  It
> does not have a psql flag to force stdin because there is little reason
> to read a password from stdin in any reasonable usage.

If we are reading the password from /dev/tty not stdin, then IMHO the
prompt for the password should be sent to /dev/tty not stderr.

> In fact, I wonder if we should just fail if we need to prompt for a
> password and can't open /dev/tty.  The function is simple_prompt() and
> if we can't open /dev/tty, maybe we should just assume the user typed
> nothing.

Would be okay with me ...

            regards, tom lane

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> >> In fact, I wonder if we should just fail if we need to prompt for a
> >> password and can't open /dev/tty.  The function is simple_prompt() and
> >> if we can't open /dev/tty, maybe we should just assume the user typed
> >> nothing.
>
> > Would be okay with me ...
>
> On second thought --- are we creating any portability problems if we
> assume /dev/tty exists?  In particular, what about the Windows port
> of psql?  Will it still work?

I am sure cygwin takes care of this.  Certainly is would have to handle
it to allow Unix compatibility.  If someone reports a problem, we can
#ifdef around it.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> >> On second thought --- are we creating any portability problems if we
> >> assume /dev/tty exists?  In particular, what about the Windows port
> >> of psql?  Will it still work?
>
> > I am sure cygwin takes care of this.
>
> Please recall that we have a *native* port of psql ... cygwin doesn't
> help.

Ewe!

The only other mention of /dev/tty I see is in psql/command.c:

    /* \s save history in a file or show it on the screen */
    else if (strcmp(cmd, "s") == 0)
    {
        char       *fname = scan_option(&string, OT_NORMAL, NULL, true);

        success = saveHistory(fname ? fname : "/dev/tty");

        if (success && !quiet && fname)
            printf(gettext("Wrote history to %s.\n"), fname);
        free(fname);
    }

I can easily #ifdef around the /dev/tty open.  Can someone comment on
what opening /dev/tty does on a Win32 machines without cygwin?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: psql: default base and password reading

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
>> On second thought --- are we creating any portability problems if we
>> assume /dev/tty exists?  In particular, what about the Windows port
>> of psql?  Will it still work?

> I am sure cygwin takes care of this.

Please recall that we have a *native* port of psql ... cygwin doesn't
help.

            regards, tom lane

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> >> On second thought --- are we creating any portability problems if we
> >> assume /dev/tty exists?  In particular, what about the Windows port
> >> of psql?  Will it still work?
>
> > I am sure cygwin takes care of this.
>
> Please recall that we have a *native* port of psql ... cygwin doesn't
> help.

OK, I read up on how BSD/OS does this and found getpass():

     The getpass() function displays a prompt to, and reads in a password
     from, /dev/tty. If this file is not accessible, getpass displays the
     prompt on the standard error output and reads from the standard
     input.

So even it tries for /dev/tty and falls back to stdin/stderr.  The
attached patch does this.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
Index: src/bin/pg_dump/pg_backup_db.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_db.c,v
retrieving revision 1.26
diff -c -r1.26 pg_backup_db.c
*** src/bin/pg_dump/pg_backup_db.c    2001/09/21 21:58:30    1.26
--- src/bin/pg_dump/pg_backup_db.c    2001/10/13 17:10:07
***************
*** 49,55 ****
   * simple_prompt
   *
   * Generalized function especially intended for reading in usernames and
!  * password interactively. Reads from stdin.
   *
   * prompt:        The prompt to print
   * maxlen:        How many characters to accept
--- 49,55 ----
   * simple_prompt
   *
   * Generalized function especially intended for reading in usernames and
!  * password interactively. Reads from /dev/tty or stdin/stderr.
   *
   * prompt:        The prompt to print
   * maxlen:        How many characters to accept
***************
*** 57,101 ****
   *
   * Returns a malloc()'ed string with the input (w/o trailing newline).
   */
  char *
  simple_prompt(const char *prompt, int maxlen, bool echo)
  {
      int            length;
      char       *destination;

  #ifdef HAVE_TERMIOS_H
      struct termios t_orig,
                  t;
-
  #endif

      destination = (char *) malloc(maxlen + 2);
      if (!destination)
          return NULL;
      if (prompt)
!         fputs(gettext(prompt), stderr);

  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcgetattr(0, &t);
          t_orig = t;
          t.c_lflag &= ~ECHO;
!         tcsetattr(0, TCSADRAIN, &t);
      }
  #endif

!     if (fgets(destination, maxlen, stdin) == NULL)
          destination[0] = '\0';

  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcsetattr(0, TCSADRAIN, &t_orig);
!         fputs("\n", stderr);
      }
  #endif

      length = strlen(destination);
      if (length > 0 && destination[length - 1] != '\n')
      {
--- 57,121 ----
   *
   * Returns a malloc()'ed string with the input (w/o trailing newline).
   */
+ static bool prompt_state;
+
  char *
  simple_prompt(const char *prompt, int maxlen, bool echo)
  {
      int            length;
      char       *destination;
+     static FILE *termin = NULL, *termout;

  #ifdef HAVE_TERMIOS_H
      struct termios t_orig,
                  t;
  #endif

      destination = (char *) malloc(maxlen + 2);
      if (!destination)
          return NULL;
+
+     prompt_state = true;
+
+     /* initialize the streams */
+     if (!termin)
+     {
+         if ((termin = termout = fopen("/dev/tty", "w+")) == NULL)
+         {
+             termin = stdin;
+             termout = stderr;
+         }
+     }
+
      if (prompt)
!     {
!         fputs(gettext(prompt), termout);
!         rewind(termout); /* does flush too */
!     }

  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcgetattr(fileno(termin), &t);
          t_orig = t;
          t.c_lflag &= ~ECHO;
!         tcsetattr(fileno(termin), TCSADRAIN, &t);
      }
  #endif

!     if (fgets(destination, maxlen, termin) == NULL)
          destination[0] = '\0';

  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
!         fputs("\n", termout);
      }
  #endif

+     prompt_state = false;
+
      length = strlen(destination);
      if (length > 0 && destination[length - 1] != '\n')
      {
***************
*** 105,121 ****

          do
          {
!             if (fgets(buf, sizeof(buf), stdin) == NULL)
                  break;
              buflen = strlen(buf);
          } while (buflen > 0 && buf[buflen - 1] != '\n');
      }
      if (length > 0 && destination[length - 1] == '\n')
          /* remove trailing newline */
          destination[length - 1] = '\0';

      return destination;
  }


  static int
--- 125,143 ----

          do
          {
!             if (fgets(buf, sizeof(buf), termin) == NULL)
                  break;
              buflen = strlen(buf);
          } while (buflen > 0 && buf[buflen - 1] != '\n');
      }
+
      if (length > 0 && destination[length - 1] == '\n')
          /* remove trailing newline */
          destination[length - 1] = '\0';

      return destination;
  }
+


  static int
Index: src/bin/psql/common.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/common.c,v
retrieving revision 1.34
diff -c -r1.34 common.c
*** src/bin/psql/common.c    2001/06/08 23:53:48    1.34
--- src/bin/psql/common.c    2001/10/13 17:10:11
***************
*** 161,167 ****
   * simple_prompt
   *
   * Generalized function especially intended for reading in usernames and
!  * password interactively. Reads from stdin.
   *
   * prompt:        The prompt to print
   * maxlen:        How many characters to accept
--- 161,167 ----
   * simple_prompt
   *
   * Generalized function especially intended for reading in usernames and
!  * password interactively. Reads from /dev/tty or stdin/stderr.
   *
   * prompt:        The prompt to print
   * maxlen:        How many characters to accept
***************
*** 176,214 ****
  {
      int            length;
      char       *destination;

  #ifdef HAVE_TERMIOS_H
      struct termios t_orig,
                  t;
-
  #endif

      destination = (char *) malloc(maxlen + 2);
      if (!destination)
          return NULL;
-     if (prompt)
-         fputs(gettext(prompt), stderr);

      prompt_state = true;

  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcgetattr(0, &t);
          t_orig = t;
          t.c_lflag &= ~ECHO;
!         tcsetattr(0, TCSADRAIN, &t);
      }
  #endif

!     if (fgets(destination, maxlen, stdin) == NULL)
          destination[0] = '\0';

  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcsetattr(0, TCSADRAIN, &t_orig);
!         fputs("\n", stderr);
      }
  #endif

--- 176,228 ----
  {
      int            length;
      char       *destination;
+     static FILE *termin = NULL, *termout;

  #ifdef HAVE_TERMIOS_H
      struct termios t_orig,
                  t;
  #endif

      destination = (char *) malloc(maxlen + 2);
      if (!destination)
          return NULL;

      prompt_state = true;

+     /* initialize the streams */
+     if (!termin)
+     {
+         if ((termin = termout = fopen("/dev/tty", "w+")) == NULL)
+         {
+             termin = stdin;
+             termout = stderr;
+         }
+     }
+
+     if (prompt)
+     {
+         fputs(gettext(prompt), termout);
+         rewind(termout); /* does flush too */
+     }
+
  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcgetattr(fileno(termin), &t);
          t_orig = t;
          t.c_lflag &= ~ECHO;
!         tcsetattr(fileno(termin), TCSADRAIN, &t);
      }
  #endif

!     if (fgets(destination, maxlen, termin) == NULL)
          destination[0] = '\0';

  #ifdef HAVE_TERMIOS_H
      if (!echo)
      {
!         tcsetattr(fileno(termin), TCSADRAIN, &t_orig);
!         fputs("\n", termout);
      }
  #endif

***************
*** 223,229 ****

          do
          {
!             if (fgets(buf, sizeof(buf), stdin) == NULL)
                  break;
              buflen = strlen(buf);
          } while (buflen > 0 && buf[buflen - 1] != '\n');
--- 237,243 ----

          do
          {
!             if (fgets(buf, sizeof(buf), termin) == NULL)
                  break;
              buflen = strlen(buf);
          } while (buflen > 0 && buf[buflen - 1] != '\n');

Re: psql: default base and password reading

From
Peter Eisentraut
Date:
Tom Lane writes:

> > 2. Password is reading from terminal (/dev/tty) rather than from
> > stdin.
>
> Hmm, that might be a good idea.  Comments anyone?

I guarantee you that within 24 hours after such a patch were checked in
someone's going to complain that he has no /dev/tty.

Meanwhile, there are a couple of possible workarounds:

* PGPASSWORD environment variable.

* FIFOs

* (echo "Password"; pipe_input) | psql

A generalized option to read the password from any file might make sense,
though.

--
Peter Eisentraut   peter_e@gmx.net   http://funkturm.homeip.net/~peter


Re: psql: default base and password reading

From
Bruce Momjian
Date:
> Tom Lane writes:
>
> > > 2. Password is reading from terminal (/dev/tty) rather than from
> > > stdin.
> >
> > Hmm, that might be a good idea.  Comments anyone?
>
> I guarantee you that within 24 hours after such a patch were checked in
> someone's going to complain that he has no /dev/tty.
>
> Meanwhile, there are a couple of possible workarounds:
>
> * PGPASSWORD environment variable.
>
> * FIFOs
>
> * (echo "Password"; pipe_input) | psql
>
> A generalized option to read the password from any file might make sense,
> though.

Have you seen my later version that reads from stdin/stderr if /dev/tty
doesn't open.  How is that?

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: psql: default base and password reading

From
Tom Lane
Date:
Peter Eisentraut <peter_e@gmx.net> writes:
> Might as well use getpass() if available.  My man page says "A getpass
> function appeared in Version 7 AT&T UNIX.", so it should be available on
> most systems.

Hmm.  HPUX's man page for getpass says:

STANDARDS CONFORMANCE
     getpass(): AES, SVID2, SVID3, XPG2, XPG3, XPG4

However, it also says:

     getpass() reads up to a newline or EOF from the file /dev/tty, after
     prompting on the standard error output with the null-terminated string
     prompt and disabling echoing.  A pointer is returned to a null-
     terminated string of at most 8 characters.  If /dev/tty cannot be
     opened, a NULL pointer is returned.

The 8-char limit is alone sufficient to disqualify it for use in psql.

            regards, tom lane

Re: psql: default base and password reading

From
Peter Eisentraut
Date:
Bruce Momjian writes:

> Have you seen my later version that reads from stdin/stderr if /dev/tty
> doesn't open.  How is that?

Might as well use getpass() if available.  My man page says "A getpass
function appeared in Version 7 AT&T UNIX.", so it should be available on
most systems.

However, I'm afraid many users have set up their systems to read the
password from stdin, so that should probably stay the default unless we
take a user poll.

--
Peter Eisentraut   peter_e@gmx.net   http://funkturm.homeip.net/~peter


Re: psql: default base and password reading

From
Tom Lane
Date:
pgsql-patches is hardly the place to take a user poll ...

            regards, tom lane

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> Bruce Momjian writes:
>
> > Have you seen my later version that reads from stdin/stderr if /dev/tty
> > doesn't open.  How is that?
>
> Might as well use getpass() if available.  My man page says "A getpass
> function appeared in Version 7 AT&T UNIX.", so it should be available on
> most systems.
>
> However, I'm afraid many users have set up their systems to read the
> password from stdin, so that should probably stay the default unless we
> take a user poll.

OK, I am asking for votes for /dev/tty or stdin as the default for
reading passwords?  I already have a few for /dev/tty and I assume one
for stdin (Peter E).

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: psql: default base and password reading

From
Bruce Momjian
Date:
OK, send to general.

> pgsql-patches is hardly the place to take a user poll ...
>
>             regards, tom lane
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> Bruce Momjian writes:
>
> > Have you seen my later version that reads from stdin/stderr if /dev/tty
> > doesn't open.  How is that?
>
> Might as well use getpass() if available.  My man page says "A getpass
> function appeared in Version 7 AT&T UNIX.", so it should be available on
> most systems.
>
> However, I'm afraid many users have set up their systems to read the
> password from stdin, so that should probably stay the default unless we
> take a user poll.

Vote request sent to 'general'.

Yes, a change will inconvenience some people and perhaps they will have
to resort to 'expect'.  However, I can't think of one piece of
significant software that reads from stdin by default rather than
/dev/tty.  It certainly makes this counter-intuitive:

    cat script | psql test

If 'test' requires a password, our current code requires the password to
be the first line in the script.  Though this can be convenient in some
cases, in most cases it is quite unexpected.


--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

Re: psql: default base and password reading

From
Bruce Momjian
Date:
> Bruce Momjian writes:
>
> > Have you seen my later version that reads from stdin/stderr if /dev/tty
> > doesn't open.  How is that?
>
> Might as well use getpass() if available.  My man page says "A getpass
> function appeared in Version 7 AT&T UNIX.", so it should be available on
> most systems.
>
> However, I'm afraid many users have set up their systems to read the
> password from stdin, so that should probably stay the default unless we
> take a user poll.

OK, seeing only positive reports, I have committed the patch to
display/prompt from /dev/tty and fall back to stdin/stderr.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026