summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2007-07-08 18:28:56 +0000
committerTom Lane2007-07-08 18:28:56 +0000
commita5b439c06e5442a8939ad522d84fa6b8cb5953c4 (patch)
tree5aaa393e5b2a66a2278dc84e3248b62c7c1d63a0
parent5feb3680d3494c5d8312354d87400a006493e136 (diff)
Closer code review for PQconnectionUsedPassword() patch: in particular,
not OK to include postgres_fe.h into libpq-fe.h, hence declare it as returning int not bool.
-rw-r--r--doc/src/sgml/libpq.sgml33
-rw-r--r--src/include/libpq/pqcomm.h1
-rw-r--r--src/interfaces/libpq/fe-connect.c34
-rw-r--r--src/interfaces/libpq/libpq-fe.h8
-rw-r--r--src/interfaces/libpq/libpq-int.h2
5 files changed, 42 insertions, 36 deletions
diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml
index a105b6a19a..a1c5506a6d 100644
--- a/doc/src/sgml/libpq.sgml
+++ b/doc/src/sgml/libpq.sgml
@@ -1035,6 +1035,25 @@ int PQbackendPID(const PGconn *conn);
</varlistentry>
<varlistentry>
+ <term><function>PQconnectionUsedPassword</function><indexterm><primary>PQconnectionUsedPassword</></></term>
+ <listitem>
+ <para>
+ Returns true (1) if the connection authentication method
+ required a password to be supplied. Returns false (0) if not.
+<synopsis>
+int PQconnectionUsedPassword(const PGconn *conn);
+</synopsis>
+ </para>
+
+ <para>
+ This function can be applied after either successful or failed
+ connection attempts. In the case of failure, it can for example
+ be used to decide whether to prompt the user for a password.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><function>PQgetssl</function><indexterm><primary>PQgetssl</></></term>
<listitem>
<para>
@@ -1059,20 +1078,6 @@ SSL *PQgetssl(const PGconn *conn);
</listitem>
</varlistentry>
- <varlistentry>
- <term><function>PQconnectionUsedPassword</function><indexterm><primary>PQconnectionUsedPassword</></></term>
- <listitem>
- <para>
- Returns true (1) if the connection authentication method
- required a password to be supplied. Returns false (0)
- otherwise.
- <synopsis>
- bool PQconnectionUsedPassword(const PGconn *conn);
- </synopsis>
- </para>
- </listitem>
- </varlistentry>
-
</variablelist>
</para>
diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h
index 5116cf43ec..5a571a3206 100644
--- a/src/include/libpq/pqcomm.h
+++ b/src/include/libpq/pqcomm.h
@@ -156,7 +156,6 @@ extern bool Db_user_namespace;
#define AUTH_REQ_CRYPT 4 /* crypt password */
#define AUTH_REQ_MD5 5 /* md5 password */
#define AUTH_REQ_SCM_CREDS 6 /* transfer SCM credentials */
-#define AUTH_REQ_UNK 7 /* User has not yet attempted to authenticate */
typedef uint32 AuthRequest;
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index e58b94abdb..babffc34b9 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -1641,10 +1641,6 @@ keep_going: /* We will come back to here until there is
return PGRES_POLLING_READING;
}
- /* save the authentication request type */
- if (conn->areq == AUTH_REQ_UNK)
- conn->areq = areq;
-
/* Get the password salt if there is one. */
if (areq == AUTH_REQ_MD5)
{
@@ -1670,6 +1666,10 @@ keep_going: /* We will come back to here until there is
*/
conn->inStart = conn->inCursor;
+ /* Save the authentication request type, if first one. */
+ if (conn->areq == AUTH_REQ_OK)
+ conn->areq = areq;
+
/* Respond to the request if necessary. */
/*
@@ -1877,7 +1877,7 @@ makeEmptyPGconn(void)
conn->std_strings = false; /* unless server says differently */
conn->verbosity = PQERRORS_DEFAULT;
conn->sock = -1;
- conn->areq = AUTH_REQ_UNK;
+ conn->areq = AUTH_REQ_OK; /* until we receive something else */
#ifdef USE_SSL
conn->allow_ssl_try = true;
conn->wait_ssl_try = false;
@@ -3397,6 +3397,19 @@ PQbackendPID(const PGconn *conn)
}
int
+PQconnectionUsedPassword(const PGconn *conn)
+{
+ if (!conn)
+ return false;
+ if (conn->areq == AUTH_REQ_MD5 ||
+ conn->areq == AUTH_REQ_CRYPT ||
+ conn->areq == AUTH_REQ_PASSWORD)
+ return true;
+ else
+ return false;
+}
+
+int
PQclientEncoding(const PGconn *conn)
{
if (!conn || conn->status != CONNECTION_OK)
@@ -3446,17 +3459,6 @@ PQsetClientEncoding(PGconn *conn, const char *encoding)
return status;
}
-bool
-PQconnectionUsedPassword(const PGconn *conn)
-{
- if (conn->areq == AUTH_REQ_MD5 ||
- conn->areq == AUTH_REQ_CRYPT ||
- conn->areq == AUTH_REQ_PASSWORD)
- return true;
- else
- return false;
-}
-
PGVerbosity
PQsetErrorVerbosity(PGconn *conn, PGVerbosity verbosity)
{
diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h
index 285b3998e0..b8ef5387ab 100644
--- a/src/interfaces/libpq/libpq-fe.h
+++ b/src/interfaces/libpq/libpq-fe.h
@@ -23,11 +23,10 @@ extern "C"
#include <stdio.h>
/*
- * defines the backend's externally visible types,
+ * postgres_ext.h defines the backend's externally visible types,
* such as Oid.
*/
#include "postgres_ext.h"
-#include "postgres_fe.h"
/* Application-visible enum types */
@@ -264,9 +263,9 @@ extern int PQserverVersion(const PGconn *conn);
extern char *PQerrorMessage(const PGconn *conn);
extern int PQsocket(const PGconn *conn);
extern int PQbackendPID(const PGconn *conn);
+extern int PQconnectionUsedPassword(const PGconn *conn);
extern int PQclientEncoding(const PGconn *conn);
extern int PQsetClientEncoding(PGconn *conn, const char *encoding);
-extern bool PQconnectionUsedPassword(const PGconn *conn);
/* Get the OpenSSL structure associated with a connection. Returns NULL for
* unencrypted connections or if any other TLS library is in use. */
@@ -426,7 +425,8 @@ extern void PQfreemem(void *ptr);
/* Exists for backward compatibility. bjm 2003-03-24 */
#define PQfreeNotify(ptr) PQfreemem(ptr)
-/* Define the string so all uses are consistent. */
+/* Error when no password was given. */
+/* Note: depending on this is deprecated; use PQconnectionUsedPassword(). */
#define PQnoPasswordSupplied "fe_sendauth: no password supplied\n"
/*
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
index 2cbf924387..98dcb69b14 100644
--- a/src/interfaces/libpq/libpq-int.h
+++ b/src/interfaces/libpq/libpq-int.h
@@ -299,7 +299,7 @@ struct pg_conn
SockAddr raddr; /* Remote address */
ProtocolVersion pversion; /* FE/BE protocol version in use */
int sversion; /* server version, e.g. 70401 for 7.4.1 */
- AuthRequest areq; /* server demanded password during auth */
+ AuthRequest areq; /* auth type demanded by server */
/* Transient state needed while establishing connection */
struct addrinfo *addrlist; /* list of possible backend addresses */