mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
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:
parent
f4aecac468
commit
5fc10c3d17
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user