Adjust lookup of client-side profile files (.pgpass and so on) as per
authorTom Lane
Thu, 6 Jan 2005 18:29:11 +0000 (18:29 +0000)
committerTom Lane
Thu, 6 Jan 2005 18:29:11 +0000 (18:29 +0000)
discussion on pgsql-hackers-win32 list.  Documentation still needs to
be tweaked --- I'm not sure how to refer to the APPDATA folder in
user documentation.

doc/src/sgml/libpq.sgml
doc/src/sgml/ref/pg_dumpall.sgml
doc/src/sgml/ref/psql-ref.sgml
doc/src/sgml/ref/vacuumdb.sgml
doc/src/sgml/release.sgml
src/backend/libpq/README.SSL
src/bin/psql/input.c
src/bin/psql/startup.c
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/fe-secure.c
src/port/path.c

index cf2cbcceaa8925be885ceb7bd067cae8de2067a5..97c246f1c0181af51ba955a9d2f4e5e044577c51 100644 (file)
@@ -1,5 +1,5 @@
 
 
  
@@ -147,8 +147,8 @@ PGconn *PQconnectdb(const char *conninfo);
       likely to fail if libpq is passed a host name
       that is not the name of the machine at hostaddr.)  Also,
       host rather than hostaddr is used to identify
-      the connection in $HOME/.pgpass (or 
-      <filename>%USERPROFILE%\.pgpass on Microsoft Windows).
+      the connection in ~/.pgpass (see
+      <xref linkend="libpq-pgpass">).
      
      
       Without either a host name or host address,
@@ -3691,7 +3691,7 @@ sets the user name used to connect to the database.
 PGPASSWORD
 sets the password used if the server demands password
 authentication.  This environment variable is deprecated for security
-reasons; instead consider using the $HOME/.pgpass
+reasons; instead consider using the ~/.pgpass
 file (see ).
 
 
@@ -3881,7 +3881,12 @@ internationalization.
 The file .pgpass in a user's home directory is a file
 that can contain passwords to be used if the connection requires a
 password (and no password has been specified otherwise).
-This file should have lines of the following format:
+On Microsoft Windows the file is named
+APPDATA/postgresql/pgpass.txt.
+
+
+
+This file should contain lines of the following format:
 
 hostname:port:database:username:password
 
@@ -3893,11 +3898,14 @@ entries first when you are using wildcards.)
 If an entry needs to contain : or
 \, escape this character with \.
 
+
 
 The permissions on .pgpass must disallow any
 access to world or group; achieve this by the command
 chmod 0600 ~/.pgpass.
 If the permissions are less strict than this, the file will be ignored.
+(The file permissions are not currently checked on Microsoft Windows,
+however.)
 
 
 
@@ -3920,16 +3928,22 @@ If the permissions are less strict than this, the file will be ignored.
    If the server demands a client certificate, 
    libpq
    will send the certificate stored in file
-   .postgresql/postgresql.crt within the user's home directory.
-   A matching private key file .postgresql/postgresql.key
+   ~/.postgresql/postgresql.crt within the user's home directory.
+   A matching private key file ~/.postgresql/postgresql.key
    must also be present, and must not be world-readable.
+   (On Microsoft Windows these files are named
+   APPDATA/postgresql/postgresql.crt and
+   APPDATA/postgresql/postgresql.key.)
   
 
   
-   If the file .postgresql/root.crt is present in the user's
+   If the file ~/.postgresql/root.crt is present in the user's
    home directory,
    libpq will use the certificate list stored
-   therein to verify the server's certificate.  The SSL connection will
+   therein to verify the server's certificate.
+   (On Microsoft Windows the file is named
+   APPDATA/postgresql/root.crt.)
+   The SSL connection will
    fail if the server does not present a certificate; therefore, to
    use this feature the server must also have a root.crt file.
   
index 64cc8a09fa8ecbdc5e52fd7733e213c385a28884..7863c794071239bae2502813726c8fc458364df1 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -71,7 +71,8 @@ PostgreSQL documentation
   times to the PostgreSQL server (once per
   database).  If you use password authentication it is likely to ask for
   a password each time. It is convenient to have a
-  $HOME/.pgpass file in such cases.
+  ~/.pgpass file in such cases. See 
+  linkend="libpq-pgpass"> for more information.
   
 
  
index 30ebeebe3b104a34ddca8fb8c2b9fd649c82cc1e..afdee5c2ba7deb034e71cc3a765917de1e23b4a3 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -440,8 +440,9 @@ PostgreSQL documentation
       
       
       
-      Do not read the start-up file /psqlrc or
-      ~/.psqlrc.
+      Do not read the start-up file (neither the system-wide
+      psqlrc file nor the user's
+      ~/.psqlrc file).
       
       
     
@@ -1109,7 +1110,7 @@ testdb=>
 => \echo `date`
 Tue Oct 26 21:40:57 CEST 1999
 
-        If the first argument is an unquoted -n the the trailing
+        If the first argument is an unquoted -n the trailing
         newline is not written.
         
 
@@ -1901,8 +1902,8 @@ bar
          The autocommit-on mode is PostgreSQL's traditional
          behavior, but autocommit-off is closer to the SQL spec.  If you
          prefer autocommit-off, you may wish to set it in the system-wide
-         psqlrc or your
-         .psqlrc file.
+         psqlrc file or your
+         ~/.psqlrc file.
         
         
         
@@ -2415,8 +2416,8 @@ testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%#%] '
     
     psql supports the Readline
     library for convenient line editing and retrieval. The command
-    history is stored in a file named .psql_history>
-    in your home directory and is reloaded when
+    history is automatically saved when psql>
+    exits and is reloaded when
     psql starts up. Tab-completion is also
     supported, although the completion logic makes no claim to be an
     SQL parser.  If for some reason you do not like the tab completion, you
@@ -2440,17 +2441,6 @@ $endif
   Environment
 
   
-   
-    HOME
-
-    
-     
-      Directory for initialization file (.psqlrc)
-      and command history file (.psql_history).
-     
-    
-   
-
    
     PAGER
 
@@ -2531,20 +2521,34 @@ $endif
    
     
      Before starting up, psql attempts to
-     read and execute commands from the the system-wide
-     psqlrc file and the
-     $HOME/.psqlrc file in the user's home
-     directory.  See PREFIX/share/psqlrc.sample
+     read and execute commands from the system-wide
+     psqlrc file and the user's
+     ~/.psqlrc file.
+     (On Windows, the user's startup file is named
+     APPDATA/postgresql/psqlrc.txt.)
+     See PREFIX/share/psqlrc.sample
      for information on setting up the system-wide file.  It could be used
      to set up the client or the server to taste (using the \set
       and SET commands).
     
    
 
+   
+    
+     Both the system-wide psqlrc file and the user's
+     ~/.psqlrc file can be made version-specific
+     by appending a dash and the PostgreSQL
+     release number, for example ~/.psqlrc-&version;.
+     A matching version-specific file will be read in preference to a
+     non-version-specific file.
+    
+   
+
    
     
      The command-line history is stored in the file
-     $HOME/.psql_history.
+     ~/.psql_history, or
+     APPDATA/postgresql/psql_history on Windows.
     
    
   
index dee6b81e0dc84f98703aaa1e71fff3cae7f81705..1fe4db8dc2280666f5e1ad112f3e9f7b0bc5877c 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -73,7 +73,7 @@ PostgreSQL documentation
       
       
        
-   Vacuum all databases.
+        Vacuum all databases.
        
       
      
@@ -83,12 +83,12 @@ PostgreSQL documentation
       
       
        
-   Specifies the name of the database to be cleaned or analyzed.
-   If this is not specified and  (or
-   ) is not used, the database name is read
-   from the environment variable PGDATABASE.  If
-   that is not set, the user name specified for the connection is
-   used.
+        Specifies the name of the database to be cleaned or analyzed.
+        If this is not specified and  (or
+        ) is not used, the database name is read
+        from the environment variable PGDATABASE.  If
+        that is not set, the user name specified for the connection is
+        used.
        
       
      
@@ -99,7 +99,7 @@ PostgreSQL documentation
       
        
         Echo the commands that vacuumdb generates
-   and sends to the server.
+        and sends to the server.
        
       
      
@@ -129,9 +129,9 @@ PostgreSQL documentation
       
       
        
-   Clean or analyze table only.
-   Column names may be specified only in conjunction with
-   the  option.
+        Clean or analyze table only.
+        Column names may be specified only in conjunction with
+        the  option.
        
        
         
@@ -147,7 +147,7 @@ PostgreSQL documentation
       
       
        
-   Print detailed information during processing.
+        Print detailed information during processing.
        
       
      
@@ -157,7 +157,7 @@ PostgreSQL documentation
       
       
        
-   Calculate statistics for use by the optimizer.
+        Calculate statistics for use by the optimizer.
        
       
      
@@ -174,10 +174,10 @@ PostgreSQL documentation
       
       
        
-   Specifies the host name of the machine on which the 
-   server
-   is running.  If the value begins with a slash, it is used 
-   as the directory for the Unix domain socket.
+        Specifies the host name of the machine on which the 
+        server
+        is running.  If the value begins with a slash, it is used 
+        as the directory for the Unix domain socket.
        
       
      
@@ -187,9 +187,9 @@ PostgreSQL documentation
       
       
        
-   Specifies the TCP port or local Unix domain socket file 
-   extension on which the server
-   is listening for connections.
+        Specifies the TCP port or local Unix domain socket file 
+        extension on which the server
+        is listening for connections.
        
       
      
@@ -261,7 +261,7 @@ PostgreSQL documentation
    vacuumdb might need to connect several
    times to the PostgreSQL server, asking
    for a password each time. It is convenient to have a
-   $HOME/.pgpass file in such cases. See 
+   ~/.pgpass file in such cases. See 
    linkend="libpq-pgpass"> for more information.
   
  
index fe77a978b8cef9f85d49020eee7ddb1dd1e4ffa6..c335497c57ed216011ffcc4ebd53fc2f5541263a 100644 (file)
@@ -1,5 +1,5 @@
 
 
 
@@ -5615,7 +5615,7 @@ operations on bytea columns (Joe)
    
     libpq
 
-Add $HOME/.pgpass to store host/user password combinations (Alvaro Herrera)
+Add ~/.pgpass to store host/user password combinations (Alvaro Herrera)
 Add PQunescapeBytea() function to libpq (Patrick Welche)
 Fix for sending large queries over non-blocking connections (Bernhard Herzog)
 Fix for libpq using timers on Win9X (David Ford)
index 9d9adcb7fb867bc869c503d4857a4055eb51f043..9b00a4f0fff259643cfd53afe515cba5bcda19eb 100644 (file)
@@ -177,7 +177,7 @@ user should be set up on the database server.  It is acceptable
 for the shell program to be bogus (e.g., /bin/false), if the
 tunnel is set up in to avoid launching a remote shell.
 
-On each client system the $HOME/.ssh/config file should contain
+On each client system the ~/.ssh/config file should contain
 an additional line similiar to
 
  LocalForward 5555 psql.example.com:5432
@@ -192,7 +192,7 @@ that establishes an SSH tunnel when the program is launched:
 
   #!/bin/sh
   HOST=psql.example.com
-  IDENTITY=$HOME/.ssh/identity.psql
+  IDENTITY=~/.ssh/identity.psql
   /usr/bin/ssh -1 -i $IDENTITY -n $HOST 'sleep 60' & \
    /usr/bin/psql -h $HOST -p 5555 $1
 
@@ -335,12 +335,12 @@ PostgreSQL can generate client certificates via a four-step process.
 
    The client.conf file is normally installed in /etc/postgresql/root.crt.
    The client should also copy the server's root.crt file to
-   $HOME/.postgresql/root.crt.
+   ~/.postgresql/root.crt.
 
 2. If the user has the OpenSSL applications installed, they can
    run pgkeygen.sh.  (An equivalent compiled program will be available
    in the future.)  They should provide a copy of the
-   $HOME/.postgresql/postgresql.pem file to their DBA.
+   ~/.postgresql/postgresql.pem file to their DBA.
 
 3. The DBA should sign this file the OpenSSL applications:
 
@@ -348,7 +348,7 @@ PostgreSQL can generate client certificates via a four-step process.
 
    and return the signed cert (postgresql.crt) to the user.
 
-4. The user should install this file in $HOME/.postgresql/postgresql.crt.
+4. The user should install this file in ~/.postgresql/postgresql.crt.
 
 The server will log every time a client certificate has been
 used, but there is not yet a mechanism provided for using client
@@ -429,7 +429,7 @@ until later.
 > for the shell program to be bogus (e.g., /bin/false), if the
 > tunnel is set up in to avoid launching a remote shell.
 > 
-> On each client system the $HOME/.ssh/config file should contain
+> On each client system the ~/.ssh/config file should contain
 > an additional line similiar to
 > 
 >  LocalForward 5555 psql.example.com:5432
index b216e98843f5eca9bb29eafe6d73362ea2fe0488..e75c86f7f8c732f28812b282bfd6388ab3c485d2 100644 (file)
@@ -3,18 +3,22 @@
  *
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.42 2005/01/01 05:43:08 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.43 2005/01/06 18:29:09 tgl Exp $
  */
 #include "postgres_fe.h"
-#include "input.h"
-
-#include 
 
+#include "input.h"
 #include "pqexpbuffer.h"
 #include "settings.h"
 #include "tab-complete.h"
 #include "common.h"
 
+#ifndef WIN32
+#define PSQLHISTORY ".psql_history"
+#else
+#define PSQLHISTORY "psql_history"
+#endif
+
 /* Runtime options for turning off readline and history */
 /* (of course there is no runtime command for doing that :) */
 #ifdef USE_READLINE
@@ -32,14 +36,11 @@ enum histcontrol
 
 #ifdef HAVE_ATEXIT
 static void finishInput(void);
-
 #else
 /* designed for use with on_exit() */
 static void finishInput(int, void *);
 #endif
 
-#define PSQLHISTORY ".psql_history"
-
 
 #ifdef USE_READLINE
 static enum histcontrol
@@ -235,14 +236,12 @@ finishInput(int exitstatus, void *arg)
            char       *psql_history;
            int         hist_size;
 
-           psql_history = pg_malloc(strlen(home) + 1 +
-                                    strlen(PSQLHISTORY) + 1);
-
            hist_size = GetVariableNum(pset.vars, "HISTSIZE", -1, -1, true);
-
            if (hist_size >= 0)
                stifle_history(hist_size);
 
+           psql_history = pg_malloc(strlen(home) + 1 +
+                                    strlen(PSQLHISTORY) + 1);
            sprintf(psql_history, "%s/%s", home, PSQLHISTORY);
            write_history(psql_history);
            free(psql_history);
index e9ea17dc89429832a8b269f803584ae33ec4eabb..b8f6ca5f56226ee8fd75a0e333f01248395320a0 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.108 2005/01/01 05:43:08 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.109 2005/01/06 18:29:09 tgl Exp $
  */
 #include "postgres_fe.h"
 
@@ -43,8 +43,13 @@ int          optreset;
  */
 PsqlSettings pset;
 
+#ifndef WIN32
 #define SYSPSQLRC  "psqlrc"
 #define PSQLRC     ".psqlrc"
+#else
+#define SYSPSQLRC  "psqlrc"
+#define PSQLRC     "psqlrc.txt"
+#endif
 
 /*
  * Structures to pass information between the option parsing routine
@@ -568,24 +573,21 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 static void
 process_psqlrc(char *argv0)
 {
-   char       *psqlrc;
    char        home[MAXPGPATH];
-   char        global_file[MAXPGPATH];
+   char        rc_file[MAXPGPATH];
    char        my_exec_path[MAXPGPATH];
    char        etc_path[MAXPGPATH];
 
    find_my_exec(argv0, my_exec_path);
    get_etc_path(my_exec_path, etc_path);
 
-   snprintf(global_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
-   process_psqlrc_file(global_file);
+   snprintf(rc_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
+   process_psqlrc_file(rc_file);
 
    if (get_home_path(home))
    {
-       psqlrc = pg_malloc(strlen(home) + 1 + strlen(PSQLRC) + 1);
-       sprintf(psqlrc, "%s/%s", home, PSQLRC);
-       process_psqlrc_file(psqlrc);
-       free(psqlrc);
+       snprintf(rc_file, MAXPGPATH, "%s/%s", home, PSQLRC);
+       process_psqlrc_file(rc_file);
    }
 }
 
index 9f7bd09ce4ab19f91c8597cde2bb735909297f05..908c39c25671fcab90232ccd5421c43a54c689e1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.296 2005/01/06 00:59:47 tgl Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.297 2005/01/06 18:29:10 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -35,6 +35,7 @@
 
 #ifdef WIN32
 #include "win32.h"
+#include 
 #else
 #include 
 #include 
 #endif
 
 
+#ifndef WIN32
 #define PGPASSFILE ".pgpass"
+#else
+#define PGPASSFILE "pgpass.txt"
+#endif
 
 /* fall back options if they are not specified by arguments or defined
    by environment variables */
@@ -3175,6 +3180,7 @@ static char *
 PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
 {
    FILE       *fp;
+   char        homedir[MAXPGPATH];
    char        pgpassfile[MAXPGPATH];
    struct stat stat_buf;
 
@@ -3193,12 +3199,10 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
    if (port == NULL)
        port = DEF_PGPORT_STR;
 
-   if (!pqGetHomeDirectory(pgpassfile, sizeof(pgpassfile)))
+   if (!pqGetHomeDirectory(homedir, sizeof(homedir)))
        return NULL;
 
-   snprintf(pgpassfile + strlen(pgpassfile),
-            sizeof(pgpassfile) - strlen(pgpassfile),
-            "/%s", PGPASSFILE);
+   snprintf(pgpassfile, sizeof(pgpassfile), "%s/%s", homedir, PGPASSFILE);
 
    /* If password file cannot be opened, ignore it. */
    if (stat(pgpassfile, &stat_buf) == -1)
@@ -3254,6 +3258,9 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
 /*
  * Obtain user's home directory, return in given buffer
  *
+ * On Unix, this actually returns the user's home directory.  On Windows
+ * it returns the PostgreSQL-specific application data folder.
+ *
  * This is essentially the same as get_home_path(), but we don't use that
  * because we don't want to pull path.c into libpq (it pollutes application
  * namespace)
@@ -3272,16 +3279,12 @@ pqGetHomeDirectory(char *buf, int bufsize)
    return true;
 
 #else
+   char        tmppath[MAX_PATH];
 
-   /* TEMPORARY PLACEHOLDER IMPLEMENTATION */
-   const char *homedir;
-
-   homedir = getenv("USERPROFILE");
-   if (homedir == NULL)
-       homedir = getenv("HOME");
-   if (homedir == NULL)
+   ZeroMemory(tmppath, sizeof(tmppath));
+   if (!SHGetSpecialFolderPath(NULL, tmppath, CSIDL_APPDATA, FALSE))
        return false;
-   StrNCpy(buf, homedir, bufsize);
+   snprintf(buf, bufsize, "%s/postgresql", tmppath);
    return true;
 #endif
 }
index a87d7221e24c6c30a0915c649701b9dac8ba01d5..382c1d9b560c028544814b5a187e2fefc9867a43 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.63 2005/01/06 00:59:47 tgl Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.64 2005/01/06 18:29:10 tgl Exp $
  *
  * NOTES
  *   [ Most of these notes are wrong/obsolete, but perhaps not all ]
@@ -26,7 +26,7 @@
  *   "man-in-the-middle" and "impersonation" attacks.  The
  *   server certificate, or better yet the CA certificate used
  *   to sign the server certificate, should be present in the
- *   "$HOME/.postgresql/root.crt" file.  If this file isn't
+ *   "~/.postgresql/root.crt" file.  If this file isn't
  *   readable, or the server certificate can't be validated,
  *   pqsecure_open_client() will return an error code.
  *
@@ -50,7 +50,7 @@
  *   ...
  *
  *   Unlike the server's static private key, the client's
- *   static private key ($HOME/.postgresql/postgresql.key)
+ *   static private key (~/.postgresql/postgresql.key)
  *   should normally be stored encrypted.  However we still
  *   support EPH since it's useful for other reasons.
  *
@@ -63,9 +63,9 @@
  *   keeping it closed to everyone else.
  *
  *   The user's certificate and private key are located in
- *     $HOME/.postgresql/postgresql.crt
+ *     ~/.postgresql/postgresql.crt
  *   and
- *     $HOME/.postgresql/postgresql.key
+ *     ~/.postgresql/postgresql.key
  *   respectively.
  *
  *   ...
  *   info_cb() in be-secure.c), since there's mechanism to
  *   display that information to the client.
  *
- * OS DEPENDENCIES
- *   The code currently assumes a POSIX password entry.  How should
- *   Windows and Mac users be handled?
- *
  *-------------------------------------------------------------------------
  */
 
 
 
 #ifdef USE_SSL
-static int verify_cb(int ok, X509_STORE_CTX *ctx);
+
+#ifndef WIN32
+#define USERCERTFILE   ".postgresql/postgresql.crt"
+#define USERKEYFILE        ".postgresql/postgresql.key"
+#define ROOTCERTFILE   ".postgresql/root.crt"
+#define DHFILEPATTERN  "%s/.postgresql/dh%d.pem"
+#else
+/* On Windows, the "home" directory is already PostgreSQL-specific */
+#define USERCERTFILE   "postgresql.crt"
+#define USERKEYFILE        "postgresql.key"
+#define ROOTCERTFILE   "root.crt"
+#define DHFILEPATTERN  "%s/dh%d.pem"
+#endif
 
 #ifdef NOT_USED
 static int verify_peer(PGconn *);
 #endif
+static int verify_cb(int ok, X509_STORE_CTX *ctx);
 static DH  *load_dh_file(int keylength);
 static DH  *load_dh_buffer(const char *, size_t);
 static DH  *tmp_dh_cb(SSL *s, int is_export, int keylength);
@@ -158,7 +167,7 @@ static SSL_CTX *SSL_context = NULL;
  * sessions even if the static private key is compromised,
  * so we are *highly* motivated to ensure that we can use
  * EDH even if the user... or an attacker... deletes the
- * $HOME/.postgresql/dh*.pem files.
+ * ~/.postgresql/dh*.pem files.
  *
  * It's not critical that users have EPH keys, but it doesn't
  * hurt and if it's missing someone will demand it, so....
@@ -631,8 +640,7 @@ load_dh_file(int keylength)
        return NULL;
 
    /* attempt to open file.  It's not an error if it doesn't exist. */
-   snprintf(fnbuf, sizeof(fnbuf), "%s/.postgresql/dh%d.pem",
-            homedir, keylength);
+   snprintf(fnbuf, sizeof(fnbuf), DHFILEPATTERN, homedir, keylength);
 
    if ((fp = fopen(fnbuf, "r")) == NULL)
        return NULL;
@@ -779,8 +787,7 @@ client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
    }
 
    /* read the user certificate */
-   snprintf(fnbuf, sizeof(fnbuf), "%s/.postgresql/postgresql.crt",
-            homedir);
+   snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, USERCERTFILE);
    if ((fp = fopen(fnbuf, "r")) == NULL)
    {
        printfPQExpBuffer(&conn->errorMessage,
@@ -802,8 +809,7 @@ client_cert_cb(SSL *ssl, X509 **x509, EVP_PKEY **pkey)
    fclose(fp);
 
    /* read the user key */
-   snprintf(fnbuf, sizeof(fnbuf), "%s/.postgresql/postgresql.key",
-            homedir);
+   snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, USERKEYFILE);
    if (stat(fnbuf, &buf) == -1)
    {
        printfPQExpBuffer(&conn->errorMessage,
@@ -966,7 +972,7 @@ initialize_SSL(PGconn *conn)
    /* Set up to verify server cert, if root.crt is present */
    if (pqGetHomeDirectory(homedir, sizeof(homedir)))
    {
-       snprintf(fnbuf, sizeof(fnbuf), "%s/.postgresql/root.crt", homedir);
+       snprintf(fnbuf, sizeof(fnbuf), "%s/%s", homedir, ROOTCERTFILE);
        if (stat(fnbuf, &buf) == 0)
        {
            if (!SSL_CTX_load_verify_locations(SSL_context, fnbuf, NULL))
index 204c782ff125ac03686f4c725ad2d4c3c7cd9459..2620f3926354d0acb7508d0a44c77950b08e2760 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/path.c,v 1.47 2005/01/06 01:00:12 tgl Exp $
+ *   $PostgreSQL: pgsql/src/port/path.c,v 1.48 2005/01/06 18:29:11 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -17,7 +17,9 @@
 
 #include 
 #include 
-#ifndef WIN32
+#ifdef WIN32
+#include 
+#else
 #include 
 #endif
 
@@ -445,6 +447,9 @@ get_locale_path(const char *my_exec_path, char *ret_path)
 
 /*
  * get_home_path
+ *
+ * On Unix, this actually returns the user's home directory.  On Windows
+ * it returns the PostgreSQL-specific application data folder.
  */
 bool
 get_home_path(char *ret_path)
@@ -460,16 +465,12 @@ get_home_path(char *ret_path)
    return true;
 
 #else
+   char        tmppath[MAX_PATH];
 
-   /* TEMPORARY PLACEHOLDER IMPLEMENTATION */
-   const char *homedir;
-
-   homedir = getenv("USERPROFILE");
-   if (homedir == NULL)
-       homedir = getenv("HOME");
-   if (homedir == NULL)
+   ZeroMemory(tmppath, sizeof(tmppath));
+   if (!SHGetSpecialFolderPath(NULL, tmppath, CSIDL_APPDATA, FALSE))
        return false;
-   StrNCpy(ret_path, homedir, MAXPGPATH);
+   snprintf(ret_path, MAXPGPATH, "%s/postgresql", tmppath);
    return true;
 #endif
 }