Remove PGPASSWORDFILE and default to always trying $HOME/.pgpass.

Cleanup up memory allocation for $HOME in related psql places.

Update mention of $HOME/.pgpass in the docs;  add mention in pg_dumpall.
This commit is contained in:
Bruce Momjian 2002-09-05 22:05:50 +00:00
parent f4aecac468
commit 5fc10c3d17
7 changed files with 92 additions and 57 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.94 2002/09/02 20:21:32 tgl Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/libpq.sgml,v 1.95 2002/09/05 22:05:48 momjian Exp $
--> -->
<chapter id="libpq"> <chapter id="libpq">
@ -2052,23 +2052,6 @@ reasons; consider migrating to <envar>PGPASSWORDFILE</envar>.
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
<indexterm>
<primary><envar>PGPASSWORDFILE</envar></primary>
</indexterm>
<envar>PGPASSWORDFILE</envar>
sets the password file used if the backend demands password authentication.
This file should have the format
<screen>
<replaceable>hostname</replaceable>:<replaceable>port</replaceable>:<replaceable>database</replaceable>:<replaceable>username</replaceable>:<replaceable>password</replaceable>
</screen>
Any of these may be a literal name, or a <literal>*</literal> that matches
anything. The first match will be the one used, so put more specific entries first.
Entries with <literal>:</literal> or <literal>\</literal> should be escaped
with <literal>\</literal>.
</para>
</listitem>
<listitem>
<para>
<envar>PGREALM</envar> sets the Kerberos realm to use with <envar>PGREALM</envar> sets the Kerberos realm to use with
<productname>PostgreSQL</productname>, if it is different from the local realm. <productname>PostgreSQL</productname>, if it is different from the local realm.
If <envar>PGREALM</envar> is set, <productname>PostgreSQL</productname> If <envar>PGREALM</envar> is set, <productname>PostgreSQL</productname>
@ -2141,6 +2124,27 @@ for information on correct values for these environment variables.
</sect1> </sect1>
<sect1 id="libpq-files">
<title>Files</title>
<indexterm zone="libpq-files">
<primary>files</primary>
</indexterm>
<para>
<filename>$HOME/.pgpass</filename> is a file that can contain passwords
to be used if the connection requires a password. This file should have the
format:
<screen>
<replaceable>hostname</replaceable>:<replaceable>port</replaceable>:<replaceable>database</replaceable>:<replaceable>username</replaceable>:<replaceable>password</replaceable>
</screen>
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>.
</para>
</sect1>
<sect1 id="libpq-threading"> <sect1 id="libpq-threading">
<title>Threading Behavior</title> <title>Threading Behavior</title>

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/clusterdb.sgml,v 1.2 2002/09/03 01:11:37 tgl Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/clusterdb.sgml,v 1.3 2002/09/05 22:05:50 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -54,10 +54,10 @@ PostgreSQL documentation
</para> </para>
<para> <para>
<application>clusterdb</application> will need to connect several times to the <application>clusterdb</application> might need to connect several
<productname>PostgreSQL</productname> server. If you are using password times to the <productname>PostgreSQL</productname> server, asking for
authentication, it will ask for the password each time. It will probably be a password each time. It is convenient to have a
very convenient to have a PGPASSWORDFILE in that case. <filename>$HOME/.pgpass</> file in such cases.
</para> </para>
</refsect1> </refsect1>

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v 1.32 2002/08/27 18:57:26 petere Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/pg_dumpall.sgml,v 1.33 2002/09/05 22:05:50 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -61,6 +61,14 @@ PostgreSQL documentation
The SQL script will be written to the standard output. Shell The SQL script will be written to the standard output. Shell
operators should be used to redirect it into a file. operators should be used to redirect it into a file.
</para> </para>
<para>
<application>pg_dumpall</application> might need to connect several
times to the <productname>PostgreSQL</productname> server, asking for
a password each time. It is convenient to have a
<filename>$HOME/.pgpass</> file in such cases.
</para>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/vacuumdb.sgml,v 1.24 2002/08/27 03:55:17 momjian Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/vacuumdb.sgml,v 1.25 2002/09/05 22:05:50 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -62,9 +62,10 @@ PostgreSQL documentation
<para> <para>
<application>vacuumdb</application> will need to connect several times to the <application>vacuumdb</application> might need to connect several
<productname>PostgreSQL</productname> server, asking for the password each times to the <productname>PostgreSQL</productname> server, asking for
time. It will probably be very convenient to have a PGPASSWORDFILE in that case. a password each time. It is convenient to have a
<filename>$HOME/.pgpass</> file in such cases.
</para> </para>
</refsect1> </refsect1>

View File

@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.19 2002/04/10 22:46:58 petere Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.20 2002/09/05 22:05:50 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "input.h" #include "input.h"
@ -30,6 +30,8 @@ static void finishInput(void);
static void finishInput(int, void *); static void finishInput(int, void *);
#endif #endif
#define PSQLHISTORY "/.psql_history"
/* /*
* gets_interactive() * gets_interactive()
@ -142,11 +144,12 @@ initializeInput(int flags)
home = getenv("HOME"); home = getenv("HOME");
if (home) if (home)
{ {
char *psql_history = (char *) malloc(strlen(home) + 20); char *psql_history = (char *) malloc(strlen(home) +
strlen(PSQLHISTORY) + 1);
if (psql_history) if (psql_history)
{ {
sprintf(psql_history, "%s/.psql_history", home); sprintf(psql_history, "%s" PSQLHISTORY, home);
read_history(psql_history); read_history(psql_history);
free(psql_history); free(psql_history);
} }
@ -201,14 +204,15 @@ finishInput(int exitstatus, void *arg)
home = getenv("HOME"); home = getenv("HOME");
if (home) if (home)
{ {
psql_history = (char *) malloc(strlen(home) + 20); psql_history = (char *) malloc(strlen(home) +
strlen(PSQLHISTORY) + 1);
if (psql_history) if (psql_history)
{ {
const char *var = GetVariable(pset.vars, "HISTSIZE"); const char *var = GetVariable(pset.vars, "HISTSIZE");
if (var) if (var)
stifle_history(atoi(var)); stifle_history(atoi(var));
sprintf(psql_history, "%s/.psql_history", home); sprintf(psql_history, "%s" PSQLHISTORY, home);
write_history(psql_history); write_history(psql_history);
free(psql_history); free(psql_history);
} }

View File

@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.64 2002/09/04 20:31:36 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.65 2002/09/05 22:05:50 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
@ -42,6 +42,7 @@
*/ */
PsqlSettings pset; PsqlSettings pset;
#define PSQLRC "/.psqlrc"
/* /*
* Structures to pass information between the option parsing routine * Structures to pass information between the option parsing routine
@ -604,19 +605,20 @@ process_psqlrc(void)
if (home) if (home)
{ {
psqlrc = malloc(strlen(home) + 20); psqlrc = malloc(strlen(home) + strlen(PSQLRC) + 1 +
strlen(PG_VERSION) + 1);
if (!psqlrc) if (!psqlrc)
{ {
fprintf(stderr, gettext("%s: out of memory\n"), pset.progname); fprintf(stderr, gettext("%s: out of memory\n"), pset.progname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
sprintf(psqlrc, "%s/.psqlrc-" PG_VERSION, home); sprintf(psqlrc, "%s" PSQLRC "-" PG_VERSION, home);
if (access(psqlrc, R_OK) == 0) if (access(psqlrc, R_OK) == 0)
process_file(psqlrc); process_file(psqlrc);
else else
{ {
sprintf(psqlrc, "%s/.psqlrc", home); sprintf(psqlrc, "%s" PSQLRC, home);
if (access(psqlrc, R_OK) == 0) if (access(psqlrc, R_OK) == 0)
process_file(psqlrc); process_file(psqlrc);
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.201 2002/09/04 20:31:46 momjian Exp $ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.202 2002/09/05 22:05:50 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -66,6 +66,7 @@ inet_aton(const char *cp, struct in_addr * inp)
#define NOTIFYLIST_INITIAL_SIZE 10 #define NOTIFYLIST_INITIAL_SIZE 10
#define NOTIFYLIST_GROWBY 10 #define NOTIFYLIST_GROWBY 10
#define PGPASSFILE "/.pgpass"
/* ---------- /* ----------
* Definition of the conninfo parameters and their fallback resources. * Definition of the conninfo parameters and their fallback resources.
@ -186,7 +187,7 @@ static int parseServiceInfo(PQconninfoOption *options,
PQExpBuffer errorMessage); PQExpBuffer errorMessage);
char *pwdfMatchesString(char *buf, char *token); char *pwdfMatchesString(char *buf, char *token);
char *PasswordFromFile(char *hostname, char *port, char *dbname, char *PasswordFromFile(char *hostname, char *port, char *dbname,
char *username, char *pwdfile); char *username);
/* /*
* Connecting to a Database * Connecting to a Database
@ -395,10 +396,6 @@ PQconndefaults(void)
* *
* PGPASSWORD The user's password. * PGPASSWORD The user's password.
* *
* PGPASSWORDFILE
* A file that contains host:port:database:user:password
* for authentication
*
* PGDATABASE name of database to which to connect if <pgdatabase> * PGDATABASE name of database to which to connect if <pgdatabase>
* argument is NULL or a null string * argument is NULL or a null string
* *
@ -506,8 +503,7 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions,
else if ((tmp = getenv("PGPASSWORD")) != NULL) else if ((tmp = getenv("PGPASSWORD")) != NULL)
conn->pgpass = strdup(tmp); conn->pgpass = strdup(tmp);
else if ((tmp = PasswordFromFile(conn->pghost, conn->pgport, else if ((tmp = PasswordFromFile(conn->pghost, conn->pgport,
conn->dbName, conn->pguser, conn->dbName, conn->pguser)))
getenv("PGPASSWORDFILE"))) != NULL)
conn->pgpass = tmp; conn->pgpass = tmp;
else else
conn->pgpass = strdup(DefaultPassword); conn->pgpass = strdup(DefaultPassword);
@ -2905,22 +2901,20 @@ pwdfMatchesString(char *buf, char *token)
/* get a password from the password file. */ /* get a password from the password file. */
char * char *
PasswordFromFile(char *hostname, char *port, char *dbname, PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
char *username, char *pwdfile)
{ {
FILE *fp; FILE *fp;
char *pgpassfile;
char *home;
struct stat stat_buf;
#define LINELEN NAMEDATALEN*5 #define LINELEN NAMEDATALEN*5
char buf[LINELEN]; char buf[LINELEN];
struct stat stat_buf;
if (pwdfile == NULL || strcmp(pwdfile, "") == 0) if (dbname == NULL || strlen(dbname) == 0)
return NULL; return NULL;
if (dbname == NULL || strcmp(dbname, "") == 0) if (username == NULL || strlen(username) == 0)
return NULL;
if (username == NULL || strcmp(username, "") == 0)
return NULL; return NULL;
if (hostname == NULL) if (hostname == NULL)
@ -2929,20 +2923,41 @@ PasswordFromFile(char *hostname, char *port, char *dbname,
if (port == NULL) if (port == NULL)
port = DEF_PGPORT_STR; port = DEF_PGPORT_STR;
/* If password file cannot be opened, ignore it. */ /* Look for it in the home dir */
if (stat(pwdfile, &stat_buf) == -1) home = getenv("HOME");
if (home)
{
pgpassfile = malloc(strlen(home) + strlen(PGPASSFILE) + 1);
if (!pgpassfile)
{
fprintf(stderr, gettext("%s: out of memory\n"), pset.progname);
exit(EXIT_FAILURE);
}
}
else
return NULL; return NULL;
sprintf(pgpassfile, "%s" PGPASSFILE, home);
/* If password file cannot be opened, ignore it. */
if (stat(pgpassfile, &stat_buf) == -1)
{
free(pgpassfile);
return NULL;
}
/* If password file is insecure, alert the user and ignore it. */ /* If password file is insecure, alert the user and ignore it. */
if (stat_buf.st_mode & (S_IRWXG | S_IRWXO)) if (stat_buf.st_mode & (S_IRWXG | S_IRWXO))
{ {
fprintf(stderr, fprintf(stderr,
libpq_gettext("WARNING: Password file %s has world or group read access; permission should be u=rw (0600)"), libpq_gettext("WARNING: Password file %s has world or group read access; permission should be u=rw (0600)"),
pwdfile); pgpassfile);
free(pgpassfile);
return NULL; return NULL;
} }
fp = fopen(pwdfile, "r"); fp = fopen(pgpassfile, "r");
free(pgpassfile);
if (fp == NULL) if (fp == NULL)
return NULL; return NULL;
@ -2965,6 +2980,7 @@ PasswordFromFile(char *hostname, char *port, char *dbname,
fclose(fp); fclose(fp);
return ret; return ret;
} }
fclose(fp); fclose(fp);
return NULL; return NULL;