]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
libpq should expose GSS-related parameters even when not implemented.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Dec 2019 20:34:08 +0000 (15:34 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 20 Dec 2019 20:34:08 +0000 (15:34 -0500)
We realized years ago that it's better for libpq to accept all
connection parameters syntactically, even if some are ignored or
restricted due to lack of the feature in a particular build.
However, that lesson from the SSL support was for some reason never
applied to the GSSAPI support.  This is causing various buildfarm
members to have problems with a test case added by commit 6136e94dc,
and it's just a bad idea from a user-experience standpoint anyway,
so fix it.

While at it, fix some places where parameter-related infrastructure
was added with the aid of a dartboard, or perhaps with the aid of
the anti-pattern "add new stuff at the end".  It should be safe
to rearrange the contents of struct pg_conn even in released
branches, since that's private to libpq (and we'd have to move
some fields in some builds to fix this, anyway).

Back-patch to all supported branches.

Discussion: https://postgr.es/m/11297.1576868677@sss.pgh.pa.us

contrib/postgres_fdw/expected/postgres_fdw.out
contrib/postgres_fdw/sql/postgres_fdw.sql
doc/src/sgml/libpq.sgml
src/interfaces/libpq/fe-connect.c
src/interfaces/libpq/libpq-int.h

index 05abe7c68608f87d6c6e1674af29e42c037cb917..65bdcbb7a67e3877a380ba02b717d6b84a2f836d 100644 (file)
@@ -134,8 +134,8 @@ ALTER TABLE ft_pg_type SET WITH OIDS;
 -- ===================================================================
 -- tests for validator
 -- ===================================================================
--- requiressl, krbsrvname and gsslib are omitted because they depend on
--- configure options
+-- requiressl and some other parameters are omitted because
+-- valid values for them depend on configure options
 ALTER SERVER testserver1 OPTIONS (
        use_remote_estimate 'false',
        updatable 'true',
@@ -159,10 +159,10 @@ ALTER SERVER testserver1 OPTIONS (
        sslcert 'value',
        sslkey 'value',
        sslrootcert 'value',
-       sslcrl 'value'
+       sslcrl 'value',
        --requirepeer 'value',
-       -- krbsrvname 'value',
-       -- gsslib 'value',
+       krbsrvname 'value',
+       gsslib 'value'
        --replication 'value'
 );
 -- Error, invalid list syntax
index 02ec0d918281a4904e598dee8bd8ce5faf867e48..d7a332c18abc4c1276c0ff42cfc4d0a6e245bc1a 100644 (file)
@@ -147,8 +147,8 @@ ALTER TABLE ft_pg_type SET WITH OIDS;
 -- ===================================================================
 -- tests for validator
 -- ===================================================================
--- requiressl, krbsrvname and gsslib are omitted because they depend on
--- configure options
+-- requiressl and some other parameters are omitted because
+-- valid values for them depend on configure options
 ALTER SERVER testserver1 OPTIONS (
        use_remote_estimate 'false',
        updatable 'true',
@@ -172,10 +172,10 @@ ALTER SERVER testserver1 OPTIONS (
        sslcert 'value',
        sslkey 'value',
        sslrootcert 'value',
-       sslcrl 'value'
+       sslcrl 'value',
        --requirepeer 'value',
-       -- krbsrvname 'value',
-       -- gsslib 'value',
+       krbsrvname 'value',
+       gsslib 'value'
        --replication 'value'
 );
 
index 9073c95ee59647d39c1de9d4d0c8e7da143a25f8..9256684eb7c036e3bd64eef96f55a0bb1b61887d 100644 (file)
@@ -1487,8 +1487,10 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
       <term><literal>gsslib</literal></term>
       <listitem>
        <para>
-        GSS library to use for GSSAPI authentication. Only used on Windows.
-        Set to <literal>gssapi</literal> to force libpq to use the GSSAPI
+        GSS library to use for GSSAPI authentication.
+        Currently this is disregarded except on Windows builds that include
+        both GSSAPI and SSPI support.  In that case, set
+        this to <literal>gssapi</literal> to cause libpq to use the GSSAPI
         library for authentication instead of the default SSPI.
        </para>
       </listitem>
index 14d234372620371d7ec53b3cbed22d87374c3e1a..d12d35218eeb8c5574182e93017bf5ccceb5116d 100644 (file)
@@ -296,23 +296,19 @@ static const internalPQconninfoOption PQconninfoOptions[] = {
                "Require-Peer", "", 10,
        offsetof(struct pg_conn, requirepeer)},
 
-#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)
+       /*
+        * As with SSL, all GSS options are exposed even in builds that don't have
+        * support.
+        */
+
        /* Kerberos and GSSAPI authentication support specifying the service name */
        {"krbsrvname", "PGKRBSRVNAME", PG_KRB_SRVNAM, NULL,
                "Kerberos-service-name", "", 20,
        offsetof(struct pg_conn, krbsrvname)},
-#endif
-
-#if defined(ENABLE_GSS) && defined(ENABLE_SSPI)
 
-       /*
-        * GSSAPI and SSPI both enabled, give a way to override which is used by
-        * default
-        */
        {"gsslib", "PGGSSLIB", NULL, NULL,
                "GSS-library", "", 7,   /* sizeof("gssapi") = 7 */
        offsetof(struct pg_conn, gsslib)},
-#endif
 
        {"replication", NULL, NULL, NULL,
                "Replication", "D", 5,
@@ -3605,14 +3601,10 @@ freePGconn(PGconn *conn)
                free(conn->sslcompression);
        if (conn->requirepeer)
                free(conn->requirepeer);
-#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)
        if (conn->krbsrvname)
                free(conn->krbsrvname);
-#endif
-#if defined(ENABLE_GSS) && defined(ENABLE_SSPI)
        if (conn->gsslib)
                free(conn->gsslib);
-#endif
        /* Note that conn->Pfdebug is not ours to close or free */
        if (conn->last_query)
                free(conn->last_query);
index 50d6f3a1d4539d67425513012bc5d7c8c2b1bf32..4132cc6e2fbf4692fa0e41da26ce9cbea4fe98e1 100644 (file)
@@ -357,10 +357,9 @@ struct pg_conn
        char       *sslrootcert;        /* root certificate filename */
        char       *sslcrl;                     /* certificate revocation list filename */
        char       *requirepeer;        /* required peer credentials for local sockets */
-
-#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)
        char       *krbsrvname;         /* Kerberos service name */
-#endif
+       char       *gsslib;                     /* What GSS library to use ("gssapi" or
+                                                                * "sspi") */
 
        /* Type of connection to make.  Possible values: any, read-write. */
        char       *target_session_attrs;
@@ -479,10 +478,6 @@ struct pg_conn
 #endif
 
 #ifdef ENABLE_SSPI
-#ifdef ENABLE_GSS
-       char       *gsslib;                     /* What GSS library to use ("gssapi" or
-                                                                * "sspi") */
-#endif
        CredHandle *sspicred;           /* SSPI credentials handle */
        CtxtHandle *sspictx;            /* SSPI context */
        char       *sspitarget;         /* SSPI target name */