diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-30 19:50:07 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-01-30 19:50:07 +0000 |
commit | 5c508b7da142d7ed5e3d41d087993571741f81d1 (patch) | |
tree | 40746ca1683e356c5a5a3ea00e53942857fcab9b | |
parent | cc16e497896b730f51e0f08ba551cd37f49c8964 (diff) | |
download | postgresql-5c508b7da142d7ed5e3d41d087993571741f81d1.tar.gz postgresql-5c508b7da142d7ed5e3d41d087993571741f81d1.zip |
Fix regression in .pgpass support. From Neil Conway.
-rw-r--r-- | doc/src/sgml/libpq.sgml | 47 | ||||
-rw-r--r-- | src/interfaces/libpq/fe-connect.c | 47 |
2 files changed, 63 insertions, 31 deletions
diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 33a8eef4017..f0cb3cdb674 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.98.2.4 2003/01/07 22:54:03 momjian Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.98.2.5 2003/01/30 19:50:07 tgl Exp $ --> <chapter id="libpq"> @@ -202,9 +202,12 @@ PGconn *PQconnectdb(const char *conninfo) <term><literal>requiressl</literal></term> <listitem> <para> - Set to 1 to require SSL connection to the backend. <application>Libpq</> - will then refuse to connect if the server does not support - SSL. Set to 0 (default) to negotiate with server. + Set to 1 to require <acronym>SSL</acronym> connection to the server. + <application>Libpq</> will then refuse to connect if the server does not + accept an <acronym>SSL</acronym> connection. + Set to 0 (default) to negotiate with server. + This option is only available if + <productname>PostgreSQL</> is compiled with SSL support. </para> </listitem> </varlistentry> @@ -1994,10 +1997,11 @@ routines like <function>PQgetvalue</function>. <para> The following environment variables can be used to select default -connection parameter values, which will be used by <function>PQconnectdb</function> or -<function>PQsetdbLogin</function> if no value is directly specified by the calling code. -These are useful to avoid hard-coding database names into simple -application programs. +connection parameter values, which will be used by +<function>PQconnectdb</>, <function>PQsetdbLogin</> and +<function>PQsetdb</> if no value is directly specified by the calling +code. These are useful to avoid hard-coding database connection +information into simple client applications. <itemizedlist> <listitem> @@ -2075,6 +2079,25 @@ the <productname>PostgreSQL</productname> backend. messages from the backend server are displayed. </para> </listitem> +<listitem> +<para> +<envar>PGREQUIRESSL</envar> sets whether or not the connection must be +made over <acronym>SSL</acronym>. If set to +<quote>1</quote>, <application>libpq</> +will refuse to connect if the server does not accept +an <acronym>SSL</acronym> connection. +This option is only available if +<productname>PostgreSQL</> is compiled with SSL support. +</para> +</listitem> +<listitem> +<para> +<envar>PGCONNECT_TIMEOUT</envar> sets the maximum number of seconds +that <application>libpq</application> will wait when attempting to +connect to the <productname>PostgreSQL</productname> server. This +option should be set to at least 2 seconds. +</para> +</listitem> </itemizedlist> </para> @@ -2145,10 +2168,10 @@ password. This file should have the format: <synopsis> <replaceable>hostname</replaceable>:<replaceable>port</replaceable>:<replaceable>database</replaceable>:<replaceable>username</replaceable>:<replaceable>password</replaceable> </synopsis> -Any of these may be a literal name, or <literal>*</literal>, which matches -anything. The first match will be used so put more specific entries first. -Entries with <literal>:</literal> or <literal>\</literal> should be escaped -with <literal>\</literal>. +Any of these may be a literal name, or <literal>*</literal>, which +matches anything. The first matching entry will be used, so put more-specific +entries first. When an entry contains <literal>:</literal> or +<literal>\</literal>, it must be escaped with <literal>\</literal>. </para> <para> The permissions on <filename>.pgpass</filename> must disallow any diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 3a64ec1748a..887e5ced68f 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.213.2.1 2003/01/08 21:33:53 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.213.2.2 2003/01/30 19:50:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -112,7 +112,7 @@ static const PQconninfoOption PQconninfoOptions[] = { "Database-Password", "*", 20}, {"connect_timeout", "PGCONNECT_TIMEOUT", NULL, NULL, - "Connect-timeout", "", 10}, /* strlen( INT32_MAX) == 10 */ + "Connect-timeout", "", 10}, /* strlen(INT32_MAX) == 10 */ {"dbname", "PGDATABASE", NULL, NULL, "Database-Name", "", 20}, @@ -305,8 +305,14 @@ PQconnectStart(const char *conninfo) tmp = conninfo_getval(connOptions, "password"); conn->pgpass = tmp ? strdup(tmp) : NULL; if (conn->pgpass == NULL || conn->pgpass[0] == '\0') + { + if (conn->pgpass) + free(conn->pgpass); conn->pgpass = PasswordFromFile(conn->pghost, conn->pgport, - conn->dbName, conn->pguser); + conn->dbName, conn->pguser); + if (conn->pgpass == NULL) + conn->pgpass = strdup(DefaultPassword); + } tmp = conninfo_getval(connOptions, "connect_timeout"); conn->connect_timeout = tmp ? strdup(tmp) : NULL; #ifdef USE_SSL @@ -496,14 +502,13 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, else conn->dbName = strdup(dbName); - /* - * getPasswordFromFile mallocs its result, so we don't need strdup - * here - */ if (pwd) 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)) != NULL) + conn->pgpass = tmp; else conn->pgpass = strdup(DefaultPassword); @@ -2857,7 +2862,7 @@ pwdfMatchesString(char *buf, char *token) return NULL; } -/* get a password from the password file. */ +/* Get a password from the password file. Return value is malloc'd. */ char * PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { @@ -2883,17 +2888,15 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) /* Look for it in the home dir */ home = getenv("HOME"); - if (home) + if (!home) + return NULL; + + pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1); + if (!pgpassfile) { - pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1); - if (!pgpassfile) - { - fprintf(stderr, libpq_gettext("out of memory\n")); - return NULL; - } - } - else + fprintf(stderr, libpq_gettext("out of memory\n")); return NULL; + } sprintf(pgpassfile, "%s/%s", home, PGPASSFILE); @@ -2925,12 +2928,18 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { char *t = buf, *ret; + int len; fgets(buf, LINELEN - 1, fp); - if (strlen(buf) == 0) + + len = strlen(buf); + if (len == 0) continue; - buf[strlen(buf) - 1] = 0; + /* Remove trailing newline */ + if (buf[len - 1] == '\n') + buf[len - 1] = 0; + if ((t = pwdfMatchesString(t, hostname)) == NULL || (t = pwdfMatchesString(t, port)) == NULL || (t = pwdfMatchesString(t, dbname)) == NULL || |