Re: Shouldn't .pgpass work with anything which uses libpq? - Mailing list pgsql-interfaces

From Bruce Momjian
Subject Re: Shouldn't .pgpass work with anything which uses libpq?
Date
Msg-id 200301082205.h08M5h812125@candle.pha.pa.us
Whole thread Raw
In response to Shouldn't .pgpass work with anything which uses libpq?  (ljb <lbayuk@mindspring.com>)
List pgsql-interfaces
OK, here is a patch I applied to 7.3.X and CVS head to fix the problem.

The basic issue is that PQsetdbLogin does the pgpass test and then calls
PQconnectDB.  The fix is to do the pgpass test in PQconnectDB so both
PQsetdbLogin and PQconnectDB can use it.

However, your posting brings up an interesting issue.  Our current code
makes no distinction between "" as a password, and a NULL password.
They are both equivalent to "I have supplied no password".  If you
create a public user with an empty password, "", there is no way to log
in as that user, because "" is considered to be "no password".

I don't want to play with this in 7.3.X, but is it something we should
consider cleaning up for 7.4?

---------------------------------------------------------------------------

ljb wrote:
> (Using PostgreSQL-7.3.1)
>
> I noticed that the new ~/.pgpass password file works with psql but not with
> my pgtclsh scripts, and I'm wondering: shouldn't it work with anything
> built on top of libpq?
>
> Digging into it a bit, I think no conninfo-based connection method will use
> .pgpass, including libpq PQconnectDB() and libpgtcl "pg_connect -conninfo".
> I think it is happening because .pgpass is only read if the password
> argument to PQsetdbLogin() is NULL. But if no password is supplied in a
> conninfo string, then "DefaultPassword" is used - this is an empty string,
> not NULL. Am I right? Is this behavior wrong?
>
> ---------------------------(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
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/fe-connect.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v
retrieving revision 1.220
diff -c -c -r1.220 fe-connect.c
*** src/interfaces/libpq/fe-connect.c    8 Jan 2003 16:21:53 -0000    1.220
--- src/interfaces/libpq/fe-connect.c    8 Jan 2003 21:28:52 -0000
***************
*** 314,319 ****
--- 314,322 ----
      conn->pguser = tmp ? strdup(tmp) : NULL;
      tmp = conninfo_getval(connOptions, "password");
      conn->pgpass = tmp ? strdup(tmp) : NULL;
+     if (conn->pgpass == NULL || conn->pgpass[0] == '\0')
+         conn->pgpass = PasswordFromFile(conn->pghost, conn->pgport,
+                                      conn->dbName, conn->pguser);
      tmp = conninfo_getval(connOptions, "connect_timeout");
      conn->connect_timeout = tmp ? strdup(tmp) : NULL;
  #ifdef USE_SSL
***************
*** 511,519 ****
          conn->pgpass = strdup(pwd);
      else if ((tmp = getenv("PGPASSWORD")) != NULL)
          conn->pgpass = strdup(tmp);
-     else if ((tmp = PasswordFromFile(conn->pghost, conn->pgport,
-                                      conn->dbName, conn->pguser)))
-         conn->pgpass = tmp;
      else
          conn->pgpass = strdup(DefaultPassword);

--- 514,519 ----

pgsql-interfaces by date:

Previous
From: "Jeroen T. Vermeulen"
Date:
Subject: Re: libpqxx Large Objects
Next
From: "Key88 SF"
Date:
Subject: Re: libpqxx Large Objects