--- On Sun, 1/11/09, Tatsuo Ishii <[email protected]> wrote:
>
> Ok, this is normal. Though there's a room to enhance so
> that pgpool
> replies with auth error message...
>
> Patches are welcome:-)
How about this?
Glyn
diff -ru pgpool-II-2.2.5/pool_auth.c pgpool-II-2.2.5p/pool_auth.c
--- pgpool-II-2.2.5/pool_auth.c 2009-09-23 03:03:12.000000000 +0100
+++ pgpool-II-2.2.5p/pool_auth.c 2009-11-02 16:25:20.000000000 +0000
@@ -35,14 +35,17 @@
#endif
#include <errno.h>
#include <string.h>
+#include <stdlib.h>
#define AUTHFAIL_ERRORCODE "28000"
static POOL_STATUS pool_send_auth_ok(POOL_CONNECTION *frontend, int pid, int key, int protoMajor);
static int do_clear_text_password(POOL_CONNECTION *backend, POOL_CONNECTION *frontend, int reauth, int protoMajor);
+static void pool_send_auth_fail(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *cp);
static int do_crypt(POOL_CONNECTION *backend, POOL_CONNECTION *frontend, int reauth, int protoMajor);
static int do_md5(POOL_CONNECTION *backend, POOL_CONNECTION *frontend, int reauth, int protoMajor);
+
/*
* do authentication against backend. if success return 0 otherwise non 0.
*/
@@ -136,6 +139,7 @@
msglen = htonl(0);
if (pool_write_and_flush(frontend, &msglen, sizeof(msglen)) < 0)
{
+ pool_send_auth_fail(frontend, cp);
return -1;
}
MASTER(cp)->auth_kind = 0;
@@ -156,6 +160,7 @@
if (authkind < 0)
{
pool_error("do_clear_text_password failed in slot %d", i);
+ pool_send_auth_fail(frontend, cp);
return -1;
}
}
@@ -176,6 +181,7 @@
if (authkind < 0)
{
pool_error("do_crypt_text_password failed in slot %d", i);
+ pool_send_auth_fail(frontend, cp);
return -1;
}
}
@@ -206,6 +212,7 @@
if (authkind < 0)
{
pool_error("do_md5failed in slot %d", i);
+ pool_send_auth_fail(frontend, cp);
return -1;
}
}
@@ -410,6 +417,7 @@
else
{
pool_debug("pool_do_reauth: authentication failed");
+ pool_send_auth_fail(frontend, cp);
return -1;
}
@@ -417,6 +425,34 @@
}
/*
+* send authentication failure message text to frontend
+*/
+static void pool_send_auth_fail(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *cp)
+{
+ int messagelen;
+ char *errmessage;
+ int protoMajor;
+
+ bool send_error_to_frontend = true;
+
+ protoMajor = MAJOR(cp);
+
+ messagelen = strlen(MASTER_CONNECTION(cp)->sp->user) + 100;
+ if ((errmessage = (char *)malloc(messagelen+1)) == NULL)
+ {
+ pool_error("pool_send_auth_fail_failed: malloc failed: %s", strerror(errno));
+ child_exit(1);
+ }
+
+ snprintf(errmessage, messagelen, "password authentication failed for user \"%s\"",
+ MASTER_CONNECTION(cp)->sp->user);
+ if (send_error_to_frontend)
+ pool_send_fatal_message(frontend, protoMajor, "XX000", errmessage,
+ "", "", __FILE__, __LINE__);
+ free(errmessage);
+}
+
+/*
* send authentication ok to frontend. if success return 0 otherwise non 0.
*/
static POOL_STATUS pool_send_auth_ok(POOL_CONNECTION *frontend, int pid, int key, int protoMajor)
diff -ru pgpool-II-2.2.5/pool.h pgpool-II-2.2.5p/pool.h
--- pgpool-II-2.2.5/pool.h 2009-09-06 04:52:12.000000000 +0100
+++ pgpool-II-2.2.5p/pool.h 2009-11-02 14:26:03.000000000 +0000
@@ -523,6 +523,21 @@
char *hint,
char *file,
int line);
+extern void pool_send_fatal_message(POOL_CONNECTION *frontend, int protoMajor,
+ char *code,
+ char *message,
+ char *detail,
+ char *hint,
+ char *file,
+ int line);
+extern void pool_send_severity_message(POOL_CONNECTION *frontend, int protoMajor,
+ char *code,
+ char *message,
+ char *detail,
+ char *hint,
+ char *file,
+ char *severity,
+ int line);
extern void pool_send_readyforquery(POOL_CONNECTION *frontend);
extern int send_startup_packet(POOL_CONNECTION_POOL_SLOT *cp);
extern void pool_free_startup_packet(StartupPacket *sp);
diff -ru pgpool-II-2.2.5/pool_process_query.c pgpool-II-2.2.5p/pool_process_query.c
--- pgpool-II-2.2.5/pool_process_query.c 2009-10-02 08:53:08.000000000 +0100
+++ pgpool-II-2.2.5p/pool_process_query.c 2009-11-02 14:24:21.000000000 +0000
@@ -2448,6 +2448,35 @@
char *file,
int line)
{
+ pool_send_severity_message(frontend, protoMajor, code, message, detail, hint, file, "ERROR", line);
+}
+
+/*
+ * send fatal message to frontend
+ */
+void pool_send_fatal_message(POOL_CONNECTION *frontend, int protoMajor,
+ char *code,
+ char *message,
+ char *detail,
+ char *hint,
+ char *file,
+ int line)
+{
+ pool_send_severity_message(frontend, protoMajor, code, message, detail, hint, file, "FATAL", line);
+}
+
+/*
+ * send severity message to frontend
+ */
+void pool_send_severity_message(POOL_CONNECTION *frontend, int protoMajor,
+ char *code,
+ char *message,
+ char *detail,
+ char *hint,
+ char *file,
+ char *severity,
+ int line)
+{
/*
* Buffer length for each message part
*/
@@ -2479,7 +2508,7 @@
pool_write(frontend, "E", 1);
/* error level */
- thislen = snprintf(msgbuf, MAXMSGBUF, "SERROR");
+ thislen = snprintf(msgbuf, MAXMSGBUF, "S%s", severity);
thislen = Min(thislen, MAXMSGBUF);
memcpy(data +len, msgbuf, thislen+1);
len += thislen + 1;
_______________________________________________
Pgpool-general mailing list
[email protected]
http://pgfoundry.org/mailman/listinfo/pgpool-general