Commit 5fc10c3d authored by Bruce Momjian's avatar Bruce Momjian

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.
parent f4aecac4
<!-- <!--
$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>. ...@@ -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. ...@@ -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>
......
<!-- <!--
$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 ...@@ -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>
......
<!-- <!--
$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 ...@@ -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>
......
<!-- <!--
$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 ...@@ -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>
......
...@@ -3,7 +3,7 @@ ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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);
} }
......
...@@ -3,7 +3,7 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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);
} }
......
...@@ -8,7 +8,7 @@ ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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)
return NULL;
if (dbname == NULL || strcmp(dbname, "") == 0) if (dbname == NULL || strlen(dbname) == 0)
return NULL; return NULL;
if (username == NULL || strcmp(username, "") == 0) if (username == NULL || strlen(username) == 0)
return NULL; return NULL;
if (hostname == NULL) if (hostname == NULL)
...@@ -2929,20 +2923,41 @@ PasswordFromFile(char *hostname, char *port, char *dbname, ...@@ -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;
/* Look for it in the home dir */
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;
sprintf(pgpassfile, "%s" PGPASSFILE, home);
/* If password file cannot be opened, ignore it. */ /* If password file cannot be opened, ignore it. */
if (stat(pwdfile, &stat_buf) == -1) if (stat(pgpassfile, &stat_buf) == -1)
{
free(pgpassfile);
return NULL; 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, ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment